from __future__ import print_function import re small_greek = {'alpha': u'\u03b1', 'beta': u'\u03b2', 'gamma': u'\u03b3', 'delta': u'\u03b4', 'epsilon': u'\u03b5', 'zeta': u'\u03b6', 'eta': u'\u03b7', 'theta': u'\u03b8', 'iota': u'\u03b9', 'kappa': u'\u03ba', 'lambda': u'\u03bb', 'mu': u'\u03bc', 'nu': u'\u03bd', 'xi': u'\u03be', 'omicron': u'\u03bf', 'pi': u'\u03c0', 'rho': u'\u03c1', 'varsigma': u'\u03c2', 'sigma': u'\u03c3', 'tau': u'\u03c4', 'ypsilon': u'\u03c5', 'phi': u'\u03c6', 'chi': u'\u03c7', 'psi': u'\u03c8', 'omega': u'\u03c9' } big_greek = {'Alpha': u'\u0391', 'Beta': u'\u0392', 'Gamma': u'\u0393', 'Delta': u'\u0394', 'Epsilon': u'\u0395', 'Zeta': u'\u0396', 'Eta': u'\u0397', 'Theta': u'\u0398', 'Iota': u'\u0399', 'Kappa': u'\u039a', 'Lambda': u'\u039b', 'Mu': u'\u039c', 'Nu': u'\u039d', 'Xi': u'\u039e', 'Omicron': u'\u039f', 'Pi': u'\u03a0', 'Rho': u'\u03a1', 'Varsigma': u'\u03a2', 'Sigma': u'\u03a3', 'Tau': u'\u03a4', 'Ypsilon': u'\u03a5', 'Phi': u'\u03a6', 'Chi': u'\u03a7', 'Psi': u'\u03a8', 'Omega': u'\u03a9' } special_chars = {'infty': u'\u221e', 'int': u'\u222b', 'perp': u'\u27c2', 'para': u'\u2225', 'leftarrow': u'\u21d0', 'rightarrow': u'\u21d2', 'leftrightarrow': u'\u21d4', '\n': '
', '*': u'\u00b7', 'plmin': u'\u00b1'} small_greek_grace = {'alpha': r'\f{Symbol}a\f{}', 'beta': r'\f{Symbol}b\f{}', 'gamma': r'\f{Symbol}g\f{}', 'delta': r'\f{Symbol}d\f{}', 'epsilon': r'\f{Symbol}e\f{}', 'zeta': r'\f{Symbol}z\f{}', 'eta': r'\f{Symbol}h\f{}', 'theta': r'\f{Symbol}q\f{}', 'iota': r'\f{Symbol}i\f{}', 'kappa': r'\f{Symbol}k\f{}', 'lambda': r'\f{Symbol}l\f{}', 'mu': r'\f{Symbol}m\f{}', 'nu': r'\f{Symbol}n\f{}', 'xi': r'\f{Symbol}x\f{}', 'omicron': r'\f{Symbol}o\f{}', 'pi': r'\f{Symbol}p\f{}', 'rho': r'\f{Symbol}r\f{}', 'sigma': r'\f{Symbol}s\f{}', 'tau': r'\f{Symbol}t\f{}', 'ypsilon': r'\f{Symbol}u\f{}', 'phi': r'\f{Symbol}f\f{}', 'chi': r'\f{Symbol}c\f{}', 'psi': r'\f{Symbol}y\f{}', 'omega': r'\f{Symbol}w\f{}' } big_greek_grace = {'Alpha': r'\f{Symbol}A\f{}', 'Beta': r'\f{Symbol}B\f{}', 'Gamma': r'\f{Symbol}g\f{}', 'Delta': r'\f{Symbol}D\f{}', 'Epsilon': r'\f{Symbol}E\f{}', 'Zeta': r'\f{Symbol}Z\f{}', 'Eta': r'\f{Symbol}H\f{}', 'Theta': r'\f{Symbol}Q\f{}', 'Iota': r'\f{Symbol}I\f{}', 'Kappa': r'\f{Symbol}K\f{}', 'Lambda': r'\f{Symbol}L\f{}', 'Mu': r'\f{Symbol}M\f{}', 'Nu': r'\f{Symbol}N\f{}', 'Xi': r'\f{Symbol}X\f{}', 'Omicron': r'\f{Symbol}O\f{}', 'Pi': r'\f{Symbol}P\f{}', 'Rho': r'\f{Symbol}R\f{}', 'Sigma': r'\f{Symbol}S\f{}', 'Tau': r'\f{Symbol}T\f{}', 'Ypsilon': r'\f{Symbol}U\f{}', 'Phi': r'\f{Symbol}F\f{}', 'Chi': r'\f{Symbol}C\f{}', 'Psi': r'\f{Symbol}U\f{}', 'Omega': r'\f{Symbol}Q\f{}' } special_chars_grace = {'infty': r'\f{Symbol}\c%\f{}'} full_chars = dict() for d in [big_greek, small_greek, special_chars]: full_chars.update(d) full_char_reverse = {y: x for x, y in full_chars.items()} def _replace_unicode(text): for k, v in full_chars.items(): text = text.replace(k, v) return text def _replacesub(text): sub_pattern_1 = re.compile('(_\{\S*?\})') sub_pattern_2 = re.compile('_\S') for s in sub_pattern_1.findall(text): text = text.replace(s, u'{0:}'.format(s[2:-1])) for s in sub_pattern_2.findall(text): text = text.replace(s, u'{0:}'.format(s[1:])) return text def _replacesup(text): sup_pattern_1 = re.compile('\^\{\S*?\}') sup_pattern_2 = re.compile('\^\S') for s in sup_pattern_1.findall(text): text = text.replace(s, u'{0:}'.format(s.strip()[2:-1])) for s in sup_pattern_2.findall(text): text = text.replace(s, u'{0:}'.format(s.strip()[1:])) return text def str2format(text): text = _replacesub(text) text = _replacesup(text) text = _replace_unicode(text) return text def format2str(text): for k, v in full_char_reverse.items(): text = text.replace(k, v) for k, v in [('', '_{'), ('', '}'), ('', '^{'), ('', '}')]: text = text.replace(k, v) return text def format2grace(text): text = format2str(text) for k, v in [('_{', r'\s'), ('}', r'\N'), ('^{', r'\S'), ('}', r'\N')]: text = text.replace(k, v) for k, v in big_greek_grace.items(): text = text.replace(k, v) for k, v in small_greek_grace.items(): text = text.replace(k, v) for k, v in special_chars_grace.items(): text = text.replace(k, v) return text def grace2str(text): text = text.replace(r'\s', '_{').replace('\S', '^{') text = text.replace(r'\N', '}') text = text.replace(r'\f{}', '') return text if __name__ == '__main__': stringtext = 'M_{infty}[1-alpha exp(-x/T_{1,1})^{beta_1}]' print('Input:\t{}'.format(stringtext)) print(u'Output:\t{}'.format(str2format(stringtext))) print('Input 2:\t{}'.format(format2str(str2format(stringtext)))) print('Grace:\t{}'.format(format2grace(str2format(stringtext)))) print(u'Output 2:\t{}'.format(str2format(format2str(str2format(stringtext)))))