Mercurial > genshi > mirror
changeset 230:84168828b074 trunk
Renamed Markup to Genshi in repository.
line wrap: on
line diff
--- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,5 @@ Version 0.3 -http://svn.edgewall.org/repos/markup/tags/0.3.0/ +http://svn.edgewall.org/repos/genshi/tags/0.3.0/ (?, from branches/stable/0.3.x) * Expression evaluation now differentiates between undefined variables and @@ -37,7 +37,7 @@ Version 0.2 -http://svn.edgewall.org/repos/markup/tags/0.2.0/ +http://svn.edgewall.org/repos/genshi/tags/0.2.0/ (Aug 22 2006, from branches/stable/0.2.x) * XPath syntax errors now contain position info (ticket #20). @@ -76,7 +76,7 @@ Version 0.1 -http://svn.edgewall.org/repos/markup/tags/0.1.0/ +http://svn.edgewall.org/repos/genshi/tags/0.1.0/ (Aug 3 2006, from branches/stable/0.1.x) * First public release
--- a/INSTALL.txt +++ b/INSTALL.txt @@ -1,4 +1,4 @@ -Installing Markup +Installing Genshi ================= Prerequisites @@ -11,13 +11,13 @@ Installation ------------ -Once you've downloaded and unpacked a Markup source release, enter the +Once you've downloaded and unpacked a Genshi source release, enter the directory where the archive was unpacked, and run: $ python setup.py install Note that you may need administrator/root privileges for this step, as -this command will by default attempt to install Markup to the Python +this command will by default attempt to install Genshi to the Python site-packages directory on your system. For advanced options, please refer to the easy_install and/or the distutils @@ -30,8 +30,8 @@ Support ------- -If you encounter any problems with Markup, please don't hesitate to ask -questions on the Markup mailing list or IRC channel: +If you encounter any problems with Genshi, please don't hesitate to ask +questions on the Genshi mailing list or IRC channel: - http://markup.edgewall.org/wiki/MailingList - http://markup.edgewall.org/wiki/IrcChannel + http://genshi.edgewall.org/wiki/MailingList + http://genshi.edgewall.org/wiki/IrcChannel
--- a/README.txt +++ b/README.txt @@ -1,11 +1,11 @@ -About Markup +About Genshi ============ -Markup is a Python library that provides an integrated set of components -for parsing, generating, and processing HTML or XML content in a uniform -manner. The major feature is a template language that is heavily inspired -by Kid. +Genshi is a Python library that provides an integrated set of components +for parsing, generating, and processing HTML, XML or other textual +content for output generation on the web. The major feature is a +template language, which is heavily inspired by Kid. -For more information please visit the Markup web site: +For more information please visit the Genshi web site: - <http://markup.edgewall.org/> + <http://genshi.edgewall.org/>
--- a/doc/builder.txt +++ b/doc/builder.txt @@ -4,7 +4,7 @@ Generating Markup Programmatically ================================== -Markup provides a ``builder`` module which lets you generate markup from Python +Genshi provides a ``builder`` module which lets you generate markup from Python code using a very simple syntax. The main entry point to the ``builder`` module is the ``tag`` object (which is actually an instance of the ``ElementFactory`` class). You should rarely (if ever) need to directly import and use any of the @@ -22,7 +22,7 @@ Elements can be created through the `tag` object using attribute access, for example:: - >>> from markup.builder import tag + >>> from genshi.builder import tag >>> doc = tag.p('Some text and ', tag.a('a link', href='http://example.org/'), '.') >>> doc <Element "p"> @@ -52,7 +52,7 @@ >>> stream = doc.generate() >>> stream - <markup.core.Stream object at 0x72d230> + <genshi.core.Stream object at 0x72d230> >>> print stream <p class="intro">Some text and <a href="http://example.org/">a link</a>.<br/></p>
--- a/doc/index.txt +++ b/doc/index.txt @@ -1,23 +1,24 @@ .. -*- mode: rst; encoding: utf-8 -*- ====== -Markup +Genshi ====== ---------------------------------------------------------- -Toolkit for stream-based generation of markup for the web ---------------------------------------------------------- +----------------------------------------------------------- +A toolkit for stream-based generation of output for the web +----------------------------------------------------------- -Markup is a Python library that provides an integrated set of components for -parsing, generating, and processing HTML or XML content in a uniform manner. -The major feature is a template language that is heavily inspired by Kid. +Genshi is a Python library that provides an integrated set of components +for parsing, generating, and processing HTML, XML or other textual content +for output generation on the web. The major feature is a template language, +which is heavily inspired by Kid. * `Markup Streams`_ * `Generating Markup Programmatically`_ -* `Markup XML Template Language`_ -* `Using XPath in Markup`_ +* `Genshi XML Template Language`_ +* `Using XPath in Genshi`_ .. _`Markup Streams`: streams.html .. _`Generating Markup Programmatically`: builder.html -.. _`Markup XML Template Language`: xml-templates.html -.. _`Using XPath in Markup`: xpath.html +.. _`Genshi XML Template Language`: xml-templates.html +.. _`Using XPath in Genshi`: xpath.html
index dcbd1d5e9c45187d866f3cf02fdeb94c5b5ebcef..05edacd14f1ae6f2cdf29559104655b815fba1bd GIT binary patch literal 5268 zc$^iKd00$~AI8sqru{UfO*GS{L`}I#3r@vt5;d)oWQtbF8PTFHM@^{|6QLxgn&_fT z3l+r_5rs)Al1$dP7gM<5a{Kvx|9{`-eV)(f`FeT(zQj3l9PkHT1OLCVv9XMd3>O!d zix)2%8XA_HxGAUqxe~Lh5Mal|#FUklbsj$4*VlK>BkZqte+2{te3_YHFc^y#EgEjT zbSWVtEG(>aj&osQ;kE4Ieu<=hef+cTzH0l`Zxt_-lap&|YP!3-*=+WzRjaOM77_$8 zQ1R!)qtT(Eq49yC8b?3nvlks59S`d2>sN33I`z3?zWYD#-rvbTRv#536bkF=>W15| zdw6(QTU*PIN}gQrIZW8KCkubAy2Ka!nkPGWu=e-hxAzC-ryE{99XsyeGWGJ!$oWe% zGc$c<W%U7Zue$GEj8A&n-0|__$BDtgu`Aavg$srxb<-b|<)-AV?8Dbn3#y%0A5yXY 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
index c206a90bed5034ddb1e23820377548d525cce187..f836e7144ec22c73b80c41d7a346dae4d66307e9 GIT binary patch literal 8990 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
index e5bd44e66edfaabfd27366e681bc510c3db7d894..7b290a6dac09aa4be51289e983fc33240d45f812 GIT binary patch literal 5170 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
--- a/doc/streams.txt +++ b/doc/streams.txt @@ -25,12 +25,12 @@ For example, the functions ``XML()`` and ``HTML()`` can be used to convert literal XML or HTML text to a markup stream:: - >>> from markup import XML + >>> from genshi import XML >>> stream = XML('<p class="intro">Some text and ' ... '<a href="http://example.org/">a link</a>.' ... '<br/></p>') >>> stream - <markup.core.Stream object at 0x6bef0> + <genshi.core.Stream object at 0x6bef0> The stream is the result of parsing the text into events. Each event is a tuple of the form ``(kind, data, pos)``, where: @@ -62,7 +62,7 @@ ========= One important feature of markup streams is that you can apply *filters* to the -stream, either filters that come with Markup, or your own custom filters. +stream, either filters that come with Genshi, or your own custom filters. A filter is simply a callable that accepts the stream as parameter, and returns the filtered stream:: @@ -87,8 +87,8 @@ stream = stream | noop -One example of a filter included with Markup is the ``HTMLSanitizer`` in -``markup.filters``. It processes a stream of HTML markup, and strips out any +One example of a filter included with Genshi is the ``HTMLSanitizer`` in +``genshi.filters``. It processes a stream of HTML markup, and strips out any potentially dangerous constructs, such as Javascript event handlers. ``HTMLSanitizer`` is not a function, but rather a class that implements ``__call__``, which means instances of the class are callable. @@ -96,7 +96,7 @@ Both the ``filter()`` method and the pipe operator allow easy chaining of filters:: - from markup.filters import HTMLSanitizer + from genshi.filters import HTMLSanitizer stream = stream.filter(noop, HTMLSanitizer()) That is equivalent to:: @@ -109,8 +109,9 @@ The ``Stream`` class provides two methods for serializing this list of events: ``serialize()`` and ``render()``. The former is a generator that yields chunks -of ``Markup`` objects (which are basically unicode strings). The latter returns -a single string, by default UTF-8 encoded. +of ``Markup`` objects (which are basically unicode strings that are considered +safe for output on the web). The latter returns a single string, by default +UTF-8 encoded. Here's the output from ``serialize()``:: @@ -144,11 +145,11 @@ In addition, the ``render()`` method takes an ``encoding`` parameter, which defaults to “UTF-8”. If set to ``None``, the result will be a unicode string. -The different serializer classes in ``markup.output`` can also be used +The different serializer classes in ``genshi.output`` can also be used directly:: - >>> from markup.filters import HTMLSanitizer - >>> from markup.output import TextSerializer + >>> from genshi.filters import HTMLSanitizer + >>> from genshi.output import TextSerializer >>> print TextSerializer()(HTMLSanitizer()(stream)) Some text and a link. @@ -165,7 +166,7 @@ >>> substream = stream.select('a') >>> substream - <markup.core.Stream object at 0x7118b0> + <genshi.core.Stream object at 0x7118b0> >>> print substream <a href="http://example.org/">a link</a> @@ -174,10 +175,10 @@ and cannot be rendered again. To work around this, you can wrap such a stream in a ``list``:: - >>> from markup import Stream + >>> from genshi import Stream >>> substream = Stream(list(stream.select('a'))) >>> substream - <markup.core.Stream object at 0x7118b0> + <genshi.core.Stream object at 0x7118b0> >>> print substream <a href="http://example.org/">a link</a> >>> print substream.select('@href')
--- a/doc/xml-templates.txt +++ b/doc/xml-templates.txt @@ -1,10 +1,10 @@ .. -*- mode: rst; encoding: utf-8 -*- ============================ -Markup XML Template Language +Genshi XML Template Language ============================ -Markup provides a simple XML-based template language that is heavily inspired +Genshi provides a simple XML-based template language that is heavily inspired by Kid_, which in turn was inspired by a number of existing template languages, namely XSLT_, TAL_, and PHP_. @@ -15,7 +15,7 @@ .. _php: http://www.php.net/ This document describes the template language and will be most useful as -reference to those developing Markup templates. Templates are XML files of some +reference to those developing Genshi templates. Templates are XML files of some kind (such as XHTML) that include processing directives_ (elements or attributes identified by a separate namespace) that affect how the template is rendered, and template expressions_ that are dynamically substituted by @@ -30,7 +30,7 @@ Python API ---------- -The Python code required for templating with Markup is generally based on the +The Python code required for templating with Genshi is generally based on the following pattern: * Attain a ``Template`` object from a string or file object containing the @@ -42,7 +42,7 @@ For example:: - from markup.template import Template + from genshi.template import Template tmpl = Template('<h1>$title</h1>') stream = tmpl.generate(title='Hello, world!') @@ -55,7 +55,7 @@ However, if you want includes_ to work, you should attain the template instance through a ``TemplateLoader``, and load the template from a file:: - from markup.template import TemplateLoader + from genshi.template import TemplateLoader loader = TemplateLoader([templates_dir]) tmpl = loader.load('test.html') @@ -78,7 +78,7 @@ the curly braces may be omitted. In all other cases, the braces are required so that the template processors knows where the expression ends:: - >>> from markup.template import Context, Template + >>> from genshi.template import Context, Template >>> tmpl = Template('<em>${items[0].capitalize()} item</em>') >>> print tmpl.generate(Context(items=['first', 'second'])) <em>First item</em> @@ -88,7 +88,7 @@ attributes), and vice-versa (i.e. access attributes as if they were items in a dictionary):: - >>> from markup.template import Context, Template + >>> from genshi.template import Context, Template >>> tmpl = Template('<em>${dict.foo}</em>') >>> print tmpl.generate(Context(dict={'foo': 'bar'})) <em>bar</em> @@ -101,28 +101,28 @@ ------------------- Directives are elements and/or attributes in the template that are identified -by the namespace ``http://markup.edgewall.org/``. They can affect how the -template is rendered in a number of ways: Markup provides directives for +by the namespace ``http://genshi.edgewall.org/``. They can affect how the +template is rendered in a number of ways: Genshi provides directives for conditionals and looping, among others. To use directives in a template, the namespace should be declared, which is usually done on the root element:: <html xmlns="http://www.w3.org/1999/xhtml" - xmlns:py="http://markup.edgewall.org/" + xmlns:py="http://genshi.edgewall.org/" lang="en"> ... </html> In this example, the default namespace is set to the XHTML namespace, and the -namespace for Markup directives is bound to the prefix “py”. +namespace for Genshi directives is bound to the prefix “py”. All directives can be applied as attributes, and some can also be used as elements. The ``if`` directives for conditionals, for example, can be used in both ways:: <html xmlns="http://www.w3.org/1999/xhtml" - xmlns:py="http://markup.edgewall.org/" + xmlns:py="http://genshi.edgewall.org/" lang="en"> ... <div py:if="foo"> @@ -134,7 +134,7 @@ This is basically equivalent to the following:: <html xmlns="http://www.w3.org/1999/xhtml" - xmlns:py="http://markup.edgewall.org/" + xmlns:py="http://genshi.edgewall.org/" lang="en"> ... <py:if test="foo"> @@ -385,7 +385,7 @@ Inside the body of a ``py:match`` directive, the ``select(path)`` function is made available so that parts or all of the original element can be incorporated -in the output of the match template. See [wiki:MarkupStream#UsingXPath] for +in the output of the match template. See [wiki:GenshiStream#UsingXPath] for more information about this function. This directive can also be used as an element:: @@ -474,7 +474,7 @@ Note that if a variable of the same name already existed outside of the scope of the ``py:with`` directive, it will **not** be overwritten. Instead, it will have the same value it had prior to the ``py:with`` assignment. -Effectively, this means that variables are immutable in Markup. +Effectively, this means that variables are immutable in Genshi. .. _order: @@ -516,7 +516,7 @@ file to be pulled in:: <html xmlns="http://www.w3.org/1999/xhtml" - xmlns:py="http://markup.edgewall.org/" + xmlns:py="http://genshi.edgewall.org/" xmlns:xi="http://www.w3.org/2001/XInclude"> <xi:include href="base.html" /> ... @@ -540,10 +540,10 @@ <xi:include href="base.html"><xi:fallback /></xi:include> -See the XInclude_ for more about fallback content. Note though that Markup +See the XInclude_ for more about fallback content. Note though that Genshi currently only supports a small subset of XInclude. -Incudes in Markup are fully dynamic: Just like normal attributes, the `href` +Incudes in Genshi are fully dynamic: Just like normal attributes, the `href` attribute accepts expressions_, and directives_ can be used on the ``<xi:include />`` element just as on any other element, meaning you can do things like conditional includes::
--- a/doc/xpath.txt +++ b/doc/xpath.txt @@ -1,10 +1,10 @@ .. -*- mode: rst; encoding: utf-8 -*- ===================== -Using XPath in Markup +Using XPath in Genshi ===================== -Markup provides basic XPath_ support for matching and querying event streams. +Genshi provides basic XPath_ support for matching and querying event streams. .. _xpath: http://www.w3.org/TR/xpath @@ -18,7 +18,7 @@ Limitations ----------- -Due to the streaming nature of the processing model, Markup uses only a subset +Due to the streaming nature of the processing model, Genshi uses only a subset of the `XPath 1.0`_ language. .. _`XPath 1.0`: http://www.w3.org/TR/xpath @@ -31,7 +31,7 @@ * ``descendant-or-self`` * ``self`` -This means you can't use the ``parent``, ancestor, or sibling axes in Markup +This means you can't use the ``parent``, ancestor, or sibling axes in Genshi (the ``namespace`` axis isn't supported either, but what you'd ever need that for I don't know). Basically, any path expression that would require buffering of the stream is not supported. @@ -64,7 +64,7 @@ :: - from markup.input import XML + from genshi.input import XML doc = XML('''<doc> <items count="2">
--- a/examples/basic/layout.html +++ b/examples/basic/layout.html @@ -1,4 +1,4 @@ -<div xmlns:py="http://markup.edgewall.org/" py:strip=""> +<div xmlns:py="http://genshi.edgewall.org/" py:strip=""> <head> <title>Hello ${hello}</title> <style type="text/css">@import(style.css)</style>
--- a/examples/basic/run.py +++ b/examples/basic/run.py @@ -5,7 +5,7 @@ import sys import time -from markup.template import TemplateLoader +from genshi.template import TemplateLoader def test(): base_path = os.path.dirname(os.path.abspath(__file__))
--- a/examples/basic/test.html +++ b/examples/basic/test.html @@ -2,7 +2,7 @@ PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" - xmlns:py="http://markup.edgewall.org/" + xmlns:py="http://genshi.edgewall.org/" xmlns:xi="http://www.w3.org/2001/XInclude" lang="en"> <xi:include href="layout.html" />
--- a/examples/bench/basic.py +++ b/examples/bench/basic.py @@ -4,10 +4,10 @@ import sys import timeit -__all__ = ['clearsilver', 'django', 'kid', 'markup', 'simpletal'] +__all__ = ['clearsilver', 'django', 'kid', 'genshi', 'simpletal'] -def markup(dirname, verbose=False): - from markup.template import TemplateLoader +def genshi(dirname, verbose=False): + from genshi.template import TemplateLoader loader = TemplateLoader([dirname], auto_reload=False) template = loader.load('template.html') def render():
--- a/examples/bench/bigtable.py +++ b/examples/bench/bigtable.py @@ -11,8 +11,8 @@ import cElementTree as cet from elementtree import ElementTree as et -from markup.builder import tag -from markup.template import Template +from genshi.builder import tag +from genshi.template import Template import neo_cgi import neo_cs import neo_util @@ -38,16 +38,16 @@ table = [dict(a=1,b=2,c=3,d=4,e=5,f=6,g=7,h=8,i=9,j=10) for x in range(1000)] -markup_tmpl = Template(""" -<table xmlns:py="http://markup.edgewall.org/"> +genshi_tmpl = Template(""" +<table xmlns:py="http://genshi.edgewall.org/"> <tr py:for="row in table"> <td py:for="c in row.values()" py:content="c"/> </tr> </table> """) -markup_tmpl2 = Template(""" -<table xmlns:py="http://markup.edgewall.org/">$table</table> +genshi_tmpl2 = Template(""" +<table xmlns:py="http://genshi.edgewall.org/">$table</table> """) if DjangoTemplate: @@ -64,22 +64,22 @@ context = DjangoContext({'table': table}) django_tmpl.render(context) -def test_markup(): - """Markup template""" - stream = markup_tmpl.generate(table=table) +def test_genshi(): + """Genshi template""" + stream = genshi_tmpl.generate(table=table) stream.render('html', strip_whitespace=False) -def test_markup_builder(): - """Markup template + tag builder""" +def test_genshi_builder(): + """Genshi template + tag builder""" stream = tag.TABLE([ tag.tr([tag.td(c) for c in row.values()]) for row in table ]).generate() - stream = markup_tmpl2.generate(table=stream) + stream = genshi_tmpl2.generate(table=stream) stream.render('html', strip_whitespace=False) def test_builder(): - """Markup tag builder""" + """Genshi tag builder""" stream = tag.TABLE([ tag.tr([ tag.td(c) for c in row.values() @@ -154,7 +154,7 @@ def run(which=None, number=10): - tests = ['test_builder', 'test_markup', 'test_markup_builder', 'test_kid', + tests = ['test_builder', 'test_genshi', 'test_genshi_builder', 'test_kid', 'test_kid_et', 'test_et', 'test_cet', 'test_clearsilver', 'test_django'] if which:
rename from examples/bench/markup/base.html rename to examples/bench/genshi/base.html --- a/examples/bench/markup/base.html +++ b/examples/bench/genshi/base.html @@ -1,5 +1,5 @@ <html xmlns="http://www.w3.org/1999/xhtml" - xmlns:py="http://markup.edgewall.org/" + xmlns:py="http://genshi.edgewall.org/" py:strip=""> <p py:def="greeting(name)">
rename from examples/bench/markup/template.html rename to examples/bench/genshi/template.html --- a/examples/bench/markup/template.html +++ b/examples/bench/genshi/template.html @@ -2,7 +2,7 @@ PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" - xmlns:py="http://markup.edgewall.org/" + xmlns:py="http://genshi.edgewall.org/" xmlns:xi="http://www.w3.org/2001/XInclude" lang="en"> <xi:include href="base.html" />
--- a/examples/includes/common/macros.html +++ b/examples/includes/common/macros.html @@ -1,4 +1,4 @@ -<div xmlns:py="http://markup.edgewall.org/" +<div xmlns:py="http://genshi.edgewall.org/" py:strip=""> <div py:def="macro1">reference me, please</div> <div py:def="macro2(name, classname='expanded')" class="${classname}">
--- a/examples/includes/module/test.html +++ b/examples/includes/module/test.html @@ -2,7 +2,7 @@ PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" - xmlns:py="http://markup.edgewall.org/" + xmlns:py="http://genshi.edgewall.org/" xmlns:xi="http://www.w3.org/2001/XInclude"> <xi:include href="${skin}/layout.html" /> <xi:include href="custom_stuff.html"><xi:fallback/></xi:include>
--- a/examples/includes/run.py +++ b/examples/includes/run.py @@ -5,7 +5,7 @@ import sys import timing -from markup.template import Context, TemplateLoader +from genshi.template import Context, TemplateLoader def test(): base_path = os.path.dirname(os.path.abspath(__file__))
--- a/examples/includes/skins/default/layout.html +++ b/examples/includes/skins/default/layout.html @@ -1,5 +1,5 @@ <html xmlns="http://www.w3.org/1999/xhtml" - xmlns:py="http://markup.edgewall.org/" + xmlns:py="http://genshi.edgewall.org/" xmlns:xi="http://www.w3.org/2001/XInclude" py:strip=""> <xi:include href="../macros.html" />
--- a/examples/transform/run.py +++ b/examples/transform/run.py @@ -4,8 +4,8 @@ import os import sys -from markup.input import HTMLParser -from markup.template import Context, Template +from genshi.input import HTMLParser +from genshi.template import Context, Template def transform(html_filename, tmpl_filename): tmpl_fileobj = open(tmpl_filename)
--- a/examples/transform/template.xml +++ b/examples/transform/template.xml @@ -1,7 +1,7 @@ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns:py="http://markup.edgewall.org/" py:strip=""> +<html xmlns:py="http://genshi.edgewall.org/" py:strip=""> <!--! Add a header DIV on top of every page with a logo image --> <body py:match="BODY|body">
--- a/examples/turbogears/README.txt +++ b/examples/turbogears/README.txt @@ -1,4 +1,4 @@ -MarkupTest +GenshiTest This is a TurboGears (http://www.turbogears.org) project. It can be started by running the start-markuptest.py script.
--- a/examples/turbogears/dev.cfg +++ b/examples/turbogears/dev.cfg @@ -2,7 +2,7 @@ # This is where all of your settings go for your development environment # Settings that are the same for both development and production # (such as template engine, encodings, etc.) all go in -# markuptest/config/app.cfg +# genshitest/config/app.cfg # DATABASE @@ -33,7 +33,7 @@ # log_debug_info_filter.on = False server.environment="development" -autoreload.package="markuptest" +autoreload.package="genshitest" # Set to True if you'd like to abort execution if a controller gets an # unexpected parameter. False by default @@ -43,13 +43,13 @@ # Logging configuration generally follows the style of the standard # Python logging module configuration. Note that when specifying # log format messages, you need to use *() for formatting variables. -# Deployment independent log configuration is in markuptest/config/log.cfg +# Deployment independent log configuration is in genshitest/config/log.cfg [logging] [[loggers]] -[[[markuptest]]] +[[[gehsnitest]]] level='DEBUG' -qualname='markuptest' +qualname='genshitest' handlers=['debug_out'] [[[allinfo]]]
rename from examples/turbogears/markuptest/__init__.py rename to examples/turbogears/genshitest/__init__.py
rename from examples/turbogears/markuptest/config/__init__.py rename to examples/turbogears/genshitest/config/__init__.py
rename from examples/turbogears/markuptest/config/app.cfg rename to examples/turbogears/genshitest/config/app.cfg --- a/examples/turbogears/markuptest/config/app.cfg +++ b/examples/turbogears/genshitest/config/app.cfg @@ -10,7 +10,7 @@ # which view (template engine) to use if one is not specified in the # template name -tg.defaultview = "markup" +tg.defaultview = "genshi" # The following kid settings determine the settings used by the kid serializer. @@ -60,7 +60,7 @@ visit.manager="sqlobject" # Database class to use for visit tracking -visit.soprovider.model = "markuptest.model.Visit" +visit.soprovider.model = "genshitest.model.Visit" # IDENTITY # General configuration of the TurboGears Identity management module @@ -96,9 +96,9 @@ # The classes you wish to use for your Identity model. Remember to not use reserved # SQL keywords for class names (at least unless you specify a different table # name using sqlmeta). -identity.soprovider.model.user="markuptest.model.User" -identity.soprovider.model.group="markuptest.model.Group" -identity.soprovider.model.permission="markuptest.model.Permission" +identity.soprovider.model.user="genshitest.model.User" +identity.soprovider.model.group="genshitest.model.Group" +identity.soprovider.model.permission="genshitest.model.Permission" # The password encryption algorithm used when comparing passwords against what's # stored in the database. Valid values are 'md5' or 'sha1'. If you do not
rename from examples/turbogears/markuptest/config/log.cfg rename to examples/turbogears/genshitest/config/log.cfg
rename from examples/turbogears/markuptest/controllers.py rename to examples/turbogears/genshitest/controllers.py --- a/examples/turbogears/markuptest/controllers.py +++ b/examples/turbogears/genshitest/controllers.py @@ -6,12 +6,12 @@ from turbogears import controllers, expose, validate, redirect, widgets from turbogears import identity -from markuptest import json +from genshitest import json -log = logging.getLogger("markuptest.controllers") +log = logging.getLogger("genshitest.controllers") class Root(controllers.RootController): - @expose(template="markuptest.templates.welcome") + @expose(template="genshitest.templates.welcome") def index(self): import time log.debug("Happy TurboGears Controller Responding For Duty") @@ -19,11 +19,11 @@ widget=widgets.TextArea(name="widget_test", default="This is a test of using " "TurboGears widgets with " - "Markup", + "Genshi", rows=5, cols=40)) - @expose(template="markuptest.templates.login") + @expose(template="genshitest.templates.login") def login(self, forward_url=None, previous_url=None, *args, **kw): if not identity.current.anonymous \
rename from examples/turbogears/markuptest/model.py rename to examples/turbogears/genshitest/model.py --- a/examples/turbogears/markuptest/model.py +++ b/examples/turbogears/genshitest/model.py @@ -5,7 +5,7 @@ from turbogears import identity from turbogears.database import PackageHub -hub = PackageHub("markuptest") +hub = PackageHub("genshitest") __connection__ = hub # class YourDataClass(SQLObject):
rename from examples/turbogears/markuptest/release.py rename to examples/turbogears/genshitest/release.py --- a/examples/turbogears/markuptest/release.py +++ b/examples/turbogears/genshitest/release.py @@ -1,4 +1,4 @@ -# Release information about MarkupTest +# Release information about GenshiTest version = "1.0"
rename from examples/turbogears/markuptest/static/images/favicon.ico rename to examples/turbogears/genshitest/static/images/favicon.ico
rename from examples/turbogears/markuptest/static/images/tg_under_the_hood.png rename to examples/turbogears/genshitest/static/images/tg_under_the_hood.png
rename from examples/turbogears/markuptest/templates/__init__.py rename to examples/turbogears/genshitest/templates/__init__.py
rename from examples/turbogears/markuptest/templates/login.html rename to examples/turbogears/genshitest/templates/login.html --- a/examples/turbogears/markuptest/templates/login.html +++ b/examples/turbogears/genshitest/templates/login.html @@ -1,7 +1,7 @@ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" - xmlns:py="http://markup.edgewall.org/" + xmlns:py="http://genshi.edgewall.org/" xmlns:xi="http://www.w3.org/2001/XInclude"> <xi:include href="master.html" />
rename from examples/turbogears/markuptest/templates/master.html rename to examples/turbogears/genshitest/templates/master.html --- a/examples/turbogears/markuptest/templates/master.html +++ b/examples/turbogears/genshitest/templates/master.html @@ -1,6 +1,6 @@ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" - xmlns:py="http://markup.edgewall.org/" + xmlns:py="http://genshi.edgewall.org/" xmlns:xi="http://www.w3.org/2001/XInclude" py:strip="">
rename from examples/turbogears/markuptest/templates/sitetemplate.html rename to examples/turbogears/genshitest/templates/sitetemplate.html --- a/examples/turbogears/markuptest/templates/sitetemplate.html +++ b/examples/turbogears/genshitest/templates/sitetemplate.html @@ -1,6 +1,6 @@ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" - xmlns:py="http://markup.edgewall.org/" + xmlns:py="http://genshi.edgewall.org/" xmlns:xi="http://www.w3.org/2001/XInclude" py:strip=""> <head py:match="head" py:attrs="select('@*')">
rename from examples/turbogears/markuptest/templates/welcome.html rename to examples/turbogears/genshitest/templates/welcome.html --- a/examples/turbogears/markuptest/templates/welcome.html +++ b/examples/turbogears/genshitest/templates/welcome.html @@ -1,6 +1,6 @@ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" - xmlns:py="http://markup.edgewall.org/" + xmlns:py="http://genshi.edgewall.org/" xmlns:xi="http://www.w3.org/2001/XInclude"> <xi:include href="master.html" />
rename from examples/turbogears/markuptest/tests/__init__.py rename to examples/turbogears/genshitest/tests/__init__.py
rename from examples/turbogears/markuptest/tests/test_controllers.py rename to examples/turbogears/genshitest/tests/test_controllers.py --- a/examples/turbogears/markuptest/tests/test_controllers.py +++ b/examples/turbogears/genshitest/tests/test_controllers.py @@ -1,5 +1,5 @@ from turbogears import testutil -from markuptest.controllers import Root +from genshitest.controllers import Root import cherrypy cherrypy.root = Root()
rename from examples/turbogears/markuptest/tests/test_model.py rename to examples/turbogears/genshitest/tests/test_model.py --- a/examples/turbogears/markuptest/tests/test_model.py +++ b/examples/turbogears/genshitest/tests/test_model.py @@ -5,7 +5,7 @@ # which is very fast. from turbogears import testutil -# from markuptest.model import YourDataClass, User +# from genshitest.model import YourDataClass, User # database.set_db_uri("sqlite:///:memory:")
--- a/examples/turbogears/sample-prod.cfg +++ b/examples/turbogears/sample-prod.cfg @@ -4,7 +4,7 @@ # as a command-line option to your start script. # Settings that are the same for both development and production # (such as template engine, encodings, etc.) all go in -# markuptest/config/app.cfg +# genshitest/config/app.cfg # pick the form for your database # sqlobject.dburi="postgres://username@hostname/databasename" @@ -44,7 +44,7 @@ # Logging configuration generally follows the style of the standard # Python logging module configuration. Note that when specifying # log format messages, you need to use *() for formatting variables. -# Deployment independent log configuration is in markuptest/config/log.cfg +# Deployment independent log configuration is in genshitest/config/log.cfg [logging] [[handlers]] @@ -57,9 +57,9 @@ formatter='message_only' [[loggers]] -[[[markuptest]]] +[[[genshitest]]] level='ERROR' -qualname='markuptest' +qualname='genshitest' handlers=['error_out'] [[[access]]]
--- a/examples/turbogears/setup.py +++ b/examples/turbogears/setup.py @@ -2,10 +2,10 @@ from turbogears.finddata import find_package_data import os -execfile(os.path.join("markuptest", "release.py")) +execfile(os.path.join("genshitest", "release.py")) setup( - name="MarkupTest", + name="GenshiTest", version=version, # uncomment the following lines if you fill them out in release.py @@ -19,11 +19,11 @@ install_requires = [ "TurboGears >= 0.9a9dev-r1686", ], - scripts = ["start-markuptest.py"], + scripts = ["start-genshitest.py"], zip_safe=False, packages=find_packages(), - package_data = find_package_data(where='markuptest', - package='markuptest'), + package_data = find_package_data(where='genshitest', + package='genshitest'), keywords = [ # Use keywords if you'll be adding your package to the # Python Cheeseshop
rename from examples/turbogears/start-markuptest.py rename to examples/turbogears/start-genshitest.py --- a/examples/turbogears/start-markuptest.py +++ b/examples/turbogears/start-genshitest.py @@ -15,14 +15,14 @@ # probably installed if len(sys.argv) > 1: turbogears.update_config(configfile=sys.argv[1], - modulename="markuptest.config") + modulename="genshitest.config") elif exists(join(dirname(__file__), "setup.py")): turbogears.update_config(configfile="dev.cfg", - modulename="markuptest.config") + modulename="genshitest.config") else: turbogears.update_config(configfile="prod.cfg", - modulename="markuptest.config") + modulename="genshitest.config") -from markuptest.controllers import Root +from genshitest.controllers import Root turbogears.start_server(Root())
rename from markup/__init__.py rename to genshi/__init__.py --- a/markup/__init__.py +++ b/genshi/__init__.py @@ -5,11 +5,11 @@ # # This software is licensed as described in the file COPYING, which # you should have received as part of this distribution. The terms -# are also available at http://markup.edgewall.org/wiki/License. +# are also available at http://genshi.edgewall.org/wiki/License. # # This software consists of voluntary contributions made by many # individuals. For the exact contribution history, see the revision -# history and logs, available at http://markup.edgewall.org/log/. +# history and logs, available at http://genshi.edgewall.org/log/. """This package provides various means for generating and processing web markup (XML or HTML). @@ -23,9 +23,9 @@ ------------------ Literal XML and HTML text can be used to easily produce markup streams -via helper functions in the `markup.input` module: +via helper functions in the `genshi.input` module: ->>> from markup.input import XML +>>> from genshi.input import XML >>> doc = XML('<html lang="en"><head><title>My document</title></head></html>') This results in a `Stream` object that can be used in a number of way. @@ -33,7 +33,7 @@ >>> doc.render(method='html', encoding='utf-8') '<html lang="en"><head><title>My document</title></head></html>' ->>> from markup.input import HTML +>>> from genshi.input import HTML >>> doc = HTML('<HTML lang=en><HEAD><TITLE>My document</HTML>') >>> doc.render(method='html', encoding='utf-8') '<html lang="en"><head><title>My document</title></head></html>' @@ -44,13 +44,13 @@ Markup streams can also be generated programmatically using the -`markup.builder` module: +`genshi.builder` module: ->>> from markup.builder import tag +>>> from genshi.builder import tag >>> doc = tag.doc(tag.title('My document'), lang='en') >>> doc.generate().render(method='html') '<doc lang="en"><title>My document</title></doc>' """ -from markup.core import * -from markup.input import ParseError, XML, HTML +from genshi.core import * +from genshi.input import ParseError, XML, HTML
rename from markup/builder.py rename to genshi/builder.py --- a/markup/builder.py +++ b/genshi/builder.py @@ -5,13 +5,13 @@ # # This software is licensed as described in the file COPYING, which # you should have received as part of this distribution. The terms -# are also available at http://markup.edgewall.org/wiki/License. +# are also available at http://genshi.edgewall.org/wiki/License. # # This software consists of voluntary contributions made by many # individuals. For the exact contribution history, see the revision -# history and logs, available at http://markup.edgewall.org/log/. +# history and logs, available at http://genshi.edgewall.org/log/. -from markup.core import Attrs, Namespace, QName, Stream, START, END, TEXT +from genshi.core import Attrs, Namespace, QName, Stream, START, END, TEXT __all__ = ['Fragment', 'Element', 'tag'] @@ -147,7 +147,7 @@ Elements with a namespace can be generated using the `Namespace` and/or `QName` classes: - >>> from markup.core import Namespace + >>> from genshi.core import Namespace >>> xhtml = Namespace('http://www.w3.org/1999/xhtml') >>> print Element(xhtml.html, lang='en') <html lang="en" xmlns="http://www.w3.org/1999/xhtml"/>
rename from markup/core.py rename to genshi/core.py --- a/markup/core.py +++ b/genshi/core.py @@ -5,11 +5,11 @@ # # This software is licensed as described in the file COPYING, which # you should have received as part of this distribution. The terms -# are also available at http://markup.edgewall.org/wiki/License. +# are also available at http://genshi.edgewall.org/wiki/License. # # This software consists of voluntary contributions made by many # individuals. For the exact contribution history, see the revision -# history and logs, available at http://markup.edgewall.org/log/. +# history and logs, available at http://genshi.edgewall.org/log/. """Core classes for markup processing.""" @@ -72,7 +72,7 @@ Assume the following stream produced by the `HTML` function: - >>> from markup.input import HTML + >>> from genshi.input import HTML >>> html = HTML('''<p onclick="alert('Whoa')">Hello, world!</p>''') >>> print html <p onclick="alert('Whoa')">Hello, world!</p> @@ -80,7 +80,7 @@ A filter such as the HTML sanitizer can be applied to that stream using the pipe notation as follows: - >>> from markup.filters import HTMLSanitizer + >>> from genshi.filters import HTMLSanitizer >>> sanitizer = HTMLSanitizer() >>> print html | sanitizer <p>Hello, world!</p> @@ -98,7 +98,7 @@ Serializers can also be used with this notation: - >>> from markup.output import TextSerializer + >>> from genshi.output import TextSerializer >>> output = TextSerializer() >>> print html | sanitizer | uppercase | output HELLO, WORLD! @@ -152,7 +152,7 @@ @param path: a string containing the XPath expression """ - from markup.path import Path + from genshi.path import Path return Path(path).select(self) def serialize(self, method='xml', **kwargs): @@ -170,7 +170,7 @@ Any additional keyword arguments are passed to the serializer, and thus depend on the `method` parameter value. """ - from markup import output + from genshi import output cls = method if isinstance(method, basestring): cls = {'xml': output.XMLSerializer,
rename from markup/eval.py rename to genshi/eval.py --- a/markup/eval.py +++ b/genshi/eval.py @@ -5,11 +5,11 @@ # # This software is licensed as described in the file COPYING, which # you should have received as part of this distribution. The terms -# are also available at http://markup.edgewall.org/wiki/License. +# are also available at http://genshi.edgewall.org/wiki/License. # # This software consists of voluntary contributions made by many # individuals. For the exact contribution history, see the revision -# history and logs, available at http://markup.edgewall.org/log/. +# history and logs, available at http://genshi.edgewall.org/log/. """Support for "safe" evaluation of Python expressions."""
rename from markup/filters.py rename to genshi/filters.py --- a/markup/filters.py +++ b/genshi/filters.py @@ -5,11 +5,11 @@ # # This software is licensed as described in the file COPYING, which # you should have received as part of this distribution. The terms -# are also available at http://markup.edgewall.org/wiki/License. +# are also available at http://genshi.edgewall.org/wiki/License. # # This software consists of voluntary contributions made by many # individuals. For the exact contribution history, see the revision -# history and logs, available at http://markup.edgewall.org/log/. +# history and logs, available at http://genshi.edgewall.org/log/. """Implementation of a number of stream filters.""" @@ -19,8 +19,8 @@ from sets import ImmutableSet as frozenset import re -from markup.core import Attrs, Namespace, stripentities -from markup.core import END, END_NS, START, START_NS +from genshi.core import Attrs, Namespace, stripentities +from genshi.core import END, END_NS, START, START_NS __all__ = ['HTMLSanitizer', 'IncludeFilter'] @@ -137,7 +137,7 @@ @param stream: the markup event stream to filter @param ctxt: the template context """ - from markup.template import TemplateError, TemplateNotFound + from genshi.template import TemplateError, TemplateNotFound ns_prefixes = [] in_fallback = False
rename from markup/input.py rename to genshi/input.py --- a/markup/input.py +++ b/genshi/input.py @@ -5,11 +5,11 @@ # # This software is licensed as described in the file COPYING, which # you should have received as part of this distribution. The terms -# are also available at http://markup.edgewall.org/wiki/License. +# are also available at http://genshi.edgewall.org/wiki/License. # # This software consists of voluntary contributions made by many # individuals. For the exact contribution history, see the revision -# history and logs, available at http://markup.edgewall.org/log/. +# history and logs, available at http://genshi.edgewall.org/log/. from itertools import chain from xml.parsers import expat @@ -21,8 +21,8 @@ import htmlentitydefs from StringIO import StringIO -from markup.core import Attrs, QName, Stream -from markup.core import DOCTYPE, START, END, START_NS, END_NS, TEXT, \ +from genshi.core import Attrs, QName, Stream +from genshi.core import DOCTYPE, START, END, START_NS, END_NS, TEXT, \ START_CDATA, END_CDATA, PI, COMMENT __all__ = ['ParseError', 'XMLParser', 'XML', 'HTMLParser', 'HTML']
rename from markup/output.py rename to genshi/output.py --- a/markup/output.py +++ b/genshi/output.py @@ -5,11 +5,11 @@ # # This software is licensed as described in the file COPYING, which # you should have received as part of this distribution. The terms -# are also available at http://markup.edgewall.org/wiki/License. +# are also available at http://genshi.edgewall.org/wiki/License. # # This software consists of voluntary contributions made by many # individuals. For the exact contribution history, see the revision -# history and logs, available at http://markup.edgewall.org/log/. +# history and logs, available at http://genshi.edgewall.org/log/. """This module provides different kinds of serialization methods for XML event streams. @@ -22,8 +22,8 @@ from sets import ImmutableSet as frozenset import re -from markup.core import escape, Markup, Namespace, QName, StreamEventKind -from markup.core import DOCTYPE, START, END, START_NS, TEXT, START_CDATA, \ +from genshi.core import escape, Markup, Namespace, QName, StreamEventKind +from genshi.core import DOCTYPE, START, END, START_NS, TEXT, START_CDATA, \ END_CDATA, PI, COMMENT, XML_NAMESPACE __all__ = ['DocType', 'XMLSerializer', 'XHTMLSerializer', 'HTMLSerializer', @@ -49,7 +49,7 @@ class XMLSerializer(object): """Produces XML text from an event stream. - >>> from markup.builder import tag + >>> from genshi.builder import tag >>> elem = tag.div(tag.a(href='foo'), tag.br, tag.hr(noshade=True)) >>> print ''.join(XMLSerializer()(elem.generate())) <div><a href="foo"/><br/><hr noshade="True"/></div> @@ -169,7 +169,7 @@ class XHTMLSerializer(XMLSerializer): """Produces XHTML text from an event stream. - >>> from markup.builder import tag + >>> from genshi.builder import tag >>> elem = tag.div(tag.a(href='foo'), tag.br, tag.hr(noshade=True)) >>> print ''.join(XHTMLSerializer()(elem.generate())) <div><a href="foo"></a><br /><hr noshade="noshade" /></div> @@ -292,7 +292,7 @@ class HTMLSerializer(XHTMLSerializer): """Produces HTML text from an event stream. - >>> from markup.builder import tag + >>> from genshi.builder import tag >>> elem = tag.div(tag.a(href='foo'), tag.br, tag.hr(noshade=True)) >>> print ''.join(HTMLSerializer()(elem.generate())) <div><a href="foo"></a><br><hr noshade></div> @@ -396,7 +396,7 @@ Only text events are included in the output. Unlike the other serializer, special XML characters are not escaped: - >>> from markup.builder import tag + >>> from genshi.builder import tag >>> elem = tag.div(tag.a('<Hello!>', href='foo'), tag.br) >>> print elem <div><a href="foo"><Hello!></a><br/></div>
rename from markup/path.py rename to genshi/path.py --- a/markup/path.py +++ b/genshi/path.py @@ -5,15 +5,15 @@ # # This software is licensed as described in the file COPYING, which # you should have received as part of this distribution. The terms -# are also available at http://markup.edgewall.org/wiki/License. +# are also available at http://genshi.edgewall.org/wiki/License. # # This software consists of voluntary contributions made by many # individuals. For the exact contribution history, see the revision -# history and logs, available at http://markup.edgewall.org/log/. +# history and logs, available at http://genshi.edgewall.org/log/. """Basic support for evaluating XPath expressions against streams. ->>> from markup.input import XML +>>> from genshi.input import XML >>> doc = XML('''<doc> ... <items count="2"> ... <item status="new"> @@ -34,8 +34,8 @@ from math import ceil, floor import re -from markup.core import Stream, Attrs, Namespace, QName -from markup.core import START, END, TEXT, COMMENT, PI +from genshi.core import Stream, Attrs, Namespace, QName +from genshi.core import START, END, TEXT, COMMENT, PI __all__ = ['Path', 'PathSyntaxError'] @@ -96,7 +96,7 @@ If there are no matches, this method returns an empty stream. - >>> from markup.input import XML + >>> from genshi.input import XML >>> xml = XML('<root><elem><child>Text</child></elem></root>') >>> print Path('.//child').select(xml) @@ -146,7 +146,7 @@ If the path matches the event, the function returns the match (for example, a `START` or `TEXT` event.) Otherwise, it returns `None`. - >>> from markup.input import XML + >>> from genshi.input import XML >>> xml = XML('<root><elem><child id="1"/></elem><child id="2"/></root>') >>> test = Path('child').test() >>> for kind, data, pos in xml:
rename from markup/plugin.py rename to genshi/plugin.py --- a/markup/plugin.py +++ b/genshi/plugin.py @@ -6,11 +6,11 @@ # # This software is licensed as described in the file COPYING, which # you should have received as part of this distribution. The terms -# are also available at http://markup.edgewall.org/wiki/License. +# are also available at http://genshi.edgewall.org/wiki/License. # # This software consists of voluntary contributions made by many # individuals. For the exact contribution history, see the revision -# history and logs, available at http://markup.edgewall.org/log/. +# history and logs, available at http://genshi.edgewall.org/log/. """Basic support for the template engine plugin API used by TurboGears and CherryPy/Buffet. @@ -18,10 +18,10 @@ from pkg_resources import resource_filename -from markup.core import Attrs, Stream, QName -from markup.eval import Undefined -from markup.input import HTML, XML -from markup.template import Context, Template, TemplateLoader +from genshi.core import Attrs, Stream, QName +from genshi.eval import Undefined +from genshi.input import HTML, XML +from genshi.template import Context, Template, TemplateLoader def ET(element): """Converts the given ElementTree element to a markup stream."""
rename from markup/template.py rename to genshi/template.py --- a/markup/template.py +++ b/genshi/template.py @@ -5,11 +5,11 @@ # # This software is licensed as described in the file COPYING, which # you should have received as part of this distribution. The terms -# are also available at http://markup.edgewall.org/wiki/License. +# are also available at http://genshi.edgewall.org/wiki/License. # # This software consists of voluntary contributions made by many # individuals. For the exact contribution history, see the revision -# history and logs, available at http://markup.edgewall.org/log/. +# history and logs, available at http://genshi.edgewall.org/log/. """Implementation of the template engine.""" @@ -24,11 +24,11 @@ import re from StringIO import StringIO -from markup.core import Attrs, Namespace, Stream, StreamEventKind, _ensure -from markup.core import START, END, START_NS, END_NS, TEXT, COMMENT -from markup.eval import Expression -from markup.input import XMLParser -from markup.path import Path +from genshi.core import Attrs, Namespace, Stream, StreamEventKind, _ensure +from genshi.core import START, END, START_NS, END_NS, TEXT, COMMENT +from genshi.eval import Expression +from genshi.input import XMLParser +from genshi.path import Path __all__ = ['BadDirectiveError', 'TemplateError', 'TemplateSyntaxError', 'TemplateNotFound', 'Template', 'TemplateLoader'] @@ -216,7 +216,7 @@ of `(name, value)` tuples. The items in that dictionary or sequence are added as attributes to the element: - >>> tmpl = Template('''<ul xmlns:py="http://markup.edgewall.org/"> + >>> tmpl = Template('''<ul xmlns:py="http://genshi.edgewall.org/"> ... <li py:attrs="foo">Bar</li> ... </ul>''') >>> print tmpl.generate(foo={'class': 'collapse'}) @@ -269,7 +269,7 @@ This directive replaces the content of the element with the result of evaluating the value of the `py:content` attribute: - >>> tmpl = Template('''<ul xmlns:py="http://markup.edgewall.org/"> + >>> tmpl = Template('''<ul xmlns:py="http://genshi.edgewall.org/"> ... <li py:content="bar">Hello</li> ... </ul>''') >>> print tmpl.generate(bar='Bye') @@ -305,7 +305,7 @@ A named template function can be used just like a normal Python function from template expressions: - >>> tmpl = Template('''<div xmlns:py="http://markup.edgewall.org/"> + >>> tmpl = Template('''<div xmlns:py="http://genshi.edgewall.org/"> ... <p py:def="echo(greeting, name='world')" class="message"> ... ${greeting}, ${name}! ... </p> @@ -321,7 +321,7 @@ If a function does not require parameters, the parenthesis can be omitted both when defining and when calling it: - >>> tmpl = Template('''<div xmlns:py="http://markup.edgewall.org/"> + >>> tmpl = Template('''<div xmlns:py="http://genshi.edgewall.org/"> ... <p py:def="helloworld" class="message"> ... Hello, world! ... </p> @@ -394,7 +394,7 @@ """Implementation of the `py:for` template directive for repeating an element based on an iterable in the context data. - >>> tmpl = Template('''<ul xmlns:py="http://markup.edgewall.org/"> + >>> tmpl = Template('''<ul xmlns:py="http://genshi.edgewall.org/"> ... <li py:for="item in items">${item}</li> ... </ul>''') >>> print tmpl.generate(items=[1, 2, 3]) @@ -439,7 +439,7 @@ """Implementation of the `py:if` template directive for conditionally excluding elements from being output. - >>> tmpl = Template('''<div xmlns:py="http://markup.edgewall.org/"> + >>> tmpl = Template('''<div xmlns:py="http://genshi.edgewall.org/"> ... <b py:if="foo">${bar}</b> ... </div>''') >>> print tmpl.generate(foo=True, bar='Hello') @@ -460,7 +460,7 @@ class MatchDirective(Directive): """Implementation of the `py:match` template directive. - >>> tmpl = Template('''<div xmlns:py="http://markup.edgewall.org/"> + >>> tmpl = Template('''<div xmlns:py="http://genshi.edgewall.org/"> ... <span py:match="greeting"> ... Hello ${select('@name')} ... </span> @@ -496,7 +496,7 @@ This directive replaces the element with the result of evaluating the value of the `py:replace` attribute: - >>> tmpl = Template('''<div xmlns:py="http://markup.edgewall.org/"> + >>> tmpl = Template('''<div xmlns:py="http://genshi.edgewall.org/"> ... <span py:replace="bar">Hello</span> ... </div>''') >>> print tmpl.generate(bar='Bye') @@ -507,7 +507,7 @@ This directive is equivalent to `py:content` combined with `py:strip`, providing a less verbose way to achieve the same effect: - >>> tmpl = Template('''<div xmlns:py="http://markup.edgewall.org/"> + >>> tmpl = Template('''<div xmlns:py="http://genshi.edgewall.org/"> ... <span py:content="bar" py:strip="">Hello</span> ... </div>''') >>> print tmpl.generate(bar='Bye') @@ -528,7 +528,7 @@ When the value of the `py:strip` attribute evaluates to `True`, the element is stripped from the output - >>> tmpl = Template('''<div xmlns:py="http://markup.edgewall.org/"> + >>> tmpl = Template('''<div xmlns:py="http://genshi.edgewall.org/"> ... <div py:strip="True"><b>foo</b></div> ... </div>''') >>> print tmpl.generate() @@ -541,7 +541,7 @@ This directive is particulary interesting for named template functions or match templates that do not generate a top-level element: - >>> tmpl = Template('''<div xmlns:py="http://markup.edgewall.org/"> + >>> tmpl = Template('''<div xmlns:py="http://genshi.edgewall.org/"> ... <div py:def="echo(what)" py:strip=""> ... <b>${what}</b> ... </div> @@ -582,7 +582,7 @@ If no `py:when` directive is matched then the fallback directive `py:otherwise` will be used. - >>> tmpl = Template('''<div xmlns:py="http://markup.edgewall.org/" + >>> tmpl = Template('''<div xmlns:py="http://genshi.edgewall.org/" ... py:choose=""> ... <span py:when="0 == 1">0</span> ... <span py:when="1 == 1">1</span> @@ -596,7 +596,7 @@ If the `py:choose` directive contains an expression, the nested `py:when` directives are tested for equality to the `py:choose` expression: - >>> tmpl = Template('''<div xmlns:py="http://markup.edgewall.org/" + >>> tmpl = Template('''<div xmlns:py="http://genshi.edgewall.org/" ... py:choose="2"> ... <span py:when="1">1</span> ... <span py:when="2">2</span> @@ -679,7 +679,7 @@ """Implementation of the `py:with` template directive, which allows shorthand access to variables and expressions. - >>> tmpl = Template('''<div xmlns:py="http://markup.edgewall.org/"> + >>> tmpl = Template('''<div xmlns:py="http://genshi.edgewall.org/"> ... <span py:with="y=7; z=x+10">$x $y $z</span> ... </div>''') >>> print tmpl.generate(x=42) @@ -733,7 +733,7 @@ """Can parse a template and transform it into the corresponding output based on context data. """ - NAMESPACE = Namespace('http://markup.edgewall.org/') + NAMESPACE = Namespace('http://genshi.edgewall.org/') EXPR = StreamEventKind('EXPR') # an expression SUB = StreamEventKind('SUB') # a "subprogram" @@ -1151,7 +1151,7 @@ template is being loaded, or `None` if the template is being loaded directly """ - from markup.filters import IncludeFilter + from genshi.filters import IncludeFilter if relative_to: filename = os.path.join(os.path.dirname(relative_to), filename)
rename from markup/tests/__init__.py rename to genshi/tests/__init__.py --- a/markup/tests/__init__.py +++ b/genshi/tests/__init__.py @@ -5,21 +5,21 @@ # # This software is licensed as described in the file COPYING, which # you should have received as part of this distribution. The terms -# are also available at http://markup.edgewall.org/wiki/License. +# are also available at http://genshi.edgewall.org/wiki/License. # # This software consists of voluntary contributions made by many # individuals. For the exact contribution history, see the revision -# history and logs, available at http://markup.edgewall.org/log/. +# history and logs, available at http://genshi.edgewall.org/log/. import doctest import unittest def suite(): - import markup - from markup.tests import builder, core, eval, filters, input, output, \ + import genshi + from genshi.tests import builder, core, eval, filters, input, output, \ path, template suite = unittest.TestSuite() - suite.addTest(doctest.DocTestSuite(markup)) + suite.addTest(doctest.DocTestSuite(genshi)) suite.addTest(builder.suite()) suite.addTest(core.suite()) suite.addTest(eval.suite())
rename from markup/tests/builder.py rename to genshi/tests/builder.py --- a/markup/tests/builder.py +++ b/genshi/tests/builder.py @@ -5,18 +5,18 @@ # # This software is licensed as described in the file COPYING, which # you should have received as part of this distribution. The terms -# are also available at http://markup.edgewall.org/wiki/License. +# are also available at http://genshi.edgewall.org/wiki/License. # # This software consists of voluntary contributions made by many # individuals. For the exact contribution history, see the revision -# history and logs, available at http://markup.edgewall.org/log/. +# history and logs, available at http://genshi.edgewall.org/log/. import doctest from HTMLParser import HTMLParseError import unittest -from markup.builder import Element, tag -from markup.core import Stream +from genshi.builder import Element, tag +from genshi.core import Stream class ElementFactoryTestCase(unittest.TestCase):
rename from markup/tests/core.py rename to genshi/tests/core.py --- a/markup/tests/core.py +++ b/genshi/tests/core.py @@ -5,17 +5,17 @@ # # This software is licensed as described in the file COPYING, which # you should have received as part of this distribution. The terms -# are also available at http://markup.edgewall.org/wiki/License. +# are also available at http://genshi.edgewall.org/wiki/License. # # This software consists of voluntary contributions made by many # individuals. For the exact contribution history, see the revision -# history and logs, available at http://markup.edgewall.org/log/. +# history and logs, available at http://genshi.edgewall.org/log/. import doctest import unittest -from markup.core import * -from markup.input import XML, ParseError +from genshi.core import * +from genshi.input import XML, ParseError class StreamTestCase(unittest.TestCase):
rename from markup/tests/eval.py rename to genshi/tests/eval.py --- a/markup/tests/eval.py +++ b/genshi/tests/eval.py @@ -5,17 +5,17 @@ # # This software is licensed as described in the file COPYING, which # you should have received as part of this distribution. The terms -# are also available at http://markup.edgewall.org/wiki/License. +# are also available at http://genshi.edgewall.org/wiki/License. # # This software consists of voluntary contributions made by many # individuals. For the exact contribution history, see the revision -# history and logs, available at hhttp://markup.edgewall.org/log/. +# history and logs, available at hhttp://genshi.edgewall.org/log/. import doctest import sys import unittest -from markup.eval import Expression, Undefined +from genshi.eval import Expression, Undefined class ExpressionTestCase(unittest.TestCase):
rename from markup/tests/filters.py rename to genshi/tests/filters.py --- a/markup/tests/filters.py +++ b/genshi/tests/filters.py @@ -5,18 +5,18 @@ # # This software is licensed as described in the file COPYING, which # you should have received as part of this distribution. The terms -# are also available at http://markup.edgewall.org/wiki/License. +# are also available at http://genshi.edgewall.org/wiki/License. # # This software consists of voluntary contributions made by many # individuals. For the exact contribution history, see the revision -# history and logs, available at http://markup.edgewall.org/log/. +# history and logs, available at http://genshi.edgewall.org/log/. import doctest import unittest -from markup.core import Stream -from markup.input import HTML, ParseError -from markup.filters import HTMLSanitizer +from genshi.core import Stream +from genshi.input import HTML, ParseError +from genshi.filters import HTMLSanitizer class HTMLSanitizerTestCase(unittest.TestCase):
rename from markup/tests/input.py rename to genshi/tests/input.py --- a/markup/tests/input.py +++ b/genshi/tests/input.py @@ -5,19 +5,19 @@ # # This software is licensed as described in the file COPYING, which # you should have received as part of this distribution. The terms -# are also available at http://markup.edgewall.org/wiki/License. +# are also available at http://genshi.edgewall.org/wiki/License. # # This software consists of voluntary contributions made by many # individuals. For the exact contribution history, see the revision -# history and logs, available at http://markup.edgewall.org/log/. +# history and logs, available at http://genshi.edgewall.org/log/. import doctest from StringIO import StringIO import sys import unittest -from markup.core import Stream -from markup.input import XMLParser, HTMLParser, ParseError +from genshi.core import Stream +from genshi.input import XMLParser, HTMLParser, ParseError class XMLParserTestCase(unittest.TestCase):
rename from markup/tests/output.py rename to genshi/tests/output.py --- a/markup/tests/output.py +++ b/genshi/tests/output.py @@ -5,19 +5,19 @@ # # This software is licensed as described in the file COPYING, which # you should have received as part of this distribution. The terms -# are also available at http://markup.edgewall.org/wiki/License. +# are also available at http://genshi.edgewall.org/wiki/License. # # This software consists of voluntary contributions made by many # individuals. For the exact contribution history, see the revision -# history and logs, available at http://markup.edgewall.org/log/. +# history and logs, available at http://genshi.edgewall.org/log/. import doctest import unittest import sys -from markup.core import Stream -from markup.input import HTML, XML -from markup.output import DocType, XMLSerializer, XHTMLSerializer, \ +from genshi.core import Stream +from genshi.input import HTML, XML +from genshi.output import DocType, XMLSerializer, XHTMLSerializer, \ HTMLSerializer, EmptyTagFilter
rename from markup/tests/path.py rename to genshi/tests/path.py --- a/markup/tests/path.py +++ b/genshi/tests/path.py @@ -5,17 +5,17 @@ # # This software is licensed as described in the file COPYING, which # you should have received as part of this distribution. The terms -# are also available at http://markup.edgewall.org/wiki/License. +# are also available at http://genshi.edgewall.org/wiki/License. # # This software consists of voluntary contributions made by many # individuals. For the exact contribution history, see the revision -# history and logs, available at http://markup.edgewall.org/log/. +# history and logs, available at http://genshi.edgewall.org/log/. import doctest import unittest -from markup.input import XML -from markup.path import Path, PathSyntaxError +from genshi.input import XML +from genshi.path import Path, PathSyntaxError class PathTestCase(unittest.TestCase):
rename from markup/tests/template.py rename to genshi/tests/template.py --- a/markup/tests/template.py +++ b/genshi/tests/template.py @@ -5,11 +5,11 @@ # # This software is licensed as described in the file COPYING, which # you should have received as part of this distribution. The terms -# are also available at http://markup.edgewall.org/wiki/License. +# are also available at http://genshi.edgewall.org/wiki/License. # # This software consists of voluntary contributions made by many # individuals. For the exact contribution history, see the revision -# history and logs, available at http://markup.edgewall.org/log/. +# history and logs, available at http://genshi.edgewall.org/log/. import doctest import os @@ -18,8 +18,8 @@ import sys import tempfile -from markup.core import Markup, Stream -from markup.template import BadDirectiveError, Template, TemplateLoader, \ +from genshi.core import Markup, Stream +from genshi.template import BadDirectiveError, Template, TemplateLoader, \ TemplateSyntaxError @@ -30,7 +30,7 @@ """ Verify that the directive has access to the loop variables. """ - tmpl = Template("""<doc xmlns:py="http://markup.edgewall.org/"> + tmpl = Template("""<doc xmlns:py="http://genshi.edgewall.org/"> <elem py:for="item in items" py:attrs="item"/> </doc>""") items = [{'id': 1, 'class': 'foo'}, {'id': 2, 'class': 'bar'}] @@ -43,7 +43,7 @@ Verify that an attribute value that evaluates to `None` removes an existing attribute of that name. """ - tmpl = Template("""<doc xmlns:py="http://markup.edgewall.org/"> + tmpl = Template("""<doc xmlns:py="http://genshi.edgewall.org/"> <elem class="foo" py:attrs="{'class': 'bar'}"/> </doc>""") self.assertEqual("""<doc> @@ -55,7 +55,7 @@ Verify that an attribute value that evaluates to `None` removes an existing attribute of that name. """ - tmpl = Template("""<doc xmlns:py="http://markup.edgewall.org/"> + tmpl = Template("""<doc xmlns:py="http://genshi.edgewall.org/"> <elem class="foo" py:attrs="{'class': None}"/> </doc>""") self.assertEqual("""<doc> @@ -72,7 +72,7 @@ Verify that, if multiple `py:when` bodies match, only the first is output. """ - tmpl = Template("""<div xmlns:py="http://markup.edgewall.org/" py:choose=""> + tmpl = Template("""<div xmlns:py="http://genshi.edgewall.org/" py:choose=""> <span py:when="1 == 1">1</span> <span py:when="2 == 2">2</span> <span py:when="3 == 3">3</span> @@ -82,7 +82,7 @@ </div>""", str(tmpl.generate())) def test_otherwise(self): - tmpl = Template("""<div xmlns:py="http://markup.edgewall.org/" py:choose=""> + tmpl = Template("""<div xmlns:py="http://genshi.edgewall.org/" py:choose=""> <span py:when="False">hidden</span> <span py:otherwise="">hello</span> </div>""") @@ -94,7 +94,7 @@ """ Verify that `py:choose` blocks can be nested: """ - tmpl = Template("""<doc xmlns:py="http://markup.edgewall.org/"> + tmpl = Template("""<doc xmlns:py="http://genshi.edgewall.org/"> <div py:choose="1"> <div py:when="1" py:choose="3"> <span py:when="2">2</span> @@ -114,7 +114,7 @@ """ Verify more complex nesting. """ - tmpl = Template("""<doc xmlns:py="http://markup.edgewall.org/"> + tmpl = Template("""<doc xmlns:py="http://genshi.edgewall.org/"> <div py:choose="1"> <div py:when="1" py:choose=""> <span py:when="2">OK</span> @@ -134,7 +134,7 @@ """ Verify more complex nesting using otherwise. """ - tmpl = Template("""<doc xmlns:py="http://markup.edgewall.org/"> + tmpl = Template("""<doc xmlns:py="http://genshi.edgewall.org/"> <div py:choose="1"> <div py:when="1" py:choose="2"> <span py:when="1">FAIL</span> @@ -155,7 +155,7 @@ Verify that a when directive with a strip directive actually strips of the outer element. """ - tmpl = Template("""<doc xmlns:py="http://markup.edgewall.org/"> + tmpl = Template("""<doc xmlns:py="http://genshi.edgewall.org/"> <div py:choose="" py:strip=""> <span py:otherwise="">foo</span> </div> @@ -169,7 +169,7 @@ Verify that a `when` directive outside of a `choose` directive is reported as an error. """ - tmpl = Template("""<doc xmlns:py="http://markup.edgewall.org/"> + tmpl = Template("""<doc xmlns:py="http://genshi.edgewall.org/"> <div py:when="xy" /> </doc>""") self.assertRaises(TemplateSyntaxError, str, tmpl.generate()) @@ -179,7 +179,7 @@ Verify that an `otherwise` directive outside of a `choose` directive is reported as an error. """ - tmpl = Template("""<doc xmlns:py="http://markup.edgewall.org/"> + tmpl = Template("""<doc xmlns:py="http://genshi.edgewall.org/"> <div py:otherwise="" /> </doc>""") self.assertRaises(TemplateSyntaxError, str, tmpl.generate()) @@ -189,7 +189,7 @@ Verify that an `when` directive that doesn't have a `test` attribute is reported as an error. """ - tmpl = Template("""<doc xmlns:py="http://markup.edgewall.org/"> + tmpl = Template("""<doc xmlns:py="http://genshi.edgewall.org/"> <div py:choose="" py:strip=""> <py:when>foo</py:when> </div> @@ -201,7 +201,7 @@ Verify that an `otherwise` directive can be used without a `test` attribute. """ - tmpl = Template("""<doc xmlns:py="http://markup.edgewall.org/"> + tmpl = Template("""<doc xmlns:py="http://genshi.edgewall.org/"> <div py:choose="" py:strip=""> <py:otherwise>foo</py:otherwise> </div> @@ -214,7 +214,7 @@ """ Verify that the directive can also be used as an element. """ - tmpl = Template("""<doc xmlns:py="http://markup.edgewall.org/"> + tmpl = Template("""<doc xmlns:py="http://genshi.edgewall.org/"> <py:choose> <py:when test="1 == 1">1</py:when> <py:when test="2 == 2">2</py:when> @@ -234,7 +234,7 @@ Verify that a named template function with a strip directive actually strips of the outer element. """ - tmpl = Template("""<doc xmlns:py="http://markup.edgewall.org/"> + tmpl = Template("""<doc xmlns:py="http://genshi.edgewall.org/"> <div py:def="echo(what)" py:strip=""> <b>${what}</b> </div> @@ -245,7 +245,7 @@ </doc>""", str(tmpl.generate())) def test_exec_in_replace(self): - tmpl = Template("""<div xmlns:py="http://markup.edgewall.org/"> + tmpl = Template("""<div xmlns:py="http://genshi.edgewall.org/"> <p py:def="echo(greeting, name='world')" class="message"> ${greeting}, ${name}! </p> @@ -261,7 +261,7 @@ """ Verify that the directive can also be used as an element. """ - tmpl = Template("""<doc xmlns:py="http://markup.edgewall.org/"> + tmpl = Template("""<doc xmlns:py="http://genshi.edgewall.org/"> <py:def function="echo(what)"> <b>${what}</b> </py:def> @@ -276,7 +276,7 @@ Verify that a template function defined inside a conditional block can be called from outside that block. """ - tmpl = Template("""<doc xmlns:py="http://markup.edgewall.org/"> + tmpl = Template("""<doc xmlns:py="http://genshi.edgewall.org/"> <py:if test="semantic"> <strong py:def="echo(what)">${what}</strong> </py:if> @@ -293,7 +293,7 @@ """ Verify that keyword arguments work with `py:def` directives. """ - tmpl = Template("""<doc xmlns:py="http://markup.edgewall.org/"> + tmpl = Template("""<doc xmlns:py="http://genshi.edgewall.org/"> <b py:def="echo(what, bold=False)" py:strip="not bold">${what}</b> ${echo('foo')} </doc>""") @@ -302,7 +302,7 @@ </doc>""", str(tmpl.generate())) def test_invocation_in_attribute(self): - tmpl = Template("""<doc xmlns:py="http://markup.edgewall.org/"> + tmpl = Template("""<doc xmlns:py="http://genshi.edgewall.org/"> <py:def function="echo(what)">${what or 'something'}</py:def> <p class="${echo('foo')}">bar</p> </doc>""") @@ -311,7 +311,7 @@ </doc>""", str(tmpl.generate())) def test_invocation_in_attribute_none(self): - tmpl = Template("""<doc xmlns:py="http://markup.edgewall.org/"> + tmpl = Template("""<doc xmlns:py="http://genshi.edgewall.org/"> <py:def function="echo()">${None}</py:def> <p class="${echo()}">bar</p> </doc>""") @@ -322,7 +322,7 @@ def test_function_raising_typeerror(self): def badfunc(): raise TypeError - tmpl = Template("""<html xmlns:py="http://markup.edgewall.org/"> + tmpl = Template("""<html xmlns:py="http://genshi.edgewall.org/"> <div py:def="dobadfunc()"> ${badfunc()} </div> @@ -331,7 +331,7 @@ self.assertRaises(TypeError, list, tmpl.generate(badfunc=badfunc)) def test_def_in_matched(self): - tmpl = Template("""<doc xmlns:py="http://markup.edgewall.org/"> + tmpl = Template("""<doc xmlns:py="http://genshi.edgewall.org/"> <head py:match="head">${select('*')}</head> <head> <py:def function="maketitle(test)"><b py:replace="test" /></py:def> @@ -351,7 +351,7 @@ Verify that the combining the `py:for` directive with `py:strip` works correctly. """ - tmpl = Template("""<doc xmlns:py="http://markup.edgewall.org/"> + tmpl = Template("""<doc xmlns:py="http://genshi.edgewall.org/"> <div py:for="item in items" py:strip=""> <b>${item}</b> </div> @@ -368,7 +368,7 @@ """ Verify that the directive can also be used as an element. """ - tmpl = Template("""<doc xmlns:py="http://markup.edgewall.org/"> + tmpl = Template("""<doc xmlns:py="http://genshi.edgewall.org/"> <py:for each="item in items"> <b>${item}</b> </py:for> @@ -385,7 +385,7 @@ """ Verify that assignment to tuples works correctly. """ - tmpl = Template("""<doc xmlns:py="http://markup.edgewall.org/"> + tmpl = Template("""<doc xmlns:py="http://genshi.edgewall.org/"> <py:for each="k, v in items"> <p>key=$k, value=$v</p> </py:for> @@ -399,7 +399,7 @@ """ Verify that assignment to nested tuples works correctly. """ - tmpl = Template("""<doc xmlns:py="http://markup.edgewall.org/"> + tmpl = Template("""<doc xmlns:py="http://genshi.edgewall.org/"> <py:for each="idx, (k, v) in items"> <p>$idx: key=$k, value=$v</p> </py:for> @@ -418,7 +418,7 @@ Verify that the combining the `py:if` directive with `py:strip` works correctly. """ - tmpl = Template("""<doc xmlns:py="http://markup.edgewall.org/"> + tmpl = Template("""<doc xmlns:py="http://genshi.edgewall.org/"> <b py:if="foo" py:strip="">${bar}</b> </doc>""") self.assertEqual("""<doc> @@ -429,7 +429,7 @@ """ Verify that the directive can also be used as an element. """ - tmpl = Template("""<doc xmlns:py="http://markup.edgewall.org/"> + tmpl = Template("""<doc xmlns:py="http://genshi.edgewall.org/"> <py:if test="foo">${bar}</py:if> </doc>""") self.assertEqual("""<doc> @@ -445,7 +445,7 @@ Verify that a match template can produce the same kind of element that it matched without entering an infinite recursion. """ - tmpl = Template("""<doc xmlns:py="http://markup.edgewall.org/"> + tmpl = Template("""<doc xmlns:py="http://genshi.edgewall.org/"> <elem py:match="elem" py:strip=""> <div class="elem">${select('text()')}</div> </elem> @@ -460,7 +460,7 @@ Verify that a match template can produce the same kind of element that it matched without entering an infinite recursion. """ - tmpl = Template("""<doc xmlns:py="http://markup.edgewall.org/"> + tmpl = Template("""<doc xmlns:py="http://genshi.edgewall.org/"> <elem py:match="elem"> <div class="elem">${select('text()')}</div> </elem> @@ -476,7 +476,7 @@ """ Verify that the directive can also be used as an element. """ - tmpl = Template("""<doc xmlns:py="http://markup.edgewall.org/"> + tmpl = Template("""<doc xmlns:py="http://genshi.edgewall.org/"> <py:match path="elem"> <div class="elem">${select('text()')}</div> </py:match> @@ -491,7 +491,7 @@ Match directives are applied recursively, meaning that they are also applied to any content they may have produced themselves: """ - tmpl = Template("""<doc xmlns:py="http://markup.edgewall.org/"> + tmpl = Template("""<doc xmlns:py="http://genshi.edgewall.org/"> <elem py:match="elem"> <div class="elem"> ${select('*')} @@ -522,7 +522,7 @@ themselves output the element they match, avoiding recursion is even more complex, but should work. """ - tmpl = Template("""<html xmlns:py="http://markup.edgewall.org/"> + tmpl = Template("""<html xmlns:py="http://genshi.edgewall.org/"> <body py:match="body"> <div id="header"/> ${select('*')} @@ -543,7 +543,7 @@ </html>""", str(tmpl.generate())) def test_select_all_attrs(self): - tmpl = Template("""<doc xmlns:py="http://markup.edgewall.org/"> + tmpl = Template("""<doc xmlns:py="http://genshi.edgewall.org/"> <div py:match="elem" py:attrs="select('@*')"> ${select('text()')} </div> @@ -556,7 +556,7 @@ </doc>""", str(tmpl.generate())) def test_select_all_attrs_empty(self): - tmpl = Template("""<doc xmlns:py="http://markup.edgewall.org/"> + tmpl = Template("""<doc xmlns:py="http://genshi.edgewall.org/"> <div py:match="elem" py:attrs="select('@*')"> ${select('text()')} </div> @@ -569,7 +569,7 @@ </doc>""", str(tmpl.generate())) def test_select_all_attrs_in_body(self): - tmpl = Template("""<doc xmlns:py="http://markup.edgewall.org/"> + tmpl = Template("""<doc xmlns:py="http://genshi.edgewall.org/"> <div py:match="elem"> Hey ${select('text()')} ${select('@*')} </div> @@ -582,7 +582,7 @@ </doc>""", str(tmpl.generate())) def test_def_in_match(self): - tmpl = Template("""<doc xmlns:py="http://markup.edgewall.org/"> + tmpl = Template("""<doc xmlns:py="http://genshi.edgewall.org/"> <py:def function="maketitle(test)"><b py:replace="test" /></py:def> <head py:match="head">${select('*')}</head> <head><title>${maketitle(True)}</title></head> @@ -592,7 +592,7 @@ </doc>""", str(tmpl.generate())) def test_match_with_xpath_variable(self): - tmpl = Template("""<div xmlns:py="http://markup.edgewall.org/"> + tmpl = Template("""<div xmlns:py="http://genshi.edgewall.org/"> <span py:match="*[name()=$tagname]"> Hello ${select('@name')} </span> @@ -608,7 +608,7 @@ </div>""", str(tmpl.generate(tagname='sayhello'))) def test_content_directive_in_match(self): - tmpl = Template("""<html xmlns:py="http://markup.edgewall.org/"> + tmpl = Template("""<html xmlns:py="http://genshi.edgewall.org/"> <div py:match="foo">I said <q py:content="select('text()')">something</q>.</div> <foo>bar</foo> </html>""") @@ -617,7 +617,7 @@ </html>""", str(tmpl.generate())) def test_cascaded_matches(self): - tmpl = Template("""<html xmlns:py="http://markup.edgewall.org/"> + tmpl = Template("""<html xmlns:py="http://genshi.edgewall.org/"> <body py:match="body">${select('*')}</body> <head py:match="head">${select('title')}</head> <body py:match="body">${select('*')}<hr /></body> @@ -630,7 +630,7 @@ </html>""", str(tmpl.generate())) def test_multiple_matches(self): - tmpl = Template("""<html xmlns:py="http://markup.edgewall.org/"> + tmpl = Template("""<html xmlns:py="http://genshi.edgewall.org/"> <input py:match="form//input" py:attrs="select('@*')" value="${values[str(select('@name'))]}" /> <form><p py:for="field in fields"> @@ -661,7 +661,7 @@ # FIXME #def test_match_after_step(self): - # tmpl = Template("""<div xmlns:py="http://markup.edgewall.org/"> + # tmpl = Template("""<div xmlns:py="http://genshi.edgewall.org/"> # <span py:match="div/greeting"> # Hello ${select('@name')} # </span> @@ -678,7 +678,7 @@ """Tests for the `py:strip` template directive.""" def test_strip_false(self): - tmpl = Template("""<div xmlns:py="http://markup.edgewall.org/"> + tmpl = Template("""<div xmlns:py="http://genshi.edgewall.org/"> <div py:strip="False"><b>foo</b></div> </div>""") self.assertEqual("""<div> @@ -686,7 +686,7 @@ </div>""", str(tmpl.generate())) def test_strip_empty(self): - tmpl = Template("""<div xmlns:py="http://markup.edgewall.org/"> + tmpl = Template("""<div xmlns:py="http://genshi.edgewall.org/"> <div py:strip=""><b>foo</b></div> </div>""") self.assertEqual("""<div> @@ -698,7 +698,7 @@ """Tests for the `py:with` template directive.""" def test_shadowing(self): - tmpl = Template("""<div xmlns:py="http://markup.edgewall.org/"> + tmpl = Template("""<div xmlns:py="http://genshi.edgewall.org/"> ${x} <span py:with="x = x * 2" py:replace="x"/> ${x} @@ -710,7 +710,7 @@ </div>""", str(tmpl.generate(x=42))) def test_as_element(self): - tmpl = Template("""<div xmlns:py="http://markup.edgewall.org/"> + tmpl = Template("""<div xmlns:py="http://genshi.edgewall.org/"> <py:with vars="x = x * 2">${x}</py:with> </div>""") self.assertEqual("""<div> @@ -718,7 +718,7 @@ </div>""", str(tmpl.generate(x=42))) def test_multiple_vars_same_name(self): - tmpl = Template("""<div xmlns:py="http://markup.edgewall.org/"> + tmpl = Template("""<div xmlns:py="http://genshi.edgewall.org/"> <py:with vars=" foo = 'bar'; foo = foo.replace('r', 'z') @@ -731,7 +731,7 @@ </div>""", str(tmpl.generate(x=42))) def test_multiple_vars_single_assignment(self): - tmpl = Template("""<div xmlns:py="http://markup.edgewall.org/"> + tmpl = Template("""<div xmlns:py="http://genshi.edgewall.org/"> <py:with vars="x = y = z = 1">${x} ${y} ${z}</py:with> </div>""") self.assertEqual("""<div> @@ -739,7 +739,7 @@ </div>""", str(tmpl.generate(x=42))) def test_nested_vars_single_assignment(self): - tmpl = Template("""<div xmlns:py="http://markup.edgewall.org/"> + tmpl = Template("""<div xmlns:py="http://genshi.edgewall.org/"> <py:with vars="x, (y, z) = (1, (2, 3))">${x} ${y} ${z}</py:with> </div>""") self.assertEqual("""<div> @@ -747,7 +747,7 @@ </div>""", str(tmpl.generate(x=42))) def test_multiple_vars_trailing_semicolon(self): - tmpl = Template("""<div xmlns:py="http://markup.edgewall.org/"> + tmpl = Template("""<div xmlns:py="http://genshi.edgewall.org/"> <py:with vars="x = x * 2; y = x / 2;">${x} ${y}</py:with> </div>""") self.assertEqual("""<div> @@ -755,7 +755,7 @@ </div>""", str(tmpl.generate(x=42))) def test_semicolon_escape(self): - tmpl = Template("""<div xmlns:py="http://markup.edgewall.org/"> + tmpl = Template("""<div xmlns:py="http://genshi.edgewall.org/"> <py:with vars="x = 'here is a semicolon: ;'; y = 'here are two semicolons: ;;' ;"> ${x} ${y} @@ -843,7 +843,7 @@ self.assertEqual('<root attr=""/>', str(tmpl.generate())) def test_bad_directive_error(self): - xml = '<p xmlns:py="http://markup.edgewall.org/" py:do="nothing" />' + xml = '<p xmlns:py="http://genshi.edgewall.org/" py:do="nothing" />' try: tmpl = Template(xml, filename='test.html') except BadDirectiveError, e: @@ -852,7 +852,7 @@ self.assertEqual(1, e.lineno) def test_directive_value_syntax_error(self): - xml = """<p xmlns:py="http://markup.edgewall.org/" py:if="bar'" />""" + xml = """<p xmlns:py="http://genshi.edgewall.org/" py:if="bar'" />""" try: tmpl = Template(xml, filename='test.html') self.fail('Expected SyntaxError') @@ -892,7 +892,7 @@ Verify that outputting context data that is a `Markup` instance is not escaped. """ - tmpl = Template("""<div xmlns:py="http://markup.edgewall.org/"> + tmpl = Template("""<div xmlns:py="http://genshi.edgewall.org/"> $myvar </div>""") self.assertEqual("""<div> @@ -903,7 +903,7 @@ """ Verify that outputting context data in text nodes doesn't escape quotes. """ - tmpl = Template("""<div xmlns:py="http://markup.edgewall.org/"> + tmpl = Template("""<div xmlns:py="http://genshi.edgewall.org/"> $myvar </div>""") self.assertEqual("""<div> @@ -914,7 +914,7 @@ """ Verify that outputting context data in attribtes escapes quotes. """ - tmpl = Template("""<div xmlns:py="http://markup.edgewall.org/"> + tmpl = Template("""<div xmlns:py="http://genshi.edgewall.org/"> <elem class="$myvar"/> </div>""") self.assertEqual("""<div> @@ -922,7 +922,7 @@ </div>""", str(tmpl.generate(myvar='"foo"'))) def test_directive_element(self): - tmpl = Template("""<div xmlns:py="http://markup.edgewall.org/"> + tmpl = Template("""<div xmlns:py="http://genshi.edgewall.org/"> <py:if test="myvar">bar</py:if> </div>""") self.assertEqual("""<div> @@ -930,7 +930,7 @@ </div>""", str(tmpl.generate(myvar='"foo"'))) def test_normal_comment(self): - tmpl = Template("""<div xmlns:py="http://markup.edgewall.org/"> + tmpl = Template("""<div xmlns:py="http://genshi.edgewall.org/"> <!-- foo bar --> </div>""") self.assertEqual("""<div> @@ -938,7 +938,7 @@ </div>""", str(tmpl.generate())) def test_template_comment(self): - tmpl = Template("""<div xmlns:py="http://markup.edgewall.org/"> + tmpl = Template("""<div xmlns:py="http://genshi.edgewall.org/"> <!-- !foo --> <!--!bar--> </div>""")
--- a/setup.py +++ b/setup.py @@ -6,11 +6,11 @@ # # This software is licensed as described in the file COPYING, which # you should have received as part of this distribution. The terms -# are also available at http://markup.edgewall.org/wiki/License. +# are also available at http://genshi.edgewall.org/wiki/License. # # This software consists of voluntary contributions made by many # individuals. For the exact contribution history, see the revision -# history and logs, available at http://markup.edgewall.org/log/. +# history and logs, available at http://genshi.edgewall.org/log/. try: from setuptools import setup @@ -18,18 +18,19 @@ from distutils.core import setup setup( - name = 'Markup', + name = 'Genshi', version = '0.3', - description = 'Toolkit for stream-based generation of markup for the web', + description = 'A toolkit for stream-based generation of output for the web', long_description = \ -"""Markup is a Python library that provides an integrated set of components for -parsing, generating, and processing HTML or XML content in a uniform manner. -The major feature is a template language that is heavily inspired by Kid.""", +"""Genshi is a Python library that provides an integrated set of components +for parsing, generating, and processing HTML, XML or other textual content for +output generation on the web. The major feature is a template language, which +is heavily inspired by Kid.""", author = 'Edgewall Software', author_email = 'info@edgewall.org', license = 'BSD', - url = 'http://markup.edgewall.org/', - download_url = 'http://markup.edgewall.org/wiki/MarkupDownload', + url = 'http://genshi.edgewall.org/', + download_url = 'http://genshi.edgewall.org/wiki/GenshiDownload', zip_safe = True, classifiers = [ @@ -45,12 +46,12 @@ 'Topic :: Text Processing :: Markup :: XML' ], keywords = ['python.templating.engines'], - packages = ['markup'], - test_suite = 'markup.tests.suite', + packages = ['genshi'], + test_suite = 'genshi.tests.suite', extras_require = {'plugin': ['setuptools>=0.6a2']}, entry_points = """ [python.templating.engines] - markup = markup.plugin:TemplateEnginePlugin[plugin] + genshi = genshi.plugin:TemplateEnginePlugin[plugin] """, )