#!/usr/bin/env python '''Process font documentation .md files for use on product sites ''' __url__ = 'http://github.com/silnrsi/fontdocs' __copyright__ = 'Copyright (c) 2021-2023 SIL International (http://www.sil.org)' __license__ = 'Released under the MIT License (http://opensource.org/licenses/MIT)' __author__ = 'Victor Gaultney' import re from silfont.core import execute argspec = [ ('infile', {'help': 'Input .md filename'}, {'type': 'infile'}), ('outfile',{'help': 'Output .md filename'}, {'type': 'outfile'}) ] def doit(args): infile = args.infile outfile = args.outfile firstline = True inheader = False inpsonly = False infontsc = False classes = [] temptext = "" # remove YAML header and uncomment the [font] shortcode for line in infile: if firstline: firstline = False inheader = True continue if inheader: if line.startswith("---"): inheader = False continue if line.startswith(""): inpsonly = False continue if line.startswith("[font") and infontsc == False: infontsc = True fontscre = re.compile(r"\[font id='(\w+)'(.+)\]") fontsc = fontscre.match(line) fontscid = fontsc.group(1) fontscend = fontsc.group(2) temptext = temptext + line # reconfigure image markup mdimage = re.compile(r"!\[(.*?)\]\((\S+\.\w+)\)\{\.(\S+)\}\n?") temptext = mdimage.sub(r"\1", temptext) mdimagecap = re.compile(r"
(.*?)<\/figcaption>") temptext = mdimagecap.sub(r"[caption]\1[/caption]", temptext) # replace local links with site references temptext = temptext.replace(".md","") # replace links to external markdown files temptext = temptext.replace(".rawmd",".md") # replace escaped @ in link texts temptext = temptext.replace("[\@","[@") # make a list of new classes needed for font shortcode # separate searches for spans with 1, 2, or 3 settings fontclass1 = re.compile(r"style='font-feature-settings:\s\"(\w+\d*)\"\s(\d+)'") fontclass2 = re.compile(r"style='font-feature-settings:\s\"(\w+\d*)\"\s(\d+),\s\"(\w+\d*)\"\s(\d+)'") fontclass3 = re.compile(r"style='font-feature-settings:\s\"(\w+\d*)\"\s(\d+),\s\"(\w+\d*)\"\s(\d+),\s\"(\w+\d*)\"\s(\d+)'") for match in fontclass1.finditer(temptext): classes.append(("-" + match.group(1) + "-" + match.group(2), match.group(1) + " " + match.group(2))) for match in fontclass2.finditer(temptext): classes.append(("-" + match.group(1) + "-" + match.group(2) + "-" + match.group(3) + "-" + match.group(4), match.group(1) + " " + match.group(2) + ", " + match.group(3) + " " + match.group(4))) for match in fontclass3.finditer(temptext): classes.append(("-" + match.group(1) + "-" + match.group(2) + "-" + match.group(3) + "-" + match.group(4) + "-" + match.group(5) + "-" + match.group(6), match.group(1) + " " + match.group(2) + ", " + match.group(3) + " " + match.group(4) + ", " + match.group(5) + " " + match.group(6))) # transform explicit font feature settings into classes # separate searches for spans with 1, 2, or 3 settings fontspan1 = re.compile(r"class='(\w+)+-(\w+)+\snormal'\sstyle='font-feature-settings:\s\"(\w+\d*)\"\s(\d+)'>") fontspan2 = re.compile(r"class='(\w+)+-(\w+)+\snormal'\sstyle='font-feature-settings:\s\"(\w+\d*)\"\s(\d+),\s\"(\w+\d*)\"\s(\d+)'>") fontspan3 = re.compile(r"class='(\w+)+-(\w+)+\snormal'\sstyle='font-feature-settings:\s\"(\w+\d*)\"\s(\d+),\s\"(\w+\d*)\"\s(\d+),\s\"(\w+\d*)\"\s(\d+)'>") temptext = fontspan1.sub(r"class='\1-\3-\4-\2 normal'>", temptext) temptext = fontspan2.sub(r"class='\1-\3-\4-\5-\6-\2 normal'>", temptext) temptext = fontspan3.sub(r"class='\1-\3-\4-\5-\6-\7-\8-\2 normal'>", temptext) # add new font sortcodes for added classes for c in classes: temptext = temptext + "[font id='" + fontscid + c[0] + "'" + fontscend + " feats='" + c[1] + "']\n" outfile.write(temptext) return def cmd() : execute(None,doit, argspec) if __name__ == "__main__": cmd()