textile-2.1.5/ 0000755 0000765 0000024 00000000000 11560135413 013074 5 ustar cwd staff 0000000 0000000 textile-2.1.5/PKG-INFO 0000644 0000765 0000024 00000001172 11560135413 014172 0 ustar cwd staff 0000000 0000000 Metadata-Version: 1.0
Name: textile
Version: 2.1.5
Summary: Textile processing for python.
Home-page: http://github.com/chrisdrackett/python-textile
Author: Chris Drackett
Author-email: chris@chrisdrackett.com
License: UNKNOWN
Description: UNKNOWN
Keywords: textile,text
Platform: UNKNOWN
Classifier: Development Status :: 3 - Alpha
Classifier: Environment :: Web Environment
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: BSD License
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python
Classifier: Topic :: Software Development :: Libraries :: Python Modules
textile-2.1.5/setup.cfg 0000644 0000765 0000024 00000000263 11560135413 014716 0 ustar cwd staff 0000000 0000000 [nosetests]
detailed-errors = 1
with-coverage = 1
cover-package = textile
cover-erase = 1
with-doctest = 1
with-id = 1
[egg_info]
tag_build =
tag_date = 0
tag_svn_revision = 0
textile-2.1.5/setup.py 0000644 0000765 0000024 00000001501 11560135411 014601 0 ustar cwd staff 0000000 0000000 from setuptools import setup, find_packages
version = '2.1.5'
setup(
name='textile',
version=version,
description='Textile processing for python.',
author='Chris Drackett',
author_email='chris@chrisdrackett.com',
url='http://github.com/chrisdrackett/python-textile',
packages=find_packages(),
classifiers=[
'Development Status :: 3 - Alpha',
'Environment :: Web Environment',
'Intended Audience :: Developers',
'License :: OSI Approved :: BSD License',
'Operating System :: OS Independent',
'Programming Language :: Python',
'Topic :: Software Development :: Libraries :: Python Modules',
],
keywords='textile,text',
test_suite = 'nose.collector',
tests_require = ['nose'],
include_package_data=True,
zip_safe=False,
)
textile-2.1.5/textile/ 0000755 0000765 0000024 00000000000 11560135413 014552 5 ustar cwd staff 0000000 0000000 textile-2.1.5/textile/__init__.py 0000644 0000765 0000024 00000000150 11560133635 016663 0 ustar cwd staff 0000000 0000000 from functions import textile, textile_restricted, Textile
__all__ = ['textile', 'textile_restricted']
textile-2.1.5/textile/functions.py 0000644 0000765 0000024 00000100524 11560133635 017142 0 ustar cwd staff 0000000 0000000 #!/usr/bin/env python
# -*- coding: utf-8 -*-
__copyright__ = """
Copyright (c) 2009, Jason Samsa, http://jsamsa.com/
Copyright (c) 2010, Kurt Raschke some textile foo bar biz baz ', 'Hello BlockQuote', ' ', 'Hello BlockQuote', ' " % atts
c2 = " Cat's Cradle by Vonnegut Cat’s Cradle by Vonnegut >>> import textile hello, world A single paragraph. Followed by another. I am very serious. I spoke. “Observe!” Observe — very nice! Observe – tiny and brief. Observe… Observe … Observe: 2 × 2. one™, two®, three©. An old text A block quotation. Any old text I believe every word. And then? She fell! I know. Cat’s Cradle by Vonnegut Convert with I’m You are a pleasant child. a 2 + b 2 = c 2 log 2 x I’m unaware of most soft drinks. I’m unaware An example Red here Red here Spacey blue rouge I seriously blushed align left align right centered justified left ident 1em left ident 2em right ident 3em\n\t\t
\n\n'
"""
text = text + "\n\n"
pattern = re.compile(r'^(?:table(_?%(s)s%(a)s%(c)s)\. ?\n)?^(%(a)s%(c)s\.? ?\|.*\|)\n\n'
% {'s': self.table_span_re,
'a': self.align_re,
'c': self.c},
re.S | re.M | re.U)
return pattern.sub(self.fTable, text)
def fTable(self, match):
tatts = self.pba(match.group(1), 'table')
rows = []
for row in [x for x in match.group(2).split('\n') if x]:
rmtch = re.search(r'^(%s%s\. )(.*)'
% (self.align_re, self.c), row.lstrip())
if rmtch:
ratts = self.pba(rmtch.group(1), 'tr')
row = rmtch.group(2)
else:
ratts = ''
cells = []
for cell in row.split('|')[1:-1]:
ctyp = 'd'
if re.search(r'^_', cell):
ctyp = "h"
cmtch = re.search(r'^(_?%s%s%s\. )(.*)'
% (self.table_span_re,
self.align_re,
self.c),
cell)
if cmtch:
catts = self.pba(cmtch.group(1), 'td')
cell = cmtch.group(2)
else:
catts = ''
cell = self.graf(self.span(cell))
cells.append('\t\t\t\n\t\t\t \n\t\tone \n\t\t\ttwo \n\t\t\tthree \n\t\t\n\t\t\t \n\ta \n\t\t\tb \n\t\t\tc \n\t\t\n%s\n\t\t "
% (ratts, '\n'.join(cells)))
cells = []
catts = None
return "\t\n%s\n\t
\n\n" % (tatts, '\n'.join(rows))
def lists(self, text):
"""
>>> t = Textile()
>>> t.lists("* one\\n* two\\n* three")
'\\t\\n\\t\\t
'
"""
#Replace line-initial bullets with asterisks
bullet_pattern = re.compile(u'^•', re.U | re.M)
pattern = re.compile(r'^([#*]+%s .*)$(?![^#*])'
% self.c, re.U | re.M | re.S)
return pattern.sub(self.fList, bullet_pattern.sub('*', text))
def fList(self, match):
text = match.group(0).split("\n")
result = []
lists = []
for i, line in enumerate(text):
try:
nextline = text[i + 1]
except IndexError:
nextline = ''
m = re.search(r"^([#*]+)(%s%s) (.*)$" % (self.align_re,
self.c), line, re.S)
if m:
tl, atts, content = m.groups()
nl = ''
nm = re.search(r'^([#*]+)\s.*', nextline)
if nm:
nl = nm.group(1)
if tl not in lists:
lists.append(tl)
atts = self.pba(atts)
line = "\t<%sl%s>\n\t\t
',
match.group(3))
else:
content = re.sub(r'(.+)(?:(?)|(?))\n(?![#*\s|])', '\\1
',
match.group(3))
return '<%s%s>%s%s' % (match.group(1), match.group(2),
content, match.group(4))
def block(self, text, head_offset=0):
"""
>>> t = Textile()
>>> t.block('h1. foobar baby')
'\\tfoobar baby
'
"""
if not self.lite:
tre = '|'.join(self.btag)
else:
tre = '|'.join(self.btag_lite)
text = text.split('\n\n')
tag = 'p'
atts = cite = graf = ext = ''
c1 = ''
out = []
anon = False
for line in text:
pattern = r'^(%s)(%s%s)\.(\.?)(?::(\S+))? (.*)$' % (tre,
self.align_re,
self.c)
match = re.search(pattern, line, re.S)
if match:
if ext:
out.append(out.pop() + c1)
tag, atts, ext, cite, graf = match.groups()
h_match = re.search(r'h([1-6])', tag)
if h_match:
head_level, = h_match.groups()
tag = 'h%i' % max(1,
min(int(head_level) + head_offset,
6))
o1, o2, content, c2, c1 = self.fBlock(tag, atts, ext,
cite, graf)
# leave off c1 if this block is extended,
# we'll close it at the start of the next block
if ext:
line = "%s%s%s%s" % (o1, o2, content, c2)
else:
line = "%s%s%s%s%s" % (o1, o2, content, c2, c1)
else:
anon = True
if ext or not re.search(r'^\s', line):
o1, o2, content, c2, c1 = self.fBlock(tag, atts, ext,
cite, line)
# skip $o1/$c1 because this is part of a continuing
# extended block
if tag == 'p' and not self.hasRawText(content):
line = content
else:
line = "%s%s%s" % (o2, content, c2)
else:
line = self.graf(line)
line = self.doPBr(line)
if self.html_type == 'xhtml':
line = re.sub(r'
', '
', line)
if ext and anon:
out.append(out.pop() + "\n" + line)
else:
out.append(line)
if not ext:
tag = 'p'
atts = ''
cite = ''
graf = ''
if ext:
out.append(out.pop() + c1)
return '\n\n'.join(out)
def fBlock(self, tag, atts, ext, cite, content):
"""
>>> t = Textile()
>>> t.fBlock("bq", "", None, "", "Hello BlockQuote")
('\\t\\n', '\\t\\t
')
>>> t.fBlock("bq", "", None, "http://google.com", "Hello BlockQuote")
('\\t\\n', '\\t\\t
')
>>> t.fBlock("bc", "", None, "", 'printf "Hello, World";') # doctest: +ELLIPSIS
('', '
')
>>> t.fBlock("h1", "", None, "", "foobar")
('', '\\t', ..., '
', '', 'foobar', '
', '')
"""
atts = self.pba(atts)
o1 = o2 = c2 = c1 = ''
m = re.search(r'fn(\d+)', tag)
if m:
tag = 'p'
if m.group(1) in self.fn:
fnid = self.fn[m.group(1)]
else:
fnid = m.group(1)
atts = atts + ' id="fn%s"' % fnid
if atts.find('class=') < 0:
atts = atts + ' class="footnote"'
content = ('%s' % m.group(1)) + content
if tag == 'bq':
cite = self.checkRefs(cite)
if cite:
cite = ' cite="%s"' % cite
else:
cite = ''
o1 = "\t\n" % (cite, atts)
o2 = "\t\t
"
elif tag == 'bc':
o1 = "" % atts
o2 = "
"
content = self.shelve(self.encode_html(content.rstrip("\n") +
"\n"))
elif tag == 'notextile':
content = self.shelve(content)
o1 = o2 = ''
c1 = c2 = ''
elif tag == 'pre':
content = self.shelve(self.encode_html(content.rstrip("\n") +
"\n"))
o1 = "" % atts
c2 = "
"
c1 = "" % atts
o2 = c2 = ''
c1 = '
'
else:
o2 = "\t<%s%s>" % (tag, atts)
c2 = "%s>" % tag
content = self.graf(content)
return o1, o2, content, c2, c1
def footnoteRef(self, text):
"""
>>> t = Textile()
>>> t.footnoteRef('foo[1] ') # doctest: +ELLIPSIS
'foo1 '
"""
return re.compile(r'\b\[([0-9]+)\](\s)?', re.U).sub(self.footnoteID,
text)
def footnoteID(self, match):
footnoteNum, text = match.groups()
if footnoteNum not in self.fn:
self.fn[footnoteNum] = str(uuid.uuid4())
footnoteID = self.fn[footnoteNum]
if not text:
text = ''
return '%s%s' % (
footnoteID, footnoteNum, text)
def glyphs(self, text):
"""
>>> t = Textile()
>>> t.glyphs("apostrophe's")
'apostrophe’s'
>>> t.glyphs("back in '88")
'back in ’88'
>>> t.glyphs('foo ...')
'foo …'
>>> t.glyphs('--')
'—'
>>> t.glyphs('FooBar[tm]')
'FooBar™'
>>> t.glyphs("[\s\[{(]|[%s])? #leading text
" #opening quote
(?P
'
>>> t.image('!'
"""
pattern = re.compile(r"""
(?:[\[{])? # pre
\! # opening !
(\<|\=|\>)? # optional alignment atts
(%s) # optional style,class atts
(?:\. )? # optional dot-space
([^\s(!]+) # presume this is the src
\s? # optional space
(?:\(([^\)]+)\))? # optional title
\! # closing
(?::(\S+))? # optional href
(?:[\]}]|(?=\s|$)) # lookahead: space or end of string
""" % self.c, re.U | re.X)
return pattern.sub(self.fImage, text)
def fImage(self, match):
# (None, '', '/imgs/myphoto.jpg', None, None)
align, atts, url, title, href = match.groups()
atts = self.pba(atts)
if align:
atts = atts + ' style="%s"' % self.iAlign[align]
if title:
atts = atts + ' title="%s" alt="%s"' % (title, title)
else:
atts = atts + ' alt=""'
if not self.isRelURL(url) and self.get_sizes:
size = imagesize.getimagesize(url)
if size:
atts += " %s" % size
if href:
href = self.checkRefs(href)
url = self.checkRefs(url)
url = self.relURL(url)
out = []
if href:
out.append('' % href)
if self.html_type == 'html':
out.append('
' % (url, atts))
else:
out.append('
' % (url, atts))
if href:
out.append('')
return ''.join(out)
def code(self, text):
text = self.doSpecial(text, '
', '
', self.fCode)
text = self.doSpecial(text, '@', '@', self.fCode)
text = self.doSpecial(text, '', '
', self.fPre)
return text
def fCode(self, match):
before, text, after = match.groups()
if after == None:
after = ''
# text needs to be escaped
if not self.restricted:
text = self.encode_html(text, quotes=False)
return ''.join([before, self.shelve('%s
' % text), after])
def fPre(self, match):
before, text, after = match.groups()
if after == None:
after = ''
# text needs to be escaped
if not self.restricted:
text = self.encode_html(text)
return ''.join([before, '', self.shelve(text), '
', after])
def doSpecial(self, text, start, end, method):
pattern = re.compile(r'(^|\s|[\[({>])%s(.*?)%s(\s|$|[\])}])?'
% (re.escape(start), re.escape(end)), re.M | re.S)
return pattern.sub(method, text)
def noTextile(self, text):
text = self.doSpecial(text, '\nI am very serious.\n
',
'\t\nI am <b>very</b> serious.\n
'),
('I spoke.\nAnd none replied.', '\t
And none replied.Header 1
'),
('h2. Header 2', '\tHeader 2
'),
('h3. Header 3', '\tHeader 3
'),
('An old text\n\nbq. A block quotation.\n\nAny old text''',
'\t\n\t\t
\n\n\t
I really know.str(foo)
sure not sure.
of most soft drinks.
when I sprouted'
' that
corn stalk from my
cabeza.Bingo.
'),
('h3()>[no]{color:red}. Bingo', '\tBingo
'),
('\n
',
'\na.gsub!( /, "" )\n
\n\n
'),
('\na.gsub!( /</, "" )\n
\n
The main text of the
'
'page goes here and will
stay to the left of the
sidebar.
I searched Google.
'), ('I searched "a search engine (Google)":http://google.com.', '\tI searched a search engine.
'), ('I am crazy about "Hobix":hobix\nand "it\'s":hobix "all":hobix I ever\n"link to":hobix!\n\n[hobix]http://hobix.com', '\tI am crazy about Hobix
and it’s '
'all I ever
link to!
And others sat all round the small
machine and paid it to sing to them.
We use CSS.
'), ('|one|two|three|\n|a|b|c|', '\tone | \n\t\t\ttwo | \n\t\t\tthree | \n\t\t
a | \n\t\t\tb | \n\t\t\tc | \n\t\t
name | \n\t\t\tage | \n\t\t\tsex | \n\t\t
joan | \n\t\t\t24 | \n\t\t\tf | \n\t\t
archie | \n\t\t\t29 | \n\t\t\tm | \n\t\t
bella | \n\t\t\t45 | \n\t\t\tf | \n\t\t
name | \n\t\t\tage | \n\t\t\tsex | \n\t\t
---|---|---|
joan | \n\t\t\t24 | \n\t\t\tf | \n\t\t
archie | \n\t\t\t29 | \n\t\t\tm | \n\t\t
bella | \n\t\t\t45 | \n\t\t\tf | \n\t\t
Hello\n\nHello Again\n\n\n\t
normal text
'), ('this is in a pre tag', '
this is in a pre tag'), ('"test1":http://foo.com/bar--baz\n\n"test2":http://foo.com/bar---baz\n\n"test3":http://foo.com/bar-17-18-baz', '\t\n\n\t' '\n\n\t' ''), # ('"foo ==(bar)==":#foobar', '\t'), ('!http://render.mathim.com/A%5EtAx%20%3D%20A%5Et%28Ax%29.!', '\t
array[4] = 8
Links (like this), are now mangled in 2.1.0, whereas 2.0 parsed them correctly.
'), ('@monospaced text@, followed by text', '\tmonospaced text
, followed by text
some text
'), ('*:(foo)foo bar baz*','\tfoo bar baz
'), ('pre.. foo bar baz\nquux','foo bar baz\nquux\n'), ('line of text\n\n leading spaces','\t
line of text
\n\n leading spaces'), ('"some text":http://www.example.com/?q=foo%20bar and more text','\tsome text and more text
'), ('(??some text??)','\t(some text)
'), ('(*bold text*)','\t(bold text)
'), ('H[~2~]O','\tH2O
'), (u"p=. Où est l'école, l'église s'il vous plaît?", u"""\tOù est l’école, l’église s’il vous plaît?
"""), ("p=. *_The_* _*Prisoner*_", """\tThe Prisoner
"""), ("""p=. "An emphasised _word._" & "*A spanned phrase.*" """, """\t“An emphasised word.” & “A spanned phrase.”
"""), ("""p=. "*Here*'s a word!" """, """\t“Here’s a word!”
"""), ("""p=. "Please visit our "Textile Test Page":http://textile.sitemonks.com" """, """\t“Please visit our Textile Test Page”
"""), (u"""| Foreign EXPÓŅÉNTIAL |""", u"""\tForeign EXPÓŅÉNTIAL | \n\t\t\t\n\t\t |
Tell me, what is AJAX, please?
"""), ) # A few extra cases for HTML4 html_known_values = ( ('I spoke.\nAnd none replied.', '\tI spoke.
And none replied.
I know.
I really know.
I’m unaware
of most soft drinks.
I seriously blushed
when I sprouted'
' that
corn stalk from my
cabeza.
\n\na.gsub!( /, "" )\n
\n
',
'\n\na.gsub!( /</, "" )\n
\n
'),
('The main text of the
'
'page goes here and will
stay to the left of the
sidebar.
I am crazy about Hobix
and it’s '
'all I ever
link to!
And others sat all round the small
machine and paid it to sing to them.
quux
') ) def testKnownValuesXHTML(self): # XHTML for t, h in self.xhtml_known_values: yield self.check_textile, t, h, 'xhtml' def testKnownValuesHTML(self): # HTML4 for t, h in self.html_known_values: yield self.check_textile, t, h, 'html' def check_textile(self, input, expected_output, html_type): output = textile.textile(input, html_type=html_type) eq_(output, expected_output) class Tests(): def testFootnoteReference(self): html = textile.textile('YACC[1]') assert_true(re.search('^\tYACC1
', html)) def testFootnote(self): html = textile.textile('This is covered elsewhere[1].\n\nfn1. Down here, in fact.\n\nfn2. Here is another footnote.') assert_true(re.search('^\tThis is covered elsewhere1.
\n\n\t1Down here, in fact.
\n\n\t2Here is another footnote.
$', html)) def testURLWithHyphens(self): eq_(textile.textile('"foo":http://google.com/one--two'), '\t') def testIssue024TableColspan(self): eq_(textile.textile('|\\2. spans two cols |\n| col 1 | col 2 |'), '\tspans two cols | \n\t\t|
col 1 | \n\t\t\tcol 2 | \n\t\t
Hello\n\nAgain\n\n\n\t
normal text
') def testURLWithParens(self): text = '"python":http://en.wikipedia.org/wiki/Python_(programming_language)' expect = '\t' result = textile.textile(text) eq_(result, expect) def testTableWithHyphenStyles(self): text = 'table(linkblog-thumbnail).\n|(linkblog-thumbnail-cell). apple|bear|' expect = '\tapple | \n\t\t\tbear | \n\t\t
“z”
' eq_(result, expect) result = textile.textile('" z"') expect = '\t“ z”
' eq_(result, expect) def testIssue032(self): text = "|thing|||otherthing|" result = textile.textile(text) expect = "\tthing | \n\t\t\t\n\t\t\t | \n\t\t\t | otherthing | \n\t\t
test text
" eq_(result, expect) test = "_*test text*_" result = textile.textile(test) expect = "\ttest text
" eq_(result, expect) def testRestricted(self): test = "this is \"some\" *bold text*." result = textile.textile_restricted(test) expect = "\tthis is “some” bold text.
" eq_(result, expect) #Note that the HTML is escaped, thus rendering #the " result = textile.textile_restricted(test) expect = "\tHere is some text.
<script>alert('hello world’)</script>
'quoted string'
"
result = textile.textile(test)
expect = "\t'quoted string'
текст1
', re.U).search(html)) def testAutoLinking(self): test = "some text http://www.google.com" result = "\tsome text http://www.google.com
" expect = textile.textile(test, auto_link=True) eq_(result, expect) def testPre(self): test = "some preformatted textother text" result = "\t
some preformatted textother text" expect = textile.textile(test) eq_(result, expect) def testSanitize(self): try: import html5lib except ImportError: raise SkipTest() test = "a paragraph of benign text" result = "\t
a paragraph of benign text
" expect = textile.Textile().textile(test, sanitize=True) eq_(result, expect) test = """a paragraph of evil text
""" result = 'a paragraph of evil text
' expect = textile.Textile().textile(test, sanitize=True) eq_(result, expect) test = """a paragraph of benign text
and more text
a paragraph of benign text
and more text
some text here
' >>> f = TextileFactory(restricted=True) >>> f.process("more text here") '\\tmore text here
' Certain parameter values are not permitted because they are illogical: >>> f = TextileFactory(lite=True) Traceback (most recent call last): ... ValueError: lite can only be enabled in restricted mode >>> f = TextileFactory(head_offset=7) Traceback (most recent call last): ... ValueError: head_offset must be 0-6 >>> f = TextileFactory(html_type='html5') Traceback (most recent call last): ... ValueError: html_type must be 'html' or 'xhtml' """ def __init__(self, restricted=False, lite=False, sanitize=False, noimage=None, auto_link=False, get_sizes=False, head_offset=0, html_type='xhtml'): self.class_parms = {} self.method_parms = {} if lite and not restricted: raise ValueError("lite can only be enabled in restricted mode") if restricted: self.class_parms['restricted'] = True self.class_parms['lite'] = lite self.method_parms['rel'] = 'nofollow' if noimage is None: if restricted: noimage = True else: noimage = False self.class_parms['noimage'] = noimage self.method_parms['sanitize'] = sanitize self.class_parms['auto_link'] = auto_link self.class_parms['get_sizes'] = get_sizes if int(head_offset) not in range(0, 6): raise ValueError("head_offset must be 0-6") else: self.method_parms['head_offset'] = head_offset if html_type not in ['html', 'xhtml']: raise ValueError("html_type must be 'html' or 'xhtml'") else: self.method_parms['html_type'] = html_type def process(self, text): return Textile(**self.class_parms).textile(text, **self.method_parms) textile-2.1.5/textile/tools/ 0000755 0000765 0000024 00000000000 11560135413 015712 5 ustar cwd staff 0000000 0000000 textile-2.1.5/textile/tools/__init__.py 0000644 0000765 0000024 00000000000 11560133635 020015 0 ustar cwd staff 0000000 0000000 textile-2.1.5/textile/tools/imagesize.py 0000644 0000765 0000024 00000001744 11560133635 020253 0 ustar cwd staff 0000000 0000000 def getimagesize(url): """ Attempts to determine an image's width and height, and returns a string suitable for use in ana paragraph
","html") u'\\ta paragraph
' >>> sanitize("\\t", "xhtml") u"\\t<script>alert('evil script');</script>" """ try: import html5lib from html5lib import sanitizer, serializer, treewalkers, treebuilders except ImportError: raise Exception("html5lib not available") p = html5lib.HTMLParser(tokenizer=sanitizer.HTMLSanitizer) tree = p.parseFragment(string) walker = treewalkers.getTreeWalker("simpletree") stream = walker(tree) if html_type == 'xhtml': s = serializer.xhtmlserializer.XHTMLSerializer() else: s = serializer.htmlserializer.HTMLSerializer(omit_optional_tags=False, quote_attr_values=True) return s.render(stream) def setup_module(module): from nose.plugins.skip import SkipTest try: import html5lib except ImportError: raise SkipTest() textile-2.1.5/textile.egg-info/ 0000755 0000765 0000024 00000000000 11560135413 016244 5 ustar cwd staff 0000000 0000000 textile-2.1.5/textile.egg-info/dependency_links.txt 0000644 0000765 0000024 00000000001 11560135413 022312 0 ustar cwd staff 0000000 0000000 textile-2.1.5/textile.egg-info/not-zip-safe 0000644 0000765 0000024 00000000001 11560135267 020501 0 ustar cwd staff 0000000 0000000 textile-2.1.5/textile.egg-info/PKG-INFO 0000644 0000765 0000024 00000001172 11560135413 017342 0 ustar cwd staff 0000000 0000000 Metadata-Version: 1.0 Name: textile Version: 2.1.5 Summary: Textile processing for python. Home-page: http://github.com/chrisdrackett/python-textile Author: Chris Drackett Author-email: chris@chrisdrackett.com License: UNKNOWN Description: UNKNOWN Keywords: textile,text Platform: UNKNOWN Classifier: Development Status :: 3 - Alpha Classifier: Environment :: Web Environment Classifier: Intended Audience :: Developers Classifier: License :: OSI Approved :: BSD License Classifier: Operating System :: OS Independent Classifier: Programming Language :: Python Classifier: Topic :: Software Development :: Libraries :: Python Modules textile-2.1.5/textile.egg-info/SOURCES.txt 0000644 0000765 0000024 00000000531 11560135413 020127 0 ustar cwd staff 0000000 0000000 setup.cfg setup.py textile/__init__.py textile/functions.py textile/textilefactory.py textile.egg-info/PKG-INFO textile.egg-info/SOURCES.txt textile.egg-info/dependency_links.txt textile.egg-info/not-zip-safe textile.egg-info/top_level.txt textile/tests/__init__.py textile/tools/__init__.py textile/tools/imagesize.py textile/tools/sanitizer.py textile-2.1.5/textile.egg-info/top_level.txt 0000644 0000765 0000024 00000000010 11560135413 020765 0 ustar cwd staff 0000000 0000000 textile