calliope-ts 0.0.4 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (183) hide show
  1. package/README.md +69 -3
  2. package/dist/calliope/bracketing.d.ts.map +1 -1
  3. package/dist/calliope/bracketing.js +59 -5
  4. package/dist/calliope/deps.d.ts +5 -1
  5. package/dist/calliope/deps.d.ts.map +1 -1
  6. package/dist/calliope/deps.js +53 -3
  7. package/dist/calliope/engine.d.ts.map +1 -1
  8. package/dist/calliope/engine.js +6 -1
  9. package/dist/calliope/relstress.d.ts.map +1 -1
  10. package/dist/calliope/relstress.js +411 -15
  11. package/dist/calliope/syntax.d.ts +33 -0
  12. package/dist/calliope/syntax.d.ts.map +1 -1
  13. package/dist/calliope/syntax.js +199 -0
  14. package/dist/data/en_common_words.json +1 -0
  15. package/dist/display.d.ts +15 -1
  16. package/dist/display.d.ts.map +1 -1
  17. package/dist/display.js +112 -10
  18. package/dist/fabbhalle.d.ts +54 -0
  19. package/dist/fabbhalle.d.ts.map +1 -0
  20. package/dist/fabbhalle.js +404 -0
  21. package/dist/index.d.ts.map +1 -1
  22. package/dist/index.js +86 -33
  23. package/dist/phonological.d.ts.map +1 -1
  24. package/dist/phonological.js +7 -1
  25. package/dist/rewriteEn.d.ts +14 -0
  26. package/dist/rewriteEn.d.ts.map +1 -0
  27. package/dist/rewriteEn.js +392 -0
  28. package/dist/rhyme.d.ts +35 -3
  29. package/dist/rhyme.d.ts.map +1 -1
  30. package/dist/rhyme.js +176 -11
  31. package/dist/russian/accentuator.d.ts +31 -0
  32. package/dist/russian/accentuator.d.ts.map +1 -0
  33. package/dist/russian/accentuator.js +546 -0
  34. package/dist/russian/collocations.d.ts +7 -0
  35. package/dist/russian/collocations.d.ts.map +1 -0
  36. package/dist/russian/collocations.js +38 -0
  37. package/dist/russian/compounds.d.ts +6 -0
  38. package/dist/russian/compounds.d.ts.map +1 -0
  39. package/dist/russian/compounds.js +81 -0
  40. package/dist/russian/download.d.ts +23 -0
  41. package/dist/russian/download.d.ts.map +1 -0
  42. package/dist/russian/download.js +117 -0
  43. package/dist/russian/engine.d.ts +6 -0
  44. package/dist/russian/engine.d.ts.map +1 -0
  45. package/dist/russian/engine.js +1424 -0
  46. package/dist/russian/parser.d.ts +8 -0
  47. package/dist/russian/parser.d.ts.map +1 -0
  48. package/dist/russian/parser.js +92 -0
  49. package/dist/russian/paths.d.ts +55 -0
  50. package/dist/russian/paths.d.ts.map +1 -0
  51. package/dist/russian/paths.js +114 -0
  52. package/dist/russian/rewrite.d.ts +6 -0
  53. package/dist/russian/rewrite.d.ts.map +1 -0
  54. package/dist/russian/rewrite.js +400 -0
  55. package/dist/russian/rhyme.d.ts +18 -0
  56. package/dist/russian/rhyme.d.ts.map +1 -0
  57. package/dist/russian/rhyme.js +230 -0
  58. package/dist/russian/syllabifier.d.ts +14 -0
  59. package/dist/russian/syllabifier.d.ts.map +1 -0
  60. package/dist/russian/syllabifier.js +475 -0
  61. package/dist/russian/types.d.ts +94 -0
  62. package/dist/russian/types.d.ts.map +1 -0
  63. package/dist/russian/types.js +27 -0
  64. package/dist/scandroidNative/constants.d.ts +16 -0
  65. package/dist/scandroidNative/constants.d.ts.map +1 -0
  66. package/dist/scandroidNative/constants.js +60 -0
  67. package/dist/scandroidNative/deduceParameters.d.ts +16 -0
  68. package/dist/scandroidNative/deduceParameters.d.ts.map +1 -0
  69. package/dist/scandroidNative/deduceParameters.js +69 -0
  70. package/dist/scandroidNative/dictionary-data.d.ts +2 -0
  71. package/dist/scandroidNative/dictionary-data.d.ts.map +1 -0
  72. package/dist/scandroidNative/dictionary-data.js +744 -0
  73. package/dist/scandroidNative/dictionary.d.ts +12 -0
  74. package/dist/scandroidNative/dictionary.d.ts.map +1 -0
  75. package/dist/scandroidNative/dictionary.js +50 -0
  76. package/dist/scandroidNative/engine.d.ts +41 -0
  77. package/dist/scandroidNative/engine.d.ts.map +1 -0
  78. package/dist/scandroidNative/engine.js +119 -0
  79. package/dist/scandroidNative/machine.d.ts +93 -0
  80. package/dist/scandroidNative/machine.d.ts.map +1 -0
  81. package/dist/scandroidNative/machine.js +795 -0
  82. package/dist/scandroidNative/positioner.d.ts +32 -0
  83. package/dist/scandroidNative/positioner.d.ts.map +1 -0
  84. package/dist/scandroidNative/positioner.js +208 -0
  85. package/dist/scandroidNative/syllabizer.d.ts +3 -0
  86. package/dist/scandroidNative/syllabizer.d.ts.map +1 -0
  87. package/dist/scandroidNative/syllabizer.js +215 -0
  88. package/dist/scandroidNative/utilities.d.ts +37 -0
  89. package/dist/scandroidNative/utilities.d.ts.map +1 -0
  90. package/dist/scandroidNative/utilities.js +86 -0
  91. package/dist/scansion.d.ts.map +1 -1
  92. package/dist/scansion.js +118 -14
  93. package/dist/stress.d.ts +1 -0
  94. package/dist/stress.d.ts.map +1 -1
  95. package/dist/stress.js +502 -42
  96. package/dist/types.d.ts +3 -0
  97. package/dist/types.d.ts.map +1 -1
  98. package/package.json +27 -6
  99. package/tools/fetch-russian-data.mjs +30 -0
  100. package/webapp/public/app.js +2418 -0
  101. package/webapp/public/assets/GithubLogo.png +0 -0
  102. package/webapp/public/assets/NPM2.png +0 -0
  103. package/webapp/public/assets/fonts/MurenaBold-webfont.woff2 +0 -0
  104. package/webapp/public/assets/fonts/MurenaItalic-webfont.woff2 +0 -0
  105. package/webapp/public/assets/fonts/MurenaRegular-webfont.woff2 +0 -0
  106. package/webapp/public/assets/fonts/Myra_4F_Caps_Bold-webfont.woff2 +0 -0
  107. package/webapp/public/assets/fonts/SinkinSans-700Bold.otf +0 -0
  108. package/webapp/public/assets/fonts/butterflies.ttf +0 -0
  109. package/webapp/public/assets/fonts/midcase_blackline-webfont.woff2 +0 -0
  110. package/webapp/public/assets/fonts/neueral-bold-webfont.woff2 +0 -0
  111. package/webapp/public/assets/fonts/neueral-regular-webfont.woff2 +0 -0
  112. package/webapp/public/assets/fonts/popelka-webfont.woff2 +0 -0
  113. package/webapp/public/assets/fonts/vremenagrotesk-webfont.woff +0 -0
  114. package/webapp/public/assets/fonts/wicky_javick_bold-webfont.woff2 +0 -0
  115. package/webapp/public/assets/logos/Logo_Var_10_Celtic_Knot_SVG.svg +116 -0
  116. package/webapp/public/assets/logos/Logo_Var_11_Graph_SVG.svg +313 -0
  117. package/webapp/public/assets/logos/Logo_Var_12_Limacon_Knot_SVG.svg +3942 -0
  118. package/webapp/public/assets/logos/Logo_Var_13_Crescents_SVG.svg +1030 -0
  119. package/webapp/public/assets/logos/Logo_Var_1_Spiral_SVG.svg +1491 -0
  120. package/webapp/public/assets/logos/Logo_Var_2_Tunnel_SVG.svg +12 -0
  121. package/webapp/public/assets/logos/Logo_Var_3_Triskelion_SVG.svg +10 -0
  122. package/webapp/public/assets/logos/Logo_Var_4_Quinquetra_PNG.png +0 -0
  123. package/webapp/public/assets/logos/Logo_Var_5_Penrose_Pentagram_SVG.svg +37 -0
  124. package/webapp/public/assets/logos/Logo_Var_6_Triskelion2_SVG.svg +10 -0
  125. package/webapp/public/assets/logos/Logo_Var_7_SixfoldSpirals_SVG.svg +20 -0
  126. package/webapp/public/assets/logos/Logo_Var_8_Radial_Labyrinth_SVG.svg +163 -0
  127. package/webapp/public/assets/logos/Logo_Var_9_Radial_Labyrinth_2_SVG.svg +106 -0
  128. package/webapp/public/index.html +316 -0
  129. package/webapp/public/styles.css +1114 -0
  130. package/webapp/server.mjs +680 -0
  131. package/src/caesura.ts +0 -201
  132. package/src/calliope/boundaries.ts +0 -190
  133. package/src/calliope/bracketing.ts +0 -390
  134. package/src/calliope/deps.ts +0 -160
  135. package/src/calliope/engine.ts +0 -77
  136. package/src/calliope/feats.ts +0 -46
  137. package/src/calliope/names.ts +0 -44
  138. package/src/calliope/postag.ts +0 -253
  139. package/src/calliope/prosodic.ts +0 -262
  140. package/src/calliope/relstress.ts +0 -645
  141. package/src/calliope/stressrules.ts +0 -147
  142. package/src/calliope/syntax.ts +0 -218
  143. package/src/calliope/udpos.ts +0 -152
  144. package/src/calliope_src_contents.md +0 -19049
  145. package/src/clio/caesura.ts +0 -145
  146. package/src/clio/depfix.ts +0 -88
  147. package/src/clio/display.ts +0 -1042
  148. package/src/clio/engine.ts +0 -38
  149. package/src/clio/parser.ts +0 -845
  150. package/src/clio/phonological.ts +0 -849
  151. package/src/clio/phrasestress.ts +0 -108
  152. package/src/clio/pipeline.ts +0 -154
  153. package/src/clio/rhyme.ts +0 -740
  154. package/src/clio/scandroid.ts +0 -434
  155. package/src/clio/scansion.ts +0 -1130
  156. package/src/clio/semantics.ts +0 -134
  157. package/src/clio/stress.ts +0 -1731
  158. package/src/clio/tagfix.ts +0 -104
  159. package/src/depfix.ts +0 -88
  160. package/src/display.ts +0 -1138
  161. package/src/engine.ts +0 -22
  162. package/src/index.ts +0 -690
  163. package/src/parser.ts +0 -501
  164. package/src/phonological.ts +0 -917
  165. package/src/phrasestress.ts +0 -108
  166. package/src/rhyme.ts +0 -748
  167. package/src/scandroid.ts +0 -434
  168. package/src/scansion.ts +0 -1174
  169. package/src/semantics.ts +0 -134
  170. package/src/stress.ts +0 -2111
  171. package/src/tagfix.ts +0 -104
  172. package/src/types.ts +0 -265
  173. package/tests/DataForHayesLinesOnly.txt +0 -364
  174. package/tests/DataForHayesStressSymbolsRevised.txt +0 -728
  175. package/tests/basic.test.ts +0 -1102
  176. package/tests/bench-hayes.mjs +0 -72
  177. package/tests/epg64.meter.train.txt +0 -8139
  178. package/tests/litlab-sample-2016.txt +0 -1738
  179. package/tests/prosodic.meter.train.txt +0 -13192
  180. package/tests/wagner-stress.test.ts +0 -188
  181. package/tsconfig.json +0 -29
  182. package/vitest.config.d.ts +0 -2
  183. package/vitest.config.js +0 -14
@@ -0,0 +1,316 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1">
6
+ <title>CALLIOPE — Phonological Poetry Scansion</title>
7
+ <meta name="description" content="Calliope TS in the browser: how a poem actually moves — stress, phrasing, meter, rhyme, form.">
8
+ <link rel="preconnect" href="https://fonts.googleapis.com">
9
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
10
+ <link href="https://fonts.googleapis.com/css2?family=Bebas+Neue&family=Cormorant+Garamond:ital,wght@0,400;0,500;0,600;1,500;1,600;1,700&family=IBM+Plex+Mono:ital,wght@0,400;0,500;1,400&display=swap" rel="stylesheet">
11
+ <link rel="stylesheet" href="styles.css">
12
+ <link rel="icon" href="data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'><polygon points='2,30 16,2 30,30' fill='%23c1272d'/><polygon points='9,30 16,16 23,30' fill='%23ece2c8'/></svg>">
13
+ </head>
14
+ <body>
15
+
16
+ <!-- shared SVG ornaments -->
17
+ <svg width="0" height="0" style="position:absolute" aria-hidden="true">
18
+ <defs>
19
+ <symbol id="orn-corner" viewBox="0 0 64 64">
20
+ <path d="M4 62 L4 20 Q4 4 20 4 L62 4" fill="none" stroke-width="2.6"/>
21
+ <path d="M11 62 L11 24 Q11 11 24 11 L62 11" fill="none" stroke-width="1.1"/>
22
+ <circle cx="18" cy="18" r="3.2" fill="none" stroke-width="1.4"/>
23
+ <path d="M18 18 q10 -3 12 6 q1.6 7 -6 8" fill="none" stroke-width="1.2"/>
24
+ <path d="M4 34 l3.5 -4 3.5 4 -3.5 4 z" stroke="none"/>
25
+ <path d="M34 4 l4 3.5 -4 3.5 -4 -3.5 z" stroke="none"/>
26
+ </symbol>
27
+ </defs>
28
+ </svg>
29
+
30
+ <header class="masthead">
31
+ <div class="mast-wedge" aria-hidden="true"></div>
32
+ <div class="brand">
33
+ <span id="brand-sigil" class="brand-sigil sg-vortex" aria-hidden="true"><img id="sigil-img" alt="" src="assets/logos/Logo_Var_2_Tunnel_SVG.svg"></span>
34
+ <h1 id="brand-word">CALLIOPE</h1>
35
+ <span class="brand-ts" aria-hidden="true">TS</span>
36
+ <span class="brand-sub">phonological · scansion · engine</span>
37
+ </div>
38
+ <nav class="masthead-tools">
39
+ <button id="btn-legend" class="ghost-btn">✦ GUIDE</button>
40
+ <button id="btn-settings" class="ghost-btn" aria-haspopup="true" aria-expanded="false">⚙ SETTINGS</button>
41
+ <div id="settings-pop" class="settings-pop" hidden>
42
+ <h3>Settings</h3>
43
+ <div class="set-block">
44
+ <span class="set-label">Display</span>
45
+ <label class="set-radio"><input type="radio" name="display" value="terminal" checked>
46
+ <b>Terminal</b> — bright inks on black, monospaced; the CLI’s at-a-glance clarity.</label>
47
+ <label class="set-radio"><input type="radio" name="display" value="manuscript">
48
+ <b>Manuscript</b> — the parchment &amp; gilt skin.</label>
49
+ </div>
50
+ <div class="set-block">
51
+ <span class="set-label">Prosody engine</span>
52
+ <label class="set-radio"><input type="radio" name="engine" value="calliope" checked>
53
+ <b>Calliope</b> — the faithful, current pipeline (default)</label>
54
+ <label class="set-radio"><input type="radio" name="engine" value="clio">
55
+ <b>Clio</b> — the frozen legacy parse (FinNLP). Rawer and more idiosyncratic;
56
+ kept for comparison, occasionally right where Calliope wavers.</label>
57
+ </div>
58
+ <p class="set-note" id="engine-note-pop"></p>
59
+ </div>
60
+ </nav>
61
+ </header>
62
+ <div class="mast-rule" aria-hidden="true"></div>
63
+
64
+ <nav class="mode-tabs" role="tablist" aria-label="Instruments">
65
+ <button class="mode-tab is-active" data-mode="scansion" role="tab" aria-selected="true">Scansion</button>
66
+ <button class="mode-tab" data-mode="forge" role="tab" aria-selected="false">Rhyme&nbsp;Forge</button>
67
+ <button class="mode-tab" data-mode="rewrites" role="tab" aria-selected="false">Rewrites</button>
68
+ <button class="mode-tab" data-mode="syntax" role="tab" aria-selected="false">Syntax</button>
69
+ </nav>
70
+
71
+ <main class="frame">
72
+
73
+ <!-- ════════ MODE: SCANSION ════════ -->
74
+ <div id="mode-scansion" class="mode">
75
+ <span class="bfly b1" aria-hidden="true" style="top:2rem; right:3%;">a</span>
76
+ <span class="bfly b2" aria-hidden="true" style="bottom:8rem; left:1.5%;">g</span>
77
+
78
+ <section id="scriptorium" class="scriptorium panel">
79
+ <svg class="corner tl"><use href="#orn-corner"/></svg>
80
+ <svg class="corner tr"><use href="#orn-corner"/></svg>
81
+ <svg class="corner bl"><use href="#orn-corner"/></svg>
82
+ <svg class="corner br"><use href="#orn-corner"/></svg>
83
+ <div class="scriptorium-head">
84
+ <h2 class="bar-title">The Scriptorium</h2>
85
+ <p class="whisper">Paste a poem (blank lines separate stanzas) — or a single verse line — and Calliope will show you how it moves: which syllables carry weight, where the beats fall, what rhymes with what.</p>
86
+ </div>
87
+ <textarea id="poem-input" spellcheck="false" placeholder="Shall I compare thee to a summer’s day?&#10;Thou art more lovely and more temperate…"></textarea>
88
+ <div class="scriptorium-foot">
89
+ <label class="sample-picker">
90
+ <span>Open a sample:</span>
91
+ <select id="sample-select">
92
+ <option value="">— choose —</option>
93
+ </select>
94
+ </label>
95
+ <label class="lang-picker">
96
+ <span>Language:</span>
97
+ <select id="lang-select">
98
+ <option value="en">English</option>
99
+ <option value="ru">Русский</option>
100
+ </select>
101
+ </label>
102
+ <button id="btn-analyze" class="analyze-btn">Scan the verse ▶</button>
103
+ </div>
104
+ </section>
105
+
106
+ <div id="edit-strip" class="edit-strip" hidden>
107
+ <button id="btn-reopen" class="ghost-btn dark">✎ NEW SCAN</button>
108
+ <button id="btn-copymap" class="ghost-btn dark" title="copy the whole poem’s stress keys, meters, and rhyme letters as plain text">⧉ COPY STRESS MAP</button>
109
+ <div class="view-toggles">
110
+ <label class="toggle-label">Tint
111
+ <select id="tint-select">
112
+ <option value="rel">relative stress</option>
113
+ <option value="lex">lexical stress</option>
114
+ <option value="class">word class</option>
115
+ <option value="off">plain ink</option>
116
+ </select>
117
+ </label>
118
+ <label class="check-label"><input type="checkbox" id="feet-toggle"> show feet &amp; caesurae</label>
119
+ <span id="engine-note" class="whisper dark"></span>
120
+ </div>
121
+ </div>
122
+
123
+ <div class="stage-and-rail" id="results-zone" hidden>
124
+ <section id="codex" class="codex panel" aria-label="Analyzed poem"></section>
125
+ <aside class="rail">
126
+ <section id="synopsis-card" class="rail-card panel"></section>
127
+ <section id="phonopoetics-card" class="rail-card panel"></section>
128
+ <section id="inspector-card" class="rail-card panel inspector">
129
+ <h3 class="rail-title">Word Profile</h3>
130
+ <p class="whisper" id="inspector-hint">Hover over any word for detailed info; click a word to latch its full profile — with its Nounsing&nbsp;Pro record — to this board. Click a line’s meter tag for its detailed scan.</p>
131
+ <div id="inspector-body"></div>
132
+ </section>
133
+ </aside>
134
+ </div>
135
+
136
+ <div id="empty-hint" class="empty-hint">
137
+ <div class="manifesto">
138
+ <span class="mani-bar">READ WITH THE EAR</span>
139
+ <span class="mani-wedge" aria-hidden="true"></span>
140
+ <p>“<em>meter is something you recover from pronunciation,<br>not something you stamp onto spelling.</em>”</p>
141
+ <p class="whisper dark">Calliope reads a line the way an attentive reader does — working out how the words would be said aloud, and only then listening for the beat that saying settles into.</p>
142
+ </div>
143
+ </div>
144
+ </div>
145
+
146
+ <!-- ════════ MODE: RHYME FORGE ════════ -->
147
+ <div id="mode-forge" class="mode" hidden>
148
+ <span class="bfly b1" aria-hidden="true" style="top:3rem; left:4%;">k</span>
149
+ <span class="bfly b2" aria-hidden="true" style="top:16rem; right:4%;">p</span>
150
+ <section class="panel tool-panel">
151
+ <svg class="corner tl"><use href="#orn-corner"/></svg>
152
+ <svg class="corner tr"><use href="#orn-corner"/></svg>
153
+ <svg class="corner bl"><use href="#orn-corner"/></svg>
154
+ <svg class="corner br"><use href="#orn-corner"/></svg>
155
+ <h2 class="bar-title">The Rhyme Forge</h2>
156
+ <p class="whisper">Interrogate a single word’s sound-anatomy from the Nounsing&nbsp;Pro augmented lexicon — its rhymes (strict, or trimmed to a syllable count), its rime phonemes, its own metrical foot — or cast a stress pattern and see which words fit it.</p>
157
+
158
+ <div class="forge-controls">
159
+ <label class="tool-field">
160
+ <span>Word</span>
161
+ <input id="forge-word" type="text" spellcheck="false" placeholder="symmetry">
162
+ </label>
163
+ <label class="tool-field">
164
+ <span>Rhymes with exactly</span>
165
+ <select id="forge-syll">
166
+ <option value="">any syllable count</option>
167
+ <option value="1">1 syllable</option><option value="2">2 syllables</option>
168
+ <option value="3">3 syllables</option><option value="4">4 syllables</option>
169
+ <option value="5">5 syllables</option>
170
+ </select>
171
+ </label>
172
+ <button id="forge-go" class="analyze-btn small">Forge ▶</button>
173
+ </div>
174
+ <div id="forge-out" class="tool-out"></div>
175
+
176
+ <h3 class="bar-title small" style="margin-top:1.6rem">Meter Match</h3>
177
+ <p class="whisper">Cast a stress contour in digits — <span class="mono-inline">1</span> primary, <span class="mono-inline">2</span> secondary, <span class="mono-inline">0</span> unstressed. <span class="mono-inline">010</span> summons amphibrachs, <span class="mono-inline">100</span> dactyls, <span class="mono-inline">01</span> iambs.</p>
178
+ <div class="forge-controls">
179
+ <label class="tool-field">
180
+ <span>Pattern</span>
181
+ <input id="meter-pattern" type="text" spellcheck="false" placeholder="010" maxlength="8">
182
+ </label>
183
+ <button id="meter-go" class="analyze-btn small">Summon ▶</button>
184
+ </div>
185
+ <div id="meter-out" class="tool-out"></div>
186
+ </section>
187
+ </div>
188
+
189
+ <!-- ════════ MODE: REWRITES ════════ -->
190
+ <div id="mode-rewrites" class="mode" hidden>
191
+ <span class="bfly b1" aria-hidden="true" style="top:2.5rem; right:6%;">c</span>
192
+ <span class="bfly b2" aria-hidden="true" style="top:18rem; left:3%;">w</span>
193
+ <section class="panel tool-panel">
194
+ <svg class="corner tl"><use href="#orn-corner"/></svg>
195
+ <svg class="corner tr"><use href="#orn-corner"/></svg>
196
+ <svg class="corner bl"><use href="#orn-corner"/></svg>
197
+ <svg class="corner br"><use href="#orn-corner"/></svg>
198
+ <h2 class="bar-title">The Transmutation Chamber</h2>
199
+ <p class="whisper">Rewrite engines replace every word with a lexicon-mate — sharing its opening phonemes, its exact stress skeleton, or its rhyme — while filters keep the grammar and register from drifting. English casts draw on Nounsing&nbsp;Pro’s Zipf-graded lexicon; Cyrillic verse transmutes through the Russian stress dictionary, a poetry-corpus frequency table standing in for Zipf, with UPOS tags guarding the grammar. Morphemic grounding and register fidelity bind casts closer still to the source’s derivational shape and diction. Each cast rolls fresh dice.</p>
200
+
201
+ <textarea id="rw-input" spellcheck="false" placeholder="Tyger Tyger, burning bright,&#10;In the forests of the night;&#10;&#10;Белеет парус одинокой&#10;В тумане моря голубом!.."></textarea>
202
+
203
+ <div class="rw-controls">
204
+ <label class="tool-field">
205
+ <span>Method</span>
206
+ <select id="rw-mode">
207
+ <option value="stress">stress skeleton — keep the meter, transform the sense</option>
208
+ <option value="phones">phoneme echo — words sharing the first two phones</option>
209
+ <option value="rhyme">rhyme swap — each word becomes a rhyme of itself</option>
210
+ </select>
211
+ </label>
212
+ <label class="tool-field slider">
213
+ <span>Part-of-speech fidelity <b id="rw-pos-val">1</b></span>
214
+ <input id="rw-pos" type="range" min="0" max="3" step="1" value="1">
215
+ <span class="slider-hints"><i>loose</i><i>exact tag</i></span>
216
+ </label>
217
+ <label class="tool-field slider">
218
+ <span>Zipf frequency floor <b id="rw-freq-val">2.0</b></span>
219
+ <input id="rw-freq" type="range" min="0" max="4" step="0.25" value="2">
220
+ <span class="slider-hints"><i>any word</i><i>common only</i></span>
221
+ </label>
222
+ <label class="tool-field slider" title="Prefer replacements whose Zipf frequency sits NEAR the source word's — a rare word swaps for a similarly rare word, a common one for a common one. Grounds diction and register. (English casts only.)">
223
+ <span>Register fidelity <b id="rw-reg-val">0</b></span>
224
+ <input id="rw-reg" type="range" min="0" max="4" step="1" value="0">
225
+ <span class="slider-hints"><i>off</i><i>same register</i></span>
226
+ </label>
227
+ <label class="tool-field rw-fuzzy-field" title="Prefer replacements sharing the source word's derivational morphology — its suffix (-ness, -tion, -ful…) and the lexicon's morphological classes — and avoid same-root casts. (English casts only.)">
228
+ <span>Morphemic grounding</span>
229
+ <input id="rw-morph" type="checkbox">
230
+ </label>
231
+ <label class="tool-field rw-fuzzy-field" title="By default English source words are tagged IN LINE CONTEXT by the scansion engine's parser ('frame' in 'Could frame thy fearful symmetry' gates as a verb, not the dictionary's noun). Tick to revert to dictionary tags — faster, context-blind. (English casts only.)">
232
+ <span>Dictionary tags</span>
233
+ <input id="rw-dictpos" type="checkbox">
234
+ </label>
235
+ <label class="tool-field rw-fuzzy-field" id="rw-fuzzy-field" hidden title="Widen rhyme swaps beyond perfect rhymes for words with few or no perfect rhyme-mates — family and assonant tiers in English, неточная рифма (same tail length and stressed vowel) in Russian. Perfect rhymes still win when they exist.">
236
+ <span>Fuzzy rhymes</span>
237
+ <input id="rw-fuzzy" type="checkbox">
238
+ </label>
239
+ <button id="rw-go" class="analyze-btn small">Transmute ▶</button>
240
+ </div>
241
+ <div id="rw-out" class="tool-out rw-out"></div>
242
+ </section>
243
+ </div>
244
+
245
+ <!-- ════════ MODE: SYNTAX ════════ -->
246
+ <div id="mode-syntax" class="mode" hidden>
247
+ <span class="bfly b1" aria-hidden="true" style="top:4rem; left:5%;">e</span>
248
+ <span class="bfly b2" aria-hidden="true" style="top:14rem; right:5%;">r</span>
249
+ <section class="panel tool-panel">
250
+ <svg class="corner tl"><use href="#orn-corner"/></svg>
251
+ <svg class="corner tr"><use href="#orn-corner"/></svg>
252
+ <svg class="corner bl"><use href="#orn-corner"/></svg>
253
+ <svg class="corner br"><use href="#orn-corner"/></svg>
254
+ <h2 class="bar-title">The Parse Observatory</h2>
255
+ <p class="whisper">UDPipe’s neural dependency parse, line by line — every word’s part of speech, morphological features, and grammatical bond, with the tag-repair and tree-repair (DepEdit-TS) corrections already applied.</p>
256
+ <textarea id="syn-input" spellcheck="false" placeholder="Tell all the truth but tell it slant —"></textarea>
257
+ <div class="forge-controls">
258
+ <button id="syn-go" class="analyze-btn small">Parse ▶</button>
259
+ <label class="check-label on-parch"><input type="checkbox" id="syn-fuse">
260
+ <span class="cl-title">fuse lines</span><span class="cl-desc"> — parse as one continuous text (ignores line breaks)</span></label>
261
+ </div>
262
+ <div id="syn-out" class="tool-out"></div>
263
+ </section>
264
+ </div>
265
+
266
+ </main>
267
+
268
+ <footer class="colophon">
269
+ <div class="colo-left">
270
+ <span class="colo-title">CALLIOPE&nbsp;TS · Aleksey Calvin / <a href="https://www.SilverAgePoets.com" target="_blank" rel="noopener">SilverAgePoets.com</a></span>
271
+ <span class="colo-fine">Key sources: McAleese (2008), Wagner (2005), Hayes (1982/1996), Kaun &amp; Hayes (2005), Hartman (2005), &amp; others (<a href="https://github.com/AlekseyCalvin/Calliope-TS/blob/main/README.md" target="_blank" rel="noopener">see README</a>).</span>
272
+ <span class="colo-fine">Syntactic parsing via <a href="https://www.npmjs.com/package/udpipe-node" target="_blank" rel="noopener">UDPipe-Node</a> | parse corrections via <a href="https://www.npmjs.com/package/depedits" target="_blank" rel="noopener">DepEdit-TS</a> | morphological/phonemic/phonic analyses via <a href="https://www.npmjs.com/package/nounsing-pro" target="_blank" rel="noopener">Nounsing&nbsp;Pro</a></span>
273
+ </div>
274
+ <div class="colo-links">
275
+ <a href="https://github.com/AlekseyCalvin/Calliope-TS" target="_blank" rel="noopener" title="Calliope-TS on GitHub"><img src="assets/GithubLogo.png" alt="GitHub"></a>
276
+ <a href="https://www.npmjs.com/package/calliope-ts" target="_blank" rel="noopener" title="calliope-ts on NPM"><img src="assets/NPM2.png" alt="NPM"></a>
277
+ </div>
278
+ </footer>
279
+
280
+ <div id="tooltip" class="tooltip" hidden></div>
281
+
282
+ <div id="veil" class="veil" hidden>
283
+ <div class="veil-inner">
284
+ <div class="veil-apparatus" aria-hidden="true">
285
+ <div class="veil-burst"></div>
286
+ <div class="veil-ring"></div>
287
+ <div class="veil-glyph">▲</div>
288
+ </div>
289
+ <p id="veil-text">Sounding the syllables…</p>
290
+ </div>
291
+ </div>
292
+
293
+ <div id="legend" class="legend-overlay" hidden>
294
+ <div class="legend-panel panel" role="dialog" aria-modal="true" aria-label="Legend">
295
+ <svg class="corner tl"><use href="#orn-corner"/></svg>
296
+ <svg class="corner tr"><use href="#orn-corner"/></svg>
297
+ <svg class="corner bl"><use href="#orn-corner"/></svg>
298
+ <svg class="corner br"><use href="#orn-corner"/></svg>
299
+ <div class="legend-head">
300
+ <h2 class="bar-title">✦ Guide</h2>
301
+ <button id="btn-legend-close" class="ghost-btn">esc · close</button>
302
+ </div>
303
+ <div id="legend-body" class="legend-body"></div>
304
+ </div>
305
+ </div>
306
+
307
+ <div id="toast" class="toast" hidden></div>
308
+ <div id="file-warning" class="file-warning" hidden>
309
+ <b>This page is being read straight from disk (file://)</b> — the analysis engine isn’t running behind it,
310
+ so nothing can be scanned. Start the engine from the project folder with
311
+ <code>npm run web</code>, then open <a href="http://localhost:4321">http://localhost:4321</a>.
312
+ </div>
313
+
314
+ <script src="app.js"></script>
315
+ </body>
316
+ </html>