Thx Thorsten

i still use it daily :D

best

Z

On Sat, Feb 6, 2016 at 4:47 PM, Thorsten Jolitz <tjol...@gmail.com> wrote:

>
> Hi List,
> after not touching it for a year or so I recently rediscovered my org-dp
> ("Declarative Programming with Org Elements") library and still liked
> it, so I decided to clean it up a bit and publish it as version 1.0 on
> MELPA. Now you can install it via package manager or clone it from my
> github repo (https://github.com/tj64/org-dp).
>
> Here is an excerpt from the readme:
>
> #+BEGIN_QUOTE
> Since all Org elements are uniformely represented as nested lists
> internally, with their properties stored as key-val pairs in
> plists, they can be treated in a much more uniform way when dealing
> with the internal representation instead of the highly variable
> textual representations. A big advantage of plists is that only
> those properties that are actually accessed matter, so when
> transforming one Org element into another on the internal level one
> does not have to worry about not matching properties as long as
> these are not used by the interpreter when building the textual
> representation of the transformed element.
>
> Library org-dp is meant for programming at the local level,
> i.e. without any (contextual) information except those about the
> parsed element at point. It is designed to make using the Org-mode
> parser/interpreter framework at local level as convenient as using
> it at the global level (with a complete parse-tree produced by
> `org-element-parse-buffer` available). It takes care of the
> org-element caching mechanism in that it only acts on copies of the
> locally parsed elements at point, never on the original parsed (and
> cached) object itself.
> #+END_QUOTE
>
> There are just 2 core functions (with extensive docstrings) that lets
> you do anything you want with the Org element at point:
>
> ,----[ C-h f org-dp-create RET ]
> | org-dp-create is a compiled Lisp function in `org-dp.el'.
> |
> | (org-dp-create ELEM-TYPE &optional CONTENTS INSERT-P AFFILIATED &rest
> | ARGS)
> |
> | Create Org element of type ELEM-TYPE (headline by default). [...]
> `----
>
> ,----[ C-h f org-dp-rewire RET ]
> | org-dp-rewire is a compiled Lisp function in `org-dp.el'.
> |
> | (org-dp-rewire ELEM-TYPE &optional CONTENTS REPLACE AFFILIATED ELEMENT
> | &rest ARGS)
> |
> | Rewire element-at-point or ELEMENT (if given).
> | [...]
> `----
>
> and one lightweight but flexible mapping function:
>
> ,----[ C-h f org-dp-map RET ]
> | org-dp-map is a compiled Lisp function in `org-dp.el'.
> |
> | (org-dp-map FUN-WITH-ARGS RGXP &optional MATCH-POS BACKWARD-SEARCH-P
> | BEG END SILENT-P)
> |
> | Apply quoted FUN-WITH-ARGS at every RGXP match.
> | [...]
> `----
>
> In org-dp-lib.el you can find a few (lightweight but powerful)
> convenience function implemented with the org-dp core functions above,
> so they serve as exemples for the org-dp programming style too.
>
> ,----[ C-h f org-dp-wrap-in-block RET ]
> | org-dp-wrap-in-block is an interactive Lisp function in
> | `org-dp-lib.el'.
> |
> | (org-dp-wrap-in-block &optional LINES USER-INFO &rest PROMPT-SPEC)
> |
> | Wrap sexp-at-point or region in Org block.
> | [...]
> `----
>
> ,----[ C-h f org-dp-toggle-headers RET ]
> | org-dp-toggle-headers is an interactive Lisp function in
> | `org-dp-lib.el'.
> |
> | (org-dp-toggle-headers &optional ACTION)
> |
> | Toggle header argument representation.
> | [...]
> `----
>
> ,----[ C-h f org-dp-filter-node-props RET ]
> | org-dp-filter-node-props is a Lisp function in `org-dp-lib.el'.
> |
> | (org-dp-filter-node-props FILTER &optional NEGATE-P VERBOSE-P)
> |
> | Return filtered node-properties.
> | [...]
> `----
>
> A few functions for creating composite Org elements:
>
> ,----[ C-h f org-dp-create-table RET ]
> | org-dp-create-table is a Lisp function in `org-dp-lib.el'.
> |
> | (org-dp-create-table ROW-LST &optional TBLFM TABLE-EL-P INSERT-P)
> |
> | Create table with content ROW-LST.
> | [...]
> `----
>
> ,----[ C-h f org-dp-create-plain-list RET ]
> | org-dp-create-plain-list is a Lisp function in `org-dp-lib.el'.
> |
> | (org-dp-create-plain-list ITEM-LST &optional INSERT-P)
> |
> | Create plain list with content ITEM-LST.
> | [...]
> `----
>
> ,----[ C-h f org-dp-create-property-drawer RET ]
> | org-dp-create-property-drawer is a Lisp function in `org-dp-lib.el'.
> |
> | (org-dp-create-property-drawer NODE-PROP-LST &optional INSERT-P)
> |
> | Create property drawer with content NODE-PROP-LST.
> | [...]
> `----
>
> And there is the mother of all prompting functions:
>
> ,----[ C-h f org-dp-prompt RET ]
> | org-dp-prompt is a Lisp function in `org-dp.el'.
> |
> | (org-dp-prompt &optional ELEM ELEM-LST PARTIAL-RESULTS-P &key CONT VAL
> | REPL AFF SRC ARGS)
> |
> | Prompt user for specific properties.
> |
> | This function uses `org-dp-prompt-all' to do the real work, but
> | follows the opposite strategy: all prompt options are turned off
> | by default and must be explicitly activated (while
> | `org-dp-prompt-all' prompts for everything that is not explicitly
> | deactivated). Called with no argmuents, it simply prompts for an
> | element type.
> |
> | See docstring of `org-dp-prompt-all' for more info about
> | arguments ELEM and ELEM-LST.
> |
> | If PARTIAL-RESULTS-P is non-nil, delete 'nil' values from
> | `org-dp-prompt-all's return-list
> |
> |   (elem-type contents replace affiliated args)
> |
> | otherwise simply return it 'as-is'.
> |
> | Optional keyword arguments CONT, VAL, REPL, AFF, SRC and ARGS, if
> | given, should be either `t' (to activate prompting for them) or
> | of an adecuate type (see docstring of `org-dp-prompt-all') that
> | will be used as default value without prompting.
> |
> | [back]
> `----
>
> With org-dp, its all about setting or modifying those element properties
> that are used by the element's interpreter. These are significantly
> fewer than those that are parsed by the element's parser.
>
> It is possible to define a single core workhorse function that prompts
> the user for all of these interpreted properties (see docstring above).
> From this workhorse function, countless convenience functions can be
> derived simply by restricting/expanding the number of properties
> prompted for.
>
> The workhorse function and its derived functions return a result list,
> that can be consumed by
>
> ,----[ C-h f org-dp-apply RET ]
> | org-dp-apply is a Lisp function in `org-dp.el'.
> |
> | (org-dp-apply LST &optional FUN ELEMENT)
> |
> | Apply org-dp function to (full) results LST of `org-dp-prompt'.
> | If FUN is non-nil, it must be `memq' of variable
> | `org-dp-apply-funs'. See docstring of `org-dp-prompt' for
> | more info about argument LST and docstring of `org-dp-rewire' for
> | more info about argument ELEMENT.
> |
> | [back]
> `----
>
> So using org-dp, you never have to write your own interactive specs
> anymore (within org-dp's context). Just use this construct:
>
> ,----[optional]
> | (defun my-custom-org-prompt-cmd ()
> |   "Call `org-dp-prompt' with certain parameter combination."
> |   (interactive)
> |   (org-dp-prompt [argument set]...))
> `----
>
> ,----[ask user and create org element at point]
> | (org-dp-apply (org-dp-prompt)) ; or
> | (org-dp-apply (my-custom-org-prompt-cmd))
> `----
>
> ,----[ask user and rewire(=modify) org element at point]
> | (org-dp-apply (org-dp-prompt) t) ; or
> | (org-dp-apply (my-custom-org-prompt-cmd) t) ;or
> |
> | (org-dp-apply (org-dp-prompt) 'rewire) ; or
> | (org-dp-apply (my-custom-org-prompt-cmd) 'rewire)
> `----
>
> The advantage of this style of programming is that the internal Org element
> representation is so uniform (and the number of interpreted properties
> quite limited) that one solution might fit all (elements).
>
> --
> cheers,
> Thorsten
>
>
>

Reply via email to