PK!R~mathml2latex/__init__.py__version__ = '0.1.0' PK!zc$,,mathml2latex/mathml.py#! /usr/bin/env python3 # -*- coding:utf-8 -*- import re import sys from bs4.element import NavigableString from mathml2latex.parts_pickup import select_insert_list from mathml2latex.parts_pickup import select_true_chidren from mathml2latex.process_each_tag.math import process_math from mathml2latex.process_each_tag.mrow import process_mrow from mathml2latex.process_each_tag.msub import process_msub from mathml2latex.process_each_tag.msup import process_msup from mathml2latex.process_each_tag.msubsup import process_msubsup from mathml2latex.process_each_tag.mfrac import process_mfrac from mathml2latex.process_each_tag.mroot import process_mroot from mathml2latex.process_each_tag.msqrt import process_msqrt # mrootと同じでいいのか確認(メモ:2019/01/08) from mathml2latex.process_each_tag.mpadded import process_mpadded from mathml2latex.process_each_tag.mphantom import process_mphantom from mathml2latex.process_each_tag.mmultiscripts import process_mmultiscripts from mathml2latex.process_each_tag.munder import process_munder from mathml2latex.process_each_tag.mover import process_mover from mathml2latex.process_each_tag.munderover import process_munderover from mathml2latex.process_each_tag.mtd import process_mtd from mathml2latex.process_each_tag.mtr import process_mtr from mathml2latex.process_each_tag.mtable import process_mtable from mathml2latex.process_each_tag.mfenced import process_mfenced from mathml2latex.process_each_tag.mspace import process_mspace from mathml2latex.process_each_tag.mstyle import process_mstyle from mathml2latex.process_each_tag.mtext import process_mtext pattern = {} pattern['math'] = re.compile('math$') pattern['mrow'] = re.compile('mrow$') pattern['msub'] = re.compile('msub$') pattern['msup'] = re.compile('msup$') pattern['msubsup'] = re.compile('msubsup$') pattern['mfrac'] = re.compile('mfrac$') pattern['mroot'] = re.compile('mroot$') pattern['msqrt'] = re.compile('msqrt$') pattern['mprescripts'] = re.compile('mprescripts$') pattern['mpadded'] = re.compile('mpadded$') pattern['mphantom'] = re.compile('mphantom$') pattern['mmultiscripts'] = re.compile('mmultiscripts$') pattern['munder'] = re.compile('munder$') pattern['mover'] = re.compile('mover$') pattern['munderover'] = re.compile('munderover$') pattern['mtd'] = re.compile('mtd$') pattern['mtr'] = re.compile('mtr$') pattern['mtable'] = re.compile('mtable$') pattern['mfenced'] = re.compile('mfenced$') pattern['mspace'] = re.compile('mspace$') pattern['none'] = re.compile('none$') pattern['mi'] = re.compile('mi$') pattern['mn'] = re.compile('mn$') pattern['mo'] = re.compile('mo$') pattern['mstyle'] = re.compile('mstyle$') pattern['mtext'] = re.compile('mtext$') pattern['malignmark'] = re.compile('malignmark$') pattern['maligngroup'] = re.compile('maligngroup$') # These objects are all tags that may become parent tags. def process_mathml(soup): insertion_dict = {} insertion_dict['math'] = [] insertion_dict['mrow'] = [] insertion_dict['mfrac'] = [] insertion_dict['mroot'] = [] insertion_dict['msqrt'] = [] insertion_dict['msub'] = [] insertion_dict['msup'] = [] insertion_dict['msubsup'] = [] insertion_dict['mpadded'] = [] insertion_dict['mphantom'] = [] insertion_dict['munder'] = [] insertion_dict['mover'] = [] insertion_dict['munderover'] = [] insertion_dict['mtd'] = [] insertion_dict['mtr'] = [] insertion_dict['mtable'] = [] insertion_dict['mmultiscripts'] = [] insertion_dict['mspace'] = [] insertion_dict['mstyle'] = [] insertion_dict['mtext'] = [] insertion_dict['mfenced'] = [] insertion_dict['none'] = [''] insertion_dict['mprescripts'] = [''] insertion_dict['mi'] = [''] insertion_dict['mn'] = [''] insertion_dict['mo'] = [''] insertion_dict['malignmark'] = [''] insertion_dict['maligngroup'] = [''] stack_list = [] for descendant in list(soup.descendants)[::-1]: if isinstance(descendant, NavigableString): # print('this element is NOT tag.') continue else: end_point = pattern['math'].match(descendant.name) if not end_point: tagname = descendant.name string = descendant.string # 子タグのとき, `.string`はstr型(Noneにはならない) if string: stack_list.append(string) # 親タグのとき, `.string`はNoneになる else: # あとから考えるべきこと: 各process内での蒸発してしまうchild_listの要素の扱い, hoge, fuga insertion_list = select_insert_list(descendant, insertion_dict) child_list = select_true_chidren(descendant, stack_list) stack_list = [] # re: initialize if pattern['mspace'].match(tagname): # Synatax: None insertion_dict['mspace'].append(process_mspace(descendant)) elif pattern['mfrac'].match(tagname): # Syntax: ` numerator denominator ` insertion_dict['mfrac'].append(process_mfrac(descendant, insertion_list)) elif pattern['mroot'].match(tagname): # Syntax: ` base index .` insertion_dict['mroot'].append(process_mroot(descendant, insertion_list)) elif pattern['msqrt'].match(tagname): # Syntax: ` base ` insertion_dict['msqrt'].append(process_msqrt(descendant, insertion_list)) elif pattern['mrow'].match(tagname): insertion_dict['mrow'].append(process_mrow(descendant, child_list, insertion_list)) elif pattern['mstyle'].match(tagname): insertion_dict['mstyle'].append(process_mstyle(descendant, child_list, insertion_list)) elif pattern['mtext'].match(tagname): insertion_dict['mtext'].append(process_mtext(descendant, child_list, insertion_list)) elif pattern['msub'].match(tagname): # Syntax: ` base subscript ` insertion_dict['msub'].append(process_msub(descendant, insertion_list)) elif pattern['msup'].match(tagname): # Syntax: ` base superscript ` insertion_dict['msup'].append(process_msup(descendant, insertion_list)) elif pattern['msubsup'].match(tagname): # Syntax: ` base subscript superscript ` insertion_dict['msubsup'].append(process_msubsup(descendant, insertion_list)) elif pattern['mpadded'].match(tagname): # Syntax: None → 形を視覚的に整えるためだけのもの insertion_dict['mpadded'].append(process_mpadded(descendant, insertion_list)) elif pattern['mphantom'].match(tagname): # Syntax: None → 形を視覚的に整えるためだけのもの insertion_dict['mphantom'].append(process_mphantom(descendant, insertion_list)) elif pattern['none'].match(tagname): # `` は `mmultiscripts`の中でしか出現しない # `mmultiscripts` の中で同時に処理してもらう pass elif pattern['mmultiscripts'].match(tagname): # Syntax: ` base (subscript superscript)* [ \ # (presubscript presuperscript)* ] ` insertion_dict['mmultiscripts'].append(process_mmultiscripts(descendant, insertion_list)) elif pattern['mprescripts'].match(tagname): # Syntax: None → mmultiscripts の内部で処理 continue elif pattern['munder'].match(tagname): # Synatax: ` base underscript ` insertion_dict['munder'].append(process_munder(descendant, insertion_list)) elif pattern['mover'].match(tagname): # Syntax: ` base overscript ` insertion_dict['mover'].append(process_mover(descendant, insertion_list)) elif pattern['munderover'].match(tagname): # Syntax: ` base underscript overscript ` insertion_dict['munderover'].append(process_munderover(descendant, insertion_list)) elif pattern['mtd'].match(tagname): # Syntax: ` content ` insertion_dict['mtd'].append(process_mtd(child_list, insertion_list)) elif pattern['mtr'].match(tagname): # Syntax: ` ... ` insertion_dict['mtr'].append(process_mtr(insertion_list)) elif pattern['mtable'].match(tagname): # Syntax: ` hogehoge .. ... ... ` insertion_dict['mtable'].append(process_mtable(insertion_list)) elif pattern['mfenced'].match(tagname): # Syntax: ` ... ` insertion_dict['mfenced'].append(process_mfenced(descendant, insertion_list)) elif pattern['mi'].match(tagname): continue elif pattern['mn'].match(tagname): continue elif pattern['mo'].match(tagname): continue elif pattern['malignmark'].match(tagname): continue elif pattern['maligngroup'].match(tagname): continue else: print(descendant, '\n') print('Unknown Tag appeared!! terminate the program.\n') print('New tag name is ; ', descendant.name) # sys.exit() # debug # ##### if endpoint: ##### # else: insertion_list = select_insert_list(descendant, insertion_dict) insertion_dict['math'].append(process_math(descendant, insertion_list)) mathml_list = insertion_dict['math'] # print('MathML list is : ', mathml_list) # debug mathml_str_block = ''.join(mathml_list) mathml_str_block = mathml_str_block.strip() return mathml_str_block # in Production environment (type: string) PK!KFFmathml2latex/parts_pickup.py#! /usr/bin/env python3 # -*- coding:utf-8 -*- from bs4.element import NavigableString # insert_list: descendantが任意の親タグであったとき、そのsyntaxをリストにしたもの # 入れ子構造となる部分(親タグがsyntaxに含まれている場合)だけを判定 def select_insert_list(descendant, insertion_dict): """ return: list object (list of element to insert that parent) """ # 大前提: 突っ込む必要があるタグの中にある値は、insertion_dictの中に格納されているはずである # していること: 任意のタグにおける入れ子構造の検出 # していないこと: 最終的に返すリスト内の値がどのようなものであるのか検証すること # # => 挿入したい値の型検証(inspection)は、各`process_m-hogehoge`でやってもらうべき # 思案したポイント: # `.siblings` の役割を果たす `.parent.children` を使う => 重複タグがないかどうかの分岐を作る必要がある # 未解決問題: insertion_dictが保持する値が初期化したくないリストなので、メモリが大量に必要になるかもしれない # decendant が入れ子構造の外側にあり、keyの上書きを考慮する必要がある場合 # nested_name_list = [x.name for x in list(descendant.children) if x.children and x.string == None] nested_name_list = [x.name for x in ( y for y in ( z for z in list(descendant.children) if not z.string ) if not isinstance(y, NavigableString) ) if x.children] selected_list = [] if not nested_name_list: # 入れ子構造がない場合 <= 挿入すべき親要素がない return selected_list else: # 入れ子構造がある場合 # 重複している要素そのものと、そのインデックスのペアを取り出してリストにする # インデックスは、insertion_list内のどの要素にアクセスすればよいのかを特定する # 参照:https://bit.ly/2u3ft8o confirm_list = [[key, nested_name_list.count(key)] for key in set(nested_name_list) if nested_name_list.count(key) > 1] # 上記のペアが存在しない場合(要素の重複がない場合) if not confirm_list: # ex. `confirm_list = []` # insertion_dict[key]に一番新しく`append`された要素を取ってくる selected_list = [insertion_dict[key][-1] for key in nested_name_list if insertion_dict.get(key)] else: # print('Confirm_list is: ', confirm_list) # debug # 上記のペアが存在する場合(入れ子構造かつ同じ階層に重複あり) index = {} # あとでインデックス代わりに使う辞書オブジェクト for key in nested_name_list: index[key] = 1 # print('Insertion_dict[`{}`] is : '.format(key), insertion_dict[key]) # debug for tagname in nested_name_list: try: selected_list.append(insertion_dict[tagname][-index[tagname]]) index[tagname] += 1 except IndexError: # `` が含まれるときに起こる if len(insertion_dict[tagname]) == 0: print(tagname) print('descendant:', descendant) print('insertion_block: ', insertion_dict) selected_list += insertion_dict[tagname][-1] # confirm_listの中身の有無に依らず、selected_listを返す return selected_list # 親タグの塊に実際の子タグ以外の子タグ(親タグと同じ階層にある子タグ)が含まれてしまう問題の解決 def select_true_chidren(descendant, stack_list): # 子タグ要素のうち、親タグ要素になっているものを探す # そのために、`.string`を使って検出しようとしている(親タグ要素 => `None object` になるはず) temp_list = [x.string for x in list(descendant.children)] i = 0 # 先頭が親タグ要素であれば、`descendant`の直下に親タグの入れ子構造があることになり、 # 親タグを検出するたびにchild_listは初期化されているはずだから、`stack_list`はそのまま返す if not temp_list: # ==> if not None: と同じ意味 stack_list = stack_list[::-1][:i] else: # `temp_list` の大きさはそのまま`descendant`の子タグの数と同値である i = len(temp_list) stack_list = stack_list[::-1][:i] # print('stack list is ', stack_list) return stack_list PK!)mathml2latex/process_each_tag/__init__.pyPK!ZZ,mathml2latex/process_each_tag/maligngroup.py#! /usr/bin/env python3 # -*- coding:utf-8 -*- def process_aligngroup(): pass PK!iZZ+mathml2latex/process_each_tag/malignmark.py#! /usr/bin/env python3 # -*- coding:utf-8 -*- def process_malignmark(): pass PK!G%mathml2latex/process_each_tag/math.py#! /usr/bin/env python3 # -*- coding:utf-8 -*- def process_math(descendant, insertion_list): child_list = [x for x in list(descendant.children) if x.name] temp_list = [] i = 0 for x in child_list: x_string = x.string if x_string: temp_list.append(x_string) else: temp_list.append(insertion_list[i]) i += 1 continue math = ''.join(temp_list) return math PK!S[{{(mathml2latex/process_each_tag/mfenced.py#! /usr/bin/env python3 # -*- coding:utf-8 -*- # => 属性から区切り記号を取ってくる必要あり def process_mfenced(descendant, insertion_list): determine_list = [x.string for x in list(descendant.children) if x.name] temp_list = [] i = 0 for x_string in determine_list: if x_string is None: temp_list.append(insertion_list[i]) i += 1 else: temp_list.append(x_string) try: fence_left = descendant['open'] except Exception as e: # print(e) fence_left = '(' try: fence_right = descendant['close'] except Exception as e: # print(e) fence_right = ')' try: separators = list(descendant['separators']) try: last_separator = separators[-1] except Exception as e: # print(e) last_separator = ',' length1 = len(determine_list) length2 = len(separators) if length1 > length2: num = length1 - length2 separators += [last_separator] * num mfenced = ''.join([x + y for x, y in zip(temp_list, separators)]) except Exception as e: mfenced = ''.join(temp_list) mfenced = fence_left + mfenced + fence_right return mfenced PK!gi77&mathml2latex/process_each_tag/mfrac.py#! /usr/bin/env python3 # -*- coding:utf-8 -*- def inspect_mfrac(child, insertion_list, index): x_string = child.string count = 0 if x_string: # childが子タグか親タグか検証 # 子タグであれば、要素をそのまま返す inspected_child = x_string else: # 親タグであれば、insertion_listから要素を取ってくる inspected_child = insertion_list[index] count = 1 # 親タグに遭遇した回数 return [inspected_child, count] def process_mfrac(descendant, insertion_list): # Syntax: ` numerator denominator ` child_list = [x for x in descendant.children if x.name] index = 0 temp_list = inspect_mfrac(child_list[0], insertion_list, index) numerator = temp_list[0] index += temp_list[1] temp_list = inspect_mfrac(child_list[1], insertion_list, index) denominator = temp_list[0] index += temp_list[1] mfrac = r'\frac{{{}}}{{{}}}'.format(numerator, denominator) return mfrac PK!dL7Q.mathml2latex/process_each_tag/mmultiscripts.py#! /usr/bin/env python3 # -*- coding:utf-8 -*- import re def convert2latex(inspected_child_list): temp_list = [] i = 0 for child in inspected_child_list: if child == 'nnnn': continue elif child == '': continue elif i % 2: temp_list.append('_{{{}}}'.format(child)) else: temp_list.append('^{{{}}}'.format(child)) i += 1 return temp_list def inspect_mmultiscripts(child_list, insertion_list, index): inspected_list = [] count = 0 for child in child_list: # mprescripts を含まない場合、child_list の要素はすべて空文字列(str)であるはず => 処理する必要がないのでそのままSkip if type(child) == str: return [child_list, count] x_string = child.string if child.name == 'none': # タグのとき x_string = 'nnnn' inspected_list.append(x_string) elif x_string: # childが子タグか親タグか検証 # 子タグであれば、要素をそのまま返す inspected_list.append(x_string) else: # 親タグであれば、insertion_listから要素を取ってくる inspected_list.append(insertion_list[index]) index += 1 count += 1 # 親タグに遭遇した回数 return [inspected_list, count] def process_mmultiscripts(descendant, insertion_list): # Syntax: `base postsubscript postsuperscript # presubscript presuperscript ` # ただし、任意の要素が``に置き換わることもある temp_list = [] child_list = [x for x in descendant.children if x.name] base_list = child_list[:1] child_list_without_base = child_list[1:-1] i = 0 index_of_mprescript = 0 for child in child_list_without_base: if child.name == 'mprescripts': index_of_mprescript = i else: i += 1 # が存在するかどうかの分岐フラグ if index_of_mprescript: # 存在しなければ 0 のままなはずである mprescripts_exist = True else: mprescripts_exist = False # postscripts, prescripts に分離してリストを保持 if mprescripts_exist: # postscript に含まれる childだけで構成されるリストを作る postscript_list = child_list_without_base[0:index_of_mprescript] # prescript に含まれる childだけで構成されるリストを作る index_of_mprescript += 1 # `mprescripts` を取り除く prescript_list = child_list_without_base[index_of_mprescript:-1] else: # prescripts が存在しない場合、postscriptのみリストとする postscript_list = child_list_without_base prescript_list = [''] * len(postscript_list) # postscript_list と同じ要素数の空文字列リストを作成 counter = 0 inspected_base_list = inspect_mmultiscripts(base_list, insertion_list, counter) base = inspected_base_list[0][0] counter += inspected_base_list[1] inspected_prescripts_list = inspect_mmultiscripts(prescript_list, insertion_list, counter) prescript = convert2latex(inspected_prescripts_list[0]) counter += inspected_prescripts_list[1] inspected_postscripts_list = inspect_mmultiscripts(postscript_list, insertion_list, counter) postscript = convert2latex(inspected_postscripts_list[0]) temp_list = ['{}'] temp_list.extend(prescript) temp_list.append(base) temp_list.extend(postscript) mmultiscripts = re.sub('nnnn', '', ''.join(temp_list)) return mmultiscripts PK!&mathml2latex/process_each_tag/mover.py#! /usr/bin/env python3 # -*- coding:utf-8 -*- # Problem !! => LaTeX形式で表記するときに、数式装飾記号が複雑すぎる……… # cf. http://www.latex-cmd.com/equation/accent.html def inspect_mover(child, insertion_list, index): x_string = child.string count = 0 if x_string: # childが子タグか親タグか検証 # 子タグであれば、要素をそのまま返す inspected_child = x_string else: # 親タグであれば、insertion_listから要素を取ってくる inspected_child = insertion_list[index] count = 1 # 親タグに遭遇した回数 return [inspected_child, count] def process_mover(descendant, insertion_list): # Syntax: ` base overscript ` child_list = [x for x in descendant.children if x.name] index = 0 temp_list = inspect_mover(child_list[0], insertion_list, index) base = temp_list[0] index += temp_list[1] temp_list = inspect_mover(child_list[1], insertion_list, index) overscript = temp_list[0] mover = r'\mover{{{}}}^{{{}}}'.format(base, overscript) return mover PK!%(mathml2latex/process_each_tag/mpadded.py#! /usr/bin/env python3 # -*- coding:utf-8 -*- def process_mpadded(descendant, insertion_list): # なんらかの`Padding`操作を行う? determine_list = [x.string for x in list(descendant.children) if x.name] temp_list = [] i = 0 for x_string in determine_list: if x_string is None: temp_list.append(insertion_list[i]) i += 1 else: temp_list.append(x_string) mpadded = ''.join(temp_list) return mpadded PK!Ķ$$)mathml2latex/process_each_tag/mphantom.py#! /usr/bin/env python3 # -*- coding:utf-8 -*- # そもそもどこでPhantomなんて使うのか?利用方法がわからない def process_mphantom(descendant, insertion_list): determine_list = [x.string for x in list(descendant.children) if x.name] temp_list = [] i = 0 for x_string in determine_list: if x_string is None: temp_list.append(insertion_list[i]) i += 1 else: temp_list.append(x_string) mphantom = ''.join(temp_list) return mphantom PK!sz  &mathml2latex/process_each_tag/mroot.py#! /usr/bin/env python3 # -*- coding:utf-8 -*- def inspect_mroot(child, insertion_list, index): x_string = child.string count = 0 if x_string: # childが子タグか親タグか検証 # 子タグであれば、要素をそのまま返す inspected_child = x_string else: # 親タグであれば、insertion_listから要素を取ってくる inspected_child = insertion_list[index] count = 1 # 親タグに遭遇した回数 return [inspected_child, count] def process_mroot(descendant, insertion_list): # Syntax: ` base index .` child_list = [x for x in descendant.children if x.name] index = 0 temp_list = inspect_mroot(child_list[0], insertion_list, index) base = temp_list[0] index += temp_list[1] temp_list = inspect_mroot(child_list[1], insertion_list, index) index = temp_list[0] mroot = r'\sqrt{{{}}}{{{}}}'.format(base, index) return mroot PK!@%mathml2latex/process_each_tag/mrow.py#! /usr/bin/env python3 # -*- coding:utf-8 -*- def process_mrow(descendant, child_list, insertion_list): # child_list, insertion_listだけでは、 # それらをどのように組み合わせればいいのかについての情報がない mrow_list = [] i = 0 j = 0 # 親タグ要素の塊がある場合 if insertion_list: determine_list = [x.string for x in list(descendant.children) if x.name] # print('Determine_list is :', determine_list) for x_string in determine_list: # print(mrow_list) if x_string: # 親タグのかたまりではない場合 mrow_list.append(x_string) i += 1 else: # 親タグのかたまりである場合 mrow_list.append(insertion_list[j]) j += 1 mrow = ''.join(mrow_list) # 親タグ要素の塊がない場合 else: mrow = ''.join(child_list) return mrow PK!ie'mathml2latex/process_each_tag/mspace.py#! /usr/bin/env python3 # -*- coding:utf-8 -*- def process_mspace(descendant): mspace = ' ' return mspace PK!kRvv&mathml2latex/process_each_tag/msqrt.py#! /usr/bin/env python3 # -*- coding:utf-8 -*- def inspect_msqrt(child, insertion_list, index): x_string = child.string count = 0 if x_string: # childが子タグか親タグか検証 # 子タグであれば、要素をそのまま返す inspected_child = x_string else: # 親タグであれば、insertion_listから要素を取ってくる inspected_child = insertion_list[index] count = 1 # 親タグに遭遇した回数 return [inspected_child, count] def process_msqrt(descendant, insertion_list): # Syntax: ` base index .` child_list = [x for x in descendant.children if x.name] index = 0 temp_list = inspect_msqrt(child_list[0], insertion_list, index) base = temp_list[0] mroot = r'\sqrt{{{}}}'.format(base) return mroot PK!'mathml2latex/process_each_tag/mstyle.py#! /usr/bin/env python3 # -*- coding:utf-8 -*- def process_mstyle(descendant, child_list, insertion_list): # child_list, insertion_listだけでは、 # それらをどのように組み合わせればいいのかについての情報がない mstyle_list = [] i = 0 j = 0 # 親タグ要素の塊がある場合 if insertion_list: determine_list = [x.string for x in list(descendant.children) if x.name] for x_string in determine_list: if x_string: # 親タグのかたまりではない場合 mstyle_list.append(x_string) i += 1 else: # 親タグのかたまりである場合 mstyle_list.append(insertion_list[j]) j += 1 mstyle = ''.join(mstyle_list) # 親タグ要素の塊がない場合 else: mstyle = ''.join(child_list) return mstyle PK!A%%mathml2latex/process_each_tag/msub.py#! /usr/bin/env python3 # -*- coding:utf-8 -*- def inspect_msub(child, insertion_list, index): x_string = child.string count = 0 if x_string: # childが子タグか親タグか検証 # 子タグであれば、要素をそのまま返す inspected_child = x_string else: # 親タグであれば、insertion_listから要素を取ってくる inspected_child = insertion_list[index] count = 1 # 親タグに遭遇した回数 return [inspected_child, count] def process_msub(descendant, insertion_list): # Syntax: ` base subscript` child_list = [x for x in descendant.children if x.name] if len(child_list) < 2: print(child_list) print(descendant) print(insertion_list) print('This is `IndexError list index out of range`') index = 0 temp_list = inspect_msub(child_list[0], insertion_list, index) base = temp_list[0] index += temp_list[1] temp_list = inspect_msub(child_list[1], insertion_list, index) subscript = temp_list[0] msub = r'{}_{{{}}}'.format(base, subscript) return msub PK!/(mathml2latex/process_each_tag/msubsup.py#! /usr/bin/env python3 # -*- coding:utf-8 -*- def inspect_msubsup(child, insertion_list, index): x_string = child.string count = 0 if x_string: # childが子タグか親タグか検証 # 子タグであれば、要素をそのまま返す inspected_child = x_string else: # 親タグであれば、insertion_listから要素を取ってくる inspected_child = insertion_list[index] count = 1 # 親タグに遭遇した回数 return [inspected_child, count] def process_msubsup(descendant, insertion_list): # Syntax: ` base subscript superscript ` child_list = [x for x in descendant.children if x.name] index = 0 temp_list = inspect_msubsup(child_list[0], insertion_list, index) base = temp_list[0] index += temp_list[1] temp_list = inspect_msubsup(child_list[1], insertion_list, index) subscript = temp_list[0] index += temp_list[1] temp_list = inspect_msubsup(child_list[2], insertion_list, index) superscript = temp_list[0] msubsup = r'{}_{{{}}}^{{{}}}'.format(base, subscript, superscript) return msubsup PK!FI  %mathml2latex/process_each_tag/msup.py#! /usr/bin/env python3 # -*- coding:utf-8 -*- def inspect_msup(child, insertion_list, index): x_string = child.string count = 0 if x_string: # childが子タグか親タグか検証 # 子タグであれば、要素をそのまま返す inspected_child = x_string else: # 親タグであれば、insertion_listから要素を取ってくる inspected_child = insertion_list[index] count = 1 # 親タグに遭遇した回数 return [inspected_child, count] def process_msup(descendant, insertion_list): # Syntax: ` base superscript ` child_list = [x for x in descendant.children if x.name] index = 0 temp_list = inspect_msup(child_list[0], insertion_list, index) base = temp_list[0] index += temp_list[1] temp_list = inspect_msup(child_list[1], insertion_list, index) superscript = temp_list[0] msup = r'{}^{{{}}}'.format(base, superscript) return msup PK!*``'mathml2latex/process_each_tag/mtable.py#! /usr/bin/env python3 # -*- coding:utf-8 -*- # Problem !! => LaTeXで表組みするのはとても難しそうにみえる、要検討 def process_mtable(insertion_list): # Syntax: ` hogehoge .. ... ... ` if not insertion_list: mtable = 'error occered: mathml tag `mtable` has not processed.' print(mtable) else: column_assignment = 'c' * len(insertion_list) # centering の「C」=> 他にも指定方法あり mtr_lump = ''.join([x + '\n' for x in insertion_list]) table_content = mtr_lump[:-4] # 末尾の「\n」と「\\」を削除する mtable = '\\begin{{table}}[htb] \n \\begin{{tabular}}{{{}}} \n '.format(column_assignment) \ + '{} \n \end{{tabular}} \n\end{{table}}'.format(table_content) return mtable PK! @$mathml2latex/process_each_tag/mtd.py#! /usr/bin/env python3 # -*- coding:utf-8 -*- def process_mtd(child_list, insertion_list): # Syntax: ` content ` # 親タグ要素の塊がある場合 if insertion_list: mtd = ''.join(insertion_list) else: # There is NO `parent like` block, is only child elements. mtd = ''.join(child_list) return mtd PK!I4&mathml2latex/process_each_tag/mtext.py#! /usr/bin/env python3 # -*- coding:utf-8 -*- def process_mtext(descendant, child_list, insertion_list): # child_list, insertion_listだけでは、 # それらをどのように組み合わせればいいのかについての情報がない mtext_list = [] i = 0 j = 0 # 親タグ要素の塊がある場合 if insertion_list: determine_list = [x.string for x in list(descendant.children) if x.name] for x_string in determine_list: if x_string: # 親タグのかたまりではない場合 mtext_list.append(x_string) i += 1 else: # 親タグのかたまりである場合 mtext_list.append(insertion_list[j]) j += 1 mtext = ''.join(mtext_list) # 親タグ要素の塊がない場合 else: mtext = ''.join(child_list) return mtext PK!^L##$mathml2latex/process_each_tag/mtr.py#! /usr/bin/env python3 # -*- coding:utf-8 -*- # Problem !! => LaTeXで表組みするのはとても難しそうにみえる、要検討 def process_mtr(insertion_list): # Syntax: ` ... ` if not insertion_list: print('error occered: mathml tag `mtr` has not processed.') mtr = 'Undefined' else: mtd_lump = ''.join([x + ' &' for x in insertion_list]) mtr = mtd_lump[:-1] + '\\\\' # 末尾の`&` を削除し、改行として「\\」を挿入 return mtr PK!b'mathml2latex/process_each_tag/munder.py#! /usr/bin/env python3 # -*- coding:utf-8 -*- # Problem !! => LaTeX形式で表記するときに、数式装飾記号が複雑すぎる……… # cf. http://www.latex-cmd.com/equation/accent.html def inspect_munder(child, insertion_list, index): x_string = child.string count = 0 if x_string: # childが子タグか親タグか検証 # 子タグであれば、要素をそのまま返す inspected_child = x_string else: # 親タグであれば、insertion_listから要素を取ってくる inspected_child = insertion_list[index] count = 1 # 親タグに遭遇した回数 return [inspected_child, count] def process_munder(descendant, insertion_list): # Syntax: ` base subscript superscript ` child_list = [x for x in descendant.children if x.name] index = 0 temp_list = inspect_munder(child_list[0], insertion_list, index) base = temp_list[0] index += temp_list[1] temp_list = inspect_munder(child_list[1], insertion_list, index) underscript = temp_list[0] munder = r'\munder{{{}}}_{{{}}}'.format(base, underscript) return munder PK!%T+mathml2latex/process_each_tag/munderover.py#! /usr/bin/env python3 # -*- coding:utf-8 -*- # Problem !! => LaTeX形式で表記するときに、数式装飾記号が複雑すぎる……… # cf. http://www.latex-cmd.com/equation/accent.html def inspect_munderover(child, insertion_list, index): x_string = child.string count = 0 if x_string: # childが子タグか親タグか検証 # 子タグであれば、要素をそのまま返す inspected_child = x_string else: # 親タグであれば、insertion_listから要素を取ってくる inspected_child = insertion_list[index] count = 1 # 親タグに遭遇した回数 return [inspected_child, count] def process_munderover(descendant, insertion_list): # Syntax: ` base underscript overscript ` child_list = [x for x in descendant.children if x.name] index = 0 temp_list = inspect_munderover(child_list[0], insertion_list, index) base = temp_list[0] index += temp_list[1] temp_list = inspect_munderover(child_list[1], insertion_list, index) underscript = temp_list[0] index += temp_list[1] temp_list = inspect_munderover(child_list[2], insertion_list, index) overscript = temp_list[0] munderover = r'\munderover{{{}}}_{{{}}}^{{{}}}'.format(base, underscript, overscript) return munderover PK!HڽTU#mathml2latex-0.2.12.dist-info/WHEEL A н#Z;/"d&F[xzw@Zpy3Fv]\fi4WZ^EgM_-]#0(q7PK!HHdq&mathml2latex-0.2.12.dist-info/METADATAOKO1W] I#U@mȿQ|ϙa-^y2䥸dQr M@/"1JZK̂J:e+ u\oJl}+VP'|8e<'k%VnZ^(#,{H}'E*8/ v׀#Lއ@.%/Ǽ֙Ov{ H(ZSZӓ'z= !ƛhl4wDqξPK!HD $mathml2latex-0.2.12.dist-info/RECORDKkH,rHHQM ~rfj*yiҪK0D?SSpKjʢU=&bR7PQVh͂B`SPg]r}3uȴ^ ;`~Zoە*WIG2^'vEޛBãW`8(ԄA~CaF}G L$ dAob4ѵO!(t@%u/@Vn ̽tl_t-2a$ӹC[FT g؄EK̦kO *J (Mҕ_d"9z %/=\Ws98u!@kEx}v?u>)ߑl \GC²}|2UԒEDx< Wc9d}vWcNΕ/ēG7GU%opM!3 ],B4xUD8k>9Pv''-}?&8jytHQ|oeք2C\n_.q]cpˏˌIE(SPM0MB>G}>P5MKeRE5E[` +.\&1Er)]SIuQYf?fZG?TܛXƋ7 x$ɕwi+-ǖ)Lg7 8wYZ#yQ":|r %V#vBHXKb17[Im@",KoR_.^'`L!I]kCH0O390"y|1X؈ ]Sx! Ƶ̔)-{`t/^qln)/l@VJ*^#O-` p|;/EӲJUOm?xܻ4%ζ|Wl^/ٷ;2&rτI©V-g{t:ʝX;/xGۑ4:Oq9 9Hwloh^o̫^\3g@ٳ`/Pێ}X%.*m7u'w;2[Ei~fJj6`_8﯎>>@![l@a}Tqe6oo}g KbߴDi ץ;끁j9A4·|vO'|f9H_qsܹ33+Ra Uw[a Y,~[x-M/KVtpRr£qk$^{PK!R~mathml2latex/__init__.pyPK!zc$,,Mmathml2latex/mathml.pyPK!KFF -mathml2latex/parts_pickup.pyPK!)@mathml2latex/process_each_tag/__init__.pyPK!ZZ,@mathml2latex/process_each_tag/maligngroup.pyPK!iZZ+wAmathml2latex/process_each_tag/malignmark.pyPK!G%Bmathml2latex/process_each_tag/math.pyPK!S[{{(.Dmathml2latex/process_each_tag/mfenced.pyPK!gi77&Imathml2latex/process_each_tag/mfrac.pyPK!dL7Q.jNmathml2latex/process_each_tag/mmultiscripts.pyPK!&]mathml2latex/process_each_tag/mover.pyPK!%(bmathml2latex/process_each_tag/mpadded.pyPK!Ķ$$) emathml2latex/process_each_tag/mphantom.pyPK!sz  &vgmathml2latex/process_each_tag/mroot.pyPK!@%kmathml2latex/process_each_tag/mrow.pyPK!ie'omathml2latex/process_each_tag/mspace.pyPK!kRvv&pmathml2latex/process_each_tag/msqrt.pyPK!'tmathml2latex/process_each_tag/mstyle.pyPK!A%%|xmathml2latex/process_each_tag/msub.pyPK!/(}}mathml2latex/process_each_tag/msubsup.pyPK!FI  %mathml2latex/process_each_tag/msup.pyPK!*``'چmathml2latex/process_each_tag/mtable.pyPK! @$mathml2latex/process_each_tag/mtd.pyPK!I4&hmathml2latex/process_each_tag/mtext.pyPK!^L##$Jmathml2latex/process_each_tag/mtr.pyPK!b'mathml2latex/process_each_tag/munder.pyPK!%T+mathml2latex/process_each_tag/munderover.pyPK!HڽTU#mathml2latex-0.2.12.dist-info/WHEELPK!HHdq&1mathml2latex-0.2.12.dist-info/METADATAPK!HD $smathml2latex-0.2.12.dist-info/RECORDPK