Skip to content

Commit e115c7c

Browse files
committed
feature(list) add option to not index lists when generating markdown text
Signed-off-by: Jerome Simeon <[email protected]>
1 parent 30cb5dc commit e115c7c

File tree

4 files changed

+48
-27
lines changed

4 files changed

+48
-27
lines changed

packages/markdown-cli/index.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,11 @@ require('yargs')
4848
type: 'boolean',
4949
default: false
5050
});
51+
yargs.option('noIndex', {
52+
describe: 'do not index ordered lists',
53+
type: 'boolean',
54+
default: false
55+
});
5156
}, (argv) => {
5257
if (argv.verbose) {
5358
Logger.info(`parse sample ${argv.sample} markdown`);
@@ -60,6 +65,7 @@ require('yargs')
6065
options.cicero = argv.cicero;
6166
options.slate = argv.slate;
6267
options.noWrap = argv.noWrap;
68+
options.noIndex = argv.noIndex;
6369
return Commands.parse(argv.sample, argv.out, options)
6470
.then((result) => {
6571
if(result) {Logger.info('\n'+result);}

packages/markdown-cli/lib/Commands.js

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -90,11 +90,16 @@ class Commands {
9090
* @param {boolean} [options.cicero] whether to further transform for Cicero
9191
* @param {boolean} [options.slate] whether to further transform for Slate
9292
* @param {boolean} [options.noWrap] whether to avoid wrapping Cicero variables in XML tags
93+
* @param {boolean} [options.noIndex] do not index ordered list (i.e., use 1. everywhere)
9394
* @returns {object} Promise to the result of parsing
9495
*/
9596
static parse(samplePath, outPath, options) {
96-
const { roundtrip, cicero, slate, noWrap } = options;
97-
const commonMark = new CommonMark({ tagInfo: true });
97+
const { roundtrip, cicero, slate, noWrap, noIndex } = options;
98+
const commonOptions = {};
99+
commonOptions.tagInfo = true;
100+
commonOptions.noIndex = noIndex ? true : false;
101+
102+
const commonMark = new CommonMark(commonOptions);
98103
const ciceroMark = new CiceroMark();
99104
const slateMark = new SlateMark();
100105

@@ -108,8 +113,9 @@ class Commands {
108113
}
109114
if (roundtrip) {
110115
if (cicero) {
111-
const options = noWrap ? { wrapVariables: false } : null;
112-
result = ciceroMark.toCommonMark(result, options);
116+
const ciceroOptions = {};
117+
ciceroOptions.wrapVariables = noWrap ? false : true;
118+
result = ciceroMark.toCommonMark(result, ciceroOptions);
113119
} else if (slate) {
114120
result = slateMark.toCommonMark(result);
115121
//console.log('AFTER COMMONMARK ' + JSON.stringify(result));

packages/markdown-common/src/CommonMark.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ class CommonMark {
3838
* @param {boolean} [options.trimText] trims all text nodes
3939
* @param {boolean} [options.disableValidation] returns unvalidated JSON, rather than a Concerto model
4040
* @param {boolean} [options.enableSourceLocation] if true then location information is returned
41+
* @param {boolean} [options.noIndex] do not index ordered list (i.e., use 1. everywhere)
4142
* @param {boolean} [options.tagInfo] Construct tags for HTML elements
4243
*/
4344
constructor(options) {
@@ -258,15 +259,14 @@ class CommonMark {
258259
/**
259260
* Converts a commonmark document to a markdown string
260261
* @param {*} concertoObject - concerto commonmark object
261-
* @param {*} options - options (e.g., wrapVariables)
262262
* @returns {string} the markdown string
263263
*/
264-
toMarkdownStringConcerto(concertoObject, options) {
264+
toMarkdownStringConcerto(concertoObject) {
265265
const parameters = {};
266266
parameters.result = '';
267267
parameters.first = true;
268268
parameters.indent = 0;
269-
const visitor = new ToMarkdownStringVisitor(options);
269+
const visitor = new ToMarkdownStringVisitor(this.options);
270270
concertoObject.accept(visitor, parameters);
271271
return parameters.result.trim();
272272
}

packages/markdown-common/src/ToMarkdownStringVisitor.js

Lines changed: 29 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,16 @@
2121
* so this transformation is not guaranteed to equivalent if you roundtrip
2222
* markdown content. The resulting AST *should* be equivalent however.
2323
*/
24-
class ToStringVisitor {
24+
class ToMarkdownStringVisitor {
25+
/**
26+
* Construct the visitor.
27+
* @param {object} [options] configuration options
28+
* @param {boolean} [options.noIndex] do not index ordered list (i.e., use 1. everywhere)
29+
*/
30+
constructor(options) {
31+
this.options = options;
32+
}
33+
2534
/**
2635
* Visits a sub-tree and return the markdown
2736
* @param {*} visitor the visitor to use
@@ -122,7 +131,7 @@ class ToStringVisitor {
122131

123132
switch(thing.getType()) {
124133
case 'CodeBlock':
125-
ToStringVisitor.newParagraph(parameters);
134+
ToMarkdownStringVisitor.newParagraph(parameters);
126135
parameters.result += `\`\`\`${thing.info ? ' ' + thing.info : ''}\n${thing.text}\`\`\`\n\n`;
127136
break;
128137
case 'Code':
@@ -132,28 +141,28 @@ class ToStringVisitor {
132141
parameters.result += thing.text;
133142
break;
134143
case 'Emph':
135-
parameters.result += `*${ToStringVisitor.visitChildren(this, thing)}*`;
144+
parameters.result += `*${ToMarkdownStringVisitor.visitChildren(this, thing)}*`;
136145
break;
137146
case 'Strong':
138-
parameters.result += `**${ToStringVisitor.visitChildren(this, thing)}**`;
147+
parameters.result += `**${ToMarkdownStringVisitor.visitChildren(this, thing)}**`;
139148
break;
140149
case 'BlockQuote': {
141-
const parametersIn = ToStringVisitor.mkParametersIn(parameters);
142-
ToStringVisitor.newParagraph(parameters);
143-
parameters.result += `> ${ToStringVisitor.visitChildren(this, thing, parametersIn)}`;
150+
const parametersIn = ToMarkdownStringVisitor.mkParametersIn(parameters);
151+
ToMarkdownStringVisitor.newParagraph(parameters);
152+
parameters.result += `> ${ToMarkdownStringVisitor.visitChildren(this, thing, parametersIn)}`;
144153
}
145154
break;
146155
case 'Heading': {
147156
const level = parseInt(thing.level);
148157
if (level < 3) {
149-
parameters.result += `${ToStringVisitor.visitChildren(this, thing)}\n${ToStringVisitor.mkSetextHeading(level)}`;
158+
parameters.result += `${ToMarkdownStringVisitor.visitChildren(this, thing)}\n${ToMarkdownStringVisitor.mkSetextHeading(level)}`;
150159
} else {
151-
parameters.result += `${ToStringVisitor.mkATXHeading(level)} ${ToStringVisitor.visitChildren(this, thing)}`;
160+
parameters.result += `${ToMarkdownStringVisitor.mkATXHeading(level)} ${ToMarkdownStringVisitor.visitChildren(this, thing)}`;
152161
}
153162
}
154163
break;
155164
case 'ThematicBreak':
156-
ToStringVisitor.newParagraph(parameters);
165+
ToMarkdownStringVisitor.newParagraph(parameters);
157166
parameters.result += '---\n';
158167
break;
159168
case 'Linebreak':
@@ -163,17 +172,17 @@ class ToStringVisitor {
163172
parameters.result += '\n';
164173
break;
165174
case 'Link':
166-
parameters.result += `[${ToStringVisitor.visitChildren(this, thing)}](${thing.destination})`;
175+
parameters.result += `[${ToMarkdownStringVisitor.visitChildren(this, thing)}](${thing.destination})`;
167176
break;
168177
case 'Image':
169-
parameters.result += `![${ToStringVisitor.visitChildren(this, thing)}](${thing.destination})`;
178+
parameters.result += `![${ToMarkdownStringVisitor.visitChildren(this, thing)}](${thing.destination})`;
170179
break;
171180
case 'Paragraph':
172-
ToStringVisitor.newParagraph(parameters);
173-
parameters.result += `${ToStringVisitor.visitChildren(this, thing)}`;
181+
ToMarkdownStringVisitor.newParagraph(parameters);
182+
parameters.result += `${ToMarkdownStringVisitor.visitChildren(this, thing)}`;
174183
break;
175184
case 'HtmlBlock':
176-
ToStringVisitor.newParagraph(parameters);
185+
ToMarkdownStringVisitor.newParagraph(parameters);
177186
parameters.result += `${thing.text}`;
178187
break;
179188
case 'Text':
@@ -185,15 +194,15 @@ class ToStringVisitor {
185194
// Always start with a new line
186195
parameters.result += '\n';
187196
thing.nodes.forEach(item => {
188-
const parametersIn = ToStringVisitor.mkParametersInList(parameters);
197+
const parametersIn = ToMarkdownStringVisitor.mkParametersInList(parameters);
189198
if(thing.tight === 'false' && index !== first) {
190199
parameters.result += '\n';
191200
}
192201
if(thing.type === 'ordered') {
193-
parameters.result += `\n${ToStringVisitor.mkIndent(parameters)}${index}. ${ToStringVisitor.visitChildren(this, item, parametersIn)}`;
202+
parameters.result += `\n${ToMarkdownStringVisitor.mkIndent(parameters)}${ this.options.noIndex ? 1 : index}. ${ToMarkdownStringVisitor.visitChildren(this, item, parametersIn)}`;
194203
}
195204
else {
196-
parameters.result += `\n${ToStringVisitor.mkIndent(parameters)}- ${ToStringVisitor.visitChildren(this, item, parametersIn)}`;
205+
parameters.result += `\n${ToMarkdownStringVisitor.mkIndent(parameters)}- ${ToMarkdownStringVisitor.visitChildren(this, item, parametersIn)}`;
197206
}
198207
index++;
199208
});
@@ -202,7 +211,7 @@ class ToStringVisitor {
202211
case 'Item':
203212
throw new Error('Item node should not occur outside of List nodes');
204213
case 'Document':
205-
parameters.result += ToStringVisitor.visitChildren(this, thing);
214+
parameters.result += ToMarkdownStringVisitor.visitChildren(this, thing);
206215
break;
207216
default:
208217
throw new Error(`Unhandled type ${thing.getType()}`);
@@ -211,4 +220,4 @@ class ToStringVisitor {
211220
}
212221
}
213222

214-
module.exports = ToStringVisitor;
223+
module.exports = ToMarkdownStringVisitor;

0 commit comments

Comments
 (0)