prettier-ignore-helper.pl 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. #!/usr/bin/env perl
  2. use strict;
  3. use warnings;
  4. # Usage: perl add_prettier_ignore.pl file1.md [file2.md ...]
  5. foreach my $file (@ARGV) {
  6. open my $in, '<', $file or die "Cannot open $file: $!";
  7. my @lines = <$in>;
  8. close $in;
  9. open my $out, '>', $file or die "Cannot write to $file: $!";
  10. my $inside_ignore = 0;
  11. my $i = 0;
  12. while ($i <= $#lines) {
  13. my $line = $lines[$i];
  14. # Detect entering or leaving prettier-ignore regions
  15. if ($line =~ /<!--\s*prettier-ignore-start\s*-->/) {
  16. $inside_ignore = 1;
  17. print $out $line;
  18. $i++;
  19. next;
  20. }
  21. if ($line =~ /<!--\s*prettier-ignore-end\s*-->/) {
  22. $inside_ignore = 0;
  23. print $out $line;
  24. $i++;
  25. next;
  26. }
  27. # Detect non-indented tabpane opening
  28. if (!$inside_ignore && $line =~ /^\s*\{\{<\s*tabpane.*?>\}\}\s*$/ && $line !~ /^\s{1,}\{\{<\s*tabpane.*?>\}\}\s*$/) {
  29. # Only process if NOT indented (no leading spaces/tabs)
  30. if ($i == 0 || $lines[$i-1] !~ /<!--\s*prettier-ignore-start\s*-->/) {
  31. print $out "<!-- prettier-ignore-start -->\n";
  32. }
  33. print $out $line;
  34. $i++;
  35. # Print inner block until non-indented closing shortcode
  36. while ($i <= $#lines) {
  37. my $inner = $lines[$i];
  38. print $out $inner;
  39. if ($inner =~ /^\s*\{\{<\s*\/tabpane\s*>\}\}\s*$/ && $inner !~ /^\s{1,}\{\{<\s*\/tabpane\s*>\}\}\s*$/) {
  40. # Check next line for ignore-end
  41. if ($i == $#lines || $lines[$i+1] !~ /<!--\s*prettier-ignore-end\s*-->/) {
  42. print $out "<!-- prettier-ignore-end -->\n";
  43. }
  44. $i++;
  45. last;
  46. }
  47. $i++;
  48. }
  49. next;
  50. }
  51. # Detect indented tabpane opening/closing not in an ignore region and warn
  52. if (!$inside_ignore &&
  53. (
  54. ($line =~ /^\s+\{\{<\s*tabpane.*?>\}\}\s*$/) ||
  55. ($line =~ /^\s+\{\{<\s*\/tabpane.*?>\}\}\s*$/)
  56. )
  57. ) {
  58. print STDERR "$file:", $i+1, ": WARNING: Indented tabpane shortcode found, usually because it is in a list. Add prettier-ignore directive manually before the start of the list.\n";
  59. }
  60. print $out $line;
  61. $i++;
  62. }
  63. close $out;
  64. }
  65. print "Processed ", scalar(@ARGV), " files.\n";