2013-04-27 2 views
1

Я создаю pdf-файлы, используя пакет макросов TeX Context. Исходный файл контекста создается с использованием шаблонов Django, и содержимое преобразуется из HTML (как хранится в базе данных) в синтаксис контекста с использованием Pandoc. Так как нет родного питона обязательного для Pandoc, я создал следующий шаблон фильтр для преобразования HTML в контекст:HTML-шаблон для контекста с использованием Pandoc и Django: как избежать слишком много раз вызывать подпроцесс?

def html2context(value): 
    """ 
    Runs pandoc to convert from HTML to Context. 

    Syntax:: 

    {{ value|html2context }} 
    """ 
    cmd = 'pandoc -f html -t context' 
    p1 = subprocess.Popen(cmd.split(" "), stdout=subprocess.PIPE, stdin=subprocess.PIPE) 
    (stdout, stderr) = p1.communicate(input=value.encode('utf-8')) 
    return mark_safe(stdout) 

Проблема заключается в том, что для создания моих PDF у меня назвать много раз шаблона фильтр, оканчивающимся на очень медленный процесс преобразования. Причина, по которой я должен многократно вызывать фильтр, заключается в том, что мой шаблон смешивает контент из базы данных и необработанные команды контекста для структурирования моего документа: HTML не охватывает все возможности, которые мне нужны в контексте. Минимальный пример моего шаблона выглядит следующим образом:

{% for plugin in intro %} 
    {{ plugin.text.body|html2context }} 
    \page[emptyodd] 
{% endfor %} 

Есть ли у вас какие-либо идеи, как я мог бы сделать процесс конверсии менее неоптимальный?

Благодаря

+0

Я думаю, у вас есть проблема [XY] (http://meta.tex.stackexchange.com/a/2450/5763). Пожалуйста, укажите ваш X. Я серьезно верю, что вы, вероятно, можете сделать это только с ConTeXt MkIV без pandoc. До встречи в [TeX.SX] (http://tex.stackexchange.com/). –

ответ

0

я думаю, что лучшим решением является непосредственно создать шаблон в контекстных и генерировать мнение так:

from django.http import HttpResponse 
    from django.template import Context 
    from django.template.loader import get_template 
    from subprocess import Popen, PIPE 
    import tempfile 
    from .models import Entry 

    def entry_as_pdf(request, pk): 
     entry = Entry.objects.get(pk=pk) 
     context = Context({ 
      'content': entry.content, 
       }) 
     template = get_template('my_latex_template.tex') 
     rendered_tpl = template.render(context).encode('utf-8') 
    # Python3 only. For python2 check out the docs! 
     with tempfile.TemporaryDirectory() as tempdir: 
     # Create subprocess, supress output with PIPE and 
     # run latex twice to generate the TOC properly. 
     # Finally read the generated pdf. 
      for i in range(2): 
       process = Popen(
       ['context', '-output-directory', tempdir], 
        stdin=PIPE, 
        stdout=PIPE, 
       ) 
       process.communicate(rendered_tpl) 
      with open(os.path.join(tempdir, 'texput.pdf'), 'rb') as f: 
       pdf = f.read() 
     r = HttpResponse(content_type='application/pdf') 
     # r['Content-Disposition'] = 'attachment; filename=texput.pdf' 
     r.write(pdf) 
     return r 

Обратите внимание, что имеется петля для запуска команды context дважды в случае, если у вас есть что-то вроде ссылок TOC или библиографии для включения в документ,

+0

похоже, что 'context' не запускается дважды, чтобы дать TOC, ссылки и т. Д. ... –