feat: add support for custom leading delimiter

Resolve: #19
This commit is contained in:
dragonish 2025-08-16 10:25:31 +08:00
parent fc3c9e0ba5
commit 99943ed615
No known key found for this signature in database
GPG key ID: 6F42FA9E807A5177
12 changed files with 136 additions and 4 deletions

View file

@ -82,6 +82,8 @@ export class Counter extends Querier {
delimiter,
trailingDelimiter,
customTrailingDelimiter,
leadingDelimiter,
customLeadingDelimiter,
customIdents,
specifiedString,
ignoreTopLevel,
@ -92,6 +94,8 @@ export class Counter extends Querier {
delimiter,
trailingDelimiter,
customTrailingDelimiter,
leadingDelimiter,
customLeadingDelimiter,
customIdents,
specifiedString,
ignoreTopLevel,
@ -122,6 +126,8 @@ export class Counter extends Querier {
delimiter = ".",
trailingDelimiter = false,
customTrailingDelimiter = "",
leadingDelimiter = false,
customLeadingDelimiter = "",
specifiedString = "#",
customIdents = [],
ignoreTopLevel = 0,
@ -146,10 +152,12 @@ export class Counter extends Querier {
}
result = results.join(delimiter);
result +=
result.length > 0 && trailingDelimiter
? customTrailingDelimiter || delimiter
: "";
if (result.length > 0) {
result =
(leadingDelimiter ? customLeadingDelimiter || delimiter : "") +
result +
(trailingDelimiter ? customTrailingDelimiter || delimiter : "");
}
} else {
result = this.decoratorOptions.levelHeadings[level - 1];
}

View file

@ -15,6 +15,8 @@ export interface BaseDecoratorOptions {
delimiter?: string;
trailingDelimiter?: boolean;
customTrailingDelimiter?: string;
leadingDelimiter?: boolean;
customLeadingDelimiter?: string;
customIdents?: string[];
specifiedString?: string;
ignoreTopLevel?: number;
@ -29,6 +31,8 @@ interface OrderedDecoratorOptions {
delimiter?: string;
trailingDelimiter?: boolean;
customTrailingDelimiter?: string;
leadingDelimiter?: boolean;
customLeadingDelimiter?: string;
customIdents?: string[];
specifiedString?: string;
ignoreTopLevel?: number;
@ -55,6 +59,8 @@ export interface HeadingDecoratorSettings {
orderedDelimiter: string;
orderedTrailingDelimiter: boolean;
orderedCustomTrailingDelimiter?: string;
orderedLeadingDelimiter?: boolean;
orderedCustomLeadingDelimiter?: string;
orderedCustomIdents: string;
orderedSpecifiedString: string;
orderedAllowZeroLevel?: boolean;
@ -156,6 +162,8 @@ export function defaultHeadingDecoratorSettings(): HeadingDecoratorSettings {
orderedDelimiter: ".",
orderedTrailingDelimiter: false,
orderedCustomTrailingDelimiter: "",
orderedLeadingDelimiter: false,
orderedCustomLeadingDelimiter: "",
orderedStyleType: "decimal",
orderedCustomIdents: "Ⓐ Ⓑ Ⓒ Ⓓ Ⓔ Ⓕ Ⓖ Ⓗ Ⓘ Ⓙ Ⓚ Ⓛ Ⓜ Ⓝ Ⓞ Ⓟ Ⓠ Ⓡ Ⓢ Ⓣ Ⓤ Ⓥ Ⓦ Ⓧ Ⓨ Ⓩ",
orderedSpecifiedString: "#",

View file

@ -106,6 +106,8 @@ export class HeadingEditorViewPlugin implements PluginValue {
orderedDelimiter,
orderedTrailingDelimiter,
orderedCustomTrailingDelimiter,
orderedLeadingDelimiter,
orderedCustomLeadingDelimiter,
orderedCustomIdents,
orderedSpecifiedString,
orderedAlwaysIgnore,
@ -156,6 +158,8 @@ export class HeadingEditorViewPlugin implements PluginValue {
delimiter: orderedDelimiter,
trailingDelimiter: orderedTrailingDelimiter,
customTrailingDelimiter: orderedCustomTrailingDelimiter,
leadingDelimiter: orderedLeadingDelimiter,
customLeadingDelimiter: orderedCustomLeadingDelimiter,
customIdents: getOrderedCustomIdents(orderedCustomIdents),
specifiedString: orderedSpecifiedString,
ignoreTopLevel,

View file

@ -32,6 +32,8 @@ export function fileExplorerHandler(
orderedDelimiter,
orderedTrailingDelimiter,
orderedCustomTrailingDelimiter,
orderedLeadingDelimiter,
orderedCustomLeadingDelimiter,
orderedStyleType,
orderedSpecifiedString,
orderedCustomIdents,
@ -70,6 +72,8 @@ export function fileExplorerHandler(
delimiter: orderedDelimiter,
trailingDelimiter: orderedTrailingDelimiter,
customTrailingDelimiter: orderedCustomTrailingDelimiter,
leadingDelimiter: orderedLeadingDelimiter,
customLeadingDelimiter: orderedCustomLeadingDelimiter,
styleType: orderedStyleType,
customIdents: getOrderedCustomIdents(orderedCustomIdents),
specifiedString: orderedSpecifiedString,

View file

@ -34,6 +34,8 @@ export function outlineHandler(
orderedDelimiter,
orderedTrailingDelimiter,
orderedCustomTrailingDelimiter,
orderedLeadingDelimiter,
orderedCustomLeadingDelimiter,
orderedStyleType,
orderedSpecifiedString,
orderedCustomIdents,
@ -72,6 +74,8 @@ export function outlineHandler(
delimiter: orderedDelimiter,
trailingDelimiter: orderedTrailingDelimiter,
customTrailingDelimiter: orderedCustomTrailingDelimiter,
leadingDelimiter: orderedLeadingDelimiter,
customLeadingDelimiter: orderedCustomLeadingDelimiter,
styleType: orderedStyleType,
customIdents: getOrderedCustomIdents(orderedCustomIdents),
specifiedString: orderedSpecifiedString,

View file

@ -29,6 +29,8 @@ export function quietOutlineHandler(
orderedDelimiter,
orderedTrailingDelimiter,
orderedCustomTrailingDelimiter,
orderedLeadingDelimiter,
orderedCustomLeadingDelimiter,
orderedStyleType,
orderedSpecifiedString,
orderedCustomIdents,
@ -70,6 +72,8 @@ export function quietOutlineHandler(
delimiter: orderedDelimiter,
trailingDelimiter: orderedTrailingDelimiter,
customTrailingDelimiter: orderedCustomTrailingDelimiter,
leadingDelimiter: orderedLeadingDelimiter,
customLeadingDelimiter: orderedCustomLeadingDelimiter,
styleType: orderedStyleType,
customIdents: getOrderedCustomIdents(orderedCustomIdents),
specifiedString: orderedSpecifiedString,

View file

@ -31,6 +31,8 @@ export function readingOrderedHandler(
orderedDelimiter,
orderedTrailingDelimiter,
orderedCustomTrailingDelimiter,
orderedLeadingDelimiter,
orderedCustomLeadingDelimiter,
orderedStyleType,
orderedSpecifiedString,
orderedCustomIdents,
@ -75,6 +77,8 @@ export function readingOrderedHandler(
delimiter: orderedDelimiter,
trailingDelimiter: orderedTrailingDelimiter,
customTrailingDelimiter: orderedCustomTrailingDelimiter,
leadingDelimiter: orderedLeadingDelimiter,
customLeadingDelimiter: orderedCustomLeadingDelimiter,
styleType: orderedStyleType,
customIdents: getOrderedCustomIdents(orderedCustomIdents),
specifiedString: orderedSpecifiedString,

View file

@ -567,6 +567,38 @@ export class HeadingSettingTab extends PluginSettingTab {
});
});
//* orderedLeadingDelimiter
new Setting(containerEl)
.setName(i18n.t("setting.orderedLeadingDelimiter"))
.setDesc(i18n.t("setting.orderedLeadingDelimiterDesc"))
.addToggle((toggle) =>
toggle
.setValue(
this.plugin.settings[settingsType].orderedLeadingDelimiter || false
)
.onChange((value) => {
this.plugin.settings[settingsType].orderedLeadingDelimiter = value;
this.plugin.saveSettings();
})
);
//* orderedCustomLeadingDelimiter
new Setting(containerEl)
.setName(i18n.t("setting.orderedCustomLeadingDelimiter"))
.setDesc(i18n.t("setting.orderedCustomLeadingDelimiterDesc"))
.addText((text) => {
text
.setValue(
this.plugin.settings[settingsType].orderedCustomLeadingDelimiter ||
""
)
.onChange((value) => {
this.plugin.settings[settingsType].orderedCustomLeadingDelimiter =
value;
this.plugin.saveSettings();
});
});
//* orderedCustomIdents
new Setting(containerEl)
.setName(i18n.t("setting.orderedCustomIdents"))

View file

@ -118,6 +118,10 @@
"orderedTrailingDelimiterDesc": "Set whether to add a trailing delimiter for ordered list.",
"orderedCustomTrailingDelimiter": "Custom trailing delimiter",
"orderedCustomTrailingDelimiterDesc": "Ignore the delimiter of the ordered list, customize another trailing delimiter.",
"orderedLeadingDelimiter": "Leading delimiter",
"orderedLeadingDelimiterDesc": "Set whether to add a leading delimiter for ordered list.",
"orderedCustomLeadingDelimiter": "Custom leading delimiter",
"orderedCustomLeadingDelimiterDesc": "Ignore the delimiter of the ordered list, customize another leading delimiter.",
"orderedCustomIdents": "Custom list styles",
"orderedCustomIdentsDesc": "For the \"Custom list styles\" option. Set custom list styles for ordered list. Use spaces to separate entries.",
"orderedSpecifiedString": "Specified string",

View file

@ -118,6 +118,10 @@
"orderedTrailingDelimiterDesc": "設定是否為有序列表補全尾隨分隔符。",
"orderedCustomTrailingDelimiter": "自定義尾隨分隔符",
"orderedCustomTrailingDelimiterDesc": "忽略有序列表的分隔符,自定義一個其他的尾隨分隔符。",
"orderedLeadingDelimiter": "前導分隔符",
"orderedLeadingDelimiterDesc": "設定是否為有序列表新增前導分隔符。",
"orderedCustomLeadingDelimiter": "自定義前導分隔符",
"orderedCustomLeadingDelimiterDesc": "忽略有序列表的分隔符,自定義一個其他的前導分隔符。",
"orderedCustomIdents": "自定義列表樣式",
"orderedCustomIdentsDesc": "針對\"自定義列表樣式\"選項。為有序列表設定自定義列表樣式。使用空格分隔條目。",
"orderedSpecifiedString": "指定字串",

View file

@ -118,6 +118,10 @@
"orderedTrailingDelimiterDesc": "设置是否为有序列表添加尾随分隔符。",
"orderedCustomTrailingDelimiter": "自定义尾随分隔符",
"orderedCustomTrailingDelimiterDesc": "忽略有序列表的分隔符,自定义一个其他的尾随分隔符。",
"orderedLeadingDelimiter": "前导分隔符",
"orderedLeadingDelimiterDesc": "设置是否为有序列表添加前导分隔符。",
"orderedCustomLeadingDelimiter": "自定义前导分隔符",
"orderedCustomLeadingDelimiterDesc": "忽略有序列表的分隔符,自定义一个其他的前导分隔符。",
"orderedCustomIdents": "自定义列表样式",
"orderedCustomIdentsDesc": "针对\"自定义列表样式\"选项。为有序列表设置自定义列表样式。使用空格分隔条目。",
"orderedSpecifiedString": "指定字符串",

View file

@ -905,6 +905,58 @@ describe("common/counter", function () {
expect(counter2.decorator(2)).to.equal("1.1|");
});
it("Counter.decorator with custom leading delimiter", function () {
const counter1 = new Counter({
ordered: true,
styleType: "decimal",
delimiter: ".",
customLeadingDelimiter: "",
leadingDelimiter: true,
});
expect(counter1.decorator(1)).to.equal(".1");
expect(counter1.decorator(2)).to.equal(".1.1");
const counter2 = new Counter({
ordered: true,
styleType: "decimal",
delimiter: ".",
customLeadingDelimiter: "|",
leadingDelimiter: true,
});
expect(counter2.decorator(1)).to.equal("|1");
expect(counter2.decorator(2)).to.equal("|1.1");
});
it("Counter.decorator with custom leading delimiter and trailing delimiter", function () {
const counter1 = new Counter({
ordered: true,
styleType: "decimal",
delimiter: ".",
customTrailingDelimiter: "",
trailingDelimiter: true,
customLeadingDelimiter: "",
leadingDelimiter: true,
});
expect(counter1.decorator(1)).to.equal(".1.");
expect(counter1.decorator(2)).to.equal(".1.1.");
const counter2 = new Counter({
ordered: true,
styleType: "decimal",
delimiter: ".",
customTrailingDelimiter: ")",
trailingDelimiter: true,
customLeadingDelimiter: "(",
leadingDelimiter: true,
});
expect(counter2.decorator(1)).to.equal("(1)");
expect(counter2.decorator(2)).to.equal("(1.1)");
});
it("Counter.decorator with ignoreTopLevel", function () {
const counter1 = new Counter({
ordered: true,