IOWA 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (502) hide show
  1. checksums.yaml +7 -0
  2. data/CONTRIBUTORS +14 -0
  3. data/README.md +23 -0
  4. data/RELEASE_NOTES +77 -0
  5. data/ToDo +21 -0
  6. data/components/CRUDList/CRUDList.html +13 -0
  7. data/components/CRUDList/CRUDList.iwa +136 -0
  8. data/components/Content/Content.html +0 -0
  9. data/components/Content/Content.iwa +143 -0
  10. data/components/Content/example/README +9 -0
  11. data/components/Content/example/cgi/iowa.cgi +10 -0
  12. data/components/Content/example/demo.rb +30 -0
  13. data/components/Content/example/doc/index.html +7 -0
  14. data/components/Content/example/iowa/Content.html +1 -0
  15. data/components/Content/example/iowa/Content.iwa +1 -0
  16. data/components/Content/example/iowa/Main.html +6 -0
  17. data/components/Content/example/iowa/Main.iwa +3 -0
  18. data/components/Content/example/iowa/_content/body +7 -0
  19. data/components/Content/example/iowa/_content/body2 +3 -0
  20. data/components/Content/example/iowa/_content/title +2 -0
  21. data/components/Content/example/iowa/app.cnf +8 -0
  22. data/components/Content/example/iowa/app.rb +8 -0
  23. data/components/Content/example/webrick.rb +38 -0
  24. data/components/Include/Include.html +1 -0
  25. data/components/Include/Include.iwa +30 -0
  26. data/components/Include/readme +5 -0
  27. data/components/JumpTo/JumpTo.html +8 -0
  28. data/components/JumpTo/JumpTo.iwa +8 -0
  29. data/components/JumpTo/readme +6 -0
  30. data/doc/Architecture.txt +6 -0
  31. data/doc/History.txt +33 -0
  32. data/doc/StandardDispatcher.txt +19 -0
  33. data/examples/blog/README +1 -0
  34. data/examples/hello_world/README +17 -0
  35. data/examples/hello_world/htdocs/hello_world_html.html +24 -0
  36. data/examples/hello_world/htdocs/hello_world_ruby.html +41 -0
  37. data/examples/hello_world/iowa/HelloWorld.html +14 -0
  38. data/examples/hello_world/iowa/HelloWorld.iwa +31 -0
  39. data/examples/hello_world/iowa/Index.html +16 -0
  40. data/examples/hello_world/iowa/Index.iwa +5 -0
  41. data/examples/hello_world/iowa/iowa_hello_world.cnf +19 -0
  42. data/examples/hello_world/iowa/iowa_hello_world.rb +5 -0
  43. data/examples/hello_world/iowa/mapfile.cnf +6 -0
  44. data/examples/hw1/iowa/Main.html +1 -0
  45. data/examples/hw1/iowa/README +9 -0
  46. data/examples/hw1/iowa/hw.rb +4 -0
  47. data/examples/hw2/iowa/Main.html +10 -0
  48. data/examples/hw2/iowa/Main.iwa +7 -0
  49. data/examples/hw2/iowa/README +16 -0
  50. data/examples/hw2/iowa/hw.rb +4 -0
  51. data/examples/hw3/iowa/Main.html +11 -0
  52. data/examples/hw3/iowa/Main.iwa +7 -0
  53. data/examples/hw3/iowa/README +22 -0
  54. data/examples/hw3/iowa/hw.rb +4 -0
  55. data/examples/hw4/iowa/Greetings.html +10 -0
  56. data/examples/hw4/iowa/Greetings.iwa +9 -0
  57. data/examples/hw4/iowa/Main.html +12 -0
  58. data/examples/hw4/iowa/Main.iwa +10 -0
  59. data/examples/hw4/iowa/README +28 -0
  60. data/examples/hw4/iowa/hw.rb +4 -0
  61. data/examples/hw5/iowa/Footer.html +2 -0
  62. data/examples/hw5/iowa/Greetings.html +4 -0
  63. data/examples/hw5/iowa/Greetings.iwa +12 -0
  64. data/examples/hw5/iowa/Header.html +6 -0
  65. data/examples/hw5/iowa/Main.html +12 -0
  66. data/examples/hw5/iowa/Main.iwa +13 -0
  67. data/examples/hw5/iowa/README +16 -0
  68. data/examples/hw5/iowa/hw.rb +4 -0
  69. data/examples/template_server/iowa/Content.iwa +121 -0
  70. data/examples/template_server/iowa/Content.view +0 -0
  71. data/examples/template_server/iowa/DBContentDispatcher.rb +112 -0
  72. data/examples/template_server/iowa/DBContentPage.html +3 -0
  73. data/examples/template_server/iowa/DBContentPage.iwa +85 -0
  74. data/examples/template_server/iowa/app.cnf +13 -0
  75. data/examples/template_server/iowa/app.rb +5 -0
  76. data/ext/Classifier/classifier.c +256 -0
  77. data/ext/Classifier/ext_help.h +14 -0
  78. data/ext/Classifier/extconf.rb +5 -0
  79. data/ext/Classifier/tst.h +40 -0
  80. data/ext/Classifier/tst_cleanup.c +24 -0
  81. data/ext/Classifier/tst_delete.c +146 -0
  82. data/ext/Classifier/tst_grow_node_free_list.c +38 -0
  83. data/ext/Classifier/tst_init.c +41 -0
  84. data/ext/Classifier/tst_insert.c +192 -0
  85. data/ext/Classifier/tst_search.c +68 -0
  86. data/ext/http11/README +11 -0
  87. data/ext/http11/ext_help.h +15 -0
  88. data/ext/http11/extconf.rb +5 -0
  89. data/ext/http11/http11.c +534 -0
  90. data/ext/http11/http11.c.dif +422 -0
  91. data/ext/http11/http11_parser.c +1243 -0
  92. data/ext/http11/http11_parser.c.dif +193 -0
  93. data/ext/http11/http11_parser.h +49 -0
  94. data/ext/http11/http11_parser.h.dif +20 -0
  95. data/ext/http11/http11_parser.rl +192 -0
  96. data/ext/httpmachine/Makefile +149 -0
  97. data/ext/httpmachine/extconf.rb +33 -0
  98. data/ext/httpmachine/http.cpp +430 -0
  99. data/ext/httpmachine/http.h +156 -0
  100. data/ext/httpmachine/rubyhttp.cpp +165 -0
  101. data/external/mime-types/LICENCE +18 -0
  102. data/external/mime-types/README +46 -0
  103. data/external/mime-types/doc/classes/MIME.html +120 -0
  104. data/external/mime-types/doc/classes/MIME/InvalidContentType.html +119 -0
  105. data/external/mime-types/doc/classes/MIME/Type.html +866 -0
  106. data/external/mime-types/doc/classes/MIME/Type.src/M000010.html +22 -0
  107. data/external/mime-types/doc/classes/MIME/Type.src/M000011.html +18 -0
  108. data/external/mime-types/doc/classes/MIME/Type.src/M000012.html +19 -0
  109. data/external/mime-types/doc/classes/MIME/Type.src/M000013.html +18 -0
  110. data/external/mime-types/doc/classes/MIME/Type.src/M000014.html +26 -0
  111. data/external/mime-types/doc/classes/MIME/Type.src/M000015.html +33 -0
  112. data/external/mime-types/doc/classes/MIME/Type.src/M000016.html +27 -0
  113. data/external/mime-types/doc/classes/MIME/Type.src/M000017.html +35 -0
  114. data/external/mime-types/doc/classes/MIME/Type.src/M000018.html +34 -0
  115. data/external/mime-types/doc/classes/MIME/Type.src/M000019.html +24 -0
  116. data/external/mime-types/doc/classes/MIME/Type.src/M000020.html +38 -0
  117. data/external/mime-types/doc/classes/MIME/Type.src/M000021.html +22 -0
  118. data/external/mime-types/doc/classes/MIME/Type.src/M000022.html +18 -0
  119. data/external/mime-types/doc/classes/MIME/Type.src/M000023.html +18 -0
  120. data/external/mime-types/doc/classes/MIME/Type.src/M000024.html +18 -0
  121. data/external/mime-types/doc/classes/MIME/Type.src/M000025.html +18 -0
  122. data/external/mime-types/doc/classes/MIME/Type.src/M000026.html +18 -0
  123. data/external/mime-types/doc/classes/MIME/Type.src/M000027.html +18 -0
  124. data/external/mime-types/doc/classes/MIME/Type.src/M000028.html +18 -0
  125. data/external/mime-types/doc/classes/MIME/Type.src/M000029.html +18 -0
  126. data/external/mime-types/doc/classes/MIME/Type.src/M000030.html +19 -0
  127. data/external/mime-types/doc/classes/MIME/Type.src/M000031.html +26 -0
  128. data/external/mime-types/doc/classes/MIME/Types.html +459 -0
  129. data/external/mime-types/doc/classes/MIME/Types.src/M000001.html +19 -0
  130. data/external/mime-types/doc/classes/MIME/Types.src/M000002.html +32 -0
  131. data/external/mime-types/doc/classes/MIME/Types.src/M000003.html +21 -0
  132. data/external/mime-types/doc/classes/MIME/Types.src/M000004.html +18 -0
  133. data/external/mime-types/doc/classes/MIME/Types.src/M000005.html +26 -0
  134. data/external/mime-types/doc/classes/MIME/Types.src/M000006.html +18 -0
  135. data/external/mime-types/doc/classes/MIME/Types.src/M000007.html +18 -0
  136. data/external/mime-types/doc/classes/MIME/Types.src/M000008.html +18 -0
  137. data/external/mime-types/doc/classes/MIME/Types.src/M000009.html +18 -0
  138. data/external/mime-types/doc/created.rid +1 -0
  139. data/external/mime-types/doc/files/ChangeLog.html +320 -0
  140. data/external/mime-types/doc/files/README.html +145 -0
  141. data/external/mime-types/doc/files/lib/mime/types_rb.html +101 -0
  142. data/external/mime-types/doc/fr_class_index.html +30 -0
  143. data/external/mime-types/doc/fr_file_index.html +29 -0
  144. data/external/mime-types/doc/fr_method_index.html +57 -0
  145. data/external/mime-types/doc/index.html +24 -0
  146. data/external/mime-types/doc/rdoc-style.css +208 -0
  147. data/external/mime-types/lib/mime/types.rb +1558 -0
  148. data/external/package.rb +672 -0
  149. data/external/test_support.rb +95 -0
  150. data/external/tmail/README +7 -0
  151. data/external/tmail/tmail.rb +4 -0
  152. data/external/tmail/tmail/address.rb +222 -0
  153. data/external/tmail/tmail/base64.rb +52 -0
  154. data/external/tmail/tmail/compat.rb +39 -0
  155. data/external/tmail/tmail/config.rb +50 -0
  156. data/external/tmail/tmail/encode.rb +447 -0
  157. data/external/tmail/tmail/header.rb +895 -0
  158. data/external/tmail/tmail/info.rb +14 -0
  159. data/external/tmail/tmail/loader.rb +1 -0
  160. data/external/tmail/tmail/mail.rb +869 -0
  161. data/external/tmail/tmail/mailbox.rb +386 -0
  162. data/external/tmail/tmail/mbox.rb +1 -0
  163. data/external/tmail/tmail/net.rb +260 -0
  164. data/external/tmail/tmail/obsolete.rb +123 -0
  165. data/external/tmail/tmail/parser.rb +1475 -0
  166. data/external/tmail/tmail/parser.y +372 -0
  167. data/external/tmail/tmail/port.rb +356 -0
  168. data/external/tmail/tmail/scanner.rb +17 -0
  169. data/external/tmail/tmail/scanner_r.rb +243 -0
  170. data/external/tmail/tmail/stringio.rb +256 -0
  171. data/external/tmail/tmail/textutils.rb +197 -0
  172. data/external/tmail/tmail/tmail.rb +1 -0
  173. data/external/tmail/tmail/utils.rb +23 -0
  174. data/external/win32-process/README +133 -0
  175. data/external/win32-process/lib/win32/process.rb +561 -0
  176. data/external/windows-pr/README +145 -0
  177. data/external/windows-pr/doc/conversion_guide.txt +25 -0
  178. data/external/windows-pr/lib/windows/clipboard.rb +72 -0
  179. data/external/windows-pr/lib/windows/console.rb +323 -0
  180. data/external/windows-pr/lib/windows/device_io.rb +88 -0
  181. data/external/windows-pr/lib/windows/directory.rb +80 -0
  182. data/external/windows-pr/lib/windows/error.rb +313 -0
  183. data/external/windows-pr/lib/windows/eventlog.rb +120 -0
  184. data/external/windows-pr/lib/windows/file.rb +349 -0
  185. data/external/windows-pr/lib/windows/filesystem.rb +16 -0
  186. data/external/windows-pr/lib/windows/handle.rb +31 -0
  187. data/external/windows-pr/lib/windows/library.rb +76 -0
  188. data/external/windows-pr/lib/windows/limits.rb +13 -0
  189. data/external/windows-pr/lib/windows/memory.rb +117 -0
  190. data/external/windows-pr/lib/windows/msvcrt/buffer.rb +48 -0
  191. data/external/windows-pr/lib/windows/msvcrt/file.rb +18 -0
  192. data/external/windows-pr/lib/windows/msvcrt/string.rb +46 -0
  193. data/external/windows-pr/lib/windows/national.rb +557 -0
  194. data/external/windows-pr/lib/windows/path.rb +296 -0
  195. data/external/windows-pr/lib/windows/pipe.rb +77 -0
  196. data/external/windows-pr/lib/windows/process.rb +171 -0
  197. data/external/windows-pr/lib/windows/registry.rb +238 -0
  198. data/external/windows-pr/lib/windows/security.rb +89 -0
  199. data/external/windows-pr/lib/windows/service.rb +183 -0
  200. data/external/windows-pr/lib/windows/shell.rb +88 -0
  201. data/external/windows-pr/lib/windows/sound.rb +52 -0
  202. data/external/windows-pr/lib/windows/synchronize.rb +161 -0
  203. data/external/windows-pr/lib/windows/system_info.rb +70 -0
  204. data/external/windows-pr/lib/windows/unicode.rb +138 -0
  205. data/external/windows-pr/lib/windows/window.rb +22 -0
  206. data/iowa.gemspec +45 -0
  207. data/microprojects/DiskCache/LICENSE +28 -0
  208. data/microprojects/DiskCache/README +17 -0
  209. data/microprojects/DiskCache/external/package.rb +608 -0
  210. data/microprojects/DiskCache/external/test_support.rb +8 -0
  211. data/microprojects/DiskCache/setup.rb +22 -0
  212. data/microprojects/DiskCache/src/iowa/Association.rb +67 -0
  213. data/microprojects/DiskCache/src/iowa/Constants.rb +159 -0
  214. data/microprojects/DiskCache/src/iowa/DiskStore.rb +377 -0
  215. data/microprojects/DiskCache/src/iowa/Hash.rb +63 -0
  216. data/microprojects/DiskCache/src/iowa/Lockfile.rb +575 -0
  217. data/microprojects/DiskCache/src/iowa/Mutex.rb +142 -0
  218. data/microprojects/DiskCache/src/iowa/caches/DiskCache.rb +605 -0
  219. data/microprojects/DiskCache/src/iowa/caches/LRUCache.rb +287 -0
  220. data/microprojects/DiskCache/test/TC_DiskCache.rb +218 -0
  221. data/microprojects/LRUCache/LICENSE +28 -0
  222. data/microprojects/LRUCache/README +13 -0
  223. data/microprojects/LRUCache/external/package.rb +608 -0
  224. data/microprojects/LRUCache/external/test_support.rb +8 -0
  225. data/microprojects/LRUCache/setup.rb +22 -0
  226. data/microprojects/LRUCache/src/iowa/Association.rb +57 -0
  227. data/microprojects/LRUCache/src/iowa/Constants.rb +159 -0
  228. data/microprojects/LRUCache/src/iowa/Hash.rb +63 -0
  229. data/microprojects/LRUCache/src/iowa/Mutex.rb +129 -0
  230. data/microprojects/LRUCache/src/iowa/caches/LRUCache.rb +287 -0
  231. data/microprojects/LRUCache/test/TC_LRUCache.rb +65 -0
  232. data/microprojects/LinkedList/LICENSE +28 -0
  233. data/microprojects/LinkedList/README +13 -0
  234. data/microprojects/LinkedList/external/package.rb +608 -0
  235. data/microprojects/LinkedList/external/test_support.rb +8 -0
  236. data/microprojects/LinkedList/setup.rb +22 -0
  237. data/microprojects/LinkedList/src/iowa/LinkedList.rb +165 -0
  238. data/microprojects/LinkedList/test/TC_LinkedList.rb +42 -0
  239. data/microprojects/README +8 -0
  240. data/setup.rb +116 -0
  241. data/share/iowa/app_skeleton/Main.html +8 -0
  242. data/share/iowa/app_skeleton/Main.iwa +15 -0
  243. data/share/iowa/app_skeleton/app.cnf +48 -0
  244. data/share/iowa/app_skeleton/app.rb +58 -0
  245. data/share/iowa/app_skeleton/models/model.rb +49 -0
  246. data/src/ihc.rb +223 -0
  247. data/src/iowa.cgi +29 -0
  248. data/src/iowa.rb +637 -0
  249. data/src/iowa/AbstractCache.rb +96 -0
  250. data/src/iowa/AcceptLanguage.rb +76 -0
  251. data/src/iowa/Application.rb +928 -0
  252. data/src/iowa/ApplicationStats.rb +72 -0
  253. data/src/iowa/Association.rb +67 -0
  254. data/src/iowa/BindingsParser.rb +62 -0
  255. data/src/iowa/Breakpoint.rb +273 -0
  256. data/src/iowa/CSS.rb +564 -0
  257. data/src/iowa/Client.rb +192 -0
  258. data/src/iowa/Component.rb +405 -0
  259. data/src/iowa/ComponentProxy.rb +26 -0
  260. data/src/iowa/Config.rb +21 -0
  261. data/src/iowa/Constants.rb +226 -0
  262. data/src/iowa/Context.rb +218 -0
  263. data/src/iowa/ContextLogger.rb +16 -0
  264. data/src/iowa/DbPool.rb +222 -0
  265. data/src/iowa/DetachedComponent.rb +18 -0
  266. data/src/iowa/Dispatcher.rb +27 -0
  267. data/src/iowa/DynamicElements.rb +471 -0
  268. data/src/iowa/Element.rb +100 -0
  269. data/src/iowa/Email.rb +287 -0
  270. data/src/iowa/Extensions/AllExtensions.rb +4 -0
  271. data/src/iowa/Extensions/Class.rb +94 -0
  272. data/src/iowa/Extensions/Date.rb +88 -0
  273. data/src/iowa/Extensions/DateTime.rb +88 -0
  274. data/src/iowa/Extensions/Hash.rb +22 -0
  275. data/src/iowa/Extensions/Kernel.rb +6 -0
  276. data/src/iowa/Extensions/Numeric.rb +47 -0
  277. data/src/iowa/Extensions/Object.rb +11 -0
  278. data/src/iowa/Extensions/String.rb +60 -0
  279. data/src/iowa/Extensions/Time.rb +89 -0
  280. data/src/iowa/Extensions/TimeExtensions.rb +6 -0
  281. data/src/iowa/Form.rb +368 -0
  282. data/src/iowa/Hash.rb +85 -0
  283. data/src/iowa/ISAAC.rb +175 -0
  284. data/src/iowa/ImageSize.rb +279 -0
  285. data/src/iowa/IowaComponentMixins.rb +7 -0
  286. data/src/iowa/JSON-lexer.rb +296 -0
  287. data/src/iowa/JSON-objects.rb +201 -0
  288. data/src/iowa/KeyValueCoding.rb +91 -0
  289. data/src/iowa/LinkedList.rb +175 -0
  290. data/src/iowa/Loader.rb +22 -0
  291. data/src/iowa/Lockfile.rb +575 -0
  292. data/src/iowa/Logger.rb +74 -0
  293. data/src/iowa/Monkey.rb +20 -0
  294. data/src/iowa/Mutex.rb +142 -0
  295. data/src/iowa/Policy.rb +70 -0
  296. data/src/iowa/Pool.rb +243 -0
  297. data/src/iowa/PrettyException.rb +1091 -0
  298. data/src/iowa/Request.rb +244 -0
  299. data/src/iowa/Response.rb +133 -0
  300. data/src/iowa/Session.rb +354 -0
  301. data/src/iowa/SessionStats.rb +78 -0
  302. data/src/iowa/String.rb +65 -0
  303. data/src/iowa/Tag.rb +101 -0
  304. data/src/iowa/TemplateParser.rb +236 -0
  305. data/src/iowa/Util.rb +314 -0
  306. data/src/iowa/Webcache.rb +122 -0
  307. data/src/iowa/caches/BiLevelCache.rb +65 -0
  308. data/src/iowa/caches/ClassLimitedCache.rb +67 -0
  309. data/src/iowa/caches/DiskCache.rb +609 -0
  310. data/src/iowa/caches/DiskStore.rb +380 -0
  311. data/src/iowa/caches/LRUCache-alternative.rb +155 -0
  312. data/src/iowa/caches/LRUCache.rb +290 -0
  313. data/src/iowa/caches/SimpleLRUCache.rb +112 -0
  314. data/src/iowa/dispatchers/StandardDispatcher.rb +396 -0
  315. data/src/iowa/dispatchers/StandardDispatcherWithClassifier.rb +93 -0
  316. data/src/iowa/js/iowa_jsonrpc.js +381 -0
  317. data/src/iowa/js/jsonrpc.js +187 -0
  318. data/src/iowa/js/jsonrpc_async.js +261 -0
  319. data/src/iowa/loaders/DiskLoader.rb +50 -0
  320. data/src/iowa/loggers/Analogger.rb +54 -0
  321. data/src/iowa/loggers/AsyncLogger.rb +54 -0
  322. data/src/iowa/loggers/BitBucket.rb +38 -0
  323. data/src/iowa/loggers/Log4R.rb +13 -0
  324. data/src/iowa/loggers/Log4rLogger.rb +48 -0
  325. data/src/iowa/loggers/Logger.rb +29 -0
  326. data/src/iowa/loggers/RubyLogger.rb +9 -0
  327. data/src/iowa/pools/DBConnectionPool.rb +53 -0
  328. data/src/iowa/request/Apache.rb +90 -0
  329. data/src/iowa/request/EMHybrid.rb +59 -0
  330. data/src/iowa/request/ENV.rb +80 -0
  331. data/src/iowa/request/FCGI.rb +68 -0
  332. data/src/iowa/request/HTTPMachine.rb +75 -0
  333. data/src/iowa/request/Mongrel.rb +68 -0
  334. data/src/iowa/request/WEBrick.rb +48 -0
  335. data/src/iowa/version.rb +3 -0
  336. data/src/iowa/webrick/HTTPServer.rb +43 -0
  337. data/src/iowa/webrick/WEBrickServlet.rb +28 -0
  338. data/src/iowa_fcgi_handler.rb +101 -0
  339. data/src/iowa_httpmachine.rb +141 -0
  340. data/src/iowa_hybrid.rb +193 -0
  341. data/src/iowa_hybrid_cluster.rb +231 -0
  342. data/src/iowa_mongrel.rb +136 -0
  343. data/src/iowa_webrick.rb +194 -0
  344. data/src/iowa_webrick_legacy.rb +104 -0
  345. data/src/mod_iowa.rb +104 -0
  346. data/tcss.rb +61 -0
  347. data/test/README.windows +12 -0
  348. data/test/TC_AcceptLanguage.rb +61 -0
  349. data/test/TC_AppConfig.rb +43 -0
  350. data/test/TC_AppConfig/cgi/iowa.cgi +7 -0
  351. data/test/TC_AppConfig/doc/index.html +1 -0
  352. data/test/TC_AppConfig/iowa/Main.html +4 -0
  353. data/test/TC_AppConfig/iowa/Main.iwa +17 -0
  354. data/test/TC_AppConfig/iowa/README +1 -0
  355. data/test/TC_AppConfig/iowa/app.cnf +19 -0
  356. data/test/TC_AppConfig/iowa/app.rb +8 -0
  357. data/test/TC_AppConfig/webrick.rb +38 -0
  358. data/test/TC_Association.rb +29 -0
  359. data/test/TC_BiLevelCache.rb +71 -0
  360. data/test/TC_CGI_Adaptor.rb +55 -0
  361. data/test/TC_CGI_Adaptor/cgi/iowa.cgi +7 -0
  362. data/test/TC_CGI_Adaptor/doc/index.html +1 -0
  363. data/test/TC_CGI_Adaptor/iowa/Main.html +8 -0
  364. data/test/TC_CGI_Adaptor/iowa/Main.iwa +14 -0
  365. data/test/TC_CGI_Adaptor/iowa/README +1 -0
  366. data/test/TC_CGI_Adaptor/iowa/app.cnf +8 -0
  367. data/test/TC_CGI_Adaptor/iowa/app.rb +8 -0
  368. data/test/TC_CGI_Adaptor/webrick.rb +38 -0
  369. data/test/TC_CSS.rb +660 -0
  370. data/test/TC_ClassLimitedCache.rb +89 -0
  371. data/test/TC_Classifier.rb +80 -0
  372. data/test/TC_DbPool.rb +127 -0
  373. data/test/TC_DiskCache.rb +218 -0
  374. data/test/TC_Hybrid.rb +58 -0
  375. data/test/TC_Hybrid/doc/thing.txt +1 -0
  376. data/test/TC_Hybrid/iowa/Main.html +3 -0
  377. data/test/TC_Hybrid/iowa/Main.iwa +7 -0
  378. data/test/TC_Hybrid/iowa/NewPage.html +1 -0
  379. data/test/TC_Hybrid/iowa/NewPage.iwa +5 -0
  380. data/test/TC_Hybrid/iowa/app.cnf +10 -0
  381. data/test/TC_Hybrid/iowa/app.rb +5 -0
  382. data/test/TC_IOWAFunctions/doc/Ajax1.html +1 -0
  383. data/test/TC_IOWAFunctions/doc/Ajax1.iwa +1 -0
  384. data/test/TC_IOWAFunctions/doc/index.html +1 -0
  385. data/test/TC_IOWAFunctions/doc/js/dojo.js +9686 -0
  386. data/test/TC_IOWAFunctions/iowa/Ajax1.html +40 -0
  387. data/test/TC_IOWAFunctions/iowa/Ajax1.iwa +23 -0
  388. data/test/TC_IOWAFunctions/iowa/AjaxWidget.iwa +19 -0
  389. data/test/TC_IOWAFunctions/iowa/AjaxWidget.view +22 -0
  390. data/test/TC_IOWAFunctions/iowa/DanielTest.html +9 -0
  391. data/test/TC_IOWAFunctions/iowa/DanielTest.iwa +10 -0
  392. data/test/TC_IOWAFunctions/iowa/IntervalWidget.html +1 -0
  393. data/test/TC_IOWAFunctions/iowa/IntervalWidget.iwa +14 -0
  394. data/test/TC_IOWAFunctions/iowa/Main.html +1 -0
  395. data/test/TC_IOWAFunctions/iowa/NestedRepeat1.html +12 -0
  396. data/test/TC_IOWAFunctions/iowa/NestedRepeat1.iwa +24 -0
  397. data/test/TC_IOWAFunctions/iowa/RPCResponse.iwa +7 -0
  398. data/test/TC_IOWAFunctions/iowa/RPCResponse.view +1 -0
  399. data/test/TC_IOWAFunctions/iowa/Repeat1.iwa +31 -0
  400. data/test/TC_IOWAFunctions/iowa/Repeat1.view +9 -0
  401. data/test/TC_IOWAFunctions/iowa/Repeat2.iwa +32 -0
  402. data/test/TC_IOWAFunctions/iowa/Repeat2.view +11 -0
  403. data/test/TC_IOWAFunctions/iowa/Repeat3.iwa +44 -0
  404. data/test/TC_IOWAFunctions/iowa/Repeat3.view +18 -0
  405. data/test/TC_IOWAFunctions/iowa/TesCon.html +1 -0
  406. data/test/TC_IOWAFunctions/iowa/TesCon.iwa +5 -0
  407. data/test/TC_IOWAFunctions/iowa/app.cnf +19 -0
  408. data/test/TC_IOWAFunctions/iowa/app.rb +9 -0
  409. data/test/TC_IOWAFunctions/iowa/mapfile.cnf +8 -0
  410. data/test/TC_ISAAC.rb +52 -0
  411. data/test/TC_ImageSize.rb +84 -0
  412. data/test/TC_ImageSize/img.bmp +0 -0
  413. data/test/TC_ImageSize/img.gif +0 -0
  414. data/test/TC_ImageSize/img.jpg +0 -0
  415. data/test/TC_ImageSize/img.pcx +0 -0
  416. data/test/TC_ImageSize/img.pgm +7144 -0
  417. data/test/TC_ImageSize/img.png +0 -0
  418. data/test/TC_ImageSize/img.ppm +0 -0
  419. data/test/TC_ImageSize/img.psd +0 -0
  420. data/test/TC_ImageSize/img.tiff +0 -0
  421. data/test/TC_ImageSize/img.xbm +22 -0
  422. data/test/TC_KeyValueCoding.rb +35 -0
  423. data/test/TC_LRUCache.rb +296 -0
  424. data/test/TC_LinkedList.rb +46 -0
  425. data/test/TC_Lockfile.rb +106 -0
  426. data/test/TC_Minimal.rb +45 -0
  427. data/test/TC_Minimal/app.cnf +8 -0
  428. data/test/TC_Minimal/cgi-bin/iowa.cgi +11 -0
  429. data/test/TC_Minimal/doc/index.html +1 -0
  430. data/test/TC_Minimal/iowa/Main.html +1 -0
  431. data/test/TC_Minimal/iowa/README +1 -0
  432. data/test/TC_Minimal/iowa/app.rb +3 -0
  433. data/test/TC_Minimal/webrick.rb +38 -0
  434. data/test/TC_Mongrel.rb +58 -0
  435. data/test/TC_Mongrel/doc/thing.txt +1 -0
  436. data/test/TC_Mongrel/iowa/Main.html +3 -0
  437. data/test/TC_Mongrel/iowa/Main.iwa +7 -0
  438. data/test/TC_Mongrel/iowa/NewPage.html +1 -0
  439. data/test/TC_Mongrel/iowa/NewPage.iwa +5 -0
  440. data/test/TC_Mongrel/iowa/app.cnf +10 -0
  441. data/test/TC_Mongrel/iowa/app.rb +5 -0
  442. data/test/TC_NoSubclass.rb +56 -0
  443. data/test/TC_NoSubclass/cgi/iowa.cgi +7 -0
  444. data/test/TC_NoSubclass/doc/index.html +1 -0
  445. data/test/TC_NoSubclass/iowa/Main.html +8 -0
  446. data/test/TC_NoSubclass/iowa/Main.iwa +14 -0
  447. data/test/TC_NoSubclass/iowa/README +1 -0
  448. data/test/TC_NoSubclass/iowa/app.cnf +8 -0
  449. data/test/TC_NoSubclass/iowa/app.rb +5 -0
  450. data/test/TC_NoSubclass/webrick.rb +38 -0
  451. data/test/TC_Pool.rb +139 -0
  452. data/test/TC_RenderedCache/doc/thing.txt +1 -0
  453. data/test/TC_RenderedCache/iowa/BigPage.html +1 -0
  454. data/test/TC_RenderedCache/iowa/BigPage.iwa +12 -0
  455. data/test/TC_RenderedCache/iowa/Main.html +3 -0
  456. data/test/TC_RenderedCache/iowa/Main.iwa +7 -0
  457. data/test/TC_RenderedCache/iowa/NewPage.html +1 -0
  458. data/test/TC_RenderedCache/iowa/NewPage.iwa +11 -0
  459. data/test/TC_RenderedCache/iowa/app.cnf +13 -0
  460. data/test/TC_RenderedCache/iowa/app.rb +5 -0
  461. data/test/TC_RenderedCache/iowa/mapfile.map +4 -0
  462. data/test/TC_ResourceURL.rb +73 -0
  463. data/test/TC_ResourceURL/iowa/Main.html +2 -0
  464. data/test/TC_ResourceURL/iowa/Main.iwa +10 -0
  465. data/test/TC_ResourceURL/iowa/app.cnf +10 -0
  466. data/test/TC_ResourceURL/iowa/app.rb +5 -0
  467. data/test/TC_SimpleDetached.rb +41 -0
  468. data/test/TC_StandardDispatcher.rb +362 -0
  469. data/test/TC_StandardDispatcherWithClassifier.rb +358 -0
  470. data/test/TC_String.rb +24 -0
  471. data/test/TC_Tag.rb +41 -0
  472. data/test/TC_Webrick.rb +56 -0
  473. data/test/TC_Webrick/doc/thing.txt +1 -0
  474. data/test/TC_Webrick/iowa/Main.html +3 -0
  475. data/test/TC_Webrick/iowa/Main.iwa +7 -0
  476. data/test/TC_Webrick/iowa/NewPage.html +1 -0
  477. data/test/TC_Webrick/iowa/NewPage.iwa +5 -0
  478. data/test/TC_Webrick/iowa/app.cnf +10 -0
  479. data/test/TC_Webrick/iowa/app.rb +5 -0
  480. data/test/tc_template.rb +15 -0
  481. data/test/tests.conf +19 -0
  482. data/utils/CVS/Entries +3 -0
  483. data/utils/CVS/Repository +1 -0
  484. data/utils/CVS/Root +1 -0
  485. data/utils/QuickCert-1.0.2.tar.gz +0 -0
  486. data/utils/QuickCert-1.0.2/InstalledFiles +7 -0
  487. data/utils/QuickCert-1.0.2/MANIFEST +10 -0
  488. data/utils/QuickCert-1.0.2/Makefile +15 -0
  489. data/utils/QuickCert-1.0.2/README +56 -0
  490. data/utils/QuickCert-1.0.2/bin/QuickCert +355 -0
  491. data/utils/QuickCert-1.0.2/config.save +12 -0
  492. data/utils/QuickCert-1.0.2/data/examples/ruby/QuickCert/README +60 -0
  493. data/utils/QuickCert-1.0.2/data/examples/ruby/QuickCert/drbssl_c.rb +26 -0
  494. data/utils/QuickCert-1.0.2/data/examples/ruby/QuickCert/drbssl_s.rb +35 -0
  495. data/utils/QuickCert-1.0.2/data/examples/ruby/QuickCert/qc_config +21 -0
  496. data/utils/QuickCert-1.0.2/lib/QuickCert/defaults.rb +28 -0
  497. data/utils/QuickCert-1.0.2/setup.rb +1312 -0
  498. data/utils/iowa_apps +422 -0
  499. data/utils/smtp_sink.rb +9 -0
  500. data/utils/startup_template.cnf +27 -0
  501. data/utils/startup_template.rb +73 -0
  502. metadata +551 -0
@@ -0,0 +1,78 @@
1
+ module Iowa
2
+
3
+ class SessionStats
4
+
5
+ def initialize(page_cache)
6
+ @creation_time = Time.now
7
+ @session_hits = 0
8
+ @rolling_interval = 60
9
+ @rolling_log = []
10
+ @page_cache = page_cache
11
+ @access_time = nil
12
+ end
13
+
14
+ def creation_time
15
+ @creation_time
16
+ end
17
+
18
+ def hits
19
+ @session_hits
20
+ end
21
+
22
+ def uptime
23
+ Time.now.to_i - creation_time.to_i
24
+ end
25
+
26
+ def hits_per_second
27
+ @session_hits > 0 ? (hits.to_f / uptime.to_f) : nil
28
+ end
29
+
30
+ def pages_maxsize
31
+ @page_cache.maxsize
32
+ end
33
+
34
+ def pages_size
35
+ @page_cache.size
36
+ end
37
+
38
+ def pages_queue
39
+ @page_cache.queue
40
+ end
41
+
42
+ def page(k)
43
+ !@page_cache[k].nil? ? @page_cache[k].dup : nil
44
+ end
45
+
46
+ def rolling_interval
47
+ @rolling_interval
48
+ end
49
+
50
+ def rolling_interval=(i)
51
+ @rolling_interval = i
52
+ end
53
+
54
+ def rolling_hits_total
55
+ @rolling_log.length
56
+ end
57
+
58
+ def rolling_hits_per_second
59
+ (@rolling_log.length.to_f / rolling_interval.to_f)
60
+ end
61
+
62
+ def access_time
63
+ @access_time
64
+ end
65
+
66
+ def hit
67
+ @session_hits += 1
68
+ @access_time = Time.now
69
+ n = @access_time.to_i
70
+ @rolling_log.push n
71
+
72
+ while (@rolling_log[0] < (n - @rolling_interval) and @rolling_log.length > 0)
73
+ @rolling_log.shift
74
+ end
75
+ end
76
+
77
+ end
78
+ end
@@ -0,0 +1,65 @@
1
+ class String
2
+ alias :each :each_line
3
+ end
4
+
5
+ module Iowa
6
+ class String < ::String
7
+ def unescape
8
+ self.gsub(/\+/, ' ').gsub(/%([0-9a-fA-F]{2})/){ [$1.hex].pack("c") }
9
+ end
10
+
11
+ def unescape!
12
+ self.gsub!(/\+/, ' ')
13
+ self.gsub!(/%([0-9a-fA-F]{2})/){ [$1.hex].pack("c") }
14
+ end
15
+
16
+ def camelCase
17
+ return self if self == ''
18
+ parts = split(/[_\s]/)
19
+ Iowa::String.new(([parts[0].to_s.downcase] + parts[1..-1].collect {|x| x.capitalize}).join)
20
+ end
21
+ alias :camel_case :camelCase
22
+
23
+ def camelCase!
24
+ replace(camelCase)
25
+ end
26
+ alias :camel_case! :camelCase!
27
+
28
+ def constantCase
29
+ return self if self == '' or (self =~ /^[A-Z]/ and self !~ /[_\s]/)
30
+ tmp = camelCase
31
+ tmp[0] = tmp[0].chr.upcase
32
+ Iowa::String.new(tmp)
33
+ end
34
+ alias :constant_case :constantCase
35
+
36
+ def constantCase!
37
+ replace(constantCase)
38
+ end
39
+ alias :constant_case! :constantCase!
40
+
41
+ # This still is not ideal. Can be improved more.
42
+ #
43
+ def snake_case(group = true)
44
+ return self unless self =~ %r/[A-Z\s]/
45
+ reverse.scan(%r/[A-Z]+|[^A-Z]*[A-Z]+?|[^A-Z]+/).reverse.map{|word| word.reverse.downcase}.join('_').gsub(/\s/,'_')
46
+ end
47
+ alias :snakeCase :snake_case
48
+
49
+ def snake_case!
50
+ replace(snake_case)
51
+ end
52
+ alias :snakeCase! :snake_case
53
+
54
+ def human_case
55
+ snake_case.gsub('_',' ').capitalize
56
+ end
57
+ alias :humanCase :human_case
58
+
59
+ def human_case!
60
+ replace(human_case)
61
+ end
62
+ alias :humanCase! :human_case!
63
+
64
+ end
65
+ end
@@ -0,0 +1,101 @@
1
+ require 'iowa/Constants'
2
+ require 'iowa/Util'
3
+ module Iowa
4
+
5
+ # Superclass for all Iowa tags. Tag provides a self referential
6
+ # method to determine the tag's name, and to output opening and closing
7
+ # HTML representations of the tag.
8
+
9
+ class Tag < Element
10
+
11
+ # Return the name of the tag.
12
+
13
+ def tagName
14
+ if @bindings.has_key?(Ctag)
15
+ @bindings[Ctag].get
16
+ else
17
+ self.class.name.split(ClassSeparator).last.downcase
18
+ end
19
+ end
20
+
21
+ # Output the HTML to open the tag.
22
+
23
+ def openTag(*args)
24
+ context = nil
25
+ if args.last.is_a?(Iowa::Context)
26
+ context = args.pop
27
+ end
28
+ #extraAttributes = Hash[*args]
29
+ if args.first.is_a? Hash
30
+ extraAttributes = args.first
31
+ else
32
+ extraAttributes = Hash[*args]
33
+ end
34
+
35
+ newAttributes = @attributes.dup.update(extraAttributes)
36
+
37
+ if context
38
+ @bindings.each do |k,v|
39
+ next if Iowa::BindingKeywords.has_key?(k) and Iowa::BindingKeywords[k][1]
40
+ context.bound_tag = self
41
+ gb = context.getBinding(v)
42
+ newAttributes[k] = gb if gb
43
+ context.bound_tag = nil
44
+ end
45
+ end
46
+
47
+ tag = "<#{tagName.downcase}"
48
+ newAttributes.each do |key, value|
49
+ key = Cclass if key == Ctagclass
50
+ if value
51
+ value = Iowa::Util.escapeHTML(value.to_s)
52
+ tag << " #{key}=\"#{value}\""
53
+ else
54
+ tag << " #{key}=\"\""
55
+ end
56
+ end
57
+ tag << C_gt
58
+ end
59
+
60
+ def lonelyTag(*args)
61
+ context = nil
62
+ context = args.pop if args.last.is_a?(Iowa::Context)
63
+ if args.first.is_a? Hash
64
+ extraAttributes = args.first
65
+ else
66
+ extraAttributes = Hash[*args]
67
+ end
68
+
69
+ newAttributes = @attributes.dup.update(extraAttributes)
70
+
71
+ if context
72
+ @bindings.each do |k,v|
73
+ next if Iowa::BindingKeywords.has_key?(k) and Iowa::BindingKeywords[k][1]
74
+ context.bound_tag = self
75
+ gb = context.getBinding(v)
76
+ newAttributes[k] = gb if gb
77
+ context.bound_tag = nil
78
+ end
79
+ end
80
+
81
+ tag = "<#{tagName.downcase}"
82
+ newAttributes.each do |key, value|
83
+ key = Cclass if key == Ctagclass
84
+ if value
85
+ value = Iowa::Util.escapeHTML(value.to_s)
86
+ tag << " #{key}=\"#{value}\""
87
+ else
88
+ tag << " #{key}=\"\""
89
+ end
90
+ end
91
+ tag << Clonely_tag_terminator
92
+ end
93
+
94
+ # Output the HTML to close the tag.
95
+
96
+ def closeTag
97
+ "</#{tagName.downcase}>"
98
+ end
99
+ end
100
+
101
+ end
@@ -0,0 +1,236 @@
1
+ module Iowa
2
+
3
+ # Parse a template for dynamic elements.
4
+
5
+ class TemplateParser
6
+
7
+ Bodyless = {}
8
+ MandatoryBody = {}
9
+
10
+ def TemplateParser.register_tag(tag, type = nil)
11
+ # Currently the code only does anything with tags that are
12
+ # :bodyless or :mandatory_body.
13
+ tag_type = tag.name.split(/::/).last.downcase
14
+
15
+ case type
16
+ when :bodyless
17
+ Bodyless[tag_type] = true
18
+ when :mandatory_body
19
+ MandatoryBody[tag_type] = true
20
+ end
21
+ end
22
+
23
+ #Bodyless = Iowa::Util.hash_from_array(%w(input hr option img))
24
+ #MandatoryBody = Iowa::Util.hash_from_array(%w(repeat table ul ol tr if unless a form select))
25
+ OID = "oid"
26
+ PatternString = "(<\\s*([^>]+?)\\s+([^>]*?" + OID +
27
+ "\\s*=('|\")\\s*(.*?)\\s*(\\4)[^>]*?(/)?\\s*)>)" +
28
+ "|" + "(@{1,2}([\\w.]+))"
29
+
30
+ # Regexp constant that defines the regexp to use to parse the template
31
+ # for dynamic content tags.
32
+ Pattern = Regexp.new(PatternString)
33
+
34
+ # Constant that defines the position in Pattern of the dynamic tag data.
35
+
36
+ DynamicTag = 1
37
+ Tag = 2
38
+ Attributes = 3
39
+ ID = 5
40
+ Close = 7
41
+ WholeShortform = 8
42
+ Shortform = 9
43
+ OpenTag = Shortform + 1
44
+ CloseTag = Shortform + 2
45
+
46
+ def TemplateParser.strip_html(text)
47
+ attribute_key = /[\w:_-]+/
48
+ attribute_value = /(?:[A-Za-z0-9]+|(?:'[^']*?'|"[^"]*?"))/
49
+ attribute = /(?:#{attribute_key}(?:\s*=\s*#{attribute_value})?)/
50
+ attributes = /(?:#{attribute}(?:\s+#{attribute})*)/
51
+ tag_key = attribute_key
52
+ tag = %r{<[!/?\[]?(?:#{tag_key}|--)(?:\s+#{attributes})?\s*(?:[!/?\]]+|--)?>}
53
+ text.gsub(tag, C_empty).gsub(/\s+/, C_).strip
54
+ end
55
+
56
+ # Take the data to parse and the bindings for the template.
57
+ # Store each in object variables, and then parse the template
58
+ # data for dynamic tags.
59
+
60
+ def initialize(data, bindings, namespace = nil, dirname = '.')
61
+ @data = data
62
+ @nodestack = [Element.new(CtemplateRoot, {}, {}, data, bindings)]
63
+ @bindings = bindings
64
+ @namespace = namespace.name
65
+ @re_tag_cache = {}
66
+
67
+ @pos = 0
68
+ @length = @data.length
69
+ @len = @data.length
70
+ begin
71
+ loop do
72
+ match = Pattern.match(@data[@pos,@len])
73
+ break unless match
74
+
75
+ #@data = match.post_match
76
+ @pos += match.end(0)
77
+ @len = @length - @pos
78
+ textToken(match.pre_match)
79
+ parseTag(match)
80
+ end
81
+ rescue Exception => e
82
+ raise "#{e}: parsed error around #{$&}; #{e.backtrace.inspect}"
83
+ end
84
+
85
+ textToken(@data[@pos,@len])
86
+ if Iowa.config[Capplication][Cserialize_templates] && namespace.serializeCompiledTemplate
87
+ begin
88
+ File.open(File.join(dirname,".#{@namespace}.iwt"),'w+') do |fh|
89
+ Logger[Ciowa_log].info "Saving compiled template for #{@namespace}"
90
+ fh.print Marshal.dump(root)
91
+ end
92
+ rescue Exception
93
+ end
94
+ else
95
+ Logger[Ciowa_log].info "NOT Saving compiled template for #{@namespace}: #{Iowa.config[Capplication][Cserialize_templates]} & #{namespace.serializeCompiledTemplate}"
96
+ end
97
+ end
98
+
99
+ # Return the last element of the nodestack.
100
+
101
+ def root
102
+ @nodestack.last
103
+ end
104
+
105
+ # Determine if a given tag is part of the set of bodyless tags.
106
+
107
+ def bodyless?(tag)
108
+ Bodyless.has_key? tag.downcase
109
+ end
110
+
111
+ def mandatory_body?(tag)
112
+ MandatoryBody.has_key? tag.downcase
113
+ end
114
+
115
+ # Parse the contents of a single tag.
116
+
117
+ def parseTag(match)
118
+ if(match[Shortform])
119
+ if match[WholeShortform][0,2] == C_atat
120
+ startToken(Clink, match[Shortform], C_)
121
+ else
122
+ startToken(CdynamicString, match[Shortform], C_)
123
+ end
124
+ endToken
125
+ return
126
+ end
127
+
128
+ startToken(match[Tag], match[ID], match[Attributes])
129
+
130
+ if (match[Close] and !mandatory_body?(match[Tag])) || bodyless?(match[Tag])
131
+ endToken
132
+ return
133
+ end
134
+
135
+ if (match[Close] and mandatory_body?(match[Tag]))
136
+ Logger[Ciowa_log].warn("<#{match[Tag]}> marked as bodyless at character #{@pos}. Overriding; <#{match[Tag]}> not allowed to be bodyless.")
137
+ end
138
+
139
+ parseTagBody match[Tag]
140
+ end
141
+
142
+ # Traverse a tag's body, looking for other dynamic elements embedded
143
+ # within it.
144
+
145
+ def parseTagBody(tag)
146
+
147
+ tagRE = reForTag(tag)
148
+
149
+ openTags = 1
150
+
151
+ while(openTags > 0)
152
+
153
+ tagMatch = tagRE.match(@data[@pos,@len])
154
+ begin
155
+ #@data = tagMatch.post_match
156
+ @pos += tagMatch.end(0)
157
+ @len = @length - @pos
158
+ rescue Exception => exception
159
+ raise exception, "Error while trying to match tag: #{tag}"
160
+ end
161
+
162
+ if(tagMatch[DynamicTag] || tagMatch[Shortform])
163
+ textToken(tagMatch.pre_match)
164
+ parseTag(tagMatch)
165
+
166
+ elsif(tagMatch[OpenTag])
167
+ openTags += 1
168
+ textToken(tagMatch.pre_match + tagMatch[0])
169
+
170
+ elsif(tagMatch[CloseTag])
171
+ openTags -= 1
172
+ textToken(tagMatch.pre_match)
173
+ textToken(tagMatch[0]) unless openTags == 0
174
+ end
175
+ end
176
+
177
+ endToken()
178
+
179
+ end
180
+
181
+ # Returns a regular expression object that matches either a dynamic
182
+ # element as defined in the global template parsing Pattern, or an
183
+ # opening element of the given tag (argument passed to the method)
184
+ # or a closing element of the given tag.
185
+
186
+ def reForTag(tag)
187
+ unless @re_tag_cache.has_key?(tag)
188
+ @re_tag_cache[tag] = Regexp.new( PatternString +
189
+ "|" +
190
+ "(<\\s*" + tag + ".*?>)" +
191
+ "|" +
192
+ "(<\\s*/" + tag + "\\s*>)"
193
+ )
194
+ end
195
+ @re_tag_cache[tag]
196
+ end
197
+
198
+ def startToken(tag, id, attributeString)
199
+ id = "_anon_#{@pos}_#{Time.now.to_f.to_s.gsub('.','')}" if id == C_ or id == C_anon_
200
+ bindings = @bindings[id]
201
+ bindings = {} unless bindings
202
+
203
+ bindings[Ctag] = LiteralAssociation.new(tag)
204
+
205
+ attributes = {}
206
+ attributeString.scan(/([\w\-]+)\s*=\s*(["'])(.*?)(\2)/) do |key, quote, value|
207
+ # Attributes with a key that match a binding keyword are treated as a binding.
208
+ key.downcase!
209
+ if value.index('@') == 0
210
+ bindings[key] = Iowa::PathAssociation.new(value[1..-1])
211
+ elsif key != Cvalue and Iowa::BindingKeywords.has_key? key
212
+ bindings[key] = Iowa::BindingKeywords[key].first.new(value)
213
+ else
214
+ attributes[key] = Iowa::Util.unescapeHTML(value) unless key == OID
215
+ end
216
+ end
217
+ klass = bindings[Cklass] ? bindings[Cklass].get : tag
218
+ # Kludge. I want a regexp that can match both key=value attributes and
219
+ # key only attributes.
220
+ attributes[Cchecked] = nil if attributeString =~ /\bvalue\s*=\s*(["'])checked(\2)/i
221
+ node = Element.newElement(klass, id, bindings, attributes, @namespace)
222
+ @nodestack.last.addChild node
223
+ @nodestack.push node
224
+ end
225
+
226
+ def endToken
227
+ @nodestack.pop
228
+ end
229
+
230
+ def textToken(text)
231
+ @nodestack.last.addChild TextElement.new(text)
232
+ end
233
+
234
+ end
235
+
236
+ end