123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109 |
- import argparse
- import pathlib
- import re
- NEWCOMAND_RE = re.compile(r"\\newcommand{[^}]*}{[^}]*}") # a user new command
- ARGUMENT_RE = re.compile(r"(?<={)[^}]*(?=})") # latex arguments
- meta_types = {
- r"\pubtitle": "title",
- r"\pubauth": "author",
- r"\eqcontrib": "contribution",
- r"\pubaffil": "affil",
- r"\authemail": "email",
- r"\orcid": "orcid",
- r"\pubaddr": "institute",
- r"\pubemail": "contact",
- }
- def repl_input(inp_section):
- input_text = inp_section.group()
- filename = ARGUMENT_RE.search(input_text)
- print(filename)
- def read_meta(metafile):
- metadata = {t: {} for t in meta_types.values()}
- metadata['contact'] = []
- with open(metafile, encoding="utf8") as f:
- lines = f.readlines()
- lines = [l.strip() for l in lines]
- lines = [l for l in lines if l and not l.startswith("%")]
- text = "".join(lines).replace("%", "")
- for meta in NEWCOMAND_RE.findall(text):
- m_typeno, m_val = ARGUMENT_RE.findall(meta)
- m_type = next(
- iter(t for t in meta_types if m_typeno.startswith(t)), None
- )
- if not m_type:
- continue
- elif m_type in [r"\pubemail", r"\contribution"]:
- metadata[meta_types[m_type]].append(m_val[-1].lower())
- elif m_type == r"\pubtitle":
- metadata[meta_types[m_type]] = m_val
- elif m_type == r"\pubaffil":
- metadata[meta_types[m_type]][m_no] = m_val.replace(" ",
- "").split(",")
- else:
- m_no = m_typeno[-1].lower()
- metadata[meta_types[m_type]][m_no] = m_val
- return metadata
- def write_meta(meta, metafile):
- with open("templates/pandoc/meta-base.yaml", encoding="utf8") as f:
- base = f.read()
- with open(metafile, 'w', encoding='utf8') as f:
- f.write("---\n")
- f.write(f"title: \"{meta['title']}\"\n")
- f.write("author:\n")
- for a in meta['author']:
- f.write(f" - {meta['author'][a]}:\n")
- f.write(" institute:\n")
- for aff in meta['affil'][a]:
- f.write(f" - {aff}\n")
- if meta['orcid'].get(a, None):
- f.write(f" orcid: {meta['orcid'][a]}\n")
- if meta['email'].get(a, None):
- f.write(f" email: {meta['email'][a]}\n")
- if a in meta['contact']:
- f.write(" correspondence: \"yes\"\n")
- if a in meta['contribution']:
- f.write(" equal_contributor: \"yes\"\n")
- f.write("institute:\n")
- for i in meta['institute']:
- f.write(f" - {i}:\n")
- f.write(f" name: {meta['institute'][i]}\n")
- f.write(base)
- f.write("\n---\n")
- if __name__ == "__main__":
- parser = argparse.ArgumentParser(description='Write metadata files.')
- parser.add_argument(
- '--tex',
- type=str,
- default=pathlib.Path(__file__).parent.parent / 'templates' /
- 'metadata.tex'
- )
- parser.add_argument(
- '--yaml',
- type=str,
- default=pathlib.Path(__file__).parent.parent / 'templates' /
- 'metadata-pd.yaml'
- )
- args = parser.parse_args()
- meta = read_meta(args.tex)
- write_meta(meta, args.yaml)
|