ó
ˆ¨¬Sc           @   s…  d  Z  d d l Z d d l Z d d l Z d d l m Z m Z d d l m Z m	 Z	 d d l m
 Z
 m Z m Z m Z d d l m Z d d l m Z d d l m Z d Z e j d ƒ Z e j d ƒ Z e j d ƒ Z d Z d Z e e ƒ Z e j d ƒ d „  ƒ Z e j d ƒ d „  ƒ Z e j d ƒ d „  ƒ Z e j d ƒ d „  ƒ Z  d „  Z! e d k re j" d e# d d ƒ n  d S(   sU    Web interface to draw trees. Requires Flask.
Optional: pdflatex, tikz, imagemagick. iÿÿÿÿN(   t   Popent   PIPE(   t   Flaskt   Response(   t   requestt   render_templatet   redirectt   url_for(   t   send_from_directory(   t   incrementaltreereader(   t   DrawTreei   i
   sC   \(([_*A-Z0-9]+)(?:\[[^ ]*\][0-9]?)?((?:-[_A-Z0-9]+)?(?:\*[0-9]+)? )s   -[_A-Z0-9]+s    ([^ ()]+)(?=[ )])s#  \documentclass{article}
\usepackage[landscape]{geometry}
\usepackage[utf8]{inputenc}
%s
%% NB: preview is optional, to make a cropped pdf
\usepackage[active, tightpage]{preview} \setlength{\PreviewBorder}{0.2cm}
\begin{document}
\pagestyle{empty}
\fontfamily{phv}\selectfont
\begin{preview}
s   
\end{preview}
\end{document}
t   /c           C   s   t  t d ƒ ƒ S(   s+    Redirect to avoid trailing slash hassles. t   index(   R   R   (    (    (    s   treedraw.pyt   main(   s    s   /indexc           C   s
   t  d ƒ S(   s    Form for trees & parameters. s	   draw.html(   R   (    (    (    s   treedraw.pyR   .   s    s   /favicon.icoc           C   s%   t  t j j t j d ƒ d d d ƒS(   s    Serve the favicon. t   statics   treesearch.icot   mimetypes   image/vnd.microsoft.icon(   R   t   ost   patht   joint   APPt	   root_path(    (    (    s   treedraw.pyt   favicon4   s    s   /drawc          C   sì   t  t j d ƒ t k r! d t Sg  }  x² t t j d j ƒ  d d t j k rU d n d d d t j k rp d n d ƒD]a \ } } } y) |  j t | | d d t j k ƒƒ Wqw t	 k
 r× } t
 t | ƒ d	 d
 ƒSXqw Wt t j |  ƒ S(   s"    Wrapper to parse & draw tree(s). t   trees   Too much data. Limit: %d bytest
   morphologyt   morpht   betweent	   functionst   funct   abbrR   s
   text/plainN(   t   lenR   t   argst   LIMITR	   t
   splitlinest   Nonet   appendR
   t	   ExceptionR   t   strt	   drawtrees(   t   dtsR   t   sentt   _restt   err(    (    s   treedraw.pyt   draw;   s    +)c            sh  ˆ  j  d d ƒ d k r° t | ƒ d k rM t | d j ƒ  j d ƒ d d ƒSd	 g } x. | D]& } | j d
 | j ƒ  j d ƒ ƒ q] W| j d ƒ t d j | ƒ d d ƒSnÎ ˆ  j  d d ƒ d k r~ˆ  j  d t ƒ } ˆ  j  d d ƒ } g  } | rd } | j d ƒ n d } x7 | D]/ } | j | j d | d | ƒ j d ƒ ƒ qW| re| j d ƒ n  t d j | ƒ d | ƒSˆ  j  d d ƒ d k rÎd j t	 d d j ‡  f d †  | Dƒ ƒ t
 f ƒ } næ ˆ  j  d d& ƒ d k rt	 d g } xj | D]b } x9 t | j j d „  ƒ | j ƒ D] \ } }	 |	 | d <q"W| j d j d „  | Dƒ ƒ ƒ qúW| j t
 ƒ d j | ƒ } n5 d j t	 d d j ‡  f d  †  | Dƒ ƒ t
 f ƒ } ˆ  j  d d ƒ d! k rÜt | d d ƒSt j d" d# d$ d% ƒ }
 |
 j | ƒ Wd& QXt j d' ƒ t d( j ƒ  d) d& d* t d+ t d, t ƒ} | j ƒ  ˆ  j  d d ƒ d- k r³y t d' d. d d/ ƒSWn t k
 rn Xx" d; D] } t j d2 | ƒ q•Wn  ˆ  j  d d ƒ d3 k rdt d4 j ƒ  d) d& d* t d+ t d, t ƒ} | j ƒ  y t d' d5 d d6 ƒSWn t k
 r)n Xx7 d< D], } y t j | ƒ Wq1t k
 r\Pq1Xq1Wn  d& S(=   s%    Draw trees in the requested format. t   outputt   textt   svgi   i    s   utf-8R   s   image/svg+xmlsq   <!doctype html>
<html>
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>s   <div>
%s
</div>

s   </body></html>s   
s	   text/htmlt   colort   unicodesw   <!doctype html>
<html>
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
<pre>s
   text/plaint   unicodelinest   htmls   </pre></body></html>t   typet   matrixt    s<   \usepackage{helvet,tikz}
\usetikzlibrary{matrix,positioning}s   

c         3   sW   |  ]M } | j  d  ˆ  j d d ƒ r* d n d d ˆ  j d d ƒ rH d n d ƒ Vq d S(   t	   leafcolorR.   R4   t   bluet	   nodecolort   redN(   t
   tikzmatrixt   get(   t   .0t   dt(   t   form(    s   treedraw.pys	   <genexpr>s   s   t   qtrees#   \usepackage{helvet,tikz,tikz-qtree}c         S   s   |  o t  |  d t ƒ S(   Ni    (   t
   isinstancet   int(   t   n(    (    s   treedraw.pyt   <lambda>|   s    c         s   s   |  ] } | j  j ƒ  Vq d  S(   N(   R   t   pprint_latex_qtree(   R;   R<   (    (    s   treedraw.pys	   <genexpr>   s   s5   \usepackage{helvet,tikz}
\usetikzlibrary{positioning}c         3   sW   |  ]M } | j  d  ˆ  j d d ƒ r* d n d d ˆ  j d d ƒ rH d n d ƒ Vq d S(   R5   R.   R4   R6   R7   R8   N(   t   tikznodeR:   (   R;   R<   (   R=   (    s   treedraw.pys	   <genexpr>ˆ   s   t   latexs   /tmp/dtree.text   wt   encodingt   utf8Ns   /tmps0   /usr/bin/pdflatex -halt-on-error  /tmp/dtree.text   stdint   stdoutt   stderrt   shellt   pdfs	   dtree.pdfs   application/pdft   auxt   logs   /tmp/dtree.t   pngs?   /usr/bin/convert -density 125 /tmp/dtree.pdf 				/tmp/dtree.pngs	   dtree.pngs	   image/pngs   /tmp/dtree.auxs   /tmp/dtree.logs   /tmp/dtree.pdfs   /tmp/dtree.png(   s   auxs   logRM   (   s   /tmp/dtree.auxs   /tmp/dtree.logs   /tmp/dtree.texs   /tmp/dtree.pdfs   /tmp/dtree.png(   R:   R   R   R-   t   encodeR"   R   t   FalseR,   t   PREAMBLEt	   POSTAMBLER!   t   zipR   t   subtreesR'   t   iot   opent   writeR   t   chdirR    t   splitR   t   waitR   t   IOErrort   removet   OSError(   R=   R&   t   resultR<   R1   t   asciiR   t	   latexcodet   post   wordt   text   proct   extt   filename(    (   R=   s   treedraw.pyR%   L   s     	'	
	



t   __main__t   debugt   hosts   0.0.0.0i (  ($   t   __doc__RW   R   t   ret
   subprocessR    R   t   flaskR   R   R   R   R   R   R   t   discodop.treebankR	   t   discodop.treedrawR
   R   t   compilet
   MORPH_TAGSt	   FUNC_TAGSt	   GETLEAVESRS   RT   t   __name__R   t   routeR   R   R   R*   R%   t   runt   True(    (    (    s   treedraw.pyt   <module>   s0   "		h