Progetto:Bot/Programmi in Python per i bot/templateHandler.py
Da Wikisource.
#!/usr/bin/env python # -*- coding: utf-8 -*- # template.py, a simple library to handle wiki templates. # Copyright (C) 2007 Roberto Zanon (http://it.wikisource.org/wiki/Utente:Qualc1) # # This program is free software: you can redistribute it and/or modify it under # the terms of the GNU 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 General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see <http://www.gnu.org/licenses/>. import re class Template(list): """It rapresents a wiki template. A template is identified by a name (a string set by constructor), a list (can be empty) of: positional parameter (a string) and named parameter (a 2-tuple of strings) Parameters can be added/removed/accessed as element of list object. """ def __init__(self, name=None, fromText=None): """Instanziate a template identified by "name", or instanziate a template importing it from text "fromText". """ list.__init__(self) if name is not None and fromText is not None: raise ValueError('Do not set both "name" and "fromText"') if name is not None: self.name = name if fromText is not None: self.fromText(fromText) def fromText(self, text): """Import template information from text.""" if text.startswith("{{"): text = text[len("{{"):] if text.endswith("}}"): text = text[:-len("}}")] # TODO Doesn't work if template has a link [[xx|yy]] templElements = [x.strip() for x in text.split("|")] if len(templElements) < 1: raise ValueError("Is a template empty?") self.name = templElements[0] for element in templElements[1:]: self._importParameter(element) def _importParameter(self, parameter): """Imports a temlate parameter, ie. a string like "name=Linus" (named par.) or "Linus" (positional par.). """ divisorPos = parameter.find("=") if divisorPos == -1: # positional self.append(parameter) else: # named self.append( (parameter[:divisorPos], parameter[divisorPos+1:]) ) def toText(self): """Return a string rapresenting template as text of a wiki page.""" insertedParams = 0 strTempl = u"{{" + self.name + "\n" posParameters = [par for par in self if isinstance(par, basestring)] for par in posParameters: strTempl += ( "|" + par ) insertedParams += 1 namParameters = [par for par in self if isinstance(par, tuple) and len(par)==2] for par in namParameters: strTempl += ( u"|" + par[0] + "=" + par[1] + "\n") insertedParams += 1 strTempl += "}}" if insertedParams != len(self): raise UnexpectedElementWarning() else: return strTempl def removeByParamName(self, paramsName): """Remove a named parameters with names in list "paramName". """ nameParameters = [par for par in self if isinstance(par, tuple) and len(par)==2] for param in nameParameters: if param[0] in paramsName: self.remove(param) def templatesFromPage(pageText): """Returns a list of Template instance, rapresenting the templates found in "pageText." """ compiledRegEx = re.compile(r'''\{\{.*?\}\}''', re.DOTALL) templatesList = [] for templateText in compiledRegEx.finditer(pageText): #print pageText[templateText.start, templateText.end] newTempalte = Template(fromText = templateText.group()) templatesList.append(newTempalte) return templatesList class UnexpectedElementWarning(Exception): """It's raised if is found an element in Template that isn't a valid parameter. (a valid parameter is an object of string or 2-tuple type) """ pass if __name__ == "__main__": # testing temp = Template(name="PAG_TEMPL") temp.append(("parN", "parV")) temp.append( "parccV") print temp.toText() print "------ test importazione -------" un_template = \ """{{Autore |nome=UNNOME |cognome=UNCOGNOME |test }}""" temp2 = Template(fromText = un_template) print temp2.toText() print "------ test importazione PAGINA -------" un_testo = \ """asdf sf fg r g {{Autore |nome=UNNOME |cognome=UNCOGNOME |test }} afgrg {{Testo|bo|pippo}}""" for templ in templatesFromPage(un_testo): print "START" print "Nome template: ", templ.name print "Param 1: ", templ[0] print "END"
[visualizza] [modifica] Documentazione
Questa documentazione è transclusa da Progetto:Bot/Programmi in Python per i bot/templateHandler.py/doc. (modifica | cronologia)
Descrizione
xxx
Nome del file
templateHandler.py
Comando
Il programma viene richiamato da altri programmi, quindi non va lanciato da solo