Example #1
0
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
Example #2
0
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
Example #3
0
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]
Example #4
0
    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
Example #6
0
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
Example #7
0
    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)
Example #8
0
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])])
Example #9
0
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])])
Example #10
0
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]
Example #11
0
    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])])
Example #13
0
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])])
Example #15
0
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])