Verbatim-safe typography, ^-punctuation quoting, full-range ^UUUU^, polyglot html
Typographic transforms (---, quote pairs, ~) no longer touch verbatim text: @c/@code/@source_listing content and ^'...'^ spans show exactly the characters written. "^" before any punctuation character quotes it in every target (the apostrophe excepted: ^' opens a literal span), with the new :resolve option on @@@target declaring per-target renderings. The ^UUUU^ code-point form accepts 4-6 hex digits, the full Unicode range. The html output and transform spellings are polyglot (XML-valid), in preparation for an EPUB target. New suites: transform_test, character_test (engine), typography_test (SKS). (from dev 07ce5ea86a0a)
This commit is contained in:
@@ -5,72 +5,60 @@ import pprint
|
||||
import klammer_base
|
||||
import kutil
|
||||
import latex_util
|
||||
import html_util
|
||||
from html_util import E
|
||||
import color
|
||||
|
||||
class Indent(klammer_base.Klammer_base):
|
||||
def __init__(self, K):
|
||||
super().__init__(K)
|
||||
self.s = kutil.escape(self.s)
|
||||
# Doesn't do anything now:
|
||||
# self.s = kutil.escape(self.s)
|
||||
if self.right < 0:
|
||||
self.right = self.left
|
||||
self.reduce = self.left + self.right
|
||||
|
||||
def html(self):
|
||||
return "FIX: INDENT " + self.s
|
||||
|
||||
text_align = "justify" if not self.ragged else "left"
|
||||
return E("div").body(self.s)\
|
||||
.sty("margin", f"0.5rem {self.right}ex 0.5rem {self.left}ex")\
|
||||
.sty("text-align", text_align)\
|
||||
.str()
|
||||
def tex(self):
|
||||
tab = f"\\hspace*{{{self.w}ex}}"
|
||||
result = ""
|
||||
|
||||
if self.linebreak:
|
||||
for e in self.s.split("\n"):
|
||||
result += f"{tab}{e}\\\\\n"
|
||||
result = result[:-3]
|
||||
result = re.sub(r"\t", r"\\t", result)
|
||||
else:
|
||||
result = tab + latex_util.minipage(
|
||||
"\\raggedright " + self.s, f"\\textwidth - {self.w}ex", center=False, vmargin="4pt")
|
||||
#print(result)
|
||||
return latex_util.block(result)
|
||||
if self.ragged:
|
||||
self.s = "\\raggedright " + self.s
|
||||
result = rf"\hspace*{{{self.left}ex}}" + latex_util.minipage(
|
||||
self.s, rf"\linewidth - {self.reduce}ex", center=False)
|
||||
result = latex_util.block(result)
|
||||
return result
|
||||
|
||||
def txt(self):
|
||||
indent = " " * self.w
|
||||
indent = "~" * self.left # Removed in phases.justify_blocks
|
||||
width = int(self.Target_txt_width) - self.left - self.right + 1 # Off-by one for textwrap
|
||||
result = self.s
|
||||
result = re.sub("KK0022", '"', result)
|
||||
result = indent + f"\n{indent}".join(textwrap.wrap(result, width=70, break_on_hyphens=False))
|
||||
return f"@lit\n{result}\nlit@"
|
||||
result = indent + f"\n{indent}".join(textwrap.wrap(result, width=width, break_on_hyphens=True))
|
||||
return result
|
||||
|
||||
|
||||
class Note(klammer_base.Klammer_base):
|
||||
def __init__(self, K):
|
||||
super().__init__(K)
|
||||
|
||||
def html(self):
|
||||
color = ",".join([f"{float(e)*100}%" for e in self.color.split(",")])
|
||||
result = f'''<div class="box" style="background-color: rgb({color}); border-color: rgb({self.bordercolor}) ;">
|
||||
<b>{self.label}:</b> {self.s}
|
||||
</div>'''
|
||||
result = E("div").cls("box")\
|
||||
.sty("width", f"{self.width*100}%")\
|
||||
.sty("background-color", html_util.color(self.color))\
|
||||
.sty("border-color", html_util.color(self.border_color))\
|
||||
.sty("margin-left", "auto")\
|
||||
.body(f"<b>{self.label}:</b> {self.s}")\
|
||||
.str()
|
||||
return result
|
||||
|
||||
def tex(self):
|
||||
if self.width:
|
||||
width = r'{}\\textwidth'.format(self.width)
|
||||
else:
|
||||
#width = r'\\textwidth - 16pt - {}\\leftmargin'.format(self.level)
|
||||
width = r'\\linewidth - \\leftmargin + 2pt'
|
||||
|
||||
# The \par on each side comes from latex_util.block() below: an
|
||||
# \fcolorbox is box material and must sit in vertical mode.
|
||||
result = '''
|
||||
\\begingroup
|
||||
COLOR\\setlength{\\fboxsep}{8pt}
|
||||
\\fcolorbox{bordercolor}{localcolor}{
|
||||
\\parbox{WIDTH}{\\raggedright\\setlength{\\parskip}{8pt}
|
||||
\\textbf{LABEL:} TEXT
|
||||
}}\\endgroup
|
||||
'''
|
||||
result = re.sub('LABEL', self.label, result)
|
||||
result = re.sub('TEXT', re.sub(r'\\', r'\\\\', self.s), result)
|
||||
result = re.sub('COLOR', r'\\definecolor{{localcolor}}{{rgb}}{{{}}}\nCOLOR'.format(self.color), result)
|
||||
result = re.sub('COLOR', r'\\definecolor{{bordercolor}}{{rgb}}{{{}}}\n'.format(self.bordercolor), result)
|
||||
result = re.sub('WIDTH', width, result)
|
||||
print(result)
|
||||
return latex_util.block(result)
|
||||
return latex_util.color_box(
|
||||
f"\\textbf{{{self.label}:}} {self.s}",
|
||||
self.width, self.color, self.border_color)
|
||||
|
||||
|
||||
class Block(klammer_base.Klammer_base):
|
||||
@@ -95,13 +83,12 @@ class Block(klammer_base.Klammer_base):
|
||||
class Lines(klammer_base.Klammer_base):
|
||||
def __init__(self, K):
|
||||
super().__init__(K)
|
||||
self.s = kutil.escape(self.s)
|
||||
self.lines = self.s.split("\n")
|
||||
|
||||
def html(self):
|
||||
result = ""
|
||||
for line in self.lines:
|
||||
result += line + "<br>\n"
|
||||
result += line + "<br/>\n"
|
||||
return result
|
||||
|
||||
def tex(self):
|
||||
@@ -109,3 +96,24 @@ class Lines(klammer_base.Klammer_base):
|
||||
|
||||
def txt(self):
|
||||
return self.lines
|
||||
|
||||
class Left_right(klammer_base.Klammer_base):
|
||||
def __init__(self, K):
|
||||
super().__init__(K)
|
||||
self.rows = list(zip(self.parts[0], self.parts[1]))
|
||||
|
||||
def html(self):
|
||||
result = ""
|
||||
for left, right in self.rows:
|
||||
result += E("div").body(
|
||||
E("span").cls("left_right").body(left).str() + \
|
||||
E("span").cls("left_right").sty("text-align", "right").body(right).str()).str();
|
||||
result = E("p").body(result).str()
|
||||
return result
|
||||
|
||||
def tex(self):
|
||||
result = ""
|
||||
for left, right in self.rows:
|
||||
result += rf"\parbox{{\linewidth}}{{{left} \hfill {right}}}" + " \\\\\n"
|
||||
result = result[:-3]
|
||||
return result
|
||||
|
||||
Reference in New Issue
Block a user