def R(key, value, fmt, meta): if key == 'CodeBlock': [[ident, classes, keyvals], raw_code] = value if "r" in classes: path = os.path.dirname(os.path.abspath(__file__)) caption, typef, keyvals = get_caption(keyvals) width, keyvals = get_value(keyvals, "width", 7) height, keyvals = get_value(keyvals, "height", 7) filename = sha1(raw_code + str(width) + str(height)) src = imagedir + '/' + filename + '.png' if not os.path.isfile(src): try: os.mkdir(imagedir) except OSError: pass code = "ppi <- 100\npng('" + src + \ "', width=" + width + "*ppi, height=" + height + "*ppi, res=ppi)\n" + raw_code data, err = pipe(["R", "--no-save"], code) if (len(err) > 0): return Para([Str(err)]) try: image = Image([ident, [], keyvals], caption, [src, typef]) return Para([image]) except: try: image = Image(caption, [src, typef]) return Para([image]) except: pass
def R(key, value, fmt, meta): if key == 'CodeBlock': [[ident,classes,keyvals], raw_code] = value if "r" in classes: path = os.path.dirname(os.path.abspath(__file__)) caption, typef, keyvals = get_caption(keyvals) width, keyvals = get_value(keyvals, "width", 7) height, keyvals = get_value(keyvals, "height", 7) filename = sha1(raw_code + str(width) + str(height)) src = imagedir + '/' + filename + '.png' if not os.path.isfile(src): try: os.mkdir(imagedir) except OSError: pass code = "ppi <- 100\npng('" + src + \ "', width=" + width + "*ppi, height=" + height + "*ppi, res=ppi)\n" + raw_code data, err = pipe(["R", "--no-save"], code) if (len(err) > 0): return Para([Str(err)]) try: image = Image([ident, [], keyvals], caption, [src, typef]) return Para([image]) except: try: image = Image(caption, [src, typef]) return Para([image]) except: pass
def docmap(key, value, format, meta): global REFFILE if key == 'Header': [level, attr, inline] = value [ids, classes, keyvals] = attr # Change the reference file if we see a new level-1 header if level == 1 and 'fromfile' in meta: reffile = re.sub("\.md", ".html", meta['fromfile']['c']) REFFILE = "~~" + reffile + "~~" sys.stderr.write(reffile + "\n") return Header(level, [REFFILE + str(ids), [], []], inline) elif key == 'CodeBlock': [[ident, classes, keyvals], code] = value if "include" in classes: rv = [] for l in code.splitlines(): l = l.strip() if os.path.isfile(l): (headingLevel, dummy) = get_value(keyvals, "heading-level") if not headingLevel: headingLevel = 0 contents = get_contents_of_file(l, headingLevel) doc = json.loads(md_to_json(contents)) if 'meta' in doc: meta = doc['meta'] elif doc[0]: # old API meta = doc[0]['unMeta'] else: meta = {} # Add a file to the meta info meta['fromfile'] = {u'c': l, u't': 'MetaString'} altered = walk(doc, docmap, format, meta) rv.append(altered['blocks']) else: sys.stderr.write("WARNING: Can't read file '" + l + "'. Skipping.") # Return a flattened list using nested list comprehension # # The following is equivalent to: # # flattened = [] # for sublist in rv: # for item in sublist: # flattened.append(item) # return flattened return [item for sublist in rv for item in sublist]
def __call__(self, codec): 'Return worker class or self (Handler keeps CodeBlock unaltered)' # CodeBlock's value = [(Identity, [classes], [(key, val)]), code] self.msg(4, 'Handler dispatch request for', codec[0]) # get classes and keyvals from codeblock attributes try: _, klasses, keyvals = codec[0] except Exception as e: self.msg(0, 'Fatal: invalid codeblock passed in', codec) raise e # try dispatching by class attribute for klass in klasses: worker = self.workers.get(klass.lower(), None) if worker is not None: worker.klass = klass.lower() self.msg(4, codec[0], 'dispatched by class to', worker) return worker(codec) # try dispatching via 'cmd' named by 'im_prg=cmd' key-value-pair if keyvals: # pf.get_value barks if keyvals == [] prog, _ = pf.get_value(keyvals, 'im_prg', '') worker = self.workers.get(prog.lower(), None) if worker is not None: self.msg(4, codec[0], 'dispatched by prog to', worker) return worker(codec) self.msg(4, codec[0], 'dispatched by default to', self) return self
def include_code(key, value, format, _): if key == 'CodeBlock': [[ident, classes, keyvals], code] = value if "include-code" in classes: rv = [] for l in code.splitlines(): l = l.strip() (filename, ext) = os.path.splitext(l) ext = ext.replace(".", "") # Overide the file extension if we are given # a language keyval (givenExt, value) = get_value(keyvals, u"language") if str(givenExt) != "None": ext = str(givenExt) if os.path.isfile(l): with open(l, "r") as f: contents = f.read() rv.append(CodeBlock(["", [ext], []], contents)) else: sys.stderr.write("WARNING: Can't read file '" + l + "'. Skipping.") return rv
def get_title(kv): title = [] typef = "" value, res = get_value(kv, u"title") if value is not None: title = [Str(value)] typef = "Fig:" return title, typef, res
def __init__(self, codec): 'init by decoding the CodeBlock-s value' # codeblock attributes: {#Identity .class1 .class2 k1=val1 k2=val2} self.codec = codec # save original codeblock for later self.stdout = '' # catches stdout by self.cmd, if any self.stderr = '' # catches stderr by self.cmd, if any if codec is None: return # initial dispatch creation (self.id_, self.classes, self.keyvals), self.code = codec self.caption, self.typef, self.keyvals = pf.get_caption(self.keyvals) # `Extract` Imagine keywords/keyvals from codeblock's attributes # - also remove any and all Imagine classes self.classes = [k for k in self.classes if k not in self.workers] self.options, self.keyvals = pf.get_value(self.keyvals, 'im_opt', '') self.options = self.options.split() self.prog, self.keyvals = pf.get_value(self.keyvals, 'im_prg', None) im_out, self.keyvals = pf.get_value(self.keyvals, 'im_out', self.output) self.im_out = im_out.lower().replace(',', ' ').split() outfmt, self.keyvals = pf.get_value(self.keyvals, 'im_fmt', self.outfmt) if outfmt in self.available_fmts: self.outfmt = outfmt # im_prg=cmd key-value trumps .cmd class attribute if not self.prog: self.prog = self.cmdmap.get(self.klass, None) if self.prog is None: self.msg(0, self.klass, 'not listed in', self.cmdmap) raise Exception('no workers found for %s' % self.klass) self.basename = pf.get_filename4code(IMG_BASEDIR, str(codec)) self.outfile = self.basename + '.%s' % self.outfmt self.inpfile = self.basename + '.%s' % self.klass # _name.lower() if not os.path.isfile(self.inpfile): self.write('w', self.code, self.inpfile)
def graphviz(key, value, format, _): if key == 'CodeBlock': [[ident, classes, keyvals], code] = value if "graphviz" in classes: caption, typef, keyvals = get_caption(keyvals) prog, keyvals = get_value(keyvals, u"prog", u"dot") filetype = get_extension(format, "svg", html="svg", latex="pdf") dest = get_filename4code("graphviz", code, filetype) if not os.path.isfile(dest): g = pygraphviz.AGraph(string=code) g.layout() g.draw(dest, prog=prog) sys.stderr.write('Created image ' + dest + '\n') return Para([Image([ident, [], keyvals], caption, [dest, typef])])
def graphviz(key, value, format, _): if key == 'CodeBlock': [[ident, classes, keyvals], code] = value if "graphviz" in classes: caption, typef, keyvals = get_caption(keyvals) prog, keyvals = get_value(keyvals, u"prog", u"dot") filetype = get_extension(format, "png", html="png", latex="pdf") dest = get_filename4code("graphviz", code, filetype) if not os.path.isfile(dest): g = pygraphviz.AGraph(string=code) g.layout() g.draw(dest, prog=prog) sys.stderr.write('Created image ' + dest + '\n') return Para([Image([ident, [], keyvals], caption, [dest, typef])])
def include(key, value, format, _): if key == 'CodeBlock': [[ident, classes, keyvals], code] = value if "include" in classes: rv = [] for l in code.splitlines(): l = l.strip() if os.path.isfile(l): (headingLevel, dummy) = get_value(keyvals, "heading-level") if not headingLevel: headingLevel = 0 contents = get_contents_of_file(l, headingLevel) doc = json.loads(str_to_json(contents)) if 'meta' in doc: meta = doc['meta'] elif doc[0]: # old API meta = doc[0]['unMeta'] else: meta = {} altered = walk(doc, include, format, meta) rv.append(altered['blocks']) elif l == '': # Empty lines are harmless next else: sys.stderr.write("WARNING: Can't read file '" + l + "'. Skipping.\n") # Return a flattened list using nested list comprehension # # The following is equivalent to: # # flattened = [] # for sublist in rv: # for item in sublist: # flattened.append(item) # return flattened return [item for sublist in rv for item in sublist]
def get_cb_opts(self, codec): 'pickup user preferences from code block' # also removes imagine class/attributes from code block, by # retaining only non-Imagine stuff in self.classes and self.keyvals dct = {} opts = [x for x in dir(self) if x.startswith('im_')] (self.id_, self.classes, self.keyvals), self.code = codec self.caption, self.typef, self.keyvals = pf.get_caption(self.keyvals) # - remove all Imagine-related classes from codeblock attributes self.classes = [k for k in self.classes if k not in self.workers] for opt in opts: val, self.keyvals = pf.get_value(self.keyvals, opt, None) if val: dct[opt] = val self.cb_opts = dct self.msg(4, "codeblock:", dct) return dct
def mscgen(key, value, format, _): if key == 'CodeBlock': (ident, classes, keyvals), code = value if "mscgen" in classes: caption, typef, keyvals = get_caption(keyvals) prog, keyvals = get_value(keyvals, "prog", "mscgen") filetype = get_extension(format, PICTURE_FORMAT) dest = get_filename4code("mscgen", code, filetype) if not os.path.isfile(dest): result = subprocess.run( [ "mscgen", "-T", "png", "-o", dest, "-", ], input=code.encode(), ) sys.stderr.write('Created image ' + dest + '\n') return Para([Image([ident, [], keyvals], caption, [dest, typef])])
def graphviz(key, value, format, _): if key == 'CodeBlock': [[ident, classes, keyvals], code] = value if "graphviz" in classes: caption, typef, keyvals = get_caption(keyvals) prog, keyvals = get_value(keyvals, u"prog", u"dot") filetype = get_extension(format, "png", html="png", latex="pdf") dest = get_filename4code("graphviz", code, filetype) filename = "" for a,fname in keyvals: if(a == "filename"): valid_chars = "-_ %s%s" % (string.ascii_letters, string.digits) fname = ''.join(x for x in fname if x in valid_chars) if fname != "": filename = "graphviz-images/"+fname+"."+filetype dest = filename if (filename != "") or (not os.path.isfile(dest)): g = pygraphviz.AGraph(string=code) g.layout() g.draw(dest, prog=prog) sys.stderr.write('Created image ' + dest + '\n') return Para([Image([ident, [], keyvals], caption, [dest, typef])])
def graphviz(key, value, format, _): if key == 'CodeBlock': (ident, classes, keyvals), code = value if "graphviz" in classes: caption, typef, keyvals = get_caption(keyvals) prog, keyvals = get_value(keyvals, "prog", "dot") filetype = get_extension(format, PICTURE_FORMAT) dest = get_filename4code("graphviz", code, filetype) if not os.path.isfile(dest): result = subprocess.run( [ "dot", "-T{}".format(PICTURE_FORMAT), "-Gdpi=300", ], stdout=subprocess.PIPE, input=code.encode(), ) with open(dest, 'wb') as fd: fd.write(result.stdout) sys.stderr.write('Created image ' + dest + '\n') return Para([Image([ident, [], keyvals], caption, ["/" + dest, typef])])
def graphviz(key, value, format, _): if key == 'CodeBlock': [[ident, classes, keyvals], code] = value if "graph" in classes: caption, typef, keyvals = get_caption(keyvals) prog, keyvals = get_value(keyvals, u"prog", u"dot") filetype = get_extension(format, "svg", html="svg", latex="pdf") dest = get_filename4code(document_name(), code, filetype) # If name attribute exists, overwrite standard filename for eachKeys in keyvals: if 'name' in eachKeys[0]: filename = "graph-images/" + eachKeys[1][:-4] dest = filename + '.' + filetype if not os.path.isfile(dest): g = pygraphviz.AGraph(string=code) g.layout() g.draw(dest, prog=prog) sys.stderr.write('Created image ' + dest + '\n') image = Image([ident, classes, keyvals], caption, [dest, typef]) return Para([image])