bwTL.py 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. #!/usr/bin/python3
  2. # bwTL - BW's template library
  3. # by Bill Weinman [http://bw.org/]
  4. # Copyright 1995-2010 The BearHeart Group LLC
  5. import re
  6. import sys
  7. __version__ = '0.6.1'
  8. utf_8 = 'utf_8'
  9. class tlStr:
  10. ''' string templating class '''
  11. __vars = {}
  12. _sep = '\$'
  13. flags = dict(
  14. showUnknowns = False,
  15. entityEncode = True
  16. )
  17. def __init__(self, s = '', **kwargs):
  18. self.__s = s
  19. self._init_re(kwargs)
  20. def _init_re(self, kwargs):
  21. if 'sep' in kwargs: self._sep = kwargs['sep']
  22. self.__re = re.compile(r'{0}(.*?){0}'.format(self._sep))
  23. def _init_flags(self, kwargs):
  24. self.flags['showUnknowns'] = kwargs.get('showUnknowns', False)
  25. self.flags['entityEncode'] = kwargs.get('entityEncode', True)
  26. def var(self, k, v = None):
  27. if v is not None:
  28. self.__vars[k] = str(v)
  29. if k in self.__vars:
  30. return self.__vars[k]
  31. elif self.flags['showUnknowns']:
  32. return '** UNK {} **'.format(k)
  33. else:
  34. return None
  35. def parse(self, str = None):
  36. s = self.__s if str is None else str
  37. s = re.sub(self.__re, self.replace, s)
  38. return s
  39. def replace(self, s):
  40. return self.var(s.group(1))
  41. class tlFile(tlStr):
  42. ''' file templating '''
  43. def __init__(self, fn, **kwargs):
  44. self.__fh = open(fn, 'r', encoding = utf_8) if fn else None
  45. self._init_flags(kwargs)
  46. self._init_re(kwargs)
  47. def reset(self):
  48. self.__fh.seek(0)
  49. def file(self, fn):
  50. self.__fh = open(fn, 'r', encoding = utf_8)
  51. def readline(self, **kwargs):
  52. l = self.__fh.readline()
  53. return self.parse(l)
  54. def readlines(self, **kwargs):
  55. for l in self.__fh.readlines():
  56. yield self.parse(l)
  57. def bwtl_test():
  58. print('bwTL.py version', __version__)
  59. x = 'This has a variable ($var$) and another (@two@) in it'
  60. st = tlStr(x, sep='@')
  61. print('x is:', x)
  62. st.var('var', 'ONE')
  63. st.var('two', 'TWO')
  64. print(st.parse())
  65. fn = 'templatefile.txt'
  66. try:
  67. ft = tlFile(fn)
  68. ft.var('one', 'spam')
  69. ft.var('two', 'eggs')
  70. ft.var('three', 'ham')
  71. ft.var('four', 'rubber chicken')
  72. ft.var('five', '55555')
  73. print(str("ft.readline: " + ft.readline()).strip())
  74. for l in ft.readlines():
  75. print(l.strip())
  76. print('five is [{}]'.format(ft.var('five')))
  77. except IOError as e:
  78. print("Cannot open template file: {}".format(e))
  79. if __name__ == "__main__": bwtl_test()