changeset 231:649f74b167e6

extract getPlaintext to SrvTxtUtils. add character count to project description editor.
author casties
date Wed, 13 Nov 2013 17:52:55 +0100
parents feb2cb6241be
children 76ea03db3426
files MPIWGProjects.py SrvTxtUtils.py zpt/project/edit_description.zpt
diffstat 3 files changed, 124 insertions(+), 64 deletions(-) [+]
line wrap: on
line diff
--- 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("<div>%s</div>"%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
             
--- 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("<div>%s</div>"%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()
--- 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 @@
       <span class="kupu-tb-buttongroup">
         <button type="button" id="kupu-save-button" title="save: alt-s" accesskey="s">Publish</button>
       </span>
+      <span>(currently published: <span tal:replace="python:len(here.getDescription(filter='plaintext', length=0))"/> characters)</span>
     </div>
     <metal:macros use-macro="here/kupuEditor/kupumacros/macros/xmlconfig">
       <metal:macros fill-slot="dst">saveEditedContent</metal:macros>