import pprint import re import textwrap import kutil import klammer_base import itertools import math from html_util import E class List(klammer_base.Klammer_base): def __init__(self, K, list_type): super().__init__(K) self.list_type = list_type self.items = self.list_items word_count = max([len(e.strip().split()) for e in self.items]) self.compressed = False #and word_count < int(self.List_compressed_word_max) def html(self): body = "" word_count = 0 for e in self.items: body += f"
  • \n{kutil.format_for_paragraphs(e.strip())}\n
  • \n" cls = "compressed" if self.compressed else "" result = E(self.list_type).cls(cls).body(body.strip()).str().strip() + "\n" return result def tex(self): body = "\n\n".join([f"\\item {e}" for e in self.items]) command = {'ol' : 'enumerate', 'ul' : 'itemize'}[self.list_type] init = "" if self.__dict__.get("initial") and self.initial != 1: init = "\\addtocounter{enumi}{" + str(self.initial - 1) + "}" #topsep = '[noitemsep,topsep=0pt]' topsep = "[noitemsep,topsep=0pt," if self.compressed else "[topsep=0pt,itemsep=2pt," topsep += "leftmargin=16pt]" listsep = '\\setlist{nolistsep}' if self.cmp else '' result = f'{listsep}\n\\begin{{{command}}}{topsep}{init}\n{body}\n\\end{{{command}}}\n' return result def txt(self): n = 1 result = "" for item in self.items: prefix = f"{n:3}. " if self.list_type == "ol" else " • " # U+2022 print("prefix", prefix) formatted_item = "\n".join( textwrap.wrap(item.strip(), width=80, subsequent_indent=" "*(len(prefix)))) result += f"{prefix}{formatted_item}\n" if not self.compressed: result += "\n" n += 1 return result class Define(klammer_base.Klammer_base): def __init__(self, K): super().__init__(K) self.items = self.descriptions #self.show() #pprint.pprint(self.items) def html(self): def fontify(s): return {"r" : s, "i" : f"{s}", "b" : f"{s}", "t" : f'{s}', "c" : f'{s}', "s" : f'{s}'}[self.font] result = "\n\n".join([f"
    {fontify(term)}
    \n
    {definition}
    " for term,definition in self.items]) result = f"
    \n{result}\n
    " return result def tex(self): def fontify(s): font = {'r' : r'\normalfont', 'i' : r'\normalfont\itshape', 'b' : r'\normalfont\bfseries', 't' : r'\normalfont\ttfamily', 'c' : r'\normalfont\ttfamily', 's' : r'\normalfont\sffamily'}[self.font] return f"{font} {s}" # The "\hfill\newline" was to force the description to the next line even if the item was small: # result = "\n\n".join([f"\\item[{{{fontify(term)}}}]\\hfill\n\\newline {definition}" strut = r"\rule[-8pt]{0pt}{8pt}" result = "\n\n".join([f"\\item[{{{fontify(term)}{strut}}}] {definition}" for term,definition in self.items]) result = f"\\begin{{description}}[labelindent=12pt,nosep,itemsep=6pt,parsep=.5\\parskip,style=nextline]\n{result}\n\\end{{description}}" return result # Needs to be implemented: # def txt(self): # return "TXT DEFINITIONS" class Lines(klammer_base.Klammer_base): def __init__(self, K): super().__init__(K) def html(self): #return "
    ".join(self.s.strip().split("\n")) #return f'
    {self.s}
    ' #return f'
    {self.s}
    ' result = self.s result = re.sub("\n", "
    \n", result) result = re.sub(" ", "&^#160;", result) return result def tex(self): return r"\\\newline\n".join(self.s.strip().split("\n")) def txt(self): return self.s.strip() def make_column_lists(lst, count): cols = math.ceil(len(lst) / count) result = [] for i in range(count): #print(i * cols, (i + 1) * cols) result.append(lst[i * cols : (i+1) * cols]) return list(itertools.zip_longest(*result, fillvalue="")) def xmake_column_lists(lst, column_count): count = len(lst) row_count = math.ceil(count / column_count) print(count, column_count, row_count) i = 0 while i < count: i += 1 def columns(K): rows = make_column_lists(K.items.split(), K.n) result = "@table\n" # :lines false :header_line false :leading 1.1 :vmargin false |\n" for row in rows: #print("row:", row) result += " | ".join(row) + " ||\n" result += "table@\n" if K.K_target == "latex": result = f"\\vspace*{{-12pt}}\n{result}" return result