Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Options to disable/enable rules #431

Open
verhovsky opened this issue Apr 4, 2024 · 3 comments
Open

Options to disable/enable rules #431

verhovsky opened this issue Apr 4, 2024 · 3 comments
Labels
enhancement New feature or request

Comments

@verhovsky
Copy link

Context

I want to format a bunch of markdown files, but I don't want to apply all the rules, just one important rule.

For example, I have this in my frontmatter

contributors:
    - ["First Last", "email@example.com"]

which is changing the indentation and removing the quotes around the name. I don't want this.

Proposal

A syntax like https://github.com/markdownlint/markdownlint has for enabling/disabling rules

mdformat -r ~frontmatter *.md

Tasks and updates

No response

@verhovsky verhovsky added the enhancement New feature or request label Apr 4, 2024
Copy link

welcome bot commented Apr 4, 2024

Thanks for opening your first issue here! Engagement like this is essential for open source projects! 🤗

If you haven't done so already, check out EBP's Code of Conduct. Also, please try to follow the issue template as it helps other community members to contribute more effectively.

If your issue is a feature request, others may react to it, to raise its prominence (see Feature Voting).

Welcome to the EBP community! 🎉

@hukkin
Copy link
Member

hukkin commented Apr 4, 2024

Frontmatter is not a CommonMark rule so there is not support for it in mdformat without plugins. Does installing mdformat-frontmatter plugin solve your problem?

@verhovsky
Copy link
Author

verhovsky commented Apr 4, 2024

I have it installed, that's why it's formatting the frontmatter. Without it installed the mdformat treats it as markdown and completely destroys it, starting by replacing --- with a long line of ---------------------------. But there are other rules I wanted to disable, that was just an example. In fact, I only wanted one rule. I ended up hacking together a Python script with ChatGPT to do it instead and checking its output by hand

import sys
import glob

def process_files(filenames):
    for filename in filenames:
        with open(filename, "r") as file:
            lines = file.readlines()

        code_fence_count = [0] * len(lines)
        for i, line in enumerate(lines):
            if i > 0:
                code_fence_count[i] = code_fence_count[i-1]
            if line.strip().startswith("```"):
                code_fence_count[i] += 1

        save = False
        modified_lines = []
        for i, line in enumerate(lines):
            if line.strip().startswith("```"):
                if "groovy" in filename and 'ca-es' in filename:
                    pass
                is_starting_fence = code_fence_count[i] % 2 == 1
                if is_starting_fence:
                    if i > 0 and lines[i-1].strip():
                        save = True
                        modified_lines.append("\n")
                    # Remove any empty lines immediately after the opening fence
                    while i + 1 < len(lines) and not lines[i+1].strip():
                        i += 1
                else:
                    # Remove any empty lines immediately before the closing fence
                    while modified_lines and not modified_lines[-1].strip():
                        modified_lines.pop()
                    if i < len(lines) - 1 and lines[i+1].strip():
                        line += "\n"
            modified_lines.append(line)

        if save and not "markdown" in filename.removesuffix(".markdown") and "vim" not in filename and "livescript" not in filename:
            with open(filename, "w") as file:
                file.writelines(modified_lines)

def main():
    if len(sys.argv) > 1:
        filenames = sys.argv[1:]
    else:
        # Process all .md and .markdown files in the current directory
        filenames = glob.glob("**/*.md") + glob.glob("**/*.markdown")

    process_files(filenames)

if __name__ == "__main__":
    main()

adambard/learnxinyminutes-docs@01bbd08

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or request
Projects
None yet
Development

No branches or pull requests

2 participants