Exemplo n.º 1
0
 def treeTeX(self, tl=None):
     jos = True
     if tl == None:
         tl = self.copy(True)
     while jos == True:
         jos = False
         for pr in tl.treepositions():
             if isinstance(tl[pr], Tree) and len(
                     tl[pr]) == 1 and tl[pr].node == 'WFF':
                 tl[pr] = toTeX(tl[pr][0])
                 jos = True
                 break
             if isinstance(tl[pr], Tree) and len(
                     tl[pr]) == 5 and 'WFF' not in [
                         (a.node if isinstance(a, Tree) else a)
                         for a in tl[pr]
                     ]:
                 #tl[pr].node = ''.join([a for a in tl[pr]])
                 nod = ''.join([
                     (a.node if isinstance(a, Tree) else toTeX(a))
                     for a in tl[pr]
                 ])
                 if pr == (): tl = Tree(nod, [tl[pr][1], tl[pr][3]])
                 else: tl[pr] = Tree(nod, [tl[pr][1], tl[pr][3]])
                 jos = True
                 break
             if isinstance(tl[pr], Tree) and len(
                     tl[pr]) == 2 and tl[pr][0] == 'n' and (not isinstance(
                         tl[pr][1], Tree) or tl[pr][1].node != 'WFF'):
                 #tl[pr].node = ''.join([a for a in tl[pr]])
                 if pr == ():
                     tl = Tree(
                         toTeX('n') + tl[pr][1].node if isinstance(
                             tl[pr][1], Tree) else toTeX('n') + tl[pr][1],
                         [tl[pr][1]])
                 else:
                     tl[pr] = Tree(
                         toTeX('n') + tl[pr][1].node if isinstance(
                             tl[pr][1], Tree) else toTeX('n') + tl[pr][1],
                         [tl[pr][1]])
                 jos = True
                 break
     for pr in tl.treepositions():
         if isinstance(tl[pr], Tree): tl[pr].node = '$' + tl[pr].node + '$'
         else: tl[pr] = '$' + tl[pr] + '$'
     return tl.pprint_latex_qtree()
Exemplo n.º 2
0
    def drawTreeTest(self):
        """Draw a tree using NLTK, the Qtree TeX package, and ImageMagick.
        
        This doesn't really work.  It is very slow (esp. XeLaTeX typesetting)
        and the trees often spill over the page and are cut up.

        """

        report = []

        def getSubprocess(programName):
            try:
                return subprocess.Popen([programName], shell=False,
                    stdin=subprocess.PIPE, stdout=subprocess.PIPE)
            except OSError:
                return None

        def programIsInstalled(command, name, check):
            try:
                process = getSubprocess(command)
                communication = process.communicate()
                response = communication[0].decode('utf-8')
                if check in response:
                    result = True
                else:
                    result = False
            except AttributeError:
                result = False
            return result

        # See if NLTK is installed
        nltkInstalled = nltkModuleIsInstalled()

        # See if XeLaTeX is installed
        xelatexInstalled = programIsInstalled('xelatex', 'XeLaTeX',
                                            'This is XeTeX')

        # See if ImageMagick is installed
        imagemagickInstalled = programIsInstalled('convert', 'ImageMagick',
                                            'ImageMagick')

        if not nltkInstalled or not xelatexInstalled or not imagemagickInstalled:
            session['flash'] = 'Dependencies for Tree drawing are not installed'
            session.save()
            return render('/derived/administer/index.html')

        # Create the Qtree using NLTK's nltk.Tree class
        from nltk import Tree
        #tree = Tree('(TOP (S (NP-SBJ (PRP It)) (VP (VBZ has) (NP (NP (DT no) (NN bearing)) (PP-DIR (IN on) (NP (NP (PRP$ our) (NN work) (NN force)) (NP-TMP (NN today)))))) (. .)))')
        tree = Tree(u"(TP (DP (D the) (NP (NP (N dog)) (CP (DP 0) (C' (C that) (TP (DP I) (T' (T 0_PAST) (VP (V see) (DP who)))))))) (T' (T 0_PAST) (VP (V be) (AP (A black)))))")
        tree = tree.pprint_latex_qtree()

        # Write the XeLaTeX file
        filesPath = config['app_conf']['permanent_store']
        treesPath = os.path.join(filesPath, 'trees')
        if not os.path.exists(treesPath):
            os.makedirs(treesPath)

        formID = str(11)
        formTreesPath = os.path.join(treesPath, formID)
        if not os.path.exists(formTreesPath):
            os.makedirs(formTreesPath)

        xelatexDoc = u'%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s' % (
            '\documentclass{article}',
            '\usepackage{fontspec}',
            '\setmainfont{Times}',
            '\usepackage{qtree}',
            '\\begin{document}',
            '\pagestyle{empty}',
            '\\tiny',
            '%s' % tree,
            '\end{document}'
        )

        xelatexDocPath = os.path.join(formTreesPath, 'tree.tex')
        pdfDocPath = os.path.join(formTreesPath, 'tree.pdf')
        pngDocPath = os.path.join(formTreesPath, 'tree.png')

        xelatexDocFile = codecs.open(xelatexDocPath, 'w', 'utf-8')
        xelatexDocFile.write(xelatexDoc)
        xelatexDocFile.close()

        # Typeset the XeLaTeX file
        if not os.path.exists(pdfDocPath):
            outDirOpt = '-output-directory=%s' % formTreesPath
            args = ('xelatex', outDirOpt, xelatexDocPath,
                    '-interaction=nonstopmode')
            s = subprocess.call(args, shell=False, stdout=subprocess.PIPE)

        # Convert the PDF to a PNG
        if not os.path.exists(pngDocPath):
            args = ('convert', '-density',  '400', pdfDocPath, '-resize', '75%',
                '-flatten', '-trim', pngDocPath)
            s = subprocess.call(args, shell=False, stdout=subprocess.PIPE)

        fileReference = url('gettree', id=formID)
        img = '<img src="%s" />' % fileReference

        c.img = img

        return render('/derived/administer/index.html')
Exemplo n.º 3
0
    def drawTreeTest(self):
        """Draw a tree using NLTK, the Qtree TeX package, and ImageMagick.
        
        This doesn't really work.  It is very slow (esp. XeLaTeX typesetting)
        and the trees often spill over the page and are cut up.

        """

        report = []

        def getSubprocess(programName):
            try:
                return subprocess.Popen([programName],
                                        shell=False,
                                        stdin=subprocess.PIPE,
                                        stdout=subprocess.PIPE)
            except OSError:
                return None

        def programIsInstalled(command, name, check):
            try:
                process = getSubprocess(command)
                communication = process.communicate()
                response = communication[0].decode('utf-8')
                if check in response:
                    result = True
                else:
                    result = False
            except AttributeError:
                result = False
            return result

        # See if NLTK is installed
        nltkInstalled = nltkModuleIsInstalled()

        # See if XeLaTeX is installed
        xelatexInstalled = programIsInstalled('xelatex', 'XeLaTeX',
                                              'This is XeTeX')

        # See if ImageMagick is installed
        imagemagickInstalled = programIsInstalled('convert', 'ImageMagick',
                                                  'ImageMagick')

        if not nltkInstalled or not xelatexInstalled or not imagemagickInstalled:
            session[
                'flash'] = 'Dependencies for Tree drawing are not installed'
            session.save()
            return render('/derived/administer/index.html')

        # Create the Qtree using NLTK's nltk.Tree class
        from nltk import Tree
        #tree = Tree('(TOP (S (NP-SBJ (PRP It)) (VP (VBZ has) (NP (NP (DT no) (NN bearing)) (PP-DIR (IN on) (NP (NP (PRP$ our) (NN work) (NN force)) (NP-TMP (NN today)))))) (. .)))')
        tree = Tree(
            u"(TP (DP (D the) (NP (NP (N dog)) (CP (DP 0) (C' (C that) (TP (DP I) (T' (T 0_PAST) (VP (V see) (DP who)))))))) (T' (T 0_PAST) (VP (V be) (AP (A black)))))"
        )
        tree = tree.pprint_latex_qtree()

        # Write the XeLaTeX file
        filesPath = config['app_conf']['permanent_store']
        treesPath = os.path.join(filesPath, 'trees')
        if not os.path.exists(treesPath):
            os.makedirs(treesPath)

        formID = str(11)
        formTreesPath = os.path.join(treesPath, formID)
        if not os.path.exists(formTreesPath):
            os.makedirs(formTreesPath)

        xelatexDoc = u'%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s' % (
            '\documentclass{article}', '\usepackage{fontspec}',
            '\setmainfont{Times}', '\usepackage{qtree}', '\\begin{document}',
            '\pagestyle{empty}', '\\tiny', '%s' % tree, '\end{document}')

        xelatexDocPath = os.path.join(formTreesPath, 'tree.tex')
        pdfDocPath = os.path.join(formTreesPath, 'tree.pdf')
        pngDocPath = os.path.join(formTreesPath, 'tree.png')

        xelatexDocFile = codecs.open(xelatexDocPath, 'w', 'utf-8')
        xelatexDocFile.write(xelatexDoc)
        xelatexDocFile.close()

        # Typeset the XeLaTeX file
        if not os.path.exists(pdfDocPath):
            outDirOpt = '-output-directory=%s' % formTreesPath
            args = ('xelatex', outDirOpt, xelatexDocPath,
                    '-interaction=nonstopmode')
            s = subprocess.call(args, shell=False, stdout=subprocess.PIPE)

        # Convert the PDF to a PNG
        if not os.path.exists(pngDocPath):
            args = ('convert', '-density', '400', pdfDocPath, '-resize', '75%',
                    '-flatten', '-trim', pngDocPath)
            s = subprocess.call(args, shell=False, stdout=subprocess.PIPE)

        fileReference = url('gettree', id=formID)
        img = '<img src="%s" />' % fileReference

        c.img = img

        return render('/derived/administer/index.html')