branch: externals/taxy commit 1b2741a889f10e0e5d90b3984b814c1f2c1e567b Author: Adam Porter <a...@alphapapa.net> Commit: Adam Porter <a...@alphapapa.net>
Meta: Packaging taxy-magit-section separately --- README.org | 8 +- taxy-magit-section.el | 392 -------------------------------------------------- taxy.info | 203 ++++++++++++++------------ 3 files changed, 114 insertions(+), 489 deletions(-) diff --git a/README.org b/README.org index 0440ef2..d69f67d 100644 --- a/README.org +++ b/README.org @@ -861,7 +861,7 @@ And this produces: ** Magit section -Showing a =taxy= with =magit-section= is very easy: +Showing a =taxy= with =magit-section= is easy using the library [[https://github.com/alphapapa/taxy.el/tree/package/taxy-magit-section][taxy-magit-section]], which is packaged separately: #+BEGIN_SRC elisp :exports code (require 'taxy-magit-section) @@ -877,8 +877,6 @@ That shows a buffer like this: [[images/magit-section-numbery.png]] -Note that while =taxy-magit-section.el= is installed with the =taxy= package, the =magit-section= package is not automatically installed with it. - ** Reference In Emacs 28+, see also =M-x shortdoc-display-group RET taxy RET=. @@ -935,7 +933,9 @@ In Emacs 28+, see also =M-x shortdoc-display-group RET taxy RET=. ** 0.9-pre -Nothing new yet. +*** Changes + ++ Library =taxy-magit-section= is now [[https://elpa.gnu.org/packages/taxy-magit-section.html][packaged separately]] and maintained in a [[https://github.com/alphapapa/taxy.el/tree/package/taxy-magit-section][separate branch]]. ** 0.8 diff --git a/taxy-magit-section.el b/taxy-magit-section.el deleted file mode 100644 index 7b8814b..0000000 --- a/taxy-magit-section.el +++ /dev/null @@ -1,392 +0,0 @@ -;;; taxy-magit-section.el --- View Taxy structs in a Magit Section buffer -*- lexical-binding: t; -*- - -;; Copyright (C) 2021 Free Software Foundation, Inc. - -;; Author: Adam Porter <a...@alphapapa.net> -;; Maintainer: Adam Porter <a...@alphapapa.net> -;; URL: https://github.com/alphapapa/taxy.el -;; Version: 0.9-pre -;; Package-Requires: ((emacs "26.3") (magit-section "3.2.1")) -;; Keywords: lisp - -;; This program is free software; you can redistribute it and/or modify -;; it under the terms of the GNU General Public License as published by -;; the Free Software Foundation, either version 3 of the License, or -;; (at your option) any later version. - -;; This program is distributed in the hope that it will be useful, -;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -;; GNU General Public License for more details. - -;; You should have received a copy of the GNU General Public License -;; along with this program. If not, see <https://www.gnu.org/licenses/>. - -;;; Commentary: - -;; This library provides a way to view `taxy' structs in a -;; column-based, `magit-section' buffer. Columns are defined using -;; simple top-level forms, and new columns may be easily defined by -;; users in their configurations. - -;;; Code: - -;;;; Requirements - -(require 'map) - -(require 'taxy) -(require 'magit-section) - -;;;; Variables - -(defvar taxy-magit-section-level-indent 2 - "Default heading indentation per level.") - -(defvar taxy-magit-section-item-indent 2 - "Default item indentation per level.") - -(defvar taxy-magit-section-depth nil - "Bound to current depth around calls to a taxy's format-fn.") - -(defvar taxy-magit-section-insert-indent-items t - ;; NOTE: I hate to use a variable to control this, but it seems like - ;; the cleanest way for now. - "Whether to indent items in `taxy-magit-section-insert'. -May be disabled when `taxy-magit-section-insert' should not -indent items itself, e.g. if items are pre-indented. Note that -this does not disable indentation of section headings.") - -;;;; Customization - - -;;;; Structs - -;; NOTE: When making `taxy-magit-section' structs at runtime -;; (e.g. with `taxy-take-keyed'), the struct's `make' slot must be set -;; to a function that returns a new struct with the other slots set as -;; desired; the slots' values do not automatically propagate to -;; structs with the default `make' function. (Using `cl-labels' to -;; define the `make' function makes this simple.) - -;; MAYBE: In `taxy-take-keyed', use `taxy-emptied' to copy structs -;; with inheritance for relevant slots, so defining custom `make' -;; functions wouldn't be necessary. - -(cl-defstruct (taxy-magit-section - (:include taxy - (make #'make-taxy-magit-section))) - ;; MAYBE: Pass parent section to the :make function, would make - ;; inheritance easier (and/or use EIEIO, but that would reduce - ;; performance, since slot accessors can't be optimized). - (visibility-fn #'taxy-magit-section-visibility) - (heading-face-fn (lambda (_depth) 'magit-section-heading)) - (level-indent 2) - (item-indent 2) - (format-fn #'prin1-to-string)) - -;;;; Commands - - -;;;; Functions - -(cl-defun taxy-magit-section-insert - (taxy &key (items 'first) (initial-depth 0) (blank-between-depth 1)) - "Insert a `magit-section' for TAXY into current buffer. -If ITEMS is `first', insert a taxy's items before its descendant -taxys; if `last', insert them after descendants. INITIAL-DEPTH -is the initial indentation depth; it may be, e.g. -1 to make the -second level unindented. BLANK-BETWEEN-DEPTH is the level up to -which blank lines are inserted between sections at that level." - (declare (indent defun)) - (let* ((magit-section-set-visibility-hook - (cons #'taxy-magit-section-visibility magit-section-set-visibility-hook))) - (cl-labels ((insert-item - (item taxy depth) - (magit-insert-section (magit-section item) - (magit-insert-section-body - ;; This is a tedious way to give the indent - ;; string the same text properties as the start - ;; of the formatted string, but no matter where I - ;; left point after using `insert-and-inherit', - ;; something was wrong about the properties, and - ;; `magit-section' didn't navigate the sections - ;; properly anymore. - (let* ((formatted (funcall (taxy-magit-section-format-fn taxy) item)) - (indent-size (if (or (not taxy-magit-section-insert-indent-items) - (< depth 0)) - 0 - (+ (* depth (taxy-magit-section-level-indent taxy)) - (taxy-magit-section-item-indent taxy)))) - (indent-string (make-string indent-size ? ))) - (add-text-properties 0 (length indent-string) - (text-properties-at 0 formatted) - indent-string) - (insert indent-string formatted "\n"))))) - (insert-taxy - (taxy depth) - (let ((magit-section-set-visibility-hook magit-section-set-visibility-hook) - (taxy-magit-section-level-indent (taxy-magit-section-level-indent taxy)) - (taxy-magit-section-item-indent (taxy-magit-section-item-indent taxy))) - (cl-typecase taxy - (taxy-magit-section - (when (taxy-magit-section-visibility-fn taxy) - (push (taxy-magit-section-visibility-fn taxy) - magit-section-set-visibility-hook)))) - (magit-insert-section (magit-section taxy) - (magit-insert-heading - (make-string (* (if (< depth 0) 0 depth) - (taxy-magit-section-level-indent taxy)) - ? ) - (propertize (taxy-name taxy) - 'face (funcall (taxy-magit-section-heading-face-fn taxy) depth)) - (format " (%s%s)" - (if (taxy-description taxy) - (concat (taxy-description taxy) " ") - "") - (taxy-size taxy))) - (magit-insert-section-body - (when (eq 'first items) - (dolist (item (taxy-items taxy)) - (insert-item item taxy depth))) - (dolist (taxy (taxy-taxys taxy)) - (insert-taxy taxy (1+ depth))) - (when (eq 'last items) - (dolist (item (taxy-items taxy)) - (insert-item item taxy depth)))) - (when (<= depth blank-between-depth) - (insert "\n")))))) - (magit-insert-section (magit-section) - (insert-taxy taxy initial-depth))))) - -(cl-defun taxy-magit-section-pp (taxy &key (items 'first)) - "Pretty-print TAXY into a buffer with `magit-section' and show it." - (with-current-buffer (get-buffer-create "*taxy-magit-section-pp*") - (magit-section-mode) - (let ((inhibit-read-only t)) - (erase-buffer) - (taxy-magit-section-insert taxy :items items)) - (pop-to-buffer (current-buffer)))) - -(defun taxy-magit-section-visibility (section) - "Show SECTION if its taxy is non-empty. -Default visibility function for -`magit-section-set-visibility-hook'." - (pcase (oref section value) - ((and (pred taxy-p) taxy) - (pcase (taxy-size taxy) - (0 'hide) - (_ 'show))) - (_ nil))) - -;;;; Column-based formatting - -;; Column-based, or "table"? - -;; MAYBE: Move this to a separate library, since it's not directly -;; related to using taxy or magit-section. Maybe it could be called -;; something like `flextab' (or, keeping with the theme, `tabley'). -;; But see also <https://github.com/kiwanami/emacs-ctable>. - -;;;;; Macros - -(cl-defmacro taxy-magit-section-define-column-definer - (prefix &key columns-variable-docstring) - "Define a column-defining macro. -The macro is named \"PREFIX-define-column\". - -These customization options are defined, which are to be used in -a `taxy-magit-section' in its `:level-indent' and `:item-indent' -slots, respectively: - - - PREFIX-level-indent - - PREFIX-item-indent - -As well as these variables, which are to be passed to -`taxy-magit-section-format-items': - - - PREFIX-columns - - PREFIX-column-formatters" - ;; TODO: Document this. - (let* ((definer-name (intern (format "%s-define-column" prefix))) - (definer-docstring (format "Define a column formatting function with NAME. -NAME should be a string. BODY should return a string or nil. In -the BODY, `item' is bound to the item being formatted, and `depth' is -bound to the item's depth in the hierarchy. - -PLIST may be a plist setting the following options: - - `:align' may be `left' or `right' to align the column - accordingly. - - `:face' is a face applied to the string. - - `:max-width' defines a customization option for the column's - maximum width with the specified value as its default: an - integer limits the width, while nil does not.")) - (level-indent-variable-name (intern (format "%s-level-indent" prefix))) - (level-indent-docstring (format "Indentation applied to each level of depth for `%s' columns." - prefix)) - (item-indent-variable-name (intern (format "%s-item-indent" prefix))) - (item-indent-docstring (format "Indentation applied to each item for `%s' columns." - prefix)) - (columns-variable-name (intern (format "%s-columns" prefix))) - (columns-variable-docstring (or columns-variable-docstring - (format "Columns defined by `%s'." - definer-name))) - (column-formatters-variable-name (intern (format "%s-column-formatters" prefix))) - (column-formatters-variable-docstring (format "Column formatters defined by `%s'." - definer-name))) - `(let ((columns-variable ',columns-variable-name) - (column-formatters-variable ',column-formatters-variable-name)) - (defcustom ,level-indent-variable-name 2 - ,level-indent-docstring - :type 'integer) - (defcustom ,item-indent-variable-name 2 - ,item-indent-docstring - :type 'integer) - (defvar ,columns-variable-name nil - ,columns-variable-docstring) - (defvar ,column-formatters-variable-name nil - ,column-formatters-variable-docstring) - (defmacro ,definer-name (name plist &rest body) - ,definer-docstring - (declare (indent defun)) - (cl-check-type name string) - (pcase-let* ((fn-name (intern (concat ,prefix "-column-format-" (downcase name)))) - (columns-variable-name ',columns-variable-name) - (level-indent-variable-name ',level-indent-variable-name) - (item-indent-variable-name ',item-indent-variable-name) - ((map (:face face) (:max-width max-width)) plist) - (max-width-variable (intern (concat ,prefix "-column-" name "-max-width"))) - (max-width-docstring (format "Maximum width of the %s column." name))) - `(progn - ,(when (plist-member plist :max-width) - `(defcustom ,max-width-variable - ,max-width - ,max-width-docstring - :type '(choice (integer :tag "Maximum width") - (const :tag "Unlimited width" nil)))) - (defun ,fn-name (item depth) - (if-let ((string (progn ,@body))) - (progn - ,(when max-width - `(when ,max-width-variable - (setf string (truncate-string-to-width - string ,max-width-variable nil nil "…")))) - ,(when face - ;; Faces are not defined until load time, while this checks type at expansion - ;; time, so we can only test that the argument is a symbol, not a face. - (cl-check-type face symbol ":face must be a face symbol") - `(setf string (propertize string 'face ',face))) - (when (equal ,name (car ,columns-variable-name)) - ;; First column: apply indentation. - (let ((indentation (make-string (+ (* depth ,level-indent-variable-name) - ,item-indent-variable-name) - ? ))) - (setf string (concat indentation string)))) - string) - "")) - (setf (alist-get 'formatter - (alist-get ,name ,column-formatters-variable nil nil #'equal)) - #',fn-name) - (setf (alist-get 'align - (alist-get ,name ,column-formatters-variable nil nil #'equal)) - ,(plist-get plist :align)) - ;; Add column to the columns-variable's standard value. - (unless (member ,name (get ',columns-variable 'standard-value)) - (setf (get ',columns-variable 'standard-value) - (append (get ',columns-variable 'standard-value) - (list ,name)))) - ;; Add column to the columns-variable's custom type. - (cl-pushnew ,name (get ',columns-variable 'custom-type) - :test #'equal))))))) - -;;;;; Functions - -;; MAYBE: Consider using spaces with `:align-to', rather than formatting strings with -;; indentation, as used by `epkg' (see -;; <https://github.com/emacscollective/epkg/blob/edf8c009066360af61caedf67a2482eaa19481b0/epkg-desc.el#L363>). -;; I'm not sure which would perform better; I guess that with many lines, redisplay might -;; take longer to use the display properties for alignment than just having pre-aligned -;; lines of text. - -(defun taxy-magit-section-format-items (columns formatters taxy) - ;; TODO: Document this. - "Return a cons (table . column-sizes) for COLUMNS, FORMATTERS, and TAXY. -COLUMNS is a list of column names, each of which should have an -associated formatting function in FORMATTERS. - -Table is a hash table keyed by item whose values are display -strings. Column-sizes is an alist whose keys are column names -and values are the column width. Each string is formatted -according to `columns' and takes into account the width of all -the items' values for each column." - (let ((table (make-hash-table)) - column-aligns column-sizes) - (cl-labels ((format-column - (item depth column-name) - (let* ((column-alist (alist-get column-name formatters nil nil #'equal)) - (fn (alist-get 'formatter column-alist)) - (value (funcall fn item depth)) - (current-column-size (or (map-elt column-sizes column-name) 0))) - (setf (map-elt column-sizes column-name) - (max current-column-size (string-width value))) - (setf (map-elt column-aligns column-name) - (or (alist-get 'align column-alist) - 'left)) - value)) - (format-item - (depth item) (puthash item - (cl-loop for column in columns - collect (format-column item depth column)) - table)) - (format-taxy (depth taxy) - (dolist (item (taxy-items taxy)) - (format-item depth item)) - (dolist (taxy (taxy-taxys taxy)) - (format-taxy (1+ depth) taxy)))) - (format-taxy 0 taxy) - ;; Now format each item's string using the column sizes. - (let* ((column-sizes (nreverse column-sizes)) - (format-string - (string-join - (cl-loop for (name . size) in column-sizes - for align = (pcase-exhaustive (alist-get name column-aligns nil nil #'equal) - ((or `nil 'left) "-") - ('right "")) - collect (format "%%%s%ss" align size)) - " "))) - (maphash (lambda (item column-values) - (puthash item (apply #'format format-string column-values) - table)) - table) - (cons table column-sizes))))) - -(defun taxy-magit-section-format-header (column-sizes formatters) - ;; TODO: Document this. - "Return header string for COLUMN-SIZES and FORMATTERS. -COLUMN-SIZES should be the CDR of the cell returned by -`taxy-magit-section-format-items'. FORMATTERS should be the -variable passed to that function, which see." - (let* ((first-column-name (caar column-sizes)) - (first-column-alist (alist-get first-column-name formatters nil nil #'equal)) - (first-column-align (pcase-exhaustive (alist-get 'align first-column-alist) - ((or `nil 'left) "-") - ('right "")))) - (concat (format (format " %%%s%ss" - first-column-align (cdar column-sizes)) - (caar column-sizes)) - (cl-loop for (name . size) in (cdr column-sizes) - for column-alist = (alist-get name formatters nil nil #'equal) - for align = (pcase-exhaustive (alist-get 'align column-alist) - ((or `nil 'left) "-") - ('right "")) - for spec = (format " %%%s%ss" align size) - concat (format spec name))))) - -;;;; Footer - -(provide 'taxy-magit-section) - -;;; taxy-magit-section.el ends here diff --git a/taxy.info b/taxy.info index 187e915..f24d4d9 100644 --- a/taxy.info +++ b/taxy.info @@ -1,4 +1,4 @@ -This is README.info, produced by makeinfo version 6.5 from README.texi. +This is README.info, produced by makeinfo version 5.2 from README.texi. INFO-DIR-SECTION Emacs START-INFO-DIR-ENTRY @@ -14,7 +14,7 @@ taxy.el https://elpa.gnu.org/packages/taxy.svg (https://elpa.gnu.org/packages/taxy.html) - _Now, where did I put that..._ + _Now, where did I put that…_ This library provides a programmable way to classify arbitrary objects into a hierarchical taxonomy. (That’s a lot of fancy words to @@ -66,7 +66,7 @@ Usage Dynamic taxys * Multi-level dynamic taxys:: -* "Chains" of independent, multi-level dynamic taxys: "Chains" of independent multi-level dynamic taxys. +* "Chains" of independent, multi-level dynamic taxys: "Chains" of independent multi-level dynamic taxys. * Defining a classification domain-specific language:: Reference @@ -76,15 +76,19 @@ Reference Changelog -* 0.9-pre: 09-pre. -* 0.8: 08. -* 0.7: 07. -* 0.6: 06. -* 0.5: 05. -* 0.4: 04. -* 0.3: 03. -* 0.2: 02. -* 0.1: 01. +* 0.9-pre: 09-pre. +* 0.8: 08. +* 0.7: 07. +* 0.6: 06. +* 0.5: 05. +* 0.4: 04. +* 0.3: 03. +* 0.2: 02. +* 0.1: 01. + +0.9-pre + +* Changes:: 0.8 @@ -93,27 +97,27 @@ Changelog 0.7 -* Additions: Additions (1). +* Additions: Additions (1). 0.6 -* Additions: Additions (2). +* Additions: Additions (2). 0.5 -* Additions: Additions (3). -* Fixes: Fixes (1). +* Additions: Additions (3). +* Fixes: Fixes (1). 0.3 -* Changes:: -* Fixes: Fixes (2). +* Changes: Changes (1). +* Fixes: Fixes (2). 0.2 -* Changes: Changes (1). -* Additions: Additions (4). -* Fixes: Fixes (3). +* Changes: Changes (2). +* Additions: Additions (4). +* Fixes: Fixes (3). Development @@ -767,7 +771,7 @@ and it produces this taxonomy of buffers: * Menu: * Multi-level dynamic taxys:: -* "Chains" of independent, multi-level dynamic taxys: "Chains" of independent multi-level dynamic taxys. +* "Chains" of independent, multi-level dynamic taxys: "Chains" of independent multi-level dynamic taxys. * Defining a classification domain-specific language:: @@ -1022,7 +1026,10 @@ File: README.info, Node: Magit section, Next: Reference, Prev: Dynamic taxys, 3.5 Magit section ================= -Showing a ‘taxy’ with ‘magit-section’ is very easy: +Showing a ‘taxy’ with ‘magit-section’ is easy using the library +taxy-magit-section +(https://github.com/alphapapa/taxy.el/tree/package/taxy-magit-section), +which is packaged separately: (require 'taxy-magit-section) @@ -1034,10 +1041,6 @@ Showing a ‘taxy’ with ‘magit-section’ is very easy: That shows a buffer like this: - Note that while ‘taxy-magit-section.el’ is installed with the ‘taxy’ -package, the ‘magit-section’ package is not automatically installed with -it. - File: README.info, Node: Reference, Prev: Magit section, Up: Usage @@ -1131,15 +1134,15 @@ File: README.info, Node: Changelog, Next: Development, Prev: Usage, Up: Top * Menu: -* 0.9-pre: 09-pre. -* 0.8: 08. -* 0.7: 07. -* 0.6: 06. -* 0.5: 05. -* 0.4: 04. -* 0.3: 03. -* 0.2: 02. -* 0.1: 01. +* 0.9-pre: 09-pre. +* 0.8: 08. +* 0.7: 07. +* 0.6: 06. +* 0.5: 05. +* 0.4: 04. +* 0.3: 03. +* 0.2: 02. +* 0.1: 01. File: README.info, Node: 09-pre, Next: 08, Up: Changelog @@ -1147,7 +1150,20 @@ File: README.info, Node: 09-pre, Next: 08, Up: Changelog 4.1 0.9-pre =========== -Nothing new yet. +* Menu: + +* Changes:: + + +File: README.info, Node: Changes, Up: 09-pre + +4.1.1 Changes +------------- + + • Library ‘taxy-magit-section’ is now packaged separately + (https://elpa.gnu.org/packages/taxy-magit-section.html) and + maintained in a separate branch + (https://github.com/alphapapa/taxy.el/tree/package/taxy-magit-section). File: README.info, Node: 08, Next: 07, Prev: 09-pre, Up: Changelog @@ -1184,7 +1200,7 @@ File: README.info, Node: 07, Next: 06, Prev: 08, Up: Changelog * Menu: -* Additions: Additions (1). +* Additions: Additions (1). File: README.info, Node: Additions (1), Up: 07 @@ -1206,7 +1222,7 @@ File: README.info, Node: 06, Next: 05, Prev: 07, Up: Changelog * Menu: -* Additions: Additions (2). +* Additions: Additions (2). File: README.info, Node: Additions (2), Up: 06 @@ -1246,8 +1262,8 @@ File: README.info, Node: 05, Next: 04, Prev: 06, Up: Changelog * Menu: -* Additions: Additions (3). -* Fixes: Fixes (1). +* Additions: Additions (3). +* Fixes: Fixes (1). File: README.info, Node: Additions (3), Next: Fixes (1), Up: 05 @@ -1296,11 +1312,11 @@ File: README.info, Node: 03, Next: 02, Prev: 04, Up: Changelog * Menu: -* Changes:: -* Fixes: Fixes (2). +* Changes: Changes (1). +* Fixes: Fixes (2). -File: README.info, Node: Changes, Next: Fixes (2), Up: 03 +File: README.info, Node: Changes (1), Next: Fixes (2), Up: 03 4.7.1 Changes ------------- @@ -1311,7 +1327,7 @@ File: README.info, Node: Changes, Next: Fixes (2), Up: 03 becomes ‘(taxy-items taxy)’). -File: README.info, Node: Fixes (2), Prev: Changes, Up: 03 +File: README.info, Node: Fixes (2), Prev: Changes (1), Up: 03 4.7.2 Fixes ----------- @@ -1330,12 +1346,12 @@ File: README.info, Node: 02, Next: 01, Prev: 03, Up: Changelog * Menu: -* Changes: Changes (1). -* Additions: Additions (4). -* Fixes: Fixes (3). +* Changes: Changes (2). +* Additions: Additions (4). +* Fixes: Fixes (3). -File: README.info, Node: Changes (1), Next: Additions (4), Up: 02 +File: README.info, Node: Changes (2), Next: Additions (4), Up: 02 4.8.1 Changes ------------- @@ -1345,7 +1361,7 @@ File: README.info, Node: Changes (1), Next: Additions (4), Up: 02 reason to maintain two versions. -File: README.info, Node: Additions (4), Next: Fixes (3), Prev: Changes (1), Up: 02 +File: README.info, Node: Additions (4), Next: Fixes (3), Prev: Changes (2), Up: 02 4.8.2 Additions --------------- @@ -1427,49 +1443,50 @@ GPLv3 Tag Table: Node: Top218 -Node: Examples2246 -Node: Numbery (starting basically)2565 -Node: Lettery (filling incrementally)8326 -Node: Sporty (understanding completely)10840 -Node: Applications16827 -Node: Installation17302 -Node: Usage17615 -Node: Reusable taxys19770 -Node: Threading macros23923 -Node: Modifying filled taxys24462 -Node: Dynamic taxys25280 -Node: Multi-level dynamic taxys27929 -Node: "Chains" of independent multi-level dynamic taxys30122 -Node: Defining a classification domain-specific language33053 -Node: Magit section37216 -Node: Reference37913 -Node: Functions38121 -Node: Macros40099 -Node: Changelog40749 -Node: 09-pre40974 -Node: 0841080 -Node: Additions41205 -Node: Fixes41349 -Node: 0741487 -Node: Additions (1)41612 -Node: 0641931 -Node: Additions (2)42056 -Node: 0543406 -Node: Additions (3)43551 -Node: Fixes (1)44661 -Node: 0444819 -Node: 0345041 -Node: Changes45170 -Node: Fixes (2)45533 -Node: 0245968 -Node: Changes (1)46137 -Node: Additions (4)46429 -Node: Fixes (3)47288 -Node: 0147542 -Node: Development47641 -Node: Copyright assignment47847 -Node: Credits48435 -Node: License48625 +Node: Examples2299 +Node: Numbery (starting basically)2618 +Node: Lettery (filling incrementally)8379 +Node: Sporty (understanding completely)10893 +Node: Applications16880 +Node: Installation17355 +Node: Usage17668 +Node: Reusable taxys19823 +Node: Threading macros23976 +Node: Modifying filled taxys24515 +Node: Dynamic taxys25333 +Node: Multi-level dynamic taxys27983 +Node: "Chains" of independent multi-level dynamic taxys30176 +Node: Defining a classification domain-specific language33107 +Node: Magit section37270 +Node: Reference37938 +Node: Functions38146 +Node: Macros40124 +Node: Changelog40774 +Node: 09-pre41008 +Node: Changes41118 +Node: 0841444 +Node: Additions41569 +Node: Fixes41713 +Node: 0741851 +Node: Additions (1)41977 +Node: 0642296 +Node: Additions (2)42422 +Node: 0543772 +Node: Additions (3)43919 +Node: Fixes (1)45029 +Node: 0445187 +Node: 0345409 +Node: Changes (1)45552 +Node: Fixes (2)45919 +Node: 0246358 +Node: Changes (2)46530 +Node: Additions (4)46822 +Node: Fixes (3)47681 +Node: 0147935 +Node: Development48034 +Node: Copyright assignment48240 +Node: Credits48828 +Node: License49018 End Tag Table