punctilio 3.9.3 → 3.11.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/.pre-commit-hooks.yaml +27 -0
- package/README.md +55 -2
- package/dist/cli.d.ts +21 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +346 -0
- package/dist/cli.js.map +1 -0
- package/dist/dashes.d.ts +2 -1
- package/dist/dashes.d.ts.map +1 -1
- package/dist/dashes.js +5 -3
- package/dist/dashes.js.map +1 -1
- package/dist/html.d.ts +44 -0
- package/dist/html.d.ts.map +1 -0
- package/dist/html.js +67 -0
- package/dist/html.js.map +1 -0
- package/dist/index.d.ts +0 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +18 -26
- package/dist/index.js.map +1 -1
- package/dist/markdown.d.ts +0 -4
- package/dist/markdown.d.ts.map +1 -1
- package/dist/markdown.js +2 -5
- package/dist/markdown.js.map +1 -1
- package/dist/prettier-plugin.d.ts +18 -0
- package/dist/prettier-plugin.d.ts.map +1 -0
- package/dist/prettier-plugin.js +52 -0
- package/dist/prettier-plugin.js.map +1 -0
- package/dist/quotes.d.ts +2 -1
- package/dist/quotes.d.ts.map +1 -1
- package/dist/quotes.js +4 -1
- package/dist/quotes.js.map +1 -1
- package/dist/rehype.d.ts +14 -36
- package/dist/rehype.d.ts.map +1 -1
- package/dist/rehype.js +14 -36
- package/dist/rehype.js.map +1 -1
- package/dist/remark.d.ts +0 -3
- package/dist/remark.d.ts.map +1 -1
- package/dist/remark.js +0 -7
- package/dist/remark.js.map +1 -1
- package/dist/symbols.d.ts.map +1 -1
- package/dist/symbols.js +6 -5
- package/dist/symbols.js.map +1 -1
- package/dist/utils.d.ts +26 -9
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +40 -9
- package/dist/utils.js.map +1 -1
- package/package.json +25 -2
- package/src/cli.ts +417 -0
- package/src/dashes.ts +25 -4
- package/src/html.ts +91 -0
- package/src/index.ts +20 -30
- package/src/markdown.ts +2 -7
- package/src/prettier-plugin.ts +61 -0
- package/src/quotes.ts +5 -2
- package/src/rehype.ts +14 -36
- package/src/remark.ts +0 -7
- package/src/symbols.ts +18 -5
- package/src/utils.ts +42 -9
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
- id: punctilio
|
|
2
|
+
name: punctilio
|
|
3
|
+
description: Apply punctilio typography transformations to Markdown and HTML files.
|
|
4
|
+
entry: punctilio
|
|
5
|
+
language: node
|
|
6
|
+
types_or: [markdown, html]
|
|
7
|
+
additional_dependencies:
|
|
8
|
+
- unified@^11.0.0
|
|
9
|
+
- remark-parse@^11.0.0
|
|
10
|
+
- remark-stringify@^11.0.0
|
|
11
|
+
- remark-gfm@^4.0.0
|
|
12
|
+
- rehype-parse@^9.0.0
|
|
13
|
+
- rehype-stringify@^10.0.0
|
|
14
|
+
|
|
15
|
+
- id: punctilio-check
|
|
16
|
+
name: punctilio (check)
|
|
17
|
+
description: Fail if punctilio would change any Markdown or HTML file (no writes).
|
|
18
|
+
entry: punctilio --check
|
|
19
|
+
language: node
|
|
20
|
+
types_or: [markdown, html]
|
|
21
|
+
additional_dependencies:
|
|
22
|
+
- unified@^11.0.0
|
|
23
|
+
- remark-parse@^11.0.0
|
|
24
|
+
- remark-stringify@^11.0.0
|
|
25
|
+
- remark-gfm@^4.0.0
|
|
26
|
+
- rehype-parse@^9.0.0
|
|
27
|
+
- rehype-stringify@^10.0.0
|
package/README.md
CHANGED
|
@@ -15,7 +15,7 @@ transform(`"It's a beautiful thing, the destruction of words..." -- 1984`);
|
|
|
15
15
|
// → “It’s a beautiful thing, the destruction of words…”—1984
|
|
16
16
|
```
|
|
17
17
|
|
|
18
|
-
`punctilio` accepts three input formats: text, Markdown, and HTML.
|
|
18
|
+
`punctilio` accepts three input formats: text, Markdown, and HTML. Use it as a library, a [CLI](#cli), a [pre-commit hook](#pre-commit), or—for a zero-friction install in any project that already runs Prettier—a [Prettier plugin](#prettier-plugin).
|
|
19
19
|
|
|
20
20
|
```bash
|
|
21
21
|
npm install punctilio
|
|
@@ -160,10 +160,63 @@ rehypePunctilio({
|
|
|
160
160
|
});
|
|
161
161
|
```
|
|
162
162
|
|
|
163
|
+
## Integrations
|
|
164
|
+
|
|
165
|
+
### Prettier plugin
|
|
166
|
+
|
|
167
|
+
Drop `punctilio` into any project that already uses [Prettier](https://prettier.io)—typography fixes ride along on every Prettier run, with no extra build step. The plugin extends Prettier’s Markdown parser, so Prettier keeps owning whitespace and Markdown layout while `punctilio` rewrites the prose inside.
|
|
168
|
+
|
|
169
|
+
```jsonc
|
|
170
|
+
// .prettierrc
|
|
171
|
+
{
|
|
172
|
+
"plugins": ["punctilio/prettier-plugin"]
|
|
173
|
+
}
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
```jsonc
|
|
177
|
+
// .punctiliorc.json (optional — same keys as the library options)
|
|
178
|
+
{
|
|
179
|
+
"punctuationStyle": "british",
|
|
180
|
+
"dashStyle": "british",
|
|
181
|
+
"nbsp": true
|
|
182
|
+
}
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
```bash
|
|
186
|
+
prettier --write 'docs/**/*.md'
|
|
187
|
+
# "Hello" -- world. → “Hello” – world.
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
Code spans, fenced code blocks, and inline HTML are left untouched. The plugin currently transforms Markdown (`*.md`, `*.mdx` via the markdown parser); for HTML files, use the [CLI](#cli) or the [`rehype` plugin](#works-with-html-doms-via-separation-boundaries) below.
|
|
191
|
+
|
|
192
|
+
### CLI
|
|
193
|
+
|
|
194
|
+
```bash
|
|
195
|
+
punctilio README.md 'docs/**/*.md' # format in place; globs expand internally
|
|
196
|
+
punctilio --check README.md # exit 1 if it would change anything
|
|
197
|
+
echo '"Hi" -- there' | punctilio - --type md
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
Subsequent runs skip files unchanged since the previous invocation via an incremental cache at `node_modules/.cache/punctilio/cache.json` (use `--no-cache` to disable, `--cache-location <path>` to override). Config is loaded from `.punctiliorc[.json|.yaml|.js]`, `punctilio.config.js`, or a `"punctilio"` key in `package.json` (via [`cosmiconfig`](https://github.com/cosmiconfig/cosmiconfig)); CLI flags override. A `.punctilioignore` (gitignore syntax) in cwd excludes matching files.
|
|
201
|
+
|
|
202
|
+
### pre-commit
|
|
203
|
+
|
|
204
|
+
A `.pre-commit-hooks.yaml` ships in the package, so [pre-commit](https://pre-commit.com) users can wire `punctilio` in directly:
|
|
205
|
+
|
|
206
|
+
```yaml
|
|
207
|
+
# .pre-commit-config.yaml
|
|
208
|
+
repos:
|
|
209
|
+
- repo: https://github.com/alexander-turner/punctilio
|
|
210
|
+
rev: v3.10.0
|
|
211
|
+
hooks:
|
|
212
|
+
- id: punctilio # rewrites *.md / *.html in place
|
|
213
|
+
- id: punctilio-check # or: fail without writing (CI-friendly)
|
|
214
|
+
```
|
|
215
|
+
|
|
163
216
|
|
|
164
217
|
## Notes
|
|
165
218
|
|
|
166
|
-
- Fully general prime mark conversion (e.g. <span class="no-formatting">5'10" → 5′10″</span>) requires semantic understanding to distinguish from closing quotes (e.g. `"Term 1"` should produce closing quotes). `punctilio` tracks quote balance to
|
|
219
|
+
- Fully general prime mark conversion (e.g. <span class="no-formatting">5'10" → 5′10″</span>) requires semantic understanding to distinguish from closing quotes (e.g. `"Term 1"` should produce closing quotes). `punctilio` heuristically tracks quote balance to distinguish a prime after a number from a closing quote (`"Term 1"`). Simpler libraries like `tipograph` 0.7.4 make more mistakes here.
|
|
167
220
|
- The `american` style follows the [Chicago Manual of Style](https://www.chicagomanualofstyle.org/):
|
|
168
221
|
- Periods and commas go inside quotation marks (“Hello,” she said.)
|
|
169
222
|
- Unspaced em-dashes between words (word—word)
|
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Command-line entry point: format Markdown and HTML files in place,
|
|
4
|
+
* or check whether they would be reformatted (for use as a pre-commit hook).
|
|
5
|
+
*
|
|
6
|
+
* @packageDocumentation
|
|
7
|
+
*/
|
|
8
|
+
interface CliIO {
|
|
9
|
+
stdin: AsyncIterable<string | Buffer>;
|
|
10
|
+
stdout: NodeJS.WritableStream;
|
|
11
|
+
stderr: NodeJS.WritableStream;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Runs the CLI with the given arguments and I/O streams.
|
|
15
|
+
*
|
|
16
|
+
* @returns Exit code: 0 if no changes (or all changes written),
|
|
17
|
+
* 1 if `--check` saw a file that would change, 2 for usage errors.
|
|
18
|
+
*/
|
|
19
|
+
export declare function runCli(args: string[], io: CliIO): Promise<number>;
|
|
20
|
+
export {};
|
|
21
|
+
//# sourceMappingURL=cli.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA;;;;;GAKG;AAsBH,UAAU,KAAK;IACb,KAAK,EAAE,aAAa,CAAC,MAAM,GAAG,MAAM,CAAC,CAAA;IACrC,MAAM,EAAE,MAAM,CAAC,cAAc,CAAA;IAC7B,MAAM,EAAE,MAAM,CAAC,cAAc,CAAA;CAC9B;AA4PD;;;;;GAKG;AACH,wBAAsB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,CAyBvE"}
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,346 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Command-line entry point: format Markdown and HTML files in place,
|
|
4
|
+
* or check whether they would be reformatted (for use as a pre-commit hook).
|
|
5
|
+
*
|
|
6
|
+
* @packageDocumentation
|
|
7
|
+
*/
|
|
8
|
+
import { createHash } from "node:crypto";
|
|
9
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
10
|
+
import { readFile, writeFile } from "node:fs/promises";
|
|
11
|
+
import { dirname, extname, isAbsolute, join, relative, resolve } from "node:path";
|
|
12
|
+
import { fileURLToPath } from "node:url";
|
|
13
|
+
import { Command, CommanderError, Option } from "commander";
|
|
14
|
+
import { cosmiconfig } from "cosmiconfig";
|
|
15
|
+
import ignore from "ignore";
|
|
16
|
+
import { glob } from "tinyglobby";
|
|
17
|
+
import { transformMarkdown } from "./markdown.js";
|
|
18
|
+
import { transformHtml } from "./html.js";
|
|
19
|
+
import { PUNCTUATION_STYLES } from "./quotes.js";
|
|
20
|
+
import { DASH_STYLES } from "./dashes.js";
|
|
21
|
+
import { stableStringify } from "./utils.js";
|
|
22
|
+
class UsageError extends Error {
|
|
23
|
+
}
|
|
24
|
+
const FILE_TYPES = ["md", "html"];
|
|
25
|
+
const EMPHASIS_MARKERS = ["*", "_"];
|
|
26
|
+
const BULLET_MARKERS = ["-", "*", "+"];
|
|
27
|
+
const RULE_MARKERS = ["-", "*", "_"];
|
|
28
|
+
const MARKDOWN_EXTENSIONS = new Set([".md", ".markdown"]);
|
|
29
|
+
const HTML_EXTENSIONS = new Set([".html", ".htm"]);
|
|
30
|
+
function buildProgram(version, io) {
|
|
31
|
+
return new Command()
|
|
32
|
+
.name("punctilio")
|
|
33
|
+
.description("Apply typographic improvements to Markdown and HTML files.")
|
|
34
|
+
.version(version, "-V, --version", "show version")
|
|
35
|
+
.argument("[files...]", "files to format (pass '-' to read from stdin)")
|
|
36
|
+
.option("--check", "exit 1 if any file would change; write nothing")
|
|
37
|
+
.option("--config <path>", "path to a punctilio config file (otherwise auto-discovered)")
|
|
38
|
+
.option("--no-config", "ignore any auto-discovered config file")
|
|
39
|
+
.option("--ignore-path <path>", "path to an ignore file (otherwise .punctilioignore in cwd)")
|
|
40
|
+
.option("--no-cache", "disable the incremental cache (default location node_modules/.cache/punctilio/cache.json)")
|
|
41
|
+
.option("--cache-location <path>", "override the cache file location")
|
|
42
|
+
.option("--stdin-filepath <path>", "treat stdin as if it were this filename (infers type from extension)")
|
|
43
|
+
.addOption(new Option("--type <type>", "force file type (otherwise inferred from extension)").choices(FILE_TYPES))
|
|
44
|
+
.addOption(new Option("--punctuation-style <style>", "quote and punctuation style").choices(PUNCTUATION_STYLES))
|
|
45
|
+
.addOption(new Option("--dash-style <style>", "dash style").choices(DASH_STYLES))
|
|
46
|
+
.option("--no-symbols", "disable symbol transforms (ellipsis, ×, ©, etc.)")
|
|
47
|
+
.option("--no-nbsp", "disable non-breaking space insertion")
|
|
48
|
+
.option("--no-collapse-spaces", "preserve runs of consecutive spaces")
|
|
49
|
+
.option("--no-arrows", "disable -> → arrow transforms")
|
|
50
|
+
.option("--fractions", "enable 1/2 → ½")
|
|
51
|
+
.option("--degrees", "enable 20 C → 20 °C")
|
|
52
|
+
.option("--superscript", "enable 1st → 1ˢᵗ")
|
|
53
|
+
.option("--ligatures", "enable !? → ⁉")
|
|
54
|
+
.addOption(new Option("--emphasis-marker <char>", "markdown emphasis character").choices(EMPHASIS_MARKERS))
|
|
55
|
+
.addOption(new Option("--strong-marker <char>", "markdown strong emphasis character").choices(EMPHASIS_MARKERS))
|
|
56
|
+
.addOption(new Option("--bullet-marker <char>", "markdown list bullet character").choices(BULLET_MARKERS))
|
|
57
|
+
.addOption(new Option("--rule-marker <char>", "markdown thematic break character").choices(RULE_MARKERS))
|
|
58
|
+
.option("--skip-tag <tag...>", "HTML tags whose contents are left alone (repeatable)")
|
|
59
|
+
.option("--skip-class <class...>", "HTML class names whose elements are skipped (repeatable)")
|
|
60
|
+
.option("--no-fragment", "parse input as a full HTML document")
|
|
61
|
+
.exitOverride()
|
|
62
|
+
.configureOutput({
|
|
63
|
+
writeOut: (str) => { io.stdout.write(str); },
|
|
64
|
+
writeErr: (str) => { io.stderr.write(str); },
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
function inferFileType(path, override) {
|
|
68
|
+
if (override !== undefined)
|
|
69
|
+
return override;
|
|
70
|
+
const ext = extname(path).toLowerCase();
|
|
71
|
+
if (MARKDOWN_EXTENSIONS.has(ext))
|
|
72
|
+
return "md";
|
|
73
|
+
if (HTML_EXTENSIONS.has(ext))
|
|
74
|
+
return "html";
|
|
75
|
+
throw new UsageError(`Cannot infer file type from extension "${ext}" for ${path}. Pass --type md|html.`);
|
|
76
|
+
}
|
|
77
|
+
// Config keys must match library option names (punctuationStyle, skipTags, …),
|
|
78
|
+
// not the kebab-cased CLI flag names.
|
|
79
|
+
async function loadConfig(cwd, configPath, disabled) {
|
|
80
|
+
if (disabled)
|
|
81
|
+
return {};
|
|
82
|
+
const explorer = cosmiconfig("punctilio");
|
|
83
|
+
const result = configPath ? await explorer.load(configPath) : await explorer.search(cwd);
|
|
84
|
+
if (!result || result.isEmpty)
|
|
85
|
+
return {};
|
|
86
|
+
return result.config;
|
|
87
|
+
}
|
|
88
|
+
function loadIgnore(cwd, ignorePath) {
|
|
89
|
+
const ig = ignore();
|
|
90
|
+
const effective = ignorePath ?? join(cwd, ".punctilioignore");
|
|
91
|
+
if (existsSync(effective))
|
|
92
|
+
ig.add(readFileSync(effective, "utf8"));
|
|
93
|
+
return ig;
|
|
94
|
+
}
|
|
95
|
+
function isGlobPattern(pattern) {
|
|
96
|
+
return /[*?[\]{}]/.test(pattern);
|
|
97
|
+
}
|
|
98
|
+
// Non-glob positionals pass through as literal paths so they error loudly
|
|
99
|
+
// if missing, matching the prior behavior of `punctilio file.md`.
|
|
100
|
+
async function discoverFiles(patterns, cwd, ig) {
|
|
101
|
+
const literals = patterns.filter((p) => !isGlobPattern(p));
|
|
102
|
+
const globs = patterns.filter(isGlobPattern);
|
|
103
|
+
const expanded = globs.length > 0
|
|
104
|
+
? await glob(globs, { cwd, absolute: true, onlyFiles: true })
|
|
105
|
+
: [];
|
|
106
|
+
const all = [...literals.map((p) => resolve(cwd, p)), ...expanded];
|
|
107
|
+
return all.filter((file) => {
|
|
108
|
+
const rel = relative(cwd, file);
|
|
109
|
+
return rel.startsWith("..") || !ig.ignores(rel);
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
const DEFAULT_CACHE_LOCATION = join("node_modules", ".cache", "punctilio", "cache.json");
|
|
113
|
+
function hashString(s) {
|
|
114
|
+
return createHash("sha256").update(s).digest("hex").slice(0, 16);
|
|
115
|
+
}
|
|
116
|
+
function hashOptions(opts) {
|
|
117
|
+
return hashString(stableStringify(opts));
|
|
118
|
+
}
|
|
119
|
+
function loadCache(location, stderr) {
|
|
120
|
+
if (!existsSync(location))
|
|
121
|
+
return { files: {} };
|
|
122
|
+
try {
|
|
123
|
+
const parsed = JSON.parse(readFileSync(location, "utf8"));
|
|
124
|
+
if (!parsed.files) {
|
|
125
|
+
stderr.write(`Warning: cache at ${location} is missing the "files" key; discarding.\n`);
|
|
126
|
+
return { files: {} };
|
|
127
|
+
}
|
|
128
|
+
// Drop absolute-path keys carried over from a pre-cwd-relative version
|
|
129
|
+
// of the cache. They never match modern lookups, so keeping them
|
|
130
|
+
// forever would just bloat the cache file on every save.
|
|
131
|
+
const files = {};
|
|
132
|
+
for (const [k, v] of Object.entries(parsed.files)) {
|
|
133
|
+
if (!isAbsolute(k))
|
|
134
|
+
files[k] = v;
|
|
135
|
+
}
|
|
136
|
+
return { files };
|
|
137
|
+
}
|
|
138
|
+
catch {
|
|
139
|
+
stderr.write(`Warning: cache at ${location} could not be parsed; discarding.\n`);
|
|
140
|
+
return { files: {} };
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
function saveCache(location, cache) {
|
|
144
|
+
mkdirSync(dirname(location), { recursive: true });
|
|
145
|
+
writeFileSync(location, JSON.stringify(cache));
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Cache key for a file. Always cwd-relative so a project that moves
|
|
149
|
+
* directories (or syncs the cache file across machines via the same
|
|
150
|
+
* repo layout) keeps hitting the cache. Files outside cwd appear as
|
|
151
|
+
* `../foo.md` and still hash consistently.
|
|
152
|
+
*/
|
|
153
|
+
function cacheKey(filePath, cwd) {
|
|
154
|
+
return relative(cwd, filePath);
|
|
155
|
+
}
|
|
156
|
+
function buildOptions(flags) {
|
|
157
|
+
const opts = {};
|
|
158
|
+
if (flags.punctuationStyle)
|
|
159
|
+
opts.punctuationStyle = flags.punctuationStyle;
|
|
160
|
+
if (flags.dashStyle)
|
|
161
|
+
opts.dashStyle = flags.dashStyle;
|
|
162
|
+
if (flags.symbols === false)
|
|
163
|
+
opts.symbols = false;
|
|
164
|
+
if (flags.nbsp === false)
|
|
165
|
+
opts.nbsp = false;
|
|
166
|
+
if (flags.collapseSpaces === false)
|
|
167
|
+
opts.collapseSpaces = false;
|
|
168
|
+
if (flags.arrows === false)
|
|
169
|
+
opts.includeArrows = false;
|
|
170
|
+
if (flags.fractions)
|
|
171
|
+
opts.fractions = true;
|
|
172
|
+
if (flags.degrees)
|
|
173
|
+
opts.degrees = true;
|
|
174
|
+
if (flags.superscript)
|
|
175
|
+
opts.superscript = true;
|
|
176
|
+
if (flags.ligatures)
|
|
177
|
+
opts.ligatures = true;
|
|
178
|
+
if (flags.emphasisMarker)
|
|
179
|
+
opts.emphasisMarker = flags.emphasisMarker;
|
|
180
|
+
if (flags.strongMarker)
|
|
181
|
+
opts.strongMarker = flags.strongMarker;
|
|
182
|
+
if (flags.bulletMarker)
|
|
183
|
+
opts.bulletMarker = flags.bulletMarker;
|
|
184
|
+
if (flags.ruleMarker)
|
|
185
|
+
opts.ruleMarker = flags.ruleMarker;
|
|
186
|
+
if (flags.skipTag)
|
|
187
|
+
opts.skipTags = flags.skipTag;
|
|
188
|
+
if (flags.skipClass)
|
|
189
|
+
opts.skipClasses = flags.skipClass;
|
|
190
|
+
if (flags.fragment === false)
|
|
191
|
+
opts.fragment = false;
|
|
192
|
+
return opts;
|
|
193
|
+
}
|
|
194
|
+
async function transformContent(input, type, opts) {
|
|
195
|
+
return type === "md" ? transformMarkdown(input, opts) : transformHtml(input, opts);
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Preserves whether the original file ends with a trailing newline.
|
|
199
|
+
* The unified pipelines for Markdown and HTML both unconditionally append
|
|
200
|
+
* one, so without this adjustment every file lacking a trailing newline
|
|
201
|
+
* would always appear as needing a rewrite.
|
|
202
|
+
*/
|
|
203
|
+
function matchTrailingNewline(original, formatted) {
|
|
204
|
+
const originalHas = original.endsWith("\n");
|
|
205
|
+
const formattedHas = formatted.endsWith("\n");
|
|
206
|
+
if (originalHas === formattedHas)
|
|
207
|
+
return formatted;
|
|
208
|
+
if (originalHas)
|
|
209
|
+
return formatted + "\n";
|
|
210
|
+
return formatted.replace(/\n$/, "");
|
|
211
|
+
}
|
|
212
|
+
async function readStdin(stdin) {
|
|
213
|
+
const chunks = [];
|
|
214
|
+
for await (const chunk of stdin) {
|
|
215
|
+
chunks.push(typeof chunk === "string" ? Buffer.from(chunk) : chunk);
|
|
216
|
+
}
|
|
217
|
+
return Buffer.concat(chunks).toString("utf8");
|
|
218
|
+
}
|
|
219
|
+
async function readPackageVersion() {
|
|
220
|
+
const pkgPath = new URL("../package.json", import.meta.url);
|
|
221
|
+
/* istanbul ignore next -- the catch only fires when package.json is missing or unreadable */
|
|
222
|
+
try {
|
|
223
|
+
const raw = await readFile(pkgPath, "utf8");
|
|
224
|
+
return JSON.parse(raw).version ?? "unknown";
|
|
225
|
+
}
|
|
226
|
+
catch {
|
|
227
|
+
return "unknown";
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* Runs the CLI with the given arguments and I/O streams.
|
|
232
|
+
*
|
|
233
|
+
* @returns Exit code: 0 if no changes (or all changes written),
|
|
234
|
+
* 1 if `--check` saw a file that would change, 2 for usage errors.
|
|
235
|
+
*/
|
|
236
|
+
export async function runCli(args, io) {
|
|
237
|
+
const version = await readPackageVersion();
|
|
238
|
+
const program = buildProgram(version, io);
|
|
239
|
+
try {
|
|
240
|
+
program.parse(args, { from: "user" });
|
|
241
|
+
}
|
|
242
|
+
catch (err) {
|
|
243
|
+
/* istanbul ignore if -- commander only throws CommanderError from parse */
|
|
244
|
+
if (!(err instanceof CommanderError))
|
|
245
|
+
throw err;
|
|
246
|
+
if (err.code === "commander.helpDisplayed" || err.code === "commander.version")
|
|
247
|
+
return 0;
|
|
248
|
+
return 2;
|
|
249
|
+
}
|
|
250
|
+
const flags = program.opts();
|
|
251
|
+
const positionals = program.args;
|
|
252
|
+
try {
|
|
253
|
+
return await runValidated(flags, positionals, io, program, version);
|
|
254
|
+
}
|
|
255
|
+
catch (err) {
|
|
256
|
+
if (err instanceof UsageError) {
|
|
257
|
+
io.stderr.write(`Error: ${err.message}\n`);
|
|
258
|
+
return 2;
|
|
259
|
+
}
|
|
260
|
+
throw err;
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
function readsStdin(positionals, flags) {
|
|
264
|
+
if (positionals.includes("-"))
|
|
265
|
+
return true;
|
|
266
|
+
return flags.stdinFilepath !== undefined && positionals.length === 0;
|
|
267
|
+
}
|
|
268
|
+
async function runValidated(flags, positionals, io, program, version) {
|
|
269
|
+
const cwd = process.cwd();
|
|
270
|
+
const config = await loadConfig(cwd, typeof flags.config === "string" ? flags.config : undefined, flags.config === false);
|
|
271
|
+
const opts = { ...config, ...buildOptions(flags) };
|
|
272
|
+
const check = flags.check ?? false;
|
|
273
|
+
if (readsStdin(positionals, flags)) {
|
|
274
|
+
const fileArgs = positionals.filter((p) => p !== "-");
|
|
275
|
+
if (fileArgs.length > 0) {
|
|
276
|
+
throw new UsageError("'-' cannot be combined with file arguments.");
|
|
277
|
+
}
|
|
278
|
+
const type = flags.type ?? (flags.stdinFilepath !== undefined ? inferFileType(flags.stdinFilepath) : undefined);
|
|
279
|
+
if (type === undefined) {
|
|
280
|
+
throw new UsageError("Reading from stdin requires --type md|html or --stdin-filepath <path>.");
|
|
281
|
+
}
|
|
282
|
+
const input = await readStdin(io.stdin);
|
|
283
|
+
const output = matchTrailingNewline(input, await transformContent(input, type, opts));
|
|
284
|
+
if (check)
|
|
285
|
+
return input === output ? 0 : 1;
|
|
286
|
+
io.stdout.write(output);
|
|
287
|
+
return 0;
|
|
288
|
+
}
|
|
289
|
+
if (positionals.length === 0) {
|
|
290
|
+
io.stderr.write(program.helpInformation());
|
|
291
|
+
return 2;
|
|
292
|
+
}
|
|
293
|
+
const ig = loadIgnore(cwd, flags.ignorePath);
|
|
294
|
+
const files = await discoverFiles(positionals, cwd, ig);
|
|
295
|
+
const cacheLocation = flags.cache === false
|
|
296
|
+
? undefined
|
|
297
|
+
: resolve(cwd, flags.cacheLocation ?? DEFAULT_CACHE_LOCATION);
|
|
298
|
+
const cache = cacheLocation ? loadCache(cacheLocation, io.stderr) : undefined;
|
|
299
|
+
const optionsHash = cache ? hashOptions(opts) : "";
|
|
300
|
+
let anyChanged = false;
|
|
301
|
+
for (const path of files) {
|
|
302
|
+
const type = inferFileType(path, flags.type);
|
|
303
|
+
const original = await readFile(path, "utf8");
|
|
304
|
+
const key = cache ? cacheKey(path, cwd) : "";
|
|
305
|
+
if (cache) {
|
|
306
|
+
const entry = cache.files[key];
|
|
307
|
+
if (entry !== undefined &&
|
|
308
|
+
entry.contentHash === hashString(original) &&
|
|
309
|
+
entry.optionsHash === optionsHash &&
|
|
310
|
+
entry.version === version)
|
|
311
|
+
continue;
|
|
312
|
+
}
|
|
313
|
+
const formatted = matchTrailingNewline(original, await transformContent(original, type, opts));
|
|
314
|
+
const unchanged = original === formatted;
|
|
315
|
+
if (!unchanged) {
|
|
316
|
+
anyChanged = true;
|
|
317
|
+
if (check) {
|
|
318
|
+
io.stderr.write(`Would reformat: ${path}\n`);
|
|
319
|
+
}
|
|
320
|
+
else {
|
|
321
|
+
await writeFile(path, formatted);
|
|
322
|
+
io.stdout.write(`Reformatted: ${path}\n`);
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
if (cache && (unchanged || !check)) {
|
|
326
|
+
cache.files[key] = { contentHash: hashString(formatted), optionsHash, version };
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
if (cacheLocation && cache)
|
|
330
|
+
saveCache(cacheLocation, cache);
|
|
331
|
+
return check && anyChanged ? 1 : 0;
|
|
332
|
+
}
|
|
333
|
+
/* istanbul ignore next -- entry-point bootstrap; logic is covered via runCli */
|
|
334
|
+
if (process.argv[1] && fileURLToPath(import.meta.url) === process.argv[1]) {
|
|
335
|
+
runCli(process.argv.slice(2), {
|
|
336
|
+
stdin: process.stdin,
|
|
337
|
+
stdout: process.stdout,
|
|
338
|
+
stderr: process.stderr,
|
|
339
|
+
})
|
|
340
|
+
.then((code) => process.exit(code))
|
|
341
|
+
.catch((err) => {
|
|
342
|
+
process.stderr.write(`Error: ${err.message}\n`);
|
|
343
|
+
process.exit(2);
|
|
344
|
+
});
|
|
345
|
+
}
|
|
346
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA;;;;;GAKG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AAC5E,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AACtD,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACjF,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAExC,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,WAAW,CAAA;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AACzC,OAAO,MAAuB,MAAM,QAAQ,CAAA;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAA;AAEjC,OAAO,EAAE,iBAAiB,EAAwB,MAAM,eAAe,CAAA;AACvE,OAAO,EAAE,aAAa,EAAoB,MAAM,WAAW,CAAA;AAC3D,OAAO,EAAE,kBAAkB,EAAyB,MAAM,aAAa,CAAA;AACvE,OAAO,EAAE,WAAW,EAAkB,MAAM,aAAa,CAAA;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAW5C,MAAM,UAAW,SAAQ,KAAK;CAAG;AAEjC,MAAM,UAAU,GAAG,CAAC,IAAI,EAAE,MAAM,CAAwC,CAAA;AACxE,MAAM,gBAAgB,GAAG,CAAC,GAAG,EAAE,GAAG,CAAU,CAAA;AAC5C,MAAM,cAAc,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAU,CAAA;AAC/C,MAAM,YAAY,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAU,CAAA;AAE7C,MAAM,mBAAmB,GAAG,IAAI,GAAG,CAAC,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC,CAAA;AACzD,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAA;AAkClD,SAAS,YAAY,CAAC,OAAe,EAAE,EAAS;IAC9C,OAAO,IAAI,OAAO,EAAE;SACjB,IAAI,CAAC,WAAW,CAAC;SACjB,WAAW,CAAC,4DAA4D,CAAC;SACzE,OAAO,CAAC,OAAO,EAAE,eAAe,EAAE,cAAc,CAAC;SACjD,QAAQ,CAAC,YAAY,EAAE,+CAA+C,CAAC;SACvE,MAAM,CAAC,SAAS,EAAE,gDAAgD,CAAC;SACnE,MAAM,CAAC,iBAAiB,EAAE,6DAA6D,CAAC;SACxF,MAAM,CAAC,aAAa,EAAE,wCAAwC,CAAC;SAC/D,MAAM,CAAC,sBAAsB,EAAE,4DAA4D,CAAC;SAC5F,MAAM,CAAC,YAAY,EAAE,2FAA2F,CAAC;SACjH,MAAM,CAAC,yBAAyB,EAAE,kCAAkC,CAAC;SACrE,MAAM,CAAC,yBAAyB,EAAE,sEAAsE,CAAC;SACzG,SAAS,CAAC,IAAI,MAAM,CAAC,eAAe,EAAE,qDAAqD,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;SACjH,SAAS,CAAC,IAAI,MAAM,CAAC,6BAA6B,EAAE,6BAA6B,CAAC,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;SAC/G,SAAS,CAAC,IAAI,MAAM,CAAC,sBAAsB,EAAE,YAAY,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;SAChF,MAAM,CAAC,cAAc,EAAE,kDAAkD,CAAC;SAC1E,MAAM,CAAC,WAAW,EAAE,sCAAsC,CAAC;SAC3D,MAAM,CAAC,sBAAsB,EAAE,qCAAqC,CAAC;SACrE,MAAM,CAAC,aAAa,EAAE,+BAA+B,CAAC;SACtD,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC;SACvC,MAAM,CAAC,WAAW,EAAE,qBAAqB,CAAC;SAC1C,MAAM,CAAC,eAAe,EAAE,kBAAkB,CAAC;SAC3C,MAAM,CAAC,aAAa,EAAE,eAAe,CAAC;SACtC,SAAS,CAAC,IAAI,MAAM,CAAC,0BAA0B,EAAE,6BAA6B,CAAC,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;SAC1G,SAAS,CAAC,IAAI,MAAM,CAAC,wBAAwB,EAAE,oCAAoC,CAAC,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;SAC/G,SAAS,CAAC,IAAI,MAAM,CAAC,wBAAwB,EAAE,gCAAgC,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;SACzG,SAAS,CAAC,IAAI,MAAM,CAAC,sBAAsB,EAAE,mCAAmC,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;SACxG,MAAM,CAAC,qBAAqB,EAAE,sDAAsD,CAAC;SACrF,MAAM,CAAC,yBAAyB,EAAE,0DAA0D,CAAC;SAC7F,MAAM,CAAC,eAAe,EAAE,qCAAqC,CAAC;SAC9D,YAAY,EAAE;SACd,eAAe,CAAC;QACf,QAAQ,EAAE,CAAC,GAAG,EAAE,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA,CAAC,CAAC;QAC3C,QAAQ,EAAE,CAAC,GAAG,EAAE,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA,CAAC,CAAC;KAC5C,CAAC,CAAA;AACN,CAAC;AAED,SAAS,aAAa,CAAC,IAAY,EAAE,QAAmB;IACtD,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,QAAQ,CAAA;IAC3C,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAA;IACvC,IAAI,mBAAmB,CAAC,GAAG,CAAC,GAAG,CAAC;QAAE,OAAO,IAAI,CAAA;IAC7C,IAAI,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC;QAAE,OAAO,MAAM,CAAA;IAC3C,MAAM,IAAI,UAAU,CAClB,0CAA0C,GAAG,SAAS,IAAI,wBAAwB,CACnF,CAAA;AACH,CAAC;AAED,+EAA+E;AAC/E,sCAAsC;AACtC,KAAK,UAAU,UAAU,CACvB,GAAW,EACX,UAA8B,EAC9B,QAAiB;IAEjB,IAAI,QAAQ;QAAE,OAAO,EAAE,CAAA;IACvB,MAAM,QAAQ,GAAG,WAAW,CAAC,WAAW,CAAC,CAAA;IACzC,MAAM,MAAM,GAAG,UAAU,CAAC,CAAC,CAAC,MAAM,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,MAAM,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;IACxF,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,OAAO;QAAE,OAAO,EAAE,CAAA;IACxC,OAAO,MAAM,CAAC,MAAoB,CAAA;AACpC,CAAC;AAED,SAAS,UAAU,CAAC,GAAW,EAAE,UAA8B;IAC7D,MAAM,EAAE,GAAG,MAAM,EAAE,CAAA;IACnB,MAAM,SAAS,GAAG,UAAU,IAAI,IAAI,CAAC,GAAG,EAAE,kBAAkB,CAAC,CAAA;IAC7D,IAAI,UAAU,CAAC,SAAS,CAAC;QAAE,EAAE,CAAC,GAAG,CAAC,YAAY,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAA;IAClE,OAAO,EAAE,CAAA;AACX,CAAC;AAED,SAAS,aAAa,CAAC,OAAe;IACpC,OAAO,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;AAClC,CAAC;AAED,0EAA0E;AAC1E,kEAAkE;AAClE,KAAK,UAAU,aAAa,CAC1B,QAAkB,EAClB,GAAW,EACX,EAAU;IAEV,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAA;IAC1D,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,aAAa,CAAC,CAAA;IAC5C,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC;QAC/B,CAAC,CAAC,MAAM,IAAI,CAAC,KAAK,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;QAC7D,CAAC,CAAC,EAAE,CAAA;IACN,MAAM,GAAG,GAAG,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,QAAQ,CAAC,CAAA;IAClE,OAAO,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE;QACzB,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA;QAC/B,OAAO,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;IACjD,CAAC,CAAC,CAAA;AACJ,CAAC;AAYD,MAAM,sBAAsB,GAAG,IAAI,CAAC,cAAc,EAAE,QAAQ,EAAE,WAAW,EAAE,YAAY,CAAC,CAAA;AAExF,SAAS,UAAU,CAAC,CAAS;IAC3B,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;AAClE,CAAC;AAED,SAAS,WAAW,CAAC,IAAgB;IACnC,OAAO,UAAU,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAA;AAC1C,CAAC;AAED,SAAS,SAAS,CAAC,QAAgB,EAAE,MAA6B;IAChE,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;QAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,CAAA;IAC/C,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAU,CAAA;QAClE,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;YAClB,MAAM,CAAC,KAAK,CAAC,qBAAqB,QAAQ,4CAA4C,CAAC,CAAA;YACvF,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,CAAA;QACtB,CAAC;QACD,uEAAuE;QACvE,iEAAiE;QACjE,yDAAyD;QACzD,MAAM,KAAK,GAA+B,EAAE,CAAA;QAC5C,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;YAClD,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;gBAAE,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;QAClC,CAAC;QACD,OAAO,EAAE,KAAK,EAAE,CAAA;IAClB,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,CAAC,KAAK,CAAC,qBAAqB,QAAQ,qCAAqC,CAAC,CAAA;QAChF,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,CAAA;IACtB,CAAC;AACH,CAAC;AAED,SAAS,SAAS,CAAC,QAAgB,EAAE,KAAY;IAC/C,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IACjD,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAA;AAChD,CAAC;AAED;;;;;GAKG;AACH,SAAS,QAAQ,CAAC,QAAgB,EAAE,GAAW;IAC7C,OAAO,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAA;AAChC,CAAC;AAED,SAAS,YAAY,CAAC,KAAkB;IACtC,MAAM,IAAI,GAAe,EAAE,CAAA;IAC3B,IAAI,KAAK,CAAC,gBAAgB;QAAE,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC,gBAAgB,CAAA;IAC1E,IAAI,KAAK,CAAC,SAAS;QAAE,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC,SAAS,CAAA;IACrD,IAAI,KAAK,CAAC,OAAO,KAAK,KAAK;QAAE,IAAI,CAAC,OAAO,GAAG,KAAK,CAAA;IACjD,IAAI,KAAK,CAAC,IAAI,KAAK,KAAK;QAAE,IAAI,CAAC,IAAI,GAAG,KAAK,CAAA;IAC3C,IAAI,KAAK,CAAC,cAAc,KAAK,KAAK;QAAE,IAAI,CAAC,cAAc,GAAG,KAAK,CAAA;IAC/D,IAAI,KAAK,CAAC,MAAM,KAAK,KAAK;QAAE,IAAI,CAAC,aAAa,GAAG,KAAK,CAAA;IACtD,IAAI,KAAK,CAAC,SAAS;QAAE,IAAI,CAAC,SAAS,GAAG,IAAI,CAAA;IAC1C,IAAI,KAAK,CAAC,OAAO;QAAE,IAAI,CAAC,OAAO,GAAG,IAAI,CAAA;IACtC,IAAI,KAAK,CAAC,WAAW;QAAE,IAAI,CAAC,WAAW,GAAG,IAAI,CAAA;IAC9C,IAAI,KAAK,CAAC,SAAS;QAAE,IAAI,CAAC,SAAS,GAAG,IAAI,CAAA;IAC1C,IAAI,KAAK,CAAC,cAAc;QAAE,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC,cAAc,CAAA;IACpE,IAAI,KAAK,CAAC,YAAY;QAAE,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC,YAAY,CAAA;IAC9D,IAAI,KAAK,CAAC,YAAY;QAAE,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC,YAAY,CAAA;IAC9D,IAAI,KAAK,CAAC,UAAU;QAAE,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC,UAAU,CAAA;IACxD,IAAI,KAAK,CAAC,OAAO;QAAE,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAA;IAChD,IAAI,KAAK,CAAC,SAAS;QAAE,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC,SAAS,CAAA;IACvD,IAAI,KAAK,CAAC,QAAQ,KAAK,KAAK;QAAE,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAA;IACnD,OAAO,IAAI,CAAA;AACb,CAAC;AAED,KAAK,UAAU,gBAAgB,CAAC,KAAa,EAAE,IAAc,EAAE,IAAgB;IAC7E,OAAO,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,iBAAiB,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,KAAK,EAAE,IAAI,CAAC,CAAA;AACpF,CAAC;AAED;;;;;GAKG;AACH,SAAS,oBAAoB,CAAC,QAAgB,EAAE,SAAiB;IAC/D,MAAM,WAAW,GAAG,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAA;IAC3C,MAAM,YAAY,GAAG,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAA;IAC7C,IAAI,WAAW,KAAK,YAAY;QAAE,OAAO,SAAS,CAAA;IAClD,IAAI,WAAW;QAAE,OAAO,SAAS,GAAG,IAAI,CAAA;IACxC,OAAO,SAAS,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA;AACrC,CAAC;AAED,KAAK,UAAU,SAAS,CAAC,KAAqC;IAC5D,MAAM,MAAM,GAAa,EAAE,CAAA;IAC3B,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,KAAK,EAAE,CAAC;QAChC,MAAM,CAAC,IAAI,CAAC,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAA;IACrE,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAA;AAC/C,CAAC;AAED,KAAK,UAAU,kBAAkB;IAC/B,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,iBAAiB,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IAC3D,6FAA6F;IAC7F,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;QAC3C,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,OAAO,IAAI,SAAS,CAAA;IAC7C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAA;IAClB,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,IAAc,EAAE,EAAS;IACpD,MAAM,OAAO,GAAG,MAAM,kBAAkB,EAAE,CAAA;IAC1C,MAAM,OAAO,GAAG,YAAY,CAAC,OAAO,EAAE,EAAE,CAAC,CAAA;IAEzC,IAAI,CAAC;QACH,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAA;IACvC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,2EAA2E;QAC3E,IAAI,CAAC,CAAC,GAAG,YAAY,cAAc,CAAC;YAAE,MAAM,GAAG,CAAA;QAC/C,IAAI,GAAG,CAAC,IAAI,KAAK,yBAAyB,IAAI,GAAG,CAAC,IAAI,KAAK,mBAAmB;YAAE,OAAO,CAAC,CAAA;QACxF,OAAO,CAAC,CAAA;IACV,CAAC;IAED,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,EAAiB,CAAA;IAC3C,MAAM,WAAW,GAAG,OAAO,CAAC,IAAI,CAAA;IAEhC,IAAI,CAAC;QACH,OAAO,MAAM,YAAY,CAAC,KAAK,EAAE,WAAW,EAAE,EAAE,EAAE,OAAO,EAAE,OAAO,CAAC,CAAA;IACrE,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,UAAU,EAAE,CAAC;YAC9B,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,GAAG,CAAC,OAAO,IAAI,CAAC,CAAA;YAC1C,OAAO,CAAC,CAAA;QACV,CAAC;QACD,MAAM,GAAG,CAAA;IACX,CAAC;AACH,CAAC;AAED,SAAS,UAAU,CAAC,WAAqB,EAAE,KAAkB;IAC3D,IAAI,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,OAAO,IAAI,CAAA;IAC1C,OAAO,KAAK,CAAC,aAAa,KAAK,SAAS,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,CAAA;AACtE,CAAC;AAED,KAAK,UAAU,YAAY,CACzB,KAAkB,EAClB,WAAqB,EACrB,EAAS,EACT,OAAgB,EAChB,OAAe;IAEf,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAA;IACzB,MAAM,MAAM,GAAG,MAAM,UAAU,CAC7B,GAAG,EACH,OAAO,KAAK,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,EAC3D,KAAK,CAAC,MAAM,KAAK,KAAK,CACvB,CAAA;IACD,MAAM,IAAI,GAAe,EAAE,GAAG,MAAM,EAAE,GAAG,YAAY,CAAC,KAAK,CAAC,EAAE,CAAA;IAC9D,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,IAAI,KAAK,CAAA;IAElC,IAAI,UAAU,CAAC,WAAW,EAAE,KAAK,CAAC,EAAE,CAAC;QACnC,MAAM,QAAQ,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,GAAG,CAAC,CAAA;QACrD,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxB,MAAM,IAAI,UAAU,CAAC,6CAA6C,CAAC,CAAA;QACrE,CAAC;QACD,MAAM,IAAI,GACR,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAA;QACpG,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACvB,MAAM,IAAI,UAAU,CAAC,wEAAwE,CAAC,CAAA;QAChG,CAAC;QACD,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,EAAE,CAAC,KAAK,CAAC,CAAA;QACvC,MAAM,MAAM,GAAG,oBAAoB,CAAC,KAAK,EAAE,MAAM,gBAAgB,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAA;QACrF,IAAI,KAAK;YAAE,OAAO,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;QAC1C,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;QACvB,OAAO,CAAC,CAAA;IACV,CAAC;IAED,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7B,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,eAAe,EAAE,CAAC,CAAA;QAC1C,OAAO,CAAC,CAAA;IACV,CAAC;IAED,MAAM,EAAE,GAAG,UAAU,CAAC,GAAG,EAAE,KAAK,CAAC,UAAU,CAAC,CAAA;IAC5C,MAAM,KAAK,GAAG,MAAM,aAAa,CAAC,WAAW,EAAE,GAAG,EAAE,EAAE,CAAC,CAAA;IAEvD,MAAM,aAAa,GAAG,KAAK,CAAC,KAAK,KAAK,KAAK;QACzC,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,aAAa,IAAI,sBAAsB,CAAC,CAAA;IAC/D,MAAM,KAAK,GAAG,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,aAAa,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;IAC7E,MAAM,WAAW,GAAG,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;IAElD,IAAI,UAAU,GAAG,KAAK,CAAA;IACtB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,IAAI,GAAG,aAAa,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAA;QAC5C,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;QAC7C,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;QAC5C,IAAI,KAAK,EAAE,CAAC;YACV,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;YAC9B,IACE,KAAK,KAAK,SAAS;gBACnB,KAAK,CAAC,WAAW,KAAK,UAAU,CAAC,QAAQ,CAAC;gBAC1C,KAAK,CAAC,WAAW,KAAK,WAAW;gBACjC,KAAK,CAAC,OAAO,KAAK,OAAO;gBACzB,SAAQ;QACZ,CAAC;QAED,MAAM,SAAS,GAAG,oBAAoB,CAAC,QAAQ,EAAE,MAAM,gBAAgB,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAA;QAC9F,MAAM,SAAS,GAAG,QAAQ,KAAK,SAAS,CAAA;QACxC,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,UAAU,GAAG,IAAI,CAAA;YACjB,IAAI,KAAK,EAAE,CAAC;gBACV,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,mBAAmB,IAAI,IAAI,CAAC,CAAA;YAC9C,CAAC;iBAAM,CAAC;gBACN,MAAM,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,CAAA;gBAChC,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,gBAAgB,IAAI,IAAI,CAAC,CAAA;YAC3C,CAAC;QACH,CAAC;QACD,IAAI,KAAK,IAAI,CAAC,SAAS,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YACnC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,WAAW,EAAE,UAAU,CAAC,SAAS,CAAC,EAAE,WAAW,EAAE,OAAO,EAAE,CAAA;QACjF,CAAC;IACH,CAAC;IAED,IAAI,aAAa,IAAI,KAAK;QAAE,SAAS,CAAC,aAAa,EAAE,KAAK,CAAC,CAAA;IAC3D,OAAO,KAAK,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;AACpC,CAAC;AAED,gFAAgF;AAChF,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;IAC1E,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE;QAC5B,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,MAAM,EAAE,OAAO,CAAC,MAAM;KACvB,CAAC;SACC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;SAClC,KAAK,CAAC,CAAC,GAAU,EAAE,EAAE;QACpB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,GAAG,CAAC,OAAO,IAAI,CAAC,CAAA;QAC/C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC,CAAC,CAAA;AACN,CAAC"}
|
package/dist/dashes.d.ts
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Dash transformation: hyphens → em-dashes, en-dashes, minus signs.
|
|
3
3
|
*/
|
|
4
|
-
export
|
|
4
|
+
export declare const DASH_STYLES: readonly ["american", "british", "none"];
|
|
5
|
+
export type DashStyle = (typeof DASH_STYLES)[number];
|
|
5
6
|
export interface DashOptions {
|
|
6
7
|
/** Boundary marker for HTML element boundaries. Default: "\uE000\uE001" */
|
|
7
8
|
separator?: string;
|
package/dist/dashes.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dashes.d.ts","sourceRoot":"","sources":["../src/dashes.ts"],"names":[],"mappings":"AAAA;;GAEG;
|
|
1
|
+
{"version":3,"file":"dashes.d.ts","sourceRoot":"","sources":["../src/dashes.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,eAAO,MAAM,WAAW,0CAA2C,CAAA;AACnE,MAAM,MAAM,SAAS,GAAG,CAAC,OAAO,WAAW,CAAC,CAAC,MAAM,CAAC,CAAA;AAEpD,MAAM,WAAW,WAAW;IAC1B,2EAA2E;IAC3E,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,mFAAmF;IACnF,SAAS,CAAC,EAAE,SAAS,CAAA;CACtB;AAID;;;;GAIG;AACH,eAAO,MAAM,6BAA6B,+BAA0C,CAAA;AAsBpF,8DAA8D;AAC9D,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,WAAgB,GAAG,MAAM,CAuEjF;AAED,iFAAiF;AACjF,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,WAAgB,GAAG,MAAM,CA2B/E;AAED,8EAA8E;AAC9E,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,WAAgB,GAAG,MAAM,CAkC5E;AAkFD,gCAAgC;AAChC,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,WAAgB,GAAG,MAAM,CAU7E"}
|
package/dist/dashes.js
CHANGED
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
* Dash transformation: hyphens → em-dashes, en-dashes, minus signs.
|
|
3
3
|
*/
|
|
4
4
|
import { UNICODE_SYMBOLS, DEFAULT_SEPARATOR, LATIN_LETTERS, wordBoundaryStart, wordBoundaryEnd, getEscapedSeparator, cachedRegExp } from "./constants.js";
|
|
5
|
+
import { namedGroups } from "./utils.js";
|
|
6
|
+
export const DASH_STYLES = ["american", "british", "none"];
|
|
5
7
|
const { EN_DASH, EM_DASH, MINUS, LEFT_DOUBLE_QUOTE, RIGHT_DOUBLE_QUOTE, LEFT_SINGLE_QUOTE, RIGHT_SINGLE_QUOTE } = UNICODE_SYMBOLS;
|
|
6
8
|
/**
|
|
7
9
|
* Characters that, when preceding a number, prevent it from being
|
|
@@ -46,7 +48,7 @@ export function enDashNumberRange(text, options = {}) {
|
|
|
46
48
|
phoneAreaCode, wb, notAfterDash, rangeStart, "-{1,3}", rangeEnd, moreSegments, unitSuffix, wbe
|
|
47
49
|
].join("");
|
|
48
50
|
text = text.replace(cachedRegExp(positiveRangePattern, "g"), (...args) => {
|
|
49
|
-
const groups = args
|
|
51
|
+
const groups = namedGroups(args);
|
|
50
52
|
if (groups.following)
|
|
51
53
|
return args[0];
|
|
52
54
|
const startNum = groups.start.replace(cachedRegExp(chr, "g"), "");
|
|
@@ -70,7 +72,7 @@ export function enDashNumberRange(text, options = {}) {
|
|
|
70
72
|
// Negative ranges: −5-5 → −5–5, −5--2 → −5–−2
|
|
71
73
|
// Separate regex because MINUS isn't a word char, so \b in ${wb} would match after it
|
|
72
74
|
text = text.replace(cachedRegExp(`(?<![${LATIN_LETTERS}])(?<start>${MINUS}\\d[\\d.,]*${chr}?)-{1,3}?(?<neg>-)?(?<end>${chr}?\\d[\\d.,]*)(?<following>(?:${chr}?-${chr}?\\d+)*)(?<suffix>${chr}?[xKBTM])?${wbe}`, "g"), (...args) => {
|
|
73
|
-
const groups = args
|
|
75
|
+
const groups = namedGroups(args);
|
|
74
76
|
if (groups.following)
|
|
75
77
|
return args[0];
|
|
76
78
|
return `${groups.start}${EN_DASH}${groups.neg ? MINUS : ""}${groups.end}${groups.suffix ?? ""}`;
|
|
@@ -91,7 +93,7 @@ export function enDashDateRange(text, options = {}) {
|
|
|
91
93
|
const startYear = `(?=(?<startYear>${chr}? \\d{4})?)\\k<startYear>`;
|
|
92
94
|
const endYear = `(?=(?<endYear> \\d{4})?)\\k<endYear>`;
|
|
93
95
|
return text.replace(cachedRegExp(`${wb}(?<startMonth>${monthPattern})${startYear}(?<preSep>${chr}?)(?<preSpace> ?)-(?<postSpace> ?)(?<postSep>${chr}?)(?<endMonth>${monthPattern})${endYear}${wbe}`, "g"), (...args) => {
|
|
94
|
-
const groups = args
|
|
96
|
+
const groups = namedGroups(args);
|
|
95
97
|
const [pre, post] = dashStyle === "british" ? [" ", " "] : ["", ""];
|
|
96
98
|
return `${groups.startMonth}${groups.startYear || ""}${groups.preSep}${pre}${EN_DASH}${post}${groups.postSep}${groups.endMonth}${groups.endYear || ""}`;
|
|
97
99
|
});
|
package/dist/dashes.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dashes.js","sourceRoot":"","sources":["../src/dashes.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,aAAa,EAAE,iBAAiB,EAAE,eAAe,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;
|
|
1
|
+
{"version":3,"file":"dashes.js","sourceRoot":"","sources":["../src/dashes.ts"],"names":[],"mappings":"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"}
|
package/dist/html.d.ts
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Convenience module for HTML-to-HTML typography transformations.
|
|
3
|
+
*
|
|
4
|
+
* Provides a single function that takes HTML input and returns
|
|
5
|
+
* typographically improved HTML output.
|
|
6
|
+
*
|
|
7
|
+
* Requires `unified`, `rehype-parse`, and `rehype-stringify` to be installed.
|
|
8
|
+
*
|
|
9
|
+
* @packageDocumentation
|
|
10
|
+
*/
|
|
11
|
+
import { type RehypePunctilioOptions } from "./rehype.js";
|
|
12
|
+
/**
|
|
13
|
+
* Options for the HTML transform pipeline.
|
|
14
|
+
*/
|
|
15
|
+
export interface HtmlOptions extends RehypePunctilioOptions {
|
|
16
|
+
/**
|
|
17
|
+
* Whether to parse the input as an HTML fragment (no implicit `<html>`,
|
|
18
|
+
* `<head>`, or `<body>` wrapping). Set to `false` to parse a complete
|
|
19
|
+
* document. Default: `true`.
|
|
20
|
+
*/
|
|
21
|
+
fragment?: boolean;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Clears the processor cache. Exported for test isolation only.
|
|
25
|
+
* @internal
|
|
26
|
+
*/
|
|
27
|
+
export declare function clearProcessorCache(): void;
|
|
28
|
+
/**
|
|
29
|
+
* Transforms HTML text with typographic improvements.
|
|
30
|
+
*
|
|
31
|
+
* Parses the input as HTML, applies punctilio typography transformations,
|
|
32
|
+
* and serializes back to HTML. The unified processor pipeline is cached
|
|
33
|
+
* and reused across calls with identical options.
|
|
34
|
+
*
|
|
35
|
+
* @example
|
|
36
|
+
* ```ts
|
|
37
|
+
* import { transformHtml } from 'punctilio/html'
|
|
38
|
+
*
|
|
39
|
+
* await transformHtml('<p>"Hello" -- world</p>')
|
|
40
|
+
* // → '<p>“Hello”—world</p>'
|
|
41
|
+
* ```
|
|
42
|
+
*/
|
|
43
|
+
export declare function transformHtml(input: string, options?: HtmlOptions): Promise<string>;
|
|
44
|
+
//# sourceMappingURL=html.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"html.d.ts","sourceRoot":"","sources":["../src/html.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAOH,OAAO,EAAmB,KAAK,sBAAsB,EAAE,MAAM,aAAa,CAAA;AAG1E;;GAEG;AACH,MAAM,WAAW,WAAY,SAAQ,sBAAsB;IACzD;;;;OAIG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB;AAgBD;;;GAGG;AACH,wBAAgB,mBAAmB,IAAI,IAAI,CAE1C;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,aAAa,CACjC,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,WAAgB,GACxB,OAAO,CAAC,MAAM,CAAC,CAmBjB"}
|