From 1c39817dbba19c5ef1e95912dabb3805085871ac Mon Sep 17 00:00:00 2001 From: Karl Berry Date: Mon, 20 Feb 2012 23:30:41 +0000 Subject: match_parens (20feb12) git-svn-id: svn://tug.org/texlive/trunk@25447 c570f23f-e606-0410-a88d-b1316a301751 --- .../texmf-dist/scripts/match_parens/match_parens | 100 +++++++++++++++------ 1 file changed, 74 insertions(+), 26 deletions(-) (limited to 'Master/texmf-dist/scripts') diff --git a/Master/texmf-dist/scripts/match_parens/match_parens b/Master/texmf-dist/scripts/match_parens/match_parens index b5c0fa18da1..42286fa1141 100755 --- a/Master/texmf-dist/scripts/match_parens/match_parens +++ b/Master/texmf-dist/scripts/match_parens/match_parens @@ -4,20 +4,63 @@ == match_parens - find mismatches of parentheses, braces, (angle) brackets, in texts -== Synopsis +=== Synopsis match_parens [_filename_] -== Description +=== 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 any 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, try the command -:%!% +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 any 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 :!% + +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 , =begin rdoc, or <, =end or RDOC + +=== 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 + +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 + +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 + +Report all tex files with mismatches in the current directory: + + $ for i in *.tex; do match_parens $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 ([)] === Copyright @@ -33,29 +76,34 @@ but without any warranty; without even the implied warranty of merchantability or fitness for a particular purpose. See the {GNU General Public License}[http://www.gnu.org/licenses/] for more details. -$Id: match_parens,v 1.7 2011-07-30 09:31:24 wybo Exp $ +$Id: match_parens,v 1.10 2012/02/20 13:28:52 wybo Exp $ =end private - s, n, html, parens = + s, n, html, notparens = '', '0', false, '^{}[]()' -RELEASE = 1.3 +RELEASE = 1.4 -while gets() - if html - if ~/^=end/ || ~/<\/html>/i +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") +end +while x = gets() + if html && (x=~/^(RDOC|[# ]*=end)/ || x=~/<\/html>/i) html = false - parens = '^{}[]()' - end - else - if ~/^=begin rdoc/ || ~/\/i + notparens = '^{}[]()' + elsif !html && (x=~/^(</i) html = true - parens = '^{}[]()<>' - end - end - # look for <> in html or rdoc: - s << $_.tr(parens,'') - while s.gsub!(/\{\}|\(\)|\[\]|<>/,'') do end - puts [n.next!,s,$_].join("\t") + notparens = '^{}[]()<>' + end + # remove {x} where x in []{}()<>, copy all parens to s + s << x.sub(/^<]\}/,''). + tr(notparens,'') + # remove matches from inside + while s.gsub!(/\{\}|\(\)|\[\]|<>/,'') do end + puts ["%7d" % [n.next!],s,x].join("\t") end +exit s.empty? ? 0 : 1 -- cgit v1.2.3