applyxrefs.py 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. """Adds xref targets to the top of files."""
  2. import sys
  3. import os
  4. testing = False
  5. DONT_TOUCH = (
  6. './index.txt',
  7. )
  8. def target_name(fn):
  9. if fn.endswith('.txt'):
  10. fn = fn[:-4]
  11. return '_' + fn.lstrip('./').replace('/', '-')
  12. def process_file(fn, lines):
  13. lines.insert(0, '\n')
  14. lines.insert(0, '.. %s:\n' % target_name(fn))
  15. try:
  16. with open(fn, 'w') as fp:
  17. fp.writelines(lines)
  18. except IOError:
  19. print("Can't open %s for writing. Not touching it." % fn)
  20. def has_target(fn):
  21. try:
  22. with open(fn, 'r') as fp:
  23. lines = fp.readlines()
  24. except IOError:
  25. print("Can't open or read %s. Not touching it." % fn)
  26. return (True, None)
  27. #print fn, len(lines)
  28. if len(lines) < 1:
  29. print("Not touching empty file %s." % fn)
  30. return (True, None)
  31. if lines[0].startswith('.. _'):
  32. return (True, None)
  33. return (False, lines)
  34. def main(argv=None):
  35. if argv is None:
  36. argv = sys.argv
  37. if len(argv) == 1:
  38. argv.extend('.')
  39. files = []
  40. for root in argv[1:]:
  41. for (dirpath, dirnames, filenames) in os.walk(root):
  42. files.extend([(dirpath, f) for f in filenames])
  43. files.sort()
  44. files = [os.path.join(p, fn) for p, fn in files if fn.endswith('.txt')]
  45. #print files
  46. for fn in files:
  47. if fn in DONT_TOUCH:
  48. print("Skipping blacklisted file %s." % fn)
  49. continue
  50. target_found, lines = has_target(fn)
  51. if not target_found:
  52. if testing:
  53. print('%s: %s' % (fn, lines[0]))
  54. else:
  55. print("Adding xref to %s" % fn)
  56. process_file(fn, lines)
  57. else:
  58. print("Skipping %s: already has a xref" % fn)
  59. if __name__ == '__main__':
  60. sys.exit(main())