Skip to content

Commit

Permalink
Merge pull request #612 from pjkaufman/master
Browse files Browse the repository at this point in the history
Updated Logic to Allow Multi-Line Array Formatting to Remove Unnecessary Escape Chararcters
  • Loading branch information
pjkaufman authored Feb 2, 2023
2 parents c7f7477 + a771c58 commit 8ebebe3
Show file tree
Hide file tree
Showing 9 changed files with 252 additions and 11 deletions.
158 changes: 158 additions & 0 deletions __tests__/format-yaml-arrays.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -237,6 +237,47 @@ ruleTest({
tagArrayStyle: NormalArrayFormats.MultiLine,
},
},
{
testName: 'Convert tags from single-line array to multi-line array with no changes removes unnecessary escape values when `removeUnnecessaryEscapeCharsForMultiLineArrays = true`',
before: dedent`
---
tag: ["tag1", tag2, tag3, tag4]
---
`,
after: dedent`
---
tag:
- tag1
- tag2
- tag3
- tag4
---
`,
options: {
tagArrayStyle: NormalArrayFormats.MultiLine,
removeUnnecessaryEscapeCharsForMultiLineArrays: true,
},
},
{
testName: 'Convert tags from single-line array to multi-line array with no changes doesn\'t remove unnecessary escape values when `removeUnnecessaryEscapeCharsForMultiLineArrays = false`',
before: dedent`
---
tag: ["tag1", tag2, tag3, tag4]
---
`,
after: dedent`
---
tag:
- "tag1"
- tag2
- tag3
- tag4
---
`,
options: {
tagArrayStyle: NormalArrayFormats.MultiLine,
},
},

// aliases
{
Expand Down Expand Up @@ -387,6 +428,47 @@ ruleTest({
formatAliasKey: false,
},
},
{
testName: 'Convert aliases from single-line array to multi-line array with no changes removes unnecessary escape values when `removeUnnecessaryEscapeCharsForMultiLineArrays = true`',
before: dedent`
---
aliases: ["alias1", alias2, alias3, alias4]
---
`,
after: dedent`
---
aliases:
- alias1
- alias2
- alias3
- alias4
---
`,
options: {
aliasArrayStyle: NormalArrayFormats.MultiLine,
removeUnnecessaryEscapeCharsForMultiLineArrays: true,
},
},
{
testName: 'Convert aliases from single-line array to multi-line array with no changes doesn\'t remove unnecessary escape values when `removeUnnecessaryEscapeCharsForMultiLineArrays = false`',
before: dedent`
---
aliases: ["alias1", alias2, alias3, alias4]
---
`,
after: dedent`
---
aliases:
- "alias1"
- alias2
- alias3
- alias4
---
`,
options: {
aliasArrayStyle: NormalArrayFormats.MultiLine,
},
},

// default array style
{
Expand Down Expand Up @@ -498,6 +580,43 @@ ruleTest({
defaultArrayStyle: NormalArrayFormats.MultiLine,
},
},
{
testName: 'Convert single-line to multi-line for regular yaml arrays doesn\'t remove unnecessary escape values when `removeUnnecessaryEscapeCharsForMultiLineArrays = false`',
before: dedent`
---
key: [val1, "other val"]
---
`,
after: dedent`
---
key:
- val1
- "other val"
---
`,
options: {
defaultArrayStyle: NormalArrayFormats.MultiLine,
},
},
{
testName: 'Convert single-line to multi-line for regular yaml arrays removes unnecessary escape values when `removeUnnecessaryEscapeCharsForMultiLineArrays = true`',
before: dedent`
---
key: [val1, "other val"]
---
`,
after: dedent`
---
key:
- val1
- other val
---
`,
options: {
defaultArrayStyle: NormalArrayFormats.MultiLine,
removeUnnecessaryEscapeCharsForMultiLineArrays: true,
},
},

// force single-line
{
Expand Down Expand Up @@ -630,6 +749,45 @@ ruleTest({
forceMultiLineArrayStyle: ['key'],
},
},
{
testName: 'Forcing multi-line on a single-line array results in a multi-line array with existing unnecessary escape values when `removeUnnecessaryEscapeCharsForMultiLineArrays = false`',
before: dedent`
---
key: [val1, "other val"]
---
`,
after: dedent`
---
key:
- val1
- "other val"
---
`,
options: {
defaultArrayStyle: NormalArrayFormats.SingleLine,
forceMultiLineArrayStyle: ['key'],
},
},
{
testName: 'Forcing multi-line on a single-line array results in a multi-line array without existing unnecessary escape values when `removeUnnecessaryEscapeCharsForMultiLineArrays = true`',
before: dedent`
---
key: [val1, "other val"]
---
`,
after: dedent`
---
key:
- val1
- other val
---
`,
options: {
defaultArrayStyle: NormalArrayFormats.SingleLine,
forceMultiLineArrayStyle: ['key'],
removeUnnecessaryEscapeCharsForMultiLineArrays: true,
},
},

// edge cases
{
Expand Down
1 change: 1 addition & 0 deletions src/main.ts
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,7 @@ const DEFAULT_SETTINGS: Partial<LinterSettings> = {
tagArrayStyle: NormalArrayFormats.SingleLine,
minimumNumberOfDollarSignsToBeAMathBlock: 2,
escapeCharacter: '"',
removeUnnecessaryEscapeCharsForMultiLineArrays: false,
},
};

Expand Down
1 change: 1 addition & 0 deletions src/rules-runner.ts
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,7 @@ export class RulesRunner {
aliasArrayStyle: runOptions.settings.commonStyles.aliasArrayStyle,
tagArrayStyle: runOptions.settings.commonStyles.tagArrayStyle,
defaultEscapeCharacter: runOptions.settings.commonStyles.escapeCharacter,
removeUnnecessaryEscapeCharsForMultiLineArrays: runOptions.settings.commonStyles.removeUnnecessaryEscapeCharsForMultiLineArrays,
});
timingEnd(rule.alias());
}
Expand Down
1 change: 1 addition & 0 deletions src/rules.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ export type CommonStyles = {
tagArrayStyle: TagSpecificArrayFormats | NormalArrayFormats | SpecialArrayFormats;
minimumNumberOfDollarSignsToBeAMathBlock: number;
escapeCharacter: string;
removeUnnecessaryEscapeCharsForMultiLineArrays: boolean;
}

export type Options = { [optionName: string]: any};
Expand Down
54 changes: 49 additions & 5 deletions src/rules/format-yaml-arrays.ts
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,10 @@ class FormatYamlArrayOptions implements Options {
formatArrayKeys?: boolean = true;
forceSingleLineArrayStyle?: string[] = [];
forceMultiLineArrayStyle?: string[] = [];
@RuleBuilder.noSettingControl()
defaultEscapeCharacter?: string = '"';
@RuleBuilder.noSettingControl()
removeUnnecessaryEscapeCharsForMultiLineArrays?: boolean = false;
}

@RuleBuilder.register
Expand All @@ -51,15 +55,31 @@ export default class RuleTemplate extends RuleBuilder<FormatYamlArrayOptions> {

for (const aliasKey of OBSIDIAN_ALIASES_KEYS) {
if (options.formatAliasKey && Object.keys(yaml).includes(aliasKey)) {
text = setYamlSection(text, aliasKey, formatYamlArrayValue(convertAliasValueToStringOrStringArray(splitValueIfSingleOrMultilineArray(getYamlSectionValue(text, aliasKey))), options.aliasArrayStyle));
text = setYamlSection(text,
aliasKey,
formatYamlArrayValue(
convertAliasValueToStringOrStringArray(splitValueIfSingleOrMultilineArray(getYamlSectionValue(text, aliasKey))),
options.aliasArrayStyle,
options.defaultEscapeCharacter,
options.removeUnnecessaryEscapeCharsForMultiLineArrays,
),
);

break;
}
}

for (const tagKey of OBSIDIAN_TAG_KEYS) {
if (options.formatTagKey && Object.keys(yaml).includes(tagKey)) {
text = setYamlSection(text, tagKey, formatYamlArrayValue(convertTagValueToStringOrStringArray(splitValueIfSingleOrMultilineArray(getYamlSectionValue(text, tagKey))), options.tagArrayStyle));
text = setYamlSection(text,
tagKey,
formatYamlArrayValue(
convertTagValueToStringOrStringArray(splitValueIfSingleOrMultilineArray(getYamlSectionValue(text, tagKey))),
options.tagArrayStyle,
options.defaultEscapeCharacter,
options.removeUnnecessaryEscapeCharsForMultiLineArrays,
),
);

break;
}
Expand All @@ -74,7 +94,15 @@ export default class RuleTemplate extends RuleBuilder<FormatYamlArrayOptions> {
continue;
}

text = setYamlSection(text, key, formatYamlArrayValue(splitValueIfSingleOrMultilineArray(getYamlSectionValue(text, key)), options.defaultArrayStyle));
text = setYamlSection(text,
key,
formatYamlArrayValue(
splitValueIfSingleOrMultilineArray(getYamlSectionValue(text, key)),
options.defaultArrayStyle,
options.defaultEscapeCharacter,
options.removeUnnecessaryEscapeCharsForMultiLineArrays,
),
);
}
}

Expand All @@ -83,15 +111,31 @@ export default class RuleTemplate extends RuleBuilder<FormatYamlArrayOptions> {
continue;
}

text = setYamlSection(text, singleLineArrayKey, formatYamlArrayValue(splitValueIfSingleOrMultilineArray(getYamlSectionValue(text, singleLineArrayKey)), NormalArrayFormats.SingleLine));
text = setYamlSection(text,
singleLineArrayKey,
formatYamlArrayValue(
splitValueIfSingleOrMultilineArray(getYamlSectionValue(text, singleLineArrayKey)),
NormalArrayFormats.SingleLine,
options.defaultEscapeCharacter,
options.removeUnnecessaryEscapeCharsForMultiLineArrays,
),
);
}

for (const multiLineArrayKey of options.forceMultiLineArrayStyle) {
if (!Object.keys(yaml).includes(multiLineArrayKey)) {
continue;
}

text = setYamlSection(text, multiLineArrayKey, formatYamlArrayValue(splitValueIfSingleOrMultilineArray(getYamlSectionValue(text, multiLineArrayKey)), NormalArrayFormats.MultiLine));
text = setYamlSection(text,
multiLineArrayKey,
formatYamlArrayValue(
splitValueIfSingleOrMultilineArray(getYamlSectionValue(text, multiLineArrayKey)),
NormalArrayFormats.MultiLine,
options.defaultEscapeCharacter,
options.removeUnnecessaryEscapeCharsForMultiLineArrays,
),
);
}

return text;
Expand Down
6 changes: 5 additions & 1 deletion src/rules/move-tags-to-yaml.ts
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,10 @@ class MoveTagsToYamlOptions implements Options {
tagArrayStyle? : TagSpecificArrayFormats | NormalArrayFormats | SpecialArrayFormats = NormalArrayFormats.SingleLine;
howToHandleExistingTags?: tagOperations = 'Nothing';
tagsToIgnore?: string[] = [];
@RuleBuilder.noSettingControl()
defaultEscapeCharacter?: string = '"';
@RuleBuilder.noSettingControl()
removeUnnecessaryEscapeCharsForMultiLineArrays?: boolean = false;
}

@RuleBuilder.register
Expand Down Expand Up @@ -85,7 +89,7 @@ export default class MoveTagsToYaml extends RuleBuilder<MoveTagsToYamlOptions> {
}
}

const newYaml = setYamlSection(text, existingTagKey, formatYamlArrayValue(tagValue, options.tagArrayStyle));
const newYaml = setYamlSection(text, existingTagKey, formatYamlArrayValue(tagValue, options.tagArrayStyle, options.defaultEscapeCharacter, options.removeUnnecessaryEscapeCharsForMultiLineArrays));

return `---\n${newYaml}---`;
});
Expand Down
11 changes: 7 additions & 4 deletions src/rules/yaml-title-alias.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,9 @@ class YamlTitleAliasOptions implements Options {

@RuleBuilder.noSettingControl()
defaultEscapeCharacter?: string = '"';

@RuleBuilder.noSettingControl()
removeUnnecessaryEscapeCharsForMultiLineArrays?: boolean = false;
}

@RuleBuilder.register
Expand Down Expand Up @@ -129,15 +132,15 @@ export default class YamlTitleAlias extends RuleBuilder<YamlTitleAliasOptions> {
newYaml = removeYamlSection(newYaml, aliasKeyForFile);
} else if (options.preserveExistingAliasesSectionStyle) {
if (!isEmpty && ((isSingleString && title == newAliasValue) || !isSingleString || currentAliasValue == newAliasValue)) {
newYaml = setYamlSection(newYaml, aliasKeyForFile, formatYamlArrayValue(newAliasValue, currentAliasStyle));
newYaml = setYamlSection(newYaml, aliasKeyForFile, formatYamlArrayValue(newAliasValue, currentAliasStyle, options.defaultEscapeCharacter, options.removeUnnecessaryEscapeCharsForMultiLineArrays));
} else {
newYaml = setYamlSection(newYaml, aliasKeyForFile, formatYamlArrayValue(newAliasValue, options.aliasArrayStyle));
newYaml = setYamlSection(newYaml, aliasKeyForFile, formatYamlArrayValue(newAliasValue, options.aliasArrayStyle, options.defaultEscapeCharacter, options.removeUnnecessaryEscapeCharsForMultiLineArrays));
}
} else {
newYaml = setYamlSection(newYaml, aliasKeyForFile, formatYamlArrayValue(newAliasValue, options.aliasArrayStyle));
newYaml = setYamlSection(newYaml, aliasKeyForFile, formatYamlArrayValue(newAliasValue, options.aliasArrayStyle, options.defaultEscapeCharacter, options.removeUnnecessaryEscapeCharsForMultiLineArrays));
}
} else if (!shouldRemoveTitleAlias) {
newYaml = setYamlSection(newYaml, OBSIDIAN_ALIAS_KEY_PLURAL, formatYamlArrayValue(title, options.aliasArrayStyle));
newYaml = setYamlSection(newYaml, OBSIDIAN_ALIAS_KEY_PLURAL, formatYamlArrayValue(title, options.aliasArrayStyle, options.defaultEscapeCharacter, options.removeUnnecessaryEscapeCharsForMultiLineArrays));
}

if (!options.useYamlKeyToKeepTrackOfOldFilenameOrHeading || shouldRemoveTitleAlias) {
Expand Down
17 changes: 17 additions & 0 deletions src/ui/linter-components/tab-components/general-tab.ts
Original file line number Diff line number Diff line change
Expand Up @@ -165,6 +165,23 @@ export class GeneralTab extends Tab {

this.addSettingSearchInfo(tempDiv, settingName, settingDesc);

tempDiv = this.contentEl.createDiv();
settingName = 'Remove Unnecessary Escape Characters when in Multi-Line Array Format';
settingDesc = 'Escape characters for multi-line YAML arrays don\'t need the same escaping as single-line arrays, so when in multi-line format remove extra escapes that are not necessary';
new Setting(tempDiv)
.setName(settingName)
.setDesc(settingDesc)
.addToggle((toggle) => {
toggle
.setValue(this.plugin.settings.commonStyles.removeUnnecessaryEscapeCharsForMultiLineArrays)
.onChange(async (value) => {
this.plugin.settings.commonStyles.removeUnnecessaryEscapeCharsForMultiLineArrays = value;
await this.plugin.saveSettings();
});
});

this.addSettingSearchInfo(tempDiv, settingName, settingDesc);

tempDiv = this.contentEl.createDiv();
settingName = 'Number of Dollar Signs to Indicate Math Block';
settingDesc = 'The amount of dollar signs to consider the math content to be a math block instead of inline math';
Expand Down
Loading

0 comments on commit 8ebebe3

Please sign in to comment.