Adding a new command to look for accidental
authorDavid Anderson <davea42@earthlink.net>
Sun, 23 Feb 2014 17:15:23 +0000 (09:15 -0800)
committerDavid Anderson <davea42@earthlink.net>
Sun, 23 Feb 2014 17:15:23 +0000 (09:15 -0800)
word repeats.

tools/README: Document use of repeats.py
tools/repeats.py: Looks for repeated words or phrases
tools/testrepeats.txt: Small test case for repeats.py

dwarf5/tools/README
dwarf5/tools/repeats.py [new file with mode: 0644]
dwarf5/tools/testrepeats.txt [new file with mode: 0644]

index 5ac3a03..bd3b49a 100644 (file)
@@ -4,7 +4,7 @@ complete and correct.
 A list of the python source files with the purpose
 of each is near the end of this FILE.
 
-SPELLCHECK: 
+BASIC CHECKS:
 One way to do a spell check on the final document,
 and to get a simple text output to look for word repeats
 is to do the following (assuming you have the necessary
@@ -17,6 +17,23 @@ tools):
    # Let upper and lower case compare equal
    spell dwarf5.txt2 |sort -f |uniq -i
 
+Once you have dwarf5.txt, the following script and tool
+will look for repeated words and short phrases, something
+that can creep in via typos or by accidents of latex use:
+We use several lines to keep the lines short here.
+This is more than a little sloppy and repeats.py
+is not very powerful.
+   sed -e 's/:/ /g' <../latexdoc/dwarf5.txt >junk.txt
+   sed -e 's/,/ /g' -e 's/;/ /g' <junk.txt >junk2.txt
+   sed -e 's/:/ /g' <junk2.txt >junk3.txt
+   sed -e 's/(/ /g' -e 's/)/ /g' -e 's/[.]/ /g'  <junk3.txt >junk4.txt
+   # Look for 1-word repeated in a 2-word window
+   python repeats.py 2 1 junk4.txt
+   # Look for 2 words repeated in a 4-word window
+   python repeats.py 4 2 junk4.txt
+
+
+
 CAUTION: 
 The tools don't really do parsing and
 the lexical processing is barely adequate for the task.
diff --git a/dwarf5/tools/repeats.py b/dwarf5/tools/repeats.py
new file mode 100644 (file)
index 0000000..ddb3fa9
--- /dev/null
@@ -0,0 +1,133 @@
+# Copyright 2014 DWARF Debugging Information Format Committee
+# This reads the a text file, usually
+# the output of   pdftotext dwarf5.txt
+# looks at each word in turn, keeping a window
+# of words, looking for repeated words and short
+# phrases
+
+import sys
+
+global checkwindow
+checkwindow = []
+
+# Eliminates lots of stuff 
+# But allows plain numbers through.
+def strisasciialpha(s):
+  ok = "y"
+  for c in s:
+    if c >= 'a' and c <= 'z':
+       continue
+    elif c >= 'A' and c <= 'Z':
+       continue
+    # Pure numbers will be eliminated 
+    # later
+    elif c >= '0' and c <= '9':
+       continue
+    elif c == '-':
+       continue
+    elif c == '_':
+       continue
+    elif c == '\\':
+       continue
+    elif c == '/':
+       continue
+    else:
+       return "n"
+  return "y"
+
+def checkdup(filename,line,checkwindow,phrasewindow,winlen,phraselen):
+  iw = -1 
+  winlen = len(checkwindow)
+  phraselen = len(phrasewindow)
+  # Numbers -- we claim we can never match
+  for w in phrasewindow:
+    if strisasciialpha(w) == "n":
+      return "n"
+    # If it is just a number, do not match
+    try: float(w)
+    except ValueError: continue 
+    else: return "n"
+  for winword in checkwindow:
+    match = 0
+    iw = iw + 1
+    if (iw + phraselen) < winlen:
+      ip = -1
+      match = 0
+      for pw in phrasewindow:
+        ip = ip + 1
+        if checkwindow[iw+ip] == phrasewindow[ip]:
+          match = match +1
+    if match == phraselen:
+      print "duplicated: ",phrasewindow," file ", filename,"line",line
+      return "y"
+  return "n"
+   
+      
+      
+def updatewindow(winin,word,winlen):
+   if len(winin) < winlen:
+      out = winin + [word]
+      return out
+   if winlen == 1:
+      out = [word]
+      return out
+   tmp = winin[1:]
+   out = tmp + [word]
+   return out
+
+def procrecords(filename,recs,winlen,phraselen):
+  global checkwindow
+  phrasewindow = []
+  curline=0
+  for r in recs:
+    curline = curline +1
+    line = r.split()
+    wdct = len(line)
+    if wdct > 0:
+      ct = 0
+      while ct < wdct:
+        w = line[ct]
+        ct = ct + 1
+        pw2 = updatewindow(phrasewindow,w,phraselen)
+        phrasewindow = pw2
+        if len(phrasewindow) < phraselen:
+          pw3 = updatewindow(checkwindow,w,winlen)
+          checkwindow = pw3
+          continue
+        res = checkdup(filename,curline,checkwindow,phrasewindow,winlen,phraselen)
+        pw3 = updatewindow(checkwindow,w,winlen)
+        checkwindow = pw3
+
+def procfile(file,filename,winlen,phraselen):
+  records = file.readlines()
+  procrecords(filename,records,int(winlen),int(phraselen))
+  
+
+def read_args():
+  cur = 1
+  filelist = []
+  if len(sys.argv) != 4:
+    print "Expect 3 arguments N N <file>"
+    sys.exit(1)
+  
+  w = sys.argv[1]
+  p = sys.argv[2]
+  if p > w :
+    winlen = p
+    phraselen = w
+  else:
+    phraselen = p
+    winlen = w
+  v = sys.argv[3]
+  try:
+      file = open(v,"r")
+  except IOError:
+      print "Unable to open ",v
+      sys.exit(1)
+  procfile(file,v,int(winlen),int(phraselen))
+
+if __name__ == '__main__':
+  read_args()
+  
+
+
diff --git a/dwarf5/tools/testrepeats.txt b/dwarf5/tools/testrepeats.txt
new file mode 100644 (file)
index 0000000..49cd550
--- /dev/null
@@ -0,0 +1,17 @@
+
+this is ok
+when
+
+when
+
+there
+there is
+
+when we 
+when
+we
+
+we do something now or
+we do something now.
+The size in bytes of the contents of the other stuff
+