Source code for render.core

#!/usr/bin/python
# -*- coding: utf-8 -*-
# Copyright 2010 Santhosh Thottingal <santhosh.thottingal@gmail.com>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.

import os
import cairo
import hashlib
import pango
import pangocairo
import hyphenation
from wiki2pdf import Wikiparser
from styles import *


[docs]class Render: """ The render class. Instantiate to get access to the methods. """ def __init__(self): self.tmp_folder = "/static/tmp"
[docs] def wiki2pdf(self, url, path=None, font='Serif'): """ :param url: the url for the wiki page :type url: str. :param font: the font to be used for the pdf. :type font: str. :param path: output path.Defaults to current dir :returns: the path to the generated pdf. """ if path is None: path = os.path.abspath(os.path.curdir) m = hashlib.md5() m.update(url.encode("utf-8")) filename = m.hexdigest()[0:5]+".pdf" filename = os.path.join(path, filename) print(filename) parser = Wikiparser(url, filename, font) parser.parse() #else: # print ("File already exists.") return (os.path.join(self.tmp_folder, filename))
[docs] def render_text(self, text, file_type='png',path=None, filename=None, width=0, height=0, color="Black", font='Serif', font_size=12): """ :param text: the text to be rendered. :type text: str. :param file_type: required output format. accepts png, svg and pdf :type file_type: str. :param filename: filename for the output :type filename: str. :param path: the file path for the output. defaults to the current directory :type path: str. :param width: width of the output :type width: int. :param height: height of the output :type height: int. :param color: the background color for the rendering. :type color: str. :param font: the font to be used :type font: str. :param font_size: font size to be used. defaults to 12 :type font_size: int :returns: the path to the generated rendering. generates a rendering of the supplied text. """ surface = None print width width = int(width) height = int(height) font_size = int(font_size) text = text.decode("utf-8") m = hashlib.md5() m.update(text.encode("utf-8")) if filename is None: filename = m.hexdigest()[0:5]+"."+file_type if path is None: path = os.getcwd() outputfile = os.path.join(path, filename) if file_type == 'png': surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, int(width), int(height)) if file_type == 'svg': surface = cairo.SVGSurface(outputfile, int(width), int(height)) if file_type == 'pdf': surface = cairo.PDFSurface(outputfile, int(width), int(height)) context = cairo.Context(surface) try: text = hyphenation.getInstance().hyphenate(text, u'\u00AD') except: print("error while hyphenating. Proceeding without Hyphenation") width = int(width) left_margin = 10 top_margin = 20 bottom_margin = 50 position_x = left_margin position_y = top_margin rgba = get_color(color) context.set_source_rgba(float(rgba.red), float(rgba.green), float(rgba.blue), float(rgba.alpha)) pc = pangocairo.CairoContext(context) paragraph_layout = pc.create_layout() paragraph_font_description = pango.FontDescription() paragraph_font_description.set_family(font) paragraph_font_description.set_size((int)(int(font_size) * pango.SCALE)) paragraph_layout.set_font_description(paragraph_font_description) if width > 0: paragraph_layout.set_width((int)((width-2*left_margin) * pango.SCALE)) paragraph_layout.set_justify(True) paragraph_layout.set_text(text+"\n") context.move_to(position_x, position_y) pango_layout_iter = paragraph_layout.get_iter() line_width = 0 while not pango_layout_iter.at_last_line(): first_line = True context.move_to(position_x, position_y) while not pango_layout_iter.at_last_line(): ink_rect, logical_rect = pango_layout_iter.get_line_extents() line = pango_layout_iter.get_line_readonly() has_next_line = pango_layout_iter.next_line() # Decrease paragraph spacing if ink_rect[2] == 0: # It is para break dy = font_size / 2 position_y += dy if not first_line: self.context.rel_move_to(0, dy) else: xstart = 1.0 * logical_rect[0] / pango.SCALE context.rel_move_to(xstart, 0) if width > 0 and height > 0: pc.show_layout_line(line) line_height = (int)(logical_rect[3] / pango.SCALE) line_width = (int)(logical_rect[2] / pango.SCALE) context.rel_move_to(-xstart, line_height) position_y += line_height first_line = False if width == 0 or height == 0: if width == 0: width = line_width if height == 0: height = position_y return self.render_text(text, file_type, path,filename, width + 2.5*left_margin, height, color, font, font_size) if file_type == 'png': surface.write_to_png(str(outputfile)) else: context.show_page() return outputfile
[docs] def get_module_name(self): """ returns the module name """ return "Script Renderer"
[docs] def get_info(self): """ returns info on the module """ return "Provides rendered images for Complex scripts"
def getInstance(): return Render()

Related Topics