text: # fix response
  
  import os
  from gluon import current, HTTP
  from gluon.html import markmin_serializer, TAG, HTML, BODY, UL, XML, H1
  from gluon.contrib.fpdf import FPDF, HTMLMixin
  from gluon.sanitizer import sanitize
  from gluon.contrib.markmin.markmin2latex import markmin2latex
  from gluon.contrib.markmin.markmin2pdf import markmin2pdf
  
  
  def wrapper(f):
      def g(data):
          try:
              output = f(data)
              return XML(ouput)
          except (TypeError, ValueError) as e:
              raise HTTP(405, '%s serialization error' % e)
          except ImportError as e:
              raise HTTP(405, '%s not available' % e)
          except Exception as e:
              raise HTTP(405, '%s error' % e)
      return g
  
  
  def latex_from_html(html):
      markmin = TAG(html).element('body').flatten(markmin_serializer)
      return markmin2latex(markmin)
  
  
  def pdflatex_from_html(html):
      if os.system('which pdflatex > /dev/null') == 0:
          markmin = TAG(html).element('body').flatten(markmin_serializer)
          out, warnings, errors = markmin2pdf(markmin)
          if errors:
              current.response.headers['Content-Type'] = 'text/html'
              raise HTTP(405, HTML(BODY(H1('errors'),
                                        UL(*errors),
                                        H1('warnings'),
                                        UL(*warnings))).xml())
          else:
              return out
  
  
  def pyfpdf_from_html(html):
      request = current.request
  
      def image_map(path):
          if path.startswith('/%s/static/' % request.application):
              return os.path.join(request.folder, path.split('/', 2)[2])
          return 'http%s://%s%s' % (request.is_https and 's' or '', request.env.http_host, path)
  
      class MyFPDF(FPDF, HTMLMixin):
          pass
      pdf = MyFPDF()
      pdf.add_page()
      # pyfpdf needs some attributes to render the table correctly:
      html = sanitize(
          html, allowed_attributes={
              'a': ['href', 'title'],
              'img': ['src', 'alt'],
              'blockquote': ['type'],
              'td': ['align', 'bgcolor', 'colspan', 'height', 'width'],
              'tr': ['bgcolor', 'height', 'width'],
              'table': ['border', 'bgcolor', 'height', 'width'],
          }, escape=False)
      pdf.write_html(html, image_map=image_map)
      return XML(pdf.output(dest='S'))
  
  
  def pdf_from_html(html):
      # try use latex and pdflatex
      if os.system('which pdflatex > /dev/null') == 0:
          return pdflatex_from_html(html)
      else:
          return pyfpdf_from_html(html)
  