summaryrefslogtreecommitdiff
path: root/support/match_parens
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2023-03-24 03:01:34 +0000
committerNorbert Preining <norbert@preining.info>2023-03-24 03:01:34 +0000
commit85fda71ebb01e4a5b0ce50edf3dda43f45ebb55a (patch)
tree8f1fa267e50afbbab02f04483ac3577a698c7916 /support/match_parens
parent46b6c321a2ff14698b756600bffb54d5d5fc3772 (diff)
CTAN sync 202303240301
Diffstat (limited to 'support/match_parens')
-rw-r--r--support/match_parens/README25
-rw-r--r--support/match_parens/README.md15
-rwxr-xr-xsupport/match_parens/match_parens287
-rw-r--r--support/match_parens/match_parens.1153
-rw-r--r--support/match_parens/match_parens.pdfbin57068 -> 56312 bytes
5 files changed, 336 insertions, 144 deletions
diff --git a/support/match_parens/README b/support/match_parens/README
deleted file mode 100644
index 115d88f953..0000000000
--- a/support/match_parens/README
+++ /dev/null
@@ -1,25 +0,0 @@
-|
--------:|:--------------------------------------
- script:| match_parens - find mismatches of various brackets and quotes
- type:| ruby
- author:| Wybo Dekker
- email:| wybo@dekkerdocumenten.nl
-version:| 1.43
-license:| Released under the GNU General Public License
-
-Mismatches of parentheses, braces, (angle) brackets, especially in TeX
-sources which may be rich in those, may be difficult to trace. This little
-script helps you by writing your text to standard output, after adding a
-left margin to your text, which will normally be almost empty, but will
-clearly show up to 10 mismatches. (Just try me on myself to see that the
-parenthesis starting this sentence will not appear to be matched at the end
-of the file. If you look at me in the vim editor, then select this
-paragraph and try the command: :!%.
-
-Recent changes:
-Changes with respect to version 1.41:
-- test on more quote characters (single, double, ASCII, Unicode)
-- option for changing the character pairs to be tested
-- conversion of latex' ``...'' is now an option
-- built-in test option --test
-
diff --git a/support/match_parens/README.md b/support/match_parens/README.md
new file mode 100644
index 0000000000..2cd5fa6a46
--- /dev/null
+++ b/support/match_parens/README.md
@@ -0,0 +1,15 @@
+ script: match_parens - find mismatches of various brackets and quotes
+ type: ruby
+ author: Wybo Dekker
+ email: wybo@dekkerdocumenten.nl
+version: 1.44
+license: GNU General Public License
+---
+Mismatches of parentheses, braces, (angle) brackets, especially in TeX
+sources which may be rich in those, may be difficult to trace. This little
+script helps you by writing your text to standard output, after adding a
+left margin to your text, which will normally be almost empty, but will
+clearly show up to 10 mismatches. (Just try me on myself to see that the
+parenthesis starting this sentence will not appear to be matched at the end
+of the file. If you look at me in the vim editor, then select this
+paragraph and try the command: :!%.
diff --git a/support/match_parens/match_parens b/support/match_parens/match_parens
index 5387e908d9..b5eaf10289 100755
--- a/support/match_parens/match_parens
+++ b/support/match_parens/match_parens
@@ -1,21 +1,23 @@
#!/usr/bin/env ruby
# encoding: utf-8
- MYNAME = File.basename($0)
-Version = '1.43'
+ Myname = File.basename($0)
+Version = '1.44'
+Help=
<<'DOC'
= match_parens - find mismatches of various brackets and quotes
= Synopsis
match_parens [filename]
-Options:
--p,--pairs=S set matching pairs to S (default: |{}[]()""“”''‘’|)
--n,--number=N set number of mismatching characters shown to N (default: 10)
--l,--latex convert |``...''| to |“...”| before testing
+== Options
+-h print this help and exit
+-H,--help print full documentation and exit
-V,--version print version and exit
--h,--help print short help information and exit
+-l,--latex convert ``...'' to “...” before testing
+-n,--number=N set number of mismatching characters shown to N (default: 10)
+-p,--pairs=S set matching pairs to S (default: {}[]()""“”''‘’)
--test do an internal test and exit
= Description
@@ -45,23 +47,26 @@ supposed to start with |<html>| or |=begin rdoc| and to end with
|</html>| or |=end|.
= Options
+-h,--help
+ print short help information and exit.
+-H,--Help
+ print full documentation via less and exit.
+-V,--version
+ print this script's version and exit.
+-l,--latex
+ convert |``...''| to |“...”| before testing.
+-n,--number=N
+ Set number of mismatching characters shown to N. By default, only the
+ first 10 are shown.
-p,--pairs=S
- Set matching pairs to S (default: |{}[]()""“”''‘’|). For example, if you
- want to look for mismatching ASCII single quotes /only/, use |--pairs="''"|.
+ Set matching pairs to S (default: |{}[]()""“”''‘’|). For
+ example, if you want to look for mismatching ASCII single quotes
+ /only/, use |--pairs="''"|.
Or, if you want to match braces and guillemets only, use |-p «»|.
Note that if html is detected in your text, |<>| is automatically added
to the pairs list. So by default, |<...>| is tested only in html, but
you can test that in other text by specifying the |<>| pair in the
|--pairs| option.
--n,--number=N
- Set number of mismatching characters shown to N. By default, only the
- first 10 are shown.
--l,--latex
- convert |``...''| to |“...”|` before testing.
--V,--version
- print this script's version and exit.
--h,--help
- print short help information and exit.
--test
do an internal test and exit. Note that if, with the |--pairs| option,
you specify an other pairs list than the default, the test will
@@ -70,136 +75,180 @@ supposed to start with |<html>| or |=begin rdoc| and to end with
= Examples
Suppose we have two files, |good| and |bad|, containing these texts:
- good: bad:
- This is a (simple) test This is a (simple test
- without mismatches containing mismatches
+
+good:
+ This is a (simple) test
+ without mismatches
+
+bad:
+ This is a (simple test
+ containing mismatches
then here are some usage examples. First a simple test on these files:
- $ match_parens good
- 1 | | This is a (simple) test
- 2 | | without mismatches
- $ echo $?
- 0
- $ match_parens bad
- 1 | ( | This is a (simple test
- 2 | ( | containing mismatches
- $ echo $?
- 1
+ $ matchparens good
+ 1 | | This is a (simple) test
+ 2 | | without mismatches
+ $ echo $?
+ 0
+ $ matchparens bad
+ 1 | ( | This is a (simple test
+ 2 | ( | containing mismatches
+ $ echo $?
+ 1
Just report if there are mismatches:
- $ match_parens good >/dev/null && echo fine || echo problems
- fine
- $ match_parens bad >/dev/null && echo fine || echo problems
- problems
+ $ matchparens good >/dev/null && echo fine || echo problems
+ fine
+ $ matchparens bad >/dev/null && echo fine || echo problems
+ problems
Report all tex files with mismatches in the current directory:
- $ for i in *.tex; do match_parens $i >/dev/null || echo $i; done
+ $ for i in *.tex; do matchparens $i >/dev/null || echo $i; done
Matches must be in correct order:
- $ echo -e "This is a ([simple)] test\n" | match_parens
- 1 ([)] This is a ([simple)] test
- 2 ([)]
-
-= Changes
-Changes with respect to version 1.41:
-- test on more quote characters (single, double, ASCII, Unicode)
-- option for changing the character pairs to be tested
-- conversion of latex' ``...'' is now an option
-- built-in test option |--test|
-
-= Author and copyright
-Author Wybo Dekker
-Email U{Wybo@dekkerdocumenten.nl}{wybo@dekkerdocumenten.nl}
-License Released under the U{www.gnu.org/copyleft/gpl.html}{GNU General Public License}
+ $ echo -e "This is a ([simple)] test\n" | match_parens
+ 1 ([)] This is a ([simple)] test
+ 2 ([)]
+
+= Author
+[Wybo Dekker](wybo@dekkerdocumenten.nl)
+
+= Copyright
+Released under the [GNU General Public License](www.gnu.org/copyleft/gpl.html)
DOC
require 'optparse'
+require 'ostruct'
+
+def help
+ system("echo \"#{Help}\" | less -P#{Myname}-#{Version.tr('.','·')}")
+end
+
+# Option defaults:
+$o = OpenStruct.new(
+ :number => 10,
+ :input => STDIN,
+ :latex => false,
+ :lineno => 0,
+ :s => '',
+ :html => false,
+ :test => false,
+:parenstext => %q{{}[]()""“”''‘’}
+)
+
+OptionParser.new(
+ banner = <<~EOD,
+ #{Myname} A find mismatches of various brackets and quotes\n
+ Usage: match_parens [filename]\n
+ Options:
+ EOD
+ width = 15, # 2x8-1
+ indent = ''
+) do |opts|
+
+ opts.on('-h',
+ 'print this help and exit'
+ ) do
+ puts opts.to_s.sub(/^ *-I\n/,'').gsub(/ /,'')
+ exit
+ end
+
+ opts.on('-H','--help',
+ 'print full documentation via less and exit'
+ ) do
+ help
+ exit
+ end
-number, input, latex, lineno, s, html, test, parenstext =
- 10, STDIN, false, 0, '', false, false, %q{{}[]()""“”''‘’}
-
-ARGV.options do |opt|
- opt.banner = "#{MYNAME} - find mismatches of parentheses, braces, (angle) brackets, in texts\n"
- opt.on('-p','--pairs=S',String,
- "set matching pairs to S (default: #{parenstext})"
- ) do |v|
- parenstext = v
- end
- opt.on('-n','--number=N',Integer,
- "set number of mismatching characters shown to N (default: #{number})"
- ) do |v|
- number = v
- end
- opt.on('-l','--latex',
- 'convert ``...'' to “...” before testing') do
- latex=true
- end
- opt.on('-V','--version',
- 'print version and exit') do
+ opts.on('-V','--version',
+ 'print version and exit'
+ ) do
puts Version
exit
- end
- opt.on('-h','--help',
- 'print this help and exit') do
- puts opt.to_s.sub(/^ *-I\n/,'')
+ end
+
+ opts.on('-l','--latex',
+ 'convert ``...'' to “...” before testing'
+ ) do
+ $o.latex=true
+ end
+
+ opts.on('-n','--number=N',Integer,
+ "set number of mismatching characters shown to N (default: #{$o.number})"
+ ) do |v|
+ $o.number = v
+ end
+
+ opts.on('-p','--pairs=S',String,
+ "set matching pairs to S (default: #{$o.parenstext})"
+ ) do |v|
+ $o.parenstext = v
+ end
+
+ opts.on('--test',
+ 'do an internal test and exit'
+ ) do
+ $o.input = DATA
+ $o.test = true
+ end
+
+ opts.on('-I') do
+ system("instscript #{Myname}")
exit
- end
- opt.on('--test',
- 'do an internal test and exit') do
- input = DATA
- test = true
- end
- opt.on('-I') do system("instscript --zip --pdf --markdown #{MYNAME}"); exit; end
- opt.parse!
+ end
+
+ opts.parse!
end
-parenshtml = parenstext =~ /<>/ ? parenstext : parenstext + '<>'
-parens = parenstext
+
+parenshtml = $o.parenstext =~ /<>/ ? $o.parenstext : $o.parenstext + '<>'
+parens = $o.parenstext
arg = ARGV[0] || ''
unless arg.empty?
- test(?e,arg) or raise("file #{arg} does not exist")
- test(?r,arg) or raise("file #{arg} is not readable")
- input = File.new(arg)
+ test(?e,arg) or raise("file #{arg} does not exist")
+ test(?r,arg) or raise("file #{arg} is not readable")
+ $o.input = File.new(arg)
end
-while x = input.gets()
- # convert LaTeX's ``...'' to “...”
- if latex
- x = x.gsub(/``/,'“').gsub(/''/,'”')
- end
-
- # only inside html text we check <>, too:
- if html && (x=~/^([# ]*=end)/ || x=~/<\/html>/i)
- html = false
- parens = parenstext
- elsif x=~/^([# ]*=begin rdoc)/ || x=~/<html>/i
- html = true
- parens = parenshtml
- end
- # match any pair like (), {}, [], “”, <> in parens
- re = Regexp.new(parens.scan(/../).join('|').gsub(/[{}()\[\]]/,'\\\\\&'))
-
- # move parens' characters into s
- s << x.tr('^'+parens,'')
- # remove matches from inside
- while s.gsub!(re,'') do end
- puts "%4d | %-*s | %s" % [lineno+=1,number,s.slice(0..number-1),x]
+while x = $o.input.gets()
+ # convert LaTeX's ``...'' to “...”
+ if $o.latex
+ x = x.gsub(/``/,'“').gsub(/''/,'”')
+ end
+
+ # only inside html text we check <>, too:
+ if $o.html && (x=~/^([# ]*=end)/ || x=~/<\/html>/i)
+ $o.html = false
+ parens = $o.parenstext
+ elsif x=~/^([# ]*=begin rdoc)/ || x=~/<html>/i
+ $o.html = true
+ parens = parenshtml
+ end
+ # match any pair like (), {}, [], “”, <> in parens
+ re = Regexp.new(parens.scan(/../).join('|').gsub(/[{}()\[\]$]/,'\\\\\&'))
+
+ # move parens' characters into s
+ $o.s << x.tr('^'+parens,'')
+ # remove matches from inside
+ while $o.s.gsub!(re,'') do end
+ puts "%4d | %-*s | %s" % [$o.lineno+=1,$o.number,$o.s.slice(0..$o.number-1),x]
end
-if test
- if s != '“{”}'
- raise("test failed! (final mismatch should be “{”})")
- else
- puts "test succeeded"
- end
+if $o.test
+ if s != '“{”}'
+ raise("test failed! (final mismatch should be “{”})")
+ else
+ puts "test succeeded"
+ end
else
- exit s.empty? ? 0 : 1
+ exit $o.s.empty? ? 0 : 1
end
__END__
This first line “{()}” has no mismatch
but here ( we have one.
It is even extended “{() with two more.
-Here comes an untested angle bracket <, but here }” all) mismatches are erased.
+Here comes an untested angle bracket <, but here }” all) mismatches
+are erased.
=begin rdoc
Inside html text now. ‘{There is an unmatched} single quote here.
diff --git a/support/match_parens/match_parens.1 b/support/match_parens/match_parens.1
new file mode 100644
index 0000000000..21f8113378
--- /dev/null
+++ b/support/match_parens/match_parens.1
@@ -0,0 +1,153 @@
+.TH match_parens 1 "March 23, 2023" "match_parens version 1.44" "DekDoc scripts"
+.SH NAME
+
+match_parens - find mismatches of various brackets and quotes
+
+.SH Synopsis
+
+.B match_parens [filename]
+
+.SS Options
+
+.B -h
+.RS
+print this help and exit
+.RE
+.B -H,--help
+.RS
+print full documentation and exit
+.RE
+.B -V,--version
+.RS
+print version and exit
+.RE
+.B -l,--latex
+.RS
+convert ``...'' to “...” before testing
+.RE
+.B -n,--number=N
+.RS
+set number of mismatching characters shown to N (default: 10)
+.RE
+.B -p,--pairs=S
+.RS
+set matching pairs to S (default: {}[]()""“”''‘’)
+.RE
+.B --test
+.RS
+do an internal test and exit
+.RE
+
+.SH Description
+Mismatches of parentheses, braces, (angle) brackets, especially in TeX sources which may be rich in those, may be difficult to trace. This little script helps you by writing your text to standard output, after adding a left margin to your text, which will normally be almost empty, but will clearly show up to 10 mismatches. (Just try me on myself to see that the parenthesis starting this sentence will not appear to be matched at the end of the file. If you look at me in the vim editor, then select this paragraph and try the command: :!%.
+
+By default, the following pairs are tested:
+
+.B ()
+.RS
+round brackets or parentheses
+.RE
+.B {}
+.RS
+curly brackets or braces
+.RE
+.B []
+.RS
+square brackets
+.RE
+.B <>
+.RS
+angle brackets (within html text only)
+.RE
+.B ""
+.RS
+ASCII double quotes
+.RE
+.B “”
+.RS
+Unicode double quotation marks
+.RE
+.B ''
+.RS
+ASCII single quotes
+.RE
+.B ‘’
+.RS
+Unicode single quotation marks
+.RE
+
+The exit value of the script is 0 when there are no mismatches, 1 otherwise.
+
+Angle brackets are only looked for inside HTML text, where HTML is supposed to start with <html> or =begin␣rdoc and to end with </html> or =end.
+
+.SH Options
+
+.B -h,--help
+.RS
+print short help information and exit.
+.RE
+.B -H,--Help
+.RS
+print full documentation via less and exit.
+.RE
+.B -V,--version
+.RS
+print this script's version and exit.
+.RE
+.B -l,--latex
+.RS
+convert ``...'' to “...” before testing.
+.RE
+.B -n,--number=N
+.RS
+Set number of mismatching characters shown to N. By default, only the first 10 are shown.
+.RE
+.B -p,--pairs=S
+.RS
+Set matching pairs to S (default: {}[]()""“”''‘’). For example, if you want to look for mismatching ASCII single quotes \fIonly\fR, use --pairs="''". Or, if you want to match braces and guillemets only, use -p␣«». Note that if html is detected in your text, <> is automatically added to the pairs list. So by default, <...> is tested only in html, but you can test that in other text by specifying the <> pair in the --pairs option.
+.RE
+.B --test
+.RS
+do an internal test and exit. Note that if, with the --pairs option, you specify an other pairs list than the default, the test will probably fail, but you can still see the effects of your pairs list on the test data.
+.RE
+
+.SH Examples
+Suppose we have two files, good and bad, containing these texts:
+
+.B good:
+.RS
+This is a (simple) test without mismatches
+.RE
+
+.B bad:
+.RS
+This is a (simple test containing mismatches
+.RE
+
+then here are some usage examples. First a simple test on these files: $ matchparens good
+ 1 || This is a (simple) test
+ 2 || without mismatches
+ $ echo $?
+ 0
+ $ matchparens bad
+ 1 | (| This is a (simple test
+ 2 | (| containing mismatches
+ $ echo $?
+ 1
+
+Just report if there are mismatches: $ matchparens good >/dev/null && echo fine || echo problems
+ fine
+ $ matchparens bad >/dev/null && echo fine || echo problems
+ problems
+
+Report all tex files with mismatches in the current directory: $ for i in *.tex; do matchparens $i >/dev/null || echo $i; done
+
+Matches must be in correct order: $ echo -e "This is a ([simple)] test\n" | match_parens
+ 1 ([)]This is a ([simple)] test
+ 2 ([)]
+
+.SH Author
+Wybo Dekker (wybo@dekkerdocumenten.nl)
+
+.SH Copyright
+Released under the GNU General Public License (www.gnu.org\fIcopyleft\fRgpl.html)
diff --git a/support/match_parens/match_parens.pdf b/support/match_parens/match_parens.pdf
index 59f9f99b15..e1bf6d1ab8 100644
--- a/support/match_parens/match_parens.pdf
+++ b/support/match_parens/match_parens.pdf
Binary files differ