txt2tags_reader.py 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. import subprocess
  2. from pelican import signals
  3. from pelican.readers import BaseReader
  4. from pelican.utils import pelican_open
  5. class Txt2tagsReader(BaseReader):
  6. enabled = True
  7. file_extensions = ['t2t', 'txt2tags']
  8. def read(self, filename):
  9. with pelican_open(filename) as fp:
  10. text = list(fp.splitlines())
  11. metadata = {}
  12. for i, line in enumerate(text):
  13. kv = line.split(':', 1)
  14. if len(kv) == 2:
  15. name, value = kv[0].lower(), kv[1].strip()
  16. metadata[name] = self.process_metadata(name, value)
  17. else:
  18. content = "\n".join(text[i:])
  19. break
  20. t2t_cmd = [r"txt2tags", r"--encoding=utf-8", r"--target=html", r"--infile=-", r"--outfile=-", r"--no-headers"]
  21. proc = subprocess.Popen(t2t_cmd,
  22. stdin = subprocess.PIPE,
  23. stdout = subprocess.PIPE)
  24. output = proc.communicate(content.encode('utf-8'))[0].decode('utf-8')
  25. status = proc.wait()
  26. if status:
  27. raise subprocess.CalledProcessError(status, t2t_cmd)
  28. return output, metadata
  29. def add_reader(readers):
  30. for ext in Txt2tagsReader.file_extensions:
  31. readers.reader_classes[ext] = Txt2tagsReader
  32. def register():
  33. signals.readers_init.connect(add_reader)