@taliesinb/mash 0.0.0-stage → 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.
- package/LICENSE +21 -0
- package/README.md +275 -2
- package/bin/mash.ts +253 -0
- package/dist/bin/mash.d.ts +39 -0
- package/dist/bin/mash.d.ts.map +1 -0
- package/dist/bin/mash.js +281 -0
- package/dist/bin/mash.js.map +1 -0
- package/dist/src/analysis/analyze.d.ts +97 -0
- package/dist/src/analysis/analyze.d.ts.map +1 -0
- package/dist/src/analysis/analyze.js +1406 -0
- package/dist/src/analysis/analyze.js.map +1 -0
- package/dist/src/analysis/fs.d.ts +39 -0
- package/dist/src/analysis/fs.d.ts.map +1 -0
- package/dist/src/analysis/fs.js +117 -0
- package/dist/src/analysis/fs.js.map +1 -0
- package/dist/src/analysis/outputs.d.ts +16 -0
- package/dist/src/analysis/outputs.d.ts.map +1 -0
- package/dist/src/analysis/outputs.js +277 -0
- package/dist/src/analysis/outputs.js.map +1 -0
- package/dist/src/analysis/value.d.ts +76 -0
- package/dist/src/analysis/value.d.ts.map +1 -0
- package/dist/src/analysis/value.js +248 -0
- package/dist/src/analysis/value.js.map +1 -0
- package/dist/src/behaviors/defs/core.d.ts +15 -0
- package/dist/src/behaviors/defs/core.d.ts.map +1 -0
- package/dist/src/behaviors/defs/core.js +1084 -0
- package/dist/src/behaviors/defs/core.js.map +1 -0
- package/dist/src/behaviors/defs/devtools.d.ts +9 -0
- package/dist/src/behaviors/defs/devtools.d.ts.map +1 -0
- package/dist/src/behaviors/defs/devtools.js +432 -0
- package/dist/src/behaviors/defs/devtools.js.map +1 -0
- package/dist/src/behaviors/defs/macos.d.ts +12 -0
- package/dist/src/behaviors/defs/macos.d.ts.map +1 -0
- package/dist/src/behaviors/defs/macos.js +454 -0
- package/dist/src/behaviors/defs/macos.js.map +1 -0
- package/dist/src/behaviors/defs/tools.d.ts +9 -0
- package/dist/src/behaviors/defs/tools.d.ts.map +1 -0
- package/dist/src/behaviors/defs/tools.js +639 -0
- package/dist/src/behaviors/defs/tools.js.map +1 -0
- package/dist/src/behaviors/dsl.d.ts +95 -0
- package/dist/src/behaviors/dsl.d.ts.map +1 -0
- package/dist/src/behaviors/dsl.js +267 -0
- package/dist/src/behaviors/dsl.js.map +1 -0
- package/dist/src/behaviors/index.d.ts +12 -0
- package/dist/src/behaviors/index.d.ts.map +1 -0
- package/dist/src/behaviors/index.js +18 -0
- package/dist/src/behaviors/index.js.map +1 -0
- package/dist/src/behaviors/registry.d.ts +45 -0
- package/dist/src/behaviors/registry.d.ts.map +1 -0
- package/dist/src/behaviors/registry.js +266 -0
- package/dist/src/behaviors/registry.js.map +1 -0
- package/dist/src/behaviors/roles.d.ts +29 -0
- package/dist/src/behaviors/roles.d.ts.map +1 -0
- package/dist/src/behaviors/roles.js +198 -0
- package/dist/src/behaviors/roles.js.map +1 -0
- package/dist/src/behaviors/types.d.ts +120 -0
- package/dist/src/behaviors/types.d.ts.map +1 -0
- package/dist/src/behaviors/types.js +12 -0
- package/dist/src/behaviors/types.js.map +1 -0
- package/dist/src/index.d.ts +27 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +24 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/integrations/deepsea.d.ts +121 -0
- package/dist/src/integrations/deepsea.d.ts.map +1 -0
- package/dist/src/integrations/deepsea.js +199 -0
- package/dist/src/integrations/deepsea.js.map +1 -0
- package/dist/src/machine.d.ts +139 -0
- package/dist/src/machine.d.ts.map +1 -0
- package/dist/src/machine.js +400 -0
- package/dist/src/machine.js.map +1 -0
- package/dist/src/parser/ast.d.ts +369 -0
- package/dist/src/parser/ast.d.ts.map +1 -0
- package/dist/src/parser/ast.js +17 -0
- package/dist/src/parser/ast.js.map +1 -0
- package/dist/src/parser/parser.d.ts +48 -0
- package/dist/src/parser/parser.d.ts.map +1 -0
- package/dist/src/parser/parser.js +1950 -0
- package/dist/src/parser/parser.js.map +1 -0
- package/dist/src/policy/effects.d.ts +86 -0
- package/dist/src/policy/effects.d.ts.map +1 -0
- package/dist/src/policy/effects.js +53 -0
- package/dist/src/policy/effects.js.map +1 -0
- package/dist/src/policy/policy.d.ts +130 -0
- package/dist/src/policy/policy.d.ts.map +1 -0
- package/dist/src/policy/policy.js +532 -0
- package/dist/src/policy/policy.js.map +1 -0
- package/dist/src/printer/doc.d.ts +151 -0
- package/dist/src/printer/doc.d.ts.map +1 -0
- package/dist/src/printer/doc.js +409 -0
- package/dist/src/printer/doc.js.map +1 -0
- package/dist/src/printer/highlight.d.ts +53 -0
- package/dist/src/printer/highlight.d.ts.map +1 -0
- package/dist/src/printer/highlight.js +339 -0
- package/dist/src/printer/highlight.js.map +1 -0
- package/dist/src/printer/html.d.ts +72 -0
- package/dist/src/printer/html.d.ts.map +1 -0
- package/dist/src/printer/html.js +423 -0
- package/dist/src/printer/html.js.map +1 -0
- package/dist/src/printer/print.d.ts +63 -0
- package/dist/src/printer/print.d.ts.map +1 -0
- package/dist/src/printer/print.js +484 -0
- package/dist/src/printer/print.js.map +1 -0
- package/dist/src/printer/summary.d.ts +50 -0
- package/dist/src/printer/summary.d.ts.map +1 -0
- package/dist/src/printer/summary.js +621 -0
- package/dist/src/printer/summary.js.map +1 -0
- package/dist/src/trace/events.d.ts +183 -0
- package/dist/src/trace/events.d.ts.map +1 -0
- package/dist/src/trace/events.js +9 -0
- package/dist/src/trace/events.js.map +1 -0
- package/dist/src/trace/progress.d.ts +58 -0
- package/dist/src/trace/progress.d.ts.map +1 -0
- package/dist/src/trace/progress.js +83 -0
- package/dist/src/trace/progress.js.map +1 -0
- package/dist/src/vm/arith.d.ts +29 -0
- package/dist/src/vm/arith.d.ts.map +1 -0
- package/dist/src/vm/arith.js +258 -0
- package/dist/src/vm/arith.js.map +1 -0
- package/dist/src/vm/builtins.d.ts +31 -0
- package/dist/src/vm/builtins.d.ts.map +1 -0
- package/dist/src/vm/builtins.js +1773 -0
- package/dist/src/vm/builtins.js.map +1 -0
- package/dist/src/vm/emulate.d.ts +75 -0
- package/dist/src/vm/emulate.d.ts.map +1 -0
- package/dist/src/vm/emulate.js +380 -0
- package/dist/src/vm/emulate.js.map +1 -0
- package/dist/src/vm/expand.d.ts +68 -0
- package/dist/src/vm/expand.d.ts.map +1 -0
- package/dist/src/vm/expand.js +744 -0
- package/dist/src/vm/expand.js.map +1 -0
- package/dist/src/vm/external.d.ts +34 -0
- package/dist/src/vm/external.d.ts.map +1 -0
- package/dist/src/vm/external.js +228 -0
- package/dist/src/vm/external.js.map +1 -0
- package/dist/src/vm/fifo.d.ts +66 -0
- package/dist/src/vm/fifo.d.ts.map +1 -0
- package/dist/src/vm/fifo.js +232 -0
- package/dist/src/vm/fifo.js.map +1 -0
- package/dist/src/vm/interp.d.ts +209 -0
- package/dist/src/vm/interp.d.ts.map +1 -0
- package/dist/src/vm/interp.js +1641 -0
- package/dist/src/vm/interp.js.map +1 -0
- package/dist/src/vm/io.d.ts +180 -0
- package/dist/src/vm/io.d.ts.map +1 -0
- package/dist/src/vm/io.js +502 -0
- package/dist/src/vm/io.js.map +1 -0
- package/dist/src/vm/pattern.d.ts +46 -0
- package/dist/src/vm/pattern.d.ts.map +1 -0
- package/dist/src/vm/pattern.js +498 -0
- package/dist/src/vm/pattern.js.map +1 -0
- package/dist/src/vm/proc.d.ts +94 -0
- package/dist/src/vm/proc.d.ts.map +1 -0
- package/dist/src/vm/proc.js +130 -0
- package/dist/src/vm/proc.js.map +1 -0
- package/dist/src/vm/state.d.ts +104 -0
- package/dist/src/vm/state.d.ts.map +1 -0
- package/dist/src/vm/state.js +233 -0
- package/dist/src/vm/state.js.map +1 -0
- package/dist/src/vm/test.d.ts +11 -0
- package/dist/src/vm/test.d.ts.map +1 -0
- package/dist/src/vm/test.js +277 -0
- package/dist/src/vm/test.js.map +1 -0
- package/package.json +63 -4
- package/src/analysis/analyze.ts +1395 -0
- package/src/analysis/fs.ts +121 -0
- package/src/analysis/outputs.ts +242 -0
- package/src/analysis/value.ts +264 -0
- package/src/behaviors/defs/core.ts +970 -0
- package/src/behaviors/defs/devtools.ts +400 -0
- package/src/behaviors/defs/macos.ts +426 -0
- package/src/behaviors/defs/tools.ts +596 -0
- package/src/behaviors/dsl.ts +293 -0
- package/src/behaviors/index.ts +19 -0
- package/src/behaviors/registry.ts +261 -0
- package/src/behaviors/roles.ts +187 -0
- package/src/behaviors/types.ts +127 -0
- package/src/index.ts +27 -0
- package/src/integrations/deepsea.ts +259 -0
- package/src/machine.ts +483 -0
- package/src/parser/ast.ts +472 -0
- package/src/parser/parser.ts +1826 -0
- package/src/policy/effects.ts +102 -0
- package/src/policy/policy.ts +578 -0
- package/src/printer/doc.ts +454 -0
- package/src/printer/highlight.ts +283 -0
- package/src/printer/html.ts +441 -0
- package/src/printer/print.ts +528 -0
- package/src/printer/summary.ts +601 -0
- package/src/trace/events.ts +102 -0
- package/src/trace/progress.ts +119 -0
- package/src/vm/arith.ts +236 -0
- package/src/vm/builtins.ts +1590 -0
- package/src/vm/emulate.ts +337 -0
- package/src/vm/expand.ts +721 -0
- package/src/vm/external.ts +265 -0
- package/src/vm/fifo.ts +226 -0
- package/src/vm/interp.ts +1623 -0
- package/src/vm/io.ts +570 -0
- package/src/vm/pattern.ts +477 -0
- package/src/vm/proc.ts +147 -0
- package/src/vm/state.ts +267 -0
- package/src/vm/test.ts +253 -0
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A small Wadler/Prettier-style document IR and renderer, with three
|
|
3
|
+
* bash-specific extensions:
|
|
4
|
+
*
|
|
5
|
+
* - Two kinds of line break. `cont` separates words of one command and
|
|
6
|
+
* breaks as ` \` + newline (a line continuation). `nl` sits where bash
|
|
7
|
+
* accepts a bare newline (after `|`, `&&`, `;`, `then`, `do`, `{` …).
|
|
8
|
+
* - A here-document queue: a `heredoc` element is emitted after the next
|
|
9
|
+
* real newline (an `nl` or `hard` break, never a continuation), which is
|
|
10
|
+
* where bash reads here-doc bodies.
|
|
11
|
+
* - Line suffixes for trailing comments: written just before the next real
|
|
12
|
+
* newline, so `a # c` stays one line. Rendering a continuation while a
|
|
13
|
+
* comment is pending would comment out the backslash, so it throws.
|
|
14
|
+
*
|
|
15
|
+
* Indentation is written lazily (only before text), so the output never has
|
|
16
|
+
* trailing whitespace on blank lines.
|
|
17
|
+
*/
|
|
18
|
+
/** A truncatable atom (a word, comment or here-doc body) for the HTML renderer. */
|
|
19
|
+
export interface AtomInfo {
|
|
20
|
+
id: number;
|
|
21
|
+
kind: 'word' | 'hd' | 'cm';
|
|
22
|
+
/** Preference when choosing what to shorten (higher first); 0 = never. */
|
|
23
|
+
weight: number;
|
|
24
|
+
/** A path: shortened from the left, keeping its tail (`…/pages/395.html`). */
|
|
25
|
+
tail?: boolean;
|
|
26
|
+
}
|
|
27
|
+
export type Doc = string | Doc[]
|
|
28
|
+
/** Verbatim source text `source.slice(start, end)`. */
|
|
29
|
+
| {
|
|
30
|
+
t: 'src';
|
|
31
|
+
start: number;
|
|
32
|
+
end: number;
|
|
33
|
+
atom?: AtomInfo;
|
|
34
|
+
cls?: string;
|
|
35
|
+
}
|
|
36
|
+
/** Generated text with a highlight class (keywords, operators). */
|
|
37
|
+
| {
|
|
38
|
+
t: 'tok';
|
|
39
|
+
text: string;
|
|
40
|
+
cls: string;
|
|
41
|
+
} | {
|
|
42
|
+
t: 'group';
|
|
43
|
+
doc: Doc;
|
|
44
|
+
break?: boolean;
|
|
45
|
+
heredocBreaks?: boolean;
|
|
46
|
+
} | {
|
|
47
|
+
t: 'indent';
|
|
48
|
+
doc: Doc;
|
|
49
|
+
by: number;
|
|
50
|
+
} | {
|
|
51
|
+
t: 'line';
|
|
52
|
+
kind: 'cont' | 'nl' | 'hard';
|
|
53
|
+
flat: string;
|
|
54
|
+
blank?: boolean;
|
|
55
|
+
force?: boolean;
|
|
56
|
+
} | {
|
|
57
|
+
t: 'fill';
|
|
58
|
+
parts: Doc[];
|
|
59
|
+
} | {
|
|
60
|
+
t: 'ifBreak';
|
|
61
|
+
broken: Doc;
|
|
62
|
+
flat: Doc;
|
|
63
|
+
} | {
|
|
64
|
+
t: 'suffix';
|
|
65
|
+
doc: Doc;
|
|
66
|
+
} | {
|
|
67
|
+
t: 'breakParent';
|
|
68
|
+
} | {
|
|
69
|
+
t: 'heredoc';
|
|
70
|
+
start: number;
|
|
71
|
+
end: number;
|
|
72
|
+
terminator: string;
|
|
73
|
+
atom?: AtomInfo;
|
|
74
|
+
} | {
|
|
75
|
+
t: 'mark';
|
|
76
|
+
id: number;
|
|
77
|
+
doc: Doc;
|
|
78
|
+
};
|
|
79
|
+
export declare const group: (doc: Doc, brk?: boolean) => Doc;
|
|
80
|
+
/**
|
|
81
|
+
* A compound command's group: also breaks when it contains a here-doc, so the
|
|
82
|
+
* body is emitted before the closing keyword (bash stores a function or
|
|
83
|
+
* compound command before reading a body that follows its line).
|
|
84
|
+
*/
|
|
85
|
+
export declare const compoundGroup: (doc: Doc, brk?: boolean) => Doc;
|
|
86
|
+
export declare const indent: (doc: Doc, by: number) => Doc;
|
|
87
|
+
/** Word separator: ' ' flat, ' \' + newline broken. */
|
|
88
|
+
export declare const cont: Doc;
|
|
89
|
+
/** A continuation that always breaks (prefix assignments on their own lines). */
|
|
90
|
+
export declare const contForced: Doc;
|
|
91
|
+
/** A bare-newline break that prints `flat` when the group fits. */
|
|
92
|
+
export declare const nl: (flat?: string, blank?: boolean) => Doc;
|
|
93
|
+
/** Always a newline. */
|
|
94
|
+
export declare const hard: Doc;
|
|
95
|
+
export declare const blankLine: Doc;
|
|
96
|
+
export declare const fill: (parts: Doc[]) => Doc;
|
|
97
|
+
export declare const ifBreak: (broken: Doc, flat: Doc) => Doc;
|
|
98
|
+
/** Text written just before the next real newline (a trailing comment); breaks enclosing groups. */
|
|
99
|
+
export declare const suffix: (doc: Doc) => Doc;
|
|
100
|
+
export declare const heredoc: (start: number, end: number, terminator: string, atom?: AtomInfo) => Doc;
|
|
101
|
+
export declare const src: (start: number, end: number, atom?: AtomInfo, cls?: string) => Doc;
|
|
102
|
+
export declare const tok: (text: string, cls: string) => Doc;
|
|
103
|
+
export declare const mark: (id: number, doc: Doc) => Doc;
|
|
104
|
+
export declare function join(sep: Doc, docs: Doc[]): Doc[];
|
|
105
|
+
export interface RenderResult {
|
|
106
|
+
text: string;
|
|
107
|
+
/** Output range of every `mark`ed node. */
|
|
108
|
+
map: Map<number, {
|
|
109
|
+
start: number;
|
|
110
|
+
end: number;
|
|
111
|
+
}>;
|
|
112
|
+
/** The output as classified pieces, in order (for the HTML renderer). */
|
|
113
|
+
pieces: Piece[];
|
|
114
|
+
/** Where each atom's first line landed: output line, column and width. */
|
|
115
|
+
atoms: Map<number, {
|
|
116
|
+
line: number;
|
|
117
|
+
col: number;
|
|
118
|
+
width: number;
|
|
119
|
+
}>;
|
|
120
|
+
}
|
|
121
|
+
/** A piece of output: generated text, or verbatim source (`src`), possibly an atom shown through a display. */
|
|
122
|
+
export interface Piece {
|
|
123
|
+
text: string;
|
|
124
|
+
cls?: string;
|
|
125
|
+
src?: [number, number];
|
|
126
|
+
atom?: number;
|
|
127
|
+
}
|
|
128
|
+
/** How an atom is displayed (the HTML renderer's truncation): `text` is what is measured and shown. */
|
|
129
|
+
export interface AtomDisplay {
|
|
130
|
+
text: string;
|
|
131
|
+
parts: ({
|
|
132
|
+
kind: 'show' | 'hide';
|
|
133
|
+
start: number;
|
|
134
|
+
end: number;
|
|
135
|
+
} | {
|
|
136
|
+
kind: 'mark';
|
|
137
|
+
text: string;
|
|
138
|
+
})[];
|
|
139
|
+
}
|
|
140
|
+
export interface RenderContext {
|
|
141
|
+
source: string;
|
|
142
|
+
display?: Map<number, AtomDisplay>;
|
|
143
|
+
/**
|
|
144
|
+
* Smallest width each atom may be shortened to. When given, a group (or an
|
|
145
|
+
* argument) whose line fits with its atoms at these widths stays on one
|
|
146
|
+
* line instead of breaking: the caller then shortens the atoms to fit.
|
|
147
|
+
*/
|
|
148
|
+
minWidth?: Map<number, number>;
|
|
149
|
+
}
|
|
150
|
+
export declare function render(root: Doc, width: number, ctx: RenderContext): RenderResult;
|
|
151
|
+
//# sourceMappingURL=doc.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doc.d.ts","sourceRoot":"","sources":["../../../src/printer/doc.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,409 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A small Wadler/Prettier-style document IR and renderer, with three
|
|
3
|
+
* bash-specific extensions:
|
|
4
|
+
*
|
|
5
|
+
* - Two kinds of line break. `cont` separates words of one command and
|
|
6
|
+
* breaks as ` \` + newline (a line continuation). `nl` sits where bash
|
|
7
|
+
* accepts a bare newline (after `|`, `&&`, `;`, `then`, `do`, `{` …).
|
|
8
|
+
* - A here-document queue: a `heredoc` element is emitted after the next
|
|
9
|
+
* real newline (an `nl` or `hard` break, never a continuation), which is
|
|
10
|
+
* where bash reads here-doc bodies.
|
|
11
|
+
* - Line suffixes for trailing comments: written just before the next real
|
|
12
|
+
* newline, so `a # c` stays one line. Rendering a continuation while a
|
|
13
|
+
* comment is pending would comment out the backslash, so it throws.
|
|
14
|
+
*
|
|
15
|
+
* Indentation is written lazily (only before text), so the output never has
|
|
16
|
+
* trailing whitespace on blank lines.
|
|
17
|
+
*/
|
|
18
|
+
// ---------------------------------------------------------------------------
|
|
19
|
+
// Builders
|
|
20
|
+
// ---------------------------------------------------------------------------
|
|
21
|
+
export const group = (doc, brk = false) => ({ t: 'group', doc, break: brk });
|
|
22
|
+
/**
|
|
23
|
+
* A compound command's group: also breaks when it contains a here-doc, so the
|
|
24
|
+
* body is emitted before the closing keyword (bash stores a function or
|
|
25
|
+
* compound command before reading a body that follows its line).
|
|
26
|
+
*/
|
|
27
|
+
export const compoundGroup = (doc, brk = false) => ({ t: 'group', doc, break: brk, heredocBreaks: true });
|
|
28
|
+
export const indent = (doc, by) => ({ t: 'indent', doc, by });
|
|
29
|
+
/** Word separator: ' ' flat, ' \' + newline broken. */
|
|
30
|
+
export const cont = { t: 'line', kind: 'cont', flat: ' ' };
|
|
31
|
+
/** A continuation that always breaks (prefix assignments on their own lines). */
|
|
32
|
+
export const contForced = { t: 'line', kind: 'cont', flat: ' ', force: true };
|
|
33
|
+
/** A bare-newline break that prints `flat` when the group fits. */
|
|
34
|
+
export const nl = (flat = ' ', blank = false) => ({ t: 'line', kind: 'nl', flat, blank });
|
|
35
|
+
/** Always a newline. */
|
|
36
|
+
export const hard = { t: 'line', kind: 'hard', flat: '' };
|
|
37
|
+
export const blankLine = { t: 'line', kind: 'hard', flat: '', blank: true };
|
|
38
|
+
export const fill = (parts) => ({ t: 'fill', parts });
|
|
39
|
+
export const ifBreak = (broken, flat) => ({ t: 'ifBreak', broken, flat });
|
|
40
|
+
/** Text written just before the next real newline (a trailing comment); breaks enclosing groups. */
|
|
41
|
+
export const suffix = (doc) => [{ t: 'suffix', doc }, { t: 'breakParent' }];
|
|
42
|
+
export const heredoc = (start, end, terminator, atom) => ({ t: 'heredoc', start, end, terminator, atom });
|
|
43
|
+
export const src = (start, end, atom, cls) => ({ t: 'src', start, end, atom, cls });
|
|
44
|
+
export const tok = (text, cls) => ({ t: 'tok', text, cls });
|
|
45
|
+
export const mark = (id, doc) => ({ t: 'mark', id, doc });
|
|
46
|
+
export function join(sep, docs) {
|
|
47
|
+
const out = [];
|
|
48
|
+
docs.forEach((d, i) => {
|
|
49
|
+
if (i > 0)
|
|
50
|
+
out.push(sep);
|
|
51
|
+
out.push(d);
|
|
52
|
+
});
|
|
53
|
+
return out;
|
|
54
|
+
}
|
|
55
|
+
// ---------------------------------------------------------------------------
|
|
56
|
+
// Break propagation: hard lines and comments break every enclosing group
|
|
57
|
+
// ---------------------------------------------------------------------------
|
|
58
|
+
/** Returns [forces a break, contains a here-doc]. */
|
|
59
|
+
function propagate(doc) {
|
|
60
|
+
if (typeof doc === 'string')
|
|
61
|
+
return [false, false];
|
|
62
|
+
const all = (docs) => {
|
|
63
|
+
let brk = false;
|
|
64
|
+
let hd = false;
|
|
65
|
+
for (const d of docs) {
|
|
66
|
+
const [b, h] = propagate(d);
|
|
67
|
+
brk ||= b;
|
|
68
|
+
hd ||= h;
|
|
69
|
+
}
|
|
70
|
+
return [brk, hd];
|
|
71
|
+
};
|
|
72
|
+
if (Array.isArray(doc))
|
|
73
|
+
return all(doc);
|
|
74
|
+
switch (doc.t) {
|
|
75
|
+
case 'group': {
|
|
76
|
+
const [inner, hd] = propagate(doc.doc);
|
|
77
|
+
if (inner || (hd && doc.heredocBreaks))
|
|
78
|
+
doc.break = true;
|
|
79
|
+
return [inner || doc.break === true, hd];
|
|
80
|
+
}
|
|
81
|
+
case 'indent':
|
|
82
|
+
case 'mark':
|
|
83
|
+
return propagate(doc.doc);
|
|
84
|
+
case 'fill':
|
|
85
|
+
return all(doc.parts);
|
|
86
|
+
case 'ifBreak':
|
|
87
|
+
return all([doc.broken, doc.flat]);
|
|
88
|
+
case 'line':
|
|
89
|
+
return [doc.kind === 'hard', false];
|
|
90
|
+
case 'breakParent':
|
|
91
|
+
return [true, false];
|
|
92
|
+
case 'heredoc':
|
|
93
|
+
return [false, true];
|
|
94
|
+
default:
|
|
95
|
+
return [false, false];
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
/** Width of `s` up to its first newline, and whether it contains one. */
|
|
99
|
+
function measure(s) {
|
|
100
|
+
const i = s.indexOf('\n');
|
|
101
|
+
return i === -1 ? { width: s.length, multiline: false } : { width: i, multiline: true };
|
|
102
|
+
}
|
|
103
|
+
export function render(root, width, ctx) {
|
|
104
|
+
propagate(root);
|
|
105
|
+
const source = ctx.source;
|
|
106
|
+
/** The text a `src` element shows (its atom display when truncated). */
|
|
107
|
+
const srcText = (d) => {
|
|
108
|
+
const disp = d.atom ? ctx.display?.get(d.atom.id) : undefined;
|
|
109
|
+
return disp ? disp.text : source.slice(d.start, d.end);
|
|
110
|
+
};
|
|
111
|
+
const hasNewline = (doc) => {
|
|
112
|
+
if (typeof doc === 'string')
|
|
113
|
+
return doc.includes('\n');
|
|
114
|
+
if (Array.isArray(doc))
|
|
115
|
+
return doc.some(hasNewline);
|
|
116
|
+
switch (doc.t) {
|
|
117
|
+
case 'src': return srcText(doc).includes('\n');
|
|
118
|
+
case 'tok': return doc.text.includes('\n');
|
|
119
|
+
case 'group':
|
|
120
|
+
case 'indent':
|
|
121
|
+
case 'mark': return hasNewline(doc.doc);
|
|
122
|
+
case 'fill': return doc.parts.some(hasNewline);
|
|
123
|
+
case 'ifBreak': return hasNewline(doc.flat);
|
|
124
|
+
case 'line': return doc.kind === 'hard';
|
|
125
|
+
default: return false;
|
|
126
|
+
}
|
|
127
|
+
};
|
|
128
|
+
/**
|
|
129
|
+
* Does `next` (followed by the rest of the current line, from `rest`) fit in
|
|
130
|
+
* `avail` columns? Measures up to the first line break that will happen.
|
|
131
|
+
*/
|
|
132
|
+
const fitsExact = (next, rest, avail, mustBeFlat, compressed) => {
|
|
133
|
+
let remaining = avail;
|
|
134
|
+
const stack = [next];
|
|
135
|
+
let restIdx = rest.length - 1;
|
|
136
|
+
const text = (s) => {
|
|
137
|
+
const m = measure(s);
|
|
138
|
+
remaining -= m.width;
|
|
139
|
+
return m.multiline ? remaining >= 0 : null;
|
|
140
|
+
};
|
|
141
|
+
while (remaining >= 0) {
|
|
142
|
+
let cmd = stack.pop();
|
|
143
|
+
if (!cmd) {
|
|
144
|
+
if (restIdx < 0)
|
|
145
|
+
return true;
|
|
146
|
+
cmd = rest[restIdx--];
|
|
147
|
+
}
|
|
148
|
+
const { ind, mode, doc } = cmd;
|
|
149
|
+
if (typeof doc === 'string') {
|
|
150
|
+
const r = text(doc);
|
|
151
|
+
if (r !== null)
|
|
152
|
+
return r;
|
|
153
|
+
continue;
|
|
154
|
+
}
|
|
155
|
+
if (Array.isArray(doc)) {
|
|
156
|
+
for (let i = doc.length - 1; i >= 0; i--)
|
|
157
|
+
stack.push({ ind, mode, doc: doc[i] });
|
|
158
|
+
continue;
|
|
159
|
+
}
|
|
160
|
+
switch (doc.t) {
|
|
161
|
+
case 'src': {
|
|
162
|
+
const t = srcText(doc);
|
|
163
|
+
const min = compressed && doc.atom ? ctx.minWidth?.get(doc.atom.id) : undefined;
|
|
164
|
+
if (min !== undefined && !t.includes('\n')) {
|
|
165
|
+
remaining -= Math.min(t.length, min);
|
|
166
|
+
break;
|
|
167
|
+
}
|
|
168
|
+
const r = text(t);
|
|
169
|
+
if (r !== null)
|
|
170
|
+
return r;
|
|
171
|
+
break;
|
|
172
|
+
}
|
|
173
|
+
case 'tok': {
|
|
174
|
+
const r = text(doc.text);
|
|
175
|
+
if (r !== null)
|
|
176
|
+
return r;
|
|
177
|
+
break;
|
|
178
|
+
}
|
|
179
|
+
case 'group':
|
|
180
|
+
if (mustBeFlat && doc.break)
|
|
181
|
+
return false;
|
|
182
|
+
stack.push({ ind, mode: doc.break ? 'break' : mode, doc: doc.doc });
|
|
183
|
+
break;
|
|
184
|
+
case 'indent':
|
|
185
|
+
case 'mark':
|
|
186
|
+
stack.push({ ind, mode, doc: doc.doc });
|
|
187
|
+
break;
|
|
188
|
+
case 'fill':
|
|
189
|
+
for (let i = doc.parts.length - 1; i >= 0; i--)
|
|
190
|
+
stack.push({ ind, mode, doc: doc.parts[i] });
|
|
191
|
+
break;
|
|
192
|
+
case 'ifBreak':
|
|
193
|
+
stack.push({ ind, mode, doc: mode === 'break' ? doc.broken : doc.flat });
|
|
194
|
+
break;
|
|
195
|
+
case 'line':
|
|
196
|
+
if (doc.force) {
|
|
197
|
+
// a forced continuation (assignment lines): what follows must fit on the new line
|
|
198
|
+
remaining = width - ind;
|
|
199
|
+
break;
|
|
200
|
+
}
|
|
201
|
+
if (doc.kind === 'hard' || mode === 'break')
|
|
202
|
+
return true;
|
|
203
|
+
remaining -= doc.flat.length;
|
|
204
|
+
break;
|
|
205
|
+
default:
|
|
206
|
+
break;
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
return false;
|
|
210
|
+
};
|
|
211
|
+
/** Fits as is, or (when atoms may be shortened) with every atom at its minimum width. */
|
|
212
|
+
const fits = (next, rest, avail, mustBeFlat) =>
|
|
213
|
+
// compressed: keep 3 columns for what a break would add at the line end (` \\`, ` &&`, `; \\`)
|
|
214
|
+
fitsExact(next, rest, avail, mustBeFlat, false) || (ctx.minWidth !== undefined && fitsExact(next, rest, avail - 3, mustBeFlat, true));
|
|
215
|
+
/** Fits without shortening anything. */
|
|
216
|
+
const fitsAsIs = (next, rest, avail, mustBeFlat) => fitsExact(next, rest, avail, mustBeFlat, false);
|
|
217
|
+
let out = '';
|
|
218
|
+
let col = 0;
|
|
219
|
+
let line = 0;
|
|
220
|
+
let pendingIndent = null;
|
|
221
|
+
let suffixes = [];
|
|
222
|
+
let heredocs = [];
|
|
223
|
+
const pieces = [];
|
|
224
|
+
const atoms = new Map();
|
|
225
|
+
const map = new Map();
|
|
226
|
+
const openMarks = [];
|
|
227
|
+
const write = (s, meta = {}) => {
|
|
228
|
+
if (s === '')
|
|
229
|
+
return;
|
|
230
|
+
if (pendingIndent !== null) {
|
|
231
|
+
if (pendingIndent > 0) {
|
|
232
|
+
const pad = ' '.repeat(pendingIndent);
|
|
233
|
+
out += pad;
|
|
234
|
+
pieces.push({ text: pad });
|
|
235
|
+
}
|
|
236
|
+
col = pendingIndent;
|
|
237
|
+
pendingIndent = null;
|
|
238
|
+
}
|
|
239
|
+
for (const m of openMarks)
|
|
240
|
+
if (m.start === null)
|
|
241
|
+
m.start = out.length;
|
|
242
|
+
if (meta.atom !== undefined)
|
|
243
|
+
atoms.set(meta.atom, { line, col, width: measure(s).width });
|
|
244
|
+
out += s;
|
|
245
|
+
pieces.push({ text: s, ...meta });
|
|
246
|
+
const i = s.lastIndexOf('\n');
|
|
247
|
+
if (i === -1)
|
|
248
|
+
col += s.length;
|
|
249
|
+
else {
|
|
250
|
+
col = s.length - i - 1;
|
|
251
|
+
for (const ch of s)
|
|
252
|
+
if (ch === '\n')
|
|
253
|
+
line++;
|
|
254
|
+
}
|
|
255
|
+
};
|
|
256
|
+
const rawNewline = () => {
|
|
257
|
+
out += '\n';
|
|
258
|
+
pieces.push({ text: '\n' });
|
|
259
|
+
line++;
|
|
260
|
+
col = 0;
|
|
261
|
+
};
|
|
262
|
+
/** Write a document that holds only text (suffixes): src, tok, strings, arrays. */
|
|
263
|
+
const writeInline = (d) => {
|
|
264
|
+
if (typeof d === 'string')
|
|
265
|
+
write(d);
|
|
266
|
+
else if (Array.isArray(d))
|
|
267
|
+
d.forEach(writeInline);
|
|
268
|
+
else if (d.t === 'src')
|
|
269
|
+
write(srcText(d), { src: [d.start, d.end], atom: d.atom?.id, cls: d.cls });
|
|
270
|
+
else if (d.t === 'tok')
|
|
271
|
+
write(d.text, { cls: d.cls });
|
|
272
|
+
};
|
|
273
|
+
const newline = (ind, blank, kind) => {
|
|
274
|
+
if (kind === 'cont') {
|
|
275
|
+
if (suffixes.length > 0)
|
|
276
|
+
throw new Error('printer: a comment would swallow a line continuation');
|
|
277
|
+
write(' ');
|
|
278
|
+
write('\\', { cls: 'ct' });
|
|
279
|
+
rawNewline();
|
|
280
|
+
pendingIndent = ind;
|
|
281
|
+
return;
|
|
282
|
+
}
|
|
283
|
+
if (suffixes.length > 0) {
|
|
284
|
+
for (const sfx of suffixes)
|
|
285
|
+
writeInline(sfx);
|
|
286
|
+
suffixes = [];
|
|
287
|
+
}
|
|
288
|
+
rawNewline();
|
|
289
|
+
if (heredocs.length > 0) {
|
|
290
|
+
for (const h of heredocs) {
|
|
291
|
+
const body = srcText(h);
|
|
292
|
+
if (body !== '') {
|
|
293
|
+
write(body, { src: [h.start, h.end], atom: h.atom?.id, cls: 'hd' });
|
|
294
|
+
if (!body.endsWith('\n'))
|
|
295
|
+
rawNewline();
|
|
296
|
+
}
|
|
297
|
+
write(h.terminator, { cls: 'rd' });
|
|
298
|
+
rawNewline();
|
|
299
|
+
}
|
|
300
|
+
heredocs = [];
|
|
301
|
+
}
|
|
302
|
+
if (blank)
|
|
303
|
+
rawNewline();
|
|
304
|
+
pendingIndent = ind;
|
|
305
|
+
};
|
|
306
|
+
const stack = [{ ind: 0, mode: 'break', doc: root }];
|
|
307
|
+
const restCmds = () => stack.filter((s) => 'doc' in s);
|
|
308
|
+
while (stack.length > 0) {
|
|
309
|
+
const item = stack.pop();
|
|
310
|
+
if ('close' in item) {
|
|
311
|
+
const m = openMarks.pop();
|
|
312
|
+
map.set(m.id, { start: m.start ?? out.length, end: out.length });
|
|
313
|
+
continue;
|
|
314
|
+
}
|
|
315
|
+
if ('fillRest' in item) {
|
|
316
|
+
// [separator, content, separator, content, …]
|
|
317
|
+
const [sep, content, ...more] = item.fillRest;
|
|
318
|
+
if (content === undefined)
|
|
319
|
+
continue;
|
|
320
|
+
const pairFits = fits({ ind: item.ind, mode: 'flat', doc: [sep, content] }, [], width - col, true);
|
|
321
|
+
// Breaking only helps if the content then fits on its fresh line. A word
|
|
322
|
+
// that is too long anyway, or spans lines (a quoted multi-line string),
|
|
323
|
+
// stays attached: a ` \` there would only separate it from its flag.
|
|
324
|
+
const breakHelps = !pairFits && !hasNewline(content) && fitsAsIs({ ind: item.ind, mode: 'flat', doc: content }, [], width - item.ind, true);
|
|
325
|
+
if (more.length > 0)
|
|
326
|
+
stack.push({ fillRest: more, ind: item.ind });
|
|
327
|
+
stack.push({ ind: item.ind, mode: pairFits ? 'flat' : 'break', doc: content });
|
|
328
|
+
stack.push({ ind: item.ind, mode: breakHelps ? 'break' : 'flat', doc: sep });
|
|
329
|
+
continue;
|
|
330
|
+
}
|
|
331
|
+
const { ind, mode, doc } = item;
|
|
332
|
+
if (typeof doc === 'string') {
|
|
333
|
+
write(doc);
|
|
334
|
+
continue;
|
|
335
|
+
}
|
|
336
|
+
if (Array.isArray(doc)) {
|
|
337
|
+
for (let i = doc.length - 1; i >= 0; i--)
|
|
338
|
+
stack.push({ ind, mode, doc: doc[i] });
|
|
339
|
+
continue;
|
|
340
|
+
}
|
|
341
|
+
switch (doc.t) {
|
|
342
|
+
case 'src':
|
|
343
|
+
write(srcText(doc), { src: [doc.start, doc.end], atom: doc.atom?.id, cls: doc.cls });
|
|
344
|
+
break;
|
|
345
|
+
case 'tok':
|
|
346
|
+
write(doc.text, { cls: doc.cls });
|
|
347
|
+
break;
|
|
348
|
+
case 'group': {
|
|
349
|
+
let m = 'break';
|
|
350
|
+
if (!doc.break && (mode === 'flat' || fits({ ind, mode: 'flat', doc: doc.doc }, restCmds(), width - col, false)))
|
|
351
|
+
m = 'flat';
|
|
352
|
+
stack.push({ ind, mode: m, doc: doc.doc });
|
|
353
|
+
break;
|
|
354
|
+
}
|
|
355
|
+
case 'indent':
|
|
356
|
+
stack.push({ ind: ind + doc.by, mode, doc: doc.doc });
|
|
357
|
+
break;
|
|
358
|
+
case 'fill': {
|
|
359
|
+
if (doc.parts.length === 0)
|
|
360
|
+
break;
|
|
361
|
+
if (mode === 'flat') {
|
|
362
|
+
for (let i = doc.parts.length - 1; i >= 0; i--)
|
|
363
|
+
stack.push({ ind, mode, doc: doc.parts[i] });
|
|
364
|
+
break;
|
|
365
|
+
}
|
|
366
|
+
const [first, ...more] = doc.parts;
|
|
367
|
+
const firstFits = fits({ ind, mode: 'flat', doc: first }, [], width - col, true);
|
|
368
|
+
if (more.length > 0)
|
|
369
|
+
stack.push({ fillRest: more, ind });
|
|
370
|
+
stack.push({ ind, mode: firstFits ? 'flat' : 'break', doc: first });
|
|
371
|
+
break;
|
|
372
|
+
}
|
|
373
|
+
case 'ifBreak':
|
|
374
|
+
stack.push({ ind, mode, doc: mode === 'break' ? doc.broken : doc.flat });
|
|
375
|
+
break;
|
|
376
|
+
case 'line':
|
|
377
|
+
if (doc.kind !== 'hard' && !doc.force && mode === 'flat')
|
|
378
|
+
write(doc.flat, /[;&|]/.test(doc.flat) ? { cls: 'op' } : {});
|
|
379
|
+
else
|
|
380
|
+
newline(ind, doc.blank === true, doc.kind);
|
|
381
|
+
break;
|
|
382
|
+
case 'suffix':
|
|
383
|
+
suffixes.push(doc.doc);
|
|
384
|
+
break;
|
|
385
|
+
case 'breakParent':
|
|
386
|
+
break;
|
|
387
|
+
case 'heredoc':
|
|
388
|
+
heredocs.push(doc);
|
|
389
|
+
break;
|
|
390
|
+
case 'mark':
|
|
391
|
+
openMarks.push({ id: doc.id, start: null });
|
|
392
|
+
stack.push({ close: doc.id });
|
|
393
|
+
stack.push({ ind, mode, doc: doc.doc });
|
|
394
|
+
break;
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
for (const sfx of suffixes)
|
|
398
|
+
writeInline(sfx);
|
|
399
|
+
if (heredocs.length > 0)
|
|
400
|
+
newline(0, false, 'hard');
|
|
401
|
+
if (out.endsWith('\n')) {
|
|
402
|
+
out = out.slice(0, -1);
|
|
403
|
+
const last = pieces[pieces.length - 1];
|
|
404
|
+
if (last?.text === '\n')
|
|
405
|
+
pieces.pop();
|
|
406
|
+
}
|
|
407
|
+
return { text: out, map, pieces, atoms };
|
|
408
|
+
}
|
|
409
|
+
//# sourceMappingURL=doc.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doc.js","sourceRoot":"","sources":["../../../src/printer/doc.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Syntax classes for every character of a parsed script, from the AST (not
|
|
3
|
+
* regexes). Outer constructs are painted first and inner ones override, so
|
|
4
|
+
* `"$x"` as an argument is a string with a variable inside.
|
|
5
|
+
*
|
|
6
|
+
* Class names (short, semantic; styled by HTML_CSS in html.ts):
|
|
7
|
+
* kw keywords and grouping (`if`, `do`, `{`, `[[`)
|
|
8
|
+
* op control operators (`|`, `&&`, `;`, `;;`)
|
|
9
|
+
* cmd command names flag options (`-x`, `--long`)
|
|
10
|
+
* str quoted strings esc escapes (`\x`)
|
|
11
|
+
* var parameter expansions sub `$( )`, backquotes, `<( )`
|
|
12
|
+
* ar arithmetic num numbers in arithmetic
|
|
13
|
+
* asg assignment names rd redirections and here-doc delimiters
|
|
14
|
+
* hd here-doc bodies cm comments
|
|
15
|
+
* fn function names ct line continuations (`\`)
|
|
16
|
+
* dir directory arguments file file arguments, redirection targets
|
|
17
|
+
* re search patterns code program text (`sed`/`awk`/`jq` programs, `python -c`, `bash -c`)
|
|
18
|
+
* sc subcommands (`git status`, `npm run build`, `docker compose up`)
|
|
19
|
+
*
|
|
20
|
+
* Argument roles (`dir`, `file`, `re`, `code`, and `cmd` for nested commands
|
|
21
|
+
* such as `timeout 5 npx vitest`) come from the behavior definitions
|
|
22
|
+
* (src/behaviors/roles.ts); they recolor plain and quoted text but keep
|
|
23
|
+
* variables and substitutions inside the word.
|
|
24
|
+
*/
|
|
25
|
+
import type * as A from '../parser/ast.ts';
|
|
26
|
+
import type { ArgRole } from '../behaviors/types.ts';
|
|
27
|
+
export declare const CLASS_NAMES: readonly ["", "kw", "op", "cmd", "flag", "str", "esc", "var", "sub", "ar", "num", "asg", "rd", "hd", "cm", "fn", "dir", "file", "re", "code", "sc"];
|
|
28
|
+
export type ClassName = (typeof CLASS_NAMES)[number];
|
|
29
|
+
/** Roles of a simple command's words (aligned with `c.words`), from the behavior definitions. */
|
|
30
|
+
export declare function simpleCommandRoles(c: A.SimpleCommand): (ArgRole | undefined)[];
|
|
31
|
+
export declare class Highlight {
|
|
32
|
+
private readonly cls;
|
|
33
|
+
readonly source: string;
|
|
34
|
+
constructor(script: A.Script, source: string);
|
|
35
|
+
/** The class runs covering `[start, end)`. */
|
|
36
|
+
runs(start: number, end: number): {
|
|
37
|
+
text: string;
|
|
38
|
+
cls: ClassName;
|
|
39
|
+
}[];
|
|
40
|
+
/** Recolor the plain and quoted characters of a span. */
|
|
41
|
+
private recolor;
|
|
42
|
+
private paint;
|
|
43
|
+
private stmts;
|
|
44
|
+
private stmt;
|
|
45
|
+
private command;
|
|
46
|
+
private assign;
|
|
47
|
+
private redirect;
|
|
48
|
+
private word;
|
|
49
|
+
private parts;
|
|
50
|
+
private arith;
|
|
51
|
+
private cond;
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=highlight.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"highlight.d.ts","sourceRoot":"","sources":["../../../src/printer/highlight.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,KAAK,KAAK,CAAC,MAAM,kBAAkB,CAAA;AAG1C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAA;AAEpD,eAAO,MAAM,WAAW,qJAAsJ,CAAA;AAC9K,MAAM,MAAM,SAAS,GAAG,CAAC,OAAO,WAAW,CAAC,CAAC,MAAM,CAAC,CAAA;AAOpD,iGAAiG;AACjG,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,CAAC,CAAC,aAAa,GAAG,CAAC,OAAO,GAAG,SAAS,CAAC,EAAE,CAI9E;AAED,qBAAa,SAAS;IACpB,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAY;IAChC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;gBAEX,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM;IAO5C,8CAA8C;IAC9C,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,SAAS,CAAA;KAAE,EAAE;IAapE,yDAAyD;IACzD,OAAO,CAAC,OAAO;IAKf,OAAO,CAAC,KAAK;IAKb,OAAO,CAAC,KAAK;IAIb,OAAO,CAAC,IAAI;IAIZ,OAAO,CAAC,OAAO;IAyFf,OAAO,CAAC,MAAM;IAYd,OAAO,CAAC,QAAQ;IAehB,OAAO,CAAC,IAAI;IAKZ,OAAO,CAAC,KAAK;IAgDb,OAAO,CAAC,KAAK;IAcb,OAAO,CAAC,IAAI;CAUb"}
|