-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathindex.html
More file actions
176 lines (165 loc) · 123 KB
/
Copy pathindex.html
File metadata and controls
176 lines (165 loc) · 123 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8">
<meta name="color-scheme" content="dark light">
<style>/* c.css */
@view-transition {navigation: auto;}:root {color-scheme: light dark;--light: #fff;--dark: #000;--accent: #8e70f7;--base_x1: 1ch;--half_base_x1: .5ch;--bg: light-dark(var(--light), var(--dark));--fg: light-dark(var(--dark), var(--light));--border: 1px solid var(--fg);--line_height: 150%;--rad: 5px;--check: radial-gradient(circle at 0.5px 0.5px, var(--fg) 0.71px, transparent 0.71px) 0 0/2px 2px;}[hidden] {display: none !important;}.g-tip {position: fixed;z-index: 9999;pointer-events: none;padding: 2px 6px;border-radius: 4px;background: var(--fg);color: var(--bg);font-size: 13px;max-width: 260px;line-height: 1.4;}* {accent-color: var(--fg);font-size: 14px;resize: none;outline: none;font-family: monospace;font-variant-ligatures: no-common-ligatures;line-height: var(--line_height);padding: 0;margin: 0;box-sizing: border-box;border: 0;color: var(--fg);background-color: transparent;}mark {background-color: yellow;color: var(--dark);}::-moz-selection {background: var(--fg);color: var(--bg);}::selection {background: var(--fg);color: var(--bg);}::backdrop {background: #80808025;}#no_click_through {display: none;}body:has(:popover-open) #no_click_through {display: block;position: fixed;background-color: transparent;top: 0;left: 0;width: 100dvw;height: 100dvh;z-index: 3;}header {display: flex;justify-content: space-between;align-items: center;position: relative;margin: 0 1ch;padding: 1ch 0ch;padding-bottom: 0;>small {font-size: 10px;display: flex;gap: 1ch;* {font-size: 10px;}}}#please_enable_js {position: fixed;background-color: var(--fg);color: var(--bg);padding: 2ch;width: 100dvw;height: 100dvh;left: 0;top: 0;z-index: 999;display: flex;align-items: center;justify-content: center;font-size: 20px;}a {color: var(--fg);}html {overflow: hidden;}html,body {background-color: var(--bg);width: 100vw;height: 100dvh;min-height: 100dvh;}body {display: flex;flex-direction: column;}header nav {user-select: none;background-color: transparent;margin-bottom: -1px;display: flex;flex-direction: row;align-items: center;gap: 2px;span {padding: .5ch 1ch .5ch 0;}&>label {background-color: transparent;border: 1px solid transparent;border-bottom: 1px solid;padding: .5ch 1ch;display: inline-block;border-radius: 3px 3px 0 0;&:hover {border-color: var(--fg);border-style: dashed;}}>a {margin-bottom: 3px;}}#main {margin: 0ch;border-top: 0;position: relative;height: 0px;flex: 1 1 auto;overflow: hidden;}h1,h2,.center {text-align: center;}.no_select {user-select: none;-webkit-user-select: none;-moz-user-select: none;-ms-user-select: none;cursor: default;}#tl1_tool {flex-direction: column;display: flex;flex: 1 1 auto;height: 100%;max-width: 100%;}#t1l_menu_bar {display: flex;padding: 0px 0ch 1ch 0ch;gap: 1ch;justify-content: center;}header > .view_toggle {position: absolute;left: 50%;top:.9ch;transform: translate(-50%);}.view_toggle {display: flex;border-radius: 1lh;padding: 2px;gap: 3px;border: 1px solid var(--fg);label {padding: 0 1ch;line-height: 100%;border-radius: 1lh;border: 1px solid transparent;&:hover {border: 1px dashed var(--fg)}}}#view_input:checked~* label[for=view_input],#view_both:checked~* label[for=view_both],#view_output:checked~* label[for=view_output] {border-style: solid;border-color: var(--fg);}#view_input:checked~* #markup_holder,#view_both:checked~* #markup_holder {display: flex;}#view_output:checked~* #output_holder,#view_both:checked~* #output_holder {display: flex;}#templates_list {width: 100%;}#tag_picker {max-width: 200px;border: var(--border);#tag_options {padding: 1ch;}button {white-space: pre;width: 100%;text-align: left;margin-bottom: 2px;}}button {background: var(--bg);color: var(--fg);border: var(--border);border-radius: 2px;padding: 2px 4px;line-height: 100%;}button:hover {border-style: solid;box-shadow: inset 0px 0px 0px 1px var(--fg);border-color: var(--fg);}button:active {background-color: var(--fg);color: var(--bg);}label[for="close_sub_menu"] {display: block;z-index: 3;background: #80808025;width: 100vw;height: 100vh;position: fixed;top: 0;left: 0;}#close_sub_menu2:checked+label,#close_sub_menu:checked+label {display: none;}.menu_bar {gap: 1ch;display: flex;flex-direction: row;padding: 0;border: none;align-items: center;line-height: var(--line_height);& input[type=radio] {display: none;}& input[type=radio]:not(:checked)~.sub_menu_holder {display: none;}>a {padding: 1px var(--half_base_x1);line-height: 100%;}>button,.menu_item .menu_button {padding: 1px var(--half_base_x1);border-radius: 3px;border: 1px solid transparent;display: block;>span {line-height: 100%;}line-height: 100%;&:active {background: var(--fg);color: var(--bg);border: var(--border);border-color: var(--fg);}}>button {border: var(--border);}}button span {display: inline;}.menu_item {position: relative;&:hover .sub_menu_holder {display: flex !important;}.sub_menu_holder {display: flex;flex-direction: column;position: absolute;top: 17px;z-index: 4;background: var(--bg);min-width: 200px;border-radius: 3px;padding: 2px;border: var(--border);& hr {width: 100%;border-top: var(--border);margin: 2px 0;}small {font-size: xx-small;text-align: center;}:is(label, button),>a,>span {border-radius: 3px;border: 1px solid transparent;background-color: transparent;width: 100%;margin: 0px 0;display: block;padding: 0 var(--half_base_x1);line-height: var(--line_height);text-align: left;}.menu_item_note {display: block;border-bottom: 1px dashed var(--fg);margin-bottom: 2px;}& :is(a, label, button):hover {cursor: pointer;border-color: var(--fg);}& :is(a, label, button):active {background: var(--fg);border-color: var(--fg);color: var(--bg);}}}.menu_item>input:checked+.menu_button,.menu_item:hover .menu_button {border: 1px solid var(--fg)}#tl1_columns {display: flex;flex: 1 1 auto;gap: 1ch;padding: 1ch 1ch 1ch 1ch;min-width: 0;flex-direction: row;}@media only screen and (min-width: 140ch) {#tl1_columns {flex-direction: row;height: 0;}#markup_holder,#output_holder {flex: 1;height: 100%;}}@media only screen and (max-width: 140ch) {#tl1_columns {flex-direction: column;}#markup_holder,#output_holder {width: 100%;height: 0;flex-grow: 1;flex-shrink: 0;flex-basis: auto;}}.column_header {padding: 1ch;border-bottom: 1px dashed var(--fg);text-align: center;}#markup_holder {display: none;position: relative;.column_info {border-top: 1px dashed var(--fg);padding: 1ch;text-align: center;}}::-webkit-scrollbar {width: 2ch;height: 2ch;cursor: pointer;outline: 1px solid var(--fg);z-index: 3;}::-webkit-scrollbar-track,::-webkit-scrollbar-corner {background: var(--bg);border-radius: 0;}::-webkit-scrollbar-thumb {box-shadow: inset 0 0 0 1px var(--fg);border: 2px solid var(--bg);background: transparent;box-sizing: border-box;}::-webkit-scrollbar-thumb:horizontal {border-radius: 0 0 0 var(--rad);}::-webkit-scrollbar-thumb:horizontal,::-webkit-scrollbar-thumb:vertical {border: 1px solid var(--bg);}::-webkit-scrollbar-corner {outline: 1px solid var(--fg);}textarea {caret-color: var(--accent);}#markup_holder {flex-direction: column;.textarea_holder {scrollbar-gutter: stable;width: 100%;height: 100%;overflow: auto;margin: 0 auto;flex: 1;#markup {max-width: min(72ch, 100%);padding: 4ch;min-height: 100%;white-space: pre-wrap;width: 100%;flex-grow: 1;flex-shrink: 0;margin: 0 auto;}}.markup_errors_holder {padding: 1ch 3ch;border-top: var(--border);summary {cursor: default;border-bottom: var(--border);border-color: transparent;font-weight: bold;}#markup_errors_list {flex-shrink: 0;display: flex;min-height: 5lh;width: 100%;}}}#output_holder {flex-direction: column;flex-grow: 1;display: none;overflow: hidden;#output_tab_show_html:checked~* mt-html_show {display: flex;}#output_tab_show_ascii:checked~* mt-ascii-holder {display: flex;}#output_tab_show_html:checked~* label[for="output_tab_show_html"],#output_tab_show_ascii:checked~* label[for="output_tab_show_ascii"] {border-bottom-color: var(--bg);}nav {gap: 1ch;z-index: 1;display: flex;margin: 0 0 -1px;label {border: 1px solid var(--fg);border-bottom-color: var(--fg);padding: .7ch 1ch;line-height: 126%;border-radius: var(--rad) var(--rad) 0 0;}}mt-output_type_tabs {flex-grow: 1;flex-shrink: 1;overflow: hidden;display: flex;mt-html_show,mt-ascii-holder {max-height: 100%;border: var(--border);border-radius: 0 var(--rad) var(--rad) var(--rad);overflow: hidden;flex: 1 1 auto;box-sizing: border-box;padding: 0;display: none;flex-direction: column;text-align: center;#shadow_for_output_ascii,#shadow_for_output_html {flex-grow: 1;flex-shrink: 1;all: initial;overflow-y: scroll;padding: 2ch;font-family: 'Times New Roman', Times, serif;font-size: 14px;color: var(--fg);}}}}.area_header {display: flex;flex-direction: row;padding: 1ch;align-items: center;border-bottom: var(--border);gap: 1ch;* {line-height: 100%;}span {display: flex;gap: 1ch;}}#markup_holder {>.input_tab_nav {gap: 1ch;z-index: 1;display: flex;margin: 0 0 -1px;padding: 0;label {border: 1px solid var(--fg);border-bottom-color: var(--fg);padding: .7ch 1ch;line-height: 126%;border-radius: var(--rad) var(--rad) 0 0;}}>#input_tab_show_blocks:checked~* mt-blocks {display: flex}>#input_tab_show_all:checked~* mt-all {display: flex}>#input_tab_show_blocks:checked~* label[for="input_tab_show_blocks"],>#input_tab_show_all:checked~* label[for="input_tab_show_all"] {border-bottom-color: var(--bg)}mt-input-tabs {flex-grow: 1;flex-shrink: 1;overflow: hidden;display: flex;min-height: 0;mt-blocks,mt-all {max-height: 100%;border: var(--border);border-radius: 0 var(--rad) var(--rad) var(--rad);overflow: hidden;flex: 1 1 auto;box-sizing: border-box;display: none;flex-direction: column;}mt-all {.textarea_holder {flex: 1;overflow: auto}}}}#blocks_toolbar {display: flex;gap: .5ch;padding: .5ch 1ch;border-bottom: var(--border);flex-shrink: 0;align-items: center;flex-wrap: wrap;input[type=radio] {display: none}button:disabled {border: 1px dashed var(--fg);pointer-events: none}}#blocks_toolbar .view_toggle input:checked+label {border:var(--border);}#blocks_container {flex: 1;min-height: 0;overflow-y: auto;padding: 1ch;display: flex;flex-direction: column;}.block {position: relative;display: flex;flex-direction: column;transition: padding .2s, gap .2s, box-shadow .2s, opacity .25s;&.removing {opacity: 0;pointer-events: none;}.block_preview {cursor: default;min-height: 1lh;&:hover{outline: 1px dashed var(--fg);outline-offset: -2px;}pre {margin: 0;font-size: 12px;white-space: pre-wrap;overflow-x: auto;padding: .5ch}}&.editing {.block_insert_holder {display: none;}gap: 1ch;box-shadow: inset 0 0 0 1px var(--fg);padding: 1ch;.block_preview{display: none}}}.block_editor_preview {flex: 1 1 100%;pre {margin: 0;font-size: 12px;white-space: pre-wrap;overflow-x: auto;padding: .5ch}}.block_editor_anchor {overflow: hidden;}.block_action_done{background: var(--fg);color: var(--bg);}.block_insert_holder {position: relative;height: 1px;background: transparent;transition: background .15s;}.block_insert_holder:has(.block_insert_btn:hover) {background: var(--fg);}.block_insert_btn {display: none;position: absolute;left: 50%;top: 50%;z-index: 1;transform: translate(-50%,-50%);width: 1.6em;height: 1.6em;border-radius: 50%;background: var(--bg);border: 1px solid var(--fg);cursor: default;font-size: .75em;padding: 0;align-items: center;justify-content: center;}.block:hover .block_insert_btn {display: flex;}.block_empty_add {display: flex;align-items: center;justify-content: center;width: 1.6em;height: 1.6em;border-radius: 50%;background: var(--bg);border: 1px solid var(--fg);cursor: default;font-size: .75em;padding: 0;margin: 0 auto;}.block_empty_add:hover {background: var(--fg);color: var(--bg);}.block_insert_btn:hover {background: var(--fg);color: var(--bg);}.html_preview {all: initial;display: block;padding: .5ch;box-sizing: border-box;*,*::before,*::after {all: revert}}#shared_block_editor {display: flex;flex-direction: row;flex-wrap: wrap;gap: .6ch;textarea{background: var(--bg);}.section_type_row {display: inline-flex;align-items: center;gap: 1ch;select {min-width: 0;border: var(--border);padding: .5ch;border-radius: 2px;width: auto}}.section_config_fields {display: contents;.config_check_label {display: flex;align-items: center;gap: .4ch;cursor: default;border: var(--border);border-radius: 2px;padding: .1ch .5ch}.config_select_label {display: flex;align-items: center;gap: .4ch;border: var(--border);border-radius: 2px;padding: .1ch .5ch;select {border: var(--border);flex: 1}}.config_number_label {display: flex;align-items: center;gap: .4ch;border: var(--border);border-radius: 2px;padding: .1ch .5ch;input {width: 5ch;border: var(--border);text-align: center}.input_hint {font-style: italic;}}.config_radio_group {display: flex;align-items: center;gap: 1ch;border: var(--border);border-radius: 2px;padding: .1ch .5ch;.config_radio_label {white-space: nowrap}.config_radio_options {display: inline-flex;.config_radio_item {display: inline-flex;align-items: center;cursor: default;padding: 0ch .5ch;border: var(--border);&:first-child {border-radius: 3px 0 0 3px}&:last-child {border-radius: 0 3px 3px 0}&:not(:last-child) {margin-right: -1px}input {display: none}&:has(input:checked) {text-decoration: underline;}}}}.column_editor_area {flex:1 1 100%;.column_editor_flex {display: flex;gap: 1ch;.column_editor_col {flex: 1;display: flex;flex-direction: column;gap: .3ch;.column_textarea {flex: 1;min-height: 3lh;border: var(--border);padding: .5ch;white-space: pre-wrap;resize: none;font-family: monospace;line-height: 140%;field-sizing: content}}}}}.section_textarea {flex: 1 1 100%;min-height: 1lh;border: var(--border);padding: .5ch;white-space: pre-wrap;resize: none;width: 100%;font-family: monospace;field-sizing: content;&:focus{box-shadow: inset 0 0 0 2px var(--fg);}}.editor_row {display: flex;align-items: center;gap: 1ch;}.section_content_label {display: block;}.editor_actions {display: flex;gap: .5ch;button {cursor: default}}}.checkbox_holder {border: 1px dashed var(--fg);border-radius: var(--rad);padding: 0 var(--rad);display: flex;align-items: center;align-self: center;justify-items: center;justify-self: center;}</style>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<base target="_blank">
<title>Typeset Plain Text</title>
<meta name="description" content="Typeset copy as monospace plain text. The project includes a markup syntax, a JavaScript tool, a live playground site, and a short specification, to format documents following the conventions of typesetting with a typewriter.">
<meta name="v1" content="2024-09-01">
<meta name="keywords" content="text, formatting, typesetting, layout,">
<meta name="v" content="2026_07_21"></head>
<body>
<input type="radio" hidden="" name="view_areas" id="view_input" checked="">
<input type="radio" hidden="" name="view_areas" id="view_both">
<input type="radio" hidden="" name="view_areas" id="view_output">
<input hidden="" type="radio" name="tl1" id="show_tl1_tool" checked="">
<header>
<nav class="no_select">
<div class="menu_bar">
<input name="m_bar" hidden="" id="close_sub_menu" type="radio" checked="">
<label for="close_sub_menu"></label>
<a href="../">Up</a>
<div class="menu_item">
<input hidden="" id="mm_about" name="m_bar" type="radio">
<label class="menu_button" for="mm_about">Info
</label>
<fieldset role="presentation" class="sub_menu_holder">
<span data-t="First Version: 2024-09-04">V: 2026-07-20</span>
<a href="log.html" target="blank">Change Log</a>
<a href="spec.html">Specification</a>
<a href="license.html">License</a>
<small>© 2024-2026 Greg Abbott</small>
</fieldset>
</div>
<button id="save_all" data-t="Save all in a '.tar' file">Save</button>
</div>
</nav>
<div class="view_toggle">
<label for="view_input">Input</label>
<label for="view_both">Both</label>
<label for="view_output">Output</label>
</div>
<span>
</span>
<noscript>
<div id="please_enable_js">
This page requires JavaScript.
</div>
</noscript>
</header>
<div id="no_click_through"></div>
<div id="main">
<div id="tl1_tool">
<div id="tl1_columns">
<div id="markup_holder">
<input type="radio" name="input_tab" id="input_tab_show_blocks" checked="" hidden="">
<input type="radio" name="input_tab" id="input_tab_show_all" hidden="">
<nav class="input_tab_nav">
<label for="input_tab_show_blocks">Blocks</label>
<label for="input_tab_show_all">All</label>
</nav>
<mt-input-tabs>
<mt-blocks>
<div id="blocks_toolbar">
<span>Show:</span>
<span class="view_toggle" data-t="What to display when not editing a block">
<input type="radio" name="blocks_view" id="blocks_view_markup" value="markup" hidden="">
<label for="blocks_view_markup">Markup</label>
<input type="radio" name="blocks_view" id="blocks_view_html" value="html" hidden="">
<label for="blocks_view_html">HTML</label>
<input type="radio" name="blocks_view" id="blocks_view_text" value="text" hidden="" checked="">
<label for="blocks_view_text">Text</label>
</span>
<span style="flex:1"></span>
</div>
<div id="blocks_container"></div>
<div id="shared_block_editor" hidden=""></div>
</mt-blocks>
<mt-all>
<span class="area_header">
<b>Markup</b>
<div class="menu_bar">
<input hidden="" id="close_sub_menu2" type="radio" checked="">
<label for="close_sub_menu2"></label>
<div class="menu_item">
<input hidden="" id="mm_insert" name="m_bar" type="radio">
<label class="menu_button" for="mm_insert">Add</label>
<fieldset role="presentation" class="sub_menu_holder">
<div id="tag_options"></div>
</fieldset>
</div>
<div class="menu_item" id="menu_item_load">
<input hidden="" id="mm_load" name="m_bar" type="radio">
<label class="menu_button" for="mm_load">Load</label>
<fieldset role="presentation" class="sub_menu_holder" id="show_options_load">
<span class="menu_item_note">Selecting a template replaces any text in the markup area</span>
<div id="templates_list"></div>
</fieldset>
</div>
<button id="button_to_copy_markup">Copy</button>
<button id="save_markup" data-t="Save Markup.txt">Save<span id="markup_weight"></span></button>
</div>
</span>
<div class="textarea_holder">
<div contenteditable="plaintext-only" id="markup"></div>
</div>
<div class="markup_errors_holder">
<details>
<summary><span id="markup_errors_count"></span></summary>
<textarea id="markup_errors_list"></textarea>
</details>
</div>
</mt-all>
</mt-input-tabs>
</div>
<div id="output_holder">
<input type="radio" name="output_tab" hidden="" id="output_tab_show_ascii">
<input type="radio" name="output_tab" id="output_tab_show_html" hidden="" checked="">
<nav>
<label for="output_tab_show_ascii">Text</label>
<label for="output_tab_show_html">HTML</label>
</nav>
<mt-output_type_tabs>
<mt-html_show>
<span class="area_header">
<button id="button_to_copy_html">Copy</button>
<button id="save_html" data-t="Save '.HTML'">Save <span id="html_weight"></span></button>
<button id="open_html_page_new_tab" data-t="Open in new tab to test properly">Open</button>
<span class="checkbox_holder"><input type="checkbox" id="css_enabled" checked=""><label for="css_enabled">CSS </label></span>
</span>
<div id="shadow_for_output_html"></div>
</mt-html_show>
<mt-ascii-holder>
<span class="area_header">
<button id="button_to_copy_ascii">Copy</button>
<button id="save_ascii" data-t="Save '.txt'">Save<span id="rendered_ascii_weight"></span></button>
<button id="open_ascii_output_new_tab">Open</button>
</span>
<div id="shadow_for_output_ascii"></div>
</mt-ascii-holder>
</mt-output_type_tabs>
</div>
</div>
</div>
</div>
<script>/* helpers.js */
const chain=(t,...i)=>i.reduce(((t,i)=>i(t)),t),unit_separator="";function trim_leading_trailing_lines(t){let i=t.split("\n"),n=t=>""!==t.trim(),r=i.findIndex(n),s=i.findLastIndex(n);return r<=s?i.slice(r,s+1).join("\n"):""}function string_to_paragraphs_list(t,i){return trim_leading_trailing_lines(t).split(/\n+\s*\n+/g).map((t=>i?t:t.split("\n").map((t=>t.trim())).join(" ")))}function looks_like_url(t){return["www.","http://","https://","ftp://"].some((i=>t.startsWith(i)))&&!t.trim().includes(" ")}
/* to_js.js */
null==window.m0&&(window.m0={}),window.m0.markup_block_to_js_block=(()=>{let e=null;const t=e=>e.replace(/(^|\n)\/\/ .+/g,"").replace(/\/\/ .+/g,""),n={};n.untagged_content=e=>(e.data=e.data.trim(),e),n.code=e=>(e.data=trim_leading_trailing_lines(e.data),e),n.comment=e=>e,n.settings=(n,r)=>{if(0==n.trim().length)return null;const a=({min:e,max:t,val:n})=>n<e?e:n>t?t:n,i={w:t=>{isNaN(t=parseInt(t))?e.errors.add("document setting key 'w' expects a number"):r.max_line_width=a({min:32,max:96,val:t})},g:t=>{isNaN(t=parseInt(t))&&e.errors.add("document setting key 'g' expects a number"),r.gaps_between_blocks=a({min:0,max:3,val:t})},i:t=>{isNaN(t=parseInt(t))&&e.errors.add("document setting key 'i' expects a number"),r.spaces_per_indent=a({min:2,max:8,val:t})}};let l=o(n=t(n));l.text_before_first_key_pair.length>0&&e.errors.add("Settings block has text before first pair",n),l.pairs.forEach((({key:t,value:n})=>{let r=n.join("\n\n"),a=t.toLowerCase().trim(),l=i[a];l?r=l(r):e.errors.add(`document settings block key "${a}" relates to no setting`)}))},n.$stamps=(n,r)=>{if(0==n.trim().length)return null;let a=o(n=t(n));return a.text_before_first_key_pair.length>0&&e.errors.add("Stamps Block has text before first pair",n),a.pairs.forEach((({key:e,value:t})=>{r.set(e,t.join("\n\n"))})),r},n.list=({config:t,data:n})=>{let r="\n"+trim_leading_trailing_lines(n);t=t.trim();const a=[];function i(e,t,n){0===a.length&&n>0&&(e=>{let t=r.substring(0,e).trim();0!==t.length&&a.push({depth:-1,data:t})})(n),a.push({depth:e,data:t})}return("0"===t?function(){for(let e of r.matchAll(/\n(?<depth>\d) (?<li_data>[\s\S]*?)(?=\n\d |$)/g))i(parseInt(e.groups.depth),e.groups.li_data,e.index)}:function(){for(let e of r.matchAll(/\n(?<depth>-+) (?<li_data>[\s\S]*?)(?=\n-+ |$)/g))i(e.groups.depth.length-1,e.groups.li_data,e.index)})(),(l=a).map(((t,n)=>{if(0===n)-1===t.depth?(e.errors.add(`text occurs before first list item. converting to first list item depth 0:\n"${t.data}"`),t.depth=0):t.depth>0&&(e.errors.add(`first list item must have depth 0. changing to zero.\n"${t.data}"`),t.depth=0);else{let r=l[n-1].depth+1,a=Math.min(9,r);t.depth>r?(e.errors.add(`item can't exceed previous item depth (${r}) by more than one. reducing to max allowed (${a}):\n"${t.data}"`),t.depth=a):t.depth>9&&(e.errors.add(`items can't exceed depth level 9. changing to level 9:\n"${t.data}"`),t.depth=9)}return t.data=string_to_paragraphs_list(t.data.trim()),t}));var l},n.column=({config:e,data:t})=>{let n=e,r=t,[a,i="",...l]=r.split("()");l.length>0?l=l.join("()"):0===l.length&&(l=null);let s="string"==typeof l?3:2;n=(n||"").toLowerCase();let o="l",c=2==s?"r":"c",d="r";if(1==n.length&&u(n))o=n,c=n,d=n;else if(n.length<4){let e=n.split("");u(e[0])&&(o=e[0]),u(e[1])&&(c=e[1]),u(e[2])&&(d=e[2])}function u(e){return["l","c","r"].includes(e)}return{total_columns:s,column_one_text:p(a),column_two_text:p(i),column_three_text:p(l||""),column_one_alignment:o,column_two_alignment:c,column_three_alignment:d};function p(e=""){return e.replace(/^\n/,"").replace(/\n$/,"")}},n.box=({config:e,data:t})=>{let n={text:t};if(t.includes("()")){let[e,r]=t.split("()");n.name=e.trim(),n.text=r}return n.text=string_to_paragraphs_list(n.text),n},n.pairs=({config:t,data:n})=>{let r=!1;const a=t.includes("d");let i="r",l=!1,s="l",c=!1;t.includes(".")&&(c=!0,i="l",s="r",t=t.replaceAll(".",""));let d=t.trim().split(""),u=t.toLowerCase().split("");if([1,2].includes(t.length)){let e=["l","c","r"].includes(u[0]),t=void 0===u[1],n=void 0!==u[1]&&["l","c","r"].includes(u[1]);e&&(n||t)&&(r=d[0].toUpperCase()==d[0],i=d[0].toLowerCase(),t&&(l=r,s=i)),n&&(l=d[1].toUpperCase()==d[1],s=d[1].toLowerCase())}let p=o(n);return p.text_before_first_key_pair.length>0&&e.errors.add("settings has text before first pair"),{is_definitions_list:a,dot_pairs:c,key_caps:r,key_align:i,value_caps:l,value_align:s,data:p.pairs,has_multi_line_value:p.has_multi_line_value}},n.$text=({config:e,data:t})=>{let n=(e=e.trim().split("")).find((e=>e.match(/l|c|r|j/gi)))||"l",r=e.find((e=>e?.match(/\d/)))||0;t=trim_leading_trailing_lines(t),e.includes("s")&&(t=function(e){const t=[".","!","?"],n=['"',"'","(","[","{",'"',"'","«","‹"];let r="",a=!0;for(let i=0;i<e.length;i++){const l=e[i];if(i>0&&e[i-1],i>1&&e[i-2],/\s/.test(l))r+=l;else if(/[a-zA-Z]/.test(l))a?(r+=l===l.toLowerCase()?l.toUpperCase():l,a=!1):r+=l;else if(r+=l,t.includes(l))a=!0;else if(n.includes(l)){let r=i-1;for(;r>=0&&(/\s/.test(e[r])||n.includes(e[r]));)r--;(r<0||t.includes(e[r]))&&(a=!0)}}return r}(t));let a=e.includes("i")||e.includes("I")&&["l","j"].includes(n);return{margin_left:r,margin_right:r,uppercase:e.some((e=>/^[A-Z]+$/.test(e))),align:n,indent_first_line:a,data:string_to_paragraphs_list(t.trim())}},n.gaps=({data:e,config:t})=>+t.trim()||1;const r=e=>{const t=(e+"").trim();return/^[-+]?[$£¥]?\d{1,3}(,\d{3})*(\.\d+)?%*$/.test(t)||/^[-+]?[$£¥]?\d+(\.\d+)?%*$/.test(t)};function a({config:e,data:t}){let n=t.trim().match(/^((?<title>.*?)\n[\s\n]*\(\) *\n)?(?<csv>[\s\S]+)/),a=function(e){let t=[];return{data:e.trim().split("\n").map(((e,n)=>{const a=e.match(/("([^"]|"")*"|[^,]+)/g);return a?a.map(((e,a,i)=>{let l=e.replace(/^"|"$/g,"").replace(/""/g,'"').trim();if(0===n){let e={align:null,holds_numbers:!0};return e.key=l.replace(/\((l|r|c|j)\)$/i,((t,n)=>(e.align=n,""))),t.push(e),e.key}return null===t[a].align&&t[a].holds_numbers&&(t[a].holds_numbers=r(l)),l})):[]})),align_text:t.reduce(((e,t)=>(t.align||(t.holds_numbers?t.align="r":t.align="l"),e[t.key]=t.align,e)),{})}}(n.groups.csv);return a.table_name=n.groups.title||"",a}function i({config:e,data:t}){let n=function(e){let t={},n={},r={align_text:{}};return r.data=e.trim().split(/\n\(\)\s*\n+/).reduce(((e,a,i)=>{let l=o(a);if(0===i){let e=l.text_before_first_key_pair.trim();e.length>0&&(r.table_name=e)}let s=l.pairs.reduce(((e,{key:r,value:a})=>{let i=r,l=function(e){let t="",n=e.replace(/\((r|l|c)\)/gi,((e,n)=>(t=n.toLowerCase(),""))).trim();return{alignment_letter:t,string:n}}(i),s=l.alignment_letter;i=l.string,void 0===n[i.toLowerCase()]&&""!==s&&(n[i.toLowerCase()]=s),t[i.toLowerCase()]||(t[i.toLowerCase()]=i);let o=a.join("\n\n");return e[i.toLowerCase()]=o.trim(),e}),{});return e.push(s),e}),[]).reduce(((e,a,i)=>{let l={};return Object.entries(t).forEach((([e,t])=>{void 0!==n[e]&&(r.align_text[t]=n[e]),l[t]=a[e]?a[e]:""})),e.push(l),e}),[]).reduce(((e,t,n)=>(0==n&&e.push(Object.keys(t)),e.push(Object.values(t)),e)),[]),r}(t);return function(e,t){let n=[];e.forEach(((e,a)=>{e.forEach(((e,i)=>{0===a?n.push({have_alignment:t[e]||!1,key:e}):n[i].have_alignment||(1===a&&(n[i].all_numbers=!0),n[i].all_numbers&&(n[i].all_numbers=r(e)))}))})),n.forEach((e=>{e.have_alignment||(t[e.key]=e.all_numbers?"r":"l")}))}(n.data,n.align_text),n}n.table=({config:e,data:t})=>{let n;var r;return n=e.includes(",")?a({config:e,data:t}):i({config:e,data:t}),e.includes("x")&&(n.data=(r=n.data)[0].map(((e,t)=>r.map((e=>e[t])))),n.transposed=!0),n},n.line=({config:e,data:t})=>e.split("").reduce(((e,t,n)=>(["l","r","c"].includes(t.toLowerCase())?(e.text_align=t,["L","R","C"].includes(t)&&(e.uppercase=!0)):e.pad_character=t,e)),{data:t,text:!!/[A-Z]/gi.test(t)&&t,uppercase:!1,underline:"",pad_character:"-",text_align:"c"});const l=e=>e.split(/\n/).reduce(((e,t)=>((t=t.trim()).length>0&&e.push(t),e)),[]);let s=0;function o(e){const t=e.trim(),n=t.length,r=["\t","\n","\r","\v","\f"];function a(e){return/[A-Za-z_$]/.test(e)}function i(e){let i=e;const l=[];if(i>=n||!a(t[i]))return null;for(;i<n;){const e=t[i];if("\\"!==e){if("="===e){const e=0===l.length,t=" "===l[l.length-1];if(e||t)return null;return{key:l.join(""),position_after_close_tag:i+1}}if(r.includes(e))return null;l.push(e),i+=1}else{const e=i+1;if(e>=n)return null;const a=t[e];if(r.includes(a))return null;l.push(a),i+=2}}return null}function l(e){for(let r=e;r<n;r++)if("\n"===t[r]){const e=r+1;if(e>=n||!a(t[e]))continue;const l=t.indexOf("=",e+1);if(-1===l)continue;if(" "===t[l-1])continue;if(i(e))return e}return n}const s=[];let o="",c=!1,d=!1,u=0;for(;u<n;){let e=!1;if(0===u&&a(t[0])){const r=i(0);if(r){e=!0;const{key:a,position_after_close_tag:i}=r;let p=i;for(;p<n&&" "===t[p];)p++;const g=l(p),_=t.slice(p,g),f=string_to_paragraphs_list(_);d||(o="",d=!0),f.length>1&&(c=!0),s.push({key:a,value:f}),u=g}}if(!e&&u>0&&"\n"===t[u-1]&&u<n&&a(t[u])){const r=i(u);if(r){e=!0;const{key:a,position_after_close_tag:i}=r;let p=i;for(;p<n&&" "===t[p];)p++;const g=l(p),_=t.slice(p,g),f=string_to_paragraphs_list(_);d||(o=t.slice(0,u),d=!0),f.length>1&&!c&&(c=!0),s.push({key:a,value:f}),u=g}}e||u++}return 0===s.length&&(o=t),{pairs:s,text_before_first_key_pair:o,has_multi_line_value:c}}return n.part=t=>{let n=t.data.trim();0===n.length&&(e.errors.add(`Name each part (part depth:"${t.depth}"`),n="Nameless part");let r=0;if(""===t.config.trim()?r=0:1===t.config.length&&/\d/.test(t.config)?r=parseInt(t.config):(e.errors.add("part block tag has an invalid config. setting level to 0",t.config),r=0),r>s+1){let t=Math.min(9,s+1);e.errors.add(`Open part level: ${s}. Parts level < ${t+1} can follow. Desired depth given: ${r}. (${n})`),r=t}return s=r,{name:l(n),depth:r}},n.header=({config:e,data:t})=>e.split("").reduce(((e,t,n)=>(["l","r","c"].includes(t.toLowerCase())?(e.text_align=t.toLowerCase(),["L","R","C"].includes(t)&&(e.uppercase=!0)):e.underline=t,e)),{uppercase:!1,underline:"",pad_character:" ",data:l(t),text_align:"c"}),t=>(e=t,n)})();
/* to_ascii.js */
null==window.m0&&(window.m0={}),window.m0.js_block_to_ascii_block=(()=>{let t={},e={current_block_placeholders:[],current_block_footnotes:0,footnotes_in_document:new Map,footnotes_added_in:0};const n={};function r(n){if(!e.current_block_footnotes)return n;function r(n,r,l=""){let i=a(/^.{4}/);return n.replace(RegExp(unit_separator+"F(\\d\\d)","g"),((n,a)=>{let o=e.footnotes_in_document.get(a);return o?(e.footnotes_added_in++,l&&t.errors.add(`Found a nested footnote: "${o.data}"`),o.number=l?l+"."+(r.length+1):(e.footnotes_added_in+"").padStart(2,0),o.data=i(o.number+": "+o.data),r.push(o),e.footnotes_in_document.delete(a),`(${o.number})`):(console.log("couldn't find footnote "+a,e.footnotes_in_document),n)}))}let l=[];return(n=r(n,l))+"\n\n"+l.map((t=>{let e=[];return t.data=r(t.data,e,t.number),e.length>0&&(t.data+="\n"+e.map((t=>t.data)).join("\n")),e.length=0,t.data})).join("\n")}function l(t){return 0==e.current_block_placeholders.length?t:(console.log(JSON.stringify(e.current_block_placeholders,null,2)),e.current_block_placeholders.reduce(((t,[e,n])=>t.replace(e,n)),t))}function a(e){return n=>{const r=t.settings.max_line_width;if(n.length<=r)return n;const l=n.match(e)[0],a=" ".repeat(l.length),i=[];let o=l,s=l.length,h=!0;const p=n.substring(l.length).split(/(\s+)/);for(let t=0;t<p.length;t++){const e=p[t];""!==e&&(s+e.length>r&&""!==o.trim()?(i.push(o),o=a+e,s=o.length,h=!1):(o+=e,s+=e.length))}return""!==o.trim()&&i.push(o),i.join("\n")}}n.last_jobs=t=>{let n=chain(t,r,l).replace(/\\([=()])/g,"$1");return e.current_block_placeholders.length=0,e.current_block_footnotes=0,n},n.token=(n,r)=>{let l=n;const a=(i="_",t=>i+t+i);var i;let o=[];var s;return r.includes("@")&&(s=l,t.$stamps.has(s)||t.errors.add(`Stamp "${s}" doesn't exist`),l=t.$stamps.get(s)),r.forEach((t=>{if("!"===t)l=(t=>t.toUpperCase())(l);else if("$"===t)l=a(l);else{if("@"===t)return;looks_like_url(t),o.push({data:t})}})),o.length>0&&(l+=function(t){let n=[];return t.forEach(((t,r)=>{let l=(e.footnotes_in_document.size+"").padStart(2,0),a=`${unit_separator}F${l}`;n.push(a),t.id=l,e.footnotes_in_document.set(l,t)})),e.current_block_footnotes++,n.join("")}(o)),l},n.pre_processor=(e,r)=>{t=r;return chain(e,(t=>t.replace(/(^|\n)\/\/ .+/g,"")),(t=>t.replace(/\/\/ .+/g,"")),(e=>{let n=e;return t.$stamps.forEach(((t,e)=>{n=n.replaceAll(`(${e})(@)`,t)})),n}),t.inline_token_parser(n.token))},n.code=({data:t})=>{let e=a(/^(\s*)/);return t.split("\n").map(e).join("\n")},n.comment=()=>null,n.untagged_content=({data:e})=>{let n=e.trim();return 0==n.length?null:function(e,n=t.settings.max_line_width){return e.replace(/(^|\n)([^\s].*?)(\n|$)/gm,((e,r,l,a)=>{if(l.length<=n)return e;let i=function(e,n=t.settings.max_line_width){const r=e.trim().split(" ");let l=e.match(/^ +/)?.[0]||"";r[0]=l+r[0];let a="",i="";return r.forEach((t=>{let e=(i.length>0?" ":"")+t;i.length+e.length<=n?i+=e:(a+=(a.length?"\n":"")+i,i=t)})),a+=(a.length?"\n":"")+i,a}(l,n);return r+i+a}))}(n)},n.column=({total_columns:e=3,column_one_text:n="",column_one_alignment:r="l",column_two_text:l="",column_two_alignment:a="c",column_three_text:i="",column_three_alignment:o="r",max_block_width:s=t.settings.max_line_width,gap_string:h=" ",new_line_token:p="\n"})=>{const _=s-(e-1)*h.length,c=Math.floor(_/e),u=c+_%e;function g({text:t,width:e,new_line_token:n}){const r=[];return t.split(n).forEach((t=>{if(""==t)return void r.push("");const n=t.split(" ");let l="";n.forEach((t=>{if(l.length+t.length+1<=e){let e=0===l.length;l+=(e?"":" ")+t}else r.push(l),l=t})),l&&r.push(l)})),r}function d({text_lines:t,width:e,alignment:n}){return t.map((t=>{if("left"==n)return t.padEnd(e," ");if("center"==n){const n=Math.max(0,Math.floor((e-t.length)/2));return" ".repeat(n)+t.padEnd(e-n," ")}return t.padStart(e," ")}))}const m=g({text:n,width:c,new_line_token:p}),f=g({text:l,width:u,new_line_token:p}),w=e<3?"":g({text:i,width:c,new_line_token:p}),x=Math.max(m.length,f.length,w.length);let k={l:"left",c:"center",r:"right"};const j=[];for(let t=0;t<x;t++){const n=d({text_lines:[m[t]||""],width:c,alignment:k[r]}),l=d({text_lines:[f[t]||""],width:u,alignment:k[a]}),i=e<3?"":d({text_lines:[w[t]||""],width:c,alignment:k[o]});let s=n[0]+h+l[0];3==e&&(s+=h+i[0]),j.push(s.trimEnd())}return j.join("\n")},n.box=({text:e,name:n="",string_align:r="left",box_align:l="center",box_padding:a=1,max_block_width:i=t.settings.max_line_width,min_box_width:o=0})=>{let s=i-4;function h(t){return e=>{const n=e.split(" "),r=[];let l=n[0];for(let e=1;e<n.length;e++){const a=n[e];l.length+a.length+1>t?(r.push(l),l=a):l+=" "+a}return r.push(l),r.reduce(((e,n)=>{if(n.length<=t)e.push(n);else{let r=n;for(;r.length>t;)e.push(r.slice(0,t-1)+"-"),r=r.slice(t-1);e.push(r)}return e}),[])}}o=Math.max(o,n.length+2),s=Math.min(s,i),o=Math.min(o,s);let p=h(s-2*a-2),_=e.length-1,c=e.reduce(((t,e,n)=>(t.push(...p(e)),n!==_&&t.push(...p("")),t)),[]);const u=Math.max(...c.map((t=>t.length))),g=Math.max(u,o-2*a-2),d=Math.min(s,Math.max(o,g+2*a+2));function m(t,e,n){const r=e-t.length;return"center"==n?" ".repeat(Math.floor(r/2))+t+" ".repeat(Math.ceil(r/2)):"right"==n?" ".repeat(r)+t:t+" ".repeat(r)}let f=c.map((t=>m(t,g,r))),w="",x="",k=".",j=".";if(n){const t=h(d-4)(n);w=". "+"-".repeat(d-4)+" "+j,x=t.map((t=>". "+m(t,d-4,"center")+" "+j)).join("\n"),x=`${k}${".".repeat(d-2)}${k}\n${x}`}else w=k+".".repeat(d-2)+k;const b=k+".".repeat(d-2)+k,M=w+"\n"+f.map((t=>j+" ".repeat(a)+t+" ".repeat(a)+j)).join("\n")+"\n"+b;return E=(x?x+"\n":"")+M,$=t.settings.max_line_width,y=l,E.split("\n").map((t=>m(t,$,y).trimEnd())).join("\n");var E,$,y},n.definitions_list=({key_caps:e=!1,value_caps:n=!1,block_name:r,data:l,wrap_in_border:a=!1,blank_line_between_defs:i=!1})=>{const o=t.settings.max_line_width,s=" ".repeat(t.settings.spaces_per_indent),h=o-s.length,p=(t,e)=>t.length<=e?[t]:t.split(" ").reduce(((t,n)=>{const r=t[t.length-1];return(r+n).length+1>e?t.push(n):t[t.length-1]+=(r?" ":"")+n,t}),[""]),_=[];if(l.forEach((({key:t,value:r},a)=>{const c=e?t.toUpperCase():t;p(c,o).forEach((t=>{_.push(t)})),r.forEach(((t,e)=>{const r=(n?t.toUpperCase():t).split(/\r?\n/);e>0&&_.push(""),r.forEach((t=>{p(t,h).forEach((t=>{_.push(s+t)}))}))})),a<l.length-1&&i&&_.push("")})),a){let t="-".repeat(o);return t+"\n"+_.join("\n")+t}return _.join("\n")},n.pairs=t=>n[t.is_definitions_list?"definitions_list":t.dot_pairs&&!t.has_multi_line_value?"pairs_dot_style":"pairs_normal"](t),n.pairs_dot_style=({dot_pairs:e,key_caps:n,key_align:r,value_caps:l,value_align:a,data:i,pad_character:o="."})=>i.reduce(((e,{key:r,value:a},i,s)=>{let h=r,p=a[0];n&&(p=p.toUpperCase()),l&&(h=h.toUpperCase());let _=t.settings.max_line_width-h.length-p.length;if(_>2){e+=h+o.repeat(_)+p,i!==s.length-1&&(e+="\n")}else{let n=t.settings.max_line_width-h.length;n<0&&(n=0);let r=h+(n>0?o.repeat(n):""),l=t.settings.max_line_width-p.length;l<0&&(l=0),e+=r+"\n"+((l>0?o.repeat(l):"")+p)+"\n\n"}return e}),"").trim(),n.pairs_normal=({key_caps:e=!1,key_align:n="r",value_caps:r=!1,value_align:l="l",block_name:a,max_block_width:i=t.settings.max_line_width,data:o})=>{let s=" ",h=0,p=0,_=0,c=i/2;const u=o.map((({key:t,value:n})=>{const l=e?t.toUpperCase():t,a=n.map((t=>(r?t.toUpperCase():t).split(/\r?\n/)));return l.length>h&&(h=l.length),a.forEach((t=>{t.forEach((t=>{t.length>p&&(p=t.length)}))})),{key:l,paragraphs:a}})),g=h+2+p;_=g>i?i:g,c=_-(h+2);const d=(t,e,n)=>"l"===n||"left"===n?t.padEnd(e," "):t.padStart(e," "),m=[];return u.forEach((({key:t,paragraphs:e})=>{let r=!0;e.forEach(((e,a)=>{if(a>0){const t=" ".repeat(h),e=" ".repeat(c);m.push(t+s+e)}e.forEach((e=>{const a=(o=c,(i=e).length<=o?[i]:i.split(" ").reduce(((t,e)=>{const n=t[t.length-1];return(n+e).length+1>o?t.push(e):t[t.length-1]+=(n?" ":"")+e,t}),[""]));var i,o;a.forEach((e=>{const a=r?d(t,h,n):" ".repeat(h),i=d(e,c,l);m.push(a+s+i),r=!1}))}))}))})),m.join("\n")},n.$text=({margin_left:e,margin_right:n,indent_first_line:r,data:l,uppercase:a,align:i})=>{a&&(l=l.map((t=>t.toUpperCase())));let o=e*t.settings.spaces_per_indent,s=n*t.settings.spaces_per_indent,h=t.settings.max_line_width-o-s,p=" ".repeat(o),_=0==o?t=>t:t=>t.split("\n").map((t=>p+t)).join("\n");return l.map((e=>_(function({width:e,align:n="l",indent_first_line:r=!1}){const l={j:({words:t,width:e,joined_length:n})=>{const r=e-n,l=t.length-1;if(r<=0||l<1)return t.join(" ");const a=Math.floor(r/l),i=r%l;return t.reduce(((t,e,n)=>t+e+(n===l?"":" ".repeat(1+a+(n<i?1:0)))),"")},c:({words:t,width:e})=>{let n=t.join(" "),r=Math.floor((e-n.length)/2);return r<0?(console.log("line not wide enough for words"),n):" ".repeat(r)+n},r:({words:t,width:e})=>{let n=t.join(" "),r=Math.floor(e-n.length);return r<0?(console.log("line not wide enough for words"),n):" ".repeat(r)+n},l:({words:t,width:e})=>t.join(" ")};return function(a){n=n.toLowerCase();let i=t.settings.spaces_per_indent,o=i>0?" ".repeat(i):"";return a.trim().split(" ").reduce(((t,a,i,s)=>{0==i&&(t.last_i=s.length-1),0==i&&r&&(a=o+a);let h=Math.max(0,t.current_line.length-1),p=t.current_line_letters_length+h,_=0==t.current_line.length?0:1;return a.length+_+p>e&&(t.final_lines+=l[n]({words:t.current_line,width:e,joined_length:p})+"\n",t.current_line=[],t.current_line_letters_length=0),t.current_line.push(a),t.current_line_letters_length+=a.length,i!==t.last_i?t:t.final_lines+l["j"==n?"l":n]({words:t.current_line,width:e})}),{current_line:[],current_line_letters_length:0,final_lines:""})}}({width:h,align:i,indent_first_line:r})(e)))).join(r?"\n":"\n\n")},n.gaps=t=>"\n".repeat(Math.max(1,t||1)-1);return n.table=function({data:e,page_width:n=t.settings.max_line_width,align_table:r="center",cell_padding:l=1,pad_character:a=" ",align_text:i={},table_name:o="",transposed:s=!1}){const h=(e,n)=>(e+"").split(/\r?\n/).flatMap((e=>{if(!e)return[""];const r=e.split(/\s+/);let l="";const a=[];return r.forEach((e=>{e.length>n?(l.trim().length&&a.push(l.trim()),l="",((e,n)=>{const r=[];let l=e,a=!1;const i=/[aeiouy]/i,o=t=>{const e=["-","_","/"];for(const n of e){const e=t.lastIndexOf(n);if(e>0&&e<t.length-1)return e+1}for(let e=t.length-1;e>0;e--)if(i.test(t[e-1])&&!i.test(t[e])&&e<t.length)return e;return t.length-1};for(;l.length>n;){a||(t.errors.add(`Word won't fit cell width "${e}". Hyphenated`),a=!0);const i=o(l.slice(0,n));r.push(l.slice(0,i)+"-"),l=l.slice(i)}return r.push(l),r})(e,n).forEach((t=>a.push(t)))):(l+e).length>n?(a.push(l.trim()),l=e+" "):l+=e+" "})),l.trim().length&&a.push(l.trim()),a})),p=(t,e,n)=>n.repeat(Math.max(0,e-t.length))+t,_=(t,e,n)=>{const r=e-t.length,l=Math.floor(r/2),a=r-l;return n.repeat(Math.max(0,l))+t+n.repeat(Math.max(0,a))},c={r:"right",l:"left",c:"center"},u=(t,e,n,r,l)=>{if(s){if(0===r)return"right";const t=e[0];return c[i[t]]||"left"}{const e=t[r];return c[i[e]]||"left"}},g=e[0],d=g.length,m=n-(d+1),f=Math.floor(m/d),w=m%d,x=Array.from({length:d},((t,e)=>f+(e<w?1:0))),k=s?"-":"=",j=(t="-")=>"+"+x.map((e=>t.repeat(e))).join("+")+"+",b=(t,e,n)=>{const r=t.map(((t,e)=>h(t,x[e]-2*l))),i=Math.max(...r.map((t=>t.length))),o=[];for(let n=0;n<i;n++){const i=r.map(((r,i)=>{const o=r[n]||"",s=x[i]-2*l,h=u(e,t,0,i),c="left"===h?(d=s,(g=o)+a.repeat(Math.max(0,d-g.length))):"right"===h?p(o,s,a):_(o,s,a);var g,d;return a.repeat(l)+c+a.repeat(l)}));o.push(":"+i.join(":")+":")}return o.join("\n")},M="+"+"=".repeat(n-2)+"+",E=o.length?` ${o} `:"",$=Math.floor((M.length-E.length)/2),y=M.slice(0,$)+E+M.slice($+E.length),v=[];v.push(y),v.push(b(g,g)),v.push(j(k)),e.slice(1).forEach(((t,e,n)=>{v.push(b(t,g)),e!==n.length-1&&v.push(j())})),v.push(M);const C=v.join("\n"),U=Math.min(n,C.split("\n")[0].length),S={left:0,center:Math.floor((n-U)/2),right:n-U}[r];return C.split("\n").map((t=>" ".repeat(S)+t)).join("\n")},n.line=e=>e.text?function({text:e,pad_character:n,text_align:r}){e=e?.trim()||"";let l=r.toLowerCase(),a=r.toUpperCase()==r?e.toUpperCase():e,i=" "+a+" ";if("l"==l){let e=n.repeat(2)+i,r=t.settings.max_line_width-e.length;return e+(r<0?"":n.repeat(r))}if("r"==l){let e=i+n.repeat(2),r=t.settings.max_line_width-e.length;return(r<0?"":n.repeat(r))+e}{let e=t.settings.max_line_width-i.length,r=Math.floor(e/2),l=e-r;return n.repeat(r)+i+n.repeat(l)}}(e):function(e){if(e=e.trim(),new Set(["-","_",".","=","@","*"]).has(e))return e.repeat(t.settings.max_line_width);let n=e.match(/(_|@|\*|\.|=|-)( +)\1/);if(n){return function(e,n){let r=e+""+n,l=t.settings.max_line_width-1,a=r.repeat(Math.floor(l/r.length))+e,i=t.settings.max_line_width-a.length;return" ".repeat(Math.floor(i/2))+a}(n[1],n[2])}return"-".repeat(t.settings.max_line_width)}(e.data),n.part=({name:t,depth:e})=>{let r=[];return 0===e&&r.push(n.line({data:"="})),1===e&&r.push(n.line({data:"-"})),2===e&&r.push(n.line({data:"."})),r.push(n.header({data:t,uppercase:[0,0,0,1,0,0,0,0,1,1][e],underline:["=","-",".","","","=","-","."][e]||"",text_align:e>4?"l":"c"})),r.join("\n\n")},n.header=e=>{let n=e.data.length>1;return e.data.map(function({uppercase:e=!1,underline:r="",text_align:l="c"}){return a=>{e&&(a=a.toUpperCase());let i=Math.round(t.settings.max_line_width>=64?48:.75*t.settings.max_line_width),o=Math.round(t.settings.max_line_width>=64?48:.625*t.settings.max_line_width),s=[];a.length<=i?s.push(a):s=a.split(" ").reduce(((t,e)=>(t.at(-1).length+e.length+1>o&&t.push(""),t[t.length-1]+=0==t[t.length-1].length?e:" "+e,t)),[""]);let h=s.reduce(((t,e)=>e.length>t?e.length:t),0);r.length>0&&!n&&s.push(r.repeat(h));let p=l.toLowerCase();return["c","l","r"].includes(p)||(p="c"),"l"==p?s.join("\n"):s.map((e=>{if("c"==p){let n=t.settings.max_line_width-e.length,r=Math.floor(n/2);return" ".repeat(r)+e}if("r"==p){let n=t.settings.max_line_width-e.length;return" ".repeat(n)+e}})).join("\n")}}(e)).join("\n")},n.list=e=>e.map((({data:e,depth:n})=>{let r=2*++n,l=t.settings.max_line_width,a=e,i=" ".repeat(r),o=i.replace(/ $/,"-");return a.reduce(((t,e,n)=>{const r=e.split(" ").reduce(((t,e)=>(t[t.length-1].length+e.length+1<=l?t[t.length-1]+=(t[t.length-1].trim().length?" ":"")+e:t.push(i+e),t)),[0===n?o:i]).join("\n");return t.push(r),t}),[]).join("\n\n")})).join("\n"),n.build=({blocks:n,document_title:r})=>{let l=n.join("\n"+"\n".repeat(t.settings.gaps_between_blocks));return e.footnotes_in_document.clear(),e.footnotes_added_in=0,l},n})();
/* to_html.js */
null==window.m0&&(window.m0={}),window.m0.js_block_to_html_block=(()=>{let n,t={html_page_map:[],current_block_placeholders:[],current_block_footnotes:0,footnotes_in_document:new Map,footnotes_added_in:0};function e(n){const t="é.øLü/∫$)*1";n.includes("£")&&(n=(n=>n.replace(/£\s*(\d{1,3}(?:,\d{3})*)(?:\.(\d{1,2}))?/g,((n,t,e="00")=>`GBP-${t.replace(/,/g,"")}-${e.padEnd(2,"0")}`)))(n));return[[" & "," and "],[" + "," plus "],["£","GBP"],["█",t],[" - ","█"],["_","█"],["|","█"],["=","█"],["?","█"],["!","█"],[";","█"],[":","█"],[".","█"],["\n"," "],["-"," "],[","," "],[/[^A-Za-z0-9█ ]/g,""],[" ","-"],["█","_"],[/-{2,}/g,"-"],[/_{2,}/g,"_"],[/(?=[_-]*_)(?=[_-]*-)[_-]+/g,"_"],[/^[-_]+/,""],[/[-_]+$/,""],[t,""]].reduce(((n,[t,e])=>"string"==typeof t?n.replaceAll(t,e):n.replace(t,e)),n.trim().toLowerCase()).trim()}const a={};function r(n){return n.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">")}function l(n){let e=t.current_block_placeholders.length,a=`█${unit_separator}${e}${unit_separator}█`;return t.current_block_placeholders.push([a,n]),a}function i(n){if(0==t.current_block_placeholders.length)return n;return t.current_block_placeholders.reduce(((n,[t,e])=>n.replace(t,e)),n)}function o(e){if(!t.current_block_footnotes)return e;function a(e,a,r=""){return e.replace(RegExp(unit_separator+"F(\\d\\d)","g"),((e,l)=>{let i=t.footnotes_in_document.get(l);if(!i)return console.log("couldn't find footnote "+l,t.footnotes_in_document),e;t.footnotes_added_in++,r&&n.errors.add(`Found a nested footnote: "${i.data}"`),i.number=r?r+"."+(a.length+1):(t.footnotes_added_in+"").padStart(2,0);let o=i.number;return i.data=`<li>\n<a id="fnV${o}" tabindex="0" href="#fnK${o}">${o}</a>: ${i.data}\n</li>`,a.push(i),`<sup><a id="fnK${o}" tabindex="0" href="#fnV${o}" title="Link to footnote">${o}</a></sup>`}))}let r=[];return(e=a(e,r))+'\n\n<ul class="footnotes">\n'+r.map((n=>{let t=[];if(n.data=a(n.data,t,n.number),t.length>0){let e='\n<ul class="footnotes">\n'+t.map((n=>n.data)).join("\n")+"\n</ul>\n";n.data=n.data.replace("</li>",e+"</li>"),t.length=0}return n.data})).join("\n")+"\n</ul>"}a.last_jobs=(n,e)=>{let a;return"string"!=typeof n?(a=n,a.kind=e):a={html:n,kind:e},a.html=chain(a.html,o,i).replace(/\\([=()])/g,"$1"),t.current_block_placeholders.length=0,t.current_block_footnotes=0,a},a.token=(e,a)=>{let r=e;let i=[];var o;return a.includes("@")&&(o=r,n.$stamps.has(o)||n.errors.add(`Stamp "${o}" doesn't exist`),r=n.$stamps.get(o)),a.forEach((n=>{if("!"===n)r=(n=>`<b>${n}</b>`)(r);else if("$"===n)r=(n=>`<i>${n}</i>`)(r);else{if("@"===n)return;looks_like_url(n)?r=l(`<a tabindex="0" href="${n}">`)+r+l("</a>"):(n=>{let e=(t.footnotes_in_document.size+"").padStart(2,0),a=`${unit_separator}F${e}`;i.push(a),n.id=e,t.footnotes_in_document.set(e,n),t.current_block_footnotes++})({data:n})}})),i.length>0&&(r=l('<span class="has_footnote">')+""+r+i.join("")+l("</span>")),r};const c=n=>n.replace(/(?<=\s|^|\(|\[|\{)((https?:\/\/[^\s]+)|(www\.[^\s]+))(?=\s|$|\n|[.,!?;])/g,(n=>{let t=n.endsWith("=");return t&&(n=n.replace(/=$/,"")),l(`<a tabindex="0" href="${(n.startsWith("www.")?"https://":"")+n}">`)+n+l("</a>")+(t?"=":"")})),d=n=>n.replace(/(^|\n)\/\/ .+/g,"").replace(/\/\/ .+/g,""),s=t=>{let a=t;return n.$stamps.forEach(((n,t)=>{a=a.replaceAll(`(${t})(@)`,`<span class="v$${e(t)}">${n}</span>`)})),a};function h(n){return{c:"ta-c",r:"ta-r",j:"ta-j"}[n.toLowerCase()]||null}function p(n,t){return`<a id="map_item_${t}" href="#${n.id}" tabindex="0">\n`+n.text+"\n</a>\n"}function u(n,t){if(!n||0===n.length)return"";let e="<ul>\n",a=0,r=" ",l=[];for(n.forEach(((i,o)=>{let c=i.depth;"number"!=typeof i.depth?(console.error(`Invalid depth at index ${o}: ${i.depth} (not a number). Setting to 0`),c=0):i.depth<0?(console.error(`Invalid depth at index ${o}: ${i.depth} (negative). Setting to 0`),c=0):o>0&&i.depth>a+1&&(console.warn(`Depth jump from ${a} to ${i.depth} at index ${o}. Correcting to ${a+1}`),c=a+1);const d={...i,depth:c};for(;a>c;)l[a]&&(e+=r.repeat(a+1)+"</li>\n",l[a]=!1),e+=r.repeat(a)+"</ul>\n",a--;for(a===c&&l[a]&&(e+=r.repeat(a+1)+"</li>\n",l[a]=!1);a<c;)e+=r.repeat(a+1)+"<ul>\n",a++;e+=r.repeat(c+1)+"<li>\n";t(d,o).split("\n").forEach((n=>{n.trim()&&(e+=r.repeat(c+2)+n+"\n")})),l[c]=!0;const s=n[o+1];(!s||s.depth<=c+1&&s.depth<=c)&&(e+=r.repeat(c+1)+"</li>\n",l[c]=!1)}));a>0;)l[a]&&(e+=r.repeat(a+1)+"</li>\n"),e+=r.repeat(a)+"</ul>\n",a--;return e+="</ul>",e}a.pre_processor=(t,e)=>(n=e,chain(t,r,d,s,n.inline_token_parser(a.token),c)),a.untagged_content=({data:n})=>0===(n=n.trim()).length?null:`<pre>${n}</pre>`,a.part=({name:n,depth:a})=>{let r=n.join(" "),l=e(r),i=n.join("<br>");t.html_page_map.push({depth:a,id:l,text:r});let o=Math.min(6,a+2);return{html:`<h${o} class="h">\n`+i+" "+`<a href="#${l}" id="${l}" tabindex="0">\n<small>#</small>\n</a> `+`</h${o}>`,depth:a}},a.list=n=>u(n,(n=>0==n.data.length?"":1==n.data.length?n.data[0]:`<span>${n.data.map((n=>n+"<br><br>")).join("\n")}</span>`)),a.header=n=>{let t=n.underline&&n.uppercase?2:n.underline?3:4,e=["h"];var a;!(a=h(n.text_align))||e.push(a);n.data.join(" ");let r=n.data.join("<br>");return`<h${t} class="${e.join(" ")}">\n`+r+" </a> "+`</h${t}>`};function m(n){let t=n.table_name;if(!t)return"";let e=t.trim();return 0==e.length?"":`<caption>${e}</caption>`}a.line=n=>{if(!n.text)return"<hr>";let t=n.text.trim(),e=h(n.text_align),a=e?` class="${e}"`:"";return"<hr>"+(t.length>0?`<aside${a}}>${t}</aside>`:"")},a.table_normal=n=>{let[t,...e]=n.data,a=t.map(((t,e)=>`c${e+1}${n.align_text[t]}`)).join(" ");return a=a.length>0?` class="${a}"`:"",`<table${a}>\n`+m(n)+"<thead>\n<tr>\n"+t.map(((n,t)=>`<th>${n}</th>`)).join("\n")+"</tr>\n</thead>\n<tbody>"+e.map((n=>"<tr>\n"+n.map(((n,t)=>`<td>${n.trim().replace(/(\n\s*\n+)/g,"<br><br>\n")}</td>`)).join("\n")+"\n</tr>")).join("\n")+"\n</tbody>\n</table>"},a.table_flipped=n=>{let t=['<table class="flipped">\n'+m(n)+"\n<tbody>\n"];return n.data.forEach(((e,a)=>{let r=e[0],l=h(n.align_text[r]),i=l?` class="${l}"`:"";t.push(`<tr${i}>\n<th>${r}</th>\n`+e.reduce(((n,t,e)=>(0===e||n.push(`<td>${t.trim().replace(/(\n\s*\n+)/g,"<br><br>\n")}</td>`),n)),[]).join("\n")+"\n</tr>\n")})),t.push("</tbody>\n</table>"),t.join("\n")},a.table=n=>(n.transposed?a.table_flipped:a.table_normal)(n),a.gaps=n=>'<div class="gaps">'+"<br>".repeat(n)+"</div>",a.column=n=>{let t={1:"one",2:"two",3:"three",4:"four",5:"five"},e=["column_block"],a=[];function r(r){let l=`column_${t[r]}_`;e.push(`c${r}${n[l+"alignment"]}`);let i=n[l+"text"],o=i.split(/\n{2,}/g),c=o.length>1?o.map((n=>`<p>${n.trim()}</p>`)).join("\n"):i,d=o.length>1?"\n":"";a.push(`<td>${d+c+d}</td>`)}let l=1;for(;l<=n.total_columns;)r(l),l++;return`<table class="${e.join(" ")}">\n<tbody>\n<tr>\n`+a.join("\n")+"</tr>\n</tbody>\n</table>\n"},a.$text=n=>{let t=[];n.indent_first_line&&t.push("indent_paragraphs");let e=n.margin_left;e&&t.push("m"+e),n.uppercase&&t.push("caps");let a=h(n.align);return a&&t.push(a),t=t.length>0?` class="${t.join(" ")}"`:"",`<div${t}>\n`+n.data.map((n=>`<p>${n}</p>`)).join("\n")+"\n</div>"},a.box=n=>`<fieldset class="box_block">${n.name&&n.name.trim().length>0?`<legend>${n.name.trim()}</legend>`:""}${n.text.map((n=>`<p>${n}</p>`)).join("\n")}</fieldset>`,a.definitions_list=n=>{let t=['<dl class="pairs_block">'];return n.data.forEach((({key:n,value:e})=>{let a=(e.length>1?e.map((n=>`<p>${n}</p>`)):e).join("\n");t.push(`<dt>${n}</dt>\n<dd>${a}</dd>\n`)})),t.join("\n")+"\n</dl>"},a.pairs=n=>{if(n.is_definitions_list)return a.definitions_list(n);let t=[`<table class="pairs_block ${"c1"+n.key_align} ${"c2"+n.value_align}">\n<tbody>`],e=n.key_caps?"th":"td",r=n.value_caps?"th":"td";return n.data.forEach((({key:n,value:a})=>{let l=(a.length>1?a.map((n=>`<p>${n}</p>`)):a).join("\n");t.push(`<tr>\n<${e}>${n}</${e}>\n<${r}>${l}</${r}>\n</tr>\n`)})),t.join("\n")+"\n</tbody>\n</table>"},a.code=({data:n})=>`<pre><code>${n}</code></pre>`,a.comment=({data:n})=>`\x3c!-- ${n} --\x3e`;return a.build=({title:e,blocks:a})=>{let r=document.getElementById("css_enabled").checked;n.make_page_map=t.html_page_map.length>1;n.make_page_map;let l=[],i=[],o=null;a.forEach(((n,t)=>{if("part"==n.kind){let t=[];o=t,i.push({blocks:t,depth:n.depth})}else 0==t&&(o=l);n.html.length>0&&o.push(n.html)}));let c='<!DOCTYPE html>\n<html lang="en">\n<meta name="viewport"\n content="width=device-width, initial-scale=1.0"><head>\n\x3c!--\nOutput generated using tools by\n(Copyright Greg Abbott)\n--\x3e\n<meta charset="UTF-8">\n<meta name="color-scheme" content="light dark">\n'+(r?"<style>@view-transition {\n navigation: auto;\n}\n:root {\n color-scheme: light dark;\n --l: white;\n --d: black;\n --bg: light-dark(var(--l), var(--d));\n --fg: light-dark(var(--d), var(--l));\n --border: 1px solid var(--fg);\n}\nhtml {\n font-size: 14px;\n}\n* {\ntab-size:2;\n font-size-adjust: ex-height 0.53;\n box-sizing: border-box;\n}\nbody {\n background: var(--bg);\n color: var(--fg);\n margin: 0 auto;\n padding: 4ch;\n max-width: 82ch;\n}\ntable {\n width: 100%;\n border-collapse: collapse;\n margin-bottom: 1lh;\n}\na {\ncolor:var(--fg);\n}\na:hover,a:active{\nbackground:var(--fg);\ncolor:var(--bg) !important;\n}\n.pairs_block tr td:first-child {\n width: 33%;\n}\nthead {\n position: sticky;\n top: 0;\n background: var(--bg);\n}\n:focus {\n outline: 2px solid var(--fg);\n}\npre {\n white-space: pre-wrap;\n}\n.ml1 {\n margin-left: 2ch;\n}\n.ml2 {\n margin-left: 4ch;\n}\n.ml3 {\n margin-left: 6ch;\n}\n.ml4 {\n margin-left: 8ch;\n}\n.ml5 {\n margin-left: 10ch;\n}\n.ml6 {\n margin-left: 12ch;\n}\n.ml7 {\n margin-left: 14ch;\n}\n.ml8 {\n margin-left: 16ch;\n}\n.ml9 {\n margin-left: 18ch;\n}\n.m1 {\n margin: auto 2ch;\n}\n.m2 {\n margin: auto 4ch;\n}\n.m3 {\n margin: auto 6ch;\n}\n.m4 {\n margin: auto 8ch;\n}\n.m5 {\n margin: auto 10ch;\n}\n.m6 {\n margin: auto 12ch;\n}\n.m7 {\n margin: auto 14ch;\n}\n.m8 {\n margin: auto 16ch;\n}\n.m9 {\n margin: auto 18ch;\n}\n.column_block {\n width: 100%;\n /*necessary:*/\n table-layout: fixed;\n}\n.column_block td {\n padding: 0 1ch;\n}\nth,\ntd {\n vertical-align: top;\n border: var(--border);\n}\nhr {\n border: none;\n height: 1px;\n background: var(--fg);\n}.c1l tr>*:nth-child(1),\n.c2l tr>*:nth-child(2),\n.c3l tr>*:nth-child(3),\n.c4l tr>*:nth-child(4),\n.c5l tr>*:nth-child(5),\n.c6l tr>*:nth-child(6),\n.c7l tr>*:nth-child(7),\n.c8l tr>*:nth-child(8),\n.c9l tr>*:nth-child(9),\n.c10l tr>*:nth-child(10),\n.ta-l {\n text-align: left;\n}\n.caps p {\n text-transform: uppercase;\n}\n.indent_paragraphs p {\n text-indent: 4ch;\n margin: 0;\n}\n.h {\nmargin:0;\npadding:.5lh 0 5px 0;\n}\nh1.h{\nposition:relative;\n}\n.h a {\nfont-size: 10px;\ncolor: transparent;\n}\n.h:hover a,\n.h a:focus,\n.h a:hover {\ncolor: inherit;\n}\ntable.flipped tr th,\n.c1r tr>*:nth-child(1),\n.c2r tr>*:nth-child(2),\n.c3r tr>*:nth-child(3),\n.c4r tr>*:nth-child(4),\n.c5r tr>*:nth-child(5),\n.c6r tr>*:nth-child(6),\n.c7r tr>*:nth-child(7),\n.c8r tr>*:nth-child(8),\n.c9r tr>*:nth-child(9),\n.c10r tr>*:nth-child(10),\n.ta-r {\n text-align: right;\n}\n.c1c tr>*:nth-child(1),\n.c2c tr>*:nth-child(2),\n.c3c tr>*:nth-child(3),\n.c4c tr>*:nth-child(4),\n.c5c tr>*:nth-child(5),\n.c6c tr>*:nth-child(6),\n.c7c tr>*:nth-child(7),\n.c8c tr>*:nth-child(8),\n.c9c tr>*:nth-child(9),\n.c10c tr>*:nth-child(10),\n.ta-c {\n text-align: center;\n}\n.ta-j {\n text-align: justify;\n text-justify: auto;\n}\n.no_outline {\n outline: none;\n}\n.skip_link {\n position: fixed;\n display: block;\n top: 10px;\n left: 10px;\n}\n.skip_link span {\n display: none;\n background-color: var(--bg);\n padding: 1ch;\n}\n.skip_link:focus span {\n display: block;\n}\n </style>\n":"")+`<title>${e}</title>\n</head>\n<body>\n<a href="#post" class="skip_link" accesskey="3" tabindex="0">\n<span>\nSkip to main content [<kbd>3</kbd>]\n</span>\n</a>\n`+`<h1 class="h">${e} <a href="#top" id="top" accesskey="1"><kbd title="Jump to the page top with this Access Key">1</kbd></a></h1>\n`+(0===l.length?"":"<section>\n"+l.join("\n")+"</section>")+(t.html_page_map.length<2?"":'<hr><nav aria-label="Table of Contents">\n<h2 class="h">\nMap \n<a href="#map" id="map" accesskey="2">\n<small>\n<kbd title="Jump to the Map with this access key">2</kbd>\n</small>\n</a>\n</h2>\n'+u(t.html_page_map,p)+"<hr>\n</nav>\n")+'<main id="post" tabindex="-1" class="no_outline">\n'+function(t){if(!Array.isArray(t)||0===t.length)return"";const e={children:[],depth:-1},a={"-1":e};let r=-1;for(let l=0;l<t.length;l++){const i=t[l];if(!i||!Array.isArray(i.blocks)){n.errors.add(`Error: Invalid part at index ${l}. Skipping.`);continue}let{blocks:o,depth:c}=i;("number"!=typeof c||isNaN(c))&&(n.errors.add(`Error: Invalid depth value at index ${l}. Setting to 0.`),c=0),c<0&&(n.errors.add(`Error: Depth ${c} is less than 0 at index ${l}. Adjusting to 0.`),c=0),c>r+1&&r>=0&&(n.errors.add(`Error: Depth ${c} follows depth ${r} at index ${l}. Adjusting to ${r+1}.`),c=r+1);const d=c-1;let s=a[d];if(!s){let t=d;for(;t>=-1&&!a[t];)t--;if(t>=-1){s=a[t];const e=t+1;n.errors.add(`Error: Cannot find parent for depth ${c} at index ${l}. Adjusting to depth ${e}.`),c=e}else s=e,c=0,n.errors.add(`Error: No valid parent found for item at index ${l}. Setting as top-level element.`)}const h={content:o.join("\n"),children:[],depth:c,originalDepth:i.depth,i:l};s.children.push(h),a[c]=h,Object.keys(a).forEach((n=>{parseInt(n)>c&&delete a[n]})),r=c}return function n(t,a=0){let r=`<a href="#map_item_${t.i}" tabindex="0"><small>Map</small></a>`;if(t===e)return t.children.map((t=>n(t,0))).join("");const l="section",i=" ".repeat(a);let o=`${i}<${l}>\n`;o+=`${i} <div>${t.content.replace(/(<\/h\d>)/," "+r+"\n$1")}</div>\n`;for(const e of t.children)o+=n(e,a+1);return o+=`${i}</${l}><hr>\n`,o}(e)}(i)+"</main>\n"+(t.html_page_map.length<2?"":'<div>\n<h3 class="h">Access keys <a href="#access-keys" id="access-keys" accesskey="0"><kbd>0</kbd></a></h3>\n<ul>\n<li title="Jump to the list of access keys on this page">\n<kbd>0</kbd> Keys</li>\n<li title="Jump to the top of the page">\n<kbd>1</kbd> Top</li>\n'+(n.make_page_map?'<li title="Jump to the content map">\n<kbd>2</kbd> Map</a></li>\n':"")+'<li title="Jump to the main contain">\n<kbd>3</kbd> Main</li>\n</ul>\n<p>\n<small>\nJump to parts of the page with the above keys and your browser\'s access key combination. \n(On Mac, most browsers use <kbd>ctrl + opt + the access key</kbd>).</small>\n</p>\n<hr></div>\n')+'<footer>\n<small>\n<a tabindex="0" href="#top">Top</a></small></body>\n</html>';return t.html_page_map.length=0,t.footnotes_in_document.clear(),t.footnotes_added_in=0,c},a})();
/* main.js */
function split_at_commas_ignoring_ones_in_quotes(t,e={}){const{keep_quotes:n=!1,trim_values:s=!0}=e;function r(t,e){for(let n=e;n<t.length;n++)if(!/\s/.test(t[n]))return n;return-1}const o=[];let i="",l=!1,c="",a=0;for(t=t.replace(/\r\n/g,"\n");a<t.length;){const e=t[a];if("\\"===e&&a+1<t.length){const e=t[a+1];if('"'===e||"'"===e){i+=e,a+=2;continue}}if(l)if(e===c){const s=r(t,a+1);-1===s||","===t[s]||""===t.substring(a+1).trim()?(l=!1,n&&(i+=e)):i+=e}else i+=e;else{const r=","===e;if('"'===e||"'"===e)if(""===i.trimStart()){let s=-1,r=a+1;for(;r<t.length;){if(t[r]===e){const e=t.substring(r+1).trimStart();if(""===e||","===e[0]){s=r;break}}r++}-1!==s?(l=!0,c=e,n&&(i+=e)):i+=e}else i+=e;else r?(o.push(s?i.trim():i),i=""):i+=e}a++}return(""!==i||t.endsWith(","))&&o.push(s?i.trim():i),o}function process_inline_tokens(t,e){let n=t,s=!0;for(;s;){s=!1;const t=find_all_tokens(n);if(0===t.length)break;const r=t.filter((e=>!t.some((t=>t!==e&&t.start>e.start&&t.end<e.end))));if(0===r.length)break;r.sort(((t,e)=>e.start-t.start));for(const t of r){s=!0;const r=e(t.key.replace(/\\([=()])/g,"$1"),split_at_commas_ignoring_ones_in_quotes(t.value.replace(/\\([=()])/g,"$1")));n=n.substring(0,t.start)+r+n.substring(t.end)}}return n}function find_all_tokens(t){const e=[];let n=0;for(;n<t.length;)if("("!==t[n]||0!==n&&"\\"===t[n-1])n++;else{const s=extractToken(t,n);s?(e.push(s),n++):n++}return e}function extractToken(t,e){if("("!==t[e]||e>=t.length-2)return null;let n=e+1,s=0,r=-1;for(;n<t.length;)if("\\"===t[n]&&n+1<t.length)n+=2;else{if("("===t[n])s++;else if(")"===t[n]){if(0===s)return null;s--}else if("="===t[n]&&0===s&&n>e+1&&""!==t[n-1].trim()){r=n;break}n++}if(-1===r)return null;const o=t.substring(e+1,r);if(0===o.length||o.includes("\n"))return null;for(n=r+1,s=0;n<t.length;)if("\\"===t[n]&&n+1<t.length)n+=2;else{if("("===t[n])s++;else if(")"===t[n]){if(0===s){const s=t.substring(r+1,n);return 0===s.length?null:{key:o,value:s,whole:t.substring(e,n+1),start:e,end:n+1}}s--}n++}return null}null==window.m0&&(window.m0={}),m0.block_types={"?":"settings","=":"$stamps","%":"part","'":"header","*":"line","+":"table"," ":"gaps","&":"column",".":"$text","!":"box",":":"pairs",";":"code","-":"list","/":"comment"},m0.block_type_symbol=Object.fromEntries(Object.entries(m0.block_types).map((([t,e])=>[e,t]))),m0.block_type_tag_separator="=",window.m0.from_markup=t=>{const e={settings:{max_line_width:64,spaces_per_indent:2,gaps_between_blocks:1},errors:new Set,$stamps:new Map},n="█",s={...m0.block_types,[n]:n};function r(t){throw e.errors.add(t),Error(t)}e.inline_token_parser=t=>e=>process_inline_tokens(e,t);const o=window.m0.markup_block_to_js_block(e),i=window.m0.js_block_to_html_block,l=window.m0.js_block_to_ascii_block;let c=1,a=1;function _(t,n,s,r){return chain({config:t,data:r.pre_processor(n,e)},o[s],r[s])}const u=[],f=[];let p=function(t){for(let e=0;e<t.length;e++){const n=t.charCodeAt(e);if(10!==n&&(n<32||n>126))return t[e]}return null}(t);p&&e.errors.add(`Input Markup contains non-ASCII printable: "${p}"`),t=t.replaceAll(unit_separator,""),function(t){let p="",m=!1,g="",b="",k=0;function d(){!function({sign:t,config:p,data:m}){p??="";let g=s[t];g||r(`"${t}" is not a block type`);if(g===n){if(0===m.trim().length)return;e.errors.add("Markup content occurs before the first block tag. The tool will treat it as a text block."),g="$text"}if(function(t){let e=o[t];e||r(`markup_block_to_js_block.${t} !exist`)}(g),"settings"===g)return void o.settings(m,e.settings);if("$stamps"===g)return void o.$stamps(m,e.$stamps);if(c){let t=_(p,m,g,l);null!==t&&f.push(l.last_jobs(t))}if(a){let t=_(p,m,g,i);null!==t&&u.push(i.last_jobs(t,g))}}({sign:g,config:b,data:p})}const h=t.trim();for(;k<h.length;){const t=h[k];if("("===t&&(0===k||"\n"===h[k-1])){const t=h.indexOf(")",k);if(-1!==t){const e=h.substring(k+1,t),n=e.charAt(0);if(s[n]){m&&d();const s=e.indexOf("=");g=n,b=-1!==s?e.substring(s+1):"",p="",m=!0,k=t+1;continue}}}m&&(p+=t),k++}m&&d()}(`(${n})\n`+t);let m=e.$stamps.get("title")||e.$stamps.get("name")||"Nameless",g={};return g.errors=[...e.errors],g.ascii=l.build({title:m,blocks:f}),g.html=i.build({title:m,blocks:u}),g.name=m,g.width=e.settings.max_line_width,e.errors.clear(),g},m0.render_block_fragment=(t,e,n,s,r)=>{let o={settings:{max_line_width:64,spaces_per_indent:2,gaps_between_blocks:1},errors:new Set,$stamps:new Map};if(s&&m0.block_type_info){let t=m0.block_type_info.settings.config_parse(s);t.w&&(o.settings.max_line_width=+t.w),t.g&&(o.settings.gaps_between_blocks=+t.g),t.i&&(o.settings.spaces_per_indent=+t.i)}o.inline_token_parser=t=>e=>process_inline_tokens(e,t);let i=m0.markup_block_to_js_block(o);r&&i.$stamps&&i.$stamps(r,o.$stamps);let l=m0.js_block_to_html_block,c=m0.js_block_to_ascii_block,a=m0.block_types[t];if(!a)return null;try{let t=i[a]({config:e,data:l.pre_processor(n,o)}),s=l.last_jobs(l[a](t),a),r=i[a]({config:e,data:c.pre_processor(n,o)}),_=c.last_jobs(c[a](r),a);return{html:s.html,ascii:_}}catch(t){return null}};
/* templates.js */
/*! by + copyright Greg Abbott 2024-2026*/
function stress(e){return`(${e}=$)`}function mark(e){return`(${e}=!)`}function var_get(e){return`(${e}=@)`}function wrap_key(e){return e+"="}null==window.m0&&(window.m0={}),(()=>{let e="Flap jacks lemon meringue pie dark chocolate raspberry jam cake cupcake chocolate fudge cake. Chocolate sprinkles triple chocolate chip cookie lemon bonbon chocolate cake bun hazelnut chocolate spread sugar cubes caramel rock buns cardamon cake chocolate orange muffin custard tart cinnamon bun chocolate fudge brownie.",n="Lemon drops rocky road chocolate sauce shortbread syrup apple cake ice cream chocolate bar birthday cake with icing caramel fudge ice cream double double chocolate cardamon cake. Melted chocolate flap jacks rock buns pecan pie cheesecake chocolate fudge cake.",t=e+"\n\n"+n,a={},r="(*)",o=e=>"(%)"+e;a.pairs_plain=`(%=1) Plain style\n(:)\n${wrap_key("key1")} value1\n${wrap_key("key2")} value2\n(:=rl)\n${wrap_key("Character 1")} Alignment and case for key\n${wrap_key("Character 2")} Alignment and case for value\n${wrap_key("l")} Align left. case preserved\n${wrap_key("L")} Align left. make upper case\n${wrap_key("r")} Align right. case preserved\n${wrap_key("R")} Align right. make upper case\n(:=Rl)\n${wrap_key("Long values")} A pair's value will fill the available width then wrap to a new line.\n${wrap_key("Key")} Values may contain line breaks\nand multi line data.\n\nThe tool joins touching lines then wraps them.\nIt preserves up to 1 blank line between content lines.\n`,a.pairs_terms=`(%=1)Terms\n(.)For term and definition pairs, add a "d" to the block tag.\nAdd blank lines to a definition to split it into paragraphs.\n\n(:=d)// example 1\n${wrap_key("Term1")}Definition1\n${wrap_key("Term2")}Definition2\n${wrap_key("Term3")}Definition3\n\n(:=d)// example 2\n${wrap_key("First Name: www.example.com")} // HTML output converts raw links\nIllustration and Design\n\nTags: vector, raster\n${wrap_key("First Last: www.example.com")}\nGraphics and Typography\n\nTags: print, publishing\n\n`,a.pairs_dot_pairs=`(%=1)Dot style\n(.)Dot pairs align keys left and values right with dots between.\nThis style works for single-line key value pairs.\nInclude a '.' in the block tag settings for this block style.\n(:=lr.)\n${wrap_key("L")} Mark left (Bold/Caps)\n${wrap_key("l")} Preserve case of left\n${wrap_key("R")} Mark right (Bold/Caps)\n${wrap_key("r")} Preserve case of right\n(:=.)\n${wrap_key("Use cases")}\n${wrap_key("Chapter")} Page Number\n${wrap_key("Person")} Phone Number\n${wrap_key("Character")} Actor\n${wrap_key("Post Title")}YYYY-MM-DD\n${wrap_key("YYYY-MM-DD")} Post title\n(:=.)\n${wrap_key("Blank values")}\n${wrap_key("For form fields")}\n\n(.) Dot pairs rely on the key and value fitting on one line. If a block pair value includes a newline, the tool outputs a different format.\n(:=.)\n${wrap_key("handle")} a multi\n\nparagraph\n\nvalue\n${wrap_key("key 2")} value\n`,a.block_comments=o("Comments")+'\n(.)A line starting with the "(/)" tag begins a comment block.\nComment blocks get stripped during parsing.\nThey help keep related notes and content together in a document.\n(/)\n- [X] Tell reader about the comment block\n',a.parts=o("Parts")+'\n(.)\nThe part block structures and groups a document\'s content.\nThe block tag without settings makes a top level part "(%)".\nThe tag settings area accepts 0-9 to set the part\'s level.\nEach part can group blocks or subparts one level higher.\nA part will end when a new part has an equal or lesser level.\nText after the block tag names the part: "(%) Part Name".\n',a.headers=o("Headers")+"\n\n(')Normal Header\n(')Long headers wrap to new narrower lines to keep a centered appearance\n(')Header\nWith Manual\nLine Breaks\n('=-)Header on a line // add setting to tag. options =-_.*\n('=r)Header right // Alignment via: l left, c center, r right\n('=l*)Mix left + underlined\n('=C)Uppercase Header\n(.)Make headers uppercase by using an uppercase alignment character: L C R\n",a.in_a_line='(%=1)Text in a Line\n(*)Text in a line // default line "-", default alignment "C"\n(*=l)Aligned left // options [l,r,c,L,R,C]\n(*=r)Aligned right\n(*=R)Uppercase & right\n(*=*)Text in a custom line // custom character options [=,-,_,.,*]\n(*=_)Text in a custom line\n(*=.)Text in a custom line\n(*==)Text in a custom line\n',a.divider_lines="(%=1)Divider Lines\n(*)// default style '-'\n(*)=\n(*)_\n(*).\n(*)*\n(.)For spaced dividers, type a symbol twice and put spaces between.\n(*)- -\n(*)* *",a.gaps="(%=1)Gaps\n(.)Add one or more blank lines\n( )// One blank line\n(.)Some:\n( =5)// N blank lines\n",a.columns=o("Columns")+"\n(.) Minimum: 2. Maximum: 3. '()' Starts next column.\n(%=1)Two Columns\n(&)Column 1()Column 2\n(&)\nTO NAME\n\nStreet, Town, City\n()\nFrom NAME\n\nStreet, Town, City\n(.)Custom column text alignment:\n(&=l)Column 1()Column 2\n(&=c)Column 1()Column 2\n(&=r)Column 1()Column 2\n(.)Custom text alignment per column:\n(&=rl)Column 1()Column 2\n(%=1)Three Columns\n(&)3 Columns()On 1 Line()Default alignment\n(&=l)Align()all()left\n(&=c)Align()all()center\n(&=r)Align()all()right\n(&=rcl)Align()each()custom\n(.)Allow blank columns\n(&=l)()Column 2()Column 3\n(&=l)Column 1()()Column 3\n(&=l)Column 1()Column 2()\n(&=r)Allow()()\n(&)\nA column line will wrap if the content exceeds the column width.\n()\nYou can also\nchoose where to\nbreak lines.\n()\nThe tool preserves\n\nblank lines.\n\n",a.box="(%=1)Boxes\n(!)A simple untitled box\n(!)Box with Title()Box text\n(!)\nA long box title will wrap to new lines if it can't fit on one line()\nA box resizes based on its content. It shrinks with little, grows with lots, and wraps any lines exceeding the box's maximum width over multiple lines.\n\n\nA box preserves empty lines.",a.inline_tokens=`${o("Verbs")}\n(-)\n- Inline tokens wrap in parentheses:\n-- A range of text to target.\n-- An equals follows the last visible character of the text.\n-- One or more instructions for what to do with the text.\n- Verbs:\n-- ${mark("mark")}\n-- ${stress("stress")}\n-- (Link=www.example.com)\n-- (Note=Notes appear at the end of a block. This keeps them nearer to the related text.)\n--- If a note contains commas, wrap it in quotes.\n-- Stamp: "${var_get("name")}" (reference a variable)\n- Extra:\n-- (Mix=!,$,By comma separating each verb)\n-- (Mix and (nest=$) tokens=!,(Nested tokens=A note shouldn't have its own notes.) work (in both sides=$) of a token.)\n-- Tokens can appear mid word: ba(na=!)na\n- Comments: // Text following '// ' forms an end of line comment\n-- The tool strips end of line comments from output.\n- Other:\n-- When converting to HTML, the tool makes bare URLs clickable.\n--- www.example.com\n`,a.$text_margins="(%=1)Margins\n(.)Add a number to the paragraph block tag to set a side margin.\nMargins apply to both sides of all paragraphs in the block.\nMargins can span 0-9 indents, and default to 0 if unspecified.\n\n(.=0)Margin 0 + left aligned text // default\n(.=1)Margin 1 + left aligned text\n(.=2)Margin 2 + left aligned text\n(.=3)Margin 3 + left aligned text\n\n(.=r0)Margin 0 + right aligned text// default\n(.=r1)Margin 1 + right aligned text\n(.=r2)Margin 2 + right aligned text\n(.=r3)Margin 3 + right aligned text\n\n(.)The paragraphs block tag allows combining available options.\nThe following block shows all options in use at once.\n\n(.=C3)A paragraph with margins and centered uppercase text.",a.$text_styles="(%=1)Paragraph Styles\n(%=2) Web Look\n(.)Touching lines of text within this tag block merge to one line.\nThe line will then wrap to fit if it exceeds the page width.\n\nAny empty lines between text lines in the input split paragraphs.\nThe output places one empty line between paragraphs.\n\n(%=2) Book Look\n(.=i)\nAn 'i' in the paragraph block tag makes traditional paragraphs.\nThis \"indented first line\" style adds no gap between paragraphs.\nThe tool joins touching lines of text in the input.\nIt then wraps any line exceeding the page width until it fits.\n\nAn empty line between text lines in the input split paragraphs.\nThe output starts each paragraph on a new indented line.",a.$text_align=`\n(%=1)Alignment\n(.)The tag for a paragraphs block can set the case and text alignment for all paragraphs in the block.\n(.=l)Left (Default)\n(.=L)Left Upper Case\n(.=c)Central\n(.=C)Central Upper Case\n(.=r)Right\n(.=R)Right Upper Case\n(')Justified:\n(.=j)${e}\n(')Justified Upper Case:\n(.=J)${n}\n\n(')To sentence case\n(.=s)// s === to sentence case\nthe text block has an optional 'sentence case' flag.\nwhen enabled, the tool targets the first letter of each sentence, \nand converts it to a capital where needed.\nthe flag preserves any capitals already in the markup.\n(it works for new sentences within parentheses too).\n`,a.$text=`(%)Text\n${a.$text_styles}\n${a.$text_margins}\n${a.$text_align}\n`,a.code=o("Code")+"\n(;)\n To preserve\n manual text formatting\nuse the code block.\nThe code block preserves all line breaks and spaces\n from the first line with a visible character,\n until end of the last line with a visible character.\n It preserves leading spaces and mid line spaces \n\n The tool will wrap text lines in a code block if they exceed the page width of the output format.",a.list=o("Lists")+"\n(-)\n- A line starting with '- ' begins a list item.\n-- Add another dash to indent a list item one level more.\n-- Long list item lines auto wrap to new lines, and each new line indents to align with the first line of the same list item.\n- Touching lines of text\nwithin this a list item\nmerge to one line.\nThe line then wraps to fit,\nif it exceeds the page width.\n- One or more empty lines between text lines in a list item\nmakes a list item with paragraphs.\n\nThe output places one empty line between paragraphs.\n\n(.) Slim markup, same output\n\n(-=0)\n// Add a '0' to the block tag settings to write lists this way.\n0 This markup style omits dashes and indents.\n0 Start a line with a digit and a space to make a new list item.\n1 The digit sets the item's depth level in the list.\n2 Top level list items start with '0 '.\n1 The space after the digit ends the depth setting.\n1 Any text after the space forms the item's value.\n0 In the markup:\n1 List items at all levels receive equal line width.\n1 When an item's depth changes, the item stays still.\n2 This can make file version comparisons easier.\n0 After a list item, the level of the next may:\n1 Increase by one, to form a child item.\n1 Stay the same, to form a sibling item.\n1 Have any lower value, to form a parent or ancestor item.\n0 The markup also allows multi paragraph values.\n\nThe tool separates paragraphs in list items with one blank line.\n",a.table_normal=`(%=1)Record per row\n(+)// You can name the table before starting the first record:\nOptional Table Name\n\n${wrap_key("Keys")}\nThe tool considers two keys the same if they match when converted to lower case. It treats 'KEY1', 'Key1' and 'key1' as the same key.\n\n${wrap_key("Key Order")}\nThe tool sorts each record's keys to match the order they appear in the first record.\n\n${wrap_key("Alignment(r)")}\n(Auto=!): The table checks if all values for a key look number-like. If so, it auto-aligns the key's values right, otherwise left.\n\n${wrap_key("Values")}\nCell values may include line breaks.\n\nThe tool preserves up to one blank line between lines.\n\n()// Empty parentheses start the next record in a table\n\n${wrap_key("Keys(l)")}\nThe first time a key occurs in a table sets its display case. e.g. 'KEY1', 'Key1' or 'key1'.\n\n${wrap_key("Alignment(l)")}\n(Manual=!): Add "(l)" "(c)" or "(r)" to a key to align its values across the table.\n\n${wrap_key("Values(c)")}\nEach line in a cell's value wraps to fit the cell width. \n\nThe tool hyphenates long words until each part fits within a cell's width.\n\n()\n\n${wrap_key("Alignment(r)")}\nIf the first record doesn't say how to align a key, the tool checks each next record for an instruction (until it finds one=The tool obeys the first alignment tag it finds for a key in a table.) or reaches the end.\n\n${wrap_key("Keys")}\nThe tool handles when keys appear in some but not all records.\n\n${wrap_key("Values")}For a blank cell, enter no value. Omitting the key for a record has the same effect.\n`,a.table_flipped=`\n(%=1)Record per column\n(.)For comparing data side by side.\n\nPlace an 'x' in the table block tag to transpose the table.\n\n(+=x)\nFlipped Table\n${wrap_key("Record(r)")} 1 // '(r)' aligns the values not the header.\n${wrap_key("About(c)")} Wrapping\n${wrap_key("Note(l)")} Long inputs wrap over the amount of lines needed.\n()\n${wrap_key("About")} Columns\n${wrap_key("Record")} 2\n${wrap_key("Note")} Columns grow to at least the width of their longest word.\n\nCells may contain line breaks.\n()\n${wrap_key("About")} Max width\n${wrap_key("Record")} 3\n${wrap_key("Note")} None\n`,a.csv='(%=1)CSV Tables (Comma Separated Values)\n(+=,x)// <- Transposed\nMarket(c),Net Qty,Period(c)// test\nHome Sales,100,Q4\nExport Sales,200,Q4\nBook Clubs,50,Q4\nTotal,350,Q4\n\n(+=,)\nOptional Table Title \n()// A line containing \'()\' must follow any table title in CSVs\nMarket,Net Qty(),Period(r)// test\nHome Sales,100,Q4\nExport Sales,200,Q4\n\n(+=,)\nCell values with commas\n()\nNumber(r),Title(l)\n0,Allows Commas in values:\n1,"The Good, the Bad and the Ugly"\n2,Allows Quotes in values:\n3,"""The Lion, the Witch and the Wardrobe"""\n',a.doc_settings=`${o("Settings")}\n(.)This block instructs the tool how to convert the markup.\nIt applies to all content blocks that follow,\nso should occur before any content block in a document.\n\nIt holds key value pairs which say what to change and how.\nAnything in the block may override the tool's defaults.\nThe current flags can change:\n(-)\n- Characters per line\n- How many empty lines between two blocks\n- How many spaces should represent one indent\n\n(.)The tool omits the block from the output.\n\n(?)// Any text after '// ' on a line forms a comment.\n${wrap_key("w")} 64// Set the characters width per line. (32-96) Default 64.\n${wrap_key("g")} 1// Sets how many empty lines separate blocks. (0-3).\n${wrap_key("i")} 2// Sets how many spaces equal one indent. (2-8) Default: 2.`,a.$stamps=`${o("Stamps")}\n(.) \nThe stamps block holds key value pairs to use in a document.\nTo allow content blocks to use its data,\nthis block should occur before any content block in a document.\nThe tool reads the stamps block and omits it from the output.\nThe tool uses any 'name' stamp for HTML titles and file names.\n\n(=)// Any text after '// ' on a line forms a comment.\n${wrap_key("name")} Intro\n${wrap_key("start")} 2024-08-06\n${wrap_key("version")} 2026-07-19\n\n(.)The header below uses a stamp by referencing its name.\n`,a.not_in_a_block="Unwrapped text\nText before the first tag block receives minimal treatment.\nAny line too long to fit the page width auto wraps to fit.\nAny hard line breaks in the input carry over to the output.\n",a.tables_auto_align="(%=1)Auto-align table cells\n(.) The tool inspects any table property without an alignment instruction. If every record holds a number-like value for the property, it aligns the property cells right. If not it keeps the cells aligned left.\n\n(+)\nAuto-Align\ntext=A\nwhole=1\ndecimals=3.14\ncommas=1,000\nmoney=$9.99\npercentages=4.10%\n()\ntext=B\nwhole=2\ndecimals=10.32\ncommas=80,000\nmoney=$20.20\npercentages=0.24%\n()\ntext=C\nwhole=-3\ndecimals=-41.42\ncommas=-2,000\nmoney=-$30.30\npercentages=-1.32%\n",a.tables=`(%)Tables\n(.)${stress("Under construction")}\n\nThis block takes records of key value pairs.\nSee the pairs block for the basics markup for pairs.\nSeparate each record in a table with '()'.\n\n${a.table_normal}\n${a.table_flipped}\n${a.tables_auto_align}\n${a.csv}`,a.pairs=`(%)Pairs\n(-=0)\n0 The pairs block holds key value pairs.\n0 Pairs:\n1 Each pair starts on a new line.\n1 A simple pair looks like "key name= value".\n0 Keys:\n1 Start: Keys can start with: A-Z a-z '_' or '$'.\n1 Middle: After the first characters, keys may contain numbers, spaces and dashes.\n1 Keys end with a visible character touching an equals sign.\n0 Delimiter:\n1 Using equals as a delimiter has two benefits over ": ":\n2 It requires no shift key to type.\n2 It keeps ': ' and ' = ' free to use in the key and value.\n1 To use the delimiter in a key, put a backslash before it.\n0 Values:\n1 A value may start after the equals on the same or next line.\n1 Values may include any number of line breaks.\n1 For a blank value, enter no text.\n${a.pairs_plain}\n${a.pairs_dot_pairs}\n${a.pairs_terms}`;let s={};s.Starter=`(.)\nThis project focuses on typesetting monospace plain text \nin a specific style following typewriter formatting conventions.\nThe project combines a markup syntax, JavaScript tool,\nlive playground site and a a format specification.\n(For details, see the Specification page.)\n\n${o("Tool")}\n(.)\nThe tool runs offline.\nIt acts on the text in the Markup field,\ntypesets it, and shows the result in the output areas.\nThe view menu toggles the displayed areas. \n\n${o("Markup")}\n(.)The preloaded text walks through the syntax used to markup copy for typesetting. It covers the markup tags,\nwhat they do, and how to use each to set type.\nThe main markup tags begin new blocks within a document.\nThey appear at the start of a new line, \nand tell the tool how to handle the next block of content.\nEach block continues until the next block tag occurs.\n\nTo try the tool, you can edit the markup as you read.\nFor some basic example uses, see the templates button.\n\n${a.block_comments}\n${a.doc_settings}\n${a.$stamps}\n('=C*)${var_get("name")}: An Overview\n${a.parts}\n${a.headers}\n(%) Lines\n${a.divider_lines}\n${a.in_a_line}\n${a.$text}\n${a.code}\n${a.inline_tokens}\n${a.list}\n${a.pairs}\n${a.tables}\n${a.columns}\n(%) More\n${a.box}\n${a.gaps}\n`,s["Meta note"]=`(?)${wrap_key("w")} 60\n\n${o("Document Meta")}\n(&)dd/mm/yyyy()()Reference_code\n(:=Rl)\n${wrap_key("Title")} How to set type in the typewriter age\n${wrap_key("Subtitle")} A guide to house style for monospace text\n${wrap_key("Pub date")} 1915\n${wrap_key("Descriptors")} layout, structure, sort, order, division, hierarchy, form, function, clarity, text, design, grid, typography, whitespace\n\n(.)ABSTRACT: This non-existent handbook contains examples for text documents, manuscripts, stage plays, cover letters, memorandums, applications, curriculum vitae, tables of contents, invoices, contracts, invitations, forms and more.\n\n${r}`,s.Letter="(?)\ng=2\n(&=lr)THEIR_NAME\n\n\nYour Name\nYour Address\nAddress Line 2\nCity\nPost Code\n()\nTheir Address\nTheir Phone\nTheir Website\n\nYour ref:\nTheir ref:\n\nDate\n('=L)\nSubject of message\n(;)\nDear Your Name.\n\nLetter contents.\n\nYours sincerely\n\n\nTheir name\n(*)\n(.=c)\nTheir Disclaimer",s.Invoice=`\n(?)\n${wrap_key("w")} 48\n(=)\n${wrap_key("name")} Invoice Template\n${wrap_key("stamp")} ccYY_MMdd_hhmm\n${wrap_key("client")} client_name\n${wrap_key("ref")} 124816\n${wrap_key("sum")} 300\n\n(&)\n${stress("to")}\n${var_get("client")}\nAddress\n()\n${stress("from")}\nCompany\nAddress\nE Email\nT Telephone\nW Website\n\nDate\n\n\n(*)\n\n('==)Invoice\n\n(+)\n${wrap_key("Item")} Add feature\n${wrap_key("Ea.")} 100\n${wrap_key("Qty")} 2\n${wrap_key("Sum")} 200\n${wrap_key("Tally(r)")} 200\n\n${wrap_key("Item")} Fix bug\n${wrap_key("Ea.")} 100\n${wrap_key("Qty")} 1\n${wrap_key("Sum")} 100\n${wrap_key("Tally(r)")} 300\n\n${wrap_key("Item")} Total\n${wrap_key("Ea.")} -\n${wrap_key("Qty")} 3\n${wrap_key("Sum")} 300\n${wrap_key("Tally(r)")} ${var_get("sum")}\n\n(.)Please pay:\n\n(:)\n${wrap_key("Account")} Number\n${wrap_key("Bank")} Name\n${wrap_key("I.B.A.N")} xxxx\n${wrap_key("Reference")} ${var_get("stamp")}\n${wrap_key("Due")} On receipt\n\n(*)\n(.)\nInvoice Number ${var_get("stamp")}\n${var_get("client")}\n${var_get("ref")}\n${var_get("sum")}\n\nPlease detach and return with your remittance`,s.Snippets=`(=)\n${wrap_key("name")} Stamps / Variables example\n${wrap_key("stamp")} delivery_id\n${wrap_key("to")} Recipient\n${wrap_key("what")} delivery_description\n${wrap_key("url")} example.com\n${wrap_key("from")} Sender\n\n(.)\nDear ${var_get("to")},\n\nPlease find ${var_get("what")} (${var_get("stamp")}) at the following link:\n${var_get("url")}.\n\nWith kind regards.\n\n\n${var_get("from")}`,s.CV=`\n(?)\n${wrap_key("w")} 40\n(=)\n${wrap_key("name")} Example CV\n\n${r}\n\n(&=l)\n${mark("Name")}\nCurrent Job Title\n()\n${mark("Contact")}\nyou@email.com\nwww.example.com\nphone\n\n\n${r}\n\n${mark("Experience")}\n\n(&=l)\n${mark("Skills")}\nUI Design\nWeb Development\nGraphic Design\n()\n${mark("Languages")}\nJavaScript\nHTML + CSS\nJXA\n\n\n${r}\n\n${mark("Selected Works")}\n\n(&=l)\n${mark("Title")}\nPublisher\nYear\n\n${mark("Title")}\nPublisher\nYear\n()\n${mark("Title")}\nPublisher\nYear\n\n${mark("Title")}\nPublisher\nYear\n\n\n${r}\n\n${mark("Past")}\n\n(&=l)\n${mark("Company")}\nRemote\nYY - YY\n\nA description of roles at this company. A description of roles at this company.\n()\n${mark("Brand")}\nRemote\nYY - YY\n\nA description of roles at this company. A description of roles at this company. A description of roles at this company.\n\n\n${r}\n\n${mark("Education")}\n\n(&=l)\n${mark("school")}\nCourse\nGrade\nYear-Year\n()\n${mark("school")}\nCourse\nGrade\nYear-Year\n\n\n\n${r}`,window.m0.templates=s,window.m0.lorem=t,window.m0.test_block=a})();
/* markup_sections.js */
null==window.m0&&(window.m0={});const block_type_info={settings:{label:"Settings",config_parse:e=>{let t={w:"",g:"",i:""};return e.split("\n").forEach((e=>{let l=e.match(/^\s*([wgi])\s*=\s*(\d+)/);l&&(t[l[1]]=l[2])})),t},config_format:e=>{let t=[];return void 0!==e.w&&""!==e.w&&t.push("w= "+e.w),void 0!==e.g&&""!==e.g&&t.push("g= "+e.g),void 0!==e.i&&""!==e.i&&t.push("i= "+e.i),t.length?"\n"+t.join("\n"):"\n"},no_textarea:!0,fields:[{type:"settings_input",key:"w",label:"Line Width",desc:"Set the maximum line width for the document",min:32,max:96},{type:"settings_input",key:"g",label:"Block Gap",desc:"Set how many blank lines should occur between blocks",min:0,max:3},{type:"settings_input",key:"i",label:"Indent Width",desc:"How many spaces should represent one indent throughout the document",min:2,max:8}],tip:"The tool reads the settings block in markup, but doesn't display it in HTML / typeset output"},$stamps:{label:"Stamps",tip:'Define one variable per line via "key=value". Use it throughout via (key=@)'},part:{label:"Part",config_parse:e=>/^\d$/.test(e)?{depth:+e}:{depth:0},config_format:e=>(e.depth??0)+"",fields:[{type:"radio_group",key:"depth",label:"Level",options:"0 1 2 3 4 5 6 7 8 9".split(" ").map((e=>({value:e,label:e})))}],tip:"Optionally name the part"},header:{label:"Header",config_parse:e=>{let t="c",l=!1,a=" ";for(let n of e)/[lrc]/i.test(n)?(t=n.toLowerCase(),n!=n.toLowerCase()&&(l=!0)):" "!=n&&(a=n);return{align:t,upper:l,underline:a}},config_format:e=>{let t="";return e.upper?t+=e.align.toUpperCase():e.align&&"l"!=e.align&&(t+=e.align),e.underline&&" "!=e.underline&&(t+=e.underline),t},fields:[{type:"radio_group",key:"align",label:"Align Text",options:[{value:"l",label:"L"},{value:"c",label:"C"},{value:"r",label:"R"}]},{type:"checkbox",key:"upper",label:"Uppercase"},{type:"radio_group",key:"underline",label:"Underline",options:[{value:" ",label:"No"},{value:"-",label:"-"},{value:"=",label:"="},{value:"_",label:"_"},{value:".",label:"."},{value:"*",label:"*"}]}],tip:"Header text wraps to keep centre alignment"},line:{label:"Divider Line",config_parse:e=>{let t="c",l=!1,a="-";for(let n of e)/[lrc]/i.test(n)?(t=n.toLowerCase(),n!=n.toLowerCase()&&(l=!0)):a=n;return{align:t,upper:l,pad:a}},config_format:e=>{let t="-"==e.pad?"":e.pad;return e.upper?t+=e.align.toUpperCase():e.align&&"c"!=e.align&&(t+=e.align),t||""},fields:[{type:"radio_group",key:"align",label:"Align Text",options:[{value:"l",label:"L"},{value:"c",label:"C"},{value:"r",label:"R"}]},{type:"checkbox",key:"upper",label:"Uppercase"},{type:"radio_group",key:"pad",label:"Line char",options:[{value:"-",label:"-"},{value:"=",label:"="},{value:"_",label:"_"},{value:".",label:"."},{value:"*",label:"*"}]}],tip:"Text or leave blank for plain divider"},table:{label:"Table",config_parse:e=>({csv:e.includes(","),flip:e.includes("x")}),config_format:e=>{let t="";return e.csv&&(t+=","),e.flip&&(t+="x"),t},fields:[{type:"checkbox",key:"csv",label:"CSV input"},{type:"checkbox",key:"flip",label:"Flipped (transposed)"}],tip:'End a record or row with "()". Use key=value pairs per record. Add (r) (c) or (l) between a key and the equals sign to align a column, e.g. key(r)=value.'},gaps:{label:"Gap",config_parse:e=>{let t=+e;return{count:isNaN(t)?1:t}},config_format:e=>(e.count||1)+"",no_textarea:!0,fields:[{type:"number",key:"count",label:"Blank lines",min:1,max:20,desc:"A gap block inserts a custom amount of additional blank lines between two blocks."}]},column:{label:"Columns",config_parse:e=>{let t=e.split("").filter((e=>/[lcr]/i.test(e)));return{col1:t[0]||"l",col2:t[1]||"r",col3:t[2]||"r"}},config_format:e=>(e.col1||"")+(e.col2||"")+(e.col3||"")||"",fields:[{type:"radio_group",key:"col1",label:"Col 1",options:[{value:"l",label:"L"},{value:"c",label:"C"},{value:"r",label:"R"}]},{type:"radio_group",key:"col2",label:"Col 2",options:[{value:"l",label:"L"},{value:"c",label:"C"},{value:"r",label:"R"}]},{type:"radio_group",key:"col3",label:"Col 3",options:[{value:"l",label:"L"},{value:"c",label:"C"},{value:"r",label:"R"}]}],tip:"Use () to separate columns. 2 max unless 2 () used."},$text:{label:"Paragraph",config_parse:e=>{let t="l",l=!1,a=0,n=!1,o=!1;for(let i of e)/[lrcj]/i.test(i)?(t=i.toLowerCase(),i!=i.toLowerCase()&&(l=!0)):"i"==i||"I"==i?n=!0:"s"==i?o=!0:/\d/.test(i)&&(a=+i);return{align:t,upper:l,margin:a,indent:n,sent:o}},config_format:e=>{let t="";return e.upper?t+=e.align.toUpperCase():e.align&&"l"!=e.align&&(t+=e.align),e.indent&&(t+="i"),e.sent&&(t+="s"),e.margin&&(t+=e.margin+""),t},fields:[{type:"radio_group",key:"align",label:"Align Text",options:[{value:"l",label:"L"},{value:"c",label:"C"},{value:"r",label:"R"},{value:"j",label:"J"}]},{type:"checkbox",key:"upper",label:"Uppercase"},{type:"checkbox",key:"indent",label:"Indent first line"},{type:"checkbox",key:"sent",label:"Sentence case"},{type:"number",key:"margin",label:"Margin",min:0,max:9}],tip:"Touching lines join to form one paragraph. Blank lines split paragraphs."},box:{label:"Box",config_parse:()=>({}),config_format:()=>"",fields:[]},pairs:{label:"Pairs",config_parse:e=>{let t="r",l="l",a=!1,n=!1,o=!1,i=!1,c=e.split("");return c.includes(".")&&(o=!0,t="l",l="r",c=c.filter((e=>"."!=e))),c.includes("d")&&(i=!0,c=c.filter((e=>"d"!=e))),1==c.length&&/[lrc]/i.test(c[0])&&(t=c[0].toLowerCase(),a=c[0]!=c[0].toLowerCase(),l=t,n=a),2==c.length&&/[lrc]/i.test(c[0])&&/[lrc]/i.test(c[1])&&(t=c[0].toLowerCase(),a=c[0]!=c[0].toLowerCase(),l=c[1].toLowerCase(),n=c[1]!=c[1].toLowerCase()),{ka:t,va:l,kc:a,vc:n,dot:o,def:i}},config_format:e=>{let t="";e.dot&&(t+="."),e.def&&(t+="d");let l=e.dot?"l":"r",a=e.dot?"r":"l",n=e.kc?e.ka.toUpperCase():e.ka,o=e.vc?e.va.toUpperCase():e.va;return n&&o&&(n!==l||o!==a)&&(t+=n,t+=o),t},fields:[{type:"radio_group",key:"ka",label:"Key align",options:[{value:"l",label:"L"},{value:"c",label:"C"},{value:"r",label:"R"}]},{type:"checkbox",key:"kc",label:"Key uppercase"},{type:"radio_group",key:"va",label:"Value align",options:[{value:"l",label:"L"},{value:"c",label:"C"},{value:"r",label:"R"}]},{type:"checkbox",key:"vc",label:"Value uppercase"},{type:"checkbox",key:"dot",label:"Dot pairs"},{type:"checkbox",key:"def",label:"Terms / definitions"}],tip:'Format: "key= value" per line. Blank lines split multi-line values.'},code:{label:"Code",config_parse:()=>({}),config_format:()=>"",fields:[],tip:"Preserves all spaces and line breaks exactly as typed."},list:{label:"List",config_parse:e=>({numeric:"0"==e.trim()}),config_format:e=>e.numeric?"0":"",fields:[{type:"checkbox",key:"numeric",label:"Number style (0 = top level)"}]},comment:{label:"Comment",config_parse:()=>({}),config_format:()=>"",fields:[],tip:"Stripped from output. Good for notes."}};m0.block_type_info=block_type_info;const LIST_TIP="Optionally start list items with a number from 0-9 instead of dashes, to confirm how many indents the list item should have, for example:<br>0 List item with no indents<br>1 list item with one indent<br>2 List item with two indents";let blocks_data=[],active_index=-1,blocks_view="markup";function markup_to_blocks_array(e){let t=[],l="",a=!1,n="",o="",i=0,c=e.trim();for(;i<c.length;){let e=c[i];if("("===e&&(0===i||"\n"===c[i-1])){let e=c.indexOf(")",i);if(-1!==e){let d=c.substring(i+1,e),r=d.charAt(0);if(m0.block_types[r]){a&&t.push({sign:n,config:o,data:l});let c=d.indexOf(m0.block_type_tag_separator);n=r,o=-1!==c?d.substring(c+1):"",l="",a=!0,i=e+1;continue}}}a&&(l+=e),i++}return a&&t.push({sign:n,config:o,data:l}),t}function blocks_array_to_markup(e){return e.map((e=>{let t=e.config?`${m0.block_type_tag_separator}${e.config}`:"";return`(${e.sign}${t})${e.data.replace(/\n+$/,"")}`})).join("\n")}function get_block_type_name(e){return m0.block_types[e]||e}function get_block_display_name(e){let t=block_type_info[get_block_type_name(e)];return t?t.label:e}function parse_config_for_type(e,t){let l=block_type_info[e];return l&&l.config_parse?l.config_parse(t):{}}function format_config_for_type(e,t){let l=block_type_info[e];return l&&l.config_format?l.config_format(t):""}function update_blocks_markup(){el.markup&&(el.markup.textContent=blocks_array_to_markup(blocks_data),"function"==typeof main&&main())}function sync_markup_to_blocks(){if(blocks_data=markup_to_blocks_array(el.markup.textContent),0===blocks_data.length){let e=el.markup.textContent.trim();if(e.length>0){let t=get_default_config(".");blocks_data=[{sign:".",config:t,data:"\n"+e}]}active_index=-1,update_blocks_markup()}else active_index>=blocks_data.length&&(active_index=-1)}function get_default_config(e){let t=m0.block_types[e]||e,l=block_type_info[t];return l&&l.config_format?l.config_format({}):""}function get_setting_gap(){for(let e=0;e<blocks_data.length;e++)if("?"===blocks_data[e].sign){let t=(blocks_data[e].data||"").match(/\bg\s*=\s*(\d+)/);if(t)return Math.max(0,Math.min(+t[1],10))}return 1}function invalidate_block_cache(e){let t=blocks_data[e];t&&(t.cached_html=null,t.cached_ascii=null)}function render_block_html_ascii(e){let t=blocks_data[e];if(t&&(!t.cached_html||!t.cached_ascii)){let l="",a="";for(let t=0;t<e;t++)"?"===blocks_data[t].sign&&(l=blocks_data[t].data||""),"="===blocks_data[t].sign&&(a=blocks_data[t].data||"");let n=m0.render_block_fragment(t.sign,t.config,t.data,l,a);n&&(t.cached_html=n.html,t.cached_ascii=n.ascii)}}function create_block_element(e){let t=document.createElement("div");t.className="block",t.dataset.index=e,active_index===e&&t.classList.add("editing");let l=t.appendChild(document.createElement("div"));l.className="block_insert_holder";let a=l.appendChild(document.createElement("button"));a.className="block_insert_btn",a.textContent="+",a.onclick=()=>{let e=+a.closest(".block").dataset.index,l={sign:".",config:get_default_config("."),data:"\n",_is_new:!0};blocks_data.splice(e,0,l),active_index>=e&&active_index++,update_blocks_markup();let n=create_block_element(e);t.parentNode.insertBefore(n,t),refresh_block_indices(),open_editor(e)},t.appendChild(document.createElement("div")).className="block_editor_anchor";let n=t.appendChild(document.createElement("div"));n.className="block_preview",n.onclick=()=>{let e=+n.closest(".block").dataset.index;active_index!==e&&open_editor(e)},fill_block_preview(n,e);let o=t.appendChild(document.createElement("div"));o.className="block_insert_holder";let i=o.appendChild(document.createElement("button"));return i.className="block_insert_btn",i.textContent="+",i.onclick=()=>{let e=+i.closest(".block").dataset.index,l={sign:".",config:get_default_config("."),data:"\n",_is_new:!0};blocks_data.splice(e+1,0,l),active_index>e&&active_index++,update_blocks_markup();let a=create_block_element(e+1);t.nextSibling?t.parentNode.insertBefore(a,t.nextSibling):t.parentNode.appendChild(a),refresh_block_indices(),open_editor(e+1)},t}function refresh_block_indices(){el.blocks_container.querySelectorAll(":scope > .block").forEach(((e,t)=>{e.dataset.index=t}))}function align_block_strip(){let e=[...el.blocks_container.querySelectorAll(".block > .block_preview > .preview_ascii")],t=el.shared_block_editor?.querySelector(".block_editor_preview > .preview_ascii");if(t&&e.push(t),!e.length)return;let l=0;e.forEach((e=>{e.textContent.split("\n").forEach((e=>{let t=e.replace(/\t/g," ").length;t>l&&(l=t)}))}));let a=l+4;e.forEach((e=>{e.style.width=a+"ch",e.style.margin="0 auto"}))}function render_blocks_container(){let e=el.blocks_container,t=el.shared_block_editor;if(e.contains(t)&&t.remove(),e.textContent="",0===blocks_data.length){let t=document.createElement("button");t.className="block_empty_add",t.textContent="+",t.onclick=()=>{blocks_data.push({sign:".",config:get_default_config("."),data:"\n",_is_new:!0}),update_blocks_markup(),render_blocks_container(),open_editor(0)},e.appendChild(t)}else blocks_data.forEach(((t,l)=>e.appendChild(create_block_element(l))));if(active_index>=0&&active_index<blocks_data.length){let t=e.querySelector(`.block[data-index="${active_index}"] .block_editor_anchor`);t&&t.appendChild(el.shared_block_editor)}e.style.gap="text"===blocks_view?get_setting_gap()+"lh":"",align_block_strip()}function block_type_label(e){let t=get_block_type_name(e),l=block_type_info[t];return l?`[${l.label} Block]`:t}function fill_block_preview(e,t){let l=blocks_data[t];if(l)if("markup"===blocks_view){let t=e.appendChild(document.createElement("pre"));t.className="preview_markup";let a=l.config?`${m0.block_type_tag_separator}${l.config}`:"";t.textContent=`(${l.sign}${a})${l.data.replace(/\n+$/,"")}`}else if("html"===blocks_view){render_block_html_ascii(t);let a=e.appendChild(document.createElement("div"));a.className="html_preview";let n=document.createElement("template");n.innerHTML=l.cached_html||"";let o=n.content.querySelector("body");a.innerHTML=o?o.innerHTML:l.cached_html||"",a.textContent.trim()||(a.textContent=block_type_label(l.sign))}else if("text"===blocks_view){render_block_html_ascii(t);let a=e.appendChild(document.createElement("pre"));a.className="preview_ascii",a.textContent=l.cached_ascii||"",a.textContent.trim()||(a.textContent=block_type_label(l.sign))}}function set_blocks_view(e){blocks_view=e;let t=active_index;if(t<0){let e=el.blocks_container.querySelectorAll(".block"),l=el.blocks_container.scrollTop;for(let a=0;a<e.length;a++)if(e[a].offsetTop>=l){t=a;break}t<0&&e.length>0&&(t=e.length-1)}if(render_blocks_container(),t>=0&&t<blocks_data.length){let e=el.blocks_container.querySelector(`.block[data-index="${t}"]`);e&&e.scrollIntoView({block:"start"})}active_index>=0&&editor_draft_preview()}function update_block_preview(e){let t=el.blocks_container.querySelector(`.block[data-index="${e}"]`);if(!t)return;let l=t.querySelector(".block_preview");l&&(l.textContent="",fill_block_preview(l,e),align_block_strip())}function is_blocks_tab_active(){return el.input_tab_show_blocks&&el.input_tab_show_blocks.checked}function editor_draft_preview(){let e=blocks_data[active_index];if(!e)return;let t=el.shared_block_editor.querySelector(".block_editor_preview");if(!t)return;let l=e._draft_sign||e.sign,a=void 0!==e._draft_config?e._draft_config:e.config,n=void 0!==e._draft_data?e._draft_data:e.data,o=a?`${m0.block_type_tag_separator}${a}`:"";if(t.textContent="","markup"===blocks_view){return void(t.appendChild(document.createElement("pre")).textContent=`(${l}${o})${n.replace(/\n+$/,"")}`)}let i="",c="";for(let t=0;t<blocks_data.length;t++){let a=blocks_data[t];a===e?("?"===l&&(i=n),"="===l&&(c=n)):("?"===a.sign&&(i=a.data||""),"="===a.sign&&(c=a.data||""))}let d=m0.render_block_fragment(l,a,n,i,c);if(d)if("html"===blocks_view){let e=t.appendChild(document.createElement("div"));e.className="html_preview";let l=document.createElement("template");l.innerHTML=d.html||"";let a=l.content.querySelector("body");e.innerHTML=a?a.innerHTML:d.html||""}else{let e=t.appendChild(document.createElement("pre"));e.className="preview_ascii",e.textContent=d.ascii||"",align_block_strip()}}function commit_and_close(){let e=blocks_data[active_index];if(!e)return void close_editor();let t="?"===e.sign||"?"===e._draft_sign||"="===e.sign||"="===e._draft_sign,l=e.sign,a=e.data;void 0!==e._draft_data&&(e.data=e._draft_data),void 0!==e._draft_config&&(e.config=e._draft_config),void 0!==e._draft_sign&&(e.sign=e._draft_sign),delete e._is_new,delete e._draft_data,delete e._draft_config,delete e._draft_sign,t&&(e.sign!==l||e.data!==a)?blocks_data.forEach(((e,t)=>{invalidate_block_cache(t),update_block_preview(t)})):(invalidate_block_cache(active_index),update_block_preview(active_index)),update_blocks_markup(),"text"===blocks_view&&(el.blocks_container.style.gap=get_setting_gap()+"lh"),close_editor(1)}function open_editor(e){if(e<0||e>=blocks_data.length)return;if(active_index>=0){let e=el.blocks_container.querySelector(`.block[data-index="${active_index}"]`);e&&e.classList.remove("editing")}active_index=e;let t=el.blocks_container.querySelector(`.block[data-index="${e}"]`);t&&t.classList.add("editing"),populate_editor();let l=el.blocks_container.querySelector(`.block[data-index="${e}"] .block_editor_anchor`);if(!l)return;let a=el.shared_block_editor.parentNode;a&&a!==l&&a.contains(el.shared_block_editor)&&a.removeChild(el.shared_block_editor),l.appendChild(el.shared_block_editor)}function close_editor(e){let t=el.shared_block_editor;t.hidden=!0;let l=t.parentNode;if(l&&l.contains(t)&&l.removeChild(t),active_index>=0){let e=el.blocks_container.querySelector(`.block[data-index="${active_index}"]`);e&&e.classList.remove("editing"),delete blocks_data[active_index]._is_new,active_index=-1}e||update_blocks_markup()}function update_settings_data(e,t){let l=e.split("\n"),a={};return l=l.map((e=>{let l=e.match(/^\s*([wgi])\s*=\s*(\d+)/);if(l){let n=l[1];return void 0!==t[n]&&""!==t[n]?(a[n]=!0,e.replace(/(^\s*[wgi]\s*=\s*)\d+/,"$1"+t[n])):(a[n]=!0,null)}return e})).filter((e=>null!==e)),Object.entries(t).forEach((([e,t])=>{""===t||a[e]||l.push(e+"= "+t)})),l.join("\n")}function populate_editor(){let e=blocks_data[active_index];if(!e)return;let t=el.shared_block_editor;t.hidden=!1,t.textContent="";let l=e._draft_sign||e.sign,a=get_block_type_name(l),n=block_type_info[a]||{fields:[],tip:""},o=t.appendChild(document.createElement("div"));o.className="section_type_row";let i=o.appendChild(document.createElement("select"));i.name="block_type",i.dataset.t="Block type";let c=i.appendChild(document.createElement("option"));c.disabled=!0,c.textContent="Block type",Object.entries(m0.block_types).forEach((([e,t])=>{let a=i.appendChild(document.createElement("option"));a.value=e,a.textContent=block_type_info[t]?block_type_info[t].label:t,e===l&&(a.selected=!0)})),i.onchange=()=>{let t=void 0!==e._draft_data?e._draft_data:e.data;e._draft_sign=i.value;let l=get_block_type_name(e._draft_sign),a=block_type_info[l];a&&a.no_textarea?(e._draft_config="",e._draft_data="\n"):(e._draft_config=a&&a.config_format?a.config_format({}):"",e._draft_data=t||"\n"),populate_editor(),editor_draft_preview()};let d,r=void 0!==e._draft_config?e._draft_config:e.config,_=void 0!==e._draft_data?e._draft_data:e.data,s=parse_config_for_type(a,"settings"===a?_:r);if(n.fields&&n.fields.length>0){if(d=t.appendChild(document.createElement("div")),d.className="section_config_fields","column"===a){let x=d.appendChild(document.createElement("div"));x.className="config_radio_group";let C=x.appendChild(document.createElement("span"));C.className="config_radio_label",C.textContent="Columns";let w=x.appendChild(document.createElement("div"));w.className="config_radio_options";let E=e.config?parse_config_for_type(a,e.config):{},N=e.data.split("\n()\n").length,L=N>1?N:3;[2,3].forEach((e=>{let t=w.appendChild(document.createElement("label"));t.className="config_radio_item";let l=t.appendChild(document.createElement("input"));l.type="radio",l.name="cfg_columns",l.value=e,e===L&&(l.checked=!0),l.onchange=()=>p(+e),t.appendChild(document.createElement("span")).textContent=e+" cols"}));let $=d.appendChild(document.createElement("div"));$.className="column_editor_area";let S=$.appendChild(document.createElement("div"));function p(t){let l=e.data.split("\n()\n"),a=[];for(let e=0;e<3;e++)a[e]=l[e]||"";let n=[];for(let e=0;e<t;e++)n.push(a[e]||"");S.textContent="";for(let e=0;e<t;e++){let t=S.appendChild(document.createElement("div"));t.className="column_editor_col";let l="col"+(e+1),a=t.appendChild(document.createElement("div"));a.className="config_radio_group";let o=a.appendChild(document.createElement("span"));o.className="config_radio_label",o.textContent="Align";let i=a.appendChild(document.createElement("div"));i.className="config_radio_options","lcr".split("").forEach((t=>{let a=i.appendChild(document.createElement("label"));a.className="config_radio_item";let n=a.appendChild(document.createElement("input"));n.type="radio",n.name="col_align_"+e,n.value=t,(E[l]||"l")===t&&(n.checked=!0),n.onchange=()=>{E[l]=t,m()},a.appendChild(document.createElement("span")).textContent=t.toUpperCase();let o={l:"Left",c:"Center",r:"Right"};o[t]&&(a.dataset.t=o[t])}));let c=t.appendChild(document.createElement("textarea"));c.name="col_content_"+e,c.className="column_textarea",c.value=n[e].replace(/^\n/,"").trim(),c.oninput=()=>m(),c.onblur=()=>{c.value=c.value.trim(),m()},c.onkeydown=e=>{"Enter"===e.key&&(e.metaKey||e.ctrlKey)&&(e.preventDefault(),close_editor())}}m()}function m(){let t=S.children.length,l=[];for(let e=0;e<t;e++){let t=S.children[e].querySelector(".column_textarea");l.push(t?t.value:"")}e._draft_data=l.join("\n()\n");let n={};for(let e=0;e<t;e++){let t="col"+(e+1),l=S.children[e].querySelector(`input[name="col_align_${e}"]:checked`);n[t]=l?l.value:"l"}e._draft_config=format_config_for_type(a,n),editor_draft_preview()}S.className="column_editor_flex",p(L)}else if(n.fields.forEach((e=>{if("checkbox"===e.type){let t=d.appendChild(document.createElement("label"));t.className="config_check_label";let l=t.appendChild(document.createElement("input"));l.name="cfg_"+e.key,l.type="checkbox",s[e.key]&&(l.checked=!0),l.onchange=()=>{s[e.key]=l.checked,u()},t.appendChild(document.createElement("span")).textContent=e.label}else if("select"===e.type){let t=d.appendChild(document.createElement("label"));t.className="config_select_label",t.textContent=e.label+": ";let l=t.appendChild(document.createElement("select"));l.name="cfg_"+e.key,e.options.forEach((t=>{let a=l.appendChild(document.createElement("option"));a.value=t.value,a.textContent=t.label,s[e.key]!=t.value&&+s[e.key]!=+t.value||(a.selected=!0)})),l.onchange=()=>{s[e.key]=l.value,u()}}else if("radio_group"===e.type){let t=d.appendChild(document.createElement("div"));t.className="config_radio_group";let l=t.appendChild(document.createElement("span"));l.className="config_radio_label",l.textContent=e.label;let a=t.appendChild(document.createElement("div"));a.className="config_radio_options",e.options.forEach((t=>{let l=a.appendChild(document.createElement("label"));l.className="config_radio_item";let n=l.appendChild(document.createElement("input"));n.type="radio",n.name="cfg_"+e.key,n.value=t.value,s[e.key]==t.value&&(n.checked=!0),n.onchange=()=>{s[e.key]=n.value,u()},l.appendChild(document.createElement("span")).textContent=t.label;let o={l:"Left",c:"Center",r:"Right",j:"Justify"};o[t.value]&&(l.dataset.t=o[t.value])}))}else if("number"===e.type){let t=d.appendChild(document.createElement("label"));t.className="config_number_label",t.textContent=e.label+": ",e.desc&&(t.dataset.t=e.desc,t.dataset.tImmediate="");let l=t.appendChild(document.createElement("input"));l.name="cfg_"+e.key,l.type="number",l.min=e.min||0,l.max=e.max||99,l.value=void 0!==s[e.key]?s[e.key]:e.min||0,l.onchange=()=>{let t=Math.max(e.min||0,Math.min(e.max||99,+l.value));s[e.key]=t,u()}}else if("settings_input"===e.type){let t=d.appendChild(document.createElement("label"));t.className="config_number_label",e.desc&&(t.dataset.t=e.desc+" ("+e.min+"–"+e.max+")"),t.textContent=e.label+": ";let l=t.appendChild(document.createElement("input"));l.name="cfg_"+e.key,l.type="number",l.min=e.min||0,l.max=e.max||99;let a=s[e.key],n={w:64,g:1,i:4};l.value=void 0!==a&&""!==a?a:n[e.key]||0,l.onchange=()=>{let t=Math.max(e.min||0,Math.min(e.max||99,+l.value));s[e.key]=t===(n[e.key]||0)?"":t+"",u()}}})),"list"===a){let q=d.querySelector(".config_check_label");q&&(q.dataset.t=LIST_TIP,q.dataset.tImmediate="")}function u(){if("settings"===a)return e._draft_data=update_settings_data(void 0!==e._draft_data?e._draft_data:e.data,s),e._draft_config="",void editor_draft_preview();e._draft_config=format_config_for_type(a,s),editor_draft_preview()}}if("box"===a){let T=(void 0!==e._draft_data?e._draft_data:e.data).replace(/^\n/,""),M=T.indexOf("()"),B=t.appendChild(document.createElement("div"));B.className="editor_row";let U=B.appendChild(document.createElement("label"));U.className="section_content_label",U.htmlFor="box_title_input",U.appendChild(document.createElement("span")).textContent="Box Title";let D=B.appendChild(document.createElement("input"));D.type="text",D.id="box_title_input",D.className="section_textarea",D.value=M>=0?T.slice(0,M).trim():"";let I=t.appendChild(document.createElement("label"));I.className="section_content_label",I.htmlFor="box_content_ta",I.appendChild(document.createElement("span")).textContent="Box Content";let j=t.appendChild(document.createElement("textarea"));j.name="block_content",j.id="box_content_ta",j.className="section_textarea",j.value=M>=0?T.slice(M+2).trim():T.trim();let A=()=>{let t=D.value.trim(),l=j.value.trim();e._draft_data=t?`\n${t}()${l}`:"\n"+l,editor_draft_preview()};D.oninput=A,j.oninput=A,j.onkeydown=e=>{"Enter"===e.key&&(e.metaKey||e.ctrlKey)&&(e.preventDefault(),commit_and_close())}}else if(!n.no_textarea&&"column"!==a){let H=t.appendChild(document.createElement("label"));H.className="section_content_label",H.htmlFor="_block_content_ta";let R=H.appendChild(document.createElement("span"));R.textContent="Block content",n.tip&&(R.dataset.t=n.tip,R.dataset.tImmediate="");let K=t.appendChild(document.createElement("textarea"));K.name="block_content",K.id="_block_content_ta",K.className="section_textarea";let O=void 0!==e._draft_data?e._draft_data:e.data;K.value=O.replace(/^\n/,"").trim(),K.oninput=()=>{e._draft_data="\n"+K.value,editor_draft_preview()},K.onkeydown=e=>{"Enter"===e.key&&(e.metaKey||e.ctrlKey)&&(e.preventDefault(),commit_and_close())}}t.appendChild(document.createElement("div")).className="block_editor_preview",editor_draft_preview();let b=t.appendChild(document.createElement("div"));b.className="editor_actions";let k=b.appendChild(document.createElement("button"));k.className="block_action_move_up",k.textContent="Move up",k.onclick=()=>blocks_move_up(active_index);let f=b.appendChild(document.createElement("button"));f.className="block_action_move_down",f.textContent="Move down",f.onclick=()=>blocks_move_down(active_index);let g=b.appendChild(document.createElement("button"));g.className="block_action_delete",g.textContent="Delete",g.onclick=()=>blocks_delete(active_index);let h=b.appendChild(document.createElement("button"));h.className="block_action_cancel",h.textContent="Cancel";let v=e._is_new;h.dataset.t=v?"Do not add this new block":"Do not save changes",v&&(h.dataset.tImmediate=""),h.onclick=()=>{if(e._is_new){blocks_data.splice(active_index,1);let e=el.blocks_container.querySelector(`.block[data-index="${active_index}"]`);e&&e.classList.remove("editing"),active_index=-1,el.shared_block_editor.hidden=!0,render_blocks_container()}else delete e._draft_data,delete e._draft_config,delete e._draft_sign,close_editor()};let y=b.appendChild(document.createElement("button"));y.className="block_action_done",y.textContent="Done",y.dataset.t="CMD+Enter",y.onclick=()=>commit_and_close()}function blocks_delete(e){if(e<0||e>=blocks_data.length)return;let t=get_block_display_name(blocks_data[e].sign);if(!confirm(`Delete this section (${t})`))return;let l=el.blocks_container.querySelector(`.block[data-index="${e}"]`),a=active_index===e;a&&close_editor(1),l.classList.add("removing"),setTimeout((()=>{l.contains(el.shared_block_editor)&&(el.shared_block_editor.remove(),el.shared_block_editor.hidden=!0),blocks_data.splice(e,1),active_index>e?active_index--:active_index>=blocks_data.length&&(active_index=blocks_data.length-1),0===blocks_data.length&&(active_index=-1),l.remove(),refresh_block_indices(),align_block_strip(),update_blocks_markup(),0===blocks_data.length&&render_blocks_container(),a&&active_index>=0&&open_editor(active_index)}),250)}function blocks_move_up(e){if(e<=0)return;let t=blocks_data[e];blocks_data[e]=blocks_data[e-1],blocks_data[e-1]=t,active_index===e?active_index=e-1:active_index===e-1&&(active_index=e);let l=el.blocks_container,a=l.querySelector(`.block[data-index="${e}"]`),n=l.querySelector(`.block[data-index="${e-1}"]`);if(a&&n&&(l.insertBefore(a,n),refresh_block_indices(),update_block_preview(e),update_block_preview(e-1),align_block_strip(),active_index>=0)){let e=l.querySelector(`.block[data-index="${active_index}"] .block_editor_anchor`);e&&e.appendChild(el.shared_block_editor)}update_blocks_markup()}function blocks_move_down(e){if(e>=blocks_data.length-1)return;let t=blocks_data[e];blocks_data[e]=blocks_data[e+1],blocks_data[e+1]=t,active_index===e?active_index=e+1:active_index===e+1&&(active_index=e);let l=el.blocks_container,a=l.querySelector(`.block[data-index="${e}"]`),n=l.querySelector(`.block[data-index="${e+1}"]`);if(a&&n&&(l.insertBefore(n,a),refresh_block_indices(),update_block_preview(e),update_block_preview(e+1),align_block_strip(),active_index>=0)){let e=l.querySelector(`.block[data-index="${active_index}"] .block_editor_anchor`);e&&e.appendChild(el.shared_block_editor)}update_blocks_markup()}function init_blocks_editor(){let e;el.blocks_view_markup.onchange=()=>{el.blocks_view_markup.checked&&set_blocks_view("markup")},el.blocks_view_html.onchange=()=>{el.blocks_view_html.checked&&set_blocks_view("html")},el.blocks_view_text.onchange=()=>{el.blocks_view_text.checked&&set_blocks_view("text")},el.blocks_view_markup.checked?set_blocks_view("markup"):el.blocks_view_html.checked?set_blocks_view("html"):el.blocks_view_text.checked&&set_blocks_view("text"),el.input_tab_show_blocks.addEventListener("change",(()=>{el.input_tab_show_blocks.checked&&(sync_markup_to_blocks(),render_blocks_container())})),el.input_tab_show_all.addEventListener("change",(()=>{el.input_tab_show_all.checked&&(active_index>=0&&close_editor(1),update_blocks_markup())})),el.input_tab_show_blocks.checked&&(sync_markup_to_blocks(),render_blocks_container()),window.addEventListener("resize",(()=>{clearTimeout(e),e=setTimeout(align_block_strip,150)}))}m0.render_single_block=(e,t,l)=>{let a=`(${e}${t?`${m0.block_type_tag_separator}${t}`:""})\n${l}`;return m0.from_markup(a)};
/* tool_tips.js */
const tool_tip=(()=>{const t={anyTipActive:!1,graceTimeout:null},e=new WeakSet,i=new WeakMap,o=t=>{const o=i.get(t);if(o){o.tip&&(o.tip.remove(),o.tip=null);for(const[t,e,i,n]of o.listeners)t.removeEventListener(e,i,n);o.listeners.length=0,i.delete(t),e.delete(t)}},n=o=>{if(e.has(o))return;const n={tip:null,hoverTimeout:null,outsideHandler:null,listeners:[]},r=(e=!1)=>{const i=o.getAttribute("data-t");if(!i)return;if(n.tip)return;n.hoverTimeout&&(clearTimeout(n.hoverTimeout),n.hoverTimeout=null),t.graceTimeout&&(clearTimeout(t.graceTimeout),t.graceTimeout=null);const r=()=>{n.tip=document.createElement("div"),n.tip.className="g-tip",n.tip.innerHTML=i,document.body.appendChild(n.tip),t.anyTipActive=!0,requestAnimationFrame((()=>{if(!n.tip)return;const t=o.getBoundingClientRect();if(0===t.width&&0===t.height)return n.tip.remove(),void(n.tip=null);((t,e)=>{const i=t.getBoundingClientRect(),o=e.getBoundingClientRect();let n=i.left+i.width/2-o.width/2;n=Math.max(8,Math.min(n,window.innerWidth-o.width-8));let r=i.top-o.height-5,a=!1;r<8&&(r=i.bottom+5,a=!0,r+o.height>window.innerHeight-8&&(r=window.innerHeight-o.height-8)),e.style.left=n+"px",e.style.top=r+"px",e.classList.toggle("below",a)})(o,n.tip)}))};e||t.anyTipActive?r():n.hoverTimeout=setTimeout(r,1e3)},a=()=>{n.hoverTimeout&&(clearTimeout(n.hoverTimeout),n.hoverTimeout=null),n.tip&&(n.tip.remove(),n.tip=null,t.graceTimeout&&clearTimeout(t.graceTimeout),t.graceTimeout=setTimeout((()=>{t.anyTipActive=!1}),500)),n.outsideHandler&&(document.removeEventListener("touchstart",n.outsideHandler,{passive:!0}),document.removeEventListener("click",n.outsideHandler))};n.outsideHandler=t=>{n.tip&&!o.contains(t.target)&&a()};const s=(t,e,i,o)=>{t.addEventListener(e,i,o),n.listeners.push([t,e,i,o])};s(o,"mouseenter",(()=>r(o.hasAttribute("data-t-immediate")))),s(o,"mouseleave",a),s(o,"touchstart",(()=>{n.tip?a():(r(!0),document.addEventListener("touchstart",n.outsideHandler,{passive:!0}))}),{passive:!0}),s(o,"click",(()=>{"ontouchstart"in window||(n.tip?a():(r(!0),document.addEventListener("click",n.outsideHandler)))})),i.set(o,n),e.add(o)},r=t=>{e.has(t)||n(t)};return{init:()=>{document.querySelectorAll("[data-t]").forEach(r);const t=new Set;let i=null;new MutationObserver((o=>{for(const i of o)if("childList"===i.type)for(const e of i.addedNodes)1===e.nodeType&&(e.matches&&e.matches("[data-t]")&&t.add(e),e.querySelectorAll&&e.querySelectorAll("[data-t]").forEach((e=>t.add(e))));else"attributes"===i.type&&"data-t"===i.attributeName&&!e.has(i.target)&&i.target.hasAttribute("data-t")&&t.add(i.target);clearTimeout(i),i=setTimeout((()=>{t.forEach(r),t.clear()}),16)})).observe(document.body,{childList:!0,subtree:!0,attributes:!0,attributeFilter:["data-t"]})},set:(t,r)=>{if(t&&1===t.nodeType)if(r)if(t.setAttribute("data-t",r),e.has(t)){const e=i.get(t);e&&e.tip&&(e.tip.textContent=r)}else n(t);else o(t),t.removeAttribute("data-t")},clear:t=>{t&&1===t.nodeType&&o(t)}}})();
/* j.js */
const g0={data_changed_since_last_size_count:!0};let collector=(e,t)=>[...e].reduce(((e,n)=>(e[n[t].trim()]=n,e)),{});const el=collector(document.querySelectorAll('[id]:not([id=""])'),"id");function get_date_parts(e=new Date){function t(t){return(e["get"+t]()+("Month"==t)+"").padStart(2,"0")}return{y:t`FullYear`,M:t`Month`,d:t`Date`,h:t`Hours`,m:t`Minutes`,s:t`Seconds`}}function get_date_stamp(e){const{y:t,M:n,d:o,h:a,m:i}=get_date_parts(e);return`${t}_${n}${o}_${a}${i}`}function get_file_prefix(){let e=get_date_stamp(),t=g0.title;return(t?t+" - ":"")+e}function bytes_to_KB(e){return(e/1024).toFixed(2)}function bytes_to_prose(e){return e<1024?e+" byte"+(1===e?"":"s"):Math.round(bytes_to_KB(e))+"KB"}function get_string_bytes(e){return(new TextEncoder).encode(e).length}function download_file({name:e,ext:t,data:n}){let o=new Blob([n],{type:"application/octet-stream"}),a=document.createElement("a");a.href=URL.createObjectURL(o),a.download=`${e}.${t}`,document.body.appendChild(a),a.click(),document.body.removeChild(a),URL.revokeObjectURL(a.href)}function open_html_in_new_tab(e){const t=document.createElement("a"),n=new Blob([e],{type:"text/html"}),o=URL.createObjectURL(n);t.href=o,t.target="_blank",t.rel="noopener noreferrer",document.body.appendChild(t),t.click(),setTimeout((()=>{document.body.removeChild(t),URL.revokeObjectURL(o)}),100)}el.save_markup.onclick=()=>{download_file({name:get_file_prefix()+" markup",ext:"txt",data:el.markup.textContent})},el.button_to_copy_markup.onclick=e=>{copy(el.markup.textContent,e.target)},el.save_html.onclick=()=>{download_file({name:get_file_prefix(),ext:"html",data:g0.html})},el.button_to_copy_html.onclick=e=>{copy(g0.html,e.target)},el.save_ascii.onclick=()=>{download_file({name:get_file_prefix(),ext:"txt",data:g0.ascii_output})},el.button_to_copy_ascii.onclick=e=>{copy(g0.ascii_output,e.target)},el.save_all.onclick=()=>{let e=get_file_prefix();save_blob(create_tar_blob([{name:e+" markup.txt",data:el.markup.textContent},{name:e+" typeset.txt",data:g0.ascii_output},{name:e+".html",data:g0.html}],e),e+".tar")},el.open_html_page_new_tab.onclick=()=>{open_html_in_new_tab(g0.html)},el.open_ascii_output_new_tab.onclick=()=>{open_html_in_new_tab(ascii_shadow.shadow.innerHTML)};let original_doc_title=document.title;function setup_shadow(e){let t=e.attachShadow({mode:"open"}),n=e=>{const n=e.target.closest('a[href^="#"]');if(!n)return;const o=n.getAttribute("href").slice(1),a=t.getElementById(o);if(a){e.preventDefault(),a.scrollIntoView();try{a.focus()}catch(e){}}};return t.addEventListener("click",n),t.addEventListener("keydown",(e=>{"Enter"===e.key&&(e.preventDefault(),n(e))})),{shadow:t,update:function(e){const n=document.createElement("template");n.innerHTML=e.trim(),t.replaceChildren(n.content.cloneNode(!0))}}}let html_shadow=setup_shadow(el.shadow_for_output_html),ascii_shadow=setup_shadow(el.shadow_for_output_ascii);async function main(){let e=m0.from_markup(el.markup.textContent);g0.html=e.html,html_shadow.update(g0.html.replace("<head>","<head><style>:host { all: initial;}body{font-size:14px;}</style>")),el.markup_errors_count.textContent=`${e.errors.length} note${1===e.errors.length?"":"s"}`,el.markup_errors_list.value=e.errors.length?"- "+e.errors.join("\n- "):"",g0.ascii_output=e.ascii,ascii_shadow.update(`<html lang="en"><head><meta charset="UTF-8">\n<meta name="color-scheme" content="light dark">\n<style>\n*{box-sizing: border-box;}\nhtml,body{max-width:100dvw;}body{padding:2ch}</style><title>_</title></head><body><pre>${e.ascii}</pre></body></html>`);let t=""!==e.name;g0.title=t?e.name:"",g0.data_changed_since_last_size_count=!0}function calculate_file_weights(){if(!g0.data_changed_since_last_size_count)return;let e=get_string_bytes(el.markup.textContent),t=get_string_bytes(g0.ascii_output),n=get_string_bytes(g0.html),o=e+t+n;el.html_weight.textContent=bytes_to_prose(n),el.markup_weight.innerText=bytes_to_prose(e),el.rendered_ascii_weight.innerText=bytes_to_prose(t),el.combined_weight.innerText=bytes_to_prose(o),g0.data_changed_since_last_size_count=!1}const DEBOUNCE_DELAY_MS=300;function debounce(e,t){let n;return function(...o){n&&clearTimeout(n),n=setTimeout((()=>{e.apply(this,o)}),t)}}const on_input_debounced=(e,t)=>{const n=debounce(t,300);e.addEventListener("input",n)};function copy(e,t){function n(e){let n=t.innerText;t.innerText=e,setTimeout((()=>{t.innerText=n}),1e3)}navigator.clipboard.writeText(e).then((()=>{n("Copied!")})).catch((e=>{n("Failed")}))}function populate_templates_list(){el.templates_list,Object.entries(m0.templates).forEach((([e,t])=>{let n=document.createElement("button");el.templates_list.appendChild(n),n.innerText=e,n.onclick=()=>{el.markup.textContent=t,main()}}))}function populate_insert_menu(){let e={"(?) Settings":"(?)\nw= 40\n(.) Continue\n","(=) Stamps":'(=)\nTitle= DocTitle // set stamp key value pair variables\n(.) "(Title=@)" // example paragraph block referencing a variable\n',"(%) Part":"\n(%=0)Part name here","(') Header":"\n('==)Header text here","(.) Text":"(.=l) // l:left, c:center, r:right, j:justified\n"+m0.lorem,"(-) List":"(-)\n- A\n-- List item 1 Sub-list item 1\n-- List item 1 Sub-list item 2\n\n- List item 2\n","(;) Code":"\n(;) Preserve line breaks and spaces","(:) Key Value Pairs":"(:)\nname= value\nquestion= answer\n","(+) Table":"(+)// Use (+=x) to transpose (flip) the table rows and columns\nFruit(r)= Grape\nHue(l)= Green\n\n\n(+=,) // <- CSV input\nfruit,hue\napple,green\n","(&) Columns":"(&)col1()col2()col3","(/) Comment":"(/)Your_Comment_Here","(*) Divider Line":"(*)OptionalText","(!) Box":"(!)BoxTitle()BoxContent","(Mark=!)":"(anything_in_here=!)","(Stress=$)":"(anything_in_here=$)","(Get Variable=@)":"(reference_a_variable_by_name=@)"};Object.entries(e).forEach((([e,n])=>{let o=el.tag_options.appendChild(document.createElement("button"));o.innerText=e,o.addEventListener("click",(()=>function(e){const n=t??el.markup.textContent.length,o=el.markup.textContent.slice(0,n),a=el.markup.textContent.slice(n);el.markup.textContent=o+e+a,t=n+e.length,el.markup.selectionStart=t,el.markup.selectionEnd=t,el.markup.focus(),main()}(n)))}));let t=null;el.markup.addEventListener("blur",(()=>{t=el.markup.selectionStart}))}function create_tar_blob(e,t=""){function n(e){const t=atob(e.split(",")[1]),n=t.length,o=new Uint8Array(n);for(let e=0;e<n;e++)o[e]=t.charCodeAt(e);return o}function o(e,t,n){const o=new TextEncoder,a=new Uint8Array(512),i=o.encode(e);a.set(i.slice(0,100),0);const l=t.toString(8).padStart(11,"0")+"\0";a.set(o.encode(l),124),a.set(o.encode(Math.floor(new Date(n).getTime()/1e3).toString(8).padStart(11,"0")+"\0"),136),a.set(o.encode("0000777\0"),100),a.set(o.encode("0000000\0"),108),a.set(o.encode("0000000\0"),116),a.set(o.encode("ustar \0"),257);const r=a.reduce(((e,t)=>e+t),0)+256;return a.set(o.encode(r.toString(8).padStart(6,"0")+"\0 "),148),a}const a=new TextEncoder;let i=[];for(const{name:l,data:r,date:c,path:s=""}of e){let e=r.startsWith("data:image/")?n(r):a.encode(r);const _=t?`${t}/${s}${l}`:`${s}${l}`,d=c?new Date(c):new Date;i.push(o(_,e.length,d),e),i.push(new Uint8Array((512-e.length%512)%512))}return i.push(new Uint8Array(512),new Uint8Array(512)),new Blob(i,{type:"application/x-tar"})}function save_blob(e,t){const n=document.createElement("a");n.href=URL.createObjectURL(e),n.download=t,document.body.appendChild(n),n.click(),document.body.removeChild(n)}on_input_debounced(el.markup,main),el.css_enabled.onchange=main,populate_insert_menu(),populate_templates_list();let starter_a=m0.templates.Starter;el.markup.textContent=starter_a,window.addEventListener("load",(function(){main(),"function"==typeof init_blocks_editor&&init_blocks_editor(),"undefined"!=typeof tool_tip&&tool_tip.init()}));</script></body></html>