Usage

Help

❯ navigaattori

 Usage: navigaattori [OPTIONS] COMMAND [ARGS]...

 Navigator (Finnish: navigaattori) guided by conventions.

╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --version  -V        Display the application version and exit                                                    │
│ --help     -h        Show this message and exit.                                                                 │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Commands ───────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ eject    Eject a template. Enter unique part to retrieve, any unknown word to obtain the list of known           │
│          templates.                                                                                              │
│ explore  Explore the structures definition tree in the file system.                                              │
│ version  Display the application version and exit.                                                               │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯

Version

❯ navigaattori version
Navigator (Finnish: navigaattori) guided by conventions. version 2023.1.14+parent.892f738b

Version - Help

❯ navigaattori version --help

 Usage: navigaattori version [OPTIONS]

 Display the application version and exit.

╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --help  -h        Show this message and exit.                                                                    │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯

Explore

❯ navigaattori explore basic 2>&1 | cut -c34- | sed "s/NAVIGAATTORI/.../g; s/WARNING/W/g; s/ERROR/E/g; s/INFO/I/g;"
I [...]: start timestamp (2023-01-14 20:47:54.904846 UTC)
I [...]: - will exclude (.git/, render/pdf/) path partials
I [...]: not guessing but reading target types from (basic/structures.yml) data instead ...
I [...]: screening target type (wun) ...
I [...]: screening target type (bar) ...
E [...]: spec_path file (basic/bar/structure.yml) for target type (bar) does not exist or is empty
I [...]: assessing target type (wun) ...
I [...]: - assessing target (foo_kind) with target type (wun) ...
E [...]:   + invalid (approvals) resource (approvals.yml) for facet (default) of target (foo_kind) with target type (wun) - resource does not exist or is no file
E [...]:   + invalid (bind) resource (bind.txt) for facet (default) of target (foo_kind) with target type (wun) - resource does not exist or is no file
E [...]:   + invalid (changes) resource (changes.yml) for facet (default) of target (foo_kind) with target type (wun) - resource does not exist or is no file
E [...]:   + invalid (meta) resource (meta-default.yml) for facet (default) of target (foo_kind) with target type (wun) - resource does not exist or is no file
I [...]: skipping invalid target (bar)
I [...]: reporting target type (wun) ...
I [...]: - target_type='wun':
I [...]:   + dir -> foo
I [...]:   + file -> structure.yml
I [...]:   + structure =>
I [...]:     * foo_kind =>
I [...]:       - default =>
I [...]:         + approvals -> approvals.yml
I [...]:         + bind -> bind.txt
I [...]:         + changes -> changes.yml
I [...]:         + meta -> meta-default.yml
I [...]:         + render -> True
I [...]:         + formats -> ['html', 'pdf']
I [...]:         + options -> None
I [...]:   + valid -> False
I [...]: reporting target type (bar) ...
I [...]: - target_type='bar':
I [...]:   + dir -> bar
I [...]:   + file -> structure.yml
I [...]:   + structure -> {}
I [...]:   + valid -> False
E [...]: specifications for target types (bar, wun) are invalid
I [...]: end timestamp (2023-01-14 20:47:54.907395 UTC)
I [...]: explored structures at basic in 0.002549 secs

using different excludes than the defaults .git/ and render/pdf/:

❯ navigaattori explore basic --excludes foo,bar 2>&1 | cut -c34- | sed "s/NAVIGAATTORI/.../g; s/WARNING/W/g; s/ERROR/E/g; s/INFO/I/g;"
I [...]: start timestamp (2023-01-14 20:50:43.266950 UTC)
I [...]: - will exclude (foo, bar) path partials
I [...]: not guessing but reading target types from (basic/structures.yml) data instead ...
I [...]: screening target type (wun) ...
I [...]: screening target type (bar) ...
E [...]: spec_path file (basic/bar/structure.yml) for target type (bar) does not exist or is empty
I [...]: assessing target type (wun) ...
I [...]: - assessing target (foo_kind) with target type (wun) ...
E [...]:   + invalid (approvals) resource (approvals.yml) for facet (default) of target (foo_kind) with target type (wun) - resource does not exist or is no file
E [...]:   + invalid (bind) resource (bind.txt) for facet (default) of target (foo_kind) with target type (wun) - resource does not exist or is no file
E [...]:   + invalid (changes) resource (changes.yml) for facet (default) of target (foo_kind) with target type (wun) - resource does not exist or is no file
E [...]:   + invalid (meta) resource (meta-default.yml) for facet (default) of target (foo_kind) with target type (wun) - resource does not exist or is no file
I [...]: skipping invalid target (bar)
I [...]: reporting target type (wun) ...
I [...]: - target_type='wun':
I [...]:   + dir -> foo
I [...]:   + file -> structure.yml
I [...]:   + structure =>
I [...]:     * foo_kind =>
I [...]:       - default =>
I [...]:         + approvals -> approvals.yml
I [...]:         + bind -> bind.txt
I [...]:         + changes -> changes.yml
I [...]:         + meta -> meta-default.yml
I [...]:         + render -> True
I [...]:         + formats -> ['html', 'pdf']
I [...]:         + options -> None
I [...]:   + valid -> False
I [...]: reporting target type (bar) ...
I [...]: - target_type='bar':
I [...]:   + dir -> bar
I [...]:   + file -> structure.yml
I [...]:   + structure -> {}
I [...]:   + valid -> False
E [...]: specifications for target types (bar, wun) are invalid
I [...]: end timestamp (2023-01-14 20:50:43.269866 UTC)
I [...]: explored structures at basic in 0.002916 secs

missing structures file (the folder name lowercase guess is maybe not optimal ...):

❯ navigaattori explore guess 2>&1 | cut -c34- | sed "s/NAVIGAATTORI/.../g; s/WARNING/W/g; s/ERROR/E/g; s/INFO/I/g;"
I [...]: start timestamp (2023-01-14 20:52:06.897623 UTC)
I [...]: - will exclude (.git/, render/pdf/) path partials
E [...]: structures file (guess/structures.yml) does not exist or is empty
I [...]: ... you may want to try the --guess option to the explore command to bootstrap a structures file
E [...]: target types are not present - invalid structures file?
I [...]: end timestamp (2023-01-14 20:52:06.898443 UTC)
I [...]: explored structures at guess in 0.00082 secs

taking the hint and enter guess-mode:

❯ navigaattori explore guess --guess 2>&1 | cut -c34- | sed "s/NAVIGAATTORI/.../g; s/WARNING/W/g; s/ERROR/E/g; s/INFO/I/g;"
I [...]: start timestamp (2023-01-14 20:54:33.839036 UTC)
I [...]: - will exclude (.git/, render/pdf/) path partials
W [...]: structures file (guess/structures.yml) does not exist or is empty
I [...]: guessing target types from recursive search for (structure.yml) files ...
I [...]: - guessed target type (foo) from path (guess/foo/structure.yml)
I [...]: screening target type (foo) ...
I [...]: assessing target type (foo) ...
I [...]: - assessing target (foo_kind) with target type (foo) ...
I [...]: assessing approvals (guess/foo/approvals.yml) yielding:
I [...]: approvals sequence loaded 3 approvals from (guess/foo/approvals.yml):
I [...]: - {'role': 'Author', 'name': 'An Author'}
I [...]: - {'role': 'Review', 'name': 'A Reviewer'}
I [...]: - {'role': 'Approved', 'name': 'An App Rover'}
I [...]: approvals sequence successfully loaded from (guess/foo/approvals.yml):
I [...]: sequence of approvals from (guess/foo/approvals.yml) is valid
I [...]: assessing binder (guess/foo/bind.txt) yielding:
I [...]: binder sequence loaded 1 resource from (guess/foo/bind.txt):
I [...]: - empty.md
I [...]: binder sequence successfully loaded from (guess/foo/bind.txt):
I [...]: - resource (empty.md) points to file (at guess/foo/empty.md)
I [...]: sequence of resources of (guess/foo/bind.txt) is valid
I [...]: assessing changes (guess/foo/changes.yml) yielding:
I [...]: changes sequence loaded 2 changes from (guess/foo/changes.yml):
I [...]: - {'author': 'An Author', 'date': 'PUBLICATIONDATE', 'issue': '01', 'revision': '00', 'summary': 'Initial Issue'}
I [...]: - {'author': 'An Author', 'date': '', 'issue': '01', 'revision': '01', 'summary': 'Fixed a nit'}
I [...]: changes sequence successfully loaded from (guess/foo/changes.yml):
I [...]: sequence of changes from (guess/foo/changes.yml) is valid
I [...]: assessing changes (guess/foo/meta-default.yml) yielding:
I [...]: loading liitos vocabulary from (templates/liitos_vocabulary.yml) ...
I [...]: dumping liitos vocabulary to (liitos-vocabulary.yml) ...
I [...]: top level metadata successfully loaded from (guess/foo/meta-default.yml):
I [...]: reporting current metadata starting from (guess/foo/meta-default.yml) ...
I [...]: - document =>
I [...]:   + import -> meta-base.yml
I [...]:   + patch =>
I [...]:     * header_id -> P99999
I [...]:     * header_date -> PUBLICATIONDATE
I [...]:     * toc_level -> 3
I [...]:     * list_of_figures ->
I [...]:     * list_of_tables ->
I [...]: - trying to import metadata from (guess/foo/meta-base.yml)
I [...]: metadata successfully loaded completely starting from (guess/foo/meta-default.yml):
I [...]: reporting current metadata starting from (guess/foo/meta-default.yml) ...
I [...]: - document =>
I [...]:   + common =>
I [...]:     * title -> Ttt Tt Tt
I [...]:     * header_title -> Ttt Tt
I [...]:     * sub_title -> The Deep Spec
I [...]:     * header_type -> Engineering Document
I [...]:     * header_id -> P99999
I [...]:     * issue -> 01
I [...]:     * revision -> 00
I [...]:     * header_date -> PUBLICATIONDATE
I [...]:     * header_issue_revision_combined -> None
I [...]:     * footer_frame_note -> VERY CONSEQUENTIAL
I [...]:     * footer_page_number_prefix -> Page
I [...]:     * change_log_issue_label -> Iss.
I [...]:     * change_log_revision_label -> Rev.
I [...]:     * change_log_date_label -> Date
I [...]:     * change_log_author_label -> Author
I [...]:     * change_log_description_label -> Description
I [...]:     * approvals_role_label -> Approvals
I [...]:     * approvals_name_label -> Name
I [...]:     * approvals_date_and_signature_label -> Date and Signature
I [...]:     * proprietary_information -> /opt/legal/proprietary_information.txt
I [...]:     * toc_level -> 3
I [...]:     * list_of_figures ->
I [...]:     * list_of_tables ->
I [...]:     * font_path -> /opt/fonts/
I [...]:     * font_suffix -> .otf
I [...]:     * bold_font -> ITCFranklinGothicStd-Demi
I [...]:     * italic_font -> ITCFranklinGothicStd-BookIt
I [...]:     * bold_italic_font -> ITCFranklinGothicStd-DemiIt
I [...]:     * main_font -> ITCFranklinGothicStd-Book
I [...]:     * fixed_font_package -> sourcecodepro
I [...]:     * code_fontsize -> \scriptsize
I [...]:     * chosen_logo -> /opt/logo/liitos-logo.png
I [...]: verifying metadata starting from (guess/foo/meta-default.yml) uses only tokens from the liitos vocabulary ...
I [...]: metadata successfully verified 32 tokens (82.05% of vocabulary)
I [...]: metadata from (guess/foo/meta-default.yml) seems to be valid
I [...]: reporting target type (foo) ...
I [...]: - target_type='foo':
I [...]:   + dir -> foo
I [...]:   + file -> structure.yml
I [...]:   + structure =>
I [...]:     * foo_kind =>
I [...]:       - default =>
I [...]:         + approvals -> approvals.yml
I [...]:         + bind -> bind.txt
I [...]:         + changes -> changes.yml
I [...]:         + meta -> meta-default.yml
I [...]:         + render -> True
I [...]:         + formats -> ['html', 'pdf']
I [...]:         + options -> None
I [...]:   + valid -> True
I [...]: structures appear to be valid (on file system screening level)
I [...]: dumping proposed global expanded file from guessing to (GUESSED_STRUCTURES/tree.yml) ...
I [...]: dumping proposed structures file from guessing to (GUESSED_STRUCTURES/structures.yml) ...
I [...]: end timestamp (2023-01-14 20:54:33.869474 UTC)
I [...]: explored structures at guess in 0.030438 secs

Inspecting folder GUESSED_STRUCTURES contents:

❯ bat --plain GUESSED_STRUCTURES/structures.yml
structures:
  foo: foo/structure.yml

... and:

❯ bat --plain GUESSED_STRUCTURES/tree.yml
structures:
  foo:
    dir: foo
    file: structure.yml
    structure:
      foo_kind:
        default:
          approvals: approvals.yml
          bind: bind.txt
          changes: changes.yml
          formats:
          - html
          - pdf
          meta: meta-default.yml
          options: null
          render: true
    valid: true

Explore - Help

❯ navigaattori explore --help

 Usage: navigaattori explore [OPTIONS] [DOC_ROOT_POS]

 Explore the structures definition tree in the file system.

╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────╮
│   doc_root_pos      [DOC_ROOT_POS]                                                                               │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --document-root  -d      TEXT  Root of the document tree to visit. Optional (default: positional tree root       │
│                                value)                                                                            │
│ --verbose        -v            Verbose output (default is False)                                                 │
│ --strict         -s            Output noisy warnings on console (default is False)                               │
│ --guess          -g            Guess and derive structures from folder tree structure.yml files if possible      │
│                                (default is False)                                                                │
│ --excludes       -x      TEXT  comma separated list of values to exclude paths containing the substring          │
│                                (default: .git/,render/pdf/)                                                      │
│                                [default: .git/,render/pdf/]                                                      │
│ --help           -h            Show this message and exit.                                                       │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯

Eject

❯ navigaattori eject
2023-01-14T20:57:50.414199+00:00 ERROR [NAVIGAATTORI]: eject of template with no name requested
2023-01-14T20:57:50.414940+00:00 INFO [NAVIGAATTORI]: templates known: (liitos-vocabulary-yaml)

indicating the source:

❯ navigaattori eject l
---
slot_marker: VALUE.SLOT
targets:
  title:
    eol_marker: '%%_PATCH_%_MAIN_%_TITLE_%%'
    default: null
    scope: metadata.tex.in
  sub_title:
    eol_marker: '%%_PATCH_%_SUB_%_TITLE_%%'
    default: ' '
    scope: metadata.tex.in
  header_title:
    eol_marker: '%%_PATCH_%_HEADER_%_TITLE_%%'
    default: null
    scope: metadata.tex.in
  header_type:
    eol_marker: '%%_PATCH_%_TYPE_%%'
    default: Engineering Document
    scope: metadata.tex.in
  header_id:
    eol_marker: '%%_PATCH_%_ID_%%'
    default: null
    scope: metadata.tex.in
  header_id_label:
    eol_marker: '%%_PATCH_%_ID_%_LABEL_%%'
    default: 'Doc. ID:'
    scope: metadata.tex.in
  header_id_show:
    eol_marker: '%%_PATCH_%_ID_%_SHOW_%%'  # dummy to support inversion
    default: true
    scope: metadata.tex.in
  issue:
    eol_marker: '%%_PATCH_%_ISSUE_%%'
    default: '01'
    scope: metadata.tex.in
  revision:
    eol_marker: '%%_PATCH_%_REVISION_%%'
    default: '00'
    scope: metadata.tex.in
  header_issue_revision_combined:
    eol_marker: '%%_PATCH_%_ISSUE_%_REVISION_%_COMBINED_%%'
    default: Iss \theMetaIssCode, Rev \theMetaRevCode
    scope: metadata.tex.in
  header_issue_revision_combined_label:
    eol_marker: '%%_PATCH_%_ISSUE_%_REVISION_%_COMBINED_%_LABEL_%%'
    default: 'Issue, Revision:'
    scope: metadata.tex.in
  header_issue_revision_combined_show:
    eol_marker: '%%_PATCH_%_ISSUE_%_REVISION_%_COMBINED_%_SHOW_%%'  # dummy to support inversion
    default: true
    scope: metadata.tex.in
  header_date:
    eol_marker: '%%_PATCH_%_DATE_%%'
    default: null
    scope: metadata.tex.in
  header_date_label:
    eol_marker: '%%_PATCH_%_DATE_%_LABEL%%'
    default: 'Date:'
    scope: metadata.tex.in
  header_date_enable_auto:
    eol_marker: '%%_PATCH_%_DATE_%_ENABLE_%_AUTO_%%'  # dummy to support inversion
    default: true
    scope: metadata.tex.in
  header_date_show:
    eol_marker: '%%_PATCH_%_DATE_%_SHOW_%%'  # dummy to support inversion
    default: true
    scope: metadata.tex.in
  footer_frame_note:
    eol_marker: '%%_PATCH_%_FRAME_%_NOTE_%%'
    default: null
    scope: metadata.tex.in
  footer_page_number_prefix:
    eol_marker: '%%_PATCH_%_FOOT_%_PAGE_%_COUNTER_%_LABEL_%%'
    default: 'Page'
    scope: metadata.tex.in
  change_log_issue_label:
    eol_marker: '%%_PATCH_%_CHANGELOG_%_ISSUE_%_LABEL_%%'
    default: 'Iss.'
    scope: metadata.tex.in
  change_log_revision_label:
    eol_marker: '%%_PATCH_%_CHANGELOG_%_REVISION_%_LABEL_%%'
    default: 'Rev.'
    scope: metadata.tex.in
  change_log_date_label:
    eol_marker: '%%_PATCH_%_CHANGELOG_%_DATE_%_LABEL_%%'
    default: 'Date'
    scope: metadata.tex.in
  change_log_author_label:
    eol_marker: '%%_PATCH_%_CHANGELOG_%_AUTHOR_%_LABEL_%%'
    default: Author
    scope: metadata.tex.in
  change_log_description_label:
    eol_marker: '%%_PATCH_%_CHANGELOG_%_DESCRIPTION_%_LABEL_%%'
    default: Description
    scope: metadata.tex.in
  approvals_role_label:
    eol_marker: '%%_PATCH_%_APPROVALS_%_ROLE_%_LABEL_%%'
    default: Approvals
    scope: metadata.tex.in
  approvals_name_label:
    eol_marker: '%%_PATCH_%_APPROVALS_%_NAME_%_LABEL_%%'
    default: Name
    scope: metadata.tex.in
  approvals_date_and_signature_label:
    eol_marker: '%%_PATCH_%_APPROVALS_%_DATE_%_AND_%_SIGNATURE_%_LABEL_%%'
    default: Date and Signature
    scope: metadata.tex.in
  proprietary_information:
    eol_marker: '%%_PATCH_%_PROPRIETARY_%_INFORMATION_%_LABEL_%%'
    default: null
    scope: metadata.tex.in
  toc_level:
    eol_marker: '%%_PATCH_%_TOC_%_LEVEL_%%'
    default: 2
    scope: driver.tex.in
  list_of_figures:
    eol_marker: '%%_PATCH_%_LOF_%%'
    default: '%'  # empty string to enable lof
    scope: driver.tex.in
  list_of_tables:
    eol_marker: '%%_PATCH_%_LOT_%%'
    default: '%'  # empty string to enable lot
    scope: driver.tex.in
  font_path:
    eol_marker: '%%_PATCH_%_FONT_%_PATH_%%'
    default: /opt/fonts/
    scope: setup.tex.in
  font_suffix:
    eol_marker: '%%_PATCH_%_FONT_%_SUFFIX_%%'
    default: .otf
    scope: setup.tex.in
  bold_font:
    eol_marker: '%%_PATCH_%_BOLD_%_FONT_%%'
    default: ITCFranklinGothicStd-Demi
    scope: setup.tex.in
  italic_font:
    eol_marker: '%%_PATCH_%_ITALIC_%_FONT_%%'
    default: ITCFranklinGothicStd-BookIt
    scope: setup.tex.in
  bold_italic_font:
    eol_marker: '%%_PATCH_%_BOLDITALIC_%_FONT_%%'
    default: ITCFranklinGothicStd-DemiIt
    scope: setup.tex.in
  main_font:
    eol_marker: '%%_PATCH_%_MAIN_%_FONT_%%'
    default: ITCFranklinGothicStd-Book
    scope: setup.tex.in
  fixed_font_package:
    eol_marker: '%%_PATCH_%_FIXED_%_FONT_%_PACKAGE_%%'
    default: sourcecodepro
    scope: setup.tex.in
  code_fontsize:
    eol_marker: '%%_PATCH_%_CODE_%_FONTSIZE_%%'
    default: \scriptsize
    scope: setup.tex.in
  chosen_logo:
    eol_marker: '%%_PATCH_%_CHOSEN_%_LOGO_%%'
    default: liitos-logo.png
    scope: setup.tex.in
tokens:
  '%%_PATCH_%_MAIN_%_TITLE_%%': title
  '%%_PATCH_%_SUB_%_TITLE_%%': sub_title
  '%%_PATCH_%_HEADER_%_TITLE_%%': header_title
  '%%_PATCH_%_TYPE_%%': header_type
  '%%_PATCH_%_ID_%%': header_id
  '%%_PATCH_%_ID_%_LABEL_%%': header_id_label
  '%%_PATCH_%_ID_%_SHOW_%%': header_id_show  # dummy to support inversion
  '%%_PATCH_%_ISSUE_%%': issue
  '%%_PATCH_%_REVISION_%%': revision
  '%%_PATCH_%_ISSUE_%_REVISION_%_COMBINED_%%': header_issue_revision_combined
  '%%_PATCH_%_ISSUE_%_REVISION_%_COMBINED_%_LABEL_%%': header_issue_revision_combined_label
  '%%_PATCH_%_ISSUE_%_REVISION_%_COMBINED_%_SHOW_%%': header_issue_revision_combined_show  # dummy to support inversion
  '%%_PATCH_%_DATE_%%': header_date
  '%%_PATCH_%_DATE_%_ENABLE_%_AUTO__%%': header_date_enable_auto  # dummy to support inversion
  '%%_PATCH_%_DATE_%_LABEL_%%': header_date_label
  '%%_PATCH_%_DATE_%_SHOW_%%': header_date_show  # dummy to support inversion
  '%%_PATCH_%_FRAME_%_NOTE_%%': footer_frame_note
  '%%_PATCH_%_FOOT_%_PAGE_%_COUNTER_%_LABEL_%%': footer_page_number_prefix
  '%%_PATCH_%_CHANGELOG_%_ISSUE_%_LABEL_%%': change_log_issue_label
  '%%_PATCH_%_CHANGELOG_%_REVISION_%_LABEL_%%': change_log_revision_label
  '%%_PATCH_%_CHANGELOG_%_DATE_%_LABEL_%%': change_log_date_label
  '%%_PATCH_%_CHANGELOG_%_AUTHOR_%_LABEL_%%': change_log_author_label
  '%%_PATCH_%_CHANGELOG_%_DESCRIPTION_%_LABEL_%%': change_log_description_label
  '%%_PATCH_%_APPROVALS_%_ROLE_%_LABEL_%%': approvals_role_label
  '%%_PATCH_%_APPROVALS_%_NAME_%_LABEL_%%': approvals_name_label
  '%%_PATCH_%_APPROVALS_%_DATE_%_AND_%_SIGNATURE_%_LABEL_%%': approvals_date_and_signature_label
  '%%_PATCH_%_PROPRIETARY_%_INFORMATION_%_LABEL_%%': proprietary_information
  '%%_PATCH_%_TOC_%_LEVEL_%%': toc_level
  '%%_PATCH_%_LOF_%%': list_of_figures
  '%%_PATCH_%_LOT_%%': list_of_tables
  '%%_PATCH_%_FONT_%_PATH_%%': font_path
  '%%_PATCH_%_FONT_%_SUFFIX_%%': font_suffix
  '%%_PATCH_%_BOLD_%_FONT_%%': bold_font
  '%%_PATCH_%_ITALIC_%_FONT_%%': italic_font
  '%%_PATCH_%_BOLDITALIC_%_FONT_%%': bold_italic_font
  '%%_PATCH_%_MAIN_%_FONT_%%': main_font
  '%%_PATCH_%_FIXED_%_FONT_%_PACKAGE_%%': fixed_font_package
  '%%_PATCH_%_CODE_%_FONTSIZE_%%': code_fontsize
  '%%_PATCH_%_CHOSEN_%_LOGO_%%': chosen_logo

to a name path:

❯ navigaattori eject l -o a-name.yml
2023-01-14T20:58:42.496489+00:00 WARNING [NAVIGAATTORI]: requested writing (templates/liitos_vocabulary.yml) to file
❯ head a-name.yml
---
slot_marker: VALUE.SLOT
targets:
  title:
    eol_marker: '%%_PATCH_%_MAIN_%_TITLE_%%'
    default: null
    scope: metadata.tex.in
  sub_title:
    eol_marker: '%%_PATCH_%_SUB_%_TITLE_%%'
    default: ' '

Eject - Help

❯ navigaattori eject --help

 Usage: navigaattori eject [OPTIONS] [THAT]

 Eject a template. Enter unique part to retrieve, any unknown word to obtain the list of known templates.

╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────╮
│   that      [THAT]                                                                                               │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --output-path  -o      TEXT  Path to output unambiguous content to - like when ejecting a template               │
│ --help         -h            Show this message and exit.                                                         │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯