@miliastry/quasar 1.0.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.
- package/LICENSE +119 -0
- package/README.md +45 -0
- package/dist/Visuals/lyne.css +1027 -0
- package/dist/Visuals/osu.css +257 -0
- package/dist/index.d.mts +4563 -0
- package/dist/index.d.ts +4563 -0
- package/dist/index.js +11291 -0
- package/dist/index.mjs +11197 -0
- package/package.json +51 -0
- package/src/Analysis/Contracts/AnalysisReport.ts +26 -0
- package/src/Analysis/Contracts/Contribution.ts +76 -0
- package/src/Analysis/Contracts/Pass.ts +76 -0
- package/src/Analysis/Contracts/PipelineContext.ts +48 -0
- package/src/Analysis/Passes/Analysis/GradientAnalyzer.ts +292 -0
- package/src/Analysis/Passes/Analysis/MergeableColorAnalyzer.ts +112 -0
- package/src/Analysis/Passes/Analysis/RainbowAnalyzer.ts +233 -0
- package/src/Analysis/Passes/Analysis/WaveAnalyzer.ts +211 -0
- package/src/Analysis/Passes/Analysis/__tests__/GradientAnalyzer.test.ts +135 -0
- package/src/Analysis/Passes/Analysis/__tests__/MergeableColorAnalyzer.test.ts +84 -0
- package/src/Analysis/Passes/Analysis/__tests__/RainbowAnalyzer.test.ts +99 -0
- package/src/Analysis/Passes/Analysis/__tests__/WaveAnalyzer.test.ts +119 -0
- package/src/Analysis/Passes/Decision/DefaultDecision.ts +139 -0
- package/src/Analysis/Passes/Decision/__tests__/DefaultDecision.test.ts +179 -0
- package/src/Analysis/Passes/Transform/CollapseGradientTransform.ts +176 -0
- package/src/Analysis/Passes/Transform/MergeColorsTransform.ts +126 -0
- package/src/Analysis/Passes/Transform/RainbowCollapseTransform.ts +83 -0
- package/src/Analysis/Passes/Transform/WaveCollapseTransform.ts +88 -0
- package/src/Analysis/Passes/Utility/CharacterCountAnalyzer.ts +45 -0
- package/src/Analysis/Pipeline/Pipeline.ts +133 -0
- package/src/Analysis/Pipeline/PipelineBuilder.ts +55 -0
- package/src/Analysis/Pipeline/PipelineStage.ts +19 -0
- package/src/Analysis/Utils/color-utils.ts +132 -0
- package/src/Analysis/__tests__/Integration.test.ts +162 -0
- package/src/Analysis/__tests__/Pipeline.test.ts +133 -0
- package/src/Analysis/index.ts +52 -0
- package/src/BBCode/BBCodeDocumentModel.ts +175 -0
- package/src/BBCode/BBCodeToGreenNode.ts +755 -0
- package/src/BBCode/Parser.ts +384 -0
- package/src/BBCode/index.ts +12 -0
- package/src/Collab/positions.ts +91 -0
- package/src/Commands/Command.ts +44 -0
- package/src/Commands/CommandRegistry.ts +78 -0
- package/src/Commands/DeleteNode.ts +20 -0
- package/src/Commands/InsertText.ts +21 -0
- package/src/Commands/SplitMerge.ts +28 -0
- package/src/Commands/WrapInTag.ts +21 -0
- package/src/Commands/index.ts +6 -0
- package/src/Diff/TreeDiffer.ts +264 -0
- package/src/Diff/__tests__/TreeDiffer.test.ts +65 -0
- package/src/Diff/index.ts +2 -0
- package/src/Events/EventBus.ts +160 -0
- package/src/Events/index.ts +2 -0
- package/src/Formatter/Formatter.ts +54 -0
- package/src/Formatter/index.ts +2 -0
- package/src/HTML/HTMLDocumentModel.ts +35 -0
- package/src/HTML/HTMLToGreenNode.ts +290 -0
- package/src/Incremental/ChangeTracker.ts +105 -0
- package/src/Incremental/IncrementalParser.ts +591 -0
- package/src/Incremental/__tests__/IncrementalParser.test.ts +164 -0
- package/src/Incremental/index.ts +4 -0
- package/src/Lexer/BBCodeLexer.ts +382 -0
- package/src/Lexer/Lexer.ts +181 -0
- package/src/Lexer/index.ts +10 -0
- package/src/Linter/Linter.ts +193 -0
- package/src/Linter/index.ts +2 -0
- package/src/Markdown/MarkdownAST.ts +112 -0
- package/src/Markdown/MarkdownDocumentModel.ts +55 -0
- package/src/Markdown/MarkdownLexer.ts +203 -0
- package/src/Markdown/MarkdownParser.ts +455 -0
- package/src/Markdown/MarkdownToGreenNode.ts +153 -0
- package/src/Model/DocumentModel.ts +694 -0
- package/src/Model/NodeFactory.ts +117 -0
- package/src/Model/TagRegistry.ts +495 -0
- package/src/Model/index.ts +5 -0
- package/src/Plugins/PluginAPI.ts +119 -0
- package/src/Plugins/PluginRegistry.ts +132 -0
- package/src/Plugins/index.ts +3 -0
- package/src/Queries/QueryEngine.ts +152 -0
- package/src/Queries/index.ts +1 -0
- package/src/RenderPipeline/RenderPipeline.ts +125 -0
- package/src/RenderPipeline/RenderTree.ts +134 -0
- package/src/RenderPipeline/index.ts +4 -0
- package/src/Semantic/SemanticAnalyzer.ts +506 -0
- package/src/Semantic/index.ts +2 -0
- package/src/Symbols/SymbolTable.ts +124 -0
- package/src/Symbols/index.ts +1 -0
- package/src/Syntax/GreenNode.ts +324 -0
- package/src/Syntax/GreenNodePool.ts +269 -0
- package/src/Syntax/NodeMatcher.ts +370 -0
- package/src/Syntax/RedNode.ts +569 -0
- package/src/Syntax/RedNodeStore.ts +184 -0
- package/src/Syntax/TreeBuilder.ts +214 -0
- package/src/Syntax/__tests__/GreenNode.test.ts +33 -0
- package/src/Syntax/__tests__/RedNode.test.ts +81 -0
- package/src/Syntax/__tests__/RedNodeStore.test.ts +104 -0
- package/src/Syntax/greenEdit.ts +110 -0
- package/src/Syntax/hash.ts +30 -0
- package/src/Syntax/index.ts +12 -0
- package/src/Syntax/partition.ts +161 -0
- package/src/Syntax/preserveNodeIds.ts +201 -0
- package/src/Tests/ASTOptimizerIdempotence.test.ts +77 -0
- package/src/Tests/BlockPatcher.test.ts +437 -0
- package/src/Tests/BlockPatcherWindowed.test.ts +364 -0
- package/src/Tests/BoxDrawer.test.ts +217 -0
- package/src/Tests/BoxRichTitle.test.ts +105 -0
- package/src/Tests/Chars500kBenchmark.test.ts +151 -0
- package/src/Tests/Chars500kEdits.test.ts +321 -0
- package/src/Tests/CollabPositions.test.ts +146 -0
- package/src/Tests/CompilerPathProfiling.test.ts +186 -0
- package/src/Tests/DOMMorpher.test.ts +142 -0
- package/src/Tests/DomPatchPerf.test.ts +60 -0
- package/src/Tests/EffectSegments.snapshot.json +616 -0
- package/src/Tests/EffectSegments.test.ts +68 -0
- package/src/Tests/FindNodeAtOffset.test.ts +65 -0
- package/src/Tests/Fuzzer.test.ts +166 -0
- package/src/Tests/GreenNodePool.test.ts +153 -0
- package/src/Tests/Lexer.test.ts +238 -0
- package/src/Tests/LyneMode.test.ts +187 -0
- package/src/Tests/ModelCoherence.test.ts +180 -0
- package/src/Tests/Partition.test.ts +238 -0
- package/src/Tests/PluginTags.test.ts +150 -0
- package/src/Tests/ProblematicSection.test.ts +46 -0
- package/src/Tests/ProblematicSectionHTML.test.ts +58 -0
- package/src/Tests/RedReuse.test.ts +134 -0
- package/src/Tests/ReproDelete20k.test.ts +62 -0
- package/src/Tests/SemanticValidators.test.ts +136 -0
- package/src/Tests/StableNodeIds.test.ts +210 -0
- package/src/Tests/StudioColorBloat.test.ts +25 -0
- package/src/Tests/StudioDebugText.test.ts +27 -0
- package/src/Tests/StudioTrailingChar.test.ts +25 -0
- package/src/Tests/StudioValidText.test.ts +25 -0
- package/src/Tests/UrlImgBug.test.ts +23 -0
- package/src/Tests/VisualBuilderFidelity.test.ts +105 -0
- package/src/Tests/referenceDocument.ts +119 -0
- package/src/Transactions/Transaction.ts +176 -0
- package/src/Transactions/UndoManager.ts +111 -0
- package/src/Transactions/index.ts +3 -0
- package/src/Transformers/ASTOptimizer.ts +315 -0
- package/src/Transformers/GradientTransformer.ts +143 -0
- package/src/Transformers/GrowTransformer.ts +115 -0
- package/src/Transformers/RainbowTransformer.ts +121 -0
- package/src/Transformers/SineWaveTransformer.ts +130 -0
- package/src/Transformers/Transformer.ts +22 -0
- package/src/Types/core.ts +270 -0
- package/src/Types/diagnostics.ts +156 -0
- package/src/Types/index.ts +23 -0
- package/src/Types/operations.ts +180 -0
- package/src/Types/queries.ts +121 -0
- package/src/Types/symbols.ts +69 -0
- package/src/Types/tokens.ts +186 -0
- package/src/Utils/BBCodeGenerator.ts +126 -0
- package/src/Utils/ColorMath.ts +276 -0
- package/src/Utils/color.ts +112 -0
- package/src/Utils/dom-to-svg.test.ts +86 -0
- package/src/Utils/dom-to-svg.ts +615 -0
- package/src/Utils/treeTransformers.ts +717 -0
- package/src/Visitors/BBBlocksExporter.ts +69 -0
- package/src/Visitors/BBCodeExporter.ts +318 -0
- package/src/Visitors/BlockPatcher.ts +963 -0
- package/src/Visitors/DOMMorpher.ts +134 -0
- package/src/Visitors/HTMLRenderer.ts +1077 -0
- package/src/Visitors/JSONExporter.ts +66 -0
- package/src/Visitors/MarkdownExporter.ts +99 -0
- package/src/Visitors/SVGRenderer.ts +35 -0
- package/src/Visitors/TiptapExporter.ts +145 -0
- package/src/Visitors/Visitor.ts +48 -0
- package/src/Visitors/index.ts +9 -0
- package/src/Visuals/BoxDrawer.ts +175 -0
- package/src/Visuals/index.ts +42 -0
- package/src/Visuals/lyne.css +1027 -0
- package/src/Visuals/osu.css +257 -0
- package/src/index.ts +197 -0
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
import { GreenNode, greenNode, greenLeaf } from '../Syntax/GreenNode';
|
|
2
|
+
import { RedNode } from '../Syntax/RedNode';
|
|
3
|
+
import type { NodeKind } from '../Types/core';
|
|
4
|
+
import type { MarkdownNode, MarkdownText } from './MarkdownAST';
|
|
5
|
+
|
|
6
|
+
export function markdownAstToGreenTree(root: MarkdownNode): GreenNode {
|
|
7
|
+
let currentOffset = 0;
|
|
8
|
+
|
|
9
|
+
function convert(node: MarkdownNode): GreenNode {
|
|
10
|
+
const start = currentOffset;
|
|
11
|
+
const children: GreenNode[] = [];
|
|
12
|
+
let kind: NodeKind = 'document';
|
|
13
|
+
let text = '';
|
|
14
|
+
|
|
15
|
+
switch (node.type) {
|
|
16
|
+
case 'document':
|
|
17
|
+
kind = 'document';
|
|
18
|
+
for (const child of node.children) children.push(convert(child));
|
|
19
|
+
break;
|
|
20
|
+
case 'paragraph':
|
|
21
|
+
kind = 'text'; // DocumentEngine paragraphs are usually groups or blocks, treating as paragraph block if we want.
|
|
22
|
+
// Actually DocumentEngine uses 'text' or 'group'
|
|
23
|
+
kind = 'document'; // Let's use group or document as container
|
|
24
|
+
for (const child of node.children) children.push(convert(child));
|
|
25
|
+
break;
|
|
26
|
+
case 'heading':
|
|
27
|
+
kind = 'heading';
|
|
28
|
+
// Faking the '#' text length for the heading level offset
|
|
29
|
+
currentOffset += node.level;
|
|
30
|
+
text = `=${node.level}`; // Use text as metadata like BBCode
|
|
31
|
+
for (const child of node.children) children.push(convert(child));
|
|
32
|
+
break;
|
|
33
|
+
case 'strong':
|
|
34
|
+
kind = 'bold';
|
|
35
|
+
for (const child of node.children) children.push(convert(child));
|
|
36
|
+
break;
|
|
37
|
+
case 'emphasis':
|
|
38
|
+
kind = 'italic';
|
|
39
|
+
for (const child of node.children) children.push(convert(child));
|
|
40
|
+
break;
|
|
41
|
+
case 'text':
|
|
42
|
+
kind = 'text';
|
|
43
|
+
text = node.value;
|
|
44
|
+
currentOffset += text.length;
|
|
45
|
+
break;
|
|
46
|
+
case 'link':
|
|
47
|
+
kind = 'url';
|
|
48
|
+
text = `=${node.url}`;
|
|
49
|
+
for (const child of node.children) children.push(convert(child));
|
|
50
|
+
break;
|
|
51
|
+
case 'image':
|
|
52
|
+
kind = 'image';
|
|
53
|
+
text = node.url;
|
|
54
|
+
currentOffset += text.length;
|
|
55
|
+
break;
|
|
56
|
+
case 'code_block':
|
|
57
|
+
kind = 'code';
|
|
58
|
+
children.push(greenLeaf('text', node.value));
|
|
59
|
+
currentOffset += node.value.length;
|
|
60
|
+
break;
|
|
61
|
+
case 'list':
|
|
62
|
+
kind = 'list';
|
|
63
|
+
for (const child of node.children) children.push(convert(child));
|
|
64
|
+
break;
|
|
65
|
+
case 'list_item':
|
|
66
|
+
kind = 'list_item';
|
|
67
|
+
for (const child of node.children) children.push(convert(child));
|
|
68
|
+
break;
|
|
69
|
+
case 'spoiler':
|
|
70
|
+
kind = 'spoiler';
|
|
71
|
+
for (const child of node.children) children.push(convert(child));
|
|
72
|
+
break;
|
|
73
|
+
case 'notice':
|
|
74
|
+
kind = 'notice';
|
|
75
|
+
for (const child of node.children) children.push(convert(child));
|
|
76
|
+
break;
|
|
77
|
+
case 'blockquote':
|
|
78
|
+
kind = 'quote';
|
|
79
|
+
for (const child of node.children) children.push(convert(child));
|
|
80
|
+
break;
|
|
81
|
+
case 'spacing':
|
|
82
|
+
kind = 'spacing';
|
|
83
|
+
text = '\n';
|
|
84
|
+
currentOffset += 1;
|
|
85
|
+
break;
|
|
86
|
+
case 'empty_line':
|
|
87
|
+
kind = 'empty_line';
|
|
88
|
+
text = '\n\n';
|
|
89
|
+
currentOffset += 2;
|
|
90
|
+
break;
|
|
91
|
+
// `image` and `code_inline` used to land in `default`, which discarded
|
|
92
|
+
// them as empty text nodes — Markdown images never survived conversion.
|
|
93
|
+
case 'image':
|
|
94
|
+
kind = 'image';
|
|
95
|
+
text = `=${node.url}`;
|
|
96
|
+
if (node.alt) {
|
|
97
|
+
children.push(greenLeaf('text', node.alt));
|
|
98
|
+
currentOffset += node.alt.length;
|
|
99
|
+
}
|
|
100
|
+
break;
|
|
101
|
+
case 'code_inline':
|
|
102
|
+
kind = 'inline_code';
|
|
103
|
+
children.push(greenLeaf('text', node.value));
|
|
104
|
+
currentOffset += node.value.length;
|
|
105
|
+
break;
|
|
106
|
+
default: {
|
|
107
|
+
// Exhaustiveness guard: adding a MarkdownNode variant without a case
|
|
108
|
+
// here is now a compile error rather than a silently dropped node.
|
|
109
|
+
const unhandled: never = node;
|
|
110
|
+
void unhandled;
|
|
111
|
+
kind = 'text';
|
|
112
|
+
break;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
const end = currentOffset;
|
|
117
|
+
// Map text container to group for proper DocumentEngine representation if not text
|
|
118
|
+
const actualKind = kind === 'document' && node.type === 'paragraph' ? 'group' : kind;
|
|
119
|
+
return greenNode(actualKind as string, text, children);
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
return convert(root);
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
export function greenToRedNode(green: GreenNode, parent?: RedNode | null): RedNode {
|
|
126
|
+
// Simple metadata extraction based on heading text
|
|
127
|
+
let metadata: Record<string, unknown> = {};
|
|
128
|
+
if (green.kind === 'heading' && green.text.startsWith('=')) {
|
|
129
|
+
metadata = { level: parseInt(green.text.slice(1)) || 1 };
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
const red = new RedNode(green, {
|
|
133
|
+
parent: parent ?? null,
|
|
134
|
+
kind: (green.kind as NodeKind) || 'text',
|
|
135
|
+
metadata
|
|
136
|
+
});
|
|
137
|
+
|
|
138
|
+
const greenChildren = green.children as GreenNode[];
|
|
139
|
+
if (greenChildren.length > 0) {
|
|
140
|
+
const kids: RedNode[] = new Array(greenChildren.length);
|
|
141
|
+
for (let i = 0; i < greenChildren.length; i++) {
|
|
142
|
+
kids[i] = greenToRedNode(greenChildren[i], red);
|
|
143
|
+
}
|
|
144
|
+
red.initChildren(kids);
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
return red;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
export function markdownAstToRedTree(root: MarkdownNode): RedNode {
|
|
151
|
+
const green = markdownAstToGreenTree(root);
|
|
152
|
+
return greenToRedNode(green);
|
|
153
|
+
}
|