# HG changeset patch # User casties # Date 1384361575 -3600 # Node ID 649f74b167e6c85ba4ab9fefa902b4ede7538160 # Parent feb2cb6241be40c7257ee7a3db171b9957252d8b extract getPlaintext to SrvTxtUtils. add character count to project description editor. diff -r feb2cb6241be -r 649f74b167e6 MPIWGProjects.py --- a/MPIWGProjects.py Tue Nov 12 13:04:38 2013 +0100 +++ b/MPIWGProjects.py Wed Nov 13 17:52:55 2013 +0100 @@ -22,7 +22,7 @@ import xml.etree.ElementTree as ET -from SrvTxtUtils import getInt, unicodify, utf8ify, serialize, refreshingImageFileIndexHtml, shortenString +from SrvTxtUtils import getInt, unicodify, utf8ify, serialize, refreshingImageFileIndexHtml, shortenString, getPlaintext from Products.ZDBInterface.ZDBInterfaceFolder import ZDBInterfaceFolder import xmlhelper # Methoden zur Verwaltung der projekt xml @@ -617,34 +617,7 @@ if filter == 'plaintext': # filter out any tags, keep only text - try: - xmltext = utf8ify("
%s
"%text) - dom = ET.fromstring(xmltext) - plaintext = "" - for elem in dom.iter(): - if elem.tag == 'style': - # ignore tag - continue - - if elem.text: - plaintext += elem.text - if elem.tail: - plaintext += elem.tail - - if length > 0 and len(plaintext) > length: - break - - text = plaintext - except Exception, e: - logging.warn("getDesciption: error parsing description! Returning everything. %s"%e) - - if length > 0 and len(text) > length: - # try to not break words - if text[length] not in [' ', '.', '?', '!']: - # search the last blank - length = text.rfind(' ', 0, length) - - return text[:length] + '...' + text = getPlaintext(text, length=length, wordwrap=True, ignoretags=['style']) return text diff -r feb2cb6241be -r 649f74b167e6 SrvTxtUtils.py --- a/SrvTxtUtils.py Tue Nov 12 13:04:38 2013 +0100 +++ b/SrvTxtUtils.py Wed Nov 13 17:52:55 2013 +0100 @@ -21,34 +21,54 @@ import xml.etree.ElementTree as ET -srvTxtUtilsVersion = "1.12.0" +srvTxtUtilsVersion = "1.12.3" map_months = {'en': [u"", - u"January", - u"February", - u"March", - u"April", - u"May", - u"June", - u"July", - u"August", - u"September", - u"October", - u"November", - u"December"], + u"January", + u"February", + u"March", + u"April", + u"May", + u"June", + u"July", + u"August", + u"September", + u"October", + u"November", + u"December"], 'de': [u"", - u"Januar", - u"Februar", - u"M\u00e4rz", - u"April", - u"Mai", - u"Juni", - u"Juli", - u"August", - u"September", - u"Oktober", - u"November", - u"Dezember"]} + u"Januar", + u"Februar", + u"M\u00e4rz", + u"April", + u"Mai", + u"Juni", + u"Juli", + u"August", + u"September", + u"Oktober", + u"November", + u"Dezember"]} + +map_weekdays_short = {'en': [ + u"Mo", + u"Tu", + u"We", + u"Th", + u"Fr", + u"Sa", + u"Su", + ], + 'de': [ + u"Mo", + u"Di", + u"Mi", + u"Do", + u"Fr", + u"Sa", + u"So", + ]} + def getInt(number, default=0): """returns always an int (0 in case of problems)""" @@ -86,8 +106,14 @@ else: return s.encode('utf-8') -def getText(node, recursive=0): - """returns all text content of a (etree) node and its subnodes""" + +def getTextFromNode(node, recursive=False, length=0): + """Return all text content of a (etree) node. + + :param recursive: descend subnodes + + :returns: text string + """ if node is None: return '' @@ -110,6 +136,55 @@ return text +getText = getTextFromNode + +def getPlaintext(text, length=0, wordwrap=False, ignoretags=[]): + """Return plain text content by filtering out XML tags. + + :param text: string or etree node + :param length: length of text to return (0=all) + :param wordwrap: try not to break the last word (may return shorter string) + :returns: text string + """ + if text is None: + return '' + + try: + if isinstance(text, basestring): + xmltext = utf8ify("
%s
"%text) + dom = ET.fromstring(xmltext) + else: + dom = text + + plaintext = '' + for elem in dom.iter(): + if elem.tag in ignoretags: + # ignore tag + continue + + if elem.text: + plaintext += elem.text + if elem.tail: + plaintext += elem.tail + + if length > 0 and len(plaintext) > length: + break + + text = plaintext + + except Exception, e: + logging.warn("getPlaintext: error parsing text! Returning everything. %s"%e) + + if length > 0 and len(text) > length: + # try to not break words + if wordwrap and text[length] not in [' ', '.', '?', '!']: + # search the last blank + length = text.rfind(' ', 0, length) + + return text[:length] + '...' + + return text + def serialize(node): """returns a string containing an XML snippet of (etree) node""" @@ -124,10 +199,15 @@ def getMonthName(mon, lang): """returns the name of the month mon in the language lang""" - return map_months[lang][mon] + return map_months[lang.lower()][mon] -def getDateString(date=None, lang='en', withYear=True, monthNames=True, abbrev=False): +def getWeekdayName(day, lang, short=True): + """returns the name of the weekday day in the language lang""" + return map_weekdays_short[lang.lower()][day] + + +def getDateString(date=None, lang='en', short=False, withYear=True, monthNames=True, abbrev=False): """Return formatted date string.""" if date is None: return None @@ -145,14 +225,20 @@ year = date.year if lang.lower() == 'en': - ds = "%s %s"%(getMonthName(month, lang), day) - if withYear: - ds += ", %s"%year + if short: + ds = "%s/%s/%s"%(year,month,day) + else: + ds = "%s %s"%(getMonthName(month, lang), day) + if withYear: + ds += ", %s"%year elif lang.lower() == 'de': - ds = "%s. %s"%(day, getMonthName(month, lang)) - if withYear: - ds += " %s"%year + if short: + ds = "%s.%s.%s"%(day,month,year) + else: + ds = "%s. %s"%(day, getMonthName(month, lang)) + if withYear: + ds += " %s"%year elif lang.lower() == 'iso': ds = date.isoformat() diff -r feb2cb6241be -r 649f74b167e6 zpt/project/edit_description.zpt --- a/zpt/project/edit_description.zpt Tue Nov 12 13:04:38 2013 +0100 +++ b/zpt/project/edit_description.zpt Wed Nov 13 17:52:55 2013 +0100 @@ -23,6 +23,7 @@ + (currently published: characters) saveEditedContent