Skip to content

Commit 7e888a5

Browse files
authored
Merge pull request #1183 from jose-elias-alvarez/master
Feat: add additional ordered list options
2 parents b1cb567 + 960cdc3 commit 7e888a5

File tree

3 files changed

+138
-7
lines changed

3 files changed

+138
-7
lines changed

src/lang/locale/en.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -551,6 +551,10 @@ export default {
551551
'name': 'Ordered List Indicator End Style',
552552
'description': 'The ending character of an ordered list indicator',
553553
},
554+
'preserve-start': {
555+
'name': 'Preserve Starting Number',
556+
'description': 'Whether to preserve the starting number of an ordered list. This can be used to have an ordered list that has content in between the ordered list items.',
557+
},
554558
},
555559
// paragraph-blank-lines.ts
556560
'paragraph-blank-lines': {
@@ -894,6 +898,7 @@ export default {
894898
'SILENT': 'silent',
895899
'ascending': 'ascending',
896900
'lazy': 'lazy',
901+
'preserve': 'preserve',
897902
'Nothing': 'Nothing',
898903
'Remove hashtag': 'Remove hashtag',
899904
'Remove whole tag': 'Remove whole tag',

src/rules/ordered-list-style.ts

Lines changed: 127 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
import {IgnoreTypes} from '../utils/ignore-types';
22
import {Options, RuleType} from '../rules';
3-
import RuleBuilder, {DropdownOptionBuilder, ExampleBuilder, OptionBuilderBase} from './rule-builder';
3+
import RuleBuilder, {BooleanOptionBuilder, DropdownOptionBuilder, ExampleBuilder, OptionBuilderBase} from './rule-builder';
44
import dedent from 'ts-dedent';
55
import {OrderListItemEndOfIndicatorStyles, OrderListItemStyles, updateOrderedListItemIndicators} from '../utils/mdast';
66

77
class OrderedListStyleOptions implements Options {
88
numberStyle?: OrderListItemStyles = OrderListItemStyles.Ascending;
99
listEndStyle?: OrderListItemEndOfIndicatorStyles = OrderListItemEndOfIndicatorStyles.Period;
10+
preserveStart?: boolean;
1011
}
1112

1213
@RuleBuilder.register
@@ -23,7 +24,7 @@ export default class OrderedListStyle extends RuleBuilder<OrderedListStyleOption
2324
return OrderedListStyleOptions;
2425
}
2526
apply(text: string, options: OrderedListStyleOptions): string {
26-
return updateOrderedListItemIndicators(text, options.numberStyle, options.listEndStyle);
27+
return updateOrderedListItemIndicators(text, options.numberStyle, options.listEndStyle, options.preserveStart);
2728
}
2829
get exampleBuilders(): ExampleBuilder<OrderedListStyleOptions>[] {
2930
return [
@@ -131,6 +132,119 @@ export default class OrderedListStyle extends RuleBuilder<OrderedListStyleOption
131132
numberStyle: OrderListItemStyles.Lazy,
132133
},
133134
}),
135+
new ExampleBuilder({
136+
description: 'Ordered lists have list items set to ascending numerical order using initial indicator number when Number Style is `ascending` and `preserveStart` is enabled',
137+
before: dedent`
138+
1. Item 1
139+
2. Item 2
140+
4. Item 3
141+
${''}
142+
Some text here
143+
${''}
144+
4. Item 4
145+
5. Item 5
146+
7. Item 6
147+
`,
148+
after: dedent`
149+
1. Item 1
150+
2. Item 2
151+
3. Item 3
152+
${''}
153+
Some text here
154+
${''}
155+
4. Item 4
156+
5. Item 5
157+
6. Item 6
158+
`,
159+
options: {
160+
numberStyle: OrderListItemStyles.Ascending,
161+
preserveStart: true,
162+
},
163+
}),
164+
new ExampleBuilder({
165+
description: 'Nested ordered lists have list items set to ascending numerical order using initial indicator number when Number Style is `ascending` and `preserveStart` is enabled',
166+
before: dedent`
167+
4. Item 4
168+
2. Item 5
169+
2. Subitem 2
170+
5. Subitem 3
171+
2. Subitem 4
172+
4. Item 6
173+
`,
174+
after: dedent`
175+
4. Item 4
176+
5. Item 5
177+
2. Subitem 2
178+
3. Subitem 3
179+
4. Subitem 4
180+
6. Item 6
181+
`,
182+
options: {
183+
preserveStart: true,
184+
},
185+
}),
186+
new ExampleBuilder({
187+
description: 'Ordered lists have list items set to initial indicator number when Number Style is `lazy` and `preserveStart` is enabled',
188+
before: dedent`
189+
2. Item 2
190+
5. Item 3
191+
4. Item 4
192+
`,
193+
after: dedent`
194+
2. Item 2
195+
2. Item 3
196+
2. Item 4
197+
`,
198+
options: {
199+
numberStyle: OrderListItemStyles.Lazy,
200+
preserveStart: true,
201+
},
202+
}),
203+
new ExampleBuilder({
204+
description: 'Nested ordered lists have list items set to initial indicator number when Number Style is `lazy` and `preserveStart` is enabled',
205+
before: dedent`
206+
4. Item 4
207+
2. Item 5
208+
2. Subitem 2
209+
5. Subitem 3
210+
2. Subitem 4
211+
4. Item 6
212+
`,
213+
after: dedent`
214+
4. Item 4
215+
4. Item 5
216+
2. Subitem 2
217+
2. Subitem 3
218+
2. Subitem 4
219+
4. Item 6
220+
`,
221+
options: {
222+
numberStyle: OrderListItemStyles.Lazy,
223+
preserveStart: true,
224+
},
225+
}),
226+
new ExampleBuilder({
227+
description: 'Ordered lists items are not modified when Number Style is `preserve`',
228+
before: dedent`
229+
4. Item 4
230+
2. Item 5
231+
2. Subitem 2
232+
5. Subitem 3
233+
2. Subitem 4
234+
4. Item 6
235+
`,
236+
after: dedent`
237+
4. Item 4
238+
2. Item 5
239+
2. Subitem 2
240+
5. Subitem 3
241+
2. Subitem 4
242+
4. Item 6
243+
`,
244+
options: {
245+
numberStyle: OrderListItemStyles.Preserve,
246+
},
247+
}),
134248
];
135249
}
136250
get optionBuilders(): OptionBuilderBase<OrderedListStyleOptions>[] {
@@ -147,7 +261,11 @@ export default class OrderedListStyle extends RuleBuilder<OrderedListStyleOption
147261
},
148262
{
149263
value: OrderListItemStyles.Lazy,
150-
description: 'Makes sure ordered list item indicators all are the number 1',
264+
description: 'Makes sure ordered list item indicators all are the same',
265+
},
266+
{
267+
value: OrderListItemStyles.Preserve,
268+
description: 'Preserves ordered list item indicators as they are',
151269
},
152270
],
153271
}),
@@ -167,6 +285,12 @@ export default class OrderedListStyle extends RuleBuilder<OrderedListStyleOption
167285
},
168286
],
169287
}),
288+
new BooleanOptionBuilder<OrderedListStyleOptions>({
289+
OptionsClass: OrderedListStyleOptions,
290+
nameKey: 'rules.ordered-list-style.preserve-start.name',
291+
descriptionKey: 'rules.ordered-list-style.preserve-start.description',
292+
optionsKey: 'preserveStart',
293+
}),
170294
];
171295
}
172296
}

src/utils/mdast.ts

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ export enum MDAstTypes {
4141
export enum OrderListItemStyles {
4242
Ascending = 'ascending',
4343
Lazy = 'lazy',
44+
Preserve = 'preserve',
4445
}
4546

4647
export enum OrderListItemEndOfIndicatorStyles {
@@ -670,7 +671,7 @@ export function ensureEmptyLinesAroundHorizontalRule(text: string): string {
670671
return text;
671672
}
672673

673-
export function updateOrderedListItemIndicators(text: string, orderedListStyle: OrderListItemStyles, orderedListEndStyle: OrderListItemEndOfIndicatorStyles): string {
674+
export function updateOrderedListItemIndicators(text: string, orderedListStyle: OrderListItemStyles, orderedListEndStyle: OrderListItemEndOfIndicatorStyles, preserveStart: boolean): string {
674675
const positions: Position[] = getPositions(MDAstTypes.List, text);
675676
if (!positions) {
676677
return text;
@@ -704,8 +705,7 @@ export function updateOrderedListItemIndicators(text: string, orderedListStyle:
704705

705706
let lastItemListIndicatorLevel = -1;
706707
listText = listText.replace(/^(( |\t|> )*)((\d+(\.|\)))|[-*+])([^\n]*)$/gm, (listItem: string, $1: string = '', _$2: string, $3: string, _$4: string, _$5: string, $6: string) => {
707-
let listItemIndicatorNumber = 1;
708-
708+
let listItemIndicatorNumber = (orderedListStyle === OrderListItemStyles.Preserve || preserveStart) ? Number(_$4) : 1;
709709
const listItemIndicatorLevel = getListItemLevel($1);
710710
// when dealing with a value that is not an int reset all values greater than or equal to the current list level
711711
if (!/^\d/.test($3)) {
@@ -719,9 +719,11 @@ export function updateOrderedListItemIndicators(text: string, orderedListStyle:
719719
if (orderedListStyle === OrderListItemStyles.Ascending) {
720720
listItemIndicatorNumber = preListIndicatorLevelsToIndicatorNumber.get(listItemIndicatorLevel) + 1;
721721
preListIndicatorLevelsToIndicatorNumber.set(listItemIndicatorLevel, listItemIndicatorNumber);
722+
} else if (preserveStart) {
723+
listItemIndicatorNumber = preListIndicatorLevelsToIndicatorNumber.get(listItemIndicatorLevel);
722724
}
723725
} else {
724-
preListIndicatorLevelsToIndicatorNumber.set(listItemIndicatorLevel, 1);
726+
preListIndicatorLevelsToIndicatorNumber.set(listItemIndicatorLevel, listItemIndicatorNumber);
725727
}
726728

727729
// if we have removed an indentation level then go ahead and remove the last set of sublist info for any levels between those two levels

0 commit comments

Comments
 (0)