# Paragraph designer generation import sys, time, os.path styles_438dsg48 = [] def add_style(style): styles_438dsg48.append(style) return style class ParagraphOptions: def __init__(self, **kw): arg_names = ('cmd', 'parent', 'space_above', 'space_below', 'fontsize', 'baseline', 'fontcmd', 'stylecmd', 'boxes', 'leftskip', 'moresetup', 'afterpar', 'env', 'hsize', 'preamble_arg1', 'preamble_arg2', 'preamble_arg3', 'preamble_arg4') cmd = kw.get('stylecmd') # 'cmd' or 'stylecmd' are required if not cmd: cmd = kw['cmd'] parent = kw.get('parent', None) if parent: for arg in arg_names: if ('cmd' == arg) or ('stylecmd' == arg): setattr(self, arg, None) continue setattr(self, arg, getattr(parent, arg)) else: for arg in arg_names: setattr(self, arg, None) for (arg, val) in kw.iteritems(): if not (arg in arg_names): raise AttributeError(arg) setattr(self, arg, val) # # Print style as an internal command # def get_style_string(self): s = '' #if self.space_above: # s = "\\ParaSpaceAbove{%s}" % self.space_above fontcmd = self.fontcmd if self.fontsize and self.baseline: s = s + "\\fontsize{%s}{%s}" % (self.fontsize, self.baseline) if not fontcmd: fontcmd = '\\selectfont' if fontcmd: s = s + fontcmd return s # # Print the style as command # def print_command(self, h): if self.stylecmd: s_style = self.get_style_string() h.write("\\newcommand{\\%s}{%s}%%\n" % (self.stylecmd, s_style)) if not self.cmd: return if self.boxes: n_boxes = len(self.boxes) else: n_boxes = 0 n_lastarg = n_boxes + 1 h.write("\\newcommand{\\%s}[%i]{{%%\n" % (self.cmd, n_lastarg)) self.write_para_setup(h) if self.boxes: if self.leftskip: h.write("\\advance\\pd@leftskip by %s " % self.leftskip) self.print_boxes(h) h.write("%\n\\the\\everypar ") s_after_par = self.get_after_para() if self.hsize: h.write("\\hsize=%s\\relax\n" % self.hsize) preamble_attr = 'preamble_arg' + str(n_lastarg) s_preamble = getattr(self, preamble_attr, None) if s_preamble is None: s_preamble = '' h.write("%s#%i\\par}%s}\n" % (s_preamble, n_lastarg, s_after_par)) def print_env(self, h): if not self.env: return h.write("\\newenvironment{%s}{" % self.env) self.write_para_setup(h) h.write("\ignorespaces}\n{") ap = self.get_after_para() if ap: h.write("\\par\\global\\def\\pd@after@para{%s}\\aftergroup\\pd@after@para" % ap) h.write("}\n") def write_para_setup(self, h): # "space_above" before "moresetup" because the latter # may contain a call to "headbreaker" s_style = self.get_style_string() h.write(s_style) spa = self.space_above or '0pt' if '#natural' != spa: h.write("%%\n\\ParaSpaceAbove{%s}" % spa) if self.moresetup: h.write("%%\n%s" % self.moresetup) h.write("%\n\\noindent ") def get_after_para(self): s_after_par = '' if self.afterpar: s_after_par = self.afterpar if '#natural' != self.space_below: spb = self.space_below or '0pt' s_after_par = s_after_par + ('\\ParaSpaceBelow{%s}' % spb) return s_after_par def print_boxes(self, h): box_i = 0 for box in self.boxes: box_i = box_i + 1 (offset, width) = box h.write("%%\n\\hbox to 0pt{\\hss\\hbox to %s{#%i\\hss}\\dimen0=%s " % (width, box_i, self.leftskip)) h.write("%%\n\\advance\\dimen0 by -%s \\advance\\dimen0 by -%s \\hskip\\dimen0}" % (offset, width)) def print_styles(h): for style in styles_438dsg48: h.write("\n") style.print_command(h) style.print_env(h) # # Command-line # def main(codeword): h = sys.stdout if len(sys.argv) > 1: file_name = sys.argv[1] h = open(file_name, 'w') s_name = os.path.splitext(os.path.basename(file_name))[0] s_date = time.strftime('%Y/%m/%d') h.write("\\ProvidesPackage{%s}[%s Automatically generated paragraph styles for: %s]\n" % (s_name, s_date, s_name)) h.write("% RTL hook\n\\let\\pd@leftskip=\\leftskip\n") print_styles(h) if h != sys.stdout: h.close()