Author: jmorliaguet Date: Tue May 9 09:52:32 2006 New Revision: 3080 Added: cpsskins/branches/paris-sprint-2006/doc/utils.txt (contents, props changed) cpsskins/branches/paris-sprint-2006/tests/test_utils.py (contents, props changed) Modified: cpsskins/branches/paris-sprint-2006/standard/filters/style/__init__.py cpsskins/branches/paris-sprint-2006/utils.py
Log: - moved insertCSSClass to cpsskins.utils Added: cpsskins/branches/paris-sprint-2006/doc/utils.txt ============================================================================== --- (empty file) +++ cpsskins/branches/paris-sprint-2006/doc/utils.txt Tue May 9 09:52:32 2006 @@ -0,0 +1,43 @@ + +$Id$ + +============== +MISC UTILITIES +============== + + >>> from cpsskins.utils import insertCSSClass, camelize + +insertCSSClass +-------------- + +cpsskins.utils.insertCSSClass inserts a CSS class in the first tag of an +HTML string. + + >>> print insertCSSClass(u'<div></div>', u'someClass') + <div class="someClass"></div> + + >>> print insertCSSClass(u'<div><span></span></div>', u'someClass') + <div class="someClass"><span></span></div> + + >>> print insertCSSClass(u'<div>abc</div>', u'someClass') + <div class="someClass">abc</div> + + >>> print insertCSSClass(u'<div class="first"></div>', u'someClass') + <div class="first someClass"></div> + +edge cases: + + >>> print insertCSSClass(u'<div>\n</div>', u'someClass') + <div class="someClass"></div> + + >>> print insertCSSClass(u'<div\n class="first">\n</div>', u'someClass') + <div class="first someClass"></div> + + >>> print insertCSSClass(u'', u'someClass') + <BLANKLINE> + + >>> print insertCSSClass(u'123', u'someClass') + 123 + + >>> print insertCSSClass(u'<div', u'someClass') + <div Modified: cpsskins/branches/paris-sprint-2006/standard/filters/style/__init__.py ============================================================================== --- cpsskins/branches/paris-sprint-2006/standard/filters/style/__init__.py (original) +++ cpsskins/branches/paris-sprint-2006/standard/filters/style/__init__.py Tue May 9 09:52:32 2006 @@ -17,21 +17,15 @@ """ __docformat__ = "reStructuredText" -import re - from zope.interface import implements, Interface from zope.component import adapts, getUtility +from cpsskins import utils from cpsskins.standard.formats.style import IStyle from cpsskins.browser.rendering.interfaces import IFilterView from cpsskins.relations.interfaces import IRelatable from cpsskins.setup.interfaces import IResourceManager, IIdentifiable - -startTag = re.compile('<.*?>') -classAttr = re.compile(' class="(.*?)"') -lineBreaks = re.compile('(\n|\r)') - class ICSSRenderer(Interface): """Renders a style in CSS""" @@ -85,22 +79,7 @@ def __call__(self, markup, info): """Apply the style to the markup. """ - markup = lineBreaks.sub('', markup) - s = startTag.search(markup) - if s is None: - return markup - res = s.group() - in_brackets = res[1:-1] - c = classAttr.search(in_brackets) - if c is not None: - class_attrs = [c.group(1)] - start, end = c.span() - in_brackets = in_brackets[:start] + in_brackets[end:] - else: - class_attrs = [] - class_attrs.append(str(ICSSRenderer(self.context))) - final = '<%s class="%s">' % (in_brackets, ' '.join(class_attrs)) - return startTag.sub(final, markup, count=1) + return utils.insertCSSClass(markup, str(ICSSRenderer(self.context))) class CSSRenderer(object): """Render a style in CSS Added: cpsskins/branches/paris-sprint-2006/tests/test_utils.py ============================================================================== --- (empty file) +++ cpsskins/branches/paris-sprint-2006/tests/test_utils.py Tue May 9 09:52:32 2006 @@ -0,0 +1,30 @@ +############################################################################## +# +# Copyright (c) 2005-2006 Nuxeo and Contributors. +# All Rights Reserved. +# +# This software is subject to the provisions of the Zope Public License, +# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution. +# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED +# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS +# FOR A PARTICULAR PURPOSE. +# +############################################################################## +"""DOM tests + +$Id$ +""" +__docformat__ = "reStructuredText" + +import unittest + +from zope.testing.doctestunit import DocFileSuite + +def test_suite(): + return unittest.TestSuite(( + DocFileSuite('../doc/utils.txt'), + )) + +if __name__ == '__main__': + unittest.main(defaultTest='test_suite') Modified: cpsskins/branches/paris-sprint-2006/utils.py ============================================================================== --- cpsskins/branches/paris-sprint-2006/utils.py (original) +++ cpsskins/branches/paris-sprint-2006/utils.py Tue May 9 09:52:32 2006 @@ -17,11 +17,17 @@ """ __docformat__ = "reStructuredText" +import re + from zope.component import getSiteManager, getGlobalSiteManager from zope.app.zapi import getParent from cpsskins.thememanager import IThemeManagementFolder +startTag = re.compile('<.*?>') +classAttr = re.compile(' class="(.*?)"') +lineBreaks = re.compile('(\n|\r)') + def getThemeManager(context=None, name=u''): # global utility if context is None: @@ -92,3 +98,27 @@ set_width(page[u'main'][u'right'], u'20%') return theme + +def camelize(text): + # TODO + return text + +def insertCSSClass(markup, css_class): + """Insert a CSS class in the first tag of some HTML markup. + """ + markup = lineBreaks.sub(u'', markup) + s = startTag.search(markup) + if s is None: + return markup + res = s.group() + in_brackets = res[1:-1] + c = classAttr.search(in_brackets) + if c is not None: + class_attrs = [c.group(1)] + start, end = c.span() + in_brackets = in_brackets[:start] + in_brackets[end:] + else: + class_attrs = [] + class_attrs.append(css_class) + final = u'<%s class="%s">' % (in_brackets, u' '.join(class_attrs)) + return startTag.sub(final, markup, count=1) -- http://lists.nuxeo.com/mailman/listinfo/z3lab-checkins