| 1 | |
|---|
| 2 | |
|---|
| 3 | import sys, os |
|---|
| 4 | import doctest, unittest |
|---|
| 5 | |
|---|
| 6 | if __name__ == '__main__': |
|---|
| 7 | |
|---|
| 8 | sys.path.insert ( 0, os.path.abspath ( '../..' ) ) |
|---|
| 9 | import breve |
|---|
| 10 | |
|---|
| 11 | from breve.tags.html import tags as T |
|---|
| 12 | from breve.tags.entities import entities as E |
|---|
| 13 | from breve.tags import macro, assign, xml, test, let |
|---|
| 14 | from breve.flatten import flatten |
|---|
| 15 | from breve.util import Namespace |
|---|
| 16 | from breve.tests.lib import my_name |
|---|
| 17 | |
|---|
| 18 | |
|---|
| 19 | class MacrosTestCase ( unittest.TestCase ): |
|---|
| 20 | |
|---|
| 21 | def test_autotable_macro ( self ): |
|---|
| 22 | '''test autotable macro''' |
|---|
| 23 | |
|---|
| 24 | data = [ |
|---|
| 25 | [ 'One', 'Two', 'Three', 'Four' ], |
|---|
| 26 | range ( 0, 4 ), |
|---|
| 27 | range ( 4, 8 ), |
|---|
| 28 | range ( 8, 12 ) |
|---|
| 29 | ] |
|---|
| 30 | |
|---|
| 31 | template = ( |
|---|
| 32 | macro ( 'AutoTable', lambda data, header=False: ( |
|---|
| 33 | assign ( 'alts', [ 'even', 'odd' ] ), |
|---|
| 34 | data and ( |
|---|
| 35 | T.table ( class_='autotable' ) [ |
|---|
| 36 | header and ( |
|---|
| 37 | T.thead [ [ T.th [ _col ] for _col in data [ 0 ] ] ] |
|---|
| 38 | ), |
|---|
| 39 | T.tbody [ |
|---|
| 40 | [ T.tr ( class_='row-%s' % alts [ _rx % 2 ] ) [ |
|---|
| 41 | [ T.td ( class_='col-%s' % alts [ _cx % 2 ] ) [ _col ] |
|---|
| 42 | for _cx, _col in enumerate ( _row ) ] |
|---|
| 43 | ] for _rx, _row in enumerate ( data [ int ( header ): ] ) ] |
|---|
| 44 | ] |
|---|
| 45 | ] |
|---|
| 46 | ) or '' |
|---|
| 47 | ) ), |
|---|
| 48 | |
|---|
| 49 | T.html [ |
|---|
| 50 | T.head [ T.title [ my_name ( ) ] ], |
|---|
| 51 | T.body [ |
|---|
| 52 | AutoTable ( data, header=True ) |
|---|
| 53 | ] |
|---|
| 54 | ] |
|---|
| 55 | ) |
|---|
| 56 | output = flatten ( template ) |
|---|
| 57 | self.assertEqual ( |
|---|
| 58 | output, |
|---|
| 59 | ( u'<html><head><title>test_autotable_macro</title></head>' |
|---|
| 60 | u'<body><table class="autotable"><thead><th>One</th><th>Two</th><th>Three</th><th>Four</th></thead>' |
|---|
| 61 | u'<tbody><tr class="row-even"><td class="col-even">0</td><td class="col-odd">1</td>' |
|---|
| 62 | u'<td class="col-even">2</td><td class="col-odd">3</td></tr>' |
|---|
| 63 | u'<tr class="row-odd"><td class="col-even">4</td><td class="col-odd">5</td><td class="col-even">6</td>' |
|---|
| 64 | u'<td class="col-odd">7</td></tr>' |
|---|
| 65 | u'<tr class="row-even"><td class="col-even">8</td><td class="col-odd">9</td>' |
|---|
| 66 | u'<td class="col-even">10</td><td class="col-odd">11</td></tr></tbody>' |
|---|
| 67 | u'</table></body></html>' ) |
|---|
| 68 | ) |
|---|
| 69 | |
|---|
| 70 | def test_autolist_macro ( self ): |
|---|
| 71 | '''test autolist macro''' |
|---|
| 72 | |
|---|
| 73 | data = [ "Item %s" % _i for _i in range ( 1,9 ) ] |
|---|
| 74 | |
|---|
| 75 | template = ( |
|---|
| 76 | macro ( 'AutoList', lambda data: |
|---|
| 77 | data and ( |
|---|
| 78 | T.ul ( class_='autolist' ) [ |
|---|
| 79 | [ T.li [ _i ] for _i in data ] |
|---|
| 80 | ] |
|---|
| 81 | ) or '' |
|---|
| 82 | ), |
|---|
| 83 | T.html [ |
|---|
| 84 | T.head [ T.title [ my_name ( ) ] ], |
|---|
| 85 | T.body [ AutoList ( data ) ] |
|---|
| 86 | ] |
|---|
| 87 | ) |
|---|
| 88 | output = flatten ( template ) |
|---|
| 89 | self.assertEqual ( |
|---|
| 90 | output, |
|---|
| 91 | ( u'<html><head><title>test_autolist_macro</title></head>' |
|---|
| 92 | u'<body><ul class="autolist"><li>Item 1</li><li>Item 2</li>' |
|---|
| 93 | u'<li>Item 3</li><li>Item 4</li><li>Item 5</li><li>Item 6</li>' |
|---|
| 94 | u'<li>Item 7</li><li>Item 8</li></ul></body></html>' ) |
|---|
| 95 | ) |
|---|
| 96 | |
|---|
| 97 | def test_autolist_macro ( self ): |
|---|
| 98 | '''test autolist macro''' |
|---|
| 99 | |
|---|
| 100 | sublist1 = [ "List 1:%s" % _i for _i in range ( 3 ) ] |
|---|
| 101 | sublist2 = [ "List 2:%s" % _i for _i in range ( 3, 6 ) ] |
|---|
| 102 | sublist3 = [ "List 3:%s" % _i for _i in range ( 6, 9 ) ] |
|---|
| 103 | sublist3.append ( sublist2 ) |
|---|
| 104 | |
|---|
| 105 | data = [ |
|---|
| 106 | 'Item A', 'Item B', 'Item C', |
|---|
| 107 | sublist1, |
|---|
| 108 | 'Item D', 'Item E', 'Item F', |
|---|
| 109 | sublist3, |
|---|
| 110 | ] |
|---|
| 111 | template = ( |
|---|
| 112 | macro ( 'AutoList', lambda data, level=0: |
|---|
| 113 | data and ( |
|---|
| 114 | T.ul ( class_='autolist level-%s' % level ) [ |
|---|
| 115 | [ T.li [ |
|---|
| 116 | [ lambda _i, _j: _i, AutoList ] |
|---|
| 117 | [ isinstance ( _i, list ) ]( _i, level + 1 ) |
|---|
| 118 | ] |
|---|
| 119 | for _i in data ] |
|---|
| 120 | ] |
|---|
| 121 | ) or '' |
|---|
| 122 | ), |
|---|
| 123 | |
|---|
| 124 | T.html [ |
|---|
| 125 | T.head [ T.title [ my_name ( ) ] ], |
|---|
| 126 | T.body [ AutoList ( data ) ] |
|---|
| 127 | ] |
|---|
| 128 | ) |
|---|
| 129 | output = flatten ( template ) |
|---|
| 130 | self.assertEqual ( |
|---|
| 131 | output, |
|---|
| 132 | ( u'<html><head><title>test_autolist_macro</title></head>' |
|---|
| 133 | u'<body><ul class="autolist level-0"><li>Item A</li>' |
|---|
| 134 | u'<li>Item B</li><li>Item C</li><li><ul class="autolist level-1">' |
|---|
| 135 | u'<li>List 1:0</li><li>List 1:1</li><li>List 1:2</li></ul></li>' |
|---|
| 136 | u'<li>Item D</li><li>Item E</li><li>Item F</li><li>' |
|---|
| 137 | u'<ul class="autolist level-1"><li>List 3:6</li>' |
|---|
| 138 | u'<li>List 3:7</li><li>List 3:8</li><li><ul class="autolist level-2">' |
|---|
| 139 | u'<li>List 2:3</li><li>List 2:4</li><li>List 2:5</li></ul>' |
|---|
| 140 | u'</li></ul></li></ul></body></html>' ) |
|---|
| 141 | ) |
|---|
| 142 | |
|---|
| 143 | def test_toc_macro ( self ): |
|---|
| 144 | '''test table-of-contents macro''' |
|---|
| 145 | |
|---|
| 146 | template = ( |
|---|
| 147 | assign ( 'TOC', [ ] ), |
|---|
| 148 | macro ( 'TableOfContents', lambda matchtags, tag: ( |
|---|
| 149 | macro ( 'toc_search', lambda tag, is_tag: |
|---|
| 150 | tag.name in matchtags and ( |
|---|
| 151 | TOC.append ( T.a ( href='#toc-%s' % tag.children [ 0 ] ) [ tag.children [ 0 ] ] ), |
|---|
| 152 | tag.attrs.update ( { 'class': 'chapter-%s' % tag.name } ), |
|---|
| 153 | tag.children.insert ( 0, T.a ( name='toc-%s' % tag.children [ 0 ] ) [ tag.name ] ) |
|---|
| 154 | ) or True |
|---|
| 155 | ), |
|---|
| 156 | tag.walk ( toc_search, True ) |
|---|
| 157 | ) ), |
|---|
| 158 | |
|---|
| 159 | T.html [ |
|---|
| 160 | T.head [ T.title [ my_name ( ) ] ], |
|---|
| 161 | T.body [ |
|---|
| 162 | T.div ( id='TableOfContents' ) [ |
|---|
| 163 | 'Table of Contents', |
|---|
| 164 | lambda: T.ul [ [ T.li [ _t ] for _t in TOC ] ] |
|---|
| 165 | ], |
|---|
| 166 | TableOfContents ( ( 'h1', 'h2', 'h3' ), T.div [ |
|---|
| 167 | T.h1 [ 'Chapter 1' ], |
|---|
| 168 | T.div [ 'chapter 1 content' ], |
|---|
| 169 | T.h1 [ 'Chapter 2' ], |
|---|
| 170 | T.div [ |
|---|
| 171 | 'chapter 2 content', |
|---|
| 172 | T.h2 [ 'Chapter 2 subsection' ], |
|---|
| 173 | T.div [ |
|---|
| 174 | 'chapter 2 subsection content' |
|---|
| 175 | ] |
|---|
| 176 | ] |
|---|
| 177 | ] ) |
|---|
| 178 | ] |
|---|
| 179 | ] |
|---|
| 180 | ) |
|---|
| 181 | |
|---|
| 182 | actual = flatten ( template ) |
|---|
| 183 | |
|---|
| 184 | |
|---|
| 185 | |
|---|
| 186 | def suite ( ): |
|---|
| 187 | suite = unittest.TestSuite ( ) |
|---|
| 188 | |
|---|
| 189 | suite.addTest ( unittest.makeSuite ( MacrosTestCase, 'test' ) ) |
|---|
| 190 | |
|---|
| 191 | return suite |
|---|
| 192 | |
|---|
| 193 | if __name__ == '__main__': |
|---|
| 194 | unittest.main ( defaultTest = 'suite' ) |
|---|