markdown-to-adf 0.2.1
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/CHANGELOG.md +17 -0
- package/LICENSE +21 -0
- package/README.md +328 -0
- package/SECURITY.md +3 -0
- package/dist/builders/index.d.ts +22 -0
- package/dist/builders/index.d.ts.map +1 -0
- package/dist/builders/index.js +22 -0
- package/dist/builders/index.js.map +1 -0
- package/dist/builders/marks.d.ts +43 -0
- package/dist/builders/marks.d.ts.map +1 -0
- package/dist/builders/marks.js +54 -0
- package/dist/builders/marks.js.map +1 -0
- package/dist/builders/nodes.d.ts +133 -0
- package/dist/builders/nodes.d.ts.map +1 -0
- package/dist/builders/nodes.js +234 -0
- package/dist/builders/nodes.js.map +1 -0
- package/dist/converter/block-parser.d.ts +38 -0
- package/dist/converter/block-parser.d.ts.map +1 -0
- package/dist/converter/block-parser.js +426 -0
- package/dist/converter/block-parser.js.map +1 -0
- package/dist/converter.d.ts +39 -0
- package/dist/converter.d.ts.map +1 -0
- package/dist/converter.js +81 -0
- package/dist/converter.js.map +1 -0
- package/dist/index.d.ts +29 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +30 -0
- package/dist/index.js.map +1 -0
- package/dist/markdown/parser.d.ts +11 -0
- package/dist/markdown/parser.d.ts.map +1 -0
- package/dist/markdown/parser.js +16 -0
- package/dist/markdown/parser.js.map +1 -0
- package/dist/presets/index.d.ts +23 -0
- package/dist/presets/index.d.ts.map +1 -0
- package/dist/presets/index.js +90 -0
- package/dist/presets/index.js.map +1 -0
- package/dist/types/adf.d.ts +252 -0
- package/dist/types/adf.d.ts.map +1 -0
- package/dist/types/adf.js +7 -0
- package/dist/types/adf.js.map +1 -0
- package/dist/types/index.d.ts +6 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +5 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/options.d.ts +141 -0
- package/dist/types/options.d.ts.map +1 -0
- package/dist/types/options.js +5 -0
- package/dist/types/options.js.map +1 -0
- package/dist/utils/inline-parser.d.ts +16 -0
- package/dist/utils/inline-parser.d.ts.map +1 -0
- package/dist/utils/inline-parser.js +174 -0
- package/dist/utils/inline-parser.js.map +1 -0
- package/docs/compatibility.md +30 -0
- package/docs/presets.md +22 -0
- package/docs/warnings.md +20 -0
- package/package.json +68 -0
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Utilities for parsing inline markdown-it tokens into ADF inline nodes.
|
|
3
|
+
*/
|
|
4
|
+
import { text, hardBreak } from '../builders/nodes.js';
|
|
5
|
+
import { strong, em, code as codeMark, strike, link } from '../builders/marks.js';
|
|
6
|
+
export function parseInlineTokens(tokens, options) {
|
|
7
|
+
if (!tokens || tokens.length === 0) {
|
|
8
|
+
return { nodes: [], taskChecked: false };
|
|
9
|
+
}
|
|
10
|
+
const nodes = [];
|
|
11
|
+
const marks = [];
|
|
12
|
+
let taskChecked = false;
|
|
13
|
+
const pushText = (value, activeMarks) => {
|
|
14
|
+
if (value === '')
|
|
15
|
+
return;
|
|
16
|
+
const last = nodes[nodes.length - 1];
|
|
17
|
+
if (last && last.type === 'text' && areMarksEqual(last.marks, activeMarks)) {
|
|
18
|
+
nodes[nodes.length - 1] = text(last.text + value, activeMarks.length > 0 ? activeMarks : undefined);
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
nodes.push(text(value, activeMarks.length > 0 ? activeMarks : undefined));
|
|
22
|
+
};
|
|
23
|
+
for (const token of tokens) {
|
|
24
|
+
switch (token.type) {
|
|
25
|
+
case 'text': {
|
|
26
|
+
pushText(token.content, marks.slice());
|
|
27
|
+
break;
|
|
28
|
+
}
|
|
29
|
+
case 'code_inline': {
|
|
30
|
+
pushText(token.content, [...marks, codeMark()]);
|
|
31
|
+
break;
|
|
32
|
+
}
|
|
33
|
+
case 'softbreak': {
|
|
34
|
+
if (options.preserveLineBreaks) {
|
|
35
|
+
nodes.push(hardBreak());
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
pushText(' ', marks.slice());
|
|
39
|
+
}
|
|
40
|
+
break;
|
|
41
|
+
}
|
|
42
|
+
case 'hardbreak': {
|
|
43
|
+
nodes.push(hardBreak());
|
|
44
|
+
break;
|
|
45
|
+
}
|
|
46
|
+
case 'strong_open': {
|
|
47
|
+
marks.push(strong());
|
|
48
|
+
break;
|
|
49
|
+
}
|
|
50
|
+
case 'strong_close': {
|
|
51
|
+
popMark(marks, 'strong');
|
|
52
|
+
break;
|
|
53
|
+
}
|
|
54
|
+
case 'em_open': {
|
|
55
|
+
marks.push(em());
|
|
56
|
+
break;
|
|
57
|
+
}
|
|
58
|
+
case 'em_close': {
|
|
59
|
+
popMark(marks, 'em');
|
|
60
|
+
break;
|
|
61
|
+
}
|
|
62
|
+
case 's_open':
|
|
63
|
+
case 'del_open': {
|
|
64
|
+
marks.push(strike());
|
|
65
|
+
break;
|
|
66
|
+
}
|
|
67
|
+
case 's_close':
|
|
68
|
+
case 'del_close': {
|
|
69
|
+
popMark(marks, 'strike');
|
|
70
|
+
break;
|
|
71
|
+
}
|
|
72
|
+
case 'link_open': {
|
|
73
|
+
const href = getAttr(token, 'href');
|
|
74
|
+
const title = getAttr(token, 'title');
|
|
75
|
+
if (href) {
|
|
76
|
+
marks.push(link(href, title ?? undefined));
|
|
77
|
+
}
|
|
78
|
+
break;
|
|
79
|
+
}
|
|
80
|
+
case 'link_close': {
|
|
81
|
+
popMark(marks, 'link');
|
|
82
|
+
break;
|
|
83
|
+
}
|
|
84
|
+
case 'html_inline': {
|
|
85
|
+
if (options.stripTaskCheckbox) {
|
|
86
|
+
const checkbox = parseTaskCheckbox(token.content);
|
|
87
|
+
if (checkbox.isCheckbox) {
|
|
88
|
+
if (checkbox.checked)
|
|
89
|
+
taskChecked = true;
|
|
90
|
+
break;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
break;
|
|
94
|
+
}
|
|
95
|
+
case 'image': {
|
|
96
|
+
const src = getAttr(token, 'src');
|
|
97
|
+
const alt = token.content || getAttr(token, 'alt');
|
|
98
|
+
if (src) {
|
|
99
|
+
pushText(alt || src, [...marks, link(src)]);
|
|
100
|
+
}
|
|
101
|
+
else if (alt) {
|
|
102
|
+
pushText(alt, marks.slice());
|
|
103
|
+
}
|
|
104
|
+
break;
|
|
105
|
+
}
|
|
106
|
+
default:
|
|
107
|
+
break;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
return { nodes, taskChecked };
|
|
111
|
+
}
|
|
112
|
+
function popMark(marks, type) {
|
|
113
|
+
for (let i = marks.length - 1; i >= 0; i--) {
|
|
114
|
+
if (marks[i]?.type === type) {
|
|
115
|
+
marks.splice(i, 1);
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
function areMarksEqual(left, right) {
|
|
121
|
+
if (!left || left.length === 0) {
|
|
122
|
+
return right.length === 0;
|
|
123
|
+
}
|
|
124
|
+
if (left.length !== right.length)
|
|
125
|
+
return false;
|
|
126
|
+
for (let i = 0; i < left.length; i++) {
|
|
127
|
+
const a = left[i];
|
|
128
|
+
const b = right[i];
|
|
129
|
+
if (a.type !== b.type)
|
|
130
|
+
return false;
|
|
131
|
+
const aAttrs = 'attrs' in a ? a.attrs : undefined;
|
|
132
|
+
const bAttrs = 'attrs' in b ? b.attrs : undefined;
|
|
133
|
+
if (!shallowEqual(aAttrs, bAttrs))
|
|
134
|
+
return false;
|
|
135
|
+
}
|
|
136
|
+
return true;
|
|
137
|
+
}
|
|
138
|
+
function shallowEqual(left, right) {
|
|
139
|
+
if (!left && !right)
|
|
140
|
+
return true;
|
|
141
|
+
if (!left || !right)
|
|
142
|
+
return false;
|
|
143
|
+
const leftKeys = Object.keys(left);
|
|
144
|
+
const rightKeys = Object.keys(right);
|
|
145
|
+
if (leftKeys.length !== rightKeys.length)
|
|
146
|
+
return false;
|
|
147
|
+
for (const key of leftKeys) {
|
|
148
|
+
if (left[key] !== right[key])
|
|
149
|
+
return false;
|
|
150
|
+
}
|
|
151
|
+
return true;
|
|
152
|
+
}
|
|
153
|
+
function getAttr(token, name) {
|
|
154
|
+
if (typeof token.attrGet === 'function') {
|
|
155
|
+
return token.attrGet(name);
|
|
156
|
+
}
|
|
157
|
+
if (!token.attrs)
|
|
158
|
+
return null;
|
|
159
|
+
for (const attr of token.attrs) {
|
|
160
|
+
if (attr[0] === name) {
|
|
161
|
+
return attr[1] ?? null;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
return null;
|
|
165
|
+
}
|
|
166
|
+
function parseTaskCheckbox(html) {
|
|
167
|
+
const isCheckbox = /type=["']checkbox["']/i.test(html);
|
|
168
|
+
if (!isCheckbox) {
|
|
169
|
+
return { isCheckbox: false, checked: false };
|
|
170
|
+
}
|
|
171
|
+
const checked = /checked(=|\s|>)/i.test(html);
|
|
172
|
+
return { isCheckbox: true, checked };
|
|
173
|
+
}
|
|
174
|
+
//# sourceMappingURL=inline-parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inline-parser.js","sourceRoot":"","sources":["../../src/utils/inline-parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# Compatibility Guide
|
|
2
|
+
|
|
3
|
+
This library targets Jira Cloud ADF behavior and applies conservative conversions for different contexts.
|
|
4
|
+
|
|
5
|
+
## Presets
|
|
6
|
+
|
|
7
|
+
| Preset | Intended context |
|
|
8
|
+
| --------- | ---------------------------- |
|
|
9
|
+
| `comment` | Issue comments |
|
|
10
|
+
| `task` | Task-type issue descriptions |
|
|
11
|
+
| `story` | Story/Epic descriptions |
|
|
12
|
+
| `default` | Safe default across contexts |
|
|
13
|
+
|
|
14
|
+
## Node Compatibility
|
|
15
|
+
|
|
16
|
+
| Markdown feature | ADF output | `comment` | `task` | `story` | Notes |
|
|
17
|
+
| ---------------- | ------------- | ----------------- | ----------------- | ------- | ------------------------------------------- |
|
|
18
|
+
| Headings | `heading` | Converted to bold | Converted to bold | Allowed | Strict mode throws for incompatible presets |
|
|
19
|
+
| Paragraphs | `paragraph` | ✅ | ✅ | ✅ | |
|
|
20
|
+
| Bullet lists | `bulletList` | ✅ | ✅ | ✅ | |
|
|
21
|
+
| Ordered lists | `orderedList` | ✅ | ✅ | ✅ | |
|
|
22
|
+
| Task lists | `taskList` | ✅ | ✅ | ✅ | Inline-only in ADF |
|
|
23
|
+
| Code blocks | `codeBlock` | ✅ | ✅ | ✅ | |
|
|
24
|
+
| Block quotes | `blockQuote` | ✅ | ✅ | ✅ | |
|
|
25
|
+
| Tables | `table` | ✅ (risky) | ✅ | ✅ | `comment` warns by default |
|
|
26
|
+
| Horizontal rules | — | ❌ | ❌ | ❌ | Strict mode throws |
|
|
27
|
+
|
|
28
|
+
## Risky Nodes
|
|
29
|
+
|
|
30
|
+
Some nodes are valid but known to be inconsistent in certain Jira views. Use `warnOnRiskyNodes` or the `comment` preset to surface warnings.
|
package/docs/presets.md
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# Presets
|
|
2
|
+
|
|
3
|
+
Presets tune the converter for different Jira contexts.
|
|
4
|
+
|
|
5
|
+
## `comment`
|
|
6
|
+
|
|
7
|
+
- Converts headings to bold paragraphs.
|
|
8
|
+
- Enables `warnOnRiskyNodes` by default.
|
|
9
|
+
|
|
10
|
+
## `task`
|
|
11
|
+
|
|
12
|
+
- Converts headings to bold paragraphs.
|
|
13
|
+
- Conservative defaults.
|
|
14
|
+
|
|
15
|
+
## `story`
|
|
16
|
+
|
|
17
|
+
- Allows headings.
|
|
18
|
+
- Full feature support.
|
|
19
|
+
|
|
20
|
+
## `default`
|
|
21
|
+
|
|
22
|
+
- Safe defaults intended to work in most contexts.
|
package/docs/warnings.md
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# Warnings
|
|
2
|
+
|
|
3
|
+
The warnings API surfaces lossy conversions or risky nodes so you can log, audit, or enforce policies.
|
|
4
|
+
|
|
5
|
+
## Types
|
|
6
|
+
|
|
7
|
+
- `lossy_conversion`: a supported input was downgraded (e.g., headings to bold).
|
|
8
|
+
- `unsupported_feature`: the input could not be represented (e.g., horizontal rules).
|
|
9
|
+
- `invalid_syntax`: the input contained invalid Markdown.
|
|
10
|
+
- `risky_feature`: valid ADF that is known to behave inconsistently in some contexts.
|
|
11
|
+
|
|
12
|
+
## Usage
|
|
13
|
+
|
|
14
|
+
```ts
|
|
15
|
+
import { markdownToAdfWithWarnings } from 'markdown-to-adf';
|
|
16
|
+
|
|
17
|
+
const { adf, warnings } = markdownToAdfWithWarnings(markdown, {
|
|
18
|
+
preset: 'comment',
|
|
19
|
+
});
|
|
20
|
+
```
|
package/package.json
ADDED
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "markdown-to-adf",
|
|
3
|
+
"version": "0.2.1",
|
|
4
|
+
"description": "Convert Markdown to Atlassian Document Format (ADF) with context-aware presets for Jira",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"import": "./dist/index.js",
|
|
11
|
+
"types": "./dist/index.d.ts"
|
|
12
|
+
}
|
|
13
|
+
},
|
|
14
|
+
"files": [
|
|
15
|
+
"dist",
|
|
16
|
+
"README.md",
|
|
17
|
+
"LICENSE",
|
|
18
|
+
"CHANGELOG.md",
|
|
19
|
+
"docs",
|
|
20
|
+
"SECURITY.md"
|
|
21
|
+
],
|
|
22
|
+
"scripts": {
|
|
23
|
+
"build": "tsc",
|
|
24
|
+
"prepare": "npm run build",
|
|
25
|
+
"test": "bun test",
|
|
26
|
+
"test:watch": "bun test --watch",
|
|
27
|
+
"test:coverage": "bun test --coverage",
|
|
28
|
+
"typecheck": "tsc --noEmit",
|
|
29
|
+
"lint": "eslint \"src/**/*.ts\" \"tests/**/*.ts\"",
|
|
30
|
+
"format": "prettier --write .",
|
|
31
|
+
"format:check": "prettier --check .",
|
|
32
|
+
"prepublishOnly": "npm run typecheck && npm run lint && npm run build && bun test"
|
|
33
|
+
},
|
|
34
|
+
"keywords": [
|
|
35
|
+
"markdown",
|
|
36
|
+
"adf",
|
|
37
|
+
"atlassian",
|
|
38
|
+
"jira",
|
|
39
|
+
"confluence",
|
|
40
|
+
"document-format",
|
|
41
|
+
"converter",
|
|
42
|
+
"parser",
|
|
43
|
+
"typescript"
|
|
44
|
+
],
|
|
45
|
+
"author": "Christian Gilan <cgilan@twilio.com>",
|
|
46
|
+
"license": "MIT",
|
|
47
|
+
"dependencies": {
|
|
48
|
+
"markdown-it": "^14.0.0",
|
|
49
|
+
"markdown-it-task-lists": "^2.1.1"
|
|
50
|
+
},
|
|
51
|
+
"devDependencies": {
|
|
52
|
+
"@types/bun": "latest",
|
|
53
|
+
"@types/markdown-it": "^13.0.0",
|
|
54
|
+
"@typescript-eslint/eslint-plugin": "^7.9.0",
|
|
55
|
+
"@typescript-eslint/parser": "^7.9.0",
|
|
56
|
+
"eslint": "^8.57.0",
|
|
57
|
+
"eslint-config-prettier": "^9.1.0",
|
|
58
|
+
"prettier": "^3.2.5",
|
|
59
|
+
"typescript": "^5.3.0"
|
|
60
|
+
},
|
|
61
|
+
"engines": {
|
|
62
|
+
"node": ">=18.0.0"
|
|
63
|
+
},
|
|
64
|
+
"repository": {
|
|
65
|
+
"type": "git",
|
|
66
|
+
"url": "git+https://github.com/califlower/markdown-to-adf.git"
|
|
67
|
+
}
|
|
68
|
+
}
|