pd-meta.py 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. import argparse
  2. import pathlib
  3. import re
  4. NEWCOMAND_RE = re.compile(r"\\newcommand{[^}]*}{[^}]*}") # a user new command
  5. ARGUMENT_RE = re.compile(r"(?<={)[^}]*(?=})") # latex arguments
  6. meta_types = {
  7. r"\pubtitle": "title",
  8. r"\pubauth": "author",
  9. r"\eqcontrib": "contribution",
  10. r"\pubaffil": "affil",
  11. r"\authemail": "email",
  12. r"\orcid": "orcid",
  13. r"\pubaddr": "institute",
  14. r"\pubemail": "contact",
  15. }
  16. def repl_input(inp_section):
  17. input_text = inp_section.group()
  18. filename = ARGUMENT_RE.search(input_text)
  19. print(filename)
  20. def read_meta(metafile):
  21. metadata = {t: {} for t in meta_types.values()}
  22. metadata['contact'] = []
  23. with open(metafile, encoding="utf8") as f:
  24. lines = f.readlines()
  25. lines = [l.strip() for l in lines]
  26. lines = [l for l in lines if l and not l.startswith("%")]
  27. text = "".join(lines).replace("%", "")
  28. for meta in NEWCOMAND_RE.findall(text):
  29. m_typeno, m_val = ARGUMENT_RE.findall(meta)
  30. m_type = next(
  31. iter(t for t in meta_types if m_typeno.startswith(t)), None
  32. )
  33. if not m_type:
  34. continue
  35. elif m_type in [r"\pubemail", r"\contribution"]:
  36. metadata[meta_types[m_type]].append(m_val[-1].lower())
  37. elif m_type == r"\pubtitle":
  38. metadata[meta_types[m_type]] = m_val
  39. elif m_type == r"\pubaffil":
  40. metadata[meta_types[m_type]][m_no] = m_val.replace(" ",
  41. "").split(",")
  42. else:
  43. m_no = m_typeno[-1].lower()
  44. metadata[meta_types[m_type]][m_no] = m_val
  45. return metadata
  46. def write_meta(meta, metafile):
  47. with open("templates/pandoc/meta-base.yaml", encoding="utf8") as f:
  48. base = f.read()
  49. with open(metafile, 'w', encoding='utf8') as f:
  50. f.write("---\n")
  51. f.write(f"title: \"{meta['title']}\"\n")
  52. f.write("author:\n")
  53. for a in meta['author']:
  54. f.write(f" - {meta['author'][a]}:\n")
  55. f.write(" institute:\n")
  56. for aff in meta['affil'][a]:
  57. f.write(f" - {aff}\n")
  58. if meta['orcid'].get(a, None):
  59. f.write(f" orcid: {meta['orcid'][a]}\n")
  60. if meta['email'].get(a, None):
  61. f.write(f" email: {meta['email'][a]}\n")
  62. if a in meta['contact']:
  63. f.write(" correspondence: \"yes\"\n")
  64. if a in meta['contribution']:
  65. f.write(" equal_contributor: \"yes\"\n")
  66. f.write("institute:\n")
  67. for i in meta['institute']:
  68. f.write(f" - {i}:\n")
  69. f.write(f" name: {meta['institute'][i]}\n")
  70. f.write(base)
  71. f.write("\n---\n")
  72. if __name__ == "__main__":
  73. parser = argparse.ArgumentParser(description='Write metadata files.')
  74. parser.add_argument(
  75. '--tex',
  76. type=str,
  77. default=pathlib.Path(__file__).parent.parent / 'templates' /
  78. 'metadata.tex'
  79. )
  80. parser.add_argument(
  81. '--yaml',
  82. type=str,
  83. default=pathlib.Path(__file__).parent.parent / 'templates' /
  84. 'metadata-pd.yaml'
  85. )
  86. args = parser.parse_args()
  87. meta = read_meta(args.tex)
  88. write_meta(meta, args.yaml)