Bayeux 0.1.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.
- data/.hgrc +2 -0
- data/.rvmrc +27 -0
- data/Gemfile +42 -0
- data/Gemfile.lock +42 -0
- data/HISTORY +63 -0
- data/README.rdoc +19 -0
- data/Rakefile +89 -0
- data/VERSION +1 -0
- data/bib/Modules.bib +21 -0
- data/code/render/latex/active4d.render +132 -0
- data/code/render/latex/all_hallows_eve.render +96 -0
- data/code/render/latex/amy.render +171 -0
- data/code/render/latex/blackboard.render +111 -0
- data/code/render/latex/brilliance_black.render +552 -0
- data/code/render/latex/brilliance_dull.render +561 -0
- data/code/render/latex/cobalt.render +162 -0
- data/code/render/latex/dawn.render +126 -0
- data/code/render/latex/eiffel.render +132 -0
- data/code/render/latex/espresso_libre.render +123 -0
- data/code/render/latex/idle.render +93 -0
- data/code/render/latex/iplastic.render +99 -0
- data/code/render/latex/lazy.render +96 -0
- data/code/render/latex/mac_classic.render +135 -0
- data/code/render/latex/magicwb_amiga.render +117 -0
- data/code/render/latex/pastels_on_dark.render +204 -0
- data/code/render/latex/slush_poppies.render +123 -0
- data/code/render/latex/spacecadet.render +81 -0
- data/code/render/latex/sunburst.render +186 -0
- data/code/render/latex/twilight.render +153 -0
- data/code/render/latex/zenburnesque.render +126 -0
- data/code/render/old/txt2tags.render +131 -0
- data/code/render/xhtml/active4d.render +140 -0
- data/code/render/xhtml/all_hallows_eve.render +104 -0
- data/code/render/xhtml/amy.render +179 -0
- data/code/render/xhtml/blackboard.render +119 -0
- data/code/render/xhtml/brilliance_black.render +560 -0
- data/code/render/xhtml/brilliance_dull.render +569 -0
- data/code/render/xhtml/cobalt.render +170 -0
- data/code/render/xhtml/dawn.render +134 -0
- data/code/render/xhtml/eiffel.render +140 -0
- data/code/render/xhtml/espresso_libre.render +131 -0
- data/code/render/xhtml/files/css/active4d.css +114 -0
- data/code/render/xhtml/files/css/all_hallows_eve.css +72 -0
- data/code/render/xhtml/files/css/amy.css +147 -0
- data/code/render/xhtml/files/css/blackboard.css +88 -0
- data/code/render/xhtml/files/css/brilliance_black.css +605 -0
- data/code/render/xhtml/files/css/brilliance_dull.css +599 -0
- data/code/render/xhtml/files/css/cobalt.css +149 -0
- data/code/render/xhtml/files/css/dawn.css +121 -0
- data/code/render/xhtml/files/css/eiffel.css +121 -0
- data/code/render/xhtml/files/css/espresso_libre.css +109 -0
- data/code/render/xhtml/files/css/idle.css +62 -0
- data/code/render/xhtml/files/css/iplastic.css +80 -0
- data/code/render/xhtml/files/css/lazy.css +73 -0
- data/code/render/xhtml/files/css/mac_classic.css +123 -0
- data/code/render/xhtml/files/css/magicwb_amiga.css +104 -0
- data/code/render/xhtml/files/css/pastels_on_dark.css +188 -0
- data/code/render/xhtml/files/css/slush_poppies.css +85 -0
- data/code/render/xhtml/files/css/spacecadet.css +51 -0
- data/code/render/xhtml/files/css/sunburst.css +180 -0
- data/code/render/xhtml/files/css/twilight.css +137 -0
- data/code/render/xhtml/files/css/zenburnesque.css +91 -0
- data/code/render/xhtml/idle.render +101 -0
- data/code/render/xhtml/iplastic.render +107 -0
- data/code/render/xhtml/lazy.render +104 -0
- data/code/render/xhtml/mac_classic.render +143 -0
- data/code/render/xhtml/magicwb_amiga.render +125 -0
- data/code/render/xhtml/pastels_on_dark.render +212 -0
- data/code/render/xhtml/slush_poppies.render +131 -0
- data/code/render/xhtml/spacecadet.render +89 -0
- data/code/render/xhtml/sunburst.render +194 -0
- data/code/render/xhtml/twilight.render +161 -0
- data/code/render/xhtml/zenburnesque.render +134 -0
- data/code/syntax/actionscript.syntax +97 -0
- data/code/syntax/active4d.syntax +276 -0
- data/code/syntax/active4d_html.syntax +311 -0
- data/code/syntax/active4d_ini.syntax +50 -0
- data/code/syntax/active4d_library.syntax +21 -0
- data/code/syntax/ada.syntax +33 -0
- data/code/syntax/antlr.syntax +151 -0
- data/code/syntax/apache.syntax +191 -0
- data/code/syntax/applescript.syntax +384 -0
- data/code/syntax/asp.syntax +70 -0
- data/code/syntax/asp_vb.net.syntax +129 -0
- data/code/syntax/bibtex.syntax +151 -0
- data/code/syntax/blog_html.syntax +41 -0
- data/code/syntax/blog_markdown.syntax +42 -0
- data/code/syntax/blog_text.syntax +27 -0
- data/code/syntax/blog_textile.syntax +27 -0
- data/code/syntax/build.syntax +53 -0
- data/code/syntax/bulletin_board.syntax +287 -0
- data/code/syntax/cake.syntax +55 -0
- data/code/syntax/camlp4.syntax +36 -0
- data/code/syntax/cm.syntax +32 -0
- data/code/syntax/coldfusion.syntax +119 -0
- data/code/syntax/context_free.syntax +176 -0
- data/code/syntax/cs.syntax +59 -0
- data/code/syntax/css.syntax +195 -0
- data/code/syntax/css_experimental.syntax +1925 -0
- data/code/syntax/csv.syntax +68 -0
- data/code/syntax/d.syntax +142 -0
- data/code/syntax/diff.syntax +81 -0
- data/code/syntax/dokuwiki.syntax +204 -0
- data/code/syntax/dot.syntax +47 -0
- data/code/syntax/doxygen.syntax +43 -0
- data/code/syntax/dylan.syntax +62 -0
- data/code/syntax/eiffel.syntax +78 -0
- data/code/syntax/erlang.syntax +922 -0
- data/code/syntax/f-script.syntax +80 -0
- data/code/syntax/fortran.syntax +141 -0
- data/code/syntax/fxscript.syntax +142 -0
- data/code/syntax/greasemonkey.syntax +34 -0
- data/code/syntax/gri.syntax +83 -0
- data/code/syntax/groovy.syntax +191 -0
- data/code/syntax/gtd.syntax +22 -0
- data/code/syntax/gtdalt.syntax +143 -0
- data/code/syntax/haml.syntax +88 -0
- data/code/syntax/haskell.syntax +88 -0
- data/code/syntax/html-asp.syntax +27 -0
- data/code/syntax/html.syntax +362 -0
- data/code/syntax/html_django.syntax +36 -0
- data/code/syntax/html_for_asp.net.syntax +424 -0
- data/code/syntax/html_mason.syntax +119 -0
- data/code/syntax/html_rails.syntax +40 -0
- data/code/syntax/html_tcl.syntax +26 -0
- data/code/syntax/icalendar.syntax +32 -0
- data/code/syntax/inform.syntax +48 -0
- data/code/syntax/ini.syntax +55 -0
- data/code/syntax/installer_distribution_script.syntax +77 -0
- data/code/syntax/io.syntax +81 -0
- data/code/syntax/java.syntax +211 -0
- data/code/syntax/javaproperties.syntax +20 -0
- data/code/syntax/javascript.syntax +256 -0
- data/code/syntax/javascript_+_prototype.syntax +72 -0
- data/code/syntax/javascript_+_prototype_bracketed.syntax +140 -0
- data/code/syntax/jquery_javascript.syntax +114 -0
- data/code/syntax/json.syntax +136 -0
- data/code/syntax/languagedefinition.syntax +708 -0
- data/code/syntax/latex.syntax +566 -0
- data/code/syntax/latex_beamer.syntax +41 -0
- data/code/syntax/latex_log.syntax +50 -0
- data/code/syntax/latex_memoir.syntax +64 -0
- data/code/syntax/lexflex.syntax +219 -0
- data/code/syntax/lighttpd.syntax +54 -0
- data/code/syntax/lilypond.syntax +492 -0
- data/code/syntax/lisp.syntax +61 -0
- data/code/syntax/literate_haskell.syntax +24 -0
- data/code/syntax/logo.syntax +29 -0
- data/code/syntax/logtalk.syntax +152 -0
- data/code/syntax/lua.syntax +86 -0
- data/code/syntax/m.syntax +142 -0
- data/code/syntax/macports_portfile.syntax +163 -0
- data/code/syntax/makefile.syntax +36 -0
- data/code/syntax/man.syntax +17 -0
- data/code/syntax/mediawiki.syntax +567 -0
- data/code/syntax/mips.syntax +66 -0
- data/code/syntax/mod_perl.syntax +50 -0
- data/code/syntax/modula-3.syntax +47 -0
- data/code/syntax/moinmoin.syntax +189 -0
- data/code/syntax/mootools.syntax +572 -0
- data/code/syntax/movable_type.syntax +162 -0
- data/code/syntax/multimarkdown.syntax +39 -0
- data/code/syntax/objective-c++.syntax +18 -0
- data/code/syntax/objective-c.syntax +233 -0
- data/code/syntax/ocaml.syntax +764 -0
- data/code/syntax/ocamllex.syntax +167 -0
- data/code/syntax/ocamlyacc.syntax +184 -0
- data/code/syntax/opengl.syntax +14 -0
- data/code/syntax/pascal.syntax +77 -0
- data/code/syntax/perl.syntax +1115 -0
- data/code/syntax/plain_text.syntax +32 -0
- data/code/syntax/postscript.syntax +114 -0
- data/code/syntax/processing.syntax +106 -0
- data/code/syntax/prolog.syntax +40 -0
- data/code/syntax/property_list.syntax +635 -0
- data/code/syntax/python.syntax +868 -0
- data/code/syntax/python_django.syntax +21 -0
- data/code/syntax/qmake_project.syntax +114 -0
- data/code/syntax/qt_c++.syntax +26 -0
- data/code/syntax/quake3_config.syntax +32 -0
- data/code/syntax/r.syntax +81 -0
- data/code/syntax/r_console.syntax +16 -0
- data/code/syntax/ragel.syntax +201 -0
- data/code/syntax/rd_r_documentation.syntax +91 -0
- data/code/syntax/regexp.syntax +50 -0
- data/code/syntax/release_notes.syntax +46 -0
- data/code/syntax/remind.syntax +253 -0
- data/code/syntax/restructuredtext.syntax +250 -0
- data/code/syntax/rez.syntax +80 -0
- data/code/syntax/ruby.syntax +1035 -0
- data/code/syntax/ruby_experimental.syntax +145 -0
- data/code/syntax/ruby_on_rails.syntax +88 -0
- data/code/syntax/s5.syntax +69 -0
- data/code/syntax/scheme.syntax +347 -0
- data/code/syntax/scilab.syntax +41 -0
- data/code/syntax/setext.syntax +147 -0
- data/code/syntax/shell-unix-generic.syntax +384 -0
- data/code/syntax/slate.syntax +149 -0
- data/code/syntax/sql.syntax +237 -0
- data/code/syntax/sql_rails.syntax +18 -0
- data/code/syntax/ssh-config.syntax +33 -0
- data/code/syntax/standard_ml.syntax +121 -0
- data/code/syntax/strings_file.syntax +39 -0
- data/code/syntax/subversion_commit_message.syntax +36 -0
- data/code/syntax/sweave.syntax +84 -0
- data/code/syntax/swig.syntax +57 -0
- data/code/syntax/tcl.syntax +152 -0
- data/code/syntax/template_toolkit.syntax +121 -0
- data/code/syntax/tex.syntax +86 -0
- data/code/syntax/tex_math.syntax +49 -0
- data/code/syntax/textile.syntax +215 -0
- data/code/syntax/tsv.syntax +50 -0
- data/code/syntax/twiki.syntax +241 -0
- data/code/syntax/txt2tags.syntax +79 -0
- data/code/syntax/vectorscript.syntax +57 -0
- data/code/syntax/xhtml_1.0.syntax +4027 -0
- data/code/syntax/xml.syntax +180 -0
- data/code/syntax/xml_strict.syntax +92 -0
- data/code/syntax/xsl.syntax +60 -0
- data/code/syntax/yaml.syntax +160 -0
- data/code/syntax/yui_javascript.syntax +176 -0
- data/lib/bayeux/bayeux.rb +727 -0
- data/lib/bayeux/html_gen.rb +506 -0
- data/lib/bayeux/latex_gen.rb +333 -0
- data/lib/bayeux/para_block.rb +201 -0
- data/lib/bayeux/text_gen.rb +307 -0
- data/lib/bayeux/tree_walker.rb +166 -0
- data/lib/filters/bayeux.rb +44 -0
- data/lib/filters/pandoc.rb +23 -0
- data/lib/filters/section_id.rb +105 -0
- data/lib/helpers/breadcrumbs.rb +64 -0
- data/lib/helpers/site_toc.rb +11 -0
- data/lib/lib/uv.rb +92 -0
- data/lib/lib/uv/render_processor.rb +146 -0
- data/lib/lib/uv/utility.rb +67 -0
- data/lib/refs/Doc_Blocks.rb +2 -0
- data/lib/refs/References.rb +104 -0
- metadata +415 -0
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: Javascript YUI
|
|
3
|
+
scopeName: source.js.yui
|
|
4
|
+
uuid: 62E7EF93-5574-4063-BF18-AD38620236B9
|
|
5
|
+
foldingStartMarker: (^.*{[^}]*$|^.*\([^\)]*$|^.*/\*(?!.*\*/).*$)
|
|
6
|
+
patterns:
|
|
7
|
+
- name: support.class.js.yui
|
|
8
|
+
match: \b(YAHOO|YAHOO_config)\b
|
|
9
|
+
- name: support.class.js.yui
|
|
10
|
+
match: \.(util|lang|env|widget|example)\b
|
|
11
|
+
- name: support.class.js.yui
|
|
12
|
+
match: \.(CustomEvent|Subscriber|Event|EventProvider|Dom|Point|Region|Connect|DD|DDProxy|DDTarget|DragDrop|DragDropMgr|DDM|Anim|AnimMgr|Bezier|ColorAnim|Easing|Motion|Scroll|AutoComplete|DataSource|DS_JSArray|DS_JSFunction|DS_XHR|Config|KeyListener|Attribute|AttributeProvider|Element|History)\b
|
|
13
|
+
- name: support.class.js.yui
|
|
14
|
+
match: \.(AutoComplete|DataSource|DS_JSArray|DS_JSFunction|DS_XHR|Calendar|Calendar2up|Calendar_Core|CalendarGroup|DateMath|Module|Overlay|OverlayManager|Tooltip|Panel|Dialog|SimpleDialog|ContainerEffect|Logger|LogMsg|LogReader|LogWriter|Menu|MenuItem|Menubar|MenuBarItem|MenuManager|MenuModule|MenuModuleItem|ContextMenu|ContextMenuItem|Slider|SliderThumb|Tab|TabView|TreeView|Node|HTMLNode|MenuNode|TextNode|RootNode|TVAnim|TVFadeIn|TVFadeOut|Column|ColumnEditor|ColumnSet|DataTable|Record|RecordSet|Sort|WidthResizer|Button|ButtonGroup)\b
|
|
15
|
+
- name: support.function.YAHOO.js.yui
|
|
16
|
+
match: \.(log|namespace|register)\b(?=\()
|
|
17
|
+
- name: support.function.lang.js.yui
|
|
18
|
+
match: \.(augment|extend|hasOwnProperty|isArray|isBoolean|isFunction|isNull|isNumber|isObject|isString|isUndefined)\b(?=\()
|
|
19
|
+
- name: support.function.Subscriber.js.yui
|
|
20
|
+
match: \.(getScope)\b(?=\()
|
|
21
|
+
- name: support.function.CustomEvent.js.yui
|
|
22
|
+
match: \.(fire|subscribe|unsubscribe|unsubscribeAll)\b(?=\()
|
|
23
|
+
- name: support.function.Event.js.yui
|
|
24
|
+
match: \.(addListener|clearCache|fireLegacyEvent|generateId|getCharCode|getEl|getEvent|getLegacyIndex|getListeners|getPageX|getPageY|getRelatedTarget|getTarget|getTime|getXY|on|onAvailable|onContentReady|preventDefault|purgeElement|removeListener|resolveTextNode|startInterval|stopEvent|stopPropagation|useLegacyEvent)\b(?=\()
|
|
25
|
+
- name: support.function.EventProvider.js.yui
|
|
26
|
+
match: \.(createEvent|fireEvent|hasEvent|subscribe|unsubscribe)\b(?=\()
|
|
27
|
+
- name: support.function.Dom.js.yui
|
|
28
|
+
match: \.(addClass|batch|generateId|get|getClientHeight|getClientWidth|getDocumentHeight|getDocumentWidth|getElementsBy|getElementsByClassName|getRegion|getStyle|getViewportHeight|getViewportWidth|getX|getXY|getY|hasClass|inDocument|isAncestor|removeClass|replaceClass|setStyle|setX|setXY|setY)\b(?=\()
|
|
29
|
+
- name: support.function.Region.js.yui
|
|
30
|
+
match: \.(contains|getArea|intersect|union|getRegion)\b(?=\()
|
|
31
|
+
- name: support.function.Connect.js.yui
|
|
32
|
+
match: \.(abort|appendPostData|asyncRequest|createExceptionObject|createFrame|createResponseObject|createXhrObject|getConnectionObject|handleReadyState|handleTransactionResponse|initHeader|isCallInProgress|releaseObject|resetFormState|setDefaultPostHeader|setForm|setHeader|setPollingInterval|setProgId|uploadFile)\b(?=\()
|
|
33
|
+
- name: support.function.Anim.js.yui
|
|
34
|
+
match: \.(animate|doMethod|getAttribute|getDefaultUnit|getEl|getStartTime|init|isAnimated|onTween|setAttribute|setRuntimeAttribute|stop)\b(?=\()
|
|
35
|
+
- name: support.function.AnimMgr.js.yui
|
|
36
|
+
match: \.(correctFrame|registerElement|run|start|stop|unRegister)\b(?=\()
|
|
37
|
+
- name: support.function.Bezier.js.yui
|
|
38
|
+
match: \.(getPosition)\b(?=\()
|
|
39
|
+
- name: support.function.ColorAnim.js.yui
|
|
40
|
+
match: \.(parseColor)\b(?=\()
|
|
41
|
+
- name: support.function.Easing.js.yui
|
|
42
|
+
match: \.(backBoth|backIn|backOut|bounceBoth|bounceIn|bounceOut|easeBoth|easeBothStrong|easeIn|easeInStrong|easeNone|easeOut|easeOutStrong|elasticBoth|elasticIn|elasticOut)\b
|
|
43
|
+
- name: support.function.Motion.js.yui
|
|
44
|
+
match: \.()\b(?=\()
|
|
45
|
+
- name: support.function.Scroll.js.yui
|
|
46
|
+
match: \.()\b(?=\()
|
|
47
|
+
- name: support.function.DragDrop.js.yui
|
|
48
|
+
match: \.(addInvalidHandleClass|addInvalidHandleId|addInvalidHandleType|addToGroup|applyConfig|b4Drag|b4DragDrop|b4DragOut|b4DragOver|b4EndDrag|b4MouseDown|b4StartDrag|clearConstraints|clearTicks|endDrag|getDragEl|getEl|getTick|handleMouseDown|handleOnAvailable|init|initTarget|isLocked|isValidHandleChild|lock|onAvailable|onDrag|onDragDrop|onDragEnter|onDragOut|onDragOver|onInvalidDrop|onMouseDown|onMouseUp|padding|removeFromGroup|removeInvalidHandleClass|removeInvalidHandleId|removeInvalidHandleType|resetContraints|setDragElId|setHandleElId|setInitPosition|setOuterHandleElId|setPadding|setStartPosition|setXConstraint|setXTicks|setYConstraint|setYTicks|startDrag|unlock|unreg)\b(?=\()
|
|
49
|
+
- name: support.function.DragDropMgr.js.yui
|
|
50
|
+
match: \.(fireEvents|getBestMatch|getClientHeight|getClientWidth|getCss|getDDById|getElement|getElWrapper|getLocation|getPosX|getPosY|getRelated|getScrollLeft|getScrollTop|getStyle|handleMouseDown|handleMouseMove|handleMouseUp|handleWasClicked|init|isDragDrop|isHandle|isLegalTarget|isLocked|isOverTarget|isTypeOfDD|lock|moveToEl|numericSort|refreshCache|regDragDrop|regHandle|removeDDFromGroup|startDrag|stopDrag|stopEvent|swapNode|unlock|unregAll|verifyEl)\b(?=\()
|
|
51
|
+
- name: support.function.DD.js.yui
|
|
52
|
+
match: \.(alignElWithMouse|applyConfig|autoOffset|autoScroll|cachePosition|getTargetCoord|setDelta|setDragElPos)\b(?=\()
|
|
53
|
+
- name: support.function.DDProxy.js.yui
|
|
54
|
+
match: \.(createFrame|initFrame|showFrame)\b(?=\()
|
|
55
|
+
- name: support.function.DDTarget.js.yui
|
|
56
|
+
match: \.()\b(?=\()
|
|
57
|
+
- name: support.function.History.js.yui
|
|
58
|
+
match: \.(getBookmarkedState|getCurrentState|initialize|navigate|register)\b(?=\()
|
|
59
|
+
- name: support.function.DataSource.js.yui
|
|
60
|
+
match: \.(addToCache|flushCache|getCachedResponse|handleResponse|isCacheHit|makeConnection|parseArrayData|parseJSONData|parseTextData|parseXMLData|sendRequest)\b(?=\()
|
|
61
|
+
- name: support.function.AutoComplete.js.yui
|
|
62
|
+
match: \.(doBeforeExpandContainer|formatResult|getListItemData|getListItems|isContainerOpen|sendQuery|setBody|setFooter|setHeader)\b(?=\()
|
|
63
|
+
- name: support.function.DS_JSArray.js.yui
|
|
64
|
+
match: \.()\b(?=\()
|
|
65
|
+
- name: support.function.DS_JSFunction.js.yui
|
|
66
|
+
match: \.()\b(?=\()
|
|
67
|
+
- name: support.function.DS_XHR.js.yui
|
|
68
|
+
match: \.(parseResponse)\b(?=\()
|
|
69
|
+
- name: support.function.Calendar.js.yui
|
|
70
|
+
match: \.(addMonthRenderer|addMonths|addRenderer|addWeekdayRenderer|addYears|applyListeners|buildDayLabel|buildMonthLabel|buildWeekdays|clear|clearAllBodyCellStyles|clearElement|configClose|configIframe|configLocale|configLocaleValues|configMaxDate|configMinDate|configOptions|configPageDate|configSelected|configTitle|deselect|deselectAll|deselectCell|doCellMouseOut|doCellMouseOver|doSelectCell|getDateByCellId|getDateFieldsByCellId|getSelectedDates|hide|init|initEvents|initStyles|isDateOOM|nextMonth|nextYear|onBeforeDeselect|onBeforeSelect|onChangePage|onClear|onDeselect|onRender|onReset|onSelect|previousMonth|previousYear|refreshLocale|render|renderBody|renderBodyCellRestricted|renderCellDefault|renderCellNotThisMonth|renderCellStyleHighlight1|renderCellStyleHighlight2|renderCellStyleHighlight3|renderCellStyleHighlight4|renderCellStyleSelected|renderCellStyleToday|renderFooter|renderHeader|renderOutOfBoundsDate|renderRowFooter|renderRowHeader|reset|resetRenderers|select|selectCell|setMonth|setYear|show|styleCellDefault|subtractMonths|substractYears|validate)\b(?=\()
|
|
71
|
+
- name: support.function.CalendarGroup.js.yui
|
|
72
|
+
match: \.(addMonthRenderer|addMonths|addRenderer|addWeekdayRenderer|addYears|callChildFunction|clear|configPageDate|configPages|constructChild|delegateConfig|deselect|deselectAll|deselectCell|getSelectedDates|init|initEvents|nextMonth|nextYear|previousMonth|previousYear|render|renderFooter|renderHeader|reset|select|selectCell|setChildFunction|setMonth|setYear|sub|subtractMonths|subtractYears|unsub)\b(?=\()
|
|
73
|
+
- name: support.function.DateMath.js.yui
|
|
74
|
+
match: \.(add|after|before|between|clearTime|findMonthEnd|findMonthStart|getDayOffset|getJan1|getWeekNumber|isMonthOverlapWeek|isYearOverlapWeek|subtract)\b(?=\()
|
|
75
|
+
- name: support.function.Config.js.yui
|
|
76
|
+
match: \.(addProperty|alreadySubscribed|applyConfig|checkBoolean|checkNumber|fireEvent|fireQueue|getConfig|getProperty|init|outputEventQueue|queueProperty|refireEvent|refresh|resetProperty|setProperty|subscribeToConfigEvent|unsubscribeFromConfigEvent)\b(?=\()
|
|
77
|
+
- name: support.function.KeyListener.js.yui
|
|
78
|
+
match: \.(disable|enable|handleKeyPress)\b(?=\()
|
|
79
|
+
- name: support.function.Module.js.yui
|
|
80
|
+
match: \.(appendToBody|appendToFooter|appendToHeader|configMonitorResize|configVisible|destroy|hide|init|initDefaultConfig|initEvents|initResizeMonitor|onDomResize|render|setBody|setFooter|setHeader|show)\b(?=\()
|
|
81
|
+
- name: support.function.Overlay.js.yui
|
|
82
|
+
match: \.(align|center|configConstrainToViewport|configContext|configFixedCenter|configHeight|configIframe|configVisible|configWidth|configX|configXY|configY|configZIndex|destroy|doCenterOnDOMEvent|enforceContraints|hideIframe|hideMacGeckoScrollbars|init|initDefaultConfig|initEvenrts|moveTo|onDomResize|showIframe|showMacGeckoScrollbars|syncPosition|windowResizeHandle|windowScrollHandler)\b(?=\()
|
|
83
|
+
- name: support.function.OverlayManager.js.yui
|
|
84
|
+
match: \.(blurAll|compareZIndexDesc|find|focus|getActive|hideAll|init|initDefaultConfig|register|remove|showAll)\b(?=\()
|
|
85
|
+
- name: support.function.Tooltip.js.yui
|
|
86
|
+
match: \.(configContainer|configContext|configText|doHide|doShow|init|initDefaultConfig|onContextMouseMove|onContextMouseOut|onContextMouseOver|preventOverlay)\b(?=\()
|
|
87
|
+
- name: support.function.Panel.js.yui
|
|
88
|
+
match: \.(buildMask|buildWrapper|configClose|configDraggable|configHeight|configKeyListeners|configModal|configUnderlay|configWidth|configzIndex|hideMask|init|initDefaultConfig|initEvents|onDomResize|registerDragDrop|removeMask|render|showMask|sizeMask|sizeUnderlay)\b(?=\()
|
|
89
|
+
- name: support.function.Dialog.js.yui
|
|
90
|
+
match: \.(blurButtons|cancel|configButtons|doSubmit|focusDefaultButton|focusFirst|focusFirstButton|focusLast|focusLastButton|getData|init|initDefaultConfig|initEvents|registerForm|submit|validate)\b(?=\()
|
|
91
|
+
- name: support.function.SimpleDialog.js.yui
|
|
92
|
+
match: \.(configIcon|configText|init|initDefaultConfig|registerForm)\b(?=\()
|
|
93
|
+
- name: support.function.ContainerEffect.js.yui
|
|
94
|
+
match: \.(animateIn|animateOut|FADE|handleCompleteAnimateIn|handleCompleteAnimateOut|handleStartAnimateIn|handleStartAnimateOut|handleTweenAnimateIn|handleTweenAnimateOut|init|SLIDE)\b(?=\()
|
|
95
|
+
- name: support.function.Logger.js.yui
|
|
96
|
+
match: \.(disableBrowserConsole|enableBrowserConsole|getStack|getStartTime|log|reset)\b(?=\()
|
|
97
|
+
- name: support.function.LogMsg.js.yui
|
|
98
|
+
match: \.()\b(?=\()
|
|
99
|
+
- name: support.function.LogReader.js.yui
|
|
100
|
+
match: \.(formatMsg|getLastTime|hide|html2Text|pause|resume|setTitle|show)\b(?=\()
|
|
101
|
+
- name: support.function.LogWriter.js.yui
|
|
102
|
+
match: \.(getSource|log|setSource)\b(?=\()
|
|
103
|
+
- name: support.function.Menu.js.yui
|
|
104
|
+
match: \.(addItem|addItems|clearActiveItem|configContainer|configHideDelay|configIframe|configPosition|configVisible|destroy|disableAutoSubmenuDisplay|enforceConstraints|getItem|getItemGroups|getRoot|init|initDefaultConfig|initEvents|insertItem|onDomResize|removeItem|setInitialFocus|setInitialSelection|setItemGroupTitle)\b(?=\()
|
|
105
|
+
- name: support.function.MenuItem.js.yui
|
|
106
|
+
match: \.(blur|configChecked|configDisabled|configEmphasis|configHelpText|configSelected|configStrongEmphasis|configSubmenu|configTarget|configText|configUrl|destroy|focus|getFirstItemIndex|getNextArrayItem|getNextEnabledSibling|getPreviousArrayItem|getPreviousEnabledSibling|init|initDefaultConfig|initHelpText|removeHelpText)\b(?=\()
|
|
107
|
+
- name: support.function.Menubar.js.yui
|
|
108
|
+
match: \.(init|initDefaultConfig)\b(?=\()
|
|
109
|
+
- name: support.function.MenuBarItem.js.yui
|
|
110
|
+
match: \.(init)\b(?=\()
|
|
111
|
+
- name: support.function.MenuManager.js.yui
|
|
112
|
+
match: \.(addItem|addMenu|getMenu|getMenuRootElement|getMenus|hideVisible|onDOMEvent|onItemAdded|onItemDestroy|onItemRemoved|onMenuDestroy|onMenuVisibleConfigChange|removeItem|removeMenu)\b(?=\()
|
|
113
|
+
- name: support.function.MenuModule.js.yui
|
|
114
|
+
match: \.()\b(?=\()
|
|
115
|
+
- name: support.function.MenuModuleItem.js.yui
|
|
116
|
+
match: \.()\b(?=\()
|
|
117
|
+
- name: support.function.ContextMenu.js.yui
|
|
118
|
+
match: \.(configTrigger|destroy|init|initDefaultConfig)\b(?=\()
|
|
119
|
+
- name: support.function.ContextMenuItem.js.yui
|
|
120
|
+
match: \.(init)\b(?=\()
|
|
121
|
+
- name: support.function.Slider.js.yui
|
|
122
|
+
match: \.(b4MouseDown|endMove|fireEvents|focus|getThumb|getValue|getXValue|getYValue|handleThumbChange|lock|moveOneTick|moveThumb|onChange|onDrag|onMouseDown|onSliderEnd|onSlideStart|setRegionValue|setSliderStartState|setThumbCenterPoint|setValue|thumbMouseUp|unlock|verifyOffset|getHorizSlider|getSliderRegion|getVertSlider)\b(?=\()
|
|
123
|
+
- name: support.function.SliderThumb.js.yui
|
|
124
|
+
match: \.(clearTicks|getOffsetFromParent|getValue|getXValue|getYValue|initSlider|onChange)\b(?=\()
|
|
125
|
+
- name: support.function.AttributeProvider.js.yui
|
|
126
|
+
match: \.(configureAttribute|fireBeforeChangeEvent|fireChangeEvent|get|getAttributeConfig|getAttributeKeys|refresh|register|resetAttributeConfig|resetValue|set|setAttributes)\b(?=\()
|
|
127
|
+
- name: support.function.Attribute.js.yui
|
|
128
|
+
match: \.(configure|getValue|refresh|resetConfig|resetValue|setValue|getValue|refresh|resetConfig|resetValue|setValue)\b(?=\()
|
|
129
|
+
- name: support.function.Element.js.yui
|
|
130
|
+
match: \.(addClass|addListener|appendChild|appendTo|fireQueue|getElementsByClassName|getElementsByTagName|getStyle|hasChildNodes|hasClass|initAttributes|insertBefore|on|removeChild|removeClass|removeListener|replaceChild|replaceClass|setStyle)\b(?=\()
|
|
131
|
+
- name: support.function.TabView.js.yui
|
|
132
|
+
match: \.(addTab|contentTransition|createTabs|DOMEventHandler|getTab|getTabIndex|initAttributes|removeTab)\b(?=\()
|
|
133
|
+
- name: support.function.Tab.js.yui
|
|
134
|
+
match: \.(initAttributes)\b(?=\()
|
|
135
|
+
- name: support.function.TreeView.js.yui
|
|
136
|
+
match: \.(animateCollapse|animateExpand|collapseAll|collapseComplete|draw|expandAll|expandComplete|generateId|getEl|getNodeByIndex|getNodeByProperty|getNodesByProperty|getRoot|init|onCollapse|onExpand|popNode|regNode|removeChildren|removeNode|setCollapseAnim|setDynamicLoad|setExpandAnim|setUpLabel|addHandler|getNode|getTree|preload|removeHandler)\b(?=\()
|
|
137
|
+
- name: support.function.Node.js.yui
|
|
138
|
+
match: \.(appendChild|appendTo|applyParent|collapseToggleStyle|collapseAll|completeRender|expand|expandAll|getAncestor|getChildrenEl|getChildrenElId|getChildrenHtml|getDepthStyle|getEl|getElId|getHoverStyle|getHtml|getIconMode|getNodeHtml|getSiblings|getStyle|getToggleEl|getToggleElId|getToggleLink|hasChildren|hideChildren|init|insertAfter|insertBefore|isChildOf|isDynamic|isRoot|loadComplete|refresh|renderChildren|setDynamicLoad|showChildren|toggle)\b(?=\()
|
|
139
|
+
- name: support.function.HTMLNode.js.yui
|
|
140
|
+
match: \.(getContentEl)\b(?=\()
|
|
141
|
+
- name: support.function.MenuNode.js.yui
|
|
142
|
+
match: \.()\b(?=\()
|
|
143
|
+
- name: support.function.TextNode.js.yui
|
|
144
|
+
match: \.(getLabelEl|onLabelClick)\b(?=\()
|
|
145
|
+
- name: support.function.RootNode.js.yui
|
|
146
|
+
match: \.()\b(?=\()
|
|
147
|
+
- name: support.function.TVAnim.js.yui
|
|
148
|
+
match: \.(getAnim|isValid)\b(?=\()
|
|
149
|
+
- name: support.function.TVFadeIn.js.yui
|
|
150
|
+
match: \.(animate|onComplete)\b(?=\()
|
|
151
|
+
- name: support.function.TVFadeOut.js.yui
|
|
152
|
+
match: \.(animate|onComplete)\b(?=\()
|
|
153
|
+
- name: support.function.Column.js.yui
|
|
154
|
+
match: \.(format|formatCheckbox|formatCurrency|formatDate|formatEmail|formatLink|formatNumber|formatSelect|getColSpan|getId|getRowSpan|parse|parseCheckbox|parseCurrency|parseDate|parseNumber|parseSelect|showEditor)\b(?=\()
|
|
155
|
+
- name: support.function.ColumnEditor.js.yui
|
|
156
|
+
match: \.(createTextareaEditor|createTextboxEditor|getTextareaEditorValue|getTextboxEditorValue|getValue|hide|show|showTextareaEditor|showTextboxEditor)\b(?=\()
|
|
157
|
+
- name: support.function.ColumnSet.js.yui
|
|
158
|
+
match: \.()\b(?=\()
|
|
159
|
+
- name: support.function.DataTable.js.yui
|
|
160
|
+
match: \.(addRow|appendRow|deleteRow|deleteSelectedRows|doBeforeLoadData|editCell|focusTable|formatCell|getBody|getCell|getColumnSet|getHead|getRecordSet|getRow|getSelectedCells|getSelectedRecordIds|getSelectedRows|getTable|hideTableMessages|highlight|insertRows|isSelected|onDataReturnAppendRows|onDataReturnInsertRows|onDataReturnPaginateRows|onDataReturnReplaceRows|onEventEditCell|onEventFormatCell|onEventHighlightCell|onEventSelectCell|onEventSelectRow|onEventSortColumn|onEventUnhighlightCell|paginateRows|replaceRows|select|showEmptyMessage|showLoadingMessage|showPage|sortColumn|unhighlight|unselect|unselectedAllCells|unselectAllRows|updateRow)\b(?=\()
|
|
161
|
+
- name: support.function.Record.js.yui
|
|
162
|
+
match: \.()\b(?=\()
|
|
163
|
+
- name: support.function.RecordSet.js.yui
|
|
164
|
+
match: \.(addRecord|addRecords|append|deleteRecord|getLength|getRecord|getRecordBy|getRecordIndex|getRecords|insert|replace|reset|sort|updateRecord)\b(?=\()
|
|
165
|
+
- name: support.function.Sort.js.yui
|
|
166
|
+
match: \.(compareAsc|compareDesc)\b(?=\()
|
|
167
|
+
- name: support.function.WidthResizer.js.yui
|
|
168
|
+
match: \.(onDrag|onMouseDown|onMouseUp)\b(?=\()
|
|
169
|
+
- name: support.function.Button.js.yui
|
|
170
|
+
match: \.(addHiddenFieldsToForm|blur|createHiddenField|createInputElement|destroy|focus|getFirstElement|getForm|getMenu|hasFocus|init|initAttributes|initConfig|isActive|setAttributeFromDOMAttribute|setAttributesFromSrcElement|setFormElementProperties)\b(?=\()
|
|
171
|
+
- name: support.function.ButtonGroup.js.yui
|
|
172
|
+
match: \.(addButton|addButtons|check|destroy|focus|getButton|getButtons|getCount|init|initAttributes|removeButton)\b(?=\()
|
|
173
|
+
- include: source.js
|
|
174
|
+
foldingStopMarker: (^\s*\}|^\s*\)|^(?!.*/\*).*\*/)
|
|
175
|
+
keyEquivalent: ^~J
|
|
176
|
+
comment: Yahoo User Interface Library
|
|
@@ -0,0 +1,727 @@
|
|
|
1
|
+
require 'set'
|
|
2
|
+
require 'tree'
|
|
3
|
+
require 'facets'
|
|
4
|
+
|
|
5
|
+
require 'log4r'
|
|
6
|
+
include Log4r
|
|
7
|
+
|
|
8
|
+
class Bayeux
|
|
9
|
+
|
|
10
|
+
# Start parsing
|
|
11
|
+
def parse(content)
|
|
12
|
+
|
|
13
|
+
# Set-up the logger
|
|
14
|
+
@parse_log = Logger.new('bayex_parser')
|
|
15
|
+
@parse_log.outputters = Outputter.stdout
|
|
16
|
+
|
|
17
|
+
# Save the content for later
|
|
18
|
+
@content = content
|
|
19
|
+
|
|
20
|
+
# Final string to return to the caller
|
|
21
|
+
pandoc_str = String.new
|
|
22
|
+
|
|
23
|
+
# Forest containing the paragraph level block trees
|
|
24
|
+
@block_forest = Array.new
|
|
25
|
+
|
|
26
|
+
# Index of the paragraph blocks
|
|
27
|
+
@block_index = 0
|
|
28
|
+
|
|
29
|
+
# Indicies into the content, denoting the current limits of
|
|
30
|
+
# parsing
|
|
31
|
+
from_index = 0
|
|
32
|
+
to_index = content.length
|
|
33
|
+
|
|
34
|
+
## Procedure for adding a node to the tree
|
|
35
|
+
new_node = ->(node_type = :none, node_contents = ""){
|
|
36
|
+
|
|
37
|
+
@block_index += 100
|
|
38
|
+
@parse_log.info {"creating node #{@block_index}"}
|
|
39
|
+
return Tree::TreeNode.new(@block_index, ParaBlock.new(node_type, node_contents))
|
|
40
|
+
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
# Chunk the content into paragraph blocks
|
|
44
|
+
while from_index < to_index do
|
|
45
|
+
|
|
46
|
+
# Look for the next space, and the next next '[' character
|
|
47
|
+
# which should tell us what type of paragraph we are dealing with
|
|
48
|
+
space_index = content.index(' ', from_index)
|
|
49
|
+
left_sb_index = content.index(']', from_index)
|
|
50
|
+
block_start = content.index('[', from_index)
|
|
51
|
+
|
|
52
|
+
if block_start.nil? then
|
|
53
|
+
# It's a paragraph
|
|
54
|
+
unless space_index.nil? then
|
|
55
|
+
block = ParaBlock.new(:paragraph, "")
|
|
56
|
+
block_start = from_index
|
|
57
|
+
else
|
|
58
|
+
# No more blocks
|
|
59
|
+
break
|
|
60
|
+
end
|
|
61
|
+
elsif (left_sb_index < space_index) and (left_sb_index > block_start) then
|
|
62
|
+
# This should be a block start marker
|
|
63
|
+
orig_type_length = (left_sb_index - 1) - block_start
|
|
64
|
+
block = ParaBlock.from_s(content[block_start + 1, orig_type_length])
|
|
65
|
+
|
|
66
|
+
elsif space_index > block_start then
|
|
67
|
+
# This should be an annotated block
|
|
68
|
+
orig_type_length = space_index - (block_start + 1)
|
|
69
|
+
block = ParaBlock.from_s(content[block_start + 1, orig_type_length])
|
|
70
|
+
|
|
71
|
+
elsif space_index < block_start then
|
|
72
|
+
# It's a paragraph
|
|
73
|
+
unless space_index.nil? then
|
|
74
|
+
block = ParaBlock.new(:paragraph, "")
|
|
75
|
+
block_start = from_index
|
|
76
|
+
else
|
|
77
|
+
@parse_log.error {"Cannot find a valid block (syntax error in the start of block characters)"}
|
|
78
|
+
return nil
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
# Now we know the type of block, and where it starts, work out
|
|
83
|
+
# where the end of the block is
|
|
84
|
+
case block.type
|
|
85
|
+
when :h1,:h2,:h3,:h4,:h5,:h6,:bib
|
|
86
|
+
# Look for a terminating ']'
|
|
87
|
+
block_end = left_sb_index
|
|
88
|
+
|
|
89
|
+
# Add the node, and paragraph sub_tree, to the block forest
|
|
90
|
+
block.content = content_string(block_start + 4, block_end)
|
|
91
|
+
para_node = Tree::TreeNode.new(@block_index, block)
|
|
92
|
+
para_subtree(para_node)
|
|
93
|
+
@block_forest << para_node
|
|
94
|
+
|
|
95
|
+
when :paragraph
|
|
96
|
+
# Look for a single new line, containing only whitespace
|
|
97
|
+
block_end = content.index(/^\s/, block_start)
|
|
98
|
+
|
|
99
|
+
# Add a node to the block forest
|
|
100
|
+
block.content = content_string(block_start, block_end)
|
|
101
|
+
para_node = Tree::TreeNode.new(@block_index, block)
|
|
102
|
+
para_subtree(para_node)
|
|
103
|
+
@block_forest << para_node
|
|
104
|
+
|
|
105
|
+
when :medskip
|
|
106
|
+
# Self-terminating
|
|
107
|
+
block_end = block_start + 9
|
|
108
|
+
|
|
109
|
+
# Add a node to the block forest
|
|
110
|
+
para_node = Tree::TreeNode.new(@block_index, block)
|
|
111
|
+
@block_forest << para_node
|
|
112
|
+
|
|
113
|
+
when :command, :output, :file
|
|
114
|
+
# Look for a terminating '[end]'
|
|
115
|
+
block_end = content.index('[end]', block_start)
|
|
116
|
+
content_index = block_start + (block.orig_type_length + 2)
|
|
117
|
+
|
|
118
|
+
# Add a node to the block forest, and do no further processing
|
|
119
|
+
block.content = content_string(content_index, block_end)
|
|
120
|
+
para_node = Tree::TreeNode.new(@block_index, block)
|
|
121
|
+
@block_forest << para_node
|
|
122
|
+
|
|
123
|
+
# Skip the 'end'
|
|
124
|
+
block_end += 5
|
|
125
|
+
|
|
126
|
+
when :code
|
|
127
|
+
# Look for a terminating '[end]'
|
|
128
|
+
block_end = content.index('[end]', block_start)
|
|
129
|
+
content_index = block_start + (block.orig_type_length + 2)
|
|
130
|
+
|
|
131
|
+
# Look for arguments to the block
|
|
132
|
+
unless content[from_index + 1] == ']' then
|
|
133
|
+
|
|
134
|
+
# Find the end of the arguments
|
|
135
|
+
arg_end = content.index(/]\s/, from_index)
|
|
136
|
+
arguments = content[from_index + 6, (arg_end - (from_index + 6))]
|
|
137
|
+
|
|
138
|
+
# Create the parent node for this content
|
|
139
|
+
code_start = content.index(/^/, arg_end)
|
|
140
|
+
block.content = content_string(code_start, block_end)
|
|
141
|
+
para_node = Tree::TreeNode.new(@block_index, block)
|
|
142
|
+
|
|
143
|
+
# Split the item
|
|
144
|
+
items = arguments.split('|')
|
|
145
|
+
|
|
146
|
+
# Create a node for the description title
|
|
147
|
+
unless items[0].nil? then
|
|
148
|
+
para_node << new_node.call(:code_language, items[0].strip)
|
|
149
|
+
else
|
|
150
|
+
para_node << new_node.call(:code_language, "")
|
|
151
|
+
end
|
|
152
|
+
|
|
153
|
+
# Create the description text
|
|
154
|
+
unless items[1].nil? then
|
|
155
|
+
para_node << new_node.call(:code_start_number, items[1].strip)
|
|
156
|
+
else
|
|
157
|
+
para_node << new_node.call(:code_start_number, "0")
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
else
|
|
161
|
+
|
|
162
|
+
# Create the parent node for this content
|
|
163
|
+
block.content = content_string(content_index, block_end)
|
|
164
|
+
para_node = Tree::TreeNode.new(@block_index, block)
|
|
165
|
+
|
|
166
|
+
para_node << new_node.call(:code_language, "")
|
|
167
|
+
para_node << new_node.call(:code_start_number, "0")
|
|
168
|
+
|
|
169
|
+
end
|
|
170
|
+
|
|
171
|
+
# Add a node to the block forest, and do no further processing
|
|
172
|
+
@block_forest << para_node
|
|
173
|
+
|
|
174
|
+
# Skip the 'end'
|
|
175
|
+
block_end += 5
|
|
176
|
+
|
|
177
|
+
when :block_quote, :figure, :note, :quote
|
|
178
|
+
# Look for a terminating '[end]'
|
|
179
|
+
block_end = content.index('[end]', block_start)
|
|
180
|
+
content_index = block_start + (block.orig_type_length + 2)
|
|
181
|
+
|
|
182
|
+
# Add a node to the block forest
|
|
183
|
+
block.content = content_string(content_index, block_end)
|
|
184
|
+
para_node = Tree::TreeNode.new(@block_index, block)
|
|
185
|
+
para_subtree(para_node)
|
|
186
|
+
@block_forest << para_node
|
|
187
|
+
|
|
188
|
+
# Skip the 'end'
|
|
189
|
+
block_end += 5
|
|
190
|
+
|
|
191
|
+
when :dl
|
|
192
|
+
# Look for a terminating '[end]'
|
|
193
|
+
block_end = content.index('[end]', block_start)
|
|
194
|
+
|
|
195
|
+
## Description List blocks are really two blocks, so should be
|
|
196
|
+
## parsed as such. First we look for (and parse) the description
|
|
197
|
+
## header, then we look for (and parse) the description body. We
|
|
198
|
+
## keep doing this until we run out of things to do.
|
|
199
|
+
|
|
200
|
+
# Create the master node for the list
|
|
201
|
+
dl_node = new_node.call(:dl)
|
|
202
|
+
|
|
203
|
+
# Get the list contents
|
|
204
|
+
content_index = block_start + (block.orig_type_length + 2)
|
|
205
|
+
list_content = content_string(content_index, block_end)
|
|
206
|
+
|
|
207
|
+
# First break the list into components
|
|
208
|
+
list_items = list_content.split(/^\n/)
|
|
209
|
+
|
|
210
|
+
# Process each list item
|
|
211
|
+
list_items.each{|list_item|
|
|
212
|
+
|
|
213
|
+
# Break the list item into a description header and
|
|
214
|
+
# description body
|
|
215
|
+
break_at = list_item.index(/:$/)
|
|
216
|
+
item_index = list_item.index('[item')
|
|
217
|
+
item_end = list_item.rindex(']')
|
|
218
|
+
|
|
219
|
+
description_header = list_item[item_index + 5, break_at - 5]
|
|
220
|
+
description_body = list_item[break_at + 1, (item_end - break_at - 1)]
|
|
221
|
+
|
|
222
|
+
# Parse the description header
|
|
223
|
+
header_node = new_node.call(:dl_header, description_header)
|
|
224
|
+
para_subtree(header_node)
|
|
225
|
+
dl_node << header_node
|
|
226
|
+
|
|
227
|
+
# Parse the description body
|
|
228
|
+
body_node = new_node.call(:dl_text, description_body)
|
|
229
|
+
para_subtree(body_node)
|
|
230
|
+
dl_node << body_node
|
|
231
|
+
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
# Add the node to the block forest
|
|
235
|
+
@block_forest << dl_node
|
|
236
|
+
|
|
237
|
+
# Skip the 'end'
|
|
238
|
+
block_end += 5
|
|
239
|
+
|
|
240
|
+
when :ol, :ul
|
|
241
|
+
# Lists are special because they can be nested. Hence we
|
|
242
|
+
# have to be a bit careful about the end marker.
|
|
243
|
+
block_end = content.index(/\[end\]((\n\n)|($\z))/, block_start)
|
|
244
|
+
|
|
245
|
+
if block_end.nil? then
|
|
246
|
+
@parse_log.error {"Error: Invalid end to a list"}
|
|
247
|
+
@parse_log.error {"Backtrace: #{to_s}"}
|
|
248
|
+
return nil
|
|
249
|
+
end
|
|
250
|
+
|
|
251
|
+
# Add a node to the block forest
|
|
252
|
+
block.content = content_string(block_start + 4, block_end)
|
|
253
|
+
para_node = Tree::TreeNode.new(@block_index, block)
|
|
254
|
+
para_subtree(para_node)
|
|
255
|
+
@block_forest << para_node
|
|
256
|
+
|
|
257
|
+
# Skip the 'end'
|
|
258
|
+
block_end += 5
|
|
259
|
+
|
|
260
|
+
else
|
|
261
|
+
@parse_log.error {"Error: Unknown block type '#{block.type}'"}
|
|
262
|
+
@parse_log.error {"Backtrace: #{to_s}"}
|
|
263
|
+
return nil
|
|
264
|
+
|
|
265
|
+
end
|
|
266
|
+
|
|
267
|
+
@block_index += 100
|
|
268
|
+
|
|
269
|
+
# Skip spaces
|
|
270
|
+
unless block_end.nil? then
|
|
271
|
+
from_index = block_end + 1
|
|
272
|
+
until not (content[from_index] =~ /\n/) do
|
|
273
|
+
from_index += 1
|
|
274
|
+
end
|
|
275
|
+
else
|
|
276
|
+
return nil
|
|
277
|
+
end
|
|
278
|
+
|
|
279
|
+
end
|
|
280
|
+
|
|
281
|
+
end
|
|
282
|
+
|
|
283
|
+
###
|
|
284
|
+
### Generators: Convinience functions taking an AST (Abstract Syntax Tree),
|
|
285
|
+
### and returning a document of the specified type
|
|
286
|
+
###
|
|
287
|
+
|
|
288
|
+
def to_s
|
|
289
|
+
return_str = String.new
|
|
290
|
+
@block_forest.each{|tree|
|
|
291
|
+
return_str << "Paragraph Type: #{tree.content.type}\n"
|
|
292
|
+
return_str << "\n"
|
|
293
|
+
|
|
294
|
+
tree.each{|node|
|
|
295
|
+
return_str << " Node Name: #{node.name}\n"
|
|
296
|
+
return_str << " Node Type: #{node.content.type}\n"
|
|
297
|
+
return_str << " Node Depth: #{node.node_depth}\n"
|
|
298
|
+
|
|
299
|
+
node_content = node.content.content.inspect.line_wrap(70,2).indent(17)
|
|
300
|
+
return_str << " Node Contents: |#{node_content[17, node_content.length]}|\n\n"
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
return return_str
|
|
304
|
+
end
|
|
305
|
+
|
|
306
|
+
def to_json(*a)
|
|
307
|
+
begin
|
|
308
|
+
require 'json'
|
|
309
|
+
|
|
310
|
+
json_hash = {
|
|
311
|
+
"block_forest" => @block_forest,
|
|
312
|
+
JSON.create_id => self.class.name
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
return json_hash.to_json
|
|
316
|
+
|
|
317
|
+
rescue LoadError
|
|
318
|
+
warn "The JSON gem couldn't be loaded, and so the JSON representation could not be generated"
|
|
319
|
+
end
|
|
320
|
+
end
|
|
321
|
+
|
|
322
|
+
def self.json_create(json_hash)
|
|
323
|
+
begin
|
|
324
|
+
require 'json'
|
|
325
|
+
|
|
326
|
+
syntax_tree = new(json_hash["block_forest"])
|
|
327
|
+
return syntax_tree
|
|
328
|
+
|
|
329
|
+
rescue LoadError
|
|
330
|
+
warn "The JSON gem couldn't be loaded, and so the JSON representation could not be generated"
|
|
331
|
+
end
|
|
332
|
+
end
|
|
333
|
+
|
|
334
|
+
###
|
|
335
|
+
### Accessors
|
|
336
|
+
###
|
|
337
|
+
|
|
338
|
+
attr_reader :block_forest
|
|
339
|
+
|
|
340
|
+
###
|
|
341
|
+
### Helper functions
|
|
342
|
+
###
|
|
343
|
+
|
|
344
|
+
def content_string(first, last)
|
|
345
|
+
unless first.nil? or last.nil? then
|
|
346
|
+
return @content[first, (last - first)]
|
|
347
|
+
else
|
|
348
|
+
return ""
|
|
349
|
+
end
|
|
350
|
+
end
|
|
351
|
+
|
|
352
|
+
# Return the sub-tree of paragraph blocks, given a suitably initalised
|
|
353
|
+
# root of a tree
|
|
354
|
+
def para_subtree(tree_root)
|
|
355
|
+
|
|
356
|
+
# Set containing the next codepoints to search for
|
|
357
|
+
stop_at = Set.new [10,12,13,32,34,45,46,91,93]
|
|
358
|
+
|
|
359
|
+
# Value of the current block
|
|
360
|
+
block_index = tree_root.name.to_i
|
|
361
|
+
|
|
362
|
+
# Flag indicating the start of a new block
|
|
363
|
+
block_start = false
|
|
364
|
+
|
|
365
|
+
# String holding the list of characters to parse
|
|
366
|
+
content_string = tree_root.content.to_s
|
|
367
|
+
|
|
368
|
+
# Massage the content string to replace pseudo-blocks
|
|
369
|
+
content_string.gsub!(/\s'([^']+)'/, ' [single_quote \1]')
|
|
370
|
+
|
|
371
|
+
# Index into the content string
|
|
372
|
+
string_index = 0
|
|
373
|
+
|
|
374
|
+
## Procedure for adding a node to the tree
|
|
375
|
+
new_node = ->(node_type = :none, node_contents = ""){
|
|
376
|
+
|
|
377
|
+
block_index += 1
|
|
378
|
+
@parse_log.debug {"creating node #{block_index}"}
|
|
379
|
+
return Tree::TreeNode.new(block_index, ParaBlock.new(node_type, node_contents))
|
|
380
|
+
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
# Register holding the current paragraph string being built
|
|
384
|
+
register = new_node.call
|
|
385
|
+
|
|
386
|
+
# Add new nodes to here
|
|
387
|
+
add_to = tree_root
|
|
388
|
+
|
|
389
|
+
## Procedure for attaching the tree node held in the register to the current attachment
|
|
390
|
+
## point of the growing tree
|
|
391
|
+
attach_register = -> {
|
|
392
|
+
|
|
393
|
+
begin
|
|
394
|
+
@parse_log.debug {" > attaching node #{register.name} as a child of #{add_to.name} (#{register.content.to_debug_s})"}
|
|
395
|
+
add_to << register
|
|
396
|
+
rescue
|
|
397
|
+
tree_root.print_tree
|
|
398
|
+
raise
|
|
399
|
+
end
|
|
400
|
+
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
## Procedure for adding the register to the tree, at the current level. This also
|
|
404
|
+
## creates a new node at the same level, and sets the register to point to that
|
|
405
|
+
## node
|
|
406
|
+
add_current_node = -> {
|
|
407
|
+
|
|
408
|
+
# Save a pointer to the current node
|
|
409
|
+
attach_register.call
|
|
410
|
+
|
|
411
|
+
# Add a new node at the same level as the current_node
|
|
412
|
+
register = new_node.call
|
|
413
|
+
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
## Procedure for down the tree. This involves saving the current contents of the
|
|
417
|
+
## register as a new node at the current level, then creating a new node as a child
|
|
418
|
+
move_down_tree = -> {
|
|
419
|
+
@parse_log.debug {"-> going down #{register.name} (#{register.content.to_debug_s})"}
|
|
420
|
+
|
|
421
|
+
# Save the current node, pointed to by the register
|
|
422
|
+
attach_register.call
|
|
423
|
+
|
|
424
|
+
# Add future nodes as the child of this node
|
|
425
|
+
add_to = register
|
|
426
|
+
|
|
427
|
+
# Create a new node as the first child
|
|
428
|
+
register = new_node.call
|
|
429
|
+
|
|
430
|
+
# Flag the start of a new block
|
|
431
|
+
block_start = true
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
## Procedure for moving up the tree, from the current node
|
|
435
|
+
## (identified by the register), to the next level up
|
|
436
|
+
move_up_tree = -> {
|
|
437
|
+
@parse_log.debug {"<- going up #{register.name} (#{register.content.to_debug_s})"}
|
|
438
|
+
|
|
439
|
+
# Save the current node, pointed to by the register
|
|
440
|
+
attach_register.call
|
|
441
|
+
|
|
442
|
+
# Move up the tree
|
|
443
|
+
add_to = add_to.parent
|
|
444
|
+
register = new_node.call
|
|
445
|
+
|
|
446
|
+
# Remove any 'empty' children (sub-tree nodes that we might
|
|
447
|
+
# have just added, but which in fact could be trimmed)
|
|
448
|
+
#clean_children.call
|
|
449
|
+
|
|
450
|
+
}
|
|
451
|
+
|
|
452
|
+
###
|
|
453
|
+
### Parse the content
|
|
454
|
+
###
|
|
455
|
+
|
|
456
|
+
content_string.each_codepoint{|codepoint|
|
|
457
|
+
|
|
458
|
+
# Check if we need to stop, in order to process the next block
|
|
459
|
+
if stop_at.include?(codepoint) then
|
|
460
|
+
|
|
461
|
+
# If a stop has been requested, undertake the action
|
|
462
|
+
# indicated by the current codepoint
|
|
463
|
+
case codepoint
|
|
464
|
+
|
|
465
|
+
# Check if this is a new block (we may be dealing with a block
|
|
466
|
+
# terminated by a new-line, instead of a space)
|
|
467
|
+
when 10,12,13
|
|
468
|
+
|
|
469
|
+
if block_start then
|
|
470
|
+
|
|
471
|
+
# Record the block type, and re-set the register content
|
|
472
|
+
register.content.content_to_type!
|
|
473
|
+
|
|
474
|
+
# Unset the start of a new block flag
|
|
475
|
+
block_start = false
|
|
476
|
+
|
|
477
|
+
elsif not ((register.content.empty?) or (content_string[string_index - 1] =~ /^\s/)) then
|
|
478
|
+
# Otherwise treat the new-line as a space, but suppress multiple spaces
|
|
479
|
+
register.content << " "
|
|
480
|
+
end
|
|
481
|
+
|
|
482
|
+
# On a space character, first check if the flag indicating the start
|
|
483
|
+
# of a block. If set, this should indicate that this space follows the
|
|
484
|
+
# name of the block
|
|
485
|
+
when 32
|
|
486
|
+
|
|
487
|
+
if block_start then
|
|
488
|
+
|
|
489
|
+
# Record the block type if not already set
|
|
490
|
+
if register.content.type == :none then
|
|
491
|
+
register.content.content_to_type!
|
|
492
|
+
else
|
|
493
|
+
register.content << " "
|
|
494
|
+
end
|
|
495
|
+
|
|
496
|
+
# Unset the start of a new block flag
|
|
497
|
+
block_start = false
|
|
498
|
+
|
|
499
|
+
else
|
|
500
|
+
|
|
501
|
+
# If this is not the start of a block, pass on the space (but suppress multiple spaces)
|
|
502
|
+
unless content_string[string_index - 1] =~ /^\s/ then
|
|
503
|
+
register.content << " "
|
|
504
|
+
end
|
|
505
|
+
|
|
506
|
+
end
|
|
507
|
+
|
|
508
|
+
# On a double quote, we need to check if this is a special block (the single
|
|
509
|
+
# quote block), or something else
|
|
510
|
+
when 34
|
|
511
|
+
|
|
512
|
+
# If the last character was whitespace, this should be the start of
|
|
513
|
+
# a single quote block
|
|
514
|
+
if content_string[string_index - 1] =~ /\s|\W/ then
|
|
515
|
+
|
|
516
|
+
# Create a new sub-block of the current block
|
|
517
|
+
move_down_tree.call
|
|
518
|
+
|
|
519
|
+
# Set the block type
|
|
520
|
+
register.content.type = :double_quote
|
|
521
|
+
|
|
522
|
+
# If the next character is not alphanumeric, then this should be the
|
|
523
|
+
# end of a single quote block
|
|
524
|
+
elsif not content_string[string_index + 1] =~ /\w/ then
|
|
525
|
+
|
|
526
|
+
# Move back to the parent of the quote block
|
|
527
|
+
move_up_tree.call
|
|
528
|
+
|
|
529
|
+
# No significance, so pass it on
|
|
530
|
+
else
|
|
531
|
+
register.content << "'"
|
|
532
|
+
end
|
|
533
|
+
|
|
534
|
+
# Count the minus signs: this could be a hypen, an em-dash or an en-dash
|
|
535
|
+
when 45
|
|
536
|
+
|
|
537
|
+
if content_string[string_index + 1] =~ /\s|\w/ and not content_string[string_index + 1] == '-' then
|
|
538
|
+
|
|
539
|
+
if ((content_string[string_index - 1] == '-') and (content_string[string_index - 2] == '-')) then
|
|
540
|
+
|
|
541
|
+
# Add the current content, and create a new node at the same level
|
|
542
|
+
add_current_node.call
|
|
543
|
+
|
|
544
|
+
# Change the type of the register, and add it to the tree (which also
|
|
545
|
+
# create a new new at the same level for the following content)
|
|
546
|
+
register.content.type = :em_dash
|
|
547
|
+
add_current_node.call
|
|
548
|
+
|
|
549
|
+
elsif content_string[string_index - 1] == '-'
|
|
550
|
+
|
|
551
|
+
# Add the current content, and create a new node at the same level
|
|
552
|
+
add_current_node.call
|
|
553
|
+
|
|
554
|
+
# Change the type of the register, and add it to the tree (which also
|
|
555
|
+
# create a new new at the same level for the following content)
|
|
556
|
+
register.content.type = :en_dash
|
|
557
|
+
add_current_node.call
|
|
558
|
+
|
|
559
|
+
else
|
|
560
|
+
register.content << "-"
|
|
561
|
+
end
|
|
562
|
+
|
|
563
|
+
end
|
|
564
|
+
|
|
565
|
+
# Count the dots: this could be an elipses
|
|
566
|
+
when 46
|
|
567
|
+
register.content << "."
|
|
568
|
+
|
|
569
|
+
if content_string[string_index + 1] =~ /\s|\w|$/ then
|
|
570
|
+
|
|
571
|
+
# Work out how many dots there are
|
|
572
|
+
split = register.content.content.rpartition(/\s|\w/)
|
|
573
|
+
|
|
574
|
+
unless split[0].empty? then
|
|
575
|
+
|
|
576
|
+
case split[2].length
|
|
577
|
+
|
|
578
|
+
when 3
|
|
579
|
+
register.content.content = split[0] + split[1]
|
|
580
|
+
add_current_node.call
|
|
581
|
+
|
|
582
|
+
register.content.type = :elipses
|
|
583
|
+
add_current_node.call
|
|
584
|
+
|
|
585
|
+
when 4
|
|
586
|
+
add_current_node.call
|
|
587
|
+
register.content.content = split[0] + split[1]
|
|
588
|
+
|
|
589
|
+
register.content.type = :elipses_stop
|
|
590
|
+
add_current_node.call
|
|
591
|
+
end
|
|
592
|
+
end
|
|
593
|
+
end
|
|
594
|
+
|
|
595
|
+
|
|
596
|
+
# On the start of a new block, first record the old block
|
|
597
|
+
# then initialize the new
|
|
598
|
+
when 91
|
|
599
|
+
|
|
600
|
+
# Move down the tree
|
|
601
|
+
move_down_tree.call
|
|
602
|
+
|
|
603
|
+
# Flag the start of a new block
|
|
604
|
+
block_start = true
|
|
605
|
+
|
|
606
|
+
# At the termination of a block, transform the block text to the
|
|
607
|
+
# literal equivalent
|
|
608
|
+
when 93
|
|
609
|
+
|
|
610
|
+
## Do any special processing ##
|
|
611
|
+
|
|
612
|
+
# Supress block characters from lists that are
|
|
613
|
+
# dealt with elsewhere
|
|
614
|
+
if register.content.type == :none then
|
|
615
|
+
|
|
616
|
+
case register.content.to_s
|
|
617
|
+
when "end", "ol", "ul"
|
|
618
|
+
register.content.clear
|
|
619
|
+
end
|
|
620
|
+
|
|
621
|
+
end
|
|
622
|
+
|
|
623
|
+
# Split items in links
|
|
624
|
+
if register.content.type == :link then
|
|
625
|
+
# Split the item
|
|
626
|
+
items = register.content.to_s.split('|')
|
|
627
|
+
|
|
628
|
+
# Create a node for the link title
|
|
629
|
+
unless items[0].nil? then
|
|
630
|
+
title = new_node.call(:link_text, items[0].strip)
|
|
631
|
+
register << title
|
|
632
|
+
end
|
|
633
|
+
|
|
634
|
+
# Create a node for the link target
|
|
635
|
+
unless items[1].nil? then
|
|
636
|
+
target = new_node.call(:link_target, items[1].strip)
|
|
637
|
+
register << target
|
|
638
|
+
end
|
|
639
|
+
end
|
|
640
|
+
|
|
641
|
+
# Add the register to the tree, and move back up to
|
|
642
|
+
# the previous level
|
|
643
|
+
move_up_tree.call
|
|
644
|
+
|
|
645
|
+
end
|
|
646
|
+
else
|
|
647
|
+
# If we are not stopping, just add the codepoint to the register
|
|
648
|
+
register.content << codepoint
|
|
649
|
+
end
|
|
650
|
+
|
|
651
|
+
# Increment the string index
|
|
652
|
+
string_index += 1
|
|
653
|
+
|
|
654
|
+
}
|
|
655
|
+
|
|
656
|
+
# Add the last node to the tree
|
|
657
|
+
attach_register.call
|
|
658
|
+
|
|
659
|
+
## Prune any null nodes: this makes the tree smaller, and means we can idenify
|
|
660
|
+
## places where the branches need to be re-ordered
|
|
661
|
+
|
|
662
|
+
tree_root.each{|node|
|
|
663
|
+
if node.content.type == :none and node.content.empty? then
|
|
664
|
+
@parse_log.debug {"--- pruning node #{node.name}"}
|
|
665
|
+
node.remove_from_parent!
|
|
666
|
+
end
|
|
667
|
+
}
|
|
668
|
+
|
|
669
|
+
## Now we need to walk the AST, patching up the types so that enclosing
|
|
670
|
+
## types work properly. This requires finding all the :none nodes, and
|
|
671
|
+
## working out the correct type from the found siblings. To make sure
|
|
672
|
+
## we infer the correct type, we need to do a breadth first walk
|
|
673
|
+
|
|
674
|
+
tree_root.breadth_each{|node|
|
|
675
|
+
|
|
676
|
+
# First look 'across' the tree, looking for cases where enclosing node
|
|
677
|
+
# have not been properly identified
|
|
678
|
+
if node.is_first_sibling? then
|
|
679
|
+
|
|
680
|
+
# Check the type of the last sibling: if this is :none, then
|
|
681
|
+
# we have something like a list, where the paragraph text needs to
|
|
682
|
+
# be separated from the element type
|
|
683
|
+
if node.first_sibling.content.type != :none and node.last_sibling.content.type == :none then
|
|
684
|
+
@parse_log.info {"examining node #{node.name}"}
|
|
685
|
+
|
|
686
|
+
# Patch the type hierarchy. The easiest way to do this is to
|
|
687
|
+
# look for a parent whose type is also :none: if found we can
|
|
688
|
+
# 'borrow' the node as the item type
|
|
689
|
+
if node.parent.content.type == :none and node.parent.content.empty? then
|
|
690
|
+
@parse_log.info {"changing parent type"}
|
|
691
|
+
node.parent.content.type = node.content.type
|
|
692
|
+
node.content.type = :none
|
|
693
|
+
|
|
694
|
+
# Otherwise we have to work a bit harder, separating us and
|
|
695
|
+
# our siblings, creating a new node of the correct type, and
|
|
696
|
+
# binding everything back together
|
|
697
|
+
else
|
|
698
|
+
@parse_log.info {"re-ordering siblings"}
|
|
699
|
+
siblings = node.siblings
|
|
700
|
+
|
|
701
|
+
new_root = new_node.call(node.content.type)
|
|
702
|
+
node.parent << new_root
|
|
703
|
+
|
|
704
|
+
node.remove_from_parent!
|
|
705
|
+
new_root << node
|
|
706
|
+
siblings.each{|node|
|
|
707
|
+
@parse_log.info {"removing node #{node.name}"}
|
|
708
|
+
@parse_log.info {"attaching to #{new_root.name}"}
|
|
709
|
+
node.remove_from_parent!
|
|
710
|
+
new_root << node
|
|
711
|
+
}
|
|
712
|
+
|
|
713
|
+
end
|
|
714
|
+
|
|
715
|
+
end
|
|
716
|
+
end
|
|
717
|
+
}
|
|
718
|
+
|
|
719
|
+
# We need to preserve the children, so delete the content from
|
|
720
|
+
# the parent to tell users of the AST to walk our children
|
|
721
|
+
tree_root.content.clear
|
|
722
|
+
|
|
723
|
+
end
|
|
724
|
+
|
|
725
|
+
private :para_subtree
|
|
726
|
+
|
|
727
|
+
end
|