[SUCS Devel] site r657 - in trunk: . components db_changes htdocs htdocs/css htdocs/desktop htdocs/files htdocs/files/Help htdocs/images htdocs/images/bananas htdocs/js htdocs/js/tinymce htdocs/js/tinymce/docs htdocs/js/tinymce/docs/css htdocs/js/tinymce/docs/images htdocs/js/tinymce/docs/tinymce_api htdocs/js/tinymce/examples htdocs/pictures/people lib lib/Validate lib/venus lib/venus/docs lib/venus/docs/img lib/venus/examples lib/venus/examples/filters lib/venus/examples/filters/categories lib/venus/examples/filters/guess-language lib/venus/examples/filters/xpath-sifter lib/venus/examples/images lib/venus/filters lib/venus/filters/delDupName lib/venus/filters/stripAd lib/venus/planet lib/venus/planet/shell lib/venus/planet/vendor lib/venus/planet/vendor/compat_logging lib/venus/planet/vendor/html5lib lib/venus/planet/vendor/html5lib/filters lib/venus/planet/vendor/html5lib/serializer lib/venus/planet/vendor/html5lib/treebuilders lib/venus/planet/vendor/html5lib/treewalkers lib/venus/planet/vendor/httplib2 lib/venus/sucs lib/venus/themes lib/venus/themes/asf lib/venus/themes/classic_fancy lib/venus/themes/common lib/venus/themes/common/images lib/venus/themes/django lib/venus/themes/genshi_fancy lib/venus/themes/mobile lib/venus/themes/musings plugins templates templates_c
imranh at sucs.org
imranh at sucs.org
Sun Apr 5 17:42:48 BST 2015
Author: imranh
Date: 2015-04-05 17:42:47 +0100 (Sun, 05 Apr 2015)
New Revision: 657
Added:
trunk/components/disk.graph.php
trunk/components/disk.php
trunk/components/election.php
trunk/components/electionreminder.php
trunk/components/events.php
trunk/components/events_ical.php
trunk/components/junk.php
trunk/components/libraryadmin.php
trunk/components/membershiprenew.php
trunk/components/motd_wrapper.php
trunk/components/printer.graph.php
trunk/components/printer.php
trunk/components/signup-admin.php
trunk/components/signupajax.php
trunk/components/susignup-admin.php
trunk/components/susignup.php
trunk/db_changes/
trunk/db_changes/sucssite-0.3.sql
trunk/htdocs/css/ie8.css
trunk/htdocs/css/ielt8.css
trunk/htdocs/css/milliways.css
trunk/htdocs/css/susignup-admin.css
trunk/htdocs/images/bananas/banana-container.png
trunk/htdocs/images/bananas/banana-g-container.png
trunk/htdocs/images/border-top-left.gif
trunk/htdocs/images/border-top-left.png
trunk/htdocs/images/border-top-right.gif
trunk/htdocs/images/border-top-right.png
trunk/htdocs/images/shame.php
trunk/htdocs/images/spinner.gif
trunk/htdocs/js/jquery.js
trunk/htdocs/js/signup.js
trunk/htdocs/js/tinymce/changelog
trunk/htdocs/js/tinymce/docs/
trunk/htdocs/js/tinymce/docs/about.html
trunk/htdocs/js/tinymce/docs/compatiblity_chart.html
trunk/htdocs/js/tinymce/docs/credits.html
trunk/htdocs/js/tinymce/docs/css/
trunk/htdocs/js/tinymce/docs/css/screen.css
trunk/htdocs/js/tinymce/docs/customization_language_packs.html
trunk/htdocs/js/tinymce/docs/customization_plugins.html
trunk/htdocs/js/tinymce/docs/customization_themes.html
trunk/htdocs/js/tinymce/docs/faq.html
trunk/htdocs/js/tinymce/docs/images/
trunk/htdocs/js/tinymce/docs/images/moxiecode.gif
trunk/htdocs/js/tinymce/docs/index.html
trunk/htdocs/js/tinymce/docs/installation_example_00.html
trunk/htdocs/js/tinymce/docs/installation_example_01.html
trunk/htdocs/js/tinymce/docs/installation_example_02.html
trunk/htdocs/js/tinymce/docs/installation_example_03.html
trunk/htdocs/js/tinymce/docs/installing.html
trunk/htdocs/js/tinymce/docs/license.html
trunk/htdocs/js/tinymce/docs/option_accessibility_focus.html
trunk/htdocs/js/tinymce/docs/option_accessibility_warnings.html
trunk/htdocs/js/tinymce/docs/option_add_form_submit_trigger.html
trunk/htdocs/js/tinymce/docs/option_add_unload_trigger.html
trunk/htdocs/js/tinymce/docs/option_apply_source_formatting.html
trunk/htdocs/js/tinymce/docs/option_ask.html
trunk/htdocs/js/tinymce/docs/option_auto_focus.html
trunk/htdocs/js/tinymce/docs/option_auto_reset_designmode.html
trunk/htdocs/js/tinymce/docs/option_auto_resize.html
trunk/htdocs/js/tinymce/docs/option_browsers.html
trunk/htdocs/js/tinymce/docs/option_button_tile_map.html
trunk/htdocs/js/tinymce/docs/option_cleanup.html
trunk/htdocs/js/tinymce/docs/option_cleanup_callback.html
trunk/htdocs/js/tinymce/docs/option_cleanup_on_startup.html
trunk/htdocs/js/tinymce/docs/option_content_css.html
trunk/htdocs/js/tinymce/docs/option_convert_fonts_to_spans.html
trunk/htdocs/js/tinymce/docs/option_convert_newlines_to_brs.html
trunk/htdocs/js/tinymce/docs/option_convert_urls.html
trunk/htdocs/js/tinymce/docs/option_custom_shortcuts.html
trunk/htdocs/js/tinymce/docs/option_custom_undo_redo.html
trunk/htdocs/js/tinymce/docs/option_custom_undo_redo_keyboard_shortcuts.html
trunk/htdocs/js/tinymce/docs/option_custom_undo_redo_levels.html
trunk/htdocs/js/tinymce/docs/option_custom_undo_redo_restore_selection.html
trunk/htdocs/js/tinymce/docs/option_debug.html
trunk/htdocs/js/tinymce/docs/option_dialog_type.html
trunk/htdocs/js/tinymce/docs/option_directionality.html
trunk/htdocs/js/tinymce/docs/option_display_tab_class.html
trunk/htdocs/js/tinymce/docs/option_docs_language.html
trunk/htdocs/js/tinymce/docs/option_doctype.html
trunk/htdocs/js/tinymce/docs/option_document_base_url.html
trunk/htdocs/js/tinymce/docs/option_editor_css.html
trunk/htdocs/js/tinymce/docs/option_editor_deselector.html
trunk/htdocs/js/tinymce/docs/option_editor_selector.html
trunk/htdocs/js/tinymce/docs/option_elements.html
trunk/htdocs/js/tinymce/docs/option_encoding.html
trunk/htdocs/js/tinymce/docs/option_entities.html
trunk/htdocs/js/tinymce/docs/option_entity_encoding.html
trunk/htdocs/js/tinymce/docs/option_event_elements.html
trunk/htdocs/js/tinymce/docs/option_execcommand_callback.html
trunk/htdocs/js/tinymce/docs/option_extended_valid_elements.html
trunk/htdocs/js/tinymce/docs/option_external_image_list_url.html
trunk/htdocs/js/tinymce/docs/option_external_link_list_url.html
trunk/htdocs/js/tinymce/docs/option_file_browser_callback.html
trunk/htdocs/js/tinymce/docs/option_fix_content_duplication.html
trunk/htdocs/js/tinymce/docs/option_fix_list_elements.html
trunk/htdocs/js/tinymce/docs/option_fix_table_elements.html
trunk/htdocs/js/tinymce/docs/option_focus_alert.html
trunk/htdocs/js/tinymce/docs/option_font_size_classes.html
trunk/htdocs/js/tinymce/docs/option_font_size_style_values.html
trunk/htdocs/js/tinymce/docs/option_force_br_newlines.html
trunk/htdocs/js/tinymce/docs/option_force_hex_style_colors.html
trunk/htdocs/js/tinymce/docs/option_force_p_newlines.html
trunk/htdocs/js/tinymce/docs/option_handle_event_callback.html
trunk/htdocs/js/tinymce/docs/option_height.html
trunk/htdocs/js/tinymce/docs/option_hidden_tab_class.html
trunk/htdocs/js/tinymce/docs/option_init_instance_callback.html
trunk/htdocs/js/tinymce/docs/option_inline_styles.html
trunk/htdocs/js/tinymce/docs/option_insertimage_callback.html
trunk/htdocs/js/tinymce/docs/option_insertlink_callback.html
trunk/htdocs/js/tinymce/docs/option_invalid_elements.html
trunk/htdocs/js/tinymce/docs/option_language.html
trunk/htdocs/js/tinymce/docs/option_merge_styles_invalid_parents.html
trunk/htdocs/js/tinymce/docs/option_mode.html
trunk/htdocs/js/tinymce/docs/option_nowrap.html
trunk/htdocs/js/tinymce/docs/option_object_resizing.html
trunk/htdocs/js/tinymce/docs/option_onchange_callback.html
trunk/htdocs/js/tinymce/docs/option_oninit.html
trunk/htdocs/js/tinymce/docs/option_onpageload.html
trunk/htdocs/js/tinymce/docs/option_plugins.html
trunk/htdocs/js/tinymce/docs/option_popups_css.html
trunk/htdocs/js/tinymce/docs/option_preformatted.html
trunk/htdocs/js/tinymce/docs/option_relative_urls.html
trunk/htdocs/js/tinymce/docs/option_remove_linebreaks.html
trunk/htdocs/js/tinymce/docs/option_remove_script_host.html
trunk/htdocs/js/tinymce/docs/option_save_callback.html
trunk/htdocs/js/tinymce/docs/option_setupcontent_callback.html
trunk/htdocs/js/tinymce/docs/option_strict_loading_mode.html
trunk/htdocs/js/tinymce/docs/option_submit_patch.html
trunk/htdocs/js/tinymce/docs/option_table_inline_editing.html
trunk/htdocs/js/tinymce/docs/option_textarea_trigger.html
trunk/htdocs/js/tinymce/docs/option_theme.html
trunk/htdocs/js/tinymce/docs/option_theme_advanced_blockformats.html
trunk/htdocs/js/tinymce/docs/option_theme_advanced_buttons_n.html
trunk/htdocs/js/tinymce/docs/option_theme_advanced_buttons_n_add.html
trunk/htdocs/js/tinymce/docs/option_theme_advanced_buttons_n_add_before.html
trunk/htdocs/js/tinymce/docs/option_theme_advanced_container.html
trunk/htdocs/js/tinymce/docs/option_theme_advanced_container_align.html
trunk/htdocs/js/tinymce/docs/option_theme_advanced_container_class.html
trunk/htdocs/js/tinymce/docs/option_theme_advanced_containers.html
trunk/htdocs/js/tinymce/docs/option_theme_advanced_containers_default_align.html
trunk/htdocs/js/tinymce/docs/option_theme_advanced_containers_default_class.html
trunk/htdocs/js/tinymce/docs/option_theme_advanced_custom_layout.html
trunk/htdocs/js/tinymce/docs/option_theme_advanced_disable.html
trunk/htdocs/js/tinymce/docs/option_theme_advanced_fonts.html
trunk/htdocs/js/tinymce/docs/option_theme_advanced_layout_manager.html
trunk/htdocs/js/tinymce/docs/option_theme_advanced_link_targets.html
trunk/htdocs/js/tinymce/docs/option_theme_advanced_path.html
trunk/htdocs/js/tinymce/docs/option_theme_advanced_path_location.html
trunk/htdocs/js/tinymce/docs/option_theme_advanced_resize_horizontal.html
trunk/htdocs/js/tinymce/docs/option_theme_advanced_resizing.html
trunk/htdocs/js/tinymce/docs/option_theme_advanced_resizing_use_cookie.html
trunk/htdocs/js/tinymce/docs/option_theme_advanced_source_editor_height.html
trunk/htdocs/js/tinymce/docs/option_theme_advanced_source_editor_width.html
trunk/htdocs/js/tinymce/docs/option_theme_advanced_source_editor_wrap.html
trunk/htdocs/js/tinymce/docs/option_theme_advanced_statusbar_location.html
trunk/htdocs/js/tinymce/docs/option_theme_advanced_styles.html
trunk/htdocs/js/tinymce/docs/option_theme_advanced_toolbar_align.html
trunk/htdocs/js/tinymce/docs/option_theme_advanced_toolbar_location.html
trunk/htdocs/js/tinymce/docs/option_trim_span_elements.html
trunk/htdocs/js/tinymce/docs/option_urlconverter_callback.html
trunk/htdocs/js/tinymce/docs/option_valid_elements.html
trunk/htdocs/js/tinymce/docs/option_verify_css_classes.html
trunk/htdocs/js/tinymce/docs/option_verify_html.html
trunk/htdocs/js/tinymce/docs/option_visual.html
trunk/htdocs/js/tinymce/docs/option_visual_table_class.html
trunk/htdocs/js/tinymce/docs/option_width.html
trunk/htdocs/js/tinymce/docs/plugin_advhr.html
trunk/htdocs/js/tinymce/docs/plugin_advimage.html
trunk/htdocs/js/tinymce/docs/plugin_advlink.html
trunk/htdocs/js/tinymce/docs/plugin_autosave.html
trunk/htdocs/js/tinymce/docs/plugin_contextmenu.html
trunk/htdocs/js/tinymce/docs/plugin_directionality.html
trunk/htdocs/js/tinymce/docs/plugin_emotions.html
trunk/htdocs/js/tinymce/docs/plugin_flash.html
trunk/htdocs/js/tinymce/docs/plugin_fullpage.html
trunk/htdocs/js/tinymce/docs/plugin_fullscreen.html
trunk/htdocs/js/tinymce/docs/plugin_iespell.html
trunk/htdocs/js/tinymce/docs/plugin_inlinepopups.html
trunk/htdocs/js/tinymce/docs/plugin_insertdatetime.html
trunk/htdocs/js/tinymce/docs/plugin_layer.html
trunk/htdocs/js/tinymce/docs/plugin_noneditable.html
trunk/htdocs/js/tinymce/docs/plugin_paste.html
trunk/htdocs/js/tinymce/docs/plugin_preview.html
trunk/htdocs/js/tinymce/docs/plugin_print.html
trunk/htdocs/js/tinymce/docs/plugin_save.html
trunk/htdocs/js/tinymce/docs/plugin_searchreplace.html
trunk/htdocs/js/tinymce/docs/plugin_spellchecker.html
trunk/htdocs/js/tinymce/docs/plugin_style.html
trunk/htdocs/js/tinymce/docs/plugin_table.html
trunk/htdocs/js/tinymce/docs/plugin_zoom.html
trunk/htdocs/js/tinymce/docs/reference_buttons.html
trunk/htdocs/js/tinymce/docs/reference_configuration.html
trunk/htdocs/js/tinymce/docs/reference_javascript_functions.html
trunk/htdocs/js/tinymce/docs/reference_plugins.html
trunk/htdocs/js/tinymce/docs/tinymce_api/
trunk/htdocs/js/tinymce/docs/tinymce_api/GLOBALS.html
trunk/htdocs/js/tinymce/docs/tinymce_api/TinyMCE_Cleanup.html
trunk/htdocs/js/tinymce/docs/tinymce_api/TinyMCE_Control.html
trunk/htdocs/js/tinymce/docs/tinymce_api/TinyMCE_Engine.html
trunk/htdocs/js/tinymce/docs/tinymce_api/TinyMCE_Layer.html
trunk/htdocs/js/tinymce/docs/tinymce_api/TinyMCE_Popup.html
trunk/htdocs/js/tinymce/docs/tinymce_api/TinyMCE_Selection.html
trunk/htdocs/js/tinymce/docs/tinymce_api/TinyMCE_UndoRedo.html
trunk/htdocs/js/tinymce/docs/tinymce_api/allclasses-frame.html
trunk/htdocs/js/tinymce/docs/tinymce_api/allclasses-noframe.html
trunk/htdocs/js/tinymce/docs/tinymce_api/help-doc.html
trunk/htdocs/js/tinymce/docs/tinymce_api/index-all.html
trunk/htdocs/js/tinymce/docs/tinymce_api/index.html
trunk/htdocs/js/tinymce/docs/tinymce_api/overview-TinyMCE_Array.class.js.html
trunk/htdocs/js/tinymce/docs/tinymce_api/overview-TinyMCE_Cleanup.class.js.html
trunk/htdocs/js/tinymce/docs/tinymce_api/overview-TinyMCE_Control.class.js.html
trunk/htdocs/js/tinymce/docs/tinymce_api/overview-TinyMCE_DOMUtils.class.js.html
trunk/htdocs/js/tinymce/docs/tinymce_api/overview-TinyMCE_Debug.class.js.html
trunk/htdocs/js/tinymce/docs/tinymce_api/overview-TinyMCE_Engine.class.js.html
trunk/htdocs/js/tinymce/docs/tinymce_api/overview-TinyMCE_Event.class.js.html
trunk/htdocs/js/tinymce/docs/tinymce_api/overview-TinyMCE_ForceParagraphs.class.js.html
trunk/htdocs/js/tinymce/docs/tinymce_api/overview-TinyMCE_Layer.class.js.html
trunk/htdocs/js/tinymce/docs/tinymce_api/overview-TinyMCE_Menu.class.js.html
trunk/htdocs/js/tinymce/docs/tinymce_api/overview-TinyMCE_Popup.class.js.html
trunk/htdocs/js/tinymce/docs/tinymce_api/overview-TinyMCE_Selection.class.js.html
trunk/htdocs/js/tinymce/docs/tinymce_api/overview-TinyMCE_URL.class.js.html
trunk/htdocs/js/tinymce/docs/tinymce_api/overview-TinyMCE_UndoRedo.class.js.html
trunk/htdocs/js/tinymce/docs/tinymce_api/overview-frame.html
trunk/htdocs/js/tinymce/docs/tinymce_api/overview-summary-TinyMCE_Array.class.js.html
trunk/htdocs/js/tinymce/docs/tinymce_api/overview-summary-TinyMCE_Cleanup.class.js.html
trunk/htdocs/js/tinymce/docs/tinymce_api/overview-summary-TinyMCE_Control.class.js.html
trunk/htdocs/js/tinymce/docs/tinymce_api/overview-summary-TinyMCE_DOMUtils.class.js.html
trunk/htdocs/js/tinymce/docs/tinymce_api/overview-summary-TinyMCE_Debug.class.js.html
trunk/htdocs/js/tinymce/docs/tinymce_api/overview-summary-TinyMCE_Engine.class.js.html
trunk/htdocs/js/tinymce/docs/tinymce_api/overview-summary-TinyMCE_Event.class.js.html
trunk/htdocs/js/tinymce/docs/tinymce_api/overview-summary-TinyMCE_ForceParagraphs.class.js.html
trunk/htdocs/js/tinymce/docs/tinymce_api/overview-summary-TinyMCE_Layer.class.js.html
trunk/htdocs/js/tinymce/docs/tinymce_api/overview-summary-TinyMCE_Menu.class.js.html
trunk/htdocs/js/tinymce/docs/tinymce_api/overview-summary-TinyMCE_Popup.class.js.html
trunk/htdocs/js/tinymce/docs/tinymce_api/overview-summary-TinyMCE_Selection.class.js.html
trunk/htdocs/js/tinymce/docs/tinymce_api/overview-summary-TinyMCE_URL.class.js.html
trunk/htdocs/js/tinymce/docs/tinymce_api/overview-summary-TinyMCE_UndoRedo.class.js.html
trunk/htdocs/js/tinymce/docs/tinymce_api/overview-summary.html
trunk/htdocs/js/tinymce/docs/tinymce_api/overview-tree.html
trunk/htdocs/js/tinymce/docs/tinymce_api/stylesheet.css
trunk/htdocs/js/tinymce/examples/
trunk/htdocs/js/tinymce/examples/example_advanced.css
trunk/htdocs/js/tinymce/examples/example_advanced.htm
trunk/htdocs/js/tinymce/examples/example_flash_list.js
trunk/htdocs/js/tinymce/examples/example_full.css
trunk/htdocs/js/tinymce/examples/example_full.htm
trunk/htdocs/js/tinymce/examples/example_image_list.js
trunk/htdocs/js/tinymce/examples/example_link_list.js
trunk/htdocs/js/tinymce/examples/example_simple.htm
trunk/htdocs/js/tinymce/examples/example_word.css
trunk/htdocs/js/tinymce/examples/example_word.htm
trunk/htdocs/js/tinymce/examples/logo.jpg
trunk/htdocs/js/tinymce/examples/logo_over.jpg
trunk/htdocs/js/tinymce/readme
trunk/lib/Validate/
trunk/lib/Validate/ISPN.php
trunk/lib/Validate/Validate.php
trunk/lib/iCalcreator.class.php
trunk/lib/ldap-auth.php
trunk/lib/member_functions.php
trunk/lib/page-feedback.php
trunk/lib/pieChart.php
trunk/lib/sanitization.php
trunk/lib/validationData.php
trunk/lib/venus/
trunk/lib/venus/.htaccess
trunk/lib/venus/AUTHORS
trunk/lib/venus/LICENCE
trunk/lib/venus/README
trunk/lib/venus/THANKS
trunk/lib/venus/TODO
trunk/lib/venus/docs/
trunk/lib/venus/docs/config.html
trunk/lib/venus/docs/contributing.html
trunk/lib/venus/docs/docs.css
trunk/lib/venus/docs/docs.js
trunk/lib/venus/docs/etiquette.html
trunk/lib/venus/docs/filters.html
trunk/lib/venus/docs/img/
trunk/lib/venus/docs/img/shadowAlpha.png
trunk/lib/venus/docs/index.html
trunk/lib/venus/docs/installation.html
trunk/lib/venus/docs/migration.html
trunk/lib/venus/docs/normalization.html
trunk/lib/venus/docs/templates.html
trunk/lib/venus/docs/venus.svg
trunk/lib/venus/examples/
trunk/lib/venus/examples/filters/
trunk/lib/venus/examples/filters/categories/
trunk/lib/venus/examples/filters/categories/categories.xslt
trunk/lib/venus/examples/filters/guess-language/
trunk/lib/venus/examples/filters/guess-language/README
trunk/lib/venus/examples/filters/guess-language/en.data
trunk/lib/venus/examples/filters/guess-language/fr.data
trunk/lib/venus/examples/filters/guess-language/guess-language.py
trunk/lib/venus/examples/filters/guess-language/learn-language.py
trunk/lib/venus/examples/filters/guess-language/trigram.py
trunk/lib/venus/examples/filters/xpath-sifter/
trunk/lib/venus/examples/filters/xpath-sifter/xpath-sifter.ini
trunk/lib/venus/examples/foaf-based.ini
trunk/lib/venus/examples/images/
trunk/lib/venus/examples/images/edd.png
trunk/lib/venus/examples/images/jdub.png
trunk/lib/venus/examples/images/keybuk.png
trunk/lib/venus/examples/images/thom.png
trunk/lib/venus/examples/opml-top100.ini
trunk/lib/venus/examples/planet-schmanet.ini
trunk/lib/venus/expunge.py
trunk/lib/venus/filters/
trunk/lib/venus/filters/addsearch.genshi
trunk/lib/venus/filters/addsearch.xslt
trunk/lib/venus/filters/coral_cdn_filter.py
trunk/lib/venus/filters/delDupName/
trunk/lib/venus/filters/delDupName/byline_author.xslt
trunk/lib/venus/filters/delDupName/p_by_name.xslt
trunk/lib/venus/filters/delDupName/p_from.xslt
trunk/lib/venus/filters/detitle.xslt
trunk/lib/venus/filters/excerpt.py
trunk/lib/venus/filters/h1title.xslt
trunk/lib/venus/filters/html2xhtml.plugin
trunk/lib/venus/filters/mememe.plugin
trunk/lib/venus/filters/minhead.py
trunk/lib/venus/filters/notweets.py
trunk/lib/venus/filters/regexp_sifter.py
trunk/lib/venus/filters/stripAd/
trunk/lib/venus/filters/stripAd/feedburner.sed
trunk/lib/venus/filters/stripAd/google_ad_map.sed
trunk/lib/venus/filters/stripAd/yahoo.sed
trunk/lib/venus/filters/xhtml2html.plugin
trunk/lib/venus/filters/xpath_sifter.py
trunk/lib/venus/planet.py
trunk/lib/venus/planet/
trunk/lib/venus/planet/__init__.py
trunk/lib/venus/planet/config.py
trunk/lib/venus/planet/csv_config.py
trunk/lib/venus/planet/expunge.py
trunk/lib/venus/planet/foaf.py
trunk/lib/venus/planet/idindex.py
trunk/lib/venus/planet/opml.py
trunk/lib/venus/planet/reconstitute.py
trunk/lib/venus/planet/scrub.py
trunk/lib/venus/planet/shell/
trunk/lib/venus/planet/shell/__init__.py
trunk/lib/venus/planet/shell/_genshi.py
trunk/lib/venus/planet/shell/dj.py
trunk/lib/venus/planet/shell/plugin.py
trunk/lib/venus/planet/shell/py.py
trunk/lib/venus/planet/shell/sed.py
trunk/lib/venus/planet/shell/tmpl.py
trunk/lib/venus/planet/shell/xslt.py
trunk/lib/venus/planet/spider.py
trunk/lib/venus/planet/splice.py
trunk/lib/venus/planet/vendor/
trunk/lib/venus/planet/vendor/compat_logging/
trunk/lib/venus/planet/vendor/compat_logging/__init__.py
trunk/lib/venus/planet/vendor/compat_logging/config.py
trunk/lib/venus/planet/vendor/compat_logging/handlers.py
trunk/lib/venus/planet/vendor/feedparser.py
trunk/lib/venus/planet/vendor/html5lib/
trunk/lib/venus/planet/vendor/html5lib/__init__.py
trunk/lib/venus/planet/vendor/html5lib/constants.py
trunk/lib/venus/planet/vendor/html5lib/filters/
trunk/lib/venus/planet/vendor/html5lib/filters/__init__.py
trunk/lib/venus/planet/vendor/html5lib/filters/_base.py
trunk/lib/venus/planet/vendor/html5lib/filters/inject_meta_charset.py
trunk/lib/venus/planet/vendor/html5lib/filters/lint.py
trunk/lib/venus/planet/vendor/html5lib/filters/optionaltags.py
trunk/lib/venus/planet/vendor/html5lib/filters/whitespace.py
trunk/lib/venus/planet/vendor/html5lib/html5parser.py
trunk/lib/venus/planet/vendor/html5lib/inputstream.py
trunk/lib/venus/planet/vendor/html5lib/liberalxmlparser.py
trunk/lib/venus/planet/vendor/html5lib/sanitizer.py
trunk/lib/venus/planet/vendor/html5lib/serializer/
trunk/lib/venus/planet/vendor/html5lib/serializer/__init__.py
trunk/lib/venus/planet/vendor/html5lib/serializer/htmlserializer.py
trunk/lib/venus/planet/vendor/html5lib/serializer/xhtmlserializer.py
trunk/lib/venus/planet/vendor/html5lib/tokenizer.py
trunk/lib/venus/planet/vendor/html5lib/treebuilders/
trunk/lib/venus/planet/vendor/html5lib/treebuilders/__init__.py
trunk/lib/venus/planet/vendor/html5lib/treebuilders/_base.py
trunk/lib/venus/planet/vendor/html5lib/treebuilders/dom.py
trunk/lib/venus/planet/vendor/html5lib/treebuilders/etree.py
trunk/lib/venus/planet/vendor/html5lib/treebuilders/simpletree.py
trunk/lib/venus/planet/vendor/html5lib/treebuilders/soup.py
trunk/lib/venus/planet/vendor/html5lib/treewalkers/
trunk/lib/venus/planet/vendor/html5lib/treewalkers/__init__.py
trunk/lib/venus/planet/vendor/html5lib/treewalkers/_base.py
trunk/lib/venus/planet/vendor/html5lib/treewalkers/dom.py
trunk/lib/venus/planet/vendor/html5lib/treewalkers/etree.py
trunk/lib/venus/planet/vendor/html5lib/treewalkers/genshistream.py
trunk/lib/venus/planet/vendor/html5lib/treewalkers/pulldom.py
trunk/lib/venus/planet/vendor/html5lib/treewalkers/simpletree.py
trunk/lib/venus/planet/vendor/html5lib/treewalkers/soup.py
trunk/lib/venus/planet/vendor/html5lib/utils.py
trunk/lib/venus/planet/vendor/htmltmpl.py
trunk/lib/venus/planet/vendor/httplib2/
trunk/lib/venus/planet/vendor/httplib2/__init__.py
trunk/lib/venus/planet/vendor/httplib2/iri2uri.py
trunk/lib/venus/planet/vendor/portalocker.py
trunk/lib/venus/planet/vendor/timeoutsocket.py
trunk/lib/venus/spider.py
trunk/lib/venus/splice.py
trunk/lib/venus/sucs/
trunk/lib/venus/sucs/Planet.txt.tmpl
trunk/lib/venus/sucs/atom.xml.tmpl
trunk/lib/venus/sucs/foafroll.xml.tmpl
trunk/lib/venus/sucs/opml.xml.tmpl
trunk/lib/venus/sucs/rss10.xml.tmpl
trunk/lib/venus/sucs/rss20.xml.tmpl
trunk/lib/venus/themes/
trunk/lib/venus/themes/asf/
trunk/lib/venus/themes/asf/config.ini
trunk/lib/venus/themes/asf/default.css
trunk/lib/venus/themes/asf/index.html.xslt
trunk/lib/venus/themes/asf/personalize.js
trunk/lib/venus/themes/classic_fancy/
trunk/lib/venus/themes/classic_fancy/config.ini
trunk/lib/venus/themes/classic_fancy/index.html.tmpl
trunk/lib/venus/themes/classic_fancy/planet.css
trunk/lib/venus/themes/common/
trunk/lib/venus/themes/common/atom.xml.xslt
trunk/lib/venus/themes/common/foafroll.xml.xslt
trunk/lib/venus/themes/common/images/
trunk/lib/venus/themes/common/images/feed-icon-10x10.png
trunk/lib/venus/themes/common/images/foaf.png
trunk/lib/venus/themes/common/images/logo.png
trunk/lib/venus/themes/common/images/opml.png
trunk/lib/venus/themes/common/images/planet.png
trunk/lib/venus/themes/common/images/tcosm11.gif
trunk/lib/venus/themes/common/images/venus.ico
trunk/lib/venus/themes/common/images/venus.png
trunk/lib/venus/themes/common/opml.xml.xslt
trunk/lib/venus/themes/common/rss10.xml.tmpl
trunk/lib/venus/themes/common/rss20.xml.tmpl
trunk/lib/venus/themes/common/validate.html.xslt
trunk/lib/venus/themes/django/
trunk/lib/venus/themes/django/bland.css
trunk/lib/venus/themes/django/config.ini
trunk/lib/venus/themes/django/index.html.dj
trunk/lib/venus/themes/genshi_fancy/
trunk/lib/venus/themes/genshi_fancy/config.ini
trunk/lib/venus/themes/genshi_fancy/index.html.genshi
trunk/lib/venus/themes/genshi_fancy/planet.css
trunk/lib/venus/themes/mobile/
trunk/lib/venus/themes/mobile/config.ini
trunk/lib/venus/themes/mobile/mobile.html.xslt
trunk/lib/venus/themes/musings/
trunk/lib/venus/themes/musings/config.ini
trunk/lib/venus/themes/musings/default.css
trunk/lib/venus/themes/musings/images/
trunk/lib/venus/themes/musings/index.html.xslt
trunk/lib/venus/themes/musings/personalize.js
trunk/templates/banana-awardlist.tpl
trunk/templates/election-results.tpl
trunk/templates/election-vote.tpl
trunk/templates/event.tpl
trunk/templates/event_edit.tpl
trunk/templates/events.tpl
trunk/templates/feedback.tpl
trunk/templates/junk.tpl
trunk/templates/library-addbook.tpl
trunk/templates/library-book-edit.tpl
trunk/templates/library-book.tpl
trunk/templates/membershiprenew-options.tpl
trunk/templates/membershiprenew.tpl
trunk/templates/milliways_status.tpl
trunk/templates/milliways_tag.tpl
trunk/templates/milliways_taglist.tpl
trunk/templates/milliways_uri.tpl
trunk/templates/signup-admin.tpl
trunk/templates/signup.tpl
trunk/templates/susignup-admin.tpl
trunk/templates/susignup.tpl
Removed:
trunk/components/blogadmin.php
trunk/components/blogfeed.php
trunk/components/blogs.php
trunk/components/forum.php
trunk/components/forumposts.php
trunk/components/planet.php
trunk/components/planetposts.php
trunk/db_changes/sucssite-0.3.sql
trunk/htdocs/css/forum/
trunk/htdocs/js/tinymce/docs/about.html
trunk/htdocs/js/tinymce/docs/compatiblity_chart.html
trunk/htdocs/js/tinymce/docs/credits.html
trunk/htdocs/js/tinymce/docs/css/
trunk/htdocs/js/tinymce/docs/css/screen.css
trunk/htdocs/js/tinymce/docs/customization_language_packs.html
trunk/htdocs/js/tinymce/docs/customization_plugins.html
trunk/htdocs/js/tinymce/docs/customization_themes.html
trunk/htdocs/js/tinymce/docs/faq.html
trunk/htdocs/js/tinymce/docs/images/
trunk/htdocs/js/tinymce/docs/images/moxiecode.gif
trunk/htdocs/js/tinymce/docs/index.html
trunk/htdocs/js/tinymce/docs/installation_example_00.html
trunk/htdocs/js/tinymce/docs/installation_example_01.html
trunk/htdocs/js/tinymce/docs/installation_example_02.html
trunk/htdocs/js/tinymce/docs/installation_example_03.html
trunk/htdocs/js/tinymce/docs/installing.html
trunk/htdocs/js/tinymce/docs/license.html
trunk/htdocs/js/tinymce/docs/option_accessibility_focus.html
trunk/htdocs/js/tinymce/docs/option_accessibility_warnings.html
trunk/htdocs/js/tinymce/docs/option_add_form_submit_trigger.html
trunk/htdocs/js/tinymce/docs/option_add_unload_trigger.html
trunk/htdocs/js/tinymce/docs/option_apply_source_formatting.html
trunk/htdocs/js/tinymce/docs/option_ask.html
trunk/htdocs/js/tinymce/docs/option_auto_focus.html
trunk/htdocs/js/tinymce/docs/option_auto_reset_designmode.html
trunk/htdocs/js/tinymce/docs/option_auto_resize.html
trunk/htdocs/js/tinymce/docs/option_browsers.html
trunk/htdocs/js/tinymce/docs/option_button_tile_map.html
trunk/htdocs/js/tinymce/docs/option_cleanup.html
trunk/htdocs/js/tinymce/docs/option_cleanup_callback.html
trunk/htdocs/js/tinymce/docs/option_cleanup_on_startup.html
trunk/htdocs/js/tinymce/docs/option_content_css.html
trunk/htdocs/js/tinymce/docs/option_convert_fonts_to_spans.html
trunk/htdocs/js/tinymce/docs/option_convert_newlines_to_brs.html
trunk/htdocs/js/tinymce/docs/option_convert_urls.html
trunk/htdocs/js/tinymce/docs/option_custom_shortcuts.html
trunk/htdocs/js/tinymce/docs/option_custom_undo_redo.html
trunk/htdocs/js/tinymce/docs/option_custom_undo_redo_keyboard_shortcuts.html
trunk/htdocs/js/tinymce/docs/option_custom_undo_redo_levels.html
trunk/htdocs/js/tinymce/docs/option_custom_undo_redo_restore_selection.html
trunk/htdocs/js/tinymce/docs/option_debug.html
trunk/htdocs/js/tinymce/docs/option_dialog_type.html
trunk/htdocs/js/tinymce/docs/option_directionality.html
trunk/htdocs/js/tinymce/docs/option_display_tab_class.html
trunk/htdocs/js/tinymce/docs/option_docs_language.html
trunk/htdocs/js/tinymce/docs/option_doctype.html
trunk/htdocs/js/tinymce/docs/option_document_base_url.html
trunk/htdocs/js/tinymce/docs/option_editor_css.html
trunk/htdocs/js/tinymce/docs/option_editor_deselector.html
trunk/htdocs/js/tinymce/docs/option_editor_selector.html
trunk/htdocs/js/tinymce/docs/option_elements.html
trunk/htdocs/js/tinymce/docs/option_encoding.html
trunk/htdocs/js/tinymce/docs/option_entities.html
trunk/htdocs/js/tinymce/docs/option_entity_encoding.html
trunk/htdocs/js/tinymce/docs/option_event_elements.html
trunk/htdocs/js/tinymce/docs/option_execcommand_callback.html
trunk/htdocs/js/tinymce/docs/option_extended_valid_elements.html
trunk/htdocs/js/tinymce/docs/option_external_image_list_url.html
trunk/htdocs/js/tinymce/docs/option_external_link_list_url.html
trunk/htdocs/js/tinymce/docs/option_file_browser_callback.html
trunk/htdocs/js/tinymce/docs/option_fix_content_duplication.html
trunk/htdocs/js/tinymce/docs/option_fix_list_elements.html
trunk/htdocs/js/tinymce/docs/option_fix_table_elements.html
trunk/htdocs/js/tinymce/docs/option_focus_alert.html
trunk/htdocs/js/tinymce/docs/option_font_size_classes.html
trunk/htdocs/js/tinymce/docs/option_font_size_style_values.html
trunk/htdocs/js/tinymce/docs/option_force_br_newlines.html
trunk/htdocs/js/tinymce/docs/option_force_hex_style_colors.html
trunk/htdocs/js/tinymce/docs/option_force_p_newlines.html
trunk/htdocs/js/tinymce/docs/option_handle_event_callback.html
trunk/htdocs/js/tinymce/docs/option_height.html
trunk/htdocs/js/tinymce/docs/option_hidden_tab_class.html
trunk/htdocs/js/tinymce/docs/option_init_instance_callback.html
trunk/htdocs/js/tinymce/docs/option_inline_styles.html
trunk/htdocs/js/tinymce/docs/option_insertimage_callback.html
trunk/htdocs/js/tinymce/docs/option_insertlink_callback.html
trunk/htdocs/js/tinymce/docs/option_invalid_elements.html
trunk/htdocs/js/tinymce/docs/option_language.html
trunk/htdocs/js/tinymce/docs/option_merge_styles_invalid_parents.html
trunk/htdocs/js/tinymce/docs/option_mode.html
trunk/htdocs/js/tinymce/docs/option_nowrap.html
trunk/htdocs/js/tinymce/docs/option_object_resizing.html
trunk/htdocs/js/tinymce/docs/option_onchange_callback.html
trunk/htdocs/js/tinymce/docs/option_oninit.html
trunk/htdocs/js/tinymce/docs/option_onpageload.html
trunk/htdocs/js/tinymce/docs/option_plugins.html
trunk/htdocs/js/tinymce/docs/option_popups_css.html
trunk/htdocs/js/tinymce/docs/option_preformatted.html
trunk/htdocs/js/tinymce/docs/option_relative_urls.html
trunk/htdocs/js/tinymce/docs/option_remove_linebreaks.html
trunk/htdocs/js/tinymce/docs/option_remove_script_host.html
trunk/htdocs/js/tinymce/docs/option_save_callback.html
trunk/htdocs/js/tinymce/docs/option_setupcontent_callback.html
trunk/htdocs/js/tinymce/docs/option_strict_loading_mode.html
trunk/htdocs/js/tinymce/docs/option_submit_patch.html
trunk/htdocs/js/tinymce/docs/option_table_inline_editing.html
trunk/htdocs/js/tinymce/docs/option_textarea_trigger.html
trunk/htdocs/js/tinymce/docs/option_theme.html
trunk/htdocs/js/tinymce/docs/option_theme_advanced_blockformats.html
trunk/htdocs/js/tinymce/docs/option_theme_advanced_buttons_n.html
trunk/htdocs/js/tinymce/docs/option_theme_advanced_buttons_n_add.html
trunk/htdocs/js/tinymce/docs/option_theme_advanced_buttons_n_add_before.html
trunk/htdocs/js/tinymce/docs/option_theme_advanced_container.html
trunk/htdocs/js/tinymce/docs/option_theme_advanced_container_align.html
trunk/htdocs/js/tinymce/docs/option_theme_advanced_container_class.html
trunk/htdocs/js/tinymce/docs/option_theme_advanced_containers.html
trunk/htdocs/js/tinymce/docs/option_theme_advanced_containers_default_align.html
trunk/htdocs/js/tinymce/docs/option_theme_advanced_containers_default_class.html
trunk/htdocs/js/tinymce/docs/option_theme_advanced_custom_layout.html
trunk/htdocs/js/tinymce/docs/option_theme_advanced_disable.html
trunk/htdocs/js/tinymce/docs/option_theme_advanced_fonts.html
trunk/htdocs/js/tinymce/docs/option_theme_advanced_layout_manager.html
trunk/htdocs/js/tinymce/docs/option_theme_advanced_link_targets.html
trunk/htdocs/js/tinymce/docs/option_theme_advanced_path.html
trunk/htdocs/js/tinymce/docs/option_theme_advanced_path_location.html
trunk/htdocs/js/tinymce/docs/option_theme_advanced_resize_horizontal.html
trunk/htdocs/js/tinymce/docs/option_theme_advanced_resizing.html
trunk/htdocs/js/tinymce/docs/option_theme_advanced_resizing_use_cookie.html
trunk/htdocs/js/tinymce/docs/option_theme_advanced_source_editor_height.html
trunk/htdocs/js/tinymce/docs/option_theme_advanced_source_editor_width.html
trunk/htdocs/js/tinymce/docs/option_theme_advanced_source_editor_wrap.html
trunk/htdocs/js/tinymce/docs/option_theme_advanced_statusbar_location.html
trunk/htdocs/js/tinymce/docs/option_theme_advanced_styles.html
trunk/htdocs/js/tinymce/docs/option_theme_advanced_toolbar_align.html
trunk/htdocs/js/tinymce/docs/option_theme_advanced_toolbar_location.html
trunk/htdocs/js/tinymce/docs/option_trim_span_elements.html
trunk/htdocs/js/tinymce/docs/option_urlconverter_callback.html
trunk/htdocs/js/tinymce/docs/option_valid_elements.html
trunk/htdocs/js/tinymce/docs/option_verify_css_classes.html
trunk/htdocs/js/tinymce/docs/option_verify_html.html
trunk/htdocs/js/tinymce/docs/option_visual.html
trunk/htdocs/js/tinymce/docs/option_visual_table_class.html
trunk/htdocs/js/tinymce/docs/option_width.html
trunk/htdocs/js/tinymce/docs/plugin_advhr.html
trunk/htdocs/js/tinymce/docs/plugin_advimage.html
trunk/htdocs/js/tinymce/docs/plugin_advlink.html
trunk/htdocs/js/tinymce/docs/plugin_autosave.html
trunk/htdocs/js/tinymce/docs/plugin_contextmenu.html
trunk/htdocs/js/tinymce/docs/plugin_directionality.html
trunk/htdocs/js/tinymce/docs/plugin_emotions.html
trunk/htdocs/js/tinymce/docs/plugin_flash.html
trunk/htdocs/js/tinymce/docs/plugin_fullpage.html
trunk/htdocs/js/tinymce/docs/plugin_fullscreen.html
trunk/htdocs/js/tinymce/docs/plugin_iespell.html
trunk/htdocs/js/tinymce/docs/plugin_inlinepopups.html
trunk/htdocs/js/tinymce/docs/plugin_insertdatetime.html
trunk/htdocs/js/tinymce/docs/plugin_layer.html
trunk/htdocs/js/tinymce/docs/plugin_noneditable.html
trunk/htdocs/js/tinymce/docs/plugin_paste.html
trunk/htdocs/js/tinymce/docs/plugin_preview.html
trunk/htdocs/js/tinymce/docs/plugin_print.html
trunk/htdocs/js/tinymce/docs/plugin_save.html
trunk/htdocs/js/tinymce/docs/plugin_searchreplace.html
trunk/htdocs/js/tinymce/docs/plugin_spellchecker.html
trunk/htdocs/js/tinymce/docs/plugin_style.html
trunk/htdocs/js/tinymce/docs/plugin_table.html
trunk/htdocs/js/tinymce/docs/plugin_zoom.html
trunk/htdocs/js/tinymce/docs/reference_buttons.html
trunk/htdocs/js/tinymce/docs/reference_configuration.html
trunk/htdocs/js/tinymce/docs/reference_javascript_functions.html
trunk/htdocs/js/tinymce/docs/reference_plugins.html
trunk/htdocs/js/tinymce/docs/tinymce_api/
trunk/htdocs/js/tinymce/docs/tinymce_api/GLOBALS.html
trunk/htdocs/js/tinymce/docs/tinymce_api/TinyMCE_Cleanup.html
trunk/htdocs/js/tinymce/docs/tinymce_api/TinyMCE_Control.html
trunk/htdocs/js/tinymce/docs/tinymce_api/TinyMCE_Engine.html
trunk/htdocs/js/tinymce/docs/tinymce_api/TinyMCE_Layer.html
trunk/htdocs/js/tinymce/docs/tinymce_api/TinyMCE_Popup.html
trunk/htdocs/js/tinymce/docs/tinymce_api/TinyMCE_Selection.html
trunk/htdocs/js/tinymce/docs/tinymce_api/TinyMCE_UndoRedo.html
trunk/htdocs/js/tinymce/docs/tinymce_api/allclasses-frame.html
trunk/htdocs/js/tinymce/docs/tinymce_api/allclasses-noframe.html
trunk/htdocs/js/tinymce/docs/tinymce_api/help-doc.html
trunk/htdocs/js/tinymce/docs/tinymce_api/index-all.html
trunk/htdocs/js/tinymce/docs/tinymce_api/index.html
trunk/htdocs/js/tinymce/docs/tinymce_api/overview-TinyMCE_Array.class.js.html
trunk/htdocs/js/tinymce/docs/tinymce_api/overview-TinyMCE_Cleanup.class.js.html
trunk/htdocs/js/tinymce/docs/tinymce_api/overview-TinyMCE_Control.class.js.html
trunk/htdocs/js/tinymce/docs/tinymce_api/overview-TinyMCE_DOMUtils.class.js.html
trunk/htdocs/js/tinymce/docs/tinymce_api/overview-TinyMCE_Debug.class.js.html
trunk/htdocs/js/tinymce/docs/tinymce_api/overview-TinyMCE_Engine.class.js.html
trunk/htdocs/js/tinymce/docs/tinymce_api/overview-TinyMCE_Event.class.js.html
trunk/htdocs/js/tinymce/docs/tinymce_api/overview-TinyMCE_ForceParagraphs.class.js.html
trunk/htdocs/js/tinymce/docs/tinymce_api/overview-TinyMCE_Layer.class.js.html
trunk/htdocs/js/tinymce/docs/tinymce_api/overview-TinyMCE_Menu.class.js.html
trunk/htdocs/js/tinymce/docs/tinymce_api/overview-TinyMCE_Popup.class.js.html
trunk/htdocs/js/tinymce/docs/tinymce_api/overview-TinyMCE_Selection.class.js.html
trunk/htdocs/js/tinymce/docs/tinymce_api/overview-TinyMCE_URL.class.js.html
trunk/htdocs/js/tinymce/docs/tinymce_api/overview-TinyMCE_UndoRedo.class.js.html
trunk/htdocs/js/tinymce/docs/tinymce_api/overview-frame.html
trunk/htdocs/js/tinymce/docs/tinymce_api/overview-summary-TinyMCE_Array.class.js.html
trunk/htdocs/js/tinymce/docs/tinymce_api/overview-summary-TinyMCE_Cleanup.class.js.html
trunk/htdocs/js/tinymce/docs/tinymce_api/overview-summary-TinyMCE_Control.class.js.html
trunk/htdocs/js/tinymce/docs/tinymce_api/overview-summary-TinyMCE_DOMUtils.class.js.html
trunk/htdocs/js/tinymce/docs/tinymce_api/overview-summary-TinyMCE_Debug.class.js.html
trunk/htdocs/js/tinymce/docs/tinymce_api/overview-summary-TinyMCE_Engine.class.js.html
trunk/htdocs/js/tinymce/docs/tinymce_api/overview-summary-TinyMCE_Event.class.js.html
trunk/htdocs/js/tinymce/docs/tinymce_api/overview-summary-TinyMCE_ForceParagraphs.class.js.html
trunk/htdocs/js/tinymce/docs/tinymce_api/overview-summary-TinyMCE_Layer.class.js.html
trunk/htdocs/js/tinymce/docs/tinymce_api/overview-summary-TinyMCE_Menu.class.js.html
trunk/htdocs/js/tinymce/docs/tinymce_api/overview-summary-TinyMCE_Popup.class.js.html
trunk/htdocs/js/tinymce/docs/tinymce_api/overview-summary-TinyMCE_Selection.class.js.html
trunk/htdocs/js/tinymce/docs/tinymce_api/overview-summary-TinyMCE_URL.class.js.html
trunk/htdocs/js/tinymce/docs/tinymce_api/overview-summary-TinyMCE_UndoRedo.class.js.html
trunk/htdocs/js/tinymce/docs/tinymce_api/overview-summary.html
trunk/htdocs/js/tinymce/docs/tinymce_api/overview-tree.html
trunk/htdocs/js/tinymce/docs/tinymce_api/stylesheet.css
trunk/htdocs/js/tinymce/examples/example_advanced.css
trunk/htdocs/js/tinymce/examples/example_advanced.htm
trunk/htdocs/js/tinymce/examples/example_flash_list.js
trunk/htdocs/js/tinymce/examples/example_full.css
trunk/htdocs/js/tinymce/examples/example_full.htm
trunk/htdocs/js/tinymce/examples/example_image_list.js
trunk/htdocs/js/tinymce/examples/example_link_list.js
trunk/htdocs/js/tinymce/examples/example_simple.htm
trunk/htdocs/js/tinymce/examples/example_word.css
trunk/htdocs/js/tinymce/examples/example_word.htm
trunk/htdocs/js/tinymce/examples/logo.jpg
trunk/htdocs/js/tinymce/examples/logo_over.jpg
trunk/lib/Validate/ISPN.php
trunk/lib/Validate/Validate.php
trunk/lib/blog/
trunk/lib/venus/.htaccess
trunk/lib/venus/AUTHORS
trunk/lib/venus/LICENCE
trunk/lib/venus/README
trunk/lib/venus/THANKS
trunk/lib/venus/TODO
trunk/lib/venus/docs/
trunk/lib/venus/docs/config.html
trunk/lib/venus/docs/contributing.html
trunk/lib/venus/docs/docs.css
trunk/lib/venus/docs/docs.js
trunk/lib/venus/docs/etiquette.html
trunk/lib/venus/docs/filters.html
trunk/lib/venus/docs/img/
trunk/lib/venus/docs/img/shadowAlpha.png
trunk/lib/venus/docs/index.html
trunk/lib/venus/docs/installation.html
trunk/lib/venus/docs/migration.html
trunk/lib/venus/docs/normalization.html
trunk/lib/venus/docs/templates.html
trunk/lib/venus/docs/venus.svg
trunk/lib/venus/examples/
trunk/lib/venus/examples/filters/
trunk/lib/venus/examples/filters/categories/
trunk/lib/venus/examples/filters/categories/categories.xslt
trunk/lib/venus/examples/filters/guess-language/
trunk/lib/venus/examples/filters/guess-language/README
trunk/lib/venus/examples/filters/guess-language/en.data
trunk/lib/venus/examples/filters/guess-language/fr.data
trunk/lib/venus/examples/filters/guess-language/guess-language.py
trunk/lib/venus/examples/filters/guess-language/learn-language.py
trunk/lib/venus/examples/filters/guess-language/trigram.py
trunk/lib/venus/examples/filters/xpath-sifter/
trunk/lib/venus/examples/filters/xpath-sifter/xpath-sifter.ini
trunk/lib/venus/examples/foaf-based.ini
trunk/lib/venus/examples/images/
trunk/lib/venus/examples/images/edd.png
trunk/lib/venus/examples/images/jdub.png
trunk/lib/venus/examples/images/keybuk.png
trunk/lib/venus/examples/images/thom.png
trunk/lib/venus/examples/opml-top100.ini
trunk/lib/venus/examples/planet-schmanet.ini
trunk/lib/venus/expunge.py
trunk/lib/venus/filters/
trunk/lib/venus/filters/addsearch.genshi
trunk/lib/venus/filters/addsearch.xslt
trunk/lib/venus/filters/coral_cdn_filter.py
trunk/lib/venus/filters/delDupName/
trunk/lib/venus/filters/delDupName/byline_author.xslt
trunk/lib/venus/filters/delDupName/p_by_name.xslt
trunk/lib/venus/filters/delDupName/p_from.xslt
trunk/lib/venus/filters/detitle.xslt
trunk/lib/venus/filters/excerpt.py
trunk/lib/venus/filters/h1title.xslt
trunk/lib/venus/filters/html2xhtml.plugin
trunk/lib/venus/filters/mememe.plugin
trunk/lib/venus/filters/minhead.py
trunk/lib/venus/filters/notweets.py
trunk/lib/venus/filters/regexp_sifter.py
trunk/lib/venus/filters/stripAd/
trunk/lib/venus/filters/stripAd/feedburner.sed
trunk/lib/venus/filters/stripAd/google_ad_map.sed
trunk/lib/venus/filters/stripAd/yahoo.sed
trunk/lib/venus/filters/xhtml2html.plugin
trunk/lib/venus/filters/xpath_sifter.py
trunk/lib/venus/planet.py
trunk/lib/venus/planet/
trunk/lib/venus/planet/__init__.py
trunk/lib/venus/planet/config.py
trunk/lib/venus/planet/csv_config.py
trunk/lib/venus/planet/expunge.py
trunk/lib/venus/planet/foaf.py
trunk/lib/venus/planet/idindex.py
trunk/lib/venus/planet/opml.py
trunk/lib/venus/planet/reconstitute.py
trunk/lib/venus/planet/scrub.py
trunk/lib/venus/planet/shell/
trunk/lib/venus/planet/shell/__init__.py
trunk/lib/venus/planet/shell/_genshi.py
trunk/lib/venus/planet/shell/dj.py
trunk/lib/venus/planet/shell/plugin.py
trunk/lib/venus/planet/shell/py.py
trunk/lib/venus/planet/shell/sed.py
trunk/lib/venus/planet/shell/tmpl.py
trunk/lib/venus/planet/shell/xslt.py
trunk/lib/venus/planet/spider.py
trunk/lib/venus/planet/splice.py
trunk/lib/venus/planet/vendor/
trunk/lib/venus/planet/vendor/compat_logging/
trunk/lib/venus/planet/vendor/compat_logging/__init__.py
trunk/lib/venus/planet/vendor/compat_logging/config.py
trunk/lib/venus/planet/vendor/compat_logging/handlers.py
trunk/lib/venus/planet/vendor/feedparser.py
trunk/lib/venus/planet/vendor/html5lib/
trunk/lib/venus/planet/vendor/html5lib/__init__.py
trunk/lib/venus/planet/vendor/html5lib/constants.py
trunk/lib/venus/planet/vendor/html5lib/filters/
trunk/lib/venus/planet/vendor/html5lib/filters/__init__.py
trunk/lib/venus/planet/vendor/html5lib/filters/_base.py
trunk/lib/venus/planet/vendor/html5lib/filters/inject_meta_charset.py
trunk/lib/venus/planet/vendor/html5lib/filters/lint.py
trunk/lib/venus/planet/vendor/html5lib/filters/optionaltags.py
trunk/lib/venus/planet/vendor/html5lib/filters/whitespace.py
trunk/lib/venus/planet/vendor/html5lib/html5parser.py
trunk/lib/venus/planet/vendor/html5lib/inputstream.py
trunk/lib/venus/planet/vendor/html5lib/liberalxmlparser.py
trunk/lib/venus/planet/vendor/html5lib/sanitizer.py
trunk/lib/venus/planet/vendor/html5lib/serializer/
trunk/lib/venus/planet/vendor/html5lib/serializer/__init__.py
trunk/lib/venus/planet/vendor/html5lib/serializer/htmlserializer.py
trunk/lib/venus/planet/vendor/html5lib/serializer/xhtmlserializer.py
trunk/lib/venus/planet/vendor/html5lib/tokenizer.py
trunk/lib/venus/planet/vendor/html5lib/treebuilders/
trunk/lib/venus/planet/vendor/html5lib/treebuilders/__init__.py
trunk/lib/venus/planet/vendor/html5lib/treebuilders/_base.py
trunk/lib/venus/planet/vendor/html5lib/treebuilders/dom.py
trunk/lib/venus/planet/vendor/html5lib/treebuilders/etree.py
trunk/lib/venus/planet/vendor/html5lib/treebuilders/simpletree.py
trunk/lib/venus/planet/vendor/html5lib/treebuilders/soup.py
trunk/lib/venus/planet/vendor/html5lib/treewalkers/
trunk/lib/venus/planet/vendor/html5lib/treewalkers/__init__.py
trunk/lib/venus/planet/vendor/html5lib/treewalkers/_base.py
trunk/lib/venus/planet/vendor/html5lib/treewalkers/dom.py
trunk/lib/venus/planet/vendor/html5lib/treewalkers/etree.py
trunk/lib/venus/planet/vendor/html5lib/treewalkers/genshistream.py
trunk/lib/venus/planet/vendor/html5lib/treewalkers/pulldom.py
trunk/lib/venus/planet/vendor/html5lib/treewalkers/simpletree.py
trunk/lib/venus/planet/vendor/html5lib/treewalkers/soup.py
trunk/lib/venus/planet/vendor/html5lib/utils.py
trunk/lib/venus/planet/vendor/htmltmpl.py
trunk/lib/venus/planet/vendor/httplib2/
trunk/lib/venus/planet/vendor/httplib2/__init__.py
trunk/lib/venus/planet/vendor/httplib2/iri2uri.py
trunk/lib/venus/planet/vendor/portalocker.py
trunk/lib/venus/planet/vendor/timeoutsocket.py
trunk/lib/venus/spider.py
trunk/lib/venus/splice.py
trunk/lib/venus/sucs/
trunk/lib/venus/sucs/Planet.txt.tmpl
trunk/lib/venus/sucs/atom.xml.tmpl
trunk/lib/venus/sucs/foafroll.xml.tmpl
trunk/lib/venus/sucs/opml.xml.tmpl
trunk/lib/venus/sucs/rss10.xml.tmpl
trunk/lib/venus/sucs/rss20.xml.tmpl
trunk/lib/venus/themes/
trunk/lib/venus/themes/asf/
trunk/lib/venus/themes/asf/config.ini
trunk/lib/venus/themes/asf/default.css
trunk/lib/venus/themes/asf/index.html.xslt
trunk/lib/venus/themes/asf/personalize.js
trunk/lib/venus/themes/classic_fancy/
trunk/lib/venus/themes/classic_fancy/config.ini
trunk/lib/venus/themes/classic_fancy/index.html.tmpl
trunk/lib/venus/themes/classic_fancy/planet.css
trunk/lib/venus/themes/common/
trunk/lib/venus/themes/common/atom.xml.xslt
trunk/lib/venus/themes/common/foafroll.xml.xslt
trunk/lib/venus/themes/common/images/
trunk/lib/venus/themes/common/images/feed-icon-10x10.png
trunk/lib/venus/themes/common/images/foaf.png
trunk/lib/venus/themes/common/images/logo.png
trunk/lib/venus/themes/common/images/opml.png
trunk/lib/venus/themes/common/images/planet.png
trunk/lib/venus/themes/common/images/tcosm11.gif
trunk/lib/venus/themes/common/images/venus.ico
trunk/lib/venus/themes/common/images/venus.png
trunk/lib/venus/themes/common/opml.xml.xslt
trunk/lib/venus/themes/common/rss10.xml.tmpl
trunk/lib/venus/themes/common/rss20.xml.tmpl
trunk/lib/venus/themes/common/validate.html.xslt
trunk/lib/venus/themes/django/
trunk/lib/venus/themes/django/bland.css
trunk/lib/venus/themes/django/config.ini
trunk/lib/venus/themes/django/index.html.dj
trunk/lib/venus/themes/genshi_fancy/
trunk/lib/venus/themes/genshi_fancy/config.ini
trunk/lib/venus/themes/genshi_fancy/index.html.genshi
trunk/lib/venus/themes/genshi_fancy/planet.css
trunk/lib/venus/themes/mobile/
trunk/lib/venus/themes/mobile/config.ini
trunk/lib/venus/themes/mobile/mobile.html.xslt
trunk/lib/venus/themes/musings/
trunk/lib/venus/themes/musings/config.ini
trunk/lib/venus/themes/musings/default.css
trunk/lib/venus/themes/musings/images/
trunk/lib/venus/themes/musings/index.html.xslt
trunk/lib/venus/themes/musings/personalize.js
trunk/templates/forumposts.tpl
trunk/templates/planetposts.tpl
Modified:
trunk/
trunk/ChangeLog
trunk/components/README
trunk/components/bananas.php
trunk/components/contents.php
trunk/components/email.php
trunk/components/front.php
trunk/components/library.php
trunk/components/members.php
trunk/components/menu.php
trunk/components/milliways.php
trunk/components/motd.php
trunk/components/mw.php
trunk/components/news.php
trunk/components/options.php
trunk/components/pagemap.php
trunk/components/pastebin.php
trunk/components/projects.php
trunk/components/signup.php
trunk/components/societies.php
trunk/components/static.php
trunk/components/uri.php
trunk/htdocs/
trunk/htdocs/css/blog.css
trunk/htdocs/css/common.css
trunk/htdocs/css/ie.css
trunk/htdocs/css/sucs.css
trunk/htdocs/desktop/1024x768.html
trunk/htdocs/desktop/640x480.html
trunk/htdocs/desktop/800x600.html
trunk/htdocs/desktop/VncViewer.jar
trunk/htdocs/files/
trunk/htdocs/files/Help/mw-script.tar.gz
trunk/htdocs/images/bananas/banana-bunch.png
trunk/htdocs/images/bananas/banana-crate.png
trunk/htdocs/images/bananas/banana-g-1.png
trunk/htdocs/images/bananas/banana-g-2.png
trunk/htdocs/images/bananas/banana-g-3.png
trunk/htdocs/images/bananas/banana-g-bunch.png
trunk/htdocs/images/bananas/banana-g-crate.png
trunk/htdocs/images/bananas/banana-g-one.png
trunk/htdocs/images/bananas/banana-one.png
trunk/htdocs/images/bananas/banana-zero.png
trunk/htdocs/images/bananas/banana1.png
trunk/htdocs/images/bananas/banana2.png
trunk/htdocs/images/bananas/banana3.png
trunk/htdocs/images/border-bottom-left.png
trunk/htdocs/images/border-bottom-right.png
trunk/htdocs/images/border-bottom.png
trunk/htdocs/images/borders.png
trunk/htdocs/images/box.png
trunk/htdocs/images/google.png
trunk/htdocs/images/hostedby.png
trunk/htdocs/images/left-bottom-corner.png
trunk/htdocs/images/left-top-corner.png
trunk/htdocs/images/menu-bottom-left.png
trunk/htdocs/images/menu-bottom-right.png
trunk/htdocs/images/menu-top-left.png
trunk/htdocs/images/menu-top-right.png
trunk/htdocs/images/orangefade-left.png
trunk/htdocs/images/right-bottom-corner.png
trunk/htdocs/images/right-top-corner.png
trunk/htdocs/images/sucslogo-halo.png
trunk/htdocs/images/sucslogo-main.png
trunk/htdocs/images/sucslogo-opaque.png
trunk/htdocs/images/sucslogo.png
trunk/htdocs/index.php
trunk/htdocs/js/tiny_mce.js
trunk/htdocs/js/xmlhttp.js
trunk/htdocs/pictures/people/
trunk/lib/ArrayRenderer.php
trunk/lib/banana-admin.php
trunk/lib/date.php
trunk/lib/error.php
trunk/lib/members.php
trunk/lib/session.php
trunk/lib/validation.php
trunk/plugins/function.articlesummary.php
trunk/plugins/function.bananaprint.php
trunk/plugins/function.buildpath.php
trunk/settingstemplate
trunk/setup.sh
trunk/templates/banana-award.tpl
trunk/templates/bananas.tpl
trunk/templates/branding.tpl
trunk/templates/breadcrumb.tpl
trunk/templates/foot.tpl
trunk/templates/head.tpl
trunk/templates/index.tpl
trunk/templates/library.tpl
trunk/templates/login.tpl
trunk/templates/members.tpl
trunk/templates/menu.tpl
trunk/templates/milliways.tpl
trunk/templates/news.tpl
trunk/templates/news_delete.tpl
trunk/templates/news_edit.tpl
trunk/templates/news_expire.tpl
trunk/templates/options.tpl
trunk/templates/pagemap.tpl
trunk/templates/pastebin-sidebar.tpl
trunk/templates/pastebin.tpl
trunk/templates/search.cy.tpl
trunk/templates/search.tpl
trunk/templates/shop.tpl
trunk/templates/societies.tpl
trunk/templates/uri.tpl
trunk/templates_c/
Log:
Merge branches/sucs-site into trunk. This means dropping support for the generic CMS. It was bad anyway, got no updates and had security holes that were fixed in the sucs specific one.
Property changes on: trunk
___________________________________________________________________
Added: svn:ignore
+ member
suapi.inc.php
static
*.tmp
templates_c
Added: svn:mergeinfo
+ /branches/imranh:590-591
/branches/sucs-site:318-656
/branches/sucs-site/branches/sucs-site:590-591
Modified: trunk/ChangeLog
===================================================================
--- trunk/ChangeLog 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/ChangeLog 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,3 +1,15 @@
+2008-01-29 - Version 0.3 "Logged Out"
+
+Sessions now last a lot longer and are more secure to boot (chckens)
+Library admin component allows adding books (chckens, eventually)
+Bananas component shelved in favour of Members component for most things (chckens)
+
+Fixes:
+Don't list societies with no website in the societies website list (chckens)
+Pastebin now redirects to url of pasted item to prevent confusion (chckens)
+News article summary can now deal with new lines in the first paragraph (chckens)
+
+
2007-10-28 - Version 0.2 "Oktoberfest"
Options component now allows users to change their hackergotchi (aeternus)
Modified: trunk/components/README
===================================================================
--- trunk/components/README 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/components/README 2015-04-05 16:42:47 UTC (rev 657)
@@ -24,7 +24,8 @@
[component] component name
$smarty The smarty object
-$DB The ADODB database object
+$DB The sucssite ADODB database object
+$sucsDB The sucs ADODB databse object
$session The Session object
Session has the following properties
@@ -35,3 +36,11 @@
any values stored in data[] will be persistant between pages
for as long as the users session cookie stays active.
+
+For error handling, your component should use the trigger_error() function:
+
+trigger_error("Informational message", E_USER_INFO); // To inform the user that something happened, e.g. the session expired
+trigger_error("Warning message", E_USER_WARNING); // Warn the user of an expected error, e.g. incorrect password
+trigger_error("Error message", E_USER_ERROR); // Reserved for unexpected conditions, e.g. unable to connect to database
+
+You may also use the message_flash("status message") function for helpful messages, e.g. form submitted
Modified: trunk/components/bananas.php
===================================================================
--- trunk/components/bananas.php 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/components/bananas.php 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,33 +1,43 @@
<?php
-/* as far as bananas are concerned, year ends after the beach party */
-$yearstart = date("Y")."-06-30";
+include_once("../lib/members.php");
-/* Banana viewing component. Looking a little obsolete since most of this is now in the members component */
+$members = new Members;
+/* Banana viewing component. Mostly obsolete since most of this is now in the members component */
+
$banana_index = array_search("Bananas", $pathlist);
if ((sizeof($pathlist) > $banana_index + 1) && (trim($pathlist[$banana_index + 1]) != "")) {
$mode = "detail";
$who = $pathlist[$banana_index + 1];
} else {
- $mode = "summary";
+ // User wasn't looking for anything in particular, so bump them to the Members page
+ header("HTTP/1.1 301 Moved Permanently");
+ header("Location: https://$preferred_hostname$baseurl/Community/Members/");
}
-if (isset($who))
- $smarty->assign('who', "$who");
+/* redirect requests for members' bananas to Members component. Only serve banana info for non-members (e.g. LIS ;-)) */
-// banana admin bits
-
-
-if ($mode == "detail") {
- $smarty->assign("awards",$DB->GetAll("SELECT *, date_trunc('second', whn) FROM awards WHERE username=? AND whn > ? ORDER BY whn DESC", array($who, $yearstart)));
- if ($session->loggedin) {
- include("../lib/banana-admin.php");
+if (count($members->memberView($who)) > 0) {
+ // this is actually a real member, so serve a redirect and let Members handle it
+ header("HTTP/1.1 301 Moved Permanently");
+ header("Location: https://$preferred_hostname$baseurl/Community/Members/$who");
+} else {
+ // banana admin bits
+ if ($mode == "detail") {
+ if ($session->loggedin) {
+ include("../lib/banana-admin.php");
+ }
}
+ // attempt to find some bananas for this name in the database
+ $smarty->assign("awards",$DB->GetAll("SELECT *, date_trunc('second', whn) FROM awards WHERE username=? ORDER BY whn DESC", array($who)));
}
-$users = $DB->GetAll("SELECT username, sum(score) AS sum FROM awards WHERE whn > ? GROUP BY username ORDER BY sum(score) DESC, username", array($yearstart));
+if (isset($who))
+ $smarty->assign('who', "$who");
+
+
$smarty->assign('mode', "$mode");
$smarty->assign('users', $users);
Deleted: trunk/components/blogadmin.php
===================================================================
--- trunk/components/blogadmin.php 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/components/blogadmin.php 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,129 +0,0 @@
-<?php
- //include our admin functions
- include("../lib/blog/admin.lib.php");
- $admin = new admin();
-
- //make our command list from the path
- $request=$pathlist;
-array_shift($request);
-array_shift($request);
-array_shift($request);
-
-$smarty->assign("title", "Blog Admin");
-
- if ($session->loggedin) $admin->menu(); else {
- header("Location: {$admin->httpPath}");
- exit;
- }
-
-ob_start();
- //alter the debuging state on request
- if ($request[0] == "debug") {
- $_SESSION[debug] = $request[1];
- }
- //if logged in
- if($session->loggedin && blogger($session->username)) {
- //call appropriate functions..
- switch (array_shift($request)) {
- case "newentry":
- $admin->printEntryForm() ;
- $smarty->assign("subselect", _("Write new entry"));
- if ($admin->blog->editor) $smarty->assign("action", "edit");
- break;
- case "Settings":
- if ($_REQUEST['submit'] == "Save Settings") {
- $admin->updateSettings();
- } else {
- $admin->printSettingsForm() ;
- }
- $smarty->assign("subselect", _("Settings"));
- break;
- case "postentry":
- $admin->postEntry() ;
- break;
- case "postupdate":
- $admin->updateEntry(array_shift($request)) ;
- break;
- case "update":
- $admin->updateForm(array_shift($request)) ;
- $smarty->assign("subselect", _("Edit entries"));
- if ($admin->blog->editor) $smarty->assign("action", "edit");
- break;
- case "showentries":
- $admin->printEntries() ;
- $smarty->assign("subselect", _("Edit entries"));
- break;
- case "deleteentry":
- $admin->deleteEntry(array_shift($request)) ;
- break;
- case "confirmdeleteentries":
- $admin->confirmDeleteEntries();
- break;
- case "deleteentries":
- $admin->deleteEntries();
- break;
- case "moderatecomments":
- $admin->printComments();
- $admin->printAuthorisedUsers();
- $comments=_("Comments");
- $result = $BlogDB->GetOne("SELECT count(comments.id) from comments join entries on comments.post = entries.id where moderated = false and entries.user_id = ".$admin->id.";");
- if($result){
- $comments .= " (".$result[0].")";
- }
- $smarty->assign("subselect", $comments);
- break;
- case "updatecomments":
- $admin->updateComments();
- break;
- case "deletecomments":
- $admin->deleteComments(array_shift($request));
- break;
- case "updateauthusers":
- $admin->updateAuthorisedUsers();
- break;
- default:
- $admin->mainPage();
- }
- }
- else {
- //run appropriate functions
- switch (array_shift($request)) {
- case "signup":
- $admin->addUserForm();
- $smarty->assign("subselect", _("Start a Blog"));
- break;
- case "adduser":
- $admin->addUser();
- break;
- //or offer login box
- default:
- $admin->addUserForm();
- $smarty->assign("subselect", _("Start a Blog"));
- break;
- }
- }
-
- ?>
- <div id="bottompanel">
- <p><? echo _("Validate"); ?> : <a href="http://validator.w3.org/check?uri=referer">XHTML</a> / <a href="http://jigsaw.w3.org/css-validator/check/referer/">CSS</a></p>
- </div>
-<?php
-$page = ob_get_contents();
-ob_end_clean();
-
-$smarty->assign("body", $page);
-$smarty->assign("extra_styles", "/css/blog.css");
-
-
- //if we are in debug mode display a bunch of stuff
- if($_SESSION[debug]){
- echo "<div class=\"debug\"><h2>"._("Debug Info")."</h2><pre>\n";
- echo "**"._("Session")."**\n";
- print_r($_SESSION);
- echo "**"._("Request")."**\n";
- print_r($_REQUEST);
- echo "**"._("Class")."**\n";
- print_r($admin);
- echo "</pre></div>";
- }
-?>
Deleted: trunk/components/blogfeed.php
===================================================================
--- trunk/components/blogfeed.php 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/components/blogfeed.php 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,156 +0,0 @@
-<?php
-/*
- * feed script - outputs an feed. Currently supports both RSS 2.0 and ATOM
- */
-
-// We're outputting raw XML, so want to turn the templating off
-$no_template = TRUE;
-
-//include the blog lib, and thus everything else we need
-include("../lib/blog/blog.lib.php");
-
-//setup our path and from that get the feed type and usernae
-$request = explode('/', substr($_SERVER['PATH_INFO'], 1));
-array_shift($request);
-array_shift($request);
-//default to rss (so old links and existing feed readers still work, would be nice to ditch this at some point)
-$feedtype = 'rss';
-if ($request[0] == 'rss' or $request[0] == 'atom'){
- $feedtype = array_shift($request);
-}
-//grab the username
-$user = array('username'=> array_shift($request));
-//check the user is sane
-if(!safeuname($user['username'])){
- error(1,"Invalid username");
-}
-//check the user exists
-$row = $BlogDB->GetRow("SELECT username, id, name, title, description FROM users WHERE username='".$user['username']."' AND enabled=true;");
-if(!$row){
- error(1, "No such user");
-}
-else {
- //fetch the users info from the db
- $user = $row;
- if(substr(dirname($_SERVER['SCRIPT_NAME']), -1)=="/"){
- $user['link'] = "http://".$_SERVER['HTTP_HOST']."/blogs/".$user['username']."/";
- $user['feed'] = "http://".$_SERVER['HTTP_HOST']."/blog/feed/".$feedtype."/".$user['username']."";
- }
- else {
- $user['link'] = "http://".$_SERVER['HTTP_HOST']."/blogs/".$user['username']."/";
- $user['feed'] = "http://".$_SERVER['HTTP_HOST']."/blog/feed/".$feedtype."/".$user['username']."";
- }
-}
-
-//check to see if we are only interested in one category
-switch(array_shift($request)){
- case "category":
- $extra = " AND category=".(int)array_shift($request);
- break;
- default:
- $extra = "";
-}
-
-//grab the first 15 entires
-$query = "SELECT subject, body, timestamp, shortsubject FROM entries WHERE user_id=".$user['id'].$extra." ORDER BY timestamp DESC LIMIT 15;";
-$result = $BlogDB->GetAll($query);
-
-//if we have relivent entrys fetch them
-if (count($result) > 0) {
- $row = array_shift($result);
- //set the publish dates in the required format
- if($feedtype=='rss') {
- $pubdate = date("r",strtotime($row['timestamp']));
- }
- if($feedtype=='atom') {
- //this should be a date type c when we are on php5, untill then, this nasty hack should work.
- $pubdate = ereg_replace(' ', 'T', $row['timestamp']).":00";
- }
- $entries = "";
- //output this entry
- if ($feedtype=='rss') {
- do {
- $entrydate = date("r",strtotime($row['timestamp']));
- $entries .= "\t\t<item>\n";
- $entries .= "\t\t\t<guid>".$user['link']."entry/".$row['shortsubject']."</guid>\n";
- $entries .= "\t\t\t<title>" . $row['subject'] . "</title>\n";
- $entries .= "\t\t\t<description><![CDATA[" . substr(strip_tags($row['body']),0,150) . " [...]]]></description>\n";
- $entries .= "\t\t\t<link>".$user['link']."entry/".$row['shortsubject']."</link>\n";
- $entries .= "\t\t\t<pubDate>" . $entrydate . "</pubDate>\n";
- $entries .= "\t\t\t<dc:creator>".$user['name']."</dc:creator>\n";
- $entries .= "\t\t\t<content:encoded><![CDATA[" . str_replace("'", "’", $row['body']) . "]]></content:encoded>\n";
- $entries .= "\t\t</item>\n";
- //and ever other
- } while ($row = array_shift($result));
- }
- if($feedtype=='atom') {
- do {
- $entrydate = ereg_replace(' ', 'T', $row['timestamp']).":00";
- $entries .= "\t<entry>\n";
- $entries .= "\t\t<title>".htmlentities($row['subject'])."</title>\n";
- $entries .= "\t\t<link rel=\"alternate\" type=\"text/html\" href=\"".$user['link']."entry/".$row['shortsubject']."\"/>\n";
- $entries .= "\t\t<id>".$user['link']."entry/".$row['shortsubject']."</id>\n";
- $entries .= "\t\t<updated>".$entrydate."</updated>\n";
- $entries .= "\t\t<content type=\"xhtml\" xml:lang=\"en\" xml:base=\"".$user['link']."entry/"."\">\n";
- $entries .= "\t\t<div xmlns=\"http://www.w3.org/1999/xhtml\">\n";
- //just passing though the raw body will cause the feed to fail if the code isnt valid, perhaps we should chuck everything though tidy on its way in (or even out) once we're on php5
- $config = array('output-xhtml' => true, 'show-body-only' => true, 'wrap' => false);
- $tidy = new tidy;
- $tidy->parseString($row['body'], $config, 'utf8');
- $tidy->cleanRepair();
- $entries .= $tidy;
- $entries .= "\t\t</div>\n";
- $entries .= "\t\t</content>\n";
- $entries .= "\t</entry>\n";
- } while ($row = array_shift($result));
- }
-}
-
-if($feedtype=='rss') {
- //tell the client its xml and utf8 encoded (which it should be)
- header("Content-type: application/rss+xml; charset=utf-8");
- echo "<?xml version=\"1.0\" ?>\n";
-?>
-<rss version="2.0"
- xmlns:content="http://purl.org/rss/1.0/modules/content/"
- xmlns:wfw="http://wellformedweb.org/CommentAPI/"
- xmlns:dc="http://purl.org/dc/elements/1.1/"
->
- <channel>
- <title><?php print $user['title']?></title>
- <description><?php print $user['description']?></description>
- <link><?php print $user['link']?></link>
- <pubDate><?php echo $pubdate; ?></pubDate>
- <generator>SUCS Blogs - http://sucs.org/blogs/</generator>
- <language>en</language>
- <?php
- // add our entrys here
- echo $entries; ?>
- </channel>
-</rss>
-<?
-}
-if($feedtype=='atom') {
- //tell the client its xml and utf8 encoded (which it should be)
- header("Content-type: application/atom+xml; charset=utf-8");
- echo "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n";
- ?>
- <feed xmlns="http://www.w3.org/2005/Atom">
- <title type="text"><?php print $user['title']?></title>
- <subtitle type="text"><?php print $user['description']?></subtitle>
- <updated><?php print $pubdate;?></updated>
- <id><?php print $user['link']?></id>
- <link rel="alternate" type="text/html" hreflang="en" href="<?php print $user['link']?>"/>
- <link rel="self" type="application/atom+xml" href="<?php print $user['feed']?>"/>
- <rights>Copyright (c) <? echo date("Y",strtotime($row['timestamp'])).", ".$user['name'] ?></rights>
- <author>
- <name><? echo $user['name'] ?></name>
- </author>
- <generator uri="http://sucs.org/blogs/" version="1.0">SUCS Blogs</generator>
-<?
- echo $entries;
-?>
- </feed>
-<?
-}
-?>
Deleted: trunk/components/blogs.php
===================================================================
--- trunk/components/blogs.php 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/components/blogs.php 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,102 +0,0 @@
-<?php
- //include our blog functions
- require_once("../lib/blog/blog.lib.php");
- //make our command list
- $request=explode('/',substr($_SERVER['PATH_INFO'], 1));
-
-//bodge - fix this
-array_shift($request);
-
- //if we have something which might be a username start a blogs instance
- if ($request[0] != "" and $request[0] != "list"){
- $blogsingle = new blogs(array_shift($request));
- }
- //otherwise, or if there was no such user, start a bloglist instance
- if (!isset($blogsingle) || !isset($blogsingle->id)) {
- $bloglist = new bloglist();
- $request = array("list");
- }
-
-
- $blog = isset($bloglist) ? $bloglist : $blogsingle;
-
- if (isset($blog->userName)) {
- if ($session->username==$blog->userName) $smarty->assign("subselect", _("My Blog"));
- else $smarty->assign("subselect", $blog->userName._("'s Blog"));
- }
-
- ob_start();
-
-$smarty->assign("title", $blog->title);
-$smarty->assign("extra_scripts", array("<script type=\"text/javascript\" src=\"/js/xmlhttp.js\"></script>"));
- //check we have a valid username before offering a RSS feed
- if($blog->userName) {
- $smarty->assign("rss_url", "http://{$_SERVER['HTTP_HOST']}{$blog->httpPath}feed/rss/{$blog->userName}".(($request[0]=="category") ? "/category/".(int)$request[1]:""));
- $smarty->assign("atom_url", "http://{$_SERVER['HTTP_HOST']}{$blog->httpPath}feed/atom/{$blog->userName}".(($request[0]=="category") ? "/category/".(int)$request[1]:""));
-// echo " <link rel=\"alternate\" type=\"application/rss+xml\" title=\"{$blog->title}\" href=\"$rss_url\"/>\n";
-// echo " <link rel=\"alternate\" type=\"application/atom+xml\" title=\"{$blog->title}\" href=\"$atom_url\"/>\n";
- }
-
-ob_start();
-
-$blog->menu();
-
- // if there was an error, print it here
- if (isset($blogsingle) && !isset($blogsingle->id)) {
- error_exc($blogsingle);
- }
- //run the appropriate command
- switch (array_shift($request)) {
- case "entry":
- $blog->printEntryAndComments(array_shift($request));
- break;
- case "category":
- $blog->printEntries(0,15,'and category = '.(int)array_shift($request));
- break;
- case "postcomment":
- $blog->newComment((int)array_shift($request)) ;
- break;
- case "Archive":
- $blog->printArchive($request);
- if ($session->username == $blog->userName) $smarty->assign("subselect", _("My Archive"));
- else $smarty->assign("subselect", $blog->userName._("'s Archive"));
- break;
- case "list":
- $blog->listBlogs();
- break;
- default:
- $blog->printEntries();
- }
- ?>
- <div id="bottompanel">
- <p><? echo _("Validate"); ?> : <a href="http://validator.w3.org/check?uri=referer">XHTML</a> / <a href="http://jigsaw.w3.org/css-validator/check/referer/">CSS</a> /
-<?
- if($blog->userName) {
- echo "<a href=\"http://feedvalidator.org/check.cgi?url=$rss_url\">RSS</a> / <a href=\"http://feedvalidator.org/check.cgi?url=$atom_url\">ATOM</a>";
- }
- else {
- echo "RSS / ATOM";
- }
-?>
- </p>
- </div>
-<?php
-$page = ob_get_contents();
-ob_end_clean();
-
-$smarty->assign("body", $page);
-$smarty->assign("extra_styles", "/css/blog.css");
-
- //display debuing info as required
- if($_SESSION[debug]){
- echo "<div class=\"debug\"><h2>"._("Debug Info")."</h2><pre>\n";
- echo "**"._("Session")."**\n";
- print_r($_SESSION);
- echo "**"._("Request")."**\n";
- print_r($_REQUEST);
- echo "**"._("Class")."**\n";
- print_r($blog);
- echo "</pre></div>";
- }
-
-?>
Modified: trunk/components/contents.php
===================================================================
--- trunk/components/contents.php 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/components/contents.php 2015-04-05 16:42:47 UTC (rev 657)
@@ -10,9 +10,9 @@
if ($file[0]!=".") {
$element = array();
if (!is_dir(SUCS_BASEDIR."static".$mypath."/".$file)) {
- $pagename = ereg_replace("\.txt", "", $file);
+ $pagename = preg_replace("/\.txt/", "", $file);
if ($summaries) $element['summary'] = $DB->GetOne("select summary from static where path=?", array($mypath."/".$pagename));
- if ($pagename!=@$lastdir) $output[$pagename]=$element;
+ if ($pagename!=@$lastdir) $output[$pagename]=str_replace("_", " ", $element);
} else {
if ($recurse) $element['file']=listdir($mypath."/".$file, $recurse, $summaries);
if ($summaries) $element['summary'] = $DB->GetOne("select summary from static where path=?", array($mypath."/".$file));
Copied: trunk/components/disk.graph.php (from rev 656, branches/sucs-site/components/disk.graph.php)
===================================================================
--- trunk/components/disk.graph.php (rev 0)
+++ trunk/components/disk.graph.php 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,26 @@
+<?
+ exec("/usr/local/bin/shame.py -a", $Shame);
+ for ( $i=1 ; $i < (count($Shame) - 1); $i++)
+ {
+ list($space, $place, $user, $size) = preg_split("/ +/", $Shame[$i]);
+ if ($i <= 12)
+ {
+ $item[]=$user;
+ $slice[]=preg_replace('/M/', '', ${size});
+ }
+ else {
+ $otherSize += preg_replace('/M/', '', ${size});
+ }
+ }
+// $itemName[]="Other";
+// $sliceSize[]=$otherSize;
+ $slice = array_merge(array($otherSize),$slice);
+ $item = array_merge(array("Other"), $item);
+
+/* echo "<pre>";
+ print_r($slice);
+ print_r($item);*/
+
+ include("../../lib/pieChart.php");
+ piechart("Top 12 Users of disk space", $slice, $item, 1)
+?>
Copied: trunk/components/disk.php (from rev 656, branches/sucs-site/components/disk.php)
===================================================================
--- trunk/components/disk.php (rev 0)
+++ trunk/components/disk.php 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,51 @@
+<? exec("/usr/local/bin/shame.py -a", $Shame);
+ $max=10; //SET to number of users to display
+ $smarty->assign('title',"The SUCS Hall of Shame");
+//$o="<div style='text-align: center;'><img src=\"/images/disk.graph.php\" alt=\"pie chart of top 12 disk users\"/></div>";
+ $o.="<table align=\"center\">\n";
+ $o.="\t<tr><th align=\"center\">User</th><th align=\"center\">Home Directory Size</th></tr>\n";
+ for ( $i=1 ; $i < 13 /*(count($Shame) - 1)*/; $i++)
+ {
+ list($space, $place, $user, $size) = preg_split("/ +/", $Shame[$i]);
+ if ($size > 0)
+ $o.="\t<tr><td align=\"center\">$user</td><td align=\"center\">${size}B</td></tr>\n";
+ }
+ exec("df -m /home",$dfraw);
+ $dfout = preg_split('/[ ]+/', $dfraw[1]);
+ $o.="\t<tr><td align=\"center\" colspan=\"2\">".floor($dfout[2]/1024)."GB used of ".floor($dfout[1]/1024). "GB (".floor($dfout[3]/1024)."GB available)</td></tr>\n";
+ $o.="</table>\n";
+ $o.=$Shame[count($Shame) - 1];
+ $o.="<br />\n";
+ //readfile("tail.html");
+ $out="<script type=\"text/javascript\" src=\"https://www.google.com/jsapi\"></script>
+ <script type=\"text/javascript\">
+ google.load(\"visualization\", \"1\", {packages:[\"corechart\"]});
+ google.setOnLoadCallback(drawChart);
+ function drawChart() {
+
+ var data = new google.visualization.DataTable();
+ data.addColumn('string', 'User');
+ data.addColumn('number', 'Megabytes in use');
+ data.addRows(".(count($Shame) - 1).");\n";
+ for( $i=0; $i<(count($Shame) - 3); $i++ ){
+ list($u,$d)=parseLine($Shame[$i+1]);
+ $out.="data.setValue(".($i+1).", 0, '".$u."');\n";
+ $out.="data.setValue(".($i+1).", 1,".$d.");\n";
+ }
+ $others=0;
+ for ( $i=$max; $i<count($data); $i++ ) {
+ list($u,$d)=parseLine($Shame[$i+1]);
+ $others+=$d;
+ }
+ $out.="data.setValue(0, 0, 'Free Space');\ndata.setValue(0,1,".$dfout[3]." );\n";
+ $out.="\t\tvar chart = new google.visualization.PieChart(document.getElementById('chart_div'));
+ chart.draw(data, {width: 500, height: 360, backgroundColor: 'none', is3D: true, title: 'Disk Usage',sliceVisibilityThreshold: 1/180});
+ }
+ </script>";
+ $out.="<div id='chart_div' align='center'></div>";
+ $smarty->assign('body', ($out.$o));
+function parseLine($l){
+ $fields=explode("|",preg_filter("/[ ]+/","|",$l));
+ return array(trim($fields[2]),trim(str_replace("M","",$fields[3])));
+}
+?>
Copied: trunk/components/election.php (from rev 656, branches/sucs-site/components/election.php)
===================================================================
--- trunk/components/election.php (rev 0)
+++ trunk/components/election.php 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,135 @@
+<?php
+$smarty->assign("election_year", ELECTION_YEAR);
+$smarty->assign("title", "Executive Election ".ELECTION_YEAR);
+
+function display_ballot() {
+ global $DB, $smarty, $output;
+
+ require_once("../lib/members.php");
+ $members = new Members;
+ $role = $DB->GetAll("SELECT post FROM election_candidates GROUP BY post");
+
+ foreach ($role as $post) {
+ $candidate[$post['post']] = $DB->GetAll("SELECT username, manifesto_link FROM election_candidates WHERE post=? ORDER BY username ASC", $post['post']);
+
+ $i=0;
+ foreach ($candidate[$post['post']] as $person) {
+ $details = $members->memberView($person['username']);
+ $candidate[$post['post']][$i]['realname'] = $details[0]['cn'];
+ if (empty($person['manifesto_link'])) $candidate[$post['post']][$i]['manifesto_link'] = ELECTION_NO_MANIFESTO;
+ $i++;
+ }
+ }
+
+ $smarty->assign("candidate", $candidate);
+ $output = $smarty->fetch('election-vote.tpl');
+}
+
+
+if (!$session->loggedin) {
+ # You can't vote if you're not logged in!
+ trigger_error("You are not logged in.", E_USER_WARNING);
+} else {
+ # The election hasn't started yet
+ if (strtotime('now') < strtotime(ELECTION_START)) trigger_error("The polling station is not yet open. Voting begins on ".date('l jS F, Y \a\t H:i', strtotime(ELECTION_START)).".");
+
+ # The election is over - display the results
+ else if (strtotime('now') > strtotime(ELECTION_END)) {
+ require_once("../lib/members.php");
+ $members = new Members;
+ $role = $DB->GetAll("SELECT post FROM election_candidates GROUP BY post");
+
+ foreach ($role as $post) {
+ $candidate[$post['post']] = $DB->GetAll("SELECT username, manifesto_link FROM election_candidates WHERE post=?", $post['post']);
+
+ $i=0;
+ foreach ($candidate[$post['post']] as $person) {
+ $details = $members->memberView($person['username']);
+ $candidate[$post['post']][$i]['realname'] = $details[0]['cn'];
+ if (empty($person['manifesto_link'])) $candidate[$post['post']][$i]['manifesto_link'] = ELECTION_NO_MANIFESTO;
+ $candidate[$post['post']][$i]['votes'] = $DB->GetOne("SELECT count(username) FROM election_votes WHERE ".$post['post']."=?", array($person['username']));
+ $i++;
+ }
+ }
+
+ $smarty->assign("candidate", $candidate);
+ $output = $smarty->fetch('election-results.tpl');
+ } else {
+ # It's election time
+ # Check the user hasn't already voted
+ $vote_details = $DB->GetRow("SELECT time, ipaddress FROM election_votes WHERE username=?", $session->username);
+ if (count($vote_details)>0) {
+ trigger_error("You already voted on ".date('l jS F, Y \a\t H:i', strtotime($vote_details['time']))." from IP address ".$vote_details['ipaddress'].".", E_USER_WARNING);
+ $output = "<p>Please email the Returning Officer at <a href=\"mailto:vote at sucs.org\">vote at sucs.org</a> with any queries.</p>\n<p>Once polling has closed on ".date('l jS F, Y \a\t H:i', strtotime(ELECTION_END)).", the election results will be available on this page.</p>";
+ } else {
+ if ($_POST['submit']=="Cast Votes") {
+ # We have a ballot paper to process
+ $output = "<h2>Thank you for your vote</h2>\n<p>You will shortly receive an email confirming your vote.</p>\n<p>Once polling has closed on ".date('l jS F, Y \a\t H:i', strtotime(ELECTION_END)).", the election results will be available on this page.</p>";
+
+ # Establish which positions are contested
+ $role = $DB->GetCol("SELECT post FROM election_candidates GROUP BY post HAVING count(username) > 1");
+
+ $fail = FALSE;
+ $invalid_candidate = FALSE;
+ $abstain_count = 0;
+ foreach ($role as $post) {
+ if ($_POST[$post] == "abstain") $abstain_count++;
+ # check that we have a valid option selected
+ if (!($DB->GetOne("SELECT username FROM election_candidates WHERE post=? AND username=?", array($post, $_POST[$post])) || $_POST[$post]=="abstain")) $fail = TRUE;
+ }
+
+
+ # Check their password first
+ if ($session->check_pass($session->username, $_POST['vote_passwd'])) {
+ if ($fail) {
+ # Either no option or an invalid candidate was supplied
+ trigger_error("An invalid option was selected in at least one ballot. Please try again.", E_USER_WARNING);
+ display_ballot();
+ } else {
+ # User has abstained in all votes
+ if ($abstain_count == count($role)) {
+ trigger_error("You have not selected any candidates in any ballots.", E_USER_WARNING);
+ display_ballot();
+ } else {
+ # The input is valid - record the vote
+ $vote = array(
+ 'username' => $session->username,
+ 'time' => 'now',
+ 'ipaddress' => $_SERVER['REMOTE_ADDR']);
+
+ # Email the Returning Officer
+ $ro_message = "User: ".$vote['username']."\nIP: ".$vote['ipaddress']."\n\n";
+
+ # Email the voter with confirmation
+ $voter_message = "Thank you for voting in the SUCS election this year. Here are the votes you cast:\n\n";
+
+ foreach ($role as $post) {
+ # Don't add votes up as we go
+ # $DB->Execute("UPDATE election_candidates SET votes=votes+1 WHERE post=? AND username=?", array($post, $_POST[$post]));
+ $vote[$post] = $_POST[$post];
+ $ro_message .= ucfirst($post).": ".$_POST[$post]."\n";
+ $voter_message .= ucfirst($post).": ".$_POST[$post]."\n";
+ }
+
+ $voter_message .= "\nResults of the election will be announced on ".date('l jS F, Y \a\t H:i', strtotime(ELECTION_END))." at http://sucs.org/Vote\n";
+
+ $DB->AutoExecute("election_votes", $vote, 'INSERT');
+
+ mail("SUCS Returning Officer <vote at sucs.org>", "[SUCS Election] Vote received from ".$vote['username'], $ro_message, "From: SUCS Election ".ELECTION_YEAR." <vote at sucs.org>");
+ mail($session->fullname." <".$session->username."@sucs.org>", "[SUCS Election] Thanks For Voting", $voter_message, "From: SUCS Election ".ELECTION_YEAR." <vote at sucs.org>");
+ }
+ }
+ } else {
+ display_ballot();
+ }
+ } else {
+ # Display the ballot paper
+ display_ballot();
+ }
+ }
+ }
+}
+
+$smarty->assign("body", $output);
+
+?>
Copied: trunk/components/electionreminder.php (from rev 656, branches/sucs-site/components/electionreminder.php)
===================================================================
--- trunk/components/electionreminder.php (rev 0)
+++ trunk/components/electionreminder.php 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,8 @@
+<?php
+
+if (strtotime('now') > strtotime(ELECTION_START) && strtotime('now') < strtotime(ELECTION_END) && !$DB->GetOne("SELECT username FROM election_votes where username=?", $session->username)) {
+ $messages['info'][] = "<strong>You haven't voted yet</strong><br />\nThe SUCS Executive Election is in progress. <a href=\"/Vote\">Vote now!</a>\n";
+}
+
+
+?>
Modified: trunk/components/email.php
===================================================================
--- trunk/components/email.php 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/components/email.php 2015-04-05 16:42:47 UTC (rev 657)
@@ -8,7 +8,7 @@
// Perform data integrity checks
// Full name
-if (ereg("[:/<>]", $_REQUEST['realname'])) {
+if (preg_match("/[^\p{L}- ]/iu", $_REQUEST['realname'])) {
$body .= "<p>That's a suspiciously unusual-looking name, <strong>" . htmlentities($_REQUEST['realname']) . "</strong>.</p>\n";
$body .= "<p>Please click <em>Back</em> and correct it.</p>\n";
} else {
@@ -18,14 +18,14 @@
$body .= "<p>Please click <em>Back</em> and correct it.</p>\n";
} else {
// Email address
- list($username, $maildomain) = split("@", $_REQUEST['email']);
+ list($username, $maildomain) = preg_split("/@/", $_REQUEST['email']);
if (!checkdnsrr($maildomain, "MX") && !checkdnsrr($maildomain)) {
$body .= "<p>The email address <strong>" . htmlentities($_REQUEST['email']) . "</strong> appears not to be valid.</p>\n";
$body .= "<p>Please click <em>Back</em> and correct it.</p>\n";
} else {
// Username
// This test is rather inadequate. Needs improving
- if (ereg("[:/<>]", $_REQUEST['uname'])) {
+ if (!preg_match("/^[a-z0-9_]*$/i", $_REQUEST['uname'])) {
$body .= "<p>Usernames can only contain letters, numbers and underscores(_).</p>\n";
$body .= "<p>Please click <em>Back</em> and choose a different one.</p>\n";
} else {
@@ -58,4 +58,4 @@
$smarty->assign("title", "Joining");
$pathlist[2] = "Joining";
$smarty->assign("subselect", "Joining");
-?>
\ No newline at end of file
+?>
Copied: trunk/components/events.php (from rev 656, branches/sucs-site/components/events.php)
===================================================================
--- trunk/components/events.php (rev 0)
+++ trunk/components/events.php 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,107 @@
+<?php
+/*
+ * Main events page, including admin functions
+ */
+
+
+$permission = "sucsstaff";
+$eventtable = "events";
+$eventcategories = array("Technical","Talks","Gaming","Social","Misc");
+
+$smarty->assign("event_categories", $eventcategories);
+
+$events_index = array_search("Events", $pathlist);
+
+if (isset($pathlist[$events_index + 1])) {
+ list($eventcat, $eventid) = preg_split("/_/", $pathlist[$events_index + 1]);
+ if (!in_array($eventcat, $eventcategories)) {
+ trigger_error("Invalid category specified", E_USER_ERROR);
+ unset($eventcat, $eventid);
+ } elseif (!ctype_digit($eventid)) {
+ trigger_error("Invalid event specified", E_USER_ERROR);
+ print_r($eventid);
+ unset($eventcat, $eventid);
+ }
+}
+
+if (isset($session->groups[$permission])) {
+ $smarty->assign("editable", true);
+ $action = @$_REQUEST['action'];
+
+ // process form actions with side-effects first
+ switch ($action) {
+ case "save":
+ $record['name'] = $_REQUEST['name'];
+ $record['description'] = $_REQUEST['description'];
+ $record['location'] = $_REQUEST['location'];
+
+ // reconstruct date/time
+ $datetime = $_REQUEST['Date_Year'];
+ $datetime .= str_pad((int) $_REQUEST['Date_Month'],2,'0',STR_PAD_LEFT);
+ $datetime .= str_pad((int) $_REQUEST['Date_Day'],2,'0',STR_PAD_LEFT);
+
+ $datetime .= " ".$_REQUEST['Time_Hour'];
+ $datetime .= ":".$_REQUEST['Time_Minute'];
+
+
+ $record['whn'] = $datetime;
+ $record['category'] = $_REQUEST['category'];
+ $id = @$_REQUEST['id'];
+
+ // this may be an existing event which needs to be updated
+ if (ctype_digit($id)) {
+ $DB->AutoExecute($eventtable, $record, 'UPDATE', "id=".$id);
+ } else {
+ $DB->AutoExecute($eventtable, $record, 'INSERT');
+ }
+
+ unset($action);
+ break;
+ }
+}
+
+if (isset($session->groups[$permission]) && isset($action)) {
+ switch($action) {
+ case "create":
+ $event = array("id" => "*");
+ $body = $smarty->fetch("event_edit.tpl");
+ break;
+ case "edit":
+ if (isset($eventcat) && isset($eventid)) {
+ $event = $DB->GetRow("SELECT * FROM $eventtable WHERE id=?", array($eventid));
+
+ //make tastier breadcrumbs
+ $pathlist[$events_index + 1] = $event['name'];
+
+ $smarty->assign("event", $event);
+ $body = $smarty->fetch("event_edit.tpl");
+ }
+ break;
+ }
+} else {
+ // not logged in, or no special action required
+ if (isset($eventcat) && isset($eventid)) {
+ $event = $DB->GetRow("SELECT * FROM $eventtable WHERE id=?", array($eventid));
+
+ //make tastier breadcrumbs
+ $pathlist[$events_index + 1] = $event['name'];
+
+ $smarty->assign("event", $event);
+ $body = $smarty->fetch("event.tpl");
+ } else {
+ $events = $DB->GetAll("SELECT *,date_part('epoch', whn) as whn_timestamp
+ FROM $eventtable WHERE date_trunc('day', whn) >= date_trunc('day',NOW()) ORDER BY whn ASC");
+ $oldevents = $DB->GetAll("SELECT *,date_part('epoch', whn) as whn_timestamp
+ FROM $eventtable WHERE date_trunc('day', whn) < date_trunc('day', NOW()) ORDER BY whn DESC LIMIT 3");
+ $smarty->assign("events", $events);
+ $smarty->assign("oldevents", $oldevents);
+ $body = $smarty->fetch("events.tpl");
+ }
+}
+
+$smarty->assign("body", $body);
+$smarty->assign("title", "Events");
+//$smarty->assign("secondary", file_get_contents("../static/fragments/Events.txt"));
+
+
+?>
Copied: trunk/components/events_ical.php (from rev 656, branches/sucs-site/components/events_ical.php)
===================================================================
--- trunk/components/events_ical.php (rev 0)
+++ trunk/components/events_ical.php 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,34 @@
+<?php
+require_once("../lib/iCalcreator.class.php");
+
+// disable site template
+$no_template = TRUE;
+
+// initialise calendar
+$cal = new vcalendar();
+$cal->setConfig('unique_id', 'sucs.org');
+$cal->setProperty('method', 'PUBLISH');
+$cal->setProperty('x-wr-calname', "SUCS Events Calendar");
+$cal->setProperty('X-WR-CALDESC',
+ "Upcoming events for members of the Swansea University Computer Society");
+$cal->setProperty('X-WR-TIMEZONE', 'Europe/London');
+
+//populate with upcoming events
+$events = $DB->GetAll("SELECT * FROM events WHERE
+ date_trunc('day', whn) >= date_trunc('day', NOW()) ORDER BY whn ASC");
+
+foreach($events as $event) {
+ $vevent = new vevent();
+ $vevent->setProperty('dtstart', $event['whn']);
+ $vevent->setProperty('LOCATION', $event['location']);
+ $vevent->setProperty('summary', $event['name']);
+ $vevent->setProperty('description', $event['description']);
+ $vevent->setProperty('categories', $event['category']);
+ $cal -> setComponent($vevent);
+}
+
+//spit out a shiny new iCal file
+$cal->returnCalendar();
+
+
+?>
Deleted: trunk/components/forum.php
===================================================================
--- trunk/components/forum.php 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/components/forum.php 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,64 +0,0 @@
-<?php
-
-// Forum integration component
-
-$punbb_base = "/usr/share/punbb";
-
-// Attempt to divine which punbb file is wanted
-$file_index = array_search("Forum", $pathlist) + 1;
-
-if ($pathlist[$file_index] == "") {
- $punbb_file = "index.php";
-} else {
- $punbb_file = $pathlist[$file_index];
-}
-
-// Stick relevant get parameters somewhere where the template can get them
-// This is to cure problems with the login form eating essential get params
-// Done here instead of site-wide to limit potential for an XSS vulnerabilityy
-
-// (it occurs though that this could be solved using session data rather than writing GET params)
-
-$gets = array();
-if (isset($_GET['id']))
- $gets['id'] = intval($_GET['id']);
-if (isset($_GET['p']))
- $gets['p'] = intval($_GET['p']);
-
-$smarty->assign("gets", $gets);
-
-
-// move to the punbb directory and start buffering
-$oldcwd = getcwd();
-chdir($punbb_base);
-ob_start();
-
-// include the wanted punbb file
-try {
- include($punbb_base."/".$punbb_file);
-} catch (Exception $e) {
- // do nothing. This is practically expected as our punbb throws exceptions when it's done rendering
- // this sounds nasty, but it's better than calling exit() like the stock punbb does ;-)
-}
-
-// stop buffering, move back to where we were
-$page = ob_get_contents();
-ob_clean();
-chdir($oldcwd);
-
-// if this is for syndication purposes, we don't want a template
-if ($punbb_file == "extern.php") {
- $no_template = TRUE;
- echo $page;
-} else {
-
- // make the breadcrumbs tastier
- $pathlist = array_slice($pathlist, 0, $file_index);
-
- $smarty->assign("title", "Forum");
- $smarty->assign("extra_styles", "/css/forum/SUCS.css");
- $smarty->assign("rss_url", "/Community/Forum/extern.php?action=active&type=rss");
- $smarty->assign("body", $page);
-}
-
-?>
Deleted: trunk/components/forumposts.php
===================================================================
--- trunk/components/forumposts.php 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/components/forumposts.php 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,13 +0,0 @@
-<?php
-unset($result);
-require_once("/usr/share/adodb/adodb.inc.php");
-$ForumDB = NewADOConnection('postgres8');
-$ForumDB->Connect('dbname=punbb');
-$ForumDB->SetFetchMode(ADODB_FETCH_ASSOC);
-
-$posts = $ForumDB->GetAll('SELECT t.subject, t.last_poster, t.last_post_id FROM topics AS t INNER JOIN forums AS f ON f.id=t.forum_id LEFT JOIN forum_perms AS fp ON (fp.forum_id=f.id AND fp.group_id=4) WHERE (fp.read_forum IS NULL OR fp.read_forum=1) ORDER BY t.last_post DESC LIMIT 5');
-
-$smarty->assign('posts', $posts);
-
-$result = $smarty->fetch('forumposts.tpl');
-?>
Modified: trunk/components/front.php
===================================================================
--- trunk/components/front.php 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/components/front.php 2015-04-05 16:42:47 UTC (rev 657)
@@ -8,14 +8,16 @@
if (!$session->loggedin) {
$output = file_get_contents("../static/fragments/Join.txt");
} else {
- $output = "<div class=\"cbb\"><h3>You are logged in</h3><p>If you would like to contribute to the site or report a bug, please contact chckens or dez.</p></div>";
+ $output = "<div class=\"cbb\"><h3>You are logged in</h3><p>If you would like to contribute to the site or report a bug, please contact imranh.</p></div>";
+ $output = "<div class=\"cbb\"><h3>You are logged in</h3><p style=\"text-align: center;\">Why not join our <a href=\"#\" onclick=\"window.open('/mw/','Milliways','height=600,width=800,menubar=no,resizable=yes,location=no,directories=no,scrollbars=yes,status=no,toolbar=no')\" style=\"font-size: 150%; font-weight: bold; color: #ffc62b;\">Live Chat</a>?</p></div>";
//include('users.php');
//$output .= $result;
-//include('planetposts.php');
-//$output .= $result;
-//include('forumposts.php');
-//$output .= $result;
+include('electionreminder.php');
+$output .= $result;
}
+
+$output .= "<div class=\"cbb\"><h3>SUCS Tools</h3><p>Download the SUCS Tools to make it easier to access SUCS services from your computer.</p><ul><li><a href=\"/files/sucstools-latest.exe\">SUCS Tools for Windows</a></li><li><a href=\"/files/SUCS-latest.dmg\">SUCS Tools for Mac OS X</a></li></ul><p>More information about the tools is available in \"<a href=\"/Knowledge/Help/SUCS%20Services/Using%20the%20SUCS%20Tools\">Using the SUCS Tools</a>\".</p></div>";
+
$smarty->assign("secondary",$output);
?>
Copied: trunk/components/junk.php (from rev 656, branches/sucs-site/components/junk.php)
===================================================================
--- trunk/components/junk.php (rev 0)
+++ trunk/components/junk.php 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,201 @@
+<?php
+
+// Set defaults
+$mode = "list";
+$admin = false;
+
+$admin_group="sucsstaff";
+
+// who's notified of items being requested?
+$junk_contact="admin at sucs.org";
+
+$admin = isset($session->groups[$admin_group]);
+
+// If you're an admin and the path ends in Edit/ then a number put it into edit mode
+// create canedit rules
+$canedit=isset($pathlist[($component[depth]/2)+1]);
+$canedit=$canedit && isset($pathlist[($component[depth]/2)+2]);
+$canedit=$canedit && $pathlist[($component[depth]/2)+1]=='Edit';
+$canedit=$canedit && is_numeric($pathlist[($component[depth]/2)+2]);
+$canedit=$canedit && $admin;
+// Apply canedit rules
+if ($canedit){
+ $id = $pathlist[($component[depth]/2)+2];
+ $items = $DB->GetAll("SELECT id, title, category, description, donated_by, status FROM inventory WHERE id=? AND requested_by IS NULL",$id);
+ if(sizeof($items) === 1){
+ $item = $items[0];
+ $smarty->assign("item", $item);
+ $mode = "edit";
+ }
+}
+
+// If you're an admin and the path ends in Add put it into add mode
+// create canadd rules
+$canadd=isset($pathlist[($component[depth]/2)+1]);
+$canadd=$canadd && $pathlist[($component[depth]/2)+1]=='Add';
+$canadd=$canadd && $admin;
+// Apply canadd rules
+if ($canadd){$mode = "add";}
+
+
+// Process actions before retrieving the data
+// List request data
+if ($session->loggedin && isset($_REQUEST['action'])) {
+ // Junk Requests
+ if ($_REQUEST['action'] == "Request") {
+ // Request Item if its available
+ $query = "UPDATE inventory SET requested_by=?, requested_on=now() WHERE id=? AND requested_by IS NULL";
+ $DB->Query($query, array($session->username, $_REQUEST['item']));
+
+ // mail someone so we know that this has been requested
+ $iteminfo = $DB->GetRow("SELECT title, description FROM inventory WHERE id=?", array($_REQUEST['item']));
+ $msgbody = "User {$session->username} has requested the junk item:\n\n";
+ $msgbody .= "{$iteminfo['title']}: {$iteminfo['description']}\n\n";
+ $msgbody .= "Please ensure this is taken away and never brought back.";
+ mail($junk_contact,"Junk item requested",$msgbody);
+
+ }
+ elseif ($_REQUEST['action'] == "Un-Request") {
+ // Un-Request Item
+ if ($admin){
+ // if you're admin just do it
+ $query = "UPDATE inventory SET requested_by=null, requested_on=null WHERE id=?";
+ $array = array($_REQUEST['item']);
+ }
+ else{
+ // if not admin check if you requested it first
+ $query = "UPDATE inventory SET requested_by=null, requested_on=null WHERE id=? AND requested_by=?";
+ $array = array($_REQUEST['item'], $session->username);
+ }
+ $DB->Query($query, $array);
+ }
+ elseif ($_REQUEST['action'] == "Take" && $admin){
+ // Take item, if you're admin
+ $query = "UPDATE inventory SET taken_on=now() WHERE id=? AND requested_by IS NOT NULL";
+ $DB->Query($query, $_REQUEST['item']);
+ }
+ elseif ($_REQUEST['action'] == "Remove" && $admin){
+ // Remove item, if you're admin
+ $query = "DELETE FROM inventory WHERE id=?";
+ if ($DB->Query($query, $_REQUEST['item'])) {
+ message_flash("Item removed");
+ } else {
+ trigger_error("Failed to remove item");
+ }
+ }
+ elseif ($_REQUEST['action'] == "Not Junk" && $admin){
+ // Mark item as not junk if it's not been requested and you're admin
+ $query = "UPDATE inventory SET status='unknown' WHERE id=? AND requested_by IS NULL";
+ $DB->Query($query, $_REQUEST['item']);
+ }
+ elseif ($_REQUEST['action'] =="Junk" && $admin){
+ // Mark item as junk, if you're admin
+ $query = "UPDATE inventory SET status='junk' WHERE id=?";
+ $DB->Query($query, $_REQUEST['item']);
+ }
+
+}
+// Update/Add item
+if ($session->loggedin && $admin && (isset($_REQUEST['update']) || isset($_REQUEST['add']))) {
+ // try to guess which category field the user meant us to see
+ // ideally we'd use an html combo box, but since they don't exist...
+ if ($_REQUEST['categorymenu'] == "") {
+ $category = $_REQUEST['category'];
+ } else {
+ $category = $_REQUEST['categorymenu'];
+ }
+
+ // Update/Add item if title and category are filled in else error
+ if ($_REQUEST['title'] != "" && $category != "") {
+ // if the description is blank, return null
+ if ($_REQUEST['description'] == ""){
+ $description = null;
+ }
+ else{
+ $description = $_REQUEST['description'];
+ }
+ // if the donated_by is blank, return null
+ if ($_REQUEST['donated_by'] == ""){
+ $donated_by = null;
+ }
+ else{
+ $donated_by = $_REQUEST['donated_by'];
+ }
+ // run the query
+ if(isset($_REQUEST['update'])){
+ $query = "UPDATE inventory SET title=?, category=?, description=?, donated_by=?, status=? WHERE id=?";
+ $array = array($_REQUEST['title'], $category, $description, $donated_by, $_REQUEST['status'], $_REQUEST['id']);
+ if ($DB->Query($query, $array)) {
+ message_flash("Item Updated");
+ } else {
+ trigger_error("Item update failed :-(", E_USER_ERROR);
+ }
+ }
+ elseif(isset($_REQUEST['add'])){
+ $query = "INSERT INTO inventory (title, category, description, donated_by, status) VALUES (?, ?, ?, ?, ?)";
+ $array = array($_REQUEST['title'], $category, $description, $donated_by, $_REQUEST['status']);
+ if ($DB->Query($query, $array)) {
+ message_flash("Item Added");
+ } else {
+ trigger_error("Adding item failed :-( - ".$DB->ErrorMsg(), E_USER_ERROR);
+ }
+ }
+ }
+ else{
+ trigger_error("Required field(s) missing", E_USER_WARNING);
+ }
+}
+
+// Remove old taken junk
+$DB->Query("DELETE FROM inventory WHERE (taken_on + interval'7 days') < now()");
+
+
+if ($mode == 'list'){
+ // Get junk from database, and give admin the full list
+ if ($admin == true){
+ $junk = $DB->GetAll("SELECT * FROM inventory ORDER BY category, title, id");
+ }
+ else{
+ $junk = $DB->GetAll("SELECT * FROM inventory WHERE status = 'junk' ORDER BY category, title, id");
+ }
+ //
+ // Check there is some junk
+ if (sizeof($junk) < 1) {
+ $mode = "nojunk";
+ } else {
+
+ // group the junk by status then by category
+ foreach($junk as $junkitem) {
+ if ($junkitem['status'] != 'junk') {
+ $status = "unknown";
+ } else if ($junkitem['requested_by'] == null) {
+ $status = "available";
+ } else if ($junkitem['taken_on'] == null) {
+ $status = "requested";
+ } else {
+ $status = "taken";
+ }
+
+ $sortedjunk[$status][$junkitem['category']][] = $junkitem;
+ }
+ $smarty->assign("junk", $sortedjunk);
+ }
+
+
+} else {
+ $categories = $DB->GetCol("SELECT DISTINCT category FROM inventory ORDER BY category ASC");
+ $smarty->assign("categories", $categories);
+}
+// Generate output
+
+$smarty->assign("statuses",array("unknown", "in use", "wanted", "junk"));
+$smarty->assign("componentpath", $baseurl . $component[path]);
+$smarty->assign("mode", $mode);
+$smarty->assign("admin", $admin);
+
+$output = $smarty->fetch("junk.tpl");
+
+$smarty->assign("title", "Junk List");
+$smarty->assign("body", $output);
+
+?>
Modified: trunk/components/library.php
===================================================================
--- trunk/components/library.php 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/components/library.php 2015-04-05 16:42:47 UTC (rev 657)
@@ -35,8 +35,14 @@
if (isset($pathlist[$library_index + 2])) {
$tag = $pathlist[$library_index + 2];
// we're displaying books with a specific tag
- $categories = $DB->GetOne("SELECT count(name) FROM bookcategories WHERE name=?", array($tag));
- if ($categories['count'] == 1) {
+ //The following line doesn't do what I think you think it does.
+ //It will return a string if the tag exists, "1" and "0" when a tag doesn't exist
+ $categories = $DB->GetOne("SELECT count(name) FROM bookcategories WHERE name=?", array($tag));
+ //debug stuff, LOOK IT'S A STRING
+ //var_dump($categories);
+ //if ($categories['count'] == 1) {
+ //$categories is not an aray, it's a string, yeah i know == != good_programing
+ if ($categories == 1) {
$mode = "tagdisplay";
$query = "SELECT b.id, b.title FROM books AS b JOIN booktags AS bt ON b.id= bt.bookid";
$query .= " JOIN bookcategories AS bc ON bc.id = bt.tag WHERE bc.name=?";
@@ -55,6 +61,7 @@
$mode = "display";
$checkout_request = false;
$book_index = intval($pathlist[$library_index + 1]);
+ if (isset($session->groups[$permission])) $smarty->assign('editable', true);
// Check this book actually exists
$loans = $DB->GetAll("SELECT onloan FROM books WHERE id=? LIMIT 1", array($book_index));
@@ -62,7 +69,7 @@
$mode = "bookerror";
} else {
- // See if we're supposed to be loaning or returning this book
+ // See if we're supposed to be loaning/returning/editing/saving this book
if ($session->loggedin && isset($_REQUEST['action'])) {
if ($_REQUEST['action'] == "loan") {
if (isset($session->groups[$permission])) {
@@ -77,6 +84,25 @@
} elseif (($_REQUEST['action'] == "return") && isset($session->groups[$permission])) {
// update DB
$DB->Query("UPDATE books SET onloan='f', loandate=NULL WHERE id=?", array($book_index));
+ } elseif (($_REQUEST['action'] == "edit") && isset($session->groups[$permission])) {
+ // we're an editor and want to edit this book
+ $smarty->assign("editing", true);
+ } elseif (($_REQUEST['action'] == "save") && isset($session->groups[$permission])) {
+ // save edited book
+ $book['title'] = $_REQUEST['title'];
+ $book['author'] = $_REQUEST['author'];
+ $book['publisher'] = $_REQUEST['publisher'];
+ $book['description'] = $_REQUEST['description'];
+
+ if ($DB->AutoExecute('books', $book, 'UPDATE', "id=".$DB->qstr($book_index))) {
+ message_flash_postponed("Book Updated!");
+ //redirect to prevent form resubmission
+ header('HTTP/1.1 303 See Other');
+ header("Location: $baseurl$path");
+ } else {
+ trigger_error("Error updating book: ".$DB->ErrorMsg(), E_USER_WARNING);
+ }
+
}
}
@@ -98,11 +124,27 @@
$book['author'] = htmlentities2($book['author']);
$book['onloan'] = ($book['onloan'] == 't') ? true : false;
- // Extract amazon data (maybe this should be stored in separate field in the db?)
- $simple_xml = simplexml_load_string($book['amazon_data']);
- //FIXME: figure out how to tell if there was usable amazon data after all
- //$book['description'] = $simple_xml->Items->Item->EditorialReviews->EditorialReview->Content;
+ if (!isset($book['description'])) {
+ // no book description in the database, try using Amazon data
+
+ // Extract amazon data (maybe this should be stored in separate fields in the db?)
+ $simple_xml = simplexml_load_string($book['amazon_data']);
+
+ $book['description'] = @$simple_xml->Items->Item->EditorialReviews->EditorialReview->Content;
+ if (isset($book['description'])) {
+ // tidy description markup
+ $tidy_config['doctype'] = 'omit';
+ $tidy_config['output-xhtml'] = true;
+ $tidy_config['show-body-only'] = true;
+ $tidy_config['logical-emphasis'] = true;
+ $book['description'] = tidy_repair_string($book['description'], $tidy_config);
+
+ // update db so we don't have to do this next time
+ $DB->Execute("UPDATE books SET description=? WHERE id=?", array($book['description'],$book['id']));
+ }
+ }
+
$smarty->assign("book", $book);
Copied: trunk/components/libraryadmin.php (from rev 656, branches/sucs-site/components/libraryadmin.php)
===================================================================
--- trunk/components/libraryadmin.php (rev 0)
+++ trunk/components/libraryadmin.php 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,79 @@
+<?php
+
+// you gotta be this high to enter
+$permission="librarian";
+//include ISBN validation library
+require_once('../lib/Validate/ISPN.php');
+
+$error = array();
+
+function fetch_isbndb_data($isbn) {
+
+ $url1 = "http://isbndb.com/api/books.xml?access_key=I6AH5WJI&index1=isbn&value1=";
+
+ return file_get_contents($url1.$isbn);
+}
+
+function valid_isbn($isbn) {
+
+ return Validate_ISPN::isbn($isbn);
+}
+
+if ($session->groups[$permission]) {
+
+ if ($_REQUEST['action'] == "search") {
+
+ $isbn = $_REQUEST['isbn'];
+ $isbn = str_replace(array('ISBN', '-', ' ', "\t", "\n"), '', $isbn);
+
+ if (valid_isbn($isbn)) {
+ $xmlresult = fetch_isbndb_data($isbn);
+ $simple_xml = simplexml_load_string($xmlresult);
+ $book['isbn'] = $isbn;
+ $book['title'] = $simple_xml->BookList->BookData->Title;
+ $book['author'] = $simple_xml->BookList->BookData->AuthorsText;
+ if (substr(trim($book['author']),-1)==',') {$book['author']=substr(trim($book['author']),0,-1);}
+ $book['publisher'] = $simple_xml->BookList->BookData->PublisherText;
+ $book['image_url'] = "";
+ $smarty->assign("book", $book);
+ } else {
+ // invalid isbn entered
+ trigger_error("invalid ISBN number entered", E_USER_WARNING);
+ }
+
+
+ } elseif ($_REQUEST['action'] == "add") {
+ $book = array();
+ $book['isbn'] = $_REQUEST['isbn'];
+ $book['title'] = $_REQUEST['title'];
+ $book['author'] = $_REQUEST['author'];
+ $book['publisher'] = $_REQUEST['publisher'];
+ $book['image_url'] = $_REQUEST['image_url'];
+
+ // Validate that we have enough info to add
+ if (($book['isbn'] != "") && (!valid_isbn($book['isbn']))) {
+ trigger_error("invalid ISBN", E_USER_WARNING);
+ } elseif (trim($book['title']) == "") {
+ trigger_error("you must supply a title", E_USER_WARNING);
+ } elseif (trim($book['author']) == "") {
+ trigger_error("you must supply an author");
+ } else {
+ $insertdata = array($book['title'], $book['author'], $book['publisher']);
+ if (valid_isbn($book['isbn'])) {
+ $book['amazon_data'] = fetch_isbndb_data($book['isbn']);
+ $newinsertdata = array($book['isbn'], $book['image_url'], $book['amazon_data']);
+ $insertdata = array_merge($insertdata, $newinsertdata);
+ $DB->Query("INSERT INTO books (title, author, publisher, isbn, image_url, amazon_data) VALUES (?,?,?,?,?,?)", $insertdata);
+ } else {
+ $DB->Query("INSERT INTO books (title, author, publisher) VALUES (?,?,?)", $insertdata);
+ }
+ }
+
+ }
+ $result = $smarty->fetch("library-addbook.tpl");
+}
+
+$smarty->assign("title", "Library Admin");
+$smarty->assign("body", $result);
+
+?>
Modified: trunk/components/members.php
===================================================================
--- trunk/components/members.php 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/components/members.php 2015-04-05 16:42:47 UTC (rev 657)
@@ -31,7 +31,7 @@
// Redirect if we have found a valid single user
if (count($usernames) == 1) {
$smarty->assign('who', $usernames[0]['uid']);
- // Add banana widget to the sidebar
+ // Add banana widget to the sidebar
$who = $usernames[0]['uid'];
include("../lib/banana-admin.php");
// Needs Redirection
@@ -53,57 +53,32 @@
if (file_exists( $usernames[0]['homedir'] . '/.plan')) {
$usernames[0]['plan'] = file_get_contents($usernames[0]['homedir'] . '/.plan');
}
- // Website
- if ( file_exists( $usernames[0]['homedir'] . '/public_html') &&
- !file_exists( $usernames[0]['homedir'] . '/public_html/robots.txt')) {
+ // Website
+ if ( file_exists( $usernames[0]['homedir'] . '/public_html')) {
$usernames[0]['website'] = true;
}
- // Blog
- require_once("/usr/share/adodb/adodb.inc.php");
- $BlogDB = NewADOConnection('postgres8');
- $BlogDB->Connect('dbname=blogs');
- $BlogDB->SetFetchMode(ADODB_FETCH_ASSOC);
- require_once('../lib/blog/validation.lib.php');
- if (blogger($usernames[0]['uid'])) {
- $usernames[0]['blog'] = $BlogDB->GetOne("select title from users where username='".$usernames[0]['uid']."'");
- }
// Bananas stuff
$bananasql = "SELECT *, date_trunc('second', whn) FROM awards ";
$bananasql .= "WHERE username ~* ? ORDER BY WHN DESC";
$awards = $DB->GetAll($bananasql, array("^".$usernames[0]['uid']."$"));
-
- // add academic year to each award, perform slightly nasty hack to add sum for academic year to last of the year
- $yearSum = 0;
- unset($acYear);
- unset($yearStart);
- foreach ($awards as $i => $award) {
- $awards[$i]['acYear'] = academicYear(strtotime($award['whn']));
- if ($acYear != $awards[$i]['acYear']) {
- if(isset($yearStart)) {
- $awards[$yearStart]['yearSum'] = $yearSum;
- $yearSum = 0;
- }
- $yearSum += $award['score'];
- $acYear = $awards[$i]['acYear'];
- $yearStart = $i;
- } else {
- $yearSum += $award['score'];
- }
+
+ // arrange by academic year, calculate sums as we go
+ foreach ($awards as $award) {
+ $acyear = academicYear(strtotime($award['whn']));
+ $awards_by_year[$acyear]['awards'][] = $award;
+ $awards_by_year[$acyear]['sum'] += $award['score'];
+ $bananasum += $award['score'];
}
- if(isset($yearStart)) $awards[$yearStart]['yearSum'] = $yearSum;
-
-
- $usernames[0]['awards'] = $awards;
- $bananasumsql = "select sum(score) as sum from awards where username ~* ?";
- $bananasum = $DB->GetAll($bananasumsql, array("^".$usernames[0]['uid']."$"));
- $usernames[0]['bananascore'] = $bananasum[0]['sum'];
+
+ $usernames[0]['awardsbyyear'] = &$awards_by_year;
+ $usernames[0]['bananascore'] = $bananasum;
}
}
$smarty->assign('results', $usernames);
-
+
} else {
// generate fun data to put on index page
-
+
// top 5
$stats['top'] = $DB->GetAll("SELECT username, sum(score) as sum FROM awards GROUP BY username ORDER BY sum DESC LIMIT 5");
@@ -154,7 +129,7 @@
$stats['recent'][$i]['real'] = FALSE;
}
}
-
+
$smarty->assign("stats", $stats);
$secondary = $smarty->get_template_vars("secondary");
$secondary .= $smarty->fetch("banana-leaders.tpl");
@@ -166,15 +141,14 @@
$usernames = $members->getMemberList();
foreach ($usernames as $user) {
- if ( file_exists( $user['homedir'] . '/public_html') &&
- !file_exists( $user['homedir'] . '/public_html/robots.txt')) {
+ if ( file_exists( $user['homedir'] . '/public_html')) {
$public_usernames[] = $user;
}
}
$smarty->assign("public_members", $public_usernames);
}
-
+
$smarty->assign('url', $component['path']);
$smarty->assign('extra_styles', "/css/members.css");
$result = $smarty->fetch('members.tpl');
Copied: trunk/components/membershiprenew.php (from rev 656, branches/sucs-site/components/membershiprenew.php)
===================================================================
--- trunk/components/membershiprenew.php (rev 0)
+++ trunk/components/membershiprenew.php 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,148 @@
+<?php
+include_once("../lib/date.php");
+// Config options
+$inform="treasurer at sucs.org";
+$permission="sucsstaff";
+// Enable and disable database updating
+$enable=TRUE;
+
+// Set next payment date
+$paydate = paidUntil(time());
+
+// Only staff can use this page
+if (isset($session->groups[$permission])) {
+ $smarty->assign("staff", TRUE);
+// $sucsDB->debug = true;
+
+ // handle updates
+ if(isset($_POST['uid']) && isset($_POST['lastupdate'])){
+ // Check data hasn't changed and that nothing is broked
+ $query = "SELECT * FROM members WHERE uid=? AND lastupdate=?";
+ $array = array($_POST['uid'], $_POST['lastupdate']);
+ $data = $sucsDB->GetAll($query,$array);
+
+ // If there is only one record then everything is fine
+ if(sizeof($data)==1){
+ // get info on currently logged in user
+ $user = posix_getpwnam($session->username);
+
+ // Update record
+ $record = $data[0];
+ $query = "UPDATE members";
+ $query .= " SET paid = ?, lastupdate = DEFAULT, lastedit = ?";
+ $query .= " WHERE uid = ?";
+ $array = array($paydate,$user['uid'],$_POST['uid']);
+ if($enable){
+ $sucsDB->query($query,$array);
+ }
+
+ // emailing contact (tresurer)
+ $message = "Account renewal notification\n\n";
+ $message .= "Account : ".$record['username']."\n";
+ $message .= "User Type : ".$record['type']."\n";
+ $message .= "Renewed by: ".$user['name']."\n\n";
+ $message .= "Regards\n eclipse's script";
+ mail($inform,"Account Renewal",$message);
+
+ // emailing user
+ $message = "Your Swansea University Computer Society (SUCS) membership has been renewed\n\n";
+ $message .= "Username: ".$record['username']."\n";
+ $message .= "If you do not know or have forgotten your password, please email admin at sucs.org to arrange for it to be changed.\n\n";
+ $message .= "Regards\n The SUCS admin";
+ $header = "From: admin at sucs.org\r\n";
+ $header .= "Reply-To: admin at sucs.org";
+ // Personal account
+ mail($record['email'],"SUCS account renewal",$message,$header);
+ // sucs account
+ mail($record['username']."@sucs.org","SUCS account renewal",$message,$header);
+
+ message_flash("Renewed account for: ".htmlentities($record['username']));
+ }
+ else{
+ trigger_error("Number of recored returned: ".sizeof($data).". Expected: 1.", E_USER_ERROR);
+ }
+ }
+
+ // if sort is specified in GET
+ if(isset($_GET["sort"])){
+ $sortoptions = array("username","sid","realname");
+ // and is a valid option
+ if(in_array($_GET["sort"],$sortoptions,TRUE)){
+ // use it
+ $sort=$_GET["sort"];
+ }
+ // else use username
+ else{
+ $sort='username';
+ }
+ $getsort=$sort;
+ }
+ //else use username
+ else{
+ $sort='username';
+ }
+
+
+ //Get members details
+ $query = "SELECT * FROM members, member_type";
+ $query .= " WHERE paid != ?";
+ $query .= " AND (type = 1 OR type = 2 OR type = 5)";
+ $query .= " AND type=member_type.id";
+ $query .= " ORDER BY paid,type,".$sort;
+ $array = array($paydate);
+ $data = $sucsDB->GetAll($query, $array);
+ $smarty->assign("members", $data);
+
+ // set refresh rate
+ $autorefresh=$_GET["autorefresh"];
+ // if autorefresh is not 'n'
+ if($autorefresh!="n"){
+ // and is a decimal value
+ if(ctype_digit($autorefresh)){
+ // use it
+ $refreshval=$autorefresh;
+ // set passthrough
+ $getrefresh=$refreshval;
+ }
+ else{
+ // If no valid value assigned, default to OFF
+ $refreshval="n";
+ }
+ $optrefresh=$refreshval;
+ $smarty->assign("refresh", $refreshval);
+ }
+ else{
+ // set passthrough
+ $getrefresh='n';
+ $optrefresh='n';
+ }
+
+ // compile passthrough url
+ // sort
+ if(isset($getsort)){
+ $getout="?sort=".$getsort;
+ }
+
+ // autorefresh
+ if(isset($getrefresh)){
+ if(isset($getout)){
+ $getout .= "&autorefresh=".$getrefresh;
+ }
+ else{
+ $getout = "?autorefresh=".$getrefresh;
+ }
+ }
+
+ // set smarty variables
+ $smarty->assign("self",$baseurl.$path.$getout);
+ $smarty->assign("optionrefresh",$optrefresh);
+ $smarty->assign("optionsort",$sort);
+ $smarty->assign("paydate",$paydate);
+
+}
+$side = $smarty->fetch('membershiprenew-options.tpl');
+$body = $smarty->fetch('membershiprenew.tpl');
+$smarty->assign('secondary',$side);
+$smarty->assign('title', "Renew Membership");
+$smarty->assign('body', $body);
+?>
Modified: trunk/components/menu.php
===================================================================
--- trunk/components/menu.php 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/components/menu.php 2015-04-05 16:42:47 UTC (rev 657)
@@ -7,7 +7,7 @@
function translate($word) {
global $language, $DB;
-
+
if ($language['code']!="en") {
$query=$DB->GetRow("select title, title".$language['db']." from menu where title='".$word."'");
if ($query['title'.$language['db']]!="") return $query['title'.$language['db']];
@@ -60,9 +60,25 @@
$menu = parseMenu($res);
// this needs to choose the actual current one
-$res = $DB->GetAll("select * from menu where parent=".getPageID($pagename)." order by menuorder");
-if (count($res)>0) {
- $submenu = parseMenu($res);
+// subpages/submenu items can have permissions attached to them as well!
+
+$query2 = "select * from menu where parent=";
+$query2 .= "'";
+$query2 .= getPageID($pagename);
+$query2 .= "'";
+$query2 .= " and (permission is NULL";
+
+if ($session->loggedin) $query2 .= " or permission='users'";
+
+foreach ($session->groups as $group => $value) {
+ $query2 .= " or permission='$group'";
+ }
+
+$query2 .= ") order by menuorder";
+
+$res2 = $DB->GetAll($query2);
+if (count($res2)>0) {
+ $submenu = parseMenu($res2);
$menu[translate($pagename)] = $submenu;
}
Modified: trunk/components/milliways.php
===================================================================
--- trunk/components/milliways.php 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/components/milliways.php 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,19 +1,259 @@
<?php
+function parseIdleTime($idletime) {
+ $idlearray = preg_split("/[hms]/",$idletime);
+ if (strstr($idletime,'h')) {
+ $hours = $idlearray[0];
+ $minutes = $idlearray[1];
+ $seconds = 0;
+ } elseif (strstr($idletime,'m')) {
+ $hours = 0;
+ $minutes = $idlearray[0];
+ $seconds = $idlearray[1];
+ } else {
+ $hours = 0;
+ $minutes = 0;
+ $seconds = $idlearray[0];
+ }
+
+ return (intval($hours * 3600)) + (intval($minutes) * 60) + intval($seconds);
+
+}
+
+function compare_idletime($a, $b) {
+ return strnatcmp($a['idleseconds'], $b['idleseconds']);
+}
+
+$mwpath = array_search("Milliways", $pathlist);
+
+$newpath = $baseurl;
+for($i=0;$i<=$mwpath;$i++) {
+ if ($i!=0) $newpath .= "/";
+ $newpath .= $pathlist[$i];
+}
+$smarty->assign("mwpath", $newpath);
+
+$cal = cal_info(CAL_JULIAN);
+
+if (strtolower($pathlist[$mwpath+1]) == "uri") {
+ $latest = FALSE;
+ $today = FALSE;
+ unset($search);
+ if (isset($pathlist[$mwpath+2])) {
+ if ($pathlist[$mwpath+2] == "search" && isset($pathlist[$mwpath+3])) {
+ $search = $pathlist[$mwpath+3];
+
+ } else {
+ $today = strtotime($pathlist[$mwpath+2]);
+ }
+ }
+ if ($today === FALSE && !isset($search)) {
+ $today = time();
+ $latest = TRUE;
+ }
+
+ $smarty->assign("extra_scripts", array(
+ '<meta name="ROBOTS" content="NOINDEX" />',
+ '<meta name="ROBOTS" content="NOFOLLOW" />'));
+
+ $mwdb = new PDO('sqlite:/var/lib/mw/mwuri.db');
+ $res = $mwdb->prepare("select distinct strftime('%Y',added) from mwuri");
+ $res->execute();
+ $yearlist = $res->fetchAll(PDO::FETCH_COLUMN,0);
+ $smarty->assign("yearlist",$yearlist);
+
+ $res= $mwdb->prepare("select distinct strftime('%m',added) from mwuri where strftime('%Y',added) = ?");
+ $res->execute(array(date("Y",$today)));
+ $mlist = $res->fetchAll(PDO::FETCH_COLUMN,0);
+ $monthlist = array();
+ foreach( $mlist as $m) {
+ $monthlist[$m] = $cal['abbrevmonths'][(int)$m];
+ }
+ $smarty->assign("monthlist",$monthlist);
+
+ $res= $mwdb->prepare("select distinct strftime('%d',added) from mwuri where strftime('%Y-%m',added) = ?");
+ $res->execute(array(date("Y-m",$today)));
+ $daylist = $res->fetchAll(PDO::FETCH_COLUMN,0);
+ $smarty->assign("daylist",$daylist);
+
+ if ($today === FALSE && isset($search)) {
+ // do a search
+ $res = $mwdb->prepare("select *, time(added,'localtime') as hour, date(added,'localtime') as day from mwuri where title like ? or url like ? order by added desc");
+ $term = "%".$search."%";
+ $res->execute(array($term,$term));
+ $data = $res->fetchAll(PDO::FETCH_ASSOC);
+ } else {
+ //standard date based lookup
+ $res = $mwdb->prepare("select *, time(added,'localtime') as hour, date(added,'localtime') as day from mwuri where date(added,'localtime')=? order by added desc");
+ $res->execute(array(date("Y-m-d",$today)));
+ $data = $res->fetchAll(PDO::FETCH_ASSOC);
+ if ($latest && count($data == 0)) {
+ $day = end($yearlist)."-".end($monthlist)."-".end($daylist);
+ $today = strtotime($day);
+ $res->execute(array(date("Y-m-d",$today)));
+ $data = $res->fetchAll(PDO::FETCH_ASSOC);
+ }
+ }
+ foreach($data as $k => $row)
+ {
+ if ($row['tags']) {
+ $json = json_decode($row['tags'], TRUE);
+ if (is_array($json))
+ $data[$k]['taglist'] = $json[0]['top_tags'];
+ }
+ }
+ $smarty->assign("urilist", $data);
+
+ $smarty->assign("thisyear", date("Y",$today));
+ $smarty->assign("thismonth", date("m",$today));
+ $smarty->assign("thisday", date("d",$today));
+
+ $output = $smarty->fetch($base."templates/milliways_uri.tpl");
+ $smarty->assign("title", "Milliways URI");
+ $smarty->assign("body", $output);
+ $smarty->assign("extra_styles", "/css/milliways.css");
+ $smarty->assign("refresh", 120);
+ return;
+}
+
+if (strtolower($pathlist[$mwpath+1]) == "status") {
+ $today = FALSE;
+ $wantuser = FALSE;
+ if (isset($pathlist[$mwpath+2])) {
+ if ($pathlist[$mwpath+2] == "user" && isset($pathlist[$mwpath+3]))
+ $wantuser = $pathlist[$mwpath+3];
+ else
+ $today = strtotime($pathlist[$mwpath+2]);
+ }
+ if ($today === FALSE)
+ $today = time();
+
+ $smarty->assign("extra_scripts", array(
+ '<meta name="ROBOTS" content="NOINDEX" />',
+ '<meta name="ROBOTS" content="NOFOLLOW" />'));
+
+ $mwdb = new PDO('sqlite:/var/lib/mw/mwuri.db');
+ if ($wantuser !== FALSE) {
+ $res = $mwdb->prepare("select *, time(added,'localtime') as hour, date(added,'localtime') as day from mwdoing where user=? order by added desc");
+ $res->execute(array($wantuser));
+ } else {
+ $res = $mwdb->prepare("select *, time(added,'localtime') as hour, date(added,'localtime') as day from mwdoing where strftime('%Y-%m',added,'localtime')=? order by added desc");
+ $res->execute(array(date("Y-m",$today)));
+ }
+ //$res = $mwdb->prepare("select *, time(added,'localtime') as hour, date(added,'localtime') as day from mwdoing where date(added,'localtime')=? order by added desc");
+ //$res->execute(array(date("Y-m-d",$today)));
+ $data = $res->fetchAll(PDO::FETCH_ASSOC);
+ $smarty->assign("statuslist", $data);
+
+ $res = $mwdb->prepare("select distinct strftime('%Y',added) from mwdoing");
+ $res->execute();
+ $yearlist = $res->fetchAll(PDO::FETCH_COLUMN,0);
+ $smarty->assign("yearlist",$yearlist);
+
+ $res= $mwdb->prepare("select distinct strftime('%m',added) from mwdoing where strftime('%Y',added) = ?");
+ $res->execute(array(date("Y",$today)));
+ $mlist = $res->fetchAll(PDO::FETCH_COLUMN,0);
+ $monthlist = array();
+ foreach( $mlist as $m) {
+ $monthlist[$m] = $cal['abbrevmonths'][(int)$m];
+ }
+ $smarty->assign("monthlist",$monthlist);
+
+ $res= $mwdb->prepare("select distinct strftime('%d',added) from mwdoing where strftime('%Y-%m',added) = ?");
+ $res->execute(array(date("Y-m",$today)));
+ $daylist = $res->fetchAll(PDO::FETCH_COLUMN,0);
+ $smarty->assign("daylist",$daylist);
+
+ $smarty->assign("thisyear", date("Y",$today));
+ $smarty->assign("thismonth", date("m",$today));
+ $smarty->assign("thisday", date("d",$today));
+
+ $output = $smarty->fetch($base."templates/milliways_status.tpl");
+ $smarty->assign("title", "Milliways Status");
+ $smarty->assign("body", $output);
+ $smarty->assign("extra_styles", "/css/milliways.css");
+ $smarty->assign("refresh", 120);
+ return;
+}
+
+if (strtolower($pathlist[$mwpath+1]) == "tag") {
+ $smarty->assign("extra_scripts", array(
+ '<meta name="ROBOTS" content="NOINDEX" />',
+ '<meta name="ROBOTS" content="NOFOLLOW" />'));
+
+ $mwdb = new PDO('sqlite:/var/lib/mw/mwuri.db');
+ if (isset($pathlist[$mwpath+2])) {
+ $res = $mwdb->prepare("select *, date(added) as day, substr(tag,2) as name from mwtag where tag=? order by added desc");
+ $res->execute(array('#'.$pathlist[$mwpath+2]));
+ $data = $res->fetchAll(PDO::FETCH_ASSOC);
+ $smarty->assign("taglist", $data);
+ $output = $smarty->fetch($base."templates/milliways_tag.tpl");
+ } else {
+ $res = $mwdb->prepare("select distinct tag, substr(tag,2) as name, count(tag) as count from mwtag group by tag order by count(tag) desc limit 20");
+ $res->execute();
+ $data = $res->fetchAll(PDO::FETCH_ASSOC);
+ $smarty->assign("toplist", $data);
+
+ $res = $mwdb->prepare("select distinct tag, substr(tag,2) as name, count(tag) as count, max(added) as dated, date(max(added)) as day from mwtag group by tag order by max(added) desc limit 20");
+ $res->execute();
+ $data = $res->fetchAll(PDO::FETCH_ASSOC);
+ $smarty->assign("latestlist", $data);
+
+ $output = $smarty->fetch($base."templates/milliways_taglist.tpl");
+ }
+
+ $smarty->assign("title", "Milliways Tags");
+ $smarty->assign("body", $output);
+ $smarty->assign("extra_styles", "/css/milliways.css");
+ $smarty->assign("refresh", 120);
+ return;
+}
+
exec("/usr/bin/mw -who", $wholist, $ret);
$people = array();
+$idlers = array();
foreach ($wholist as $person) {
$pid = strtok($person, " ");
if ($pid == "" || $pid == "Name" || substr($pid,0,5)=="-----") continue;
- $people[] = array(
+ $person = array(
"username" => trim(substr($person, 1, 16)),
"idle" => trim(substr($person, 18, 6)),
+ "idleseconds" => parseIdleTime(trim(substr($person, 18, 6))),
"what" => substr($person,25));
+
+ if ($person['idleseconds'] > 10800) {
+ $idlers[] = $person;
+ } else {
+ $people[] = $person;
+ }
}
+usort($people, 'compare_idletime');
+usort($idlers, 'compare_idletime');
+
+$output .= print_r($pathlist, true);
+
+// summary lists
+$mwdb = new PDO('sqlite:/var/lib/mw/mwuri.db');
+$res = $mwdb->prepare("select *, time(added,'localtime') as hour, date(added,'localtime') as day from mwuri order by added desc limit 5");
+$res->execute();
+$urilist = $res->fetchAll(PDO::FETCH_ASSOC);
+foreach ($urilist as $k=>$v) {
+ if ($v['title'] == "") $urilist[$k]['title']=$v['url'];
+ $urilist[$k]['title']=filter_var(trim($urilist[$k]['title']),FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_HIGH | FILTER_FLAG_STRIP_LOW);
+}
+$smarty->assign("urilist", $urilist);
+
+$res = $mwdb->prepare("select distinct tag, substr(tag,2) as name, count(tag) as count, max(added) as dated, date(max(added)) as day from mwtag group by tag order by max(added) desc limit 5");
+$res->execute();
+$taglist = $res->fetchAll(PDO::FETCH_ASSOC);
+$smarty->assign("taglist", $taglist);
+
$smarty->assign("people",$people);
-$output = $smarty->fetch(SUCS_BASEDIR."templates/milliways.tpl");
+$smarty->assign("idlers",$idlers);
+$output = $smarty->fetch($base."templates/milliways.tpl");
$smarty->assign("title", "Milliways");
-$smarty->assign("body", $output);
+$smarty->assign("body", file_get_contents($base."static/fragments/Milliways.txt"));
+$smarty->assign("secondary", $output);
$smarty->assign("refresh", 120);
?>
Modified: trunk/components/motd.php
===================================================================
--- trunk/components/motd.php 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/components/motd.php 2015-04-05 16:42:47 UTC (rev 657)
@@ -10,17 +10,34 @@
$trans_tbl = array_flip($trans_tbl);
$text = strtr($text, $trans_tbl);
}
+ $text = preg_replace('~&ndash\;~i', '-', $text);
$text = preg_replace('~&#x([0-9a-f]+);~ei', 'chr(hexdec("\\1"))', $text);
$text = preg_replace('~&#([0-9]+);~e', 'chr("\\1")', $text);
return $text;
}
+//function to count and collect hyperlinks
+$links_count = 0;
+function linkcounter($uri) {
+ global $links_count, $uris;
+ $uris[++$links_count] = $uri;
+ return $links_count;
+}
+
+$poemmode = 0;
+
$news = $DB->GetAll("SELECT * FROM news WHERE sticky=true AND expiry > now() ORDER BY date DESC");
+
if (count($news)<3) {
$news = $DB->GetAll("(SELECT * FROM news WHERE sticky=false AND expiry > now() ORDER by date DESC LIMIT ".(3-count($news)).") UNION SELECT * FROM news WHERE sticky=true AND expiry > now() ORDER BY date DESC");
}
+if (count($news)<1) {
+ $news = $DB->GetAll("SELECT * FROM poems ORDER BY RANDOM() LIMIT 1");
+ $poemmode = 1;
+}
+
$motd = "----------------------------- MESSAGE OF THE DAY ------------------------------\n\n";
for ($i=count($news)-1;$i>-1;$i--) {
$nitem = str_replace("\n", "", $news[$i]);
@@ -31,14 +48,36 @@
$body = str_replace("<li>", " * ", $body);
$body = str_replace("</li>", "\n ", $body);
$body = str_replace(" ", " ", $body);
+$body = str_replace("…", "...", $body);
+$body = str_replace("'", "'", $body);
+// remove hyperlinks, collect to display later
+$body = preg_replace(":<a href=['\"](.+?)['\"].*?>(.*?)</a>:e", "'\\2['.linkcounter('\\1').']'", $body);
$body = strip_tags($body);
$body = decode_entities($body);
$body = wordwrap($body, 75, "\n ", 1);
$body = rtrim($body);
$motd .=" ".$body."\n";
-$motd .= str_pad($nitem['author'], 78, " ", STR_PAD_LEFT)."\n\n";
+if (isset($uris)) {
+ $footer = "----\n";
+ foreach ($uris as $urinum => $uri) {
+ $footer .= " [$urinum]: $uri\n";
+ //remove uri from list so it won't show up on the next post
+ unset($uris[$urinum]);
+ }
+ $motd .= " ".$footer;
}
+$motd .= str_pad($nitem['author'], 78, " ", STR_PAD_LEFT)."\n";
+
+if ($poemmode == 1 && $nitem['submitter'] != '') {
+ $motd .= str_pad("Submitted by ".$nitem['submitter'], 78, " ", STR_PAD_LEFT)."\n";
+}
+$motd .= "\n";
+}
$motd .= "---------------------------- [ http://sucs.org/ ] -----------------------------\n";
-file_put_contents($motd_file, $motd);
+//if (time()-filemtime($motd_file) < 86000 && $poemmode == 1) { //86000 to allow a little slack depending on when cron runs
+ // print "MOTD too recent to replace with a poem!\n";
+//} else {
+ file_put_contents($motd_file, $motd);
+//}
?>
Copied: trunk/components/motd_wrapper.php (from rev 656, branches/sucs-site/components/motd_wrapper.php)
===================================================================
--- trunk/components/motd_wrapper.php (rev 0)
+++ trunk/components/motd_wrapper.php 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,14 @@
+<?PHP
+require("/var/www/sucssite/htdocs/settings.php");
+
+require("/usr/share/php/adodb/adodb.inc.php");
+
+$dbname = 'sucssite';
+$dbuser = 'apache';
+
+$DB = NewADOConnection('postgres8');
+$DB->Connect('dbname='.$dbname.' user='.$dbuser);
+$DB->SetCharSet('utf8');
+$DB->SetFetchMode(ADODB_FETCH_ASSOC);
+
+include($base."components/motd.php");
Modified: trunk/components/mw.php
===================================================================
--- trunk/components/mw.php 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/components/mw.php 2015-04-05 16:42:47 UTC (rev 657)
@@ -4,7 +4,7 @@
function load_folders()
{
- $f = fopen("/usr/lib64/mw/folders.bb", "r");
+ $f = fopen("/var/lib/mw/folders.bb", "r");
$folders = array();
while (!feof($f) && $fol=fread($f,64)) {
@@ -35,8 +35,8 @@
function load_index($folname, $getbody=FALSE)
{
$index = array();
- $f = @fopen("/usr/lib64/mw/$folname.i", "r");
- $body = @fopen("/usr/lib64/mw/$folname.t", "r");
+ $f = @fopen("/var/lib/mw/$folname.i", "r");
+ $body = @fopen("/var/lib/mw/$folname.t", "r");
if ($f === FALSE || $body === FALSE) return array();
@@ -94,9 +94,9 @@
$subject = strip_tags($_POST['subject']);
$body = strip_tags( $_POST['body']);
- $to = ereg_replace('[^[:alnum:][:punct:][:space:]]*','',trim($to));
- $subject = ereg_replace('[^[:alnum:][:punct:][:space:]]*','',trim($subject));
- $body = ereg_replace("\n\\.\n","\n .\n",$body);
+ $to = preg_replace('/[^[:alnum:][:punct:][:space:]]*/','',trim($to));
+ $subject = preg_replace('/[^[:alnum:][:punct:][:space:]]*/','',trim($subject));
+ $body = preg_replace("/\n\\.\n","\n .\n/",$body);
$deb = fopen("/tmp/mwdebug.txt","w");
fwrite($deb, "folder: '$folder'\n");
Modified: trunk/components/news.php
===================================================================
--- trunk/components/news.php 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/components/news.php 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,7 +1,9 @@
<?php
+// Ensure we have a trailing slash so that relative links within the page work
+if ($_SERVER['PATH_INFO']=="/News") header("Location: ".$baseurl."/News/");
// A user must be in the staff group in order to edit content in this component
-$permission = "html";
+$permission = "sucsstaff";
$newstable = "news";
if (isset($session->groups[$permission])) {
@@ -15,17 +17,16 @@
$record['sticky'] = 't';
else
$record['sticky'] = 'f';
-
+
if ($_REQUEST['id']=="*") {
$record['author'] = $session->username;
$record['date'] = "now";
- $record['shorttitle'] = $_REQUEST['edittitle'];
$DB->AutoExecute($newstable, $record, 'INSERT');
} else {
$DB->AutoExecute($newstable, $record, 'UPDATE', "id=".$DB->qstr($_REQUEST['id']));
}
include("motd.php");
-
+
break;
case "Delete":
$deleted = $DB->Execute("DELETE FROM $newstable WHERE id=?", array($_REQUEST['id']));
@@ -42,8 +43,7 @@
if (@$pathlist[2]!="") $query .= " WHERE title=".$DB->qstr($pathlist[2]);
$query .= " ORDER BY date DESC";
-$newsarray = $DB->GetArray($query);
-if (!empty($newsarray)) $smarty->assign("news", $newsarray);
+$smarty->assign("news", $DB->GetArray($query));
$output = $smarty->fetch("news.tpl");
$smarty->assign("title", "News");
@@ -55,15 +55,15 @@
$news = array(array("id" => "*"));
$smarty->assign("news", $news);
case "edit":
+ $output = $smarty->fetch("news_edit.tpl");
$smarty->assign("action", "edit");
$smarty->assign("title", "Edit News");
- $output = $smarty->fetch("news_edit.tpl");
break;
case "delete-query":
- $output = $smarty->fetch('news_delete.tpl').$output;
+ $output = $smarty->fetch('news_delete.tpl').$output;
break;
case "expire-query":
- $output = $smarty->fetch('news_expire.tpl').$output;
+ $output = $smarty->fetch('news_expire.tpl').$output;
break;
case "Delete":
if ($deleted) $output = "News item deleted";
Modified: trunk/components/options.php
===================================================================
--- trunk/components/options.php 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/components/options.php 2015-04-05 16:42:47 UTC (rev 657)
@@ -2,6 +2,7 @@
// e-mail, password validation functions
require_once("../lib/validation.php");
+require_once("Net/MAC.php");
include_once("../lib/date.php");
@@ -9,7 +10,6 @@
// These could possibly be moved somewhere saner?
define('GUESTNET_LOW','137.44.10.130'); // These could possibly be a set of ranges or a subnet which might be saner?
define('GUESTNET_HIGH','137.44.10.134'); // These could possibly be a set of ranges or a subnet which might be saner?
-$sucsdbname = 'sucs'; // This was stored in config, I just don't have it here in the test
// Helper Functions
// Could these be moved to some kind of library?
@@ -26,12 +26,7 @@
trigger_error("New passwords do not match", E_USER_WARNING);
return FALSE;
}
-/*
- if (!strongPassword($newpass1)) {
- trigger_error("New password is too weak.", E_USER_WARNING);
- return FALSE;
- }
-*/
+
$reason = weakPassword($newpass1);
if ($reason !== FALSE) {
trigger_error("New password is weak: $reason", E_USER_WARNING);
@@ -42,7 +37,7 @@
trigger_error("LDAP connect failed", E_USER_ERROR);
return FALSE;
}
-
+
if (!($ldapbind = ldap_bind($ldap, "uid=".$session->username.",ou=People,dc=sucs,dc=org",$oldpass))) {
trigger_error("Existing password incorrect", E_USER_WARNING);
ldap_close($ldap);
@@ -62,14 +57,14 @@
global $sucsDB, $session, $error;
// Do some kind of checking here
// Check valid email (do we have a function for this?
- if (!validEmail($externalEmail))
+ if (!validEmail($externalEmail))
return FALSE; // Valid Email handles errors itself
// Check valid phone number (do we have a function for this?)
if (empty($phone) || (strlen($phone) < 6)) {
trigger_error("You must have a contact phone number!", E_USER_WARNING);
return FALSE;
}
- // Update
+ // Update
if ($sucsDB->Execute('UPDATE members SET address = ?,phone = ?, email = ?, lastupdate = now(), lastedit = uid WHERE username = ?',
array($address, $phone, $externalEmail, $session->username)) === FALSE) {
trigger_error("There was an error updating your contact details. Please contact admin.", E_USER_ERROR);
@@ -80,7 +75,7 @@
function changeGuestnetDetails($wiredMAC) {
global $sucsDB, $session, $error;
- // Get UID as we don't have it yet
+ // Get UID as we don't have it yet
if(($uid = $sucsDB->GetOne("SELECt uid FROM members WHERE username = ?", array($session->username))) === FALSE) {
trigger_error("There was an error updating your GuestNET MAC Address. Please contact admin. (UID)", E_USER_ERROR);
return FALSE;
@@ -91,7 +86,7 @@
return FALSE;
}
exec('/usr/local/bin/update-dhcpd', $placeholder, $returnVar);
-
+
if ($returnVar == 0) {
return TRUE;
// $message[] = 'GuestNet MAC Address updated. Please wait a minute or two for the changes to take effect.';
@@ -103,8 +98,11 @@
// Checks whether the given string mac address is valid
function isValidMACAddr($mac) {
- // Put code here if needed
- return TRUE;
+ if (Net_MAC::check($mac)) {
+ return TRUE;
+ }else{
+ return FALSE;
+ }
}
// Returns the users GuestNet MAC Address if they have one and false otherwise
@@ -113,7 +111,7 @@
// Sanity Check ip?
// Check we are in the correct ip range (unregistered GuestNET addresses)
if (ip2long($ip) && (ip2long($ip) >= ip2long(GUESTNET_LOW)) && (ip2long($ip) <= ip2long(GUESTNET_HIGH))) {
-
+
exec("sudo /usr/local/sbin/gw-copy-arp.sh", $placeholder, $returnVar);
if ($returnVar == 0) {
$arpLines = file('/tmp/gwarp');
@@ -159,8 +157,14 @@
// Takes an entry from $_FILES and makes this the new hackergotchi
function updateHackergotchi($fileDetails) {
global $session;
- if ( ((list($width, $height, $type, $attr) = @getimagesize($fileDetails['tmp_name'])) !== false) &&
- ($type == IMAGETYPE_PNG) && ($width <= 128) && ($height <= 128)) {
+ if ( ((list($width, $height, $type, $attr) = @getimagesize($fileDetails['tmp_name'])) !== false)) {
+ if ($type != IMAGETYPE_PNG) {
+ trigger_error("Uploaded hackergotchi is not in PNG format. Please convert your image to PNG and try again.", E_USER_ERROR);
+ return FALSE;
+ } else if (($width > 128) || ($height > 128)) {
+ trigger_error("Uploaded hackergotchi is too large. Hackergotchis must be 128x128 pixels or smaller.", E_USER_ERROR);
+ return FALSE;
+ }
$imagefilepath = hackergotchiPath($session->username);
@@ -211,10 +215,8 @@
if ($session->loggedin === TRUE) {
- $sucsDB = NewADOConnection('postgres8');
- $sucsDB->Connect('dbname='.$sucsdbname);
- $sucsDB->SetFetchMode(ADODB_FETCH_ASSOC);
-
+// $sucsDB->debug = true;
+
$newGuestNetMAC = getGuestNetMAC();
// Handle Postbacks
@@ -241,7 +243,7 @@
case 'updatehackergotchi' :
if (updateHackergotchi($_FILES['hackergotchi'])) {
message_flash('Hackergotchi Updated');
- }
+ }
break;
case 'clearhackergotchi' :
if (clearHackergotchi()) {
@@ -265,7 +267,6 @@
$member = $sucsDB->GetRow("select * from members left join member_type on members.type=member_type.id where username='".$session->username."'");
- $smarty->assign('member', $member);
$smarty->assign('paydate', $paydate);
if(($currentGuestNetMAC = $sucsDB->GetOne('SELECT * FROM guestnet WHERE uid=?', array((int)$member['uid']))) !== FALSE) {
@@ -278,6 +279,7 @@
$smarty->assign('newGuestNetMAC', $newGuestNetMAC);
}
+$smarty->assign('member', $member);
}
Modified: trunk/components/pagemap.php
===================================================================
--- trunk/components/pagemap.php 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/components/pagemap.php 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,8 +1,15 @@
<?php
-unset($output);
+$permission="html";
-if (@$pathlist[3] == "Edit") {
+// Only html group members can use this page - horrible emergency bodge
+if (isset($session->groups[$permission])) {
+ $smarty->assign("html", TRUE);
+
+
+ unset($output);
+
+ if (@$pathlist[3] == "Edit") {
if (isset($_REQUEST['mapid'])) {
$id = (int)$_REQUEST['mapid'];
@@ -18,8 +25,10 @@
header("Location: /Admin/Pagemap");
exit;
}
-}
+ }
+}
+
if (!isset($output)) {
$smarty->assign("map",$DB->GetAll("SELECT * FROM pagemap ORDER BY depth, path"));
$output = $smarty->fetch(SUCS_BASEDIR."templates/pagemap.tpl");
Modified: trunk/components/pastebin.php
===================================================================
--- trunk/components/pastebin.php 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/components/pastebin.php 2015-04-05 16:42:47 UTC (rev 657)
@@ -29,7 +29,7 @@
// Debugging
-error_reporting(E_ALL);
+//error_reporting(E_ALL);
// Config
define('_LIST_LIMIT', 15);
@@ -39,7 +39,8 @@
define('_TABLE_NAME', 'pastebin');
$smarty->assign('urifragment', '/Tools/PasteBin/');
-$smarty->assign('uri', 'http://'.$_SERVER['SERVER_NAME'].'/pb/');
+$pburi = 'https://'.$_SERVER['SERVER_NAME'].$baseurl;
+$smarty->assign('uri', $pburi.'/pb/');
// Init
$id = '';
@@ -69,7 +70,8 @@
require_once 'Text/Highlighter/Renderer/Html.php';
require_once '../lib/ArrayRenderer.php';
-PEAR::setErrorHandling(PEAR_ERROR_TRIGGER, E_USER_WARNING);
+//yay php5.4
+(new PEAR)->setErrorHandling(PEAR_ERROR_TRIGGER, E_USER_WARNING);
// Grabbed from blog.lib.php
// Returns a textual diff between two time stamps
@@ -116,7 +118,6 @@
'JAVASCRIPT' => 'Javascript',
'MYSQL' => 'MySQL',
'PERL' => 'Perl',
- 'PHP' => 'PHP',
'PYTHON' => 'Python',
'RUBY' => 'Ruby',
'SQL' => 'SQL',
@@ -163,12 +164,16 @@
} else {
// Additional user validation needed here
//$retainTil = date('Y/m/d H:i:s', time() + $retain);
+ $id = $DB->GetOne("SELECT nextval('pastebin_id_seq'::regclass)");
$DB->Execute(
- 'INSERT INTO ' . _TABLE_NAME . ' ( code, username, retain_til, language) ' .
- 'VALUES (?, ?, ?, ?)',
- array( $code, $session->username, $retainTil, $pblang));
- //$id = $DB->Insert_ID();
- $id = $DB->GetOne('SELECT id FROM ' . _TABLE_NAME . ' WHERE code = ? AND username = ? AND retain_til = ?', array($code,$session->username,$retainTil));
+ 'INSERT INTO ' . _TABLE_NAME . ' ( id, code, username, retain_til, language) ' .
+ 'VALUES (?, ?, ?, ?, ?)',
+ array( $id, $code, $session->username, $retainTil, $pblang));
+
+ //bump user to uri of newly pasted item
+ header('Status: 303 See Other');
+ header("Location: $pburi/Tools/PasteBin/$id");
+
$userInfo = 'Created By ' . $session->username . ' at ' . date('Y/m/d H:i');
$smarty->assign('id', $id);
$smarty->assign('userInfo', $userInfo);
@@ -212,14 +217,17 @@
// an else
if (!empty($code)) {
// Highlight the code
- $renderer = new Text_Highlighter_Renderer_Array();
- $hl = &Text_Highlighter::factory($pblang);
+ if ($pblang == 'NONE') {
+ $pblang = 'HTML';
+ }
+ $renderer = new Text_Highlighter_Renderer_Array_dez();
+ $tmpobj = new Text_Highlighter;
+ $hl =& $tmpobj->factory($pblang);
$hl->setRenderer($renderer);
// Have to decode again here for the highlighting
// It might be a little better if we kept the unencoded version from above
$highlightedCode = $hl->highlight(html_entity_decode($code, ENT_QUOTES,'UTF-8'));
$smarty->assign('highlightedCode', $highlightedCode);
-
}
}
// Sort Out Languages
Deleted: trunk/components/planet.php
===================================================================
--- trunk/components/planet.php 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/components/planet.php 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,10 +0,0 @@
-<?php
-
-$smarty->assign("title", "Planet SUCS");
-$smarty->assign("rss_url", "http://planet.sucs.org/rss20.xml");
-$smarty->assign("atom_url", "http://planet.sucs.org/atom.xml");
-// Read planet output from where (we hope) Planet wrote it
-$body = file_get_contents(SUCS_BASEDIR."static/Community/Planet.txt");
-$smarty->assign("body", $body);
-
-?>
Deleted: trunk/components/planetposts.php
===================================================================
--- trunk/components/planetposts.php 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/components/planetposts.php 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,27 +0,0 @@
-<?php
-
-// number of recent planet entries we want to return
-$num_entries = 5;
-
-unset($result);
-$planetposts = array();
-
-$xmldata = file_get_contents("../htdocs/planet/atom.xml");
-$simplexml = simplexml_load_string($xmldata);
-$xml = $simplexml->children('http://www.w3.org/2005/Atom');
-
-foreach ($xml->entry as $entry) {
- $planetposts[] = array(
- "post" => $entry->title,
- "post_uri" => $entry->link->attributes()->href,
- "user" => $entry->author->name,
- "user_uri" => $entry->author->uri
- );
-}
-
-$planetposts = array_slice($planetposts, 0, $num_entries);
-
-$smarty->assign('planetposts', $planetposts);
-$result = $smarty->fetch('planetposts.tpl');
-
-?>
Copied: trunk/components/printer.graph.php (from rev 656, branches/sucs-site/components/printer.graph.php)
===================================================================
--- trunk/components/printer.graph.php (rev 0)
+++ trunk/components/printer.graph.php 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,28 @@
+<?
+
+$res = $sucsDB->Execute("select username, sum(pages) as pages from printer where username != 'old' group by username order by sum(pages) desc");
+$num = $res->RecordCount();
+ for ($i=0;$i<$num;$i++) {
+ $row[$i] = $res->FetchRow();
+ if ($i < 12)
+ {
+ $item[]=$row[$i]['username'];
+ $slice[]=$row[$i]['pages'];
+ }
+ else {
+ $otherSize += $row[$i]['pages'];
+ }
+ }
+// $itemName[]="Other";
+// $sliceSize[]=$otherSize;
+
+ $slice = array_merge(array($otherSize),$slice);
+ $item = array_merge(array("Other"), $item);
+
+/* echo "<pre>";
+ print_r($slice);
+ print_r($item);*/
+
+ include("../../lib/pieChart.php");
+ piechart("Top 12, Users of Printing", $slice, $item,0)
+?>
\ No newline at end of file
Copied: trunk/components/printer.php (from rev 656, branches/sucs-site/components/printer.php)
===================================================================
--- trunk/components/printer.php (rev 0)
+++ trunk/components/printer.php 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,152 @@
+<?PHP
+/******
+ * Printer Shame List
+ * Ported from old site by tswsl1989
+ *
+ */
+$max=10; //Set this to number of users to display in chart
+
+$timestamp = '2014-02-05 18:29:02+00'; //display printer stats since this time
+
+$smarty->assign('title',"Printer Statistics");
+
+// $out="<img src=\"/images/printer.graph.php\" alt=\"pie chart of top 12 printer users\"/>";
+$table="<table border=1 cellpadding=3>\n<tr>\n<th>Username</th>\n<th>Pages</th>\n<th>Projected Monthly Usage</th>\n<th>Printed This Month</th>\n<th>What it would cost in the library</th></tr>\n";
+
+//pull in all the current users (ie not old) who have printed stuff
+$res = $sucsDB->Execute("select username, sum(pages) as pages from printer where username != 'old' AND start > '".$timestamp."' group by username order by sum(pages) desc");
+$num = $res->RecordCount();
+//for each row stuff the infomation into an array, then free up the database resorces
+for ($i=0;$i<$num;$i++) {
+ $data[$i] = $res->FetchRow();
+ $data[$i]['month'] = 0;
+}
+$res->Close();
+
+//get the second since epoch
+$thisSecond = time();
+//for each user who has printed stuff add the first printed time (since epoch) to the array
+for ($i=0;$i<$num;$i++) {
+ $res = $sucsDB->Execute("select date_part('epoch',start) as first from printer where username ='".$data[$i]['username']."' order by start asc limit 1;");
+ $temp = $res->FetchRow();
+ $data[$i]['first'] = $temp['first'];
+ $res->Close();
+}
+
+$res = $sucsDB->Execute("select username, pages, start from printer where username != 'old'");
+$datesnum = $res->RecordCount();//for each row stuff the infomation into an array, then free up the database resorces
+for ($i=0;$i<$datesnum;$i++) {
+ $dates[$i] = $res->FetchRow($res, $i);
+}
+$res->Close();
+
+
+// get the current month
+$theMonth = date("m");
+$theYear = date("Y");
+for ($i=0;$i<$datesnum;$i++) {
+ $userMonth = substr($dates[$i]['start'], 5, 2);
+ $userYear = substr($dates[$i]['start'], 0, 4);
+ if (($userMonth == $theMonth) && ($userYear == $theYear)) {
+ for ($j=0;$j<$num;$j++) {
+ if ($data[$j]['username'] == $dates[$i]['username']) {
+ $data[$j]['month'] += $dates[$i]['pages'];
+ }
+ }
+ }
+}
+
+//start the total counter
+$total = 0;
+//for each user.. print a row in the table
+for ($i=0;$i<$num;$i++) {
+ $table.="<tr align=\"center\">\n";
+ $table.="<td>{$data[$i]['username']}</td>\n";
+ $table.="<td>{$data[$i]['pages']}</td>\n";
+ //avg pages per month = seconds in a month / (now - first print) * pages
+ $crazyGuess = round((2629743.83/($thisSecond-$data[$i]['first']))*$data[$i]['pages']);
+ //if the user has only started printing in the last month its not sensible to give a guess of average useage
+ if ($thisSecond-$data[$i]['first'] <= 2629743.83) {
+ $table.="<td>Not enough data</td>\n";
+ }
+ //traffic lights for pinter useage, adjust values as required
+ elseif($crazyGuess <= 25) {
+ $table.="<td BGCOLOR=\"Green\">".$crazyGuess."</td>\n";
+ }
+ elseif($crazyGuess <= 33) {
+ $table.="<td BGCOLOR=\"Orange\">".$crazyGuess."</td>\n";
+ }
+ else{
+ $table.="<td BGCOLOR=\"Red\">".$crazyGuess."</td>\n";
+ }
+ if ($data[$i]['month'] >= 300) {
+ $table.="<td BGCOLOR=\"Red\">{$data[$i]['month']}</td>\n";
+ } else {
+ $table.="<td>{$data[$i]['month']}</td>\n";
+ }
+ $table.="<td>".sprintf("£ %01.2f",round(0.05*$data[$i]['pages'],2))."</td>\n";
+ //add this users useage to the total
+ $total += $data[$i]['pages'];
+ $table.="</tr>\n";
+}
+
+//get the first print date
+$date['first'] = getdate("1391624942");
+
+//get the last print date
+$res = $sucsDB->Execute("select date_part('epoch',start) as last from printer order by start desc limit 1;");
+$temp = $res->FetchRow();
+$date['last'] = getdate($temp['last']);
+$res->Close();
+//get the number of pages printed by "old" users and add it to the total
+$res = $sucsDB->Execute("select sum(pages) as pages from printer where username = 'old' group by username order by sum(pages) desc");
+$old = $res->FetchRow();
+$old = $old[0];
+$res->Close();
+$total += $old;
+//Output two lines at the bottem of the table, one for "old" users and the other for the total
+$table.="<tr align=\"center\">\n\t<th>Old Users</th>\n\t<th>$old</th>\n\t<th>n/a</th>\n</tr>";
+$table.="<tr align=\"center\">\n\t<th>Total</th>\n\t<th>$total</th>\n\t<th>".round((2629743.83/($thisSecond-$date['first'][0]))*$total)."</th>\n</tr>";
+$table.="</table>\n";
+
+//output the dates of the first and last prints recorded
+$out.="<script type=\"text/javascript\" src=\"https://www.google.com/jsapi\"></script>
+ <script type=\"text/javascript\">
+ google.load(\"visualization\", \"1\", {packages:[\"corechart\"]});
+ google.setOnLoadCallback(drawChart);
+ function drawChart() {
+ var data = new google.visualization.DataTable();
+ data.addColumn('string', 'User');
+ data.addColumn('number', 'Pages Printed');
+ data.addRows(".($max+2).");\n";
+for( $i=0; $i<($max+1); $i++ ){
+ $out.="data.setValue(".($i).", 0, '".$data[$i]['username']."');\n";
+ $out.="data.setValue(".($i).", 1,".$data[$i]['pages'].");\n";
+}
+$others=0;
+for ( $i=$max; $i<count($data); $i++ ) {
+ $others+=$data[$i]['pages'];
+}
+$out.="data.setValue(".($max+1).", 0, 'Others');\ndata.setValue(".($max+1).",1, $others);\n";
+$out.="\t\tvar chart = new google.visualization.PieChart(document.getElementById('chart_div'));
+ chart.draw(data, {width: 500, height: 360, backgroundColor: 'none', is3D: true, title: 'Printer Usage'});
+ }
+ </script>";
+$out.="<div id=\"chart_div\" style=\"background: none;\"></div>";
+$out.="<p>First Data - ".$date['first'][weekday].", ".$date['first'][mday]." ".$date['first'][month]." ".$date['first'][year].", at ".sprintf("%02d:%02d:%02d",$date['first'][hours],$date['first'][minutes],$date['first'][seconds])."<br />";
+$out.="Last Data - ".$date['last'][weekday].", ".$date['last'][mday]." ".$date['last'][month]." ".$date['last'][year].", at ".sprintf("%02d:%02d:%02d",$date['last'][hours],$date['last'][minutes],$date['last'][seconds])."</p>";
+//do some silly maths to work out lots of silly things
+$paperarea = round(0.21*0.297*$total,3); //area of paper
+$paperweight = round($paperarea*.08, 3); //how much that would weigh
+$numtrees = round($paperweight/730.296, 6); //*very* roughly how many trees that would be
+$cost = sprintf("£%01.2f",round(0.05*$total,2));
+$out.="<p>That's ".$paperarea."m<sup>2</sup> of paper, weighing ".$paperweight."kg!<br>\n";
+$out.="This is equivalent to approximately ".$numtrees." trees.<br>\n";
+$out.="That would have cost our members a grand total of ".$cost." if it were printed in the library.. not bad for £5 each!";
+
+//done
+$out.="<p>Note: The number of pages is the number spooled and may be more than the actual number printed</p>";
+$out.=$table;
+$sucsDB->Close();
+$smarty->assign('body',$out);
+?>
Modified: trunk/components/projects.php
===================================================================
--- trunk/components/projects.php 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/components/projects.php 2015-04-05 16:42:47 UTC (rev 657)
@@ -8,28 +8,33 @@
$object=array();
$object['filename'] = $file;
$ini_array = array();
- $ini_data = file("/var/projects/trac/".$file."/conf/trac.ini");
+ $filepath = "/var/projects/trac/".$file."/conf/trac.ini";
+
+ // read trac.ini for this project
+ if (is_readable($filepath) && ($ini_data = file($filepath)) != FALSE) {
- $projectsection = FALSE;
- foreach ($ini_data as $ini_line) {
- if (trim($ini_line) == "[project]") {
- $projectsection = TRUE;
- } else if ($projectsection && (1 == preg_match("/^\[.*\]$/", trim($ini_line)))) {
- $projectsection = FALSE;
- } else if ($projectsection) {
- list($key, $value) = split("=", $ini_line);
- $ini_array[trim($key)] = trim($value);
+ $projectsection = FALSE;
+ foreach ($ini_data as $ini_line) {
+ if (trim($ini_line) == "[project]") {
+ $projectsection = TRUE;
+ } else if ($projectsection && (1 == preg_match("/^\[.*\]$/", trim($ini_line)))) {
+ $projectsection = FALSE;
+ } else if ($projectsection) {
+ list($key, $value) = preg_split("/=/", $ini_line);
+ $ini_array[trim($key)] = trim($value);
+ }
}
- }
- if (isset($ini_array['public']) && ($ini_array['public'] == "true")) {
+ // only list projects whose trac.ini sets public = true
+ if (isset($ini_array['public']) && ($ini_array['public'] == "true")) {
- $object['name'] = $ini_array['name'];
- if ($object['name']=="") $object['name'] = $file;
-
- $object['descr'] = $ini_array['descr'];
-
- $projects[$file]=$object;
+ $object['name'] = $ini_array['name'];
+ if ($object['name']=="") $object['name'] = $file;
+
+ $object['descr'] = $ini_array['descr'];
+
+ $projects[$file]=$object;
+ }
}
}
}
Copied: trunk/components/signup-admin.php (from rev 656, branches/sucs-site/components/signup-admin.php)
===================================================================
--- trunk/components/signup-admin.php (rev 0)
+++ trunk/components/signup-admin.php 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,44 @@
+<?php
+// Config options
+$permission="sucsstaff";
+// TODO: DEV: UNSTICK THIS BEFORE DEPLOY
+if (isset($session->groups[$permission])) {
+ $smarty->assign("staff",TRUE);
+
+ //get unused signup slips
+ $query = "SELECT signup.id, signup.sid, member_type.typename, members.username, signup.card";
+ $query .= " FROM signup LEFT JOIN member_type ON signup.type = member_type.id LEFT JOIN members ON signup.issuedby=members.uid";
+ $query .= " WHERE";
+ $query .= " signup.activated is NULL";
+ $query .= " or signup.username is NULL";
+ $query .= " ORDER BY signup.id";
+ $query .= ";";
+ $data = $sucsDB->GetAll($query);
+ // process responces
+ if(isset($_POST['command'])){
+ if($_POST['command']=='update'){
+ $changed = 0;
+ $upquery = "UPDATE signup";
+ $upquery .= " SET sid = ?";
+ $upquery .= " WHERE id = ?";
+ $upquery .= ";";
+ foreach($data as $value){
+ if(array_key_exists('sid:'.$value['id'],$_POST) && $_POST['sid:'.$value['id']]!=$value['sid']){
+ $uparray = array($_POST['sid:'.$value['id']],$value['id']);
+ $sucsDB->query($upquery,$uparray);
+ $changed++;
+ }
+ }
+ message_flash($changed." record(s) updated");
+
+ }
+ }
+ $data = $sucsDB->GetAll($query);
+ //set smarty stuff
+ $smarty->assign("signups",$data);
+ $smarty->assign("self",$baseurl.$path.$getout);
+}
+$body = $smarty->fetch("signup-admin.tpl");
+$smarty->assign('title', "Signup Slip Admin");
+$smarty->assign('body', $body);
+?>
Modified: trunk/components/signup.php
===================================================================
--- trunk/components/signup.php 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/components/signup.php 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,11 +1,396 @@
<?php
-/* Temporary Component to get the signup stuff working with new SUCS site */
+//ob_start();
+//include("../member/signup.php");
+//$output = ob_get_contents();
+//ob_end_clean();
+//
-ob_start();
-include("../member/signup.php");
-$output = ob_get_contents();
-ob_end_clean();
+// -------------------------------------------------------------
+// DEV: CHANGE THIS FOR DEV MODE
+// -------------------------------------------------------------
+//$script_path="/home/member/eclipse/signuptests/";
+$script_path="sudo /usr/local/sbin/";
+
+// DEV: CHNAGE THIS FOR DEV MODE
+//$error_email="eclipse at sucs.org";
+$error_email="admin at sucs.org";
+
+$override_permission="sucsstaff";
+
+// is the validation (mostly) overridable
+$overridable=isset($session->groups[$override_permission]);
+
+// ------------------------------------------------
+// DEV: UNCOMMENT THIS FOR DEV MODE
+// ------------------------------------------------
+
+//$overridable=true;
+
+//set defaults
+$mode = 'login';
+
+//login
+if(isset($_REQUEST['signupid'])&&isset($_REQUEST['signuppw'])){
+ //set signup details
+ $signupid = $_REQUEST['signupid'];
+ $signuppw = $_REQUEST['signuppw'];
+
+ //$sucsDB->debug = true;
+
+ // get row(s)
+ $query = "SELECT * FROM signup WHERE id=? AND password=?";
+ $array = array($signupid,$signuppw);
+ $data = $sucsDB->GetAll($query,$array);
+ // if data was returned and it was exactly 1 row
+ if(is_array($data)&&sizeof($data)==1){
+ $row=$data[0];
+ // if the id hasnt already been used
+ if(!(isset($row[activated])&&isset($row[username]))){
+ // pass on the id and passwd and id the validation is overridable
+ $smarty->assign("signupid",$signupid);
+ $smarty->assign("signuppw",$signuppw);
+ $smarty->assign("overridable",$overridable);
+ $smarty->assign("usertype",$row[type]);
+ // if accepting the form
+ if(isset($_REQUEST['username']) && isset($_REQUEST['realname']) && isset($_REQUEST['email']) && isset($_REQUEST['phone'])){
+ require_once("../lib/validation.php");
+ $override = $overridable && (isset($_POST['override']) && $_POST['override']=="on");
+ $valid=true;
+ $errors=array();
+ $fields=array();
+ if(!validUsername($_REQUEST['username'])){
+ $valid=false;
+ $errors['username']=$error;
+ }
+ $fields['username']=$_REQUEST['username'];
+ if(!(validSignupEmail($_REQUEST['email']) || $override)){
+ $valid=false;
+ $errors['email']=$error;
+ }
+ $fields['email']=$_REQUEST['email'];
+ if(!(validPhone($_REQUEST['phone']) || $override)){
+ $valid=false;
+ $errors['phone']=$error;
+ }
+ $fields['phone']=sanitizePhone($_REQUEST['phone']);
+ if($row[type]!=2){
+ if(!(validAddress($_REQUEST['address']) || $override)){
+ $valid=false;
+ $errors['address']=$error;
+ }
+ $fields['address']=sanitizeAddress($_POST['address']);
+ if(!validRealName($_REQUEST['realname'],$override)){
+ $valid=false;
+ $errors['realname']=$error;
+ }
+ $fields['realname']=$_REQUEST['realname'];
+ }
+ else{
+ if(!(validRealName($_REQUEST['contact'],false) || $override)){
+ $valid=false;
+ $errors['contact']=$error;
+ }
+ $fields['contact']=$_REQUEST['contact'];
+ if(!validSocName($_REQUEST['realname'], $override)){
+ $valid=false;
+ $errors['realname']=$error;
+ }
+ $fields['realname']=$_REQUEST['realname'];
+ }
+ if($row[type]==1){
+ if(!validSID($_REQUEST['studentid'],$override)){
+ $valid=false;
+ $errors['studentid']=$error;
+ }
+ $fields['studentid']=$_REQUEST['studentid'];
+ }
+
+ if($valid){
+ // include membership adding functions
+ require_once("../lib/member_functions.php");
+ $mode='result';
+ $failed=false;
+
+ // invalidate signup slip
+ $query = "UPDATE signup SET sid=?, username=?, activated=now() WHERE id=?";
+
+ unset($atribs);
+ $atribs[0]=$fields['studentid'];
+ $atribs[1]=$fields['username'];
+ $atribs[2]=$signupid;
+ $responce = $sucsDB->Execute($query,$atribs);
+ if(!$responce){
+ mail(
+ $error_email,
+ "Signup Error",
+ "Unable to invalidate signup slip: ".$signupid."\nAborting\nError message:\n".$sucsDB->ErrorMsg(),
+ "From: \"SUCS Admin\" <admin at sucs.org>"
+ );
+ $failed=true;
+ }
+ else{
+ // determine the uid range
+ if($row[type]==2){
+ $baseuid=8;
+ }
+ else{
+ $baseuid=29;
+ }
+ $minuid=$baseuid*1000;
+ $maxuid=$minuid+999;
+ //get the new uid
+ $uid=findUid($minuid,$maxuid);
+ // make a password
+ $password=make_password();
+ // make the ldif
+ $ldif=generateLdif($uid,$password,$row[type],$fields['realname'],$fields['username']);
+ // write ldif file
+ file_put_contents('/tmp/useradd.'.$fields['username'].'.ldif',$ldif);
+ exec(
+ $script_path.'useradd.apache '.
+ escapeshellarg($fields['username']).' '.
+ escapeshellarg($fields['studentid']).' '.
+ escapeshellarg($fields['email']).
+ ' 2>&1',
+ $execoutputarr,
+ $execreturn
+ );
+ if($execreturn!=0){
+ $execoutputstr=implode("\n",$execoutputarr);
+ mail(
+ $error_email,
+ "Error creating user for signup id: ".$signupid,
+ $execoutputstr,
+ "From: \"SUCS Admin\" <admin at sucs.org>"
+ );
+ $failed=true;
+ }
+ // DEV: STICK THIS FOR DEV
+ if(posix_getpwnam($fields['username'])){
+ $query="SELECT count(*) from members where username = ?";
+ $data = $sucsDB->GetAll($query,array($fields['username']));
+ if($data[0]['count']!=0){
+ mail(
+ $error_email,
+ "Signup Error",
+ "User ".$fields['username']." already exists in the databse, THIS SHOULD NEVER HAPPEN\n Love the signup system.\n\nP.S. the signup id is: ".$signupid,
+ "From: \"SUCS Admin\" <admin at sucs.org>"
+ );
+ $failed=true;
+ }
+ else{
+ $query = "INSERT INTO members (";
+ $query .= "uid, username, realname, email, address, phone, sid, type, paid, lastedit, comments";
+ $query .= ") values (";
+ $query .= "?, ?, ?, ?";
+ // if its a soc then it has no address
+ if($row[type]!=2){
+ $query .= ", ?"; //address
+ }
+ else{
+ $query .= ", DEFAULT"; //address
+ }
+ $query .= ", ?"; //phone
+ // only student had a sid
+ if($row[type]==1){
+ $query .= ", ?"; //sid
+ }
+ else{
+ $query .= ", DEFAULT";
+ }
+ $query .= ", ?, ?, ?";
+ // socienty add a default comment
+ if($row[type]==2){
+ $query .= ", ?";// comment
+ }
+ else{
+ $query .= ", DEFAULT";
+ }
+ $query .= ");";
+ unset($atribs);
+ $atribs[]=$uid;
+ $atribs[]=$fields['username'];
+ $atribs[]=$fields['realname'];
+ $atribs[]=$fields['email'];
+ if($row[type]!=2){
+ $atribs[]=$fields['address'];
+ }
+ $atribs[]=$fields['phone'];
+ if($row[type]==1){
+ $atribs[]=$fields['studentid'];
+ }
+ $atribs[]=$row[type];
+ include_once("../lib/date.php");
+ $atribs[]=paidUntil(time());
+ $atribs[]=$uid;
+ if($row[type]==2){
+ $atribs[]="Contact name: ".$fields['contact'];
+ }
+ $responce = $sucsDB->Execute($query,$atribs);
+ // if somthing broke then email
+ if(!$responce){
+ mail(
+ $error_email,
+ "Signup Error",
+ "Database problems for signup id: ".$signupid."\nError message:\n".$sucsDB->ErrorMsg(),
+ "From: \"SUCS Admin\" <admin at sucs.org>"
+ );
+ $failed=true;
+ }
+ else{
+ // if door card is connected to the signup slip move it to its proper home
+ if($row[card] != ''){
+ $query="INSERT INTO doorcards (uid,cardnumber) VALUES (?, ?);";
+ unset($atribs);
+ $atribs[0]=$uid;
+ $atribs[1]=$row[card];
+ $responce=$sucsDB->Execute($query,$atribs);
+ if(!$responce){
+ mail(
+ $error_email,
+ "Signup Error",
+ "Failed to migrate card details for signup id: ".$signupid."\nError message:\n".$sucsDB->ErrorMsg(),
+ "From: \"SUCS Admin\" <admin at sucs.org>"
+ );
+ }
+ }
+
+ $logsmessage = "New user '".$fields['username']."' has been created on SUCS\n";
+ $logsmessage .= "at: ".date("H:i ",time())." on ".date("l F jS Y", time())."\n";
+ $logsmessage .= "From: ".$_SERVER['REMOTE_ADDR']."\n";
+ $logsmessage .= "Using signup id: ".$signupid."\n";
+ if($override){
+ $logsmessage .= "User ".$session->username." overrode validation.\n";
+ }
+ $logsmessage .= "Love The Signup System";
+ // DEV: CHANGE THIS EMAIL ADDRESS
+ mail(
+ "logs at sucs.org",
+ "User '".$fields['username']."' Created on SUCS",
+ $logsmessage,
+ "From: \"SUCS Admin\" <admin at sucs.org>"
+ );
+ mail(
+ "treasurer at sucs.org",
+ "User '".$fields['username']."' Created on SUCS",
+ $logsmessage,
+ "From: \"SUCS Admin\" <admin at sucs.org>"
+ );
+
+ $usermessage = "Welcome to the Swansea University Computer Society!\n\n";
+ $usermessage .= "Your account details are:\n\n";
+ $usermessage .= "Username: ".$fields['username']."\n";
+ $usermessage .= "Password: ".$password."\n\n";
+ $usermessage .= "Wondering what to do next? Check out our Getting Started page: http://sucs.org/Getting%20Started or go right ahead and post on our forum at http://sucs.org/Community/Forum or join in the discussion on our chat system, Milliways: http://sucs.org/Community/Milliways\n\n";
+ $usermessage .= "Our weekly social is held in the coffee end JC's at 1:00 PM every Wednesday\n\n";
+ $usermessage .= "Before you use the SUCS computers or the computer room, please make sure you are familiar with the conditions of use and room rules at http://sucs.org/About/Regulations\n\n";
+ $usermessage .= "If you require help using the system, introductory guides are available at http://sucs.org/Knowledge\n\n";
+ $usermessage .= "If you have any trouble using the system, reply to this e-mail describing the nature of the problem and we'll look into it.\n\n";
+ $usermessage .= "We hope you enjoy your SUCS membership.\n\n";
+ $usermessage .= "Regards,\n\n";
+ $usermessage .= "Swansea University Computer Society";
+ if($fields['email']!=''){
+ $user_email=$fields['email'];
+ }
+ elseif($fields['studentid']!=''){
+ $user_email=$fields['studentid']."@swan.ac.uk";
+ }
+ else{
+ $user_email=FALSE;
+ }
+ if($user_email){
+ mail(
+ $user_email,
+ "Your SUCS Account has been created!",
+ $usermessage,
+ "From: \"SUCS Admin\" <admin at sucs.org>"
+ );
+ }
+ }
+ }
+ }
+
+ //Wrong logic, only students have student email addresses ~imranh
+ if ($row['type']==1){
+ $addtolist ="".$fields['email']."\n".$fields['studentid']."@swan.ac.uk";
+ }else{
+ $addtolist="".$fields['email']."\n"; //Societies don't have student email addresses
+ }
+ file_put_contents('/tmp/listadd.'.$fields['username'],$addtolist);
+ unset($execoutputarr);
+ exec(
+ $script_path.'listadd.apache '.
+ escapeshellarg($fields['username']).' '.
+ escapeshellarg($row[type]).
+ ' 2>&1',
+ $execoutputarr,
+ $ececreturn
+ );
+ if($execreturn!=0){
+ $execoutputstr=implode("\n",$execoutputarr);
+
+ mail(
+ $error_email,
+ "Error adding user to mailing lists from signup id: ".$signupid,
+ $execoutputstr,
+ "From: \"SUCS Admin\" <admin at sucs.org>"
+ );
+ $failed=true;
+ }
+
+ }
+ $smarty->assign("failed",$failed);
+ if($failed){
+ $errorreparray=$_POST;
+ unset($errorroparray[signuppw]);
+ $errorreparray[uid]=$uid;
+ $errorreport = "User input details:\n\n";
+ foreach ($errorreparray as $key => $value){
+ $errorreport .= $key.": ".$value."\n";
+ }
+ $errorreport .= "\nLove from the Signup System";
+ mail(
+ $error_email,
+ "Signup system error report",
+ $errorreport,
+ "From: \"SUCS Admin\" <admin at sucs.org>"
+ );
+ }
+ else{
+ $smarty->assign("username", $fields['username']);
+ $smarty->assign("password", $password);
+ $smarty->assign("email", $user_email);
+ }
+
+ }
+ else{
+ //re-show form
+ $script = "<script language='javascript' type='text/javascript' src='".$baseurl."/js/jquery.js'></script>\n";
+ $script .= "<script language='javascript' type='text/javascript' src='$baseurl/js/signup.js'></script>\n";
+ $smarty->assign("fields",$fields);
+ $smarty->assign("errors",$errors);
+ $smarty->append('extra_scripts', $script);
+ $mode='re-form';
+ }
+ }
+ else{
+ // display the form
+ $script = "<script language='javascript' type='text/javascript' src='".$baseurl."/js/jquery.js'></script>\n";
+ $script .= "<script language='javascript' type='text/javascript' src='$baseurl/js/signup.js'></script>\n";
+ $smarty->append('extra_scripts', $script);
+ $mode='form';
+ }
+ }
+ else trigger_error("Signup ID already used",E_USER_WARNING);
+ }
+ else trigger_error("Invalid ID or Password", E_USER_WARNING);
+
+}
+//Set smarty Variables
+$smarty->assign("mode", $mode);
+$output = $smarty->fetch("signup.tpl");
+
$smarty->assign("title", "Sign Up");
$smarty->assign("body", $output);
Copied: trunk/components/signupajax.php (from rev 656, branches/sucs-site/components/signupajax.php)
===================================================================
--- trunk/components/signupajax.php (rev 0)
+++ trunk/components/signupajax.php 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,80 @@
+<?
+require_once("../lib/validation.php");
+// don't output the site template
+$no_template = TRUE;
+header("Content-type: text/plain");
+if (isset($_GET['key'])){
+ switch($_GET['key']){
+ case "sid":
+ $sid=$_GET['value'];
+ if(validSID($sid,false)){
+ echo "OK:".lookupSID($_GET['value']);
+ }
+ else{
+ echo "ERROR:".$error;
+ }
+ break;
+ case "postcode":
+ $postcode=implode("", explode(" ", $_GET['value']));
+ echo json_encode(lookup_postcode($postcode));
+ break;
+ case "username":
+ $username = $_GET['value'];
+ if(validUsername($username)){
+ echo "OK";
+ }
+ else{
+ echo $error;
+ }
+ break;
+ case "realname":
+ $realname = $_GET['value'];
+ if(validRealName($realname,false)){
+ echo "OK";
+ }
+ else{
+ echo $error;
+ }
+ break;
+ case "socname":
+ $socname = $_GET['value'];
+ if(validSocName($socname,false)){
+ echo "OK";
+ }
+ else{
+ echo $error;
+ }
+ break;
+
+
+ case "address":
+ $address = $_GET['value'];
+ if(validAddress($address)){
+ echo "OK";
+ }
+ else{
+ echo $error;
+ }
+ break;
+
+ case "email":
+ $email = $_GET['value'];
+ if(validSignupEmail($email)){
+ echo "OK";
+ }
+ else{
+ echo $error;
+ }
+ break;
+ case "phone":
+ $phone = $_GET['value'];
+ if(validPhone($phone)){
+ echo "OK";
+ }
+ else{
+ echo $error;
+ }
+ break;
+ }
+}
+?>
Modified: trunk/components/societies.php
===================================================================
--- trunk/components/societies.php 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/components/societies.php 2015-04-05 16:42:47 UTC (rev 657)
@@ -5,7 +5,8 @@
// Connect and bind to ldap server
$conn = ldap_connect(_LDAP_SERVER);
-$bind = ldap_bind($conn);
+# ldap_set_option($conn, LDAP_OPT_PROTOCOL_VERSION, 3);
+# $bind = ldap_bind($conn);
$search = ldap_search($conn, _BASE_DN, 'uid=*', array('uid', 'cn', 'homedirectory'));
@@ -19,9 +20,12 @@
$fullname = ldap_get_values($conn, $entryHandler, 'cn');
$homedir = ldap_get_values($conn, $entryHandler, 'homedirectory');
- $homedir = explode('/', $homedir[0]);
+ $homedir = $homedir[0];
+ $homedirArray = explode('/', $homedir);
- if ($homedir[2]=="society") $usernames[] = array( "username" => $username[0], "fullname" => $fullname[0]);
+ if (($homedirArray[2]=="society") && file_exists( "$homedir/public_html")) {
+ $usernames[] = array( "username" => $username[0], "fullname" => $fullname[0]);
+ }
$entryHandler = ldap_next_entry($conn, $entryHandler);
}
Modified: trunk/components/static.php
===================================================================
--- trunk/components/static.php 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/components/static.php 2015-04-05 16:42:47 UTC (rev 657)
@@ -50,7 +50,7 @@
case "Save":
// ...save the file
$savesuccess = @file_put_contents($myfile, $_REQUEST['body'], LOCK_EX);
- if (!$savesuccess) $smarty->assign("fileerror", "Write failed");
+ if (!$savesuccess) trigger_error("Write failed", E_USER_ERROR);
$id = $DB->GetOne("select id from static where path=?", array($path));
$record = array();
$record['summary'] = $_REQUEST['summary'];
@@ -82,8 +82,13 @@
$smarty->assign("secondary", $secondary);
}
-$smarty->assign("title", $title);
+// include a widget for leaving feedback on this page if the user is logged in
+if ($session->loggedin) {
+// include("../lib/page-feedback.php");
+}
+$smarty->assign("title", str_replace("_", " ", $title));
+
// Editing static pages - does the user have permission?
if (isset($session->groups[$permission])) {
// display Edit link on page
Copied: trunk/components/susignup-admin.php (from rev 656, branches/sucs-site/components/susignup-admin.php)
===================================================================
--- trunk/components/susignup-admin.php (rev 0)
+++ trunk/components/susignup-admin.php 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,366 @@
+<?PHP
+/***
+ * SU Signup admin
+ * Allows us to search the SU api for a given student number and checks if they're a SUCS member.
+ * If they are - allows account renewal
+ * If not - allows signup to be bootstrapped as per susignup component
+ ***/
+
+include("../lib/member_functions.php");
+include("../lib/date.php");
+include("../suapi.inc.php");
+
+//Restrict access to staff.
+$permission="sucsstaff";
+$apibaseurl="https://$suapi_user:$suapi_pass@su-api.sucs.org/memberships/Membership.asmx";
+
+if (isset($session->groups[$permission])) {
+ //Setup smarty magic, step 1
+ $smarty->assign("staff", TRUE);
+
+ if(!isset($_REQUEST['mode'])) {
+ $mode = 'menu';
+ } else {
+ $mode = urldecode($_REQUEST['mode']);
+ }
+
+ if ($mode == 'search') {
+ if (empty($_REQUEST['sid']) || empty($_REQUEST['snsubmit'])) {
+ $mode = 'error';
+ $smarty->assign("error_text", "Invalid search request");
+ }else{
+ $pres=preg_match("/^[0-9]{6}$/",$_REQUEST['sid'],$sid);
+ if ($pres!=1) {
+ $mode = 'error';
+ $smarty->assign("error_text", "Search term doesn't look like a valid student ID");
+ } else {
+ $url = "$apibaseurl/IsPersonMember?strCriteria=".$sid[0]."&GroupingId=6613";
+ $apiReq = curl_init();
+ curl_setopt($apiReq, CURLOPT_URL, $url);
+ curl_setopt($apiReq, CURLOPT_RETURNTRANSFER, TRUE);
+
+ $apiResult = curl_exec($apiReq);
+ if ($apiResult === FALSE) {
+ $mode = 'error';
+ $smarty->assign("error_text", "An error occurred communicating with the SUSU API.");
+ }else {
+ // Ostensibly we now have a valid search result from the SU - go to work
+ libxml_use_internal_errors(true);
+ $xml=simplexml_load_string($apiResult);
+ if (!$xml||isset($xml->head->title)) {
+ $mode='error';
+ $smarty->assign("error_text", "An error occurred communicating with the SUSU API");
+ } else {
+ $ismember = $xml[0];
+ if ($ismember=="true") {
+ //Yay, we have a student who has paid and needs to be signed up.
+ //Check they don't have a signup slip already
+ $query = "SELECT transactionid, signupid FROM transactions WHERE cardNumber = ?;";
+ $qres = $sucsDB->Execute($query, $sid);
+
+ if ($qres->RecordCount()==0) {
+ // No transaction, but might have unused signup slip. If so, retrieve values.
+ $query = "SELECT id, username, password FROM signup WHERE sid=?;";
+ $qres = $sucsDB->Execute($query, array($sid[0]));
+ if ($qres && $qres->RecordCount() > 0) {
+ if ($qres->RecordCount() > 1) {
+ $mode='error';
+ $smarty->assign("error_text", "Student has multiple signup slips in the DB. Bork! Bork! Bork!");
+ } else if (!empty($qres->fields['username'])) {
+ $mode='error';
+ $smarty->assign("error_text", "Student hasn't tried to use the SU signup component (No transaction in DB), but has a previously used Signup Slip with username ".$qres->fields['username'].".<br />Is this a renewal? If not, ask an admin to generate a new signup slip for this student");
+ //TODO: Add option to generate new signup slip?
+ } else {
+ $id = $qres->fields['id'];
+ $pass = $qres->fields['password'];
+ }
+ } else {
+ $pass = make_password();
+ $query = "INSERT INTO signup (password,sid,issuedby) VALUES ( ?, ?, ?) RETURNING id";
+ $attribs[]=$pass;
+ $attribs[]=$sid[0];
+ $attribs[]='99999'; //SUCS Magic internal use UID
+
+ $id = $sucsDB->Execute($query,$attribs);
+ $id = $id->fields['id'];
+ if (!$id) {
+ $mode="error";
+ $smarty->assign("error_text", "An error occurred generating a signup ID. Report the following message to the admins:<br /><pre>".$sucsDB->ErrorMsg()."</pre>");
+ } else {
+ $smarty->assign('slipid', $id);
+ $smarty->assign('slippass', $pass);
+ $smarty->assign('sid', $sid[0]);
+ }
+ }
+ } else {
+ //Retrieve existing slip
+ $id = $qres->fields['signupid'];
+ $tid = $qres->fields['transactionid'];
+ if (empty($id)) {
+ $pass = make_password();
+ $query = "INSERT INTO signup (password,sid,issuedby) VALUES ( ?, ?, ?) RETURNING id";
+ $attribs[]=$pass;
+ $attribs[]=$sid[0];
+ $attribs[]='99999'; //SUCS Magic internal use UID
+
+ $qres = $sucsDB->Execute($query,$attribs);
+ if (!$qres) {
+ $mode="error";
+ $smarty->assign("error_text", "An error occurred generating a signup ID. Report the following message to the admins:<br /><pre>".$sucsDB->ErrorMsg()."</pre>");
+ } else {
+ $id = $qres->fields['id'];
+ $query = "UPDATE transactions SET signupid=? WHERE transactionid=?;";
+ $qres = $sucsDB->Execute($query, array($id, $tid));
+ $smarty->assign('slipid', $id);
+ $smarty->assign('slippass', $pass);
+ $smarty->assign('sid', $sid[0]);
+ }
+
+ }else {
+ $query = "SELECT username, password FROM signup WHERE id=?;";
+ $qres = $sucsDB->Execute($query, array($id));
+ if (!$qres) {
+ $mode="error";
+ $smarty->assign("error_text", "The user appears to have generated a signup ID using the SU Signup system (Slip ID: ".$id."), but the password for that slip can't be retrieved.<br />Request assistance.");
+ } else if ($qres->fields['username'] !== NULL) {
+ $mode="error";
+ $smarty->assign("error_text", "This user appears to have completed signup, with username <strong>".$qres->fields['username']."</strong><br />Check that this user exists, and offer to reset their password if necessary.");
+ }
+ $pass = $qres->fields['password'];
+ $smarty->assign('slipid', $id);
+ $smarty->assign('slippass', $pass);
+ $smarty->assign('sid', $sid[0]);
+ }
+ }
+
+ if(!$mode=='error') {
+ //Right, this should be the point where we hand off to signup
+ $smarty->assign('slipid', $id);
+ $smarty->assign('slippass', $pass);
+ $smarty->assign('sid', $sid[0]);
+ }
+
+ }else{
+ $mode='error';
+ $smarty->assign("error_text", "Student does not appear to have paid. Extract fees");
+ }
+ }
+ }
+ }
+ }
+ } else if ($mode=="renew") {
+ if (empty($_REQUEST['member'])){
+ $mode='error';
+ $smarty->assign('error_text',"Can't renew a member without knowing their username!");
+ } else if (!isset($_REQUEST['renewconf'])) {
+ //Should be trying to renew $_REQUEST['member']
+ $username=urldecode($_REQUEST['member']);
+ $q = "SELECT username, typename, sid, paid, email FROM members, member_type WHERE username=?";
+ $res = $sucsDB->Execute($q,array($username));
+ if (!$res) {
+ $mode='error';
+ $smarty->assign('error_text', "A database error occurred while trying to retrieve member details");
+ } else if ($res->fields['paid'] == paidUntil(time())) {
+ $mode='error';
+ $smarty->assign('error_text', 'User appears to have been renewed already?');
+ } else {
+ $smarty->assign('renew_user', $username);
+ $smarty->assign('renew_paid', $res->fields['paid']);
+ $smarty->assign('renew_type', $res->fields['typename']);
+ $url = "$apibaseurl/IsPersonMember?strCriteria=".$res->fields['sid']."&GroupingId=6613";
+ $apiReq = curl_init();
+ curl_setopt($apiReq, CURLOPT_URL, $url);
+ curl_setopt($apiReq, CURLOPT_RETURNTRANSFER, TRUE);
+
+ $apiResult = curl_exec($apiReq);
+ libxml_use_internal_errors(true);
+ $xml=simplexml_load_string($apiResult);
+ if (!$xml || isset($xml->head->title)) {
+ $mode='error';
+ $smarty->assign("error_text", "An error occurred communicating with the SUSU API.");
+ } else {
+ $ismember = $xml[0];
+
+ $user = posix_getpwnam($session->username);
+
+ if ($ismember!="true") {
+ $mode='error';
+ $smarty->assign('error_text', 'Member does not appear to have paid via the SU system. Use the old renewals system if they have paid using some other method');;
+ } else {
+ if (renew_member($username, $user['uid'], $user['name'])) {
+ message_flash("Successfully renewed");
+ $mode='menu';
+ } else {
+ $mode='error';
+ $smarty->assign('error_text', 'An error occurred renewing account '.$username);
+ }
+
+ }
+
+ }
+ }
+ }
+
+ } else if ($mode == 'renewals') {
+ //Get list of members according to the SU
+ $url = "$apibaseurl/GetMemberListData?GroupingId=6613";
+ $apiReq = curl_init();
+ curl_setopt($apiReq, CURLOPT_URL, $url);
+ curl_setopt($apiReq, CURLOPT_RETURNTRANSFER, TRUE);
+
+ $apiResult = curl_exec($apiReq);
+ $sumembers = su_response_decode($apiResult);
+ if (!$sumembers) {
+ $mode ='error';
+ $smarty->assign("error_text", "An error occurred communicating with the SUSU API.");
+ } else {
+ $matches = array();
+ $others=0;
+ $paidup=0;
+ foreach ($sumembers as $sumem) {
+ $sucsmem = get_sucs_record($sumem['uni_card_number']);
+ if ($sucsmem && $sucsmem['paid'] != paidUntil(time()) && $sucsmem['type']==1) {
+ $matches[]=array($sumem['firstName']." ".$sumem['lastName'], $sucsmem['realname'], $sumem['uni_card_number'], $sucsmem['username'], $sucsmem['paid']);
+ } else if ($sucsmem && $sucsmem['paid'] == paidUntil(time())) {
+ $others++;
+ $paidup++;
+ } else {
+ $others++;
+ }
+ }
+ $smarty->assign("matches", $matches);
+ $smarty->assign("others", $others);
+ $smarty->assign("paidup", $paidup);
+ $smarty->assign("pending", $others - $paidup);
+ }
+ } else if ($mode == 'renewals2') {
+ $failures = array();
+ $successes = array();
+
+ if (empty($_REQUEST['renew'])) {
+ $mode='error';
+ $smarty->assign("error_text", "Can't renew an empty list!");
+ } else {
+ foreach($_REQUEST['renew'] as $user) {
+ $admin_user=posix_getpwnam($session->username);
+ if (renew_member($user, $admin_user['uid'], $admin_user['name'])) {
+ $successes[]=$user;
+ } else {
+ $failures[]=$user;
+ }
+ }
+ $smarty->assign("attempt", count($_REQUEST['renew']));
+ $smarty->assign("failures", count($failures));
+ $smarty->assign("failusers", $failures);
+ $smarty->assign("successes", count($successes));
+ }
+ } else if ($mode == 'list') {
+ //Get list of members according to the SU
+ $url="$apibaseurl/GetMemberListData?GroupingId=6613";
+ $apiReq = curl_init();
+ curl_setopt($apiReq, CURLOPT_URL, $url);
+ curl_setopt($apiReq, CURLOPT_RETURNTRANSFER, TRUE);
+
+ $apiResult = curl_exec($apiReq);
+ $sumembers = su_response_decode($apiResult);
+ if (!$sumembers) {
+ $mode='error';
+ $smarty->assign("error_text", "An error occurred communicating with the SUSU API.");
+ } else {
+ $matches = array();
+ foreach ($sumembers as $sumem) {
+ $sucsmem = get_sucs_record($sumem['uni_card_number']);
+ if ($sucsmem) {
+ $matches[]=array($sumem['firstName']." ".$sumem['lastName'], $sucsmem['realname'], $sumem['uni_card_number'], $sucsmem['username'], $sucsmem['paid']);
+ } else {
+ $matches[]=array($sumem['firstName']." ".$sumem['lastName'], "N/A", $sumem['uni_card_number'], "N/A", "Not signed up");
+ }
+ }
+ function sortbypaid($a, $b) {
+ //Lets us array sort by final column ('Paid')
+ return ($a[4] < $b[4]) ? -1 : 1;
+ }
+ usort($matches, 'sortbypaid');
+ $smarty->assign("matches", $matches);
+ }
+ }
+$smarty->assign('renewables', get_renewable_members());
+}
+
+
+$smarty->assign('title', 'SU Signup Admin');
+$smarty->assign('mode', $mode);
+$body = $smarty->fetch("susignup-admin.tpl");
+$smarty->assign('body', $body);
+$smarty->assign("extra_styles", array("$baseurl/css/susignup-admin.css"));
+
+function su_response_decode($text) {
+ global $smarty;
+ libxml_use_internal_errors(true);
+ $xml=simplexml_load_string($text);
+ if (!$xml || isset($xml->head->title)) {
+ return false;
+ } else {
+ return json_decode($xml[0],TRUE);
+ }
+}
+
+function get_sucs_record($sid) {
+ global $sucsDB;
+
+ $query = "SELECT * FROM members WHERE sid=?;";
+ $res = $sucsDB->Execute($query, array($sid));
+ if (!$res || $res->RecordCount()<>1) {
+ return FALSE;
+ }
+ return $res->FetchRow();
+}
+
+function get_renewable_members() {
+ global $sucsDB;
+ $q = "SELECT username, username||' ('||realname||')' AS display FROM members, member_type WHERE paid != ? AND type=1 AND type=member_type.id ORDER BY paid;";
+ $r = $sucsDB->Execute($q, array(paidUntil(time())));
+ if(!$r) {
+ return FALSE;
+ }
+ $retvals = array();
+ while ($rec=$r->FetchRow()) {
+ $retvals[$rec['username']]=$rec['display'];
+ }
+ return $retvals;
+}
+
+function renew_member($renew_name, $admin_uid, $admin_name) {
+ global $sucsDB;
+
+ $q="UPDATE members SET paid=?, lastupdate=DEFAULT, lastedit=? WHERE username=?;";
+ $r=$sucsDB->Execute($q, array(paidUntil(time()), $admin_uid, $renew_name));
+ if (!$r) {
+ print $sucsDB->ErrorMsg();
+ return FALSE;
+ } else {
+ $q="SELECT email, typename FROM members, member_type WHERE username=? AND type=member_type.id;";
+ $r=$sucsDB->Execute($q, array($renew_name));
+
+ $message = "Account Renewal notification\n\n";
+ $message .= "Account : ".$renew_name."\n";
+ $message .= "User Type : ".$r->fields['typename']."\n";
+ $message .= "Renewed by: ".$admin_name."\n\n";
+ $message .= "**** Payment was made via the SU payments system ****\n";
+ $message .= "Regards\n The SU Renewals script";
+ mail("treasurer at sucs.org","Account Renewal",$message);
+
+ $message = "Your Swansea University Computer Society (SUCS) membership has been renewed\n\n";
+ $message .= "Username: ".$renew_name."\n";
+ $message .= "If you do not know or have forgotten your password, please email admin at sucs.org to arrange for it to be changed.\n\n";
+ $message .= "Regards\n The SUCS admin";
+ $header = "From: admin at sucs.org\r\n";
+ $header .= "Reply-To: admin at sucs.org";
+ // Personal account
+ mail($r->fields['email'],"SUCS account renewal",$message,$header);
+ // sucs account
+ mail($renew_name."@sucs.org","SUCS account renewal",$message,$header);
+ return TRUE;
+ }
+
+}
Copied: trunk/components/susignup.php (from rev 656, branches/sucs-site/components/susignup.php)
===================================================================
--- trunk/components/susignup.php (rev 0)
+++ trunk/components/susignup.php 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,259 @@
+<?php
+
+//unique society identifier
+$GroupingID = "6613";
+
+include "../lib/member_functions.php";
+include "../lib/date.php";
+include "../suapi.inc.php";
+
+$error_email = "admin at sucs.org";
+$mode = 'login';
+//login
+if(!empty($_REQUEST['sid'])&&!empty($_REQUEST['transactionID'])){
+//set signup details
+
+ $sid = $_REQUEST['sid'];
+ $transactionID = $_REQUEST['transactionID'];
+
+ //set POST variables
+ $url = "https://$suapi_user:$suapi_pass@su-api.sucs.org/memberships/Membership.asmx/GetMemberByTransactionID";
+ $fields = array(
+ 'transactionID'=>urlencode($transactionID),
+ 'GroupingID'=>urlencode($GroupingID),
+ );
+ //url-ify the data for the POST
+ $field_string = "";
+ foreach($fields as $key=>$value) { $fields_string .= $key.'='.$value.'&'; }
+ rtrim($fields_string,'&');
+ //open connection
+ $ch = curl_init();
+
+ //set the url, number of POST vars, POST data
+ curl_setopt($ch,CURLOPT_URL,$url);
+ curl_setopt($ch,CURLOPT_POST,count($fields));
+ curl_setopt($ch,CURLOPT_POSTFIELDS,$fields_string);
+ curl_setopt($ch,CURLOPT_RETURNTRANSFER,TRUE);
+ //execute post
+ $result = curl_exec($ch);
+
+ //close connection
+ curl_close($ch);
+ if(!$result){
+ $mode = "error";
+ $smarty->assign("error_text", "Invalid query returned");
+ } else {
+ libxml_use_internal_errors(true);
+ $xml=simplexml_load_string($result);
+ if (!$xml||isset($xml->head->title)) {
+ $mode='error';
+ $smarty->assign("error_text", "An error occurred communicating with the SUSU API");
+ } else{
+ $re1='.*?';
+ $re2='(\\{.*?\\})';
+ if ($c=preg_match_all ("/".$re1.$re2."/is", $result, $matches))
+ {
+ $json_string=$matches[1][0];
+ } else{
+ $mode = "error";
+ }
+ $array = json_decode($json_string,TRUE);
+ if($array['cardNumber'] == $sid && $sid != ""){
+ $mode = 'form';
+
+ // SET THIS FOR DEBUG MODE
+ // $sucsDB->debug = true;
+
+ $fullName = $array['firstName']." ".$array['lastName'];
+ $query = "INSERT INTO transactions (transactionID,fullName,emailAddress,cardNumber,personID) values(?, ?, ?, ?, ?)";
+ $attribs[] = $transactionID;
+ $attribs[] = $fullName;
+ $attribs[] = $array['emailAddress'];
+ $attribs[] = $array['cardNumber'];
+ $attribs[] = $array['personID'];
+
+ $valid = true;
+ if(!$sucsDB->Execute($query,$attribs)) {
+ // We did this because Adodb ErrorNo command is broken
+ $query = "SELECT * FROM transactions WHERE transactionID = ?";
+ unset($attribs);
+ $attribs[]=$transactionID;
+ if($sucsDB->Execute($query,$attribs)) {
+
+ $query = "SELECT * FROM transactions WHERE transactionID = ?";
+ $attribs= array();
+ $attribs[]=$transactionID;
+ $data = $sucsDB->GetAll($query,$attribs);
+ if(is_array($data)&&sizeof($data)==1&&$data[0]['signupid']==NULL){
+ // As it stands this shouldn't happen but if it does, no reason not to let them carry on
+ $valid = true;
+ } elseif(is_array($data)&&sizeof($data)==1&&$data[0]['signupid']!=NULL) {
+ $query = "SELECT * FROM signup WHERE sid = ?";
+ unset($attribs);
+ $attribs[]=$sid;
+ $data = $sucsDB->Execute($query, $attribs);
+ if(!$data) {
+ mail(
+ $error_email,
+ "SUSignup Error",
+ "An error occured in the susignup system at stage 0\n Love the signup system.\n\nP.S. The Error is:\n ".$sucsDB->ErrorMsg(),
+ "From: \"SUCS Admin\" <admin at sucs.org>"
+ );
+ $valid=false;
+ } else if($data->fields['username']!=NULL){
+ $smarty->assign("username", $data->fields['username']);
+ $mode='numpty2';
+ // This happens if they already ahve a SUCS account and are trying to create a new signupid
+ $valid = false;
+ } else {
+ $smarty->assign("id", $data->fields['id']);
+ $smarty->assign("pass", $data->fields['password']);
+ $mode='numpty';
+ // If this happens they tried to get a new signupid/pass after already getting one, and should get weekly reminders about it
+ $valid = false;
+ }
+ } else {
+ $mode="error";
+ mail(
+ $error_email,
+ "SUSignup Error",
+ "An error occured in the susignup system at stage 1\n Love the signup system.\n\nP.S. The Error is:\n ".$sucsDB->ErrorMsg(),
+ "From: \"SUCS Admin\" <admin at sucs.org>"
+ );
+
+ $valid = false;
+ }
+
+ } else {
+ $mode="error";
+ mail(
+ $error_email,
+ "SUSignup Error",
+ "An error occured in the susignup system at stage 2\n Love the signup system.\n\nP.S. The Error is:\n ".$sucsDB->ErrorMsg(),
+ "From: \"SUCS Admin\" <admin at sucs.org>"
+ );
+
+ $valid = false;
+ }
+ }
+
+ if($valid)
+ {
+ unset($attribs);
+ unset($query);
+ $query = "SELECT * FROM members WHERE sid = ?";
+ $attribs[] = $sid;
+ unset($data);
+ $data = $sucsDB->Execute($query, $attribs);
+ if (!$data) {
+ $mode = "error";
+ $smarty->assign("error_text", "Error in internal database check");
+ } elseif ($data->RecordCount()==1) {
+ $mode = "renew";
+ $q="UPDATE members SET paid=?, lastupdate=DEFAULT, lastedit=? WHERE username=?;";
+ $r=$sucsDB->Execute($q, array(paidUntil(time()), '99999', $data->fields['username']));
+ if (!$r) {
+ mail(
+ $error_email,
+ "SUSignup Error",
+ "An error occured in the susignup system at stage 2.5\n Love the signup system.\n\nP.S. The Error is:\n ".$sucsDB->ErrorMsg(),
+ "From: \"SUCS Admin\" <admin at sucs.org>"
+ );
+
+ } else {
+ $q="SELECT email, typename FROM members, member_type WHERE username=? AND type=member_type.id;";
+ $r=$sucsDB->Execute($q, array($data->fields['username']));
+
+ $message = "Account Renewal notification\n\n";
+ $message .= "Account : ".$data->fields['username']."\n";
+ $message .= "User Type : ".$r->fields['typename']."\n";
+ $message .= "Renewed by: ".$data->fields['username'].".\n\n";
+ $message .= "**** Payment was made via the SU payments system ****\n";
+ $message .= "Regards\n The SU Renewals script";
+ mail("treasurer at sucs.org","Account Renewal",$message);
+
+ $message = "Your Swansea University Computer Society (SUCS) membership has been renewed\n\n";
+ $message .= "Username: ".$renew_name."\n";
+ $message .= "If you do not know or have forgotten your password, please email admin at sucs.org to arrange for it to be changed.\n\n";
+ $message .= "Regards\n The SUCS admin";
+ $header = "From: admin at sucs.org\r\n";
+ $header .= "Reply-To: admin at sucs.org";
+ // Personal account
+ mail($r->fields['email'],"SUCS account renewal",$message,$header);
+ // sucs account
+ mail($data->fields['username']."@sucs.org","SUCS account renewal",$message,$header);
+ unset($query);
+ unset($attribs);
+ $query = "UPDATE transactions set signupid=? WHERE transactionID=?";
+ $attribs[]="000";
+ $attribs[]=$transactionID;
+ $data = $sucsDB->Execute($query,$attribs);
+ if (!$data) {
+ $mode="error";
+ mail(
+ $error_email,
+ "SUSignup Error",
+ "An error occured in the susignup system at stage 2.6\n Love the signup system.\n\nP.S. The Error is:\n ".$sucsDB->ErrorMsg(),
+ "From: \"SUCS Admin\" <admin at sucs.org>"
+ );
+ }
+ }
+ } else {
+ $pass = make_password();
+ unset($query);
+ $query = "insert into signup (password,sid,issuedby) values( ?, ?, ?) returning id";
+ unset($attribs);
+ $attribs[]=$pass;
+ $attribs[]=$array['cardNumber'];
+ $attribs[]='99999';
+
+ $iddata = $sucsDB->Execute($query,$attribs);
+ $id = $iddata->fields['id'];
+ if (!$iddata) {
+ $mode="error";
+ mail(
+ $error_email,
+ "SUSignup Error",
+ "An error occured in the susignup system at stage 3\n Love the signup system.\n\nP.S. The Error is:\n ".$sucsDB->ErrorMsg(),
+ "From: \"SUCS Admin\" <admin at sucs.org>"
+ );
+ } else {
+ $query = "update transactions set signupid=? WHERE transactionID=?";
+ unset($attribs);
+ $attribs[]=$id;
+ $attribs[]=$transactionID;
+ if(!$sucsDB->Execute($query,$attribs)) {
+ $mode="error";
+ mail(
+ $error_email,
+ "SUSignup Error",
+ "An error occured in the susignup system at stage 4\n Love the signup system.\n\nP.S. The Error is:\n ".$sucsDB->ErrorMsg(),
+ "From: \"SUCS Admin\" <admin at sucs.org>"
+ );
+ print($sucsDB->ErrorMsg());
+ } else {
+ $smarty->assign("id", $id);
+ $smarty->assign("pass", $pass);
+ mail(
+ $array['emailAddress'].','.$sid.'@swansea.ac.uk',
+ "SUCS Signup Information",
+ "Thankyou for joining Swansea University Computer Society, your signup details are below;\nSignupID: $id\nSignup Password: $pass\nIf you have successfully completed signup immediately then you can disregard this message.\n\nSUCS Admin Team.",
+ "From: \"SUCS Admin\" <admin at sucs.org>"
+ );
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}
+
+$smarty->assign("mode", $mode);
+$output = $smarty->fetch("susignup.tpl");
+
+$smarty->assign("title", "Join");
+$smarty->assign("body", $output);
+
+
+?>
Modified: trunk/components/uri.php
===================================================================
--- trunk/components/uri.php 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/components/uri.php 2015-04-05 16:42:47 UTC (rev 657)
@@ -39,7 +39,7 @@
$headers=get_headers($_REQUEST['uri'], 1);
if ($headers) {
if (preg_match("/ 4/", $headers[0])) {
- $smarty->assign("errormsg", "HTTP 4xx error detected - not creating ShortURI");
+ trigger_error("HTTP 4xx error detected - not creating ShortURI", E_USER_WARNING);
} else {
$record['url'] = @$_REQUEST['uri'];
$record['creator'] = $session->username;
@@ -48,7 +48,7 @@
$shorturi=$DB->GetOne("select id from $uritable where url=?", array(@$_REQUEST['uri']));
}
} else {
- $smarty->assign("errormsg", "URI supplied is not valid");
+ trigger_error("URI supplied is not valid", E_USER_WARNING);
}
}
@@ -56,7 +56,7 @@
}
} else {
- $smarty->assign("errormsg", "You are not logged in");
+ trigger_error("You are not logged in", E_USER_WARNING);
}
}
Deleted: trunk/db_changes/sucssite-0.3.sql
===================================================================
--- branches/sucs-site/db_changes/sucssite-0.3.sql 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/db_changes/sucssite-0.3.sql 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,5 +0,0 @@
-DELETE FROM session;
-ALTER TABLE session DROP COLUMN time;
-ALTER TABLE session ADD COLUMN logintime timestamp(0) without time zone;
-ALTER TABLE session ADD COLUMN lastseen timestamp(0) without time zone;
-DELETE FROM menu WHERE title='Bananas';
Copied: trunk/db_changes/sucssite-0.3.sql (from rev 656, branches/sucs-site/db_changes/sucssite-0.3.sql)
===================================================================
--- trunk/db_changes/sucssite-0.3.sql (rev 0)
+++ trunk/db_changes/sucssite-0.3.sql 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,5 @@
+DELETE FROM session;
+ALTER TABLE session DROP COLUMN time;
+ALTER TABLE session ADD COLUMN logintime timestamp(0) without time zone;
+ALTER TABLE session ADD COLUMN lastseen timestamp(0) without time zone;
+DELETE FROM menu WHERE title='Bananas';
Property changes on: trunk/htdocs
___________________________________________________________________
Added: svn:ignore
+ video
google*.html
norton*.html
cam
settings.php
adminwiki
star.ca.pem
sucs.crt
Added: svn:externals
+ mw https://projects.sucs.org/svn/mw/trunk/webclient
Modified: trunk/htdocs/css/blog.css
===================================================================
--- trunk/htdocs/css/blog.css 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/css/blog.css 2015-04-05 16:42:47 UTC (rev 657)
@@ -21,4 +21,11 @@
.errorinfo {
color: red;
-}
\ No newline at end of file
+}
+
+#spinner {
+ visibility: hidden;
+ margin-left: 4px;
+ margin-right: 4px;
+}
+
Modified: trunk/htdocs/css/common.css
===================================================================
--- trunk/htdocs/css/common.css 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/css/common.css 2015-04-05 16:42:47 UTC (rev 657)
@@ -24,7 +24,7 @@
margin-bottom: 0;
}
-h2+p, h2+ul, h2+ol, h3+p, h3+ul, h3+ol {
+h2+p, h2+ul, h2+ol, h3+p, h3+ul, h3+ol, h4+p, h4+ul, h4+ol {
margin-top: 0;
}
@@ -36,6 +36,12 @@
margin-bottom: 0.5em;
}
+acronym, abbr {
+ text-transform: lowercase;
+ font-variant: small-caps;
+}
+
+
/* --------------------------------------------------
Branding
-------------------------------------------------- */
@@ -146,8 +152,11 @@
margin-right: 1em;
}
-dd#plan {
+dd#plan, dd#project {
margin-left: 0;
+ word-wrap: break-word;
+ white-space: pre-wrap;
+ font-family: monospace;
}
/* --------------------------------------------------
Modified: trunk/htdocs/css/ie.css
===================================================================
--- trunk/htdocs/css/ie.css 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/css/ie.css 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,20 +1,167 @@
-form {
- margin: 0;
- padding: 0;
+/* --------------------------------------------------
+ Page corners
+ -------------------------------------------------- */
+
+.cornerTopLeft {
+ height: 100%;
+ background: url('/images/left-top-corner.png') top left no-repeat;
}
-#navigationC ul li {
- line-height: 0;
+.cornerTopRight {
+ height: 100%;
+ background: url('/images/right-top-corner.png') top right no-repeat;
}
-#loginForm input.button {
- font-size: 80%;
+.cornerBottomLeft {
+ height: 100%;
+ background: url('/images/left-bottom-corner.png') bottom left no-repeat;
}
+.cornerBottomRight {
+ height: 100%;
+ background: url('/images/right-bottom-corner.png') bottom right no-repeat;
+}
+
/* --------------------------------------------------
+ Menu
+ -------------------------------------------------- */
+#navigationC ul li a {
+ background: #e76808 url('/images/menu-top-right.png') no-repeat top right;
+}
+#navigationC ul ul li a span {
+ background: url('/images/menu-bottom-right.png') no-repeat bottom right;
+}
+
+#navigationC ul li a span {
+ display: block;
+ background: url('/images/menu-bottom-right.png') no-repeat bottom right;
+}
+/* --------------------------------------------------
+ Error box
+ -------------------------------------------------- */
+
+.error {
+ margin-right: 0.5em;
+ margin-bottom: 0.5em;
+}
+
+.error div.errorcontent {
+ background: #ffffff;
+ border: 2px solid #ff0000;
+}
+
+.error .errorhead h3 {
+ color: #ffffff;
+}
+
+.error .errorhead {
+ background: #ff0000 url('/images/menu-top-left.png') no-repeat top left;
+}
+
+.errorbar, .navbar, .infobar {
+ margin: 0.5em 0 0 0;
+ font-size: 80%;
+}
+
+.errorbar {
+ background: #ff0000 url('/images/menu-top-left.png') no-repeat top left;
+ color: #ffffff;
+ margin-right: 0.5em;
+}
+
+.infobar {
+ background: #e76808 url('/images/menu-top-left.png') no-repeat top left;
+ color: #ffffff;
+ margin-right: 0.5em;
+}
+
+.infobar a {
+ color: #ffc62b;
+}
+
+.infobar a:active {
+ color: #ffffff;
+}
+
+.navbar {
+ background: #e76808 url('/images/menu-top-left.png') no-repeat top left;
+}
+
+.navbar a {
+ color: #ffc62b;
+ font-weight: bold;
+ text-decoration: none;
+}
+
+.errorbar div, .navbar div, .infobar div {
+ background: url('/images/menu-top-right.png') no-repeat top right;
+}
+
+.errorbar div div, .navbar div div, .infobar div div {
+ background: url('/images/menu-bottom-left.png') no-repeat bottom left;
+}
+
+.errorbar div div div, .navbar div div div, .infobar div div div {
+ background: url('/images/menu-bottom-right.png') no-repeat bottom right;
+ padding: 0.2em 0.5em;
+}
+/* --------------------------------------------------
Content box (e.g. for news items)
-------------------------------------------------- */
+.box .boxhead {
+ background: #e76808 url('/images/menu-top-left.png') no-repeat top left;
+}
-ol.roman {
- list-style-type: i;
+.box .hollowhead {
+ background: #ffffff url('/images/border-bottom.png') repeat-x top;
+ height: 5px;
+ margin: 0;
+ padding: 0;
+ border: none;
}
+
+.box .hollowhead div {
+ background: url('/images/border-top-left.png') no-repeat top left;
+ height: 100%;
+}
+
+.box .hollowhead div div {
+ background: url('/images/border-top-right.png') no-repeat top right;
+ height: 100%;
+}
+
+
+.box .boxhead h2, .box .boxhead h3, .error .errorhead h3 {
+ background: url('/images/menu-top-right.png') no-repeat top right;
+}
+
+.box .boxfoot {
+ background: #e76808 url('/images/menu-bottom-left.png') no-repeat bottom left;
+}
+
+.box .boxfoot p {
+ background: url('/images/menu-bottom-right.png') no-repeat bottom right;
+}
+
+.box .hollowfoot {
+ background: #ffffff url('/images/border-bottom.png') repeat-x bottom;
+ height: 5px;
+ margin: 0;
+ padding: 0;
+}
+
+.box .hollowfoot div {
+ background: url('/images/border-bottom-left.png') no-repeat bottom left;
+ height: 100%;
+}
+
+.box .hollowfoot div div {
+ background: url('/images/border-bottom-right.png') no-repeat bottom right;
+ height: 100%;
+}
+/* --------------------------------------------------
+ Error box
+ -------------------------------------------------- */
+.error .errorhead {
+ background: #ff0000 url('/images/menu-top-left.png') no-repeat top left;
+}
Copied: trunk/htdocs/css/ie8.css (from rev 656, branches/sucs-site/htdocs/css/ie8.css)
===================================================================
--- trunk/htdocs/css/ie8.css (rev 0)
+++ trunk/htdocs/css/ie8.css 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,7 @@
+div#searchbox {
+ height: 5em;
+}
+
+.buttons {
+ padding-top: 5px;
+}
\ No newline at end of file
Copied: trunk/htdocs/css/ielt8.css (from rev 656, branches/sucs-site/htdocs/css/ielt8.css)
===================================================================
--- trunk/htdocs/css/ielt8.css (rev 0)
+++ trunk/htdocs/css/ielt8.css 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,26 @@
+form {
+ margin: 0;
+ padding: 0;
+}
+
+#navigationC ul li {
+ line-height: 0;
+}
+
+#loginForm input.button {
+ font-size: 80%;
+}
+
+/* --------------------------------------------------
+ Content box (e.g. for news items)
+ -------------------------------------------------- */
+
+ol.roman {
+ list-style-type: i;
+}
+/* --------------------------------------------------
+ Secondary content
+ -------------------------------------------------- */
+#secondary ul {
+ margin-left: 2em;
+}
\ No newline at end of file
Copied: trunk/htdocs/css/milliways.css (from rev 656, branches/sucs-site/htdocs/css/milliways.css)
===================================================================
--- trunk/htdocs/css/milliways.css (rev 0)
+++ trunk/htdocs/css/milliways.css 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,4 @@
+.date {background-color: #e0e0ff; }
+.time {background-color: #e0ffe0; }
+.user {background-color: #ffe0e0; }
+.taglist {background-color: #ffffe0; }
Modified: trunk/htdocs/css/sucs.css
===================================================================
--- trunk/htdocs/css/sucs.css 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/css/sucs.css 2015-04-05 16:42:47 UTC (rev 657)
@@ -35,27 +35,19 @@
/* --------------------------------------------------
Page corners
-------------------------------------------------- */
-
-.cornerTopLeft {
- height: 100%;
- background: url('/images/left-top-corner.png') top left no-repeat;
+#branding, #brandingC {
+ border-top-left-radius: 15px;
+ border-top-right-radius: 15px;
+ -moz-border-radius-topleft: 15px;
+ -moz-border-radius-topright: 15px;
}
-
-.cornerTopRight {
- height: 100%;
- background: url('/images/right-top-corner.png') top right no-repeat;
+#footer {
+ border-bottom-left-radius: 15px;
+ border-bottom-right-radius: 15px;
+ -moz-border-radius-bottomleft: 15px;
+ -moz-border-radius-bottomright: 15px;
}
-.cornerBottomLeft {
- height: 100%;
- background: url('/images/left-bottom-corner.png') bottom left no-repeat;
-}
-
-.cornerBottomRight {
- height: 100%;
- background: url('/images/right-bottom-corner.png') bottom right no-repeat;
-}
-
/* --------------------------------------------------
Branding
-------------------------------------------------- */
@@ -168,7 +160,11 @@
line-height: 1.5em;
font-size: 95%;
color: #ffc62b;
- background: #e76808 url('/images/menu-top-right.png') no-repeat top right;
+ background: #e76808;
+ border-top-right-radius: 7px;
+ border-bottom-right-radius: 7px;
+ -moz-border-radius-topright: 7px;
+ -moz-border-radius-bottomright: 7px;
padding-left: 1em;
margin-bottom: 2px;
}
@@ -179,6 +175,8 @@
#navigationC ul li a.select {
color: #fff0cd;
+ border-bottom-right-radius: 0;
+ -moz-border-radius-bottomright: 0;
}
/* --- Submenu item */
@@ -187,6 +185,10 @@
font-weight: normal;
padding-left: 2em;
background: #ffa405;
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 0;
+ -moz-border-radius-topright: 0;
+ -moz-border-radius-bottomright: 0;
color: #d45e08;
}
@@ -199,16 +201,31 @@
}
-#navigationC ul ul li a span {
- background: url('/images/menu-bottom-right.png') no-repeat bottom right;
+#navigationC ul ul li.lastsub a {
+ border-bottom-right-radius: 7px;
+ -moz-border-radius-bottomright: 7px;
}
-#navigationC ul li a span {
+#navigationC ul li.lastsub a {
display: block;
- background: url('/images/menu-bottom-right.png') no-repeat bottom right;
+ border-bottom-right-radius: 7px;
+ -moz-border-radius-bottomright: 7px;
}
/* --------------------------------------------------
+ Boxes
+ -------------------------------------------------- */
+div.cbb {
+ border-radius: 12px;
+ -moz-border-radius: 12px;
+ -webkit-border-radius: 12px;
+ padding: 1em;
+ box-shadow: 3px 3px 5px #777;
+ -moz-box-shadow: 3px 3px 5px #777;
+ -webkit-box-shadow: 3px 3px 5px #777;
+}
+
+/* --------------------------------------------------
Search box
-------------------------------------------------- */
@@ -265,6 +282,8 @@
.box {
background: #ffffff;
+ border-radius: 7px;
+ -moz-border-radius: 7px;
}
.box div.boxcontent {
@@ -278,56 +297,49 @@
}
.box .boxhead {
- background: #e76808 url('/images/menu-top-left.png') no-repeat top left;
+ background: #e76808;
+ border-top-left-radius: 7px;
+ border-top-right-radius: 7px;
+ -moz-border-radius-topleft: 7px;
+ -moz-border-radius-topright: 7px;
}
.box .hollowhead {
- background: #ffffff url('/images/border-bottom.png') repeat-x top;
+ background: #ffffff;
+ border-top: 2px solid #e76808;
+ border-left: 2px solid #e76808;
+ border-right: 2px solid #e76808;
+ border-top-left-radius: 7px;
+ border-top-right-radius: 7px;
+ -moz-border-radius-topleft: 7px;
+ -moz-border-radius-topright: 7px;
height: 5px;
margin: 0;
padding: 0;
}
-.box .hollowhead div {
- background: url('/images/border-top-left.png') no-repeat top left;
- height: 100%;
-}
-
-.box .hollowhead div div {
- background: url('/images/border-top-right.png') no-repeat top right;
- height: 100%;
-}
-
-
-.box .boxhead h2, .box .boxhead h3, .error .errorhead h3 {
- background: url('/images/menu-top-right.png') no-repeat top right;
-}
-
.box .boxfoot {
- background: #e76808 url('/images/menu-bottom-left.png') no-repeat bottom left;
+ background: #e76808;
+ border-bottom-left-radius: 7px;
+ border-bottom-right-radius: 7px;
+ -moz-border-radius-bottomleft: 7px;
+ -moz-border-radius-bottomright: 7px;
}
-.box .boxfoot p {
- background: url('/images/menu-bottom-right.png') no-repeat bottom right;
-}
-
.box .hollowfoot {
- background: #ffffff url('/images/border-bottom.png') repeat-x bottom;
+ background: #ffffff;
height: 5px;
margin: 0;
padding: 0;
+ border-bottom: 2px solid #e76808;
+ border-left: 2px solid #e76808;
+ border-right: 2px solid #e76808;
+ border-bottom-left-radius: 7px;
+ border-bottom-right-radius: 7px;
+ -moz-border-radius-bottomleft: 7px;
+ -moz-border-radius-bottomright: 7px;
}
-.box .hollowfoot div {
- background: url('/images/border-bottom-left.png') no-repeat bottom left;
- height: 100%;
-}
-
-.box .hollowfoot div div {
- background: url('/images/border-bottom-right.png') no-repeat bottom right;
- height: 100%;
-}
-
/* --------------------------------------------------
Error box
-------------------------------------------------- */
@@ -340,6 +352,11 @@
.error div.errorcontent {
background: #ffffff;
border: 2px solid #ff0000;
+ border-bottom-left-radius: 7px;
+ border-bottom-right-radius: 7px;
+ -moz-border-radius-bottomleft: 7px;
+ -moz-border-radius-bottomright: 7px;
+ padding-bottom: 0.5em;
}
.error .errorhead h3 {
@@ -347,41 +364,49 @@
}
.error .errorhead {
- background: #ff0000 url('/images/menu-top-left.png') no-repeat top left;
+ background: #ff0000;
+ border-top-left-radius: 7px;
+ border-top-right-radius: 7px;
+ -moz-border-radius-topleft: 7px;
+ -moz-border-radius-topright: 7px;
}
-.errorbar, .navbar {
+.errorbar, .navbar, .infobar {
margin: 0.5em 0 0 0;
font-size: 80%;
+ border-radius: 7px;
+ -moz-border-radius: 7px;
+ padding: 0.2em 0.5em;
}
.errorbar {
- background: #ff0000 url('/images/menu-top-left.png') no-repeat top left;
+ background: #ff0000;
color: #ffffff;
margin-right: 0.5em;
}
-.navbar {
- background: #e76808 url('/images/menu-top-left.png') no-repeat top left;
+.infobar {
+ background: #e76808;
+ color: #ffffff;
+ margin-right: 0.5em;
}
-.navbar a {
+.infobar a {
color: #ffc62b;
- font-weight: bold;
- text-decoration: none;
}
-.errorbar div, .navbar div {
- background: url('/images/menu-top-right.png') no-repeat top right;
+.infobar a:active {
+ color: #ffffff;
}
-.errorbar div div, .navbar div div {
- background: url('/images/menu-bottom-left.png') no-repeat bottom left;
+.navbar {
+ background: #e76808;
}
-.errorbar div div div, .navbar div div div {
- background: url('/images/menu-bottom-right.png') no-repeat bottom right;
- padding: 0.2em 0.5em;
+.navbar a {
+ color: #ffc62b;
+ font-weight: bold;
+ text-decoration: none;
}
/* --------------------------------------------------
Copied: trunk/htdocs/css/susignup-admin.css (from rev 656, branches/sucs-site/htdocs/css/susignup-admin.css)
===================================================================
--- trunk/htdocs/css/susignup-admin.css (rev 0)
+++ trunk/htdocs/css/susignup-admin.css 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,48 @@
+div.susignup-admin-menu {
+ float: left;
+ width: 22%;
+ margin-left: 10px;
+ background: #E76808;
+ border-radius: 15px;
+ border-radius: 15px;
+ -moz-border-radius: 15px;
+ -moz-border-radius: 15px;
+}
+
+div.susignup-admin-menu select {
+ position: relative;
+ width: 65%;
+}
+
+div.susignup-admin-menu label {
+ position: relative;
+ width: 9em;
+}
+
+div.susignup-admin-menu input#rnsubmit {
+ position: relative;
+ width: 70px;
+}
+
+#susignup-renewals {
+ width: 90%;
+ border: 1px solid black;
+ border-collapse: collapse;
+}
+
+#susignup-renewals td {
+ border: 1px solid black;
+ padding-left: 4px;
+ padding-right: 2px;
+}
+
+#susignup-renewals th {
+ border: 1px solid black;
+ text-align: center;
+ padding-left: 2px;
+ padding-right: 2px;
+}
+
+.centre{
+ text-align: center;
+}
Modified: trunk/htdocs/desktop/1024x768.html
===================================================================
--- trunk/htdocs/desktop/1024x768.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/desktop/1024x768.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -9,7 +9,7 @@
</style>
</head>
<body>
-<applet code="VncViewer.class" archive="VncViewer.jar" width="1024" height="768">
+<applet code="VncViewer.class" archive="VncViewer.jar" width="1024" height="798">
<param name="PORT" value="5902">
<param name="PASSWORD" value="">
</applet>
Modified: trunk/htdocs/desktop/640x480.html
===================================================================
--- trunk/htdocs/desktop/640x480.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/desktop/640x480.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -9,7 +9,7 @@
</style>
</head>
<body>
-<applet code="VncViewer.class" archive="VncViewer.jar" width="640" height="480">
+<applet code="VncViewer.class" archive="VncViewer.jar" width="640" height="510">
<param name="PORT" value="5900">
<param name="PASSWORD" value="">
</applet>
Modified: trunk/htdocs/desktop/800x600.html
===================================================================
--- trunk/htdocs/desktop/800x600.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/desktop/800x600.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -9,7 +9,7 @@
</style>
</head>
<body>
-<applet code="VncViewer.class" archive="VncViewer.jar" width="800" height="600">
+<applet code="VncViewer.class" archive="VncViewer.jar" width="800" height="630">
<param name="PORT" value="5901">
<param name="PASSWORD" value="">
</applet>
Modified: trunk/htdocs/desktop/VncViewer.jar
===================================================================
(Binary files differ)
Property changes on: trunk/htdocs/files
___________________________________________________________________
Added: svn:ignore
+ *.exe
Modified: trunk/htdocs/files/Help/mw-script.tar.gz
===================================================================
(Binary files differ)
Modified: trunk/htdocs/images/bananas/banana-bunch.png
===================================================================
(Binary files differ)
Copied: trunk/htdocs/images/bananas/banana-container.png (from rev 656, branches/sucs-site/htdocs/images/bananas/banana-container.png)
===================================================================
(Binary files differ)
Modified: trunk/htdocs/images/bananas/banana-crate.png
===================================================================
(Binary files differ)
Modified: trunk/htdocs/images/bananas/banana-g-1.png
===================================================================
(Binary files differ)
Modified: trunk/htdocs/images/bananas/banana-g-2.png
===================================================================
(Binary files differ)
Modified: trunk/htdocs/images/bananas/banana-g-3.png
===================================================================
(Binary files differ)
Modified: trunk/htdocs/images/bananas/banana-g-bunch.png
===================================================================
(Binary files differ)
Copied: trunk/htdocs/images/bananas/banana-g-container.png (from rev 656, branches/sucs-site/htdocs/images/bananas/banana-g-container.png)
===================================================================
(Binary files differ)
Modified: trunk/htdocs/images/bananas/banana-g-crate.png
===================================================================
(Binary files differ)
Modified: trunk/htdocs/images/bananas/banana-g-one.png
===================================================================
(Binary files differ)
Modified: trunk/htdocs/images/bananas/banana-one.png
===================================================================
(Binary files differ)
Modified: trunk/htdocs/images/bananas/banana-zero.png
===================================================================
(Binary files differ)
Modified: trunk/htdocs/images/bananas/banana1.png
===================================================================
(Binary files differ)
Modified: trunk/htdocs/images/bananas/banana2.png
===================================================================
(Binary files differ)
Modified: trunk/htdocs/images/bananas/banana3.png
===================================================================
(Binary files differ)
Modified: trunk/htdocs/images/border-bottom-left.png
===================================================================
(Binary files differ)
Modified: trunk/htdocs/images/border-bottom-right.png
===================================================================
(Binary files differ)
Modified: trunk/htdocs/images/border-bottom.png
===================================================================
(Binary files differ)
Copied: trunk/htdocs/images/border-top-left.gif (from rev 656, branches/sucs-site/htdocs/images/border-top-left.gif)
===================================================================
(Binary files differ)
Copied: trunk/htdocs/images/border-top-left.png (from rev 656, branches/sucs-site/htdocs/images/border-top-left.png)
===================================================================
(Binary files differ)
Copied: trunk/htdocs/images/border-top-right.gif (from rev 656, branches/sucs-site/htdocs/images/border-top-right.gif)
===================================================================
(Binary files differ)
Copied: trunk/htdocs/images/border-top-right.png (from rev 656, branches/sucs-site/htdocs/images/border-top-right.png)
===================================================================
(Binary files differ)
Modified: trunk/htdocs/images/borders.png
===================================================================
(Binary files differ)
Modified: trunk/htdocs/images/box.png
===================================================================
(Binary files differ)
Modified: trunk/htdocs/images/google.png
===================================================================
(Binary files differ)
Modified: trunk/htdocs/images/hostedby.png
===================================================================
(Binary files differ)
Modified: trunk/htdocs/images/left-bottom-corner.png
===================================================================
(Binary files differ)
Modified: trunk/htdocs/images/left-top-corner.png
===================================================================
(Binary files differ)
Modified: trunk/htdocs/images/menu-bottom-left.png
===================================================================
(Binary files differ)
Modified: trunk/htdocs/images/menu-bottom-right.png
===================================================================
(Binary files differ)
Modified: trunk/htdocs/images/menu-top-left.png
===================================================================
(Binary files differ)
Modified: trunk/htdocs/images/menu-top-right.png
===================================================================
(Binary files differ)
Modified: trunk/htdocs/images/orangefade-left.png
===================================================================
(Binary files differ)
Modified: trunk/htdocs/images/right-bottom-corner.png
===================================================================
(Binary files differ)
Modified: trunk/htdocs/images/right-top-corner.png
===================================================================
(Binary files differ)
Copied: trunk/htdocs/images/shame.php (from rev 656, branches/sucs-site/htdocs/images/shame.php)
===================================================================
--- trunk/htdocs/images/shame.php (rev 0)
+++ trunk/htdocs/images/shame.php 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1 @@
+link ../../components/disk.graph/index.php
\ No newline at end of file
Copied: trunk/htdocs/images/spinner.gif (from rev 656, branches/sucs-site/htdocs/images/spinner.gif)
===================================================================
(Binary files differ)
Modified: trunk/htdocs/images/sucslogo-halo.png
===================================================================
(Binary files differ)
Modified: trunk/htdocs/images/sucslogo-main.png
===================================================================
(Binary files differ)
Modified: trunk/htdocs/images/sucslogo-opaque.png
===================================================================
(Binary files differ)
Modified: trunk/htdocs/images/sucslogo.png
===================================================================
(Binary files differ)
Modified: trunk/htdocs/index.php
===================================================================
--- trunk/htdocs/index.php 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/index.php 2015-04-05 16:42:47 UTC (rev 657)
@@ -14,8 +14,8 @@
Settings
-------------------------------------------------------- */
-require_once("settings.php");
-if (!defined('SUCS_BASEDIR')) {
+include("settings.php");
+if (!(isset($base) && isset($preferred_hostname) && isset($dbname))) {
echo "Website unconfigured";
exit();
}
@@ -24,42 +24,49 @@
Libraries
-------------------------------------------------------- */
// Include our custom error handling business
-require_once("../lib/error.php");
+require("../lib/error.php");
// Include the Smarty templating engine
-require_once(SMARTY_DIR."Smarty.class.php");
-$smarty = new Smarty;
-$smarty->template_dir = SUCS_BASEDIR."templates";
-$smarty->compile_dir = SUCS_BASEDIR."templates_c";
-$smarty->plugins_dir[] = SUCS_BASEDIR."plugins";
+define('SMARTY_DIR', '/usr/share/php/smarty3/');
+require("/usr/share/php/smarty3/SmartyBC.class.php");
+$smarty = new SmartyBC();
+$smarty->setTemplateDir($base."templates");
+$smarty->setCompileDir($base."templates_c");
+$smarty->addPluginsDir($base."plugins");
-// Initialise the database
-require_once(ADODB_DIR."adodb.inc.php");
-$DB = NewADOConnection(SUCS_DBTYPE);
-$DB->Connect('dbname='.SUCS_DBNAME);
+$smarty->assign("baseurl", $baseurl);
+
+// Initialise the sucssite database conn
+require("/usr/share/php/adodb/adodb.inc.php");
+$DB = NewADOConnection('postgres9');
+$DB->Connect('dbname='.$dbname.' user='.$dbuser);
+$DB->SetCharSet('utf8');
$DB->SetFetchMode(ADODB_FETCH_ASSOC);
+// Initialise the sucs database conn
+$sucsDB = NewADOConnection('postgres9');
+$sucsDB->Connect('dbname='.$sucsdbname.' user='.$dbuser);
+$sucsDB->SetCharSet('utf8');
+$sucsDB->SetFetchMode(ADODB_FETCH_ASSOC);
+
// Include the session library
-require(SUCS_BASEDIR."lib/session.php");
+require($base."lib/session.php");
+$session = new Session;
+$smarty->assign_by_ref("session", $session);
-switch (SUCS_AUTH_METHOD) {
- case "LDAP":
- $session = new SessionLDAP;
- break;
- case "DB":
- default:
- $session = new Session;
+
+// include feedback form stuff
+if ($session->loggedin) {
+ include("../lib/page-feedback.php");
}
-$smarty->assign_by_ref("session", $session);
-
/* --------------------------------------------------------
Debugging
-------------------------------------------------------- */
// Turn on adodb debugging by uncommenting:
-//$DB->debug = TRUE;
+//$DB->debug = true;
// Turn on Smarty debugging by uncommenting:
//$smarty->assign("debug",TRUE);
@@ -67,7 +74,6 @@
// Should we display unexpected output from components?
$compdebug = TRUE;
-
/* --------------------------------------------------------
Read Browser's settings
-------------------------------------------------------- */
@@ -94,27 +100,32 @@
// SSL?
- $ssl_path = @$_SERVER['REQUEST_URI'];
- if (($n=strpos($ssl_path,"?"))!==FALSE) $ssl_path=substr($ssl_path,0,$n);
-if (SUCS_USE_HTTPS) {
- $ssl_url = "https://".SUCS_PREFERRED_HOSTNAME.$ssl_path;
+$ssl_path = @$_SERVER['REQUEST_URI'];
+if (($n=strpos($ssl_path,"?"))!==FALSE) $ssl_path=substr($ssl_path,0,$n);
+$ssl_url = "https://".$preferred_hostname.$ssl_path;
+$smarty->assign("ssl_url", $ssl_url);
+
+// Need to use ORIG_PATH_INFO in user homedirs
+if (isset($_SERVER['PATH_INFO'])) {
+ $pathinfo = $_SERVER['PATH_INFO'];
} else {
- $ssl_url = "http://".SUCS_PREFERRED_HOSTNAME.$ssl_path;
+ $pathinfo = @$_SERVER['ORIG_PATH_INFO'];
}
-$smarty->assign("ssl_url", $ssl_url);
-
// Determine which component to run
-$pathlist = explode('/', parse_url(rawurldecode(str_replace("_", " ", @$_SERVER['PATH_INFO'])),PHP_URL_PATH));
+$pathlist = explode('/', parse_url($pathinfo,PHP_URL_PATH));
while (end($pathlist) === "") array_pop($pathlist);
$smarty->assign_by_ref("pathlist", $pathlist);
$path = '';
$query = "select * from pagemap where path='/' ";
+$params = array();
foreach($pathlist as $item) {
if ($item && $item != '/') {
- $query .= "or path = '".addslashes($path)."/*' ";
- $path .= "/$item";
- $query .= "or path = '".addslashes($path)."' ";
+ $query .= "or path=? ";
+ $params[] = $path."/*";
+ $path .= "/$item";
+ $query .= "or path=? ";
+ $params[] = $path;
}
}
@@ -122,7 +133,7 @@
$smarty->assign_by_ref("path", $path);
$query .= "order by depth desc";
-$pagemap = $DB->GetAll($query);
+$pagemap = $DB->GetAll($query, $params);
//echo $query;
if (!$pagemap) $smarty->assign("error", $DB->ErrorMsg());
if (!$pagemap || count($pagemap)<1) {
@@ -131,7 +142,6 @@
} else {
$smarty->assign("component", $pagemap[0]['component']);
$component = $pagemap[0];
-
}
if ($path == "") $path="/";
@@ -140,10 +150,11 @@
$smarty->assign("title", "Set Me");
$smarty->assign("body", "Empty Body");
-include(SUCS_BASEDIR."components/menu.php");
+include($base."components/menu.php");
+//include($base."components/search.php");
// Load the component
-$comppath = SUCS_BASEDIR."components/".$component['component'].".php";
+$comppath = $base."components/".$component['component'].".php";
$compoutput = "";
if (file_exists($comppath)) {
ob_start();
@@ -151,6 +162,7 @@
$compoutput = ob_get_contents();
ob_end_clean();
} else {
+ header("HTTP/1.1 404 Not Found");
$smarty->assign("body", "Component ".$component['component']." not found");
}
@@ -160,13 +172,9 @@
// Render the results
if (!(isset($no_template)) || (!$no_template)) {
// Send appropriate Content-Type
- if (ereg('application/xhtml\+xml', @$_SERVER['HTTP_ACCEPT'])) {
- header('Content-Type: application/xhtml+xml');
- echo "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
- } else {
- header('Content-Type: text/html');
- }
+ header('Content-Type:text/html; charset=UTF-8');
+
$smarty->display("head.tpl");
$smarty->display("index.tpl");
if ($compdebug) {
@@ -184,7 +192,7 @@
$smarty->assign("totaltime", $totaltime);
}
-$smarty->display("foot".$language['file'].".tpl");
+ $smarty->display("foot".$language['file'].".tpl");
} else {
echo $compoutput;
}
@@ -192,4 +200,5 @@
// Save any changes made to the session data
$session->save();
-?>
+
+?>
\ No newline at end of file
Copied: trunk/htdocs/js/jquery.js (from rev 656, branches/sucs-site/htdocs/js/jquery.js)
===================================================================
--- trunk/htdocs/js/jquery.js (rev 0)
+++ trunk/htdocs/js/jquery.js 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,19 @@
+/*
+ * jQuery JavaScript Library v1.3.2
+ * http://jquery.com/
+ *
+ * Copyright (c) 2009 John Resig
+ * Dual licensed under the MIT and GPL licenses.
+ * http://docs.jquery.com/License
+ *
+ * Date: 2009-02-19 17:34:21 -0500 (Thu, 19 Feb 2009)
+ * Revision: 6246
+ */
+(function(){var l=this,g,y=l.jQuery,p=l.$,o=l.jQuery=l.$=function(E,F){return new o.fn.init(E,F)},D=/^[^<]*(<(.|\s)+>)[^>]*$|^#([\w-]+)$/,f=/^.[^:#\[\.,]*$/;o.fn=o.prototype={init:function(E,H){E=E||document;if(E.nodeType){this[0]=E;this.length=1;this.context=E;return this}if(typeof E==="string"){var G=D.exec(E);if(G&&(G[1]||!H)){if(G[1]){E=o.clean([G[1]],H)}else{var I=document.getElementById(G[3]);if(I&&I.id!=G[3]){return o().find(E)}var F=o(I||[]);F.context=document;F.selector=E;return F}}else{return o(H).find(E)}}else{if(o.isFunction(E)){return o(document).ready(E)}}if(E.selector&&E.context){this.selector=E.selector;this.context=E.context}return this.setArray(o.isArray(E)?E:o.makeArray(E))},selector:"",jquery:"1.3.2",size:function(){return this.length},get:function(E){return E===g?Array.prototype.slice.call(this):this[E]},pushStack:function(F,H,E){var G=o(F);G.prevObject=this;G.context=this.context;if(H==="find"){G.selector=this.selector+(this.selector?" ":"")+E}else{if(H){G.selector=this.selector+"."+H+"("+E+")"}}return G},setArray:function(E){this.length=0;Array.prototype.push.apply(this,E);return this},each:function(F,E){return o.each(this,F,E)},index:function(E){return o.inArray(E&&E.jquery?E[0]:E,this)},attr:function(F,H,G){var E=F;if(typeof F==="string"){if(H===g){return this[0]&&o[G||"attr"](this[0],F)}else{E={};E[F]=H}}return this.each(function(I){for(F in E){o.attr(G?this.style:this,F,o.prop(this,E[F],G,I,F))}})},css:function(E,F){if((E=="width"||E=="height")&&parseFloat(F)<0){F=g}return this.attr(E,F,"curCSS")},text:function(F){if(typeof F!=="object"&&F!=null){return this.empty().append((this[0]&&this[0].ownerDocument||document).createTextNode(F))}var E="";o.each(F||this,function(){o.each(this.childNodes,function(){if(this.nodeType!=8){E+=this.nodeType!=1?this.nodeValue:o.fn.text([this])}})});return E},wrapAll:function(E){if(this[0]){var F=o(E,this[0].ownerDocument).clone();if(this[0].parentNode){F.insertBefore(this[0])}F.map(function(){var G=this;while(G.firstChild){G=G.firstChild}return G}).append(this)}return this},wrapInner:function(E){return this.each(function(){o(this).contents().wrapAll(E)})},wrap:function(E){return this.each(function(){o(this).wrapAll(E)})},append:function(){return this.domManip(arguments,true,function(E){if(this.nodeType==1){this.appendChild(E)}})},prepend:function(){return this.domManip(arguments,true,function(E){if(this.nodeType==1){this.insertBefore(E,this.firstChild)}})},before:function(){return this.domManip(arguments,false,function(E){this.parentNode.insertBefore(E,this)})},after:function(){return this.domManip(arguments,false,function(E){this.parentNode.insertBefore(E,this.nextSibling)})},end:function(){return this.prevObject||o([])},push:[].push,sort:[].sort,splice:[].splice,find:function(E){if(this.length===1){var F=this.pushStack([],"find",E);F.length=0;o.find(E,this[0],F);return F}else{return this.pushStack(o.unique(o.map(this,function(G){return o.find(E,G)})),"find",E)}},clone:function(G){var E=this.map(function(){if(!o.support.noCloneEvent&&!o.isXMLDoc(this)){var I=this.outerHTML;if(!I){var J=this.ownerDocument.createElement("div");J.appendChild(this.cloneNode(true));I=J.innerHTML}return o.clean([I.replace(/ jQuery\d+="(?:\d+|null)"/g,"").replace(/^\s*/,"")])[0]}else{return this.cloneNode(true)}});if(G===true){var H=this.find("*").andSelf(),F=0;E.find("*").andSelf().each(function(){if(this.nodeName!==H[F].nodeName){return}var I=o.data(H[F],"events");for(var K in I){for(var J in I[K]){o.event.add(this,K,I[K][J],I[K][J].data)}}F++})}return E},filter:function(E){return this.pushStack(o.isFunction(E)&&o.grep(this,function(G,F){return E.call(G,F)})||o.multiFilter(E,o.grep(this,function(F){return F.nodeType===1})),"filter",E)},closest:function(E){var G=o.expr.match.POS.test(E)?o(E):null,F=0;return this.map(function(){var H=this;while(H&&H.ownerDocument){if(G?G.index(H)>-1:o(H).is(E)){o.data(H,"closest",F);return H}H=H.parentNode;F++}})},not:function(E){if(typeof E==="string"){if(f.test(E)){return this.pushStack(o.multiFilter(E,this,true),"not",E)}else{E=o.multiFilter(E,this)}}var F=E.length&&E[E.length-1]!==g&&!E.nodeType;return this.filter(function(){return F?o.inArray(this,E)<0:this!=E})},add:function(E){return this.pushStack(o.unique(o.merge(this.get(),typeof E==="string"?o(E):o.makeArray(E))))},is:function(E){return !!E&&o.multiFilter(E,this).length>0},hasClass:function(E){return !!E&&this.is("."+E)},val:function(K){if(K===g){var E=this[0];if(E){if(o.nodeName(E,"option")){return(E.attributes.value||{}).specified?E.value:E.text}if(o.nodeName(E,"select")){var I=E.selectedIndex,L=[],M=E.options,H=E.type=="select-one";if(I<0){return null}for(var F=H?I:0,J=H?I+1:M.length;F<J;F++){var G=M[F];if(G.selected){K=o(G).val();if(H){return K}L.push(K)}}return L}return(E.value||"").replace(/\r/g,"")}return g}if(typeof K==="number"){K+=""}return this.each(function(){if(this.nodeType!=1){return}if(o.isArray(K)&&/radio|checkbox/.test(this.type)){this.checked=(o.inArray(this.value,K)>=0||o.inArray(this.name,K)>=0)}else{if(o.nodeName(this,"select")){var N=o.makeArray(K);o("option",this).each(function(){this.selected=(o.inArray(this.value,N)>=0||o.inArray(this.text,N)>=0)});if(!N.length){this.selectedIndex=-1}}else{this.value=K}}})},html:function(E){return E===g?(this[0]?this[0].innerHTML.replace(/ jQuery\d+="(?:\d+|null)"/g,""):null):this.empty().append(E)},replaceWith:function(E){return this.after(E).remove()},eq:function(E){return this.slice(E,+E+1)},slice:function(){return this.pushStack(Array.prototype.slice.apply(this,arguments),"slice",Array.prototype.slice.call(arguments).join(","))},map:function(E){return this.pushStack(o.map(this,function(G,F){return E.call(G,F,G)}))},andSelf:function(){return this.add(this.prevObject)},domManip:function(J,M,L){if(this[0]){var I=(this[0].ownerDocument||this[0]).createDocumentFragment(),F=o.clean(J,(this[0].ownerDocument||this[0]),I),H=I.firstChild;if(H){for(var G=0,E=this.length;G<E;G++){L.call(K(this[G],H),this.length>1||G>0?I.cloneNode(true):I)}}if(F){o.each(F,z)}}return this;function K(N,O){return M&&o.nodeName(N,"table")&&o.nodeName(O,"tr")?(N.getElementsByTagName("tbody")[0]||N.appendChild(N.ownerDocument.createElement("tbody"))):N}}};o.fn.init.prototype=o.fn;function z(E,F){if(F.src){o.ajax({url:F.src,async:false,dataType:"script"})}else{o.globalEval(F.text||F.textContent||F.innerHTML||"")}if(F.parentNode){F.parentNode.removeChild(F)}}function e(){return +new Date}o.extend=o.fn.extend=function(){var J=arguments[0]||{},H=1,I=arguments.length,E=false,G;if(typeof J==="boolean"){E=J;J=arguments[1]||{};H=2}if(typeof J!=="object"&&!o.isFunction(J)){J={}}if(I==H){J=this;--H}for(;H<I;H++){if((G=arguments[H])!=null){for(var F in G){var K=J[F],L=G[F];if(J===L){continue}if(E&&L&&typeof L==="object"&&!L.nodeType){J[F]=o.extend(E,K||(L.length!=null?[]:{}),L)}else{if(L!==g){J[F]=L}}}}}return J};var b=/z-?index|font-?weight|opacity|zoom|line-?height/i,q=document.defaultView||{},s=Object.prototype.toString;o.extend({noConflict:function(E){l.$=p;if(E){l.jQuery=y}return o},isFunction:function(E){return s.call(E)==="[object Function]"},isArray:function(E){return s.call(E)==="[object Array]"},isXMLDoc:function(E){return E.nodeType===9&&E.documentElement.nodeName!=="HTML"||!!E.ownerDocument&&o.isXMLDoc(E.ownerDocument)},globalEval:function(G){if(G&&/\S/.test(G)){var F=document.getElementsByTagName("head")[0]||document.documentElement,E=document.createElement("script");E.type="text/javascript";if(o.support.scriptEval){E.appendChild(document.createTextNode(G))}else{E.text=G}F.insertBefore(E,F.firstChild);F.removeChild(E)}},nodeName:function(F,E){return F.nodeName&&F.nodeName.toUpperCase()==E.toUpperCase()},each:function(G,K,F){var E,H=0,I=G.length;if(F){if(I===g){for(E in G){if(K.apply(G[E],F)===false){break}}}else{for(;H<I;){if(K.apply(G[H++],F)===false){break}}}}else{if(I===g){for(E in G){if(K.call(G[E],E,G[E])===false){break}}}else{for(var J=G[0];H<I&&K.call(J,H,J)!==false;J=G[++H]){}}}return G},prop:function(H,I,G,F,E){if(o.isFunction(I)){I=I.call(H,F)}return typeof I==="number"&&G=="curCSS"&&!b.test(E)?I+"px":I},className:{add:function(E,F){o.each((F||"").split(/\s+/),function(G,H){if(E.nodeType==1&&!o.className.has(E.className,H)){E.className+=(E.className?" ":"")+H}})},remove:function(E,F){if(E.nodeType==1){E.className=F!==g?o.grep(E.className.split(/\s+/),function(G){return !o.className.has(F,G)}).join(" "):""}},has:function(F,E){return F&&o.inArray(E,(F.className||F).toString().split(/\s+/))>-1}},swap:function(H,G,I){var E={};for(var F in G){E[F]=H.style[F];H.style[F]=G[F]}I.call(H);for(var F in G){H.style[F]=E[F]}},css:function(H,F,J,E){if(F=="width"||F=="height"){var L,G={position:"absolute",visibility:"hidden",display:"block"},K=F=="width"?["Left","Right"]:["Top","Bottom"];function I(){L=F=="width"?H.offsetWidth:H.offsetHeight;if(E==="border"){return}o.each(K,function(){if(!E){L-=parseFloat(o.curCSS(H,"padding"+this,true))||0}if(E==="margin"){L+=parseFloat(o.curCSS(H,"margin"+this,true))||0}else{L-=parseFloat(o.curCSS(H,"border"+this+"Width",true))||0}})}if(H.offsetWidth!==0){I()}else{o.swap(H,G,I)}return Math.max(0,Math.round(L))}return o.curCSS(H,F,J)},curCSS:function(I,F,G){var L,E=I.style;if(F=="opacity"&&!o.support.opacity){L=o.attr(E,"opacity");return L==""?"1":L}if(F.match(/float/i)){F=w}if(!G&&E&&E[F]){L=E[F]}else{if(q.getComputedStyle){if(F.match(/float/i)){F="float"}F=F.replace(/([A-Z])/g,"-$1").toLowerCase();var M=q.getComputedStyle(I,null);if(M){L=M.getPropertyValue(F)}if(F=="opacity"&&L==""){L="1"}}else{if(I.currentStyle){var J=F.replace(/\-(\w)/g,function(N,O){return O.toUpperCase()});L=I.currentStyle[F]||I.currentStyle[J];if(!/^\d+(px)?$/i.test(L)&&/^\d/.test(L)){var H=E.left,K=I.runtimeStyle.left;I.runtimeStyle.left=I.currentStyle.left;E.left=L||0;L=E.pixelLeft+"px";E.left=H;I.runtimeStyle.left=K}}}}return L},clean:function(F,K,I){K=K||document;if(typeof K.createElement==="undefined"){K=K.ownerDocument||K[0]&&K[0].ownerDocument||document}if(!I&&F.length===1&&typeof F[0]==="string"){var H=/^<(\w+)\s*\/?>$/.exec(F[0]);if(H){return[K.createElement(H[1])]}}var G=[],E=[],L=K.createElement("div");o.each(F,function(P,S){if(typeof S==="number"){S+=""}if(!S){return}if(typeof S==="string"){S=S.replace(/(<(\w+)[^>]*?)\/>/g,function(U,V,T){return T.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i)?U:V+"></"+T+">"});var O=S.replace(/^\s+/,"").substring(0,10).toLowerCase();var Q=!O.indexOf("<opt")&&[1,"<select multiple='multiple'>","</select>"]||!O.indexOf("<leg")&&[1,"<fieldset>","</fieldset>"]||O.match(/^<(thead|tbody|tfoot|colg|cap)/)&&[1,"<table>","</table>"]||!O.indexOf("<tr")&&[2,"<table><tbody>","</tbody></table>"]||(!O.indexOf("<td")||!O.indexOf("<th"))&&[3,"<table><tbody><tr>","</tr></tbody></table>"]||!O.indexOf("<col")&&[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"]||!o.support.htmlSerialize&&[1,"div<div>","</div>"]||[0,"",""];L.innerHTML=Q[1]+S+Q[2];while(Q[0]--){L=L.lastChild}if(!o.support.tbody){var R=/<tbody/i.test(S),N=!O.indexOf("<table")&&!R?L.firstChild&&L.firstChild.childNodes:Q[1]=="<table>"&&!R?L.childNodes:[];for(var M=N.length-1;M>=0;--M){if(o.nodeName(N[M],"tbody")&&!N[M].childNodes.length){N[M].parentNode.removeChild(N[M])}}}if(!o.support.leadingWhitespace&&/^\s/.test(S)){L.insertBefore(K.createTextNode(S.match(/^\s*/)[0]),L.firstChild)}S=o.makeArray(L.childNodes)}if(S.nodeType){G.push(S)}else{G=o.merge(G,S)}});if(I){for(var J=0;G[J];J++){if(o.nodeName(G[J],"script")&&(!G[J].type||G[J].type.toLowerCase()==="text/javascript")){E.push(G[J].parentNode?G[J].parentNode.removeChild(G[J]):G[J])}else{if(G[J].nodeType===1){G.splice.apply(G,[J+1,0].concat(o.makeArray(G[J].getElementsByTagName("script"))))}I.appendChild(G[J])}}return E}return G},attr:function(J,G,K){if(!J||J.nodeType==3||J.nodeType==8){return g}var H=!o.isXMLDoc(J),L=K!==g;G=H&&o.props[G]||G;if(J.tagName){var F=/href|src|style/.test(G);if(G=="selected"&&J.parentNode){J.parentNode.selectedIndex}if(G in J&&H&&!F){if(L){if(G=="type"&&o.nodeName(J,"input")&&J.parentNode){throw"type property can't be changed"}J[G]=K}if(o.nodeName(J,"form")&&J.getAttributeNode(G)){return J.getAttributeNode(G).nodeValue}if(G=="tabIndex"){var I=J.getAttributeNode("tabIndex");return I&&I.specified?I.value:J.nodeName.match(/(button|input|object|select|textarea)/i)?0:J.nodeName.match(/^(a|area)$/i)&&J.href?0:g}return J[G]}if(!o.support.style&&H&&G=="style"){return o.attr(J.style,"cssText",K)}if(L){J.setAttribute(G,""+K)}var E=!o.support.hrefNormalized&&H&&F?J.getAttribute(G,2):J.getAttribute(G);return E===null?g:E}if(!o.support.opacity&&G=="opacity"){if(L){J.zoom=1;J.filter=(J.filter||"").replace(/alpha\([^)]*\)/,"")+(parseInt(K)+""=="NaN"?"":"alpha(opacity="+K*100+")")}return J.filter&&J.filter.indexOf("opacity=")>=0?(parseFloat(J.filter.match(/opacity=([^)]*)/)[1])/100)+"":""}G=G.replace(/-([a-z])/ig,function(M,N){return N.toUpperCase()});if(L){J[G]=K}return J[G]},trim:function(E){return(E||"").replace(/^\s+|\s+$/g,"")},makeArray:function(G){var E=[];if(G!=null){var F=G.length;if(F==null||typeof G==="string"||o.isFunction(G)||G.setInterval){E[0]=G}else{while(F){E[--F]=G[F]}}}return E},inArray:function(G,H){for(var E=0,F=H.length;E<F;E++){if(H[E]===G){return E}}return -1},merge:function(H,E){var F=0,G,I=H.length;if(!o.support.getAll){while((G=E[F++])!=null){if(G.nodeType!=8){H[I++]=G}}}else{while((G=E[F++])!=null){H[I++]=G}}return H},unique:function(K){var F=[],E={};try{for(var G=0,H=K.length;G<H;G++){var J=o.data(K[G]);if(!E[J]){E[J]=true;F.push(K[G])}}}catch(I){F=K}return F},grep:function(F,J,E){var G=[];for(var H=0,I=F.length;H<I;H++){if(!E!=!J(F[H],H)){G.push(F[H])}}return G},map:function(E,J){var F=[];for(var G=0,H=E.length;G<H;G++){var I=J(E[G],G);if(I!=null){F[F.length]=I}}return F.concat.apply([],F)}});var C=navigator.userAgent.toLowerCase();o.browser={version:(C.match(/.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/)||[0,"0"])[1],safari:/webkit/.test(C),opera:/opera/.test(C),msie:/msie/.test(C)&&!/opera/.test(C),mozilla:/mozilla/.test(C)&&!/(compatible|webkit)/.test(C)};o.each({parent:function(E){return E.parentNode},parents:function(E){return o.dir(E,"parentNode")},next:function(E){return o.nth(E,2,"nextSibling")},prev:function(E){return o.nth(E,2,"previousSibling")},nextAll:function(E){return o.dir(E,"nextSibling")},prevAll:function(E){return o.dir(E,"previousSibling")},siblings:function(E){return o.sibling(E.parentNode.firstChild,E)},children:function(E){return o.sibling(E.firstChild)},contents:function(E){return o.nodeName(E,"iframe")?E.contentDocument||E.contentWindow.document:o.makeArray(E.childNodes)}},function(E,F){o.fn[E]=function(G){var H=o.map(this,F);if(G&&typeof G=="string"){H=o.multiFilter(G,H)}return this.pushStack(o.unique(H),E,G)}});o.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(E,F){o.fn[E]=function(G){var J=[],L=o(G);for(var K=0,H=L.length;K<H;K++){var I=(K>0?this.clone(true):this).get();o.fn[F].apply(o(L[K]),I);J=J.concat(I)}return this.pushStack(J,E,G)}});o.each({removeAttr:function(E){o.attr(this,E,"");if(this.nodeType==1){this.removeAttribute(E)}},addClass:function(E){o.className.add(this,E)},removeClass:function(E){o.className.remove(this,E)},toggleClass:function(F,E){if(typeof E!=="boolean"){E=!o.className.has(this,F)}o.className[E?"add":"remove"](this,F)},remove:function(E){if(!E||o.filter(E,[this]).length){o("*",this).add([this]).each(function(){o.event.remove(this);o.removeData(this)});if(this.parentNode){this.parentNode.removeChild(this)}}},empty:function(){o(this).children().remove();while(this.firstChild){this.removeChild(this.firstChild)}}},function(E,F){o.fn[E]=function(){return this.each(F,arguments)}});function j(E,F){return E[0]&&parseInt(o.curCSS(E[0],F,true),10)||0}var h="jQuery"+e(),v=0,A={};o.extend({cache:{},data:function(F,E,G){F=F==l?A:F;var H=F[h];if(!H){H=F[h]=++v}if(E&&!o.cache[H]){o.cache[H]={}}if(G!==g){o.cache[H][E]=G}return E?o.cache[H][E]:H},removeData:function(F,E){F=F==l?A:F;var H=F[h];if(E){if(o.cache[H]){delete o.cache[H][E];E="";for(E in o.cache[H]){break}if(!E){o.removeData(F)}}}else{try{delete F[h]}catch(G){if(F.removeAttribute){F.removeAttribute(h)}}delete o.cache[H]}},queue:function(F,E,H){if(F){E=(E||"fx")+"queue";var G=o.data(F,E);if(!G||o.isArray(H)){G=o.data(F,E,o.makeArray(H))}else{if(H){G.push(H)}}}return G},dequeue:function(H,G){var E=o.queue(H,G),F=E.shift();if(!G||G==="fx"){F=E[0]}if(F!==g){F.call(H)}}});o.fn.extend({data:function(E,G){var H=E.split(".");H[1]=H[1]?"."+H[1]:"";if(G===g){var F=this.triggerHandler("getData"+H[1]+"!",[H[0]]);if(F===g&&this.length){F=o.data(this[0],E)}return F===g&&H[1]?this.data(H[0]):F}else{return this.trigger("setData"+H[1]+"!",[H[0],G]).each(function(){o.data(this,E,G)})}},removeData:function(E){return this.each(function(){o.removeData(this,E)})},queue:function(E,F){if(typeof E!=="string"){F=E;E="fx"}if(F===g){return o.queue(this[0],E)}return this.each(function(){var G=o.queue(this,E,F);if(E=="fx"&&G.length==1){G[0].call(this)}})},dequeue:function(E){return this.each(function(){o.dequeue(this,E)})}});
+/*
+ * Sizzle CSS Selector Engine - v0.9.3
+ * Copyright 2009, The Dojo Foundation
+ * Released under the MIT, BSD, and GPL Licenses.
+ * More information: http://sizzlejs.com/
+ */
+(function(){var R=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?/g,L=0,H=Object.prototype.toString;var F=function(Y,U,ab,ac){ab=ab||[];U=U||document;if(U.nodeType!==1&&U.nodeType!==9){return[]}if(!Y||typeof Y!=="string"){return ab}var Z=[],W,af,ai,T,ad,V,X=true;R.lastIndex=0;while((W=R.exec(Y))!==null){Z.push(W[1]);if(W[2]){V=RegExp.rightContext;break}}if(Z.length>1&&M.exec(Y)){if(Z.length===2&&I.relative[Z[0]]){af=J(Z[0]+Z[1],U)}else{af=I.relative[Z[0]]?[U]:F(Z.shift(),U);while(Z.length){Y=Z.shift();if(I.relative[Y]){Y+=Z.shift()}af=J(Y,af)}}}else{var ae=ac?{expr:Z.pop(),set:E(ac)}:F.find(Z.pop(),Z.length===1&&U.parentNode?U.parentNode:U,Q(U));af=F.filter(ae.expr,ae.set);if(Z.length>0){ai=E(af)}else{X=false}while(Z.length){var ah=Z.pop(),ag=ah;if(!I.relative[ah]){ah=""}else{ag=Z.pop()}if(ag==null){ag=U}I.relative[ah](ai,ag,Q(U))}}if(!ai){ai=af}if(!ai){throw"Syntax error, unrecognized expression: "+(ah||Y)}if(H.call(ai)==="[object Array]"){if(!X){ab.push.apply(ab,ai)}else{if(U.nodeType===1){for(var aa=0;ai[aa]!=null;aa++){if(ai[aa]&&(ai[aa]===true||ai[aa].nodeType===1&&K(U,ai[aa]))){ab.push(af[aa])}}}else{for(var aa=0;ai[aa]!=null;aa++){if(ai[aa]&&ai[aa].nodeType===1){ab.push(af[aa])}}}}}else{E(ai,ab)}if(V){F(V,U,ab,ac);if(G){hasDuplicate=false;ab.sort(G);if(hasDuplicate){for(var aa=1;aa<ab.length;aa++){if(ab[aa]===ab[aa-1]){ab.splice(aa--,1)}}}}}return ab};F.matches=function(T,U){return F(T,null,null,U)};F.find=function(aa,T,ab){var Z,X;if(!aa){return[]}for(var W=0,V=I.order.length;W<V;W++){var Y=I.order[W],X;if((X=I.match[Y].exec(aa))){var U=RegExp.leftContext;if(U.substr(U.length-1)!=="\\"){X[1]=(X[1]||"").replace(/\\/g,"");Z=I.find[Y](X,T,ab);if(Z!=null){aa=aa.replace(I.match[Y],"");break}}}}if(!Z){Z=T.getElementsByTagName("*")}return{set:Z,expr:aa}};F.filter=function(ad,ac,ag,W){var V=ad,ai=[],aa=ac,Y,T,Z=ac&&ac[0]&&Q(ac[0]);while(ad&&ac.length){for(var ab in I.filter){if((Y=I.match[ab].exec(ad))!=null){var U=I.filter[ab],ah,af;T=false;if(aa==ai){ai=[]}if(I.preFilter[ab]){Y=I.preFilter[ab](Y,aa,ag,ai,W,Z);if(!Y){T=ah=true}else{if(Y===true){continue}}}if(Y){for(var X=0;(af=aa[X])!=null;X++){if(af){ah=U(af,Y,X,aa);var ae=W^!!ah;if(ag&&ah!=null){if(ae){T=true}else{aa[X]=false}}else{if(ae){ai.push(af);T=true}}}}}if(ah!==g){if(!ag){aa=ai}ad=ad.replace(I.match[ab],"");if(!T){return[]}break}}}if(ad==V){if(T==null){throw"Syntax error, unrecognized expression: "+ad}else{break}}V=ad}return aa};var I=F.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF_-]|\\.)+)/,CLASS:/\.((?:[\w\u00c0-\uFFFF_-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF_-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF_-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*_-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\((even|odd|[\dn+-]*)\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF_-]|\\.)+)(?:\((['"]*)((?:\([^\)]+\)|[^\2\(\)]*)+)\2\))?/},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(T){return T.getAttribute("href")}},relative:{"+":function(aa,T,Z){var X=typeof T==="string",ab=X&&!/\W/.test(T),Y=X&&!ab;if(ab&&!Z){T=T.toUpperCase()}for(var W=0,V=aa.length,U;W<V;W++){if((U=aa[W])){while((U=U.previousSibling)&&U.nodeType!==1){}aa[W]=Y||U&&U.nodeName===T?U||false:U===T}}if(Y){F.filter(T,aa,true)}},">":function(Z,U,aa){var X=typeof U==="string";if(X&&!/\W/.test(U)){U=aa?U:U.toUpperCase();for(var V=0,T=Z.length;V<T;V++){var Y=Z[V];if(Y){var W=Y.parentNode;Z[V]=W.nodeName===U?W:false}}}else{for(var V=0,T=Z.length;V<T;V++){var Y=Z[V];if(Y){Z[V]=X?Y.parentNode:Y.parentNode===U}}if(X){F.filter(U,Z,true)}}},"":function(W,U,Y){var V=L++,T=S;if(!U.match(/\W/)){var X=U=Y?U:U.toUpperCase();T=P}T("parentNode",U,V,W,X,Y)},"~":function(W,U,Y){var V=L++,T=S;if(typeof U==="string"&&!U.match(/\W/)){var X=U=Y?U:U.toUpperCase();T=P}T("previousSibling",U,V,W,X,Y)}},find:{ID:function(U,V,W){if(typeof V.getElementById!=="undefined"&&!W){var T=V.getElementById(U[1]);return T?[T]:[]}},NAME:function(V,Y,Z){if(typeof Y.getElementsByName!=="undefined"){var U=[],X=Y.getElementsByName(V[1]);for(var W=0,T=X.length;W<T;W++){if(X[W].getAttribute("name")===V[1]){U.push(X[W])}}return U.length===0?null:U}},TAG:function(T,U){return U.getElementsByTagName(T[1])}},preFilter:{CLASS:function(W,U,V,T,Z,aa){W=" "+W[1].replace(/\\/g,"")+" ";if(aa){return W}for(var X=0,Y;(Y=U[X])!=null;X++){if(Y){if(Z^(Y.className&&(" "+Y.className+" ").indexOf(W)>=0)){if(!V){T.push(Y)}}else{if(V){U[X]=false}}}}return false},ID:function(T){return T[1].replace(/\\/g,"")},TAG:function(U,T){for(var V=0;T[V]===false;V++){}return T[V]&&Q(T[V])?U[1]:U[1].toUpperCase()},CHILD:function(T){if(T[1]=="nth"){var U=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(T[2]=="even"&&"2n"||T[2]=="odd"&&"2n+1"||!/\D/.test(T[2])&&"0n+"+T[2]||T[2]);T[2]=(U[1]+(U[2]||1))-0;T[3]=U[3]-0}T[0]=L++;return T},ATTR:function(X,U,V,T,Y,Z){var W=X[1].replace(/\\/g,"");if(!Z&&I.attrMap[W]){X[1]=I.attrMap[W]}if(X[2]==="~="){X[4]=" "+X[4]+" "}return X},PSEUDO:function(X,U,V,T,Y){if(X[1]==="not"){if(X[3].match(R).length>1||/^\w/.test(X[3])){X[3]=F(X[3],null,null,U)}else{var W=F.filter(X[3],U,V,true^Y);if(!V){T.push.apply(T,W)}return false}}else{if(I.match.POS.test(X[0])||I.match.CHILD.test(X[0])){return true}}return X},POS:function(T){T.unshift(true);return T}},filters:{enabled:function(T){return T.disabled===false&&T.type!=="hidden"},disabled:function(T){return T.disabled===true},checked:function(T){return T.checked===true},selected:function(T){T.parentNode.selectedIndex;return T.selected===true},parent:function(T){return !!T.firstChild},empty:function(T){return !T.firstChild},has:function(V,U,T){return !!F(T[3],V).length},header:function(T){return/h\d/i.test(T.nodeName)},text:function(T){return"text"===T.type},radio:function(T){return"radio"===T.type},checkbox:function(T){return"checkbox"===T.type},file:function(T){return"file"===T.type},password:function(T){return"password"===T.type},submit:function(T){return"submit"===T.type},image:function(T){return"image"===T.type},reset:function(T){return"reset"===T.type},button:function(T){return"button"===T.type||T.nodeName.toUpperCase()==="BUTTON"},input:function(T){return/input|select|textarea|button/i.test(T.nodeName)}},setFilters:{first:function(U,T){return T===0},last:function(V,U,T,W){return U===W.length-1},even:function(U,T){return T%2===0},odd:function(U,T){return T%2===1},lt:function(V,U,T){return U<T[3]-0},gt:function(V,U,T){return U>T[3]-0},nth:function(V,U,T){return T[3]-0==U},eq:function(V,U,T){return T[3]-0==U}},filter:{PSEUDO:function(Z,V,W,aa){var U=V[1],X=I.filters[U];if(X){return X(Z,W,V,aa)}else{if(U==="contains"){return(Z.textContent||Z.innerText||"").indexOf(V[3])>=0}else{if(U==="not"){var Y=V[3];for(var W=0,T=Y.length;W<T;W++){if(Y[W]===Z){return false}}return true}}}},CHILD:function(T,W){var Z=W[1],U=T;switch(Z){case"only":case"first":while(U=U.previousSibling){if(U.nodeType===1){return false}}if(Z=="first"){return true}U=T;case"last":while(U=U.nextSibling){if(U.nodeType===1){return false}}return true;case"nth":var V=W[2],ac=W[3];if(V==1&&ac==0){return true}var Y=W[0],ab=T.parentNode;if(ab&&(ab.sizcache!==Y||!T.nodeIndex)){var X=0;for(U=ab.firstChild;U;U=U.nextSibling){if(U.nodeType===1){U.nodeIndex=++X}}ab.sizcache=Y}var aa=T.nodeIndex-ac;if(V==0){return aa==0}else{return(aa%V==0&&aa/V>=0)}}},ID:function(U,T){return U.nodeType===1&&U.getAttribute("id")===T},TAG:function(U,T){return(T==="*"&&U.nodeType===1)||U.nodeName===T},CLASS:function(U,T){return(" "+(U.className||U.getAttribute("class"))+" ").indexOf(T)>-1},ATTR:function(Y,W){var V=W[1],T=I.attrHandle[V]?I.attrHandle[V](Y):Y[V]!=null?Y[V]:Y.getAttribute(V),Z=T+"",X=W[2],U=W[4];return T==null?X==="!=":X==="="?Z===U:X==="*="?Z.indexOf(U)>=0:X==="~="?(" "+Z+" ").indexOf(U)>=0:!U?Z&&T!==false:X==="!="?Z!=U:X==="^="?Z.indexOf(U)===0:X==="$="?Z.substr(Z.length-U.length)===U:X==="|="?Z===U||Z.substr(0,U.length+1)===U+"-":false},POS:function(X,U,V,Y){var T=U[2],W=I.setFilters[T];if(W){return W(X,V,U,Y)}}}};var M=I.match.POS;for(var O in I.match){I.match[O]=RegExp(I.match[O].source+/(?![^\[]*\])(?![^\(]*\))/.source)}var E=function(U,T){U=Array.prototype.slice.call(U);if(T){T.push.apply(T,U);return T}return U};try{Array.prototype.slice.call(document.documentElement.childNodes)}catch(N){E=function(X,W){var U=W||[];if(H.call(X)==="[object Array]"){Array.prototype.push.apply(U,X)}else{if(typeof X.length==="number"){for(var V=0,T=X.length;V<T;V++){U.push(X[V])}}else{for(var V=0;X[V];V++){U.push(X[V])}}}return U}}var G;if(document.documentElement.compareDocumentPosition){G=function(U,T){var V=U.compareDocumentPosition(T)&4?-1:U===T?0:1;if(V===0){hasDuplicate=true}return V}}else{if("sourceIndex" in document.documentElement){G=function(U,T){var V=U.sourceIndex-T.sourceIndex;if(V===0){hasDuplicate=true}return V}}else{if(document.createRange){G=function(W,U){var V=W.ownerDocument.createRange(),T=U.ownerDocument.createRange();V.selectNode(W);V.collapse(true);T.selectNode(U);T.collapse(true);var X=V.compareBoundaryPoints(Range.START_TO_END,T);if(X===0){hasDuplicate=true}return X}}}}(function(){var U=document.createElement("form"),V="script"+(new Date).getTime();U.innerHTML="<input name='"+V+"'/>";var T=document.documentElement;T.insertBefore(U,T.firstChild);if(!!document.getElementById(V)){I.find.ID=function(X,Y,Z){if(typeof Y.getElementById!=="undefined"&&!Z){var W=Y.getElementById(X[1]);return W?W.id===X[1]||typeof W.getAttributeNode!=="undefined"&&W.getAttributeNode("id").nodeValue===X[1]?[W]:g:[]}};I.filter.ID=function(Y,W){var X=typeof Y.getAttributeNode!=="undefined"&&Y.getAttributeNode("id");return Y.nodeType===1&&X&&X.nodeValue===W}}T.removeChild(U)})();(function(){var T=document.createElement("div");T.appendChild(document.createComment(""));if(T.getElementsByTagName("*").length>0){I.find.TAG=function(U,Y){var X=Y.getElementsByTagName(U[1]);if(U[1]==="*"){var W=[];for(var V=0;X[V];V++){if(X[V].nodeType===1){W.push(X[V])}}X=W}return X}}T.innerHTML="<a href='#'></a>";if(T.firstChild&&typeof T.firstChild.getAttribute!=="undefined"&&T.firstChild.getAttribute("href")!=="#"){I.attrHandle.href=function(U){return U.getAttribute("href",2)}}})();if(document.querySelectorAll){(function(){var T=F,U=document.createElement("div");U.innerHTML="<p class='TEST'></p>";if(U.querySelectorAll&&U.querySelectorAll(".TEST").length===0){return}F=function(Y,X,V,W){X=X||document;if(!W&&X.nodeType===9&&!Q(X)){try{return E(X.querySelectorAll(Y),V)}catch(Z){}}return T(Y,X,V,W)};F.find=T.find;F.filter=T.filter;F.selectors=T.selectors;F.matches=T.matches})()}if(document.getElementsByClassName&&document.documentElement.getElementsByClassName){(function(){var T=document.createElement("div");T.innerHTML="<div class='test e'></div><div class='test'></div>";if(T.getElementsByClassName("e").length===0){return}T.lastChild.className="e";if(T.getElementsByClassName("e").length===1){return}I.order.splice(1,0,"CLASS");I.find.CLASS=function(U,V,W){if(typeof V.getElementsByClassName!=="undefined"&&!W){return V.getElementsByClassName(U[1])}}})()}function P(U,Z,Y,ad,aa,ac){var ab=U=="previousSibling"&&!ac;for(var W=0,V=ad.length;W<V;W++){var T=ad[W];if(T){if(ab&&T.nodeType===1){T.sizcache=Y;T.sizset=W}T=T[U];var X=false;while(T){if(T.sizcache===Y){X=ad[T.sizset];break}if(T.nodeType===1&&!ac){T.sizcache=Y;T.sizset=W}if(T.nodeName===Z){X=T;break}T=T[U]}ad[W]=X}}}function S(U,Z,Y,ad,aa,ac){var ab=U=="previousSibling"&&!ac;for(var W=0,V=ad.length;W<V;W++){var T=ad[W];if(T){if(ab&&T.nodeType===1){T.sizcache=Y;T.sizset=W}T=T[U];var X=false;while(T){if(T.sizcache===Y){X=ad[T.sizset];break}if(T.nodeType===1){if(!ac){T.sizcache=Y;T.sizset=W}if(typeof Z!=="string"){if(T===Z){X=true;break}}else{if(F.filter(Z,[T]).length>0){X=T;break}}}T=T[U]}ad[W]=X}}}var K=document.compareDocumentPosition?function(U,T){return U.compareDocumentPosition(T)&16}:function(U,T){return U!==T&&(U.contains?U.contains(T):true)};var Q=function(T){return T.nodeType===9&&T.documentElement.nodeName!=="HTML"||!!T.ownerDocument&&Q(T.ownerDocument)};var J=function(T,aa){var W=[],X="",Y,V=aa.nodeType?[aa]:aa;while((Y=I.match.PSEUDO.exec(T))){X+=Y[0];T=T.replace(I.match.PSEUDO,"")}T=I.relative[T]?T+"*":T;for(var Z=0,U=V.length;Z<U;Z++){F(T,V[Z],W)}return F.filter(X,W)};o.find=F;o.filter=F.filter;o.expr=F.selectors;o.expr[":"]=o.expr.filters;F.selectors.filters.hidden=function(T){return T.offsetWidth===0||T.offsetHeight===0};F.selectors.filters.visible=function(T){return T.offsetWidth>0||T.offsetHeight>0};F.selectors.filters.animated=function(T){return o.grep(o.timers,function(U){return T===U.elem}).length};o.multiFilter=function(V,T,U){if(U){V=":not("+V+")"}return F.matches(V,T)};o.dir=function(V,U){var T=[],W=V[U];while(W&&W!=document){if(W.nodeType==1){T.push(W)}W=W[U]}return T};o.nth=function(X,T,V,W){T=T||1;var U=0;for(;X;X=X[V]){if(X.nodeType==1&&++U==T){break}}return X};o.sibling=function(V,U){var T=[];for(;V;V=V.nextSibling){if(V.nodeType==1&&V!=U){T.push(V)}}return T};return;l.Sizzle=F})();o.event={add:function(I,F,H,K){if(I.nodeType==3||I.nodeType==8){return}if(I.setInterval&&I!=l){I=l}if(!H.guid){H.guid=this.guid++}if(K!==g){var G=H;H=this.proxy(G);H.data=K}var E=o.data(I,"events")||o.data(I,"events",{}),J=o.data(I,"handle")||o.data(I,"handle",function(){return typeof o!=="undefined"&&!o.event.triggered?o.event.handle.apply(arguments.callee.elem,arguments):g});J.elem=I;o.each(F.split(/\s+/),function(M,N){var O=N.split(".");N=O.shift();H.type=O.slice().sort().join(".");var L=E[N];if(o.event.specialAll[N]){o.event.specialAll[N].setup.call(I,K,O)}if(!L){L=E[N]={};if(!o.event.special[N]||o.event.special[N].setup.call(I,K,O)===false){if(I.addEventListener){I.addEventListener(N,J,false)}else{if(I.attachEvent){I.attachEvent("on"+N,J)}}}}L[H.guid]=H;o.event.global[N]=true});I=null},guid:1,global:{},remove:function(K,H,J){if(K.nodeType==3||K.nodeType==8){return}var G=o.data(K,"events"),F,E;if(G){if(H===g||(typeof H==="string"&&H.charAt(0)==".")){for(var I in G){this.remove(K,I+(H||""))}}else{if(H.type){J=H.handler;H=H.type}o.each(H.split(/\s+/),function(M,O){var Q=O.split(".");O=Q.shift();var N=RegExp("(^|\\.)"+Q.slice().sort().join(".*\\.")+"(\\.|$)");if(G[O]){if(J){delete G[O][J.guid]}else{for(var P in G[O]){if(N.test(G[O][P].type)){delete G[O][P]}}}if(o.event.specialAll[O]){o.event.specialAll[O].teardown.call(K,Q)}for(F in G[O]){break}if(!F){if(!o.event.special[O]||o.event.special[O].teardown.call(K,Q)===false){if(K.removeEventListener){K.removeEventListener(O,o.data(K,"handle"),false)}else{if(K.detachEvent){K.detachEvent("on"+O,o.data(K,"handle"))}}}F=null;delete G[O]}}})}for(F in G){break}if(!F){var L=o.data(K,"handle");if(L){L.elem=null}o.removeData(K,"events");o.removeData(K,"handle")}}},trigger:function(I,K,H,E){var G=I.type||I;if(!E){I=typeof I==="object"?I[h]?I:o.extend(o.Event(G),I):o.Event(G);if(G.indexOf("!")>=0){I.type=G=G.slice(0,-1);I.exclusive=true}if(!H){I.stopPropagation();if(this.global[G]){o.each(o.cache,function(){if(this.events&&this.events[G]){o.event.trigger(I,K,this.handle.elem)}})}}if(!H||H.nodeType==3||H.nodeType==8){return g}I.result=g;I.target=H;K=o.makeArray(K);K.unshift(I)}I.currentTarget=H;var J=o.data(H,"handle");if(J){J.apply(H,K)}if((!H[G]||(o.nodeName(H,"a")&&G=="click"))&&H["on"+G]&&H["on"+G].apply(H,K)===false){I.result=false}if(!E&&H[G]&&!I.isDefaultPrevented()&&!(o.nodeName(H,"a")&&G=="click")){this.triggered=true;try{H[G]()}catch(L){}}this.triggered=false;if(!I.isPropagationStopped()){var F=H.parentNode||H.ownerDocument;if(F){o.event.trigger(I,K,F,true)}}},handle:function(K){var J,E;K=arguments[0]=o.event.fix(K||l.event);K.currentTarget=this;var L=K.type.split(".");K.type=L.shift();J=!L.length&&!K.exclusive;var I=RegExp("(^|\\.)"+L.slice().sort().join(".*\\.")+"(\\.|$)");E=(o.data(this,"events")||{})[K.type];for(var G in E){var H=E[G];if(J||I.test(H.type)){K.handler=H;K.data=H.data;var F=H.apply(this,arguments);if(F!==g){K.result=F;if(F===false){K.preventDefault();K.stopPropagation()}}if(K.isImmediatePropagationStopped()){break}}}},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode metaKey newValue originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),fix:function(H){if(H[h]){return H}var F=H;H=o.Event(F);for(var G=this.props.length,J;G;){J=this.props[--G];H[J]=F[J]}if(!H.target){H.target=H.srcElement||document}if(H.target.nodeType==3){H.target=H.target.parentNode}if(!H.relatedTarget&&H.fromElement){H.relatedTarget=H.fromElement==H.target?H.toElement:H.fromElement}if(H.pageX==null&&H.clientX!=null){var I=document.documentElement,E=document.body;H.pageX=H.clientX+(I&&I.scrollLeft||E&&E.scrollLeft||0)-(I.clientLeft||0);H.pageY=H.clientY+(I&&I.scrollTop||E&&E.scrollTop||0)-(I.clientTop||0)}if(!H.which&&((H.charCode||H.charCode===0)?H.charCode:H.keyCode)){H.which=H.charCode||H.keyCode}if(!H.metaKey&&H.ctrlKey){H.metaKey=H.ctrlKey}if(!H.which&&H.button){H.which=(H.button&1?1:(H.button&2?3:(H.button&4?2:0)))}return H},proxy:function(F,E){E=E||function(){return F.apply(this,arguments)};E.guid=F.guid=F.guid||E.guid||this.guid++;return E},special:{ready:{setup:B,teardown:function(){}}},specialAll:{live:{setup:function(E,F){o.event.add(this,F[0],c)},teardown:function(G){if(G.length){var E=0,F=RegExp("(^|\\.)"+G[0]+"(\\.|$)");o.each((o.data(this,"events").live||{}),function(){if(F.test(this.type)){E++}});if(E<1){o.event.remove(this,G[0],c)}}}}}};o.Event=function(E){if(!this.preventDefault){return new o.Event(E)}if(E&&E.type){this.originalEvent=E;this.type=E.type}else{this.type=E}this.timeStamp=e();this[h]=true};function k(){return false}function u(){return true}o.Event.prototype={preventDefault:function(){this.isDefaultPrevented=u;var E=this.originalEvent;if(!E){return}if(E.preventDefault){E.preventDefault()}E.returnValue=false},stopPropagation:function(){this.isPropagationStopped=u;var E=this.originalEvent;if(!E){return}if(E.stopPropagation){E.stopPropagation()}E.cancelBubble=true},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=u;this.stopPropagation()},isDefaultPrevented:k,isPropagationStopped:k,isImmediatePropagationStopped:k};var a=function(F){var E=F.relatedTarget;while(E&&E!=this){try{E=E.parentNode}catch(G){E=this}}if(E!=this){F.type=F.data;o.event.handle.apply(this,arguments)}};o.each({mouseover:"mouseenter",mouseout:"mouseleave"},function(F,E){o.event.special[E]={setup:function(){o.event.add(this,F,a,E)},teardown:function(){o.event.remove(this,F,a)}}});o.fn.extend({bind:function(F,G,E){return F=="unload"?this.one(F,G,E):this.each(function(){o.event.add(this,F,E||G,E&&G)})},one:function(G,H,F){var E=o.event.proxy(F||H,function(I){o(this).unbind(I,E);return(F||H).apply(this,arguments)});return this.each(function(){o.event.add(this,G,E,F&&H)})},unbind:function(F,E){return this.each(function(){o.event.remove(this,F,E)})},trigger:function(E,F){return this.each(function(){o.event.trigger(E,F,this)})},triggerHandler:function(E,G){if(this[0]){var F=o.Event(E);F.preventDefault();F.stopPropagation();o.event.trigger(F,G,this[0]);return F.result}},toggle:function(G){var E=arguments,F=1;while(F<E.length){o.event.proxy(G,E[F++])}return this.click(o.event.proxy(G,function(H){this.lastToggle=(this.lastToggle||0)%F;H.preventDefault();return E[this.lastToggle++].apply(this,arguments)||false}))},hover:function(E,F){return this.mouseenter(E).mouseleave(F)},ready:function(E){B();if(o.isReady){E.call(document,o)}else{o.readyList.push(E)}return this},live:function(G,F){var E=o.event.proxy(F);E.guid+=this.selector+G;o(document).bind(i(G,this.selector),this.selector,E);return this},die:function(F,E){o(document).unbind(i(F,this.selector),E?{guid:E.guid+this.selector+F}:null);return this}});function c(H){var E=RegExp("(^|\\.)"+H.type+"(\\.|$)"),G=true,F=[];o.each(o.data(this,"events").live||[],function(I,J){if(E.test(J.type)){var K=o(H.target).closest(J.data)[0];if(K){F.push({elem:K,fn:J})}}});F.sort(function(J,I){return o.data(J.elem,"closest")-o.data(I.elem,"closest")});o.each(F,function(){if(this.fn.call(this.elem,H,this.fn.data)===false){return(G=false)}});return G}function i(F,E){return["live",F,E.replace(/\./g,"`").replace(/ /g,"|")].join(".")}o.extend({isReady:false,readyList:[],ready:function(){if(!o.isReady){o.isReady=true;if(o.readyList){o.each(o.readyList,function(){this.call(document,o)});o.readyList=null}o(document).triggerHandler("ready")}}});var x=false;function B(){if(x){return}x=true;if(document.addEventListener){document.addEventListener("DOMContentLoaded",function(){document.removeEventListener("DOMContentLoaded",arguments.callee,false);o.ready()},false)}else{if(document.attachEvent){document.attachEvent("onreadystatechange",function(){if(document.readyState==="complete"){document.detachEvent("onreadystatechange",arguments.callee);o.ready()}});if(document.documentElement.doScroll&&l==l.top){(function(){if(o.isReady){return}try{document.documentElement.doScroll("left")}catch(E){setTimeout(arguments.callee,0);return}o.ready()})()}}}o.event.add(l,"load",o.ready)}o.each(("blur,focus,load,resize,scroll,unload,click,dblclick,mousedown,mouseup,mousemove,mouseover,mouseout,mouseenter,mouseleave,change,select,submit,keydown,keypress,keyup,error").split(","),function(F,E){o.fn[E]=function(G){return G?this.bind(E,G):this.trigger(E)}});o(l).bind("unload",function(){for(var E in o.cache){if(E!=1&&o.cache[E].handle){o.event.remove(o.cache[E].handle.elem)}}});(function(){o.support={};var F=document.documentElement,G=document.createElement("script"),K=document.createElement("div"),J="script"+(new Date).getTime();K.style.display="none";K.innerHTML=' <link/><table></table><a href="/a" style="color:red;float:left;opacity:.5;">a</a><select><option>text</option></select><object><param/></object>';var H=K.getElementsByTagName("*"),E=K.getElementsByTagName("a")[0];if(!H||!H.length||!E){return}o.support={leadingWhitespace:K.firstChild.nodeType==3,tbody:!K.getElementsByTagName("tbody").length,objectAll:!!K.getElementsByTagName("object")[0].getElementsByTagName("*").length,htmlSerialize:!!K.getElementsByTagName("link").length,style:/red/.test(E.getAttribute("style")),hrefNormalized:E.getAttribute("href")==="/a",opacity:E.style.opacity==="0.5",cssFloat:!!E.style.cssFloat,scriptEval:false,noCloneEvent:true,boxModel:null};G.type="text/javascript";try{G.appendChild(document.createTextNode("window."+J+"=1;"))}catch(I){}F.insertBefore(G,F.firstChild);if(l[J]){o.support.scriptEval=true;delete l[J]}F.removeChild(G);if(K.attachEvent&&K.fireEvent){K.attachEvent("onclick",function(){o.support.noCloneEvent=false;K.detachEvent("onclick",arguments.callee)});K.cloneNode(true).fireEvent("onclick")}o(function(){var L=document.createElement("div");L.style.width=L.style.paddingLeft="1px";document.body.appendChild(L);o.boxModel=o.support.boxModel=L.offsetWidth===2;document.body.removeChild(L).style.display="none"})})();var w=o.support.cssFloat?"cssFloat":"styleFloat";o.props={"for":"htmlFor","class":"className","float":w,cssFloat:w,styleFloat:w,readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing",rowspan:"rowSpan",tabindex:"tabIndex"};o.fn.extend({_load:o.fn.load,load:function(G,J,K){if(typeof G!=="string"){return this._load(G)}var I=G.indexOf(" ");if(I>=0){var E=G.slice(I,G.length);G=G.slice(0,I)}var H="GET";if(J){if(o.isFunction(J)){K=J;J=null}else{if(typeof J==="object"){J=o.param(J);H="POST"}}}var F=this;o.ajax({url:G,type:H,dataType:"html",data:J,complete:function(M,L){if(L=="success"||L=="notmodified"){F.html(E?o("<div/>").append(M.responseText.replace(/<script(.|\s)*?\/script>/g,"")).find(E):M.responseText)}if(K){F.each(K,[M.responseText,L,M])}}});return this},serialize:function(){return o.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?o.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||/select|textarea/i.test(this.nodeName)||/text|hidden|password|search/i.test(this.type))}).map(function(E,F){var G=o(this).val();return G==null?null:o.isArray(G)?o.map(G,function(I,H){return{name:F.name,value:I}}):{name:F.name,value:G}}).get()}});o.each("ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend".split(","),function(E,F){o.fn[F]=function(G){return this.bind(F,G)}});var r=e();o.extend({get:function(E,G,H,F){if(o.isFunction(G)){H=G;G=null}return o.ajax({type:"GET",url:E,data:G,success:H,dataType:F})},getScript:function(E,F){return o.get(E,null,F,"script")},getJSON:function(E,F,G){return o.get(E,F,G,"json")},post:function(E,G,H,F){if(o.isFunction(G)){H=G;G={}}return o.ajax({type:"POST",url:E,data:G,success:H,dataType:F})},ajaxSetup:function(E){o.extend(o.ajaxSettings,E)},ajaxSettings:{url:location.href,global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:function(){return l.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):new XMLHttpRequest()},accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},ajax:function(M){M=o.extend(true,M,o.extend(true,{},o.ajaxSettings,M));var W,F=/=\?(&|$)/g,R,V,G=M.type.toUpperCase();if(M.data&&M.processData&&typeof M.data!=="string"){M.data=o.param(M.data)}if(M.dataType=="jsonp"){if(G=="GET"){if(!M.url.match(F)){M.url+=(M.url.match(/\?/)?"&":"?")+(M.jsonp||"callback")+"=?"}}else{if(!M.data||!M.data.match(F)){M.data=(M.data?M.data+"&":"")+(M.jsonp||"callback")+"=?"}}M.dataType="json"}if(M.dataType=="json"&&(M.data&&M.data.match(F)||M.url.match(F))){W="jsonp"+r++;if(M.data){M.data=(M.data+"").replace(F,"="+W+"$1")}M.url=M.url.replace(F,"="+W+"$1");M.dataType="script";l[W]=function(X){V=X;I();L();l[W]=g;try{delete l[W]}catch(Y){}if(H){H.removeChild(T)}}}if(M.dataType=="script"&&M.cache==null){M.cache=false}if(M.cache===false&&G=="GET"){var E=e();var U=M.url.replace(/(\?|&)_=.*?(&|$)/,"$1_="+E+"$2");M.url=U+((U==M.url)?(M.url.match(/\?/)?"&":"?")+"_="+E:"")}if(M.data&&G=="GET"){M.url+=(M.url.match(/\?/)?"&":"?")+M.data;M.data=null}if(M.global&&!o.active++){o.event.trigger("ajaxStart")}var Q=/^(\w+:)?\/\/([^\/?#]+)/.exec(M.url);if(M.dataType=="script"&&G=="GET"&&Q&&(Q[1]&&Q[1]!=location.protocol||Q[2]!=location.host)){var H=document.getElementsByTagName("head")[0];var T=document.createElement("script");T.src=M.url;if(M.scriptCharset){T.charset=M.scriptCharset}if(!W){var O=false;T.onload=T.onreadystatechange=function(){if(!O&&(!this.readyState||this.readyState=="loaded"||this.readyState=="complete")){O=true;I();L();T.onload=T.onreadystatechange=null;H.removeChild(T)}}}H.appendChild(T);return g}var K=false;var J=M.xhr();if(M.username){J.open(G,M.url,M.async,M.username,M.password)}else{J.open(G,M.url,M.async)}try{if(M.data){J.setRequestHeader("Content-Type",M.contentType)}if(M.ifModified){J.setRequestHeader("If-Modified-Since",o.lastModified[M.url]||"Thu, 01 Jan 1970 00:00:00 GMT")}J.setRequestHeader("X-Requested-With","XMLHttpRequest");J.setRequestHeader("Accept",M.dataType&&M.accepts[M.dataType]?M.accepts[M.dataType]+", */*":M.accepts._default)}catch(S){}if(M.beforeSend&&M.beforeSend(J,M)===false){if(M.global&&!--o.active){o.event.trigger("ajaxStop")}J.abort();return false}if(M.global){o.event.trigger("ajaxSend",[J,M])}var N=function(X){if(J.readyState==0){if(P){clearInterval(P);P=null;if(M.global&&!--o.active){o.event.trigger("ajaxStop")}}}else{if(!K&&J&&(J.readyState==4||X=="timeout")){K=true;if(P){clearInterval(P);P=null}R=X=="timeout"?"timeout":!o.httpSuccess(J)?"error":M.ifModified&&o.httpNotModified(J,M.url)?"notmodified":"success";if(R=="success"){try{V=o.httpData(J,M.dataType,M)}catch(Z){R="parsererror"}}if(R=="success"){var Y;try{Y=J.getResponseHeader("Last-Modified")}catch(Z){}if(M.ifModified&&Y){o.lastModified[M.url]=Y}if(!W){I()}}else{o.handleError(M,J,R)}L();if(X){J.abort()}if(M.async){J=null}}}};if(M.async){var P=setInterval(N,13);if(M.timeout>0){setTimeout(function(){if(J&&!K){N("timeout")}},M.timeout)}}try{J.send(M.data)}catch(S){o.handleError(M,J,null,S)}if(!M.async){N()}function I(){if(M.success){M.success(V,R)}if(M.global){o.event.trigger("ajaxSuccess",[J,M])}}function L(){if(M.complete){M.complete(J,R)}if(M.global){o.event.trigger("ajaxComplete",[J,M])}if(M.global&&!--o.active){o.event.trigger("ajaxStop")}}return J},handleError:function(F,H,E,G){if(F.error){F.error(H,E,G)}if(F.global){o.event.trigger("ajaxError",[H,F,G])}},active:0,httpSuccess:function(F){try{return !F.status&&location.protocol=="file:"||(F.status>=200&&F.status<300)||F.status==304||F.status==1223}catch(E){}return false},httpNotModified:function(G,E){try{var H=G.getResponseHeader("Last-Modified");return G.status==304||H==o.lastModified[E]}catch(F){}return false},httpData:function(J,H,G){var F=J.getResponseHeader("content-type"),E=H=="xml"||!H&&F&&F.indexOf("xml")>=0,I=E?J.responseXML:J.responseText;if(E&&I.documentElement.tagName=="parsererror"){throw"parsererror"}if(G&&G.dataFilter){I=G.dataFilter(I,H)}if(typeof I==="string"){if(H=="script"){o.globalEval(I)}if(H=="json"){I=l["eval"]("("+I+")")}}return I},param:function(E){var G=[];function H(I,J){G[G.length]=encodeURIComponent(I)+"="+encodeURIComponent(J)}if(o.isArray(E)||E.jquery){o.each(E,function(){H(this.name,this.value)})}else{for(var F in E){if(o.isArray(E[F])){o.each(E[F],function(){H(F,this)})}else{H(F,o.isFunction(E[F])?E[F]():E[F])}}}return G.join("&").replace(/%20/g,"+")}});var m={},n,d=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];function t(F,E){var G={};o.each(d.concat.apply([],d.slice(0,E)),function(){G[this]=F});return G}o.fn.extend({show:function(J,L){if(J){return this.animate(t("show",3),J,L)}else{for(var H=0,F=this.length;H<F;H++){var E=o.data(this[H],"olddisplay");this[H].style.display=E||"";if(o.css(this[H],"display")==="none"){var G=this[H].tagName,K;if(m[G]){K=m[G]}else{var I=o("<"+G+" />").appendTo("body");K=I.css("display");if(K==="none"){K="block"}I.remove();m[G]=K}o.data(this[H],"olddisplay",K)}}for(var H=0,F=this.length;H<F;H++){this[H].style.display=o.data(this[H],"olddisplay")||""}return this}},hide:function(H,I){if(H){return this.animate(t("hide",3),H,I)}else{for(var G=0,F=this.length;G<F;G++){var E=o.data(this[G],"olddisplay");if(!E&&E!=="none"){o.data(this[G],"olddisplay",o.css(this[G],"display"))}}for(var G=0,F=this.length;G<F;G++){this[G].style.display="none"}return this}},_toggle:o.fn.toggle,toggle:function(G,F){var E=typeof G==="boolean";return o.isFunction(G)&&o.isFunction(F)?this._toggle.apply(this,arguments):G==null||E?this.each(function(){var H=E?G:o(this).is(":hidden");o(this)[H?"show":"hide"]()}):this.animate(t("toggle",3),G,F)},fadeTo:function(E,G,F){return this.animate({opacity:G},E,F)},animate:function(I,F,H,G){var E=o.speed(F,H,G);return this[E.queue===false?"each":"queue"](function(){var K=o.extend({},E),M,L=this.nodeType==1&&o(this).is(":hidden"),J=this;for(M in I){if(I[M]=="hide"&&L||I[M]=="show"&&!L){return K.complete.call(this)}if((M=="height"||M=="width")&&this.style){K.display=o.css(this,"display");K.overflow=this.style.overflow}}if(K.overflow!=null){this.style.overflow="hidden"}K.curAnim=o.extend({},I);o.each(I,function(O,S){var R=new o.fx(J,K,O);if(/toggle|show|hide/.test(S)){R[S=="toggle"?L?"show":"hide":S](I)}else{var Q=S.toString().match(/^([+-]=)?([\d+-.]+)(.*)$/),T=R.cur(true)||0;if(Q){var N=parseFloat(Q[2]),P=Q[3]||"px";if(P!="px"){J.style[O]=(N||1)+P;T=((N||1)/R.cur(true))*T;J.style[O]=T+P}if(Q[1]){N=((Q[1]=="-="?-1:1)*N)+T}R.custom(T,N,P)}else{R.custom(T,S,"")}}});return true})},stop:function(F,E){var G=o.timers;if(F){this.queue([])}this.each(function(){for(var H=G.length-1;H>=0;H--){if(G[H].elem==this){if(E){G[H](true)}G.splice(H,1)}}});if(!E){this.dequeue()}return this}});o.each({slideDown:t("show",1),slideUp:t("hide",1),slideToggle:t("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"}},function(E,F){o.fn[E]=function(G,H){return this.animate(F,G,H)}});o.extend({speed:function(G,H,F){var E=typeof G==="object"?G:{complete:F||!F&&H||o.isFunction(G)&&G,duration:G,easing:F&&H||H&&!o.isFunction(H)&&H};E.duration=o.fx.off?0:typeof E.duration==="number"?E.duration:o.fx.speeds[E.duration]||o.fx.speeds._default;E.old=E.complete;E.complete=function(){if(E.queue!==false){o(this).dequeue()}if(o.isFunction(E.old)){E.old.call(this)}};return E},easing:{linear:function(G,H,E,F){return E+F*G},swing:function(G,H,E,F){return((-Math.cos(G*Math.PI)/2)+0.5)*F+E}},timers:[],fx:function(F,E,G){this.options=E;this.elem=F;this.prop=G;if(!E.orig){E.orig={}}}});o.fx.prototype={update:function(){if(this.options.step){this.options.step.call(this.elem,this.now,this)}(o.fx.step[this.prop]||o.fx.step._default)(this);if((this.prop=="height"||this.prop=="width")&&this.elem.style){this.elem.style.display="block"}},cur:function(F){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null)){return this.elem[this.prop]}var E=parseFloat(o.css(this.elem,this.prop,F));return E&&E>-10000?E:parseFloat(o.curCSS(this.elem,this.prop))||0},custom:function(I,H,G){this.startTime=e();this.start=I;this.end=H;this.unit=G||this.unit||"px";this.now=this.start;this.pos=this.state=0;var E=this;function F(J){return E.step(J)}F.elem=this.elem;if(F()&&o.timers.push(F)&&!n){n=setInterval(function(){var K=o.timers;for(var J=0;J<K.length;J++){if(!K[J]()){K.splice(J--,1)}}if(!K.length){clearInterval(n);n=g}},13)}},show:function(){this.options.orig[this.prop]=o.attr(this.elem.style,this.prop);this.options.show=true;this.custom(this.prop=="width"||this.prop=="height"?1:0,this.cur());o(this.elem).show()},hide:function(){this.options.orig[this.prop]=o.attr(this.elem.style,this.prop);this.options.hide=true;this.custom(this.cur(),0)},step:function(H){var G=e();if(H||G>=this.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;var E=true;for(var F in this.options.curAnim){if(this.options.curAnim[F]!==true){E=false}}if(E){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;this.elem.style.display=this.options.display;if(o.css(this.elem,"display")=="none"){this.elem.style.display="block"}}if(this.options.hide){o(this.elem).hide()}if(this.options.hide||this.options.show){for(var I in this.options.curAnim){o.attr(this.elem.style,I,this.options.orig[I])}}this.options.complete.call(this.elem)}return false}else{var J=G-this.startTime;this.state=J/this.options.duration;this.pos=o.easing[this.options.easing||(o.easing.swing?"swing":"linear")](this.state,J,0,1,this.options.duration);this.now=this.start+((this.end-this.start)*this.pos);this.update()}return true}};o.extend(o.fx,{speeds:{slow:600,fast:200,_default:400},step:{opacity:function(E){o.attr(E.elem.style,"opacity",E.now)},_default:function(E){if(E.elem.style&&E.elem.style[E.prop]!=null){E.elem.style[E.prop]=E.now+E.unit}else{E.elem[E.prop]=E.now}}}});if(document.documentElement.getBoundingClientRect){o.fn.offset=function(){if(!this[0]){return{top:0,left:0}}if(this[0]===this[0].ownerDocument.body){return o.offset.bodyOffset(this[0])}var G=this[0].getBoundingClientRect(),J=this[0].ownerDocument,F=J.body,E=J.documentElement,L=E.clientTop||F.clientTop||0,K=E.clientLeft||F.clientLeft||0,I=G.top+(self.pageYOffset||o.boxModel&&E.scrollTop||F.scrollTop)-L,H=G.left+(self.pageXOffset||o.boxModel&&E.scrollLeft||F.scrollLeft)-K;return{top:I,left:H}}}else{o.fn.offset=function(){if(!this[0]){return{top:0,left:0}}if(this[0]===this[0].ownerDocument.body){return o.offset.bodyOffset(this[0])}o.offset.initialized||o.offset.initialize();var J=this[0],G=J.offsetParent,F=J,O=J.ownerDocument,M,H=O.documentElement,K=O.body,L=O.defaultView,E=L.getComputedStyle(J,null),N=J.offsetTop,I=J.offsetLeft;while((J=J.parentNode)&&J!==K&&J!==H){M=L.getComputedStyle(J,null);N-=J.scrollTop,I-=J.scrollLeft;if(J===G){N+=J.offsetTop,I+=J.offsetLeft;if(o.offset.doesNotAddBorder&&!(o.offset.doesAddBorderForTableAndCells&&/^t(able|d|h)$/i.test(J.tagName))){N+=parseInt(M.borderTopWidth,10)||0,I+=parseInt(M.borderLeftWidth,10)||0}F=G,G=J.offsetParent}if(o.offset.subtractsBorderForOverflowNotVisible&&M.overflow!=="visible"){N+=parseInt(M.borderTopWidth,10)||0,I+=parseInt(M.borderLeftWidth,10)||0}E=M}if(E.position==="relative"||E.position==="static"){N+=K.offsetTop,I+=K.offsetLeft}if(E.position==="fixed"){N+=Math.max(H.scrollTop,K.scrollTop),I+=Math.max(H.scrollLeft,K.scrollLeft)}return{top:N,left:I}}}o.offset={initialize:function(){if(this.initialized){return}var L=document.body,F=document.createElement("div"),H,G,N,I,M,E,J=L.style.marginTop,K='<div style="position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;"><div></div></div><table style="position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;" cellpadding="0" cellspacing="0"><tr><td></td></tr></table>';M={position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"};for(E in M){F.style[E]=M[E]}F.innerHTML=K;L.insertBefore(F,L.firstChild);H=F.firstChild,G=H.firstChild,I=H.nextSibling.firstChild.firstChild;this.doesNotAddBorder=(G.offsetTop!==5);this.doesAddBorderForTableAndCells=(I.offsetTop===5);H.style.overflow="hidden",H.style.position="relative";this.subtractsBorderForOverflowNotVisible=(G.offsetTop===-5);L.style.marginTop="1px";this.doesNotIncludeMarginInBodyOffset=(L.offsetTop===0);L.style.marginTop=J;L.removeChild(F);this.initialized=true},bodyOffset:function(E){o.offset.initialized||o.offset.initialize();var G=E.offsetTop,F=E.offsetLeft;if(o.offset.doesNotIncludeMarginInBodyOffset){G+=parseInt(o.curCSS(E,"marginTop",true),10)||0,F+=parseInt(o.curCSS(E,"marginLeft",true),10)||0}return{top:G,left:F}}};o.fn.extend({position:function(){var I=0,H=0,F;if(this[0]){var G=this.offsetParent(),J=this.offset(),E=/^body|html$/i.test(G[0].tagName)?{top:0,left:0}:G.offset();J.top-=j(this,"marginTop");J.left-=j(this,"marginLeft");E.top+=j(G,"borderTopWidth");E.left+=j(G,"borderLeftWidth");F={top:J.top-E.top,left:J.left-E.left}}return F},offsetParent:function(){var E=this[0].offsetParent||document.body;while(E&&(!/^body|html$/i.test(E.tagName)&&o.css(E,"position")=="static")){E=E.offsetParent}return o(E)}});o.each(["Left","Top"],function(F,E){var G="scroll"+E;o.fn[G]=function(H){if(!this[0]){return null}return H!==g?this.each(function(){this==l||this==document?l.scrollTo(!F?H:o(l).scrollLeft(),F?H:o(l).scrollTop()):this[G]=H}):this[0]==l||this[0]==document?self[F?"pageYOffset":"pageXOffset"]||o.boxModel&&document.documentElement[G]||document.body[G]:this[0][G]}});o.each(["Height","Width"],function(I,G){var E=I?"Left":"Top",H=I?"Right":"Bottom",F=G.toLowerCase();o.fn["inner"+G]=function(){return this[0]?o.css(this[0],F,false,"padding"):null};o.fn["outer"+G]=function(K){return this[0]?o.css(this[0],F,false,K?"margin":"border"):null};var J=G.toLowerCase();o.fn[J]=function(K){return this[0]==l?document.compatMode=="CSS1Compat"&&document.documentElement["client"+G]||document.body["client"+G]:this[0]==document?Math.max(document.documentElement["client"+G],document.body["scroll"+G],document.documentElement["scroll"+G],document.body["offset"+G],document.documentElement["offset"+G]):K===g?(this.length?o.css(this[0],J):null):this.css(J,typeof K==="string"?K:K+"px")}})})();
\ No newline at end of file
Copied: trunk/htdocs/js/signup.js (from rev 656, branches/sucs-site/htdocs/js/signup.js)
===================================================================
--- trunk/htdocs/js/signup.js (rev 0)
+++ trunk/htdocs/js/signup.js 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,253 @@
+var validation = {"studentid":false, "username":false, "realname":false, "address":false, "contact":false, "email":false, "phone":false};
+var submitted = false;
+function validate(){
+ var valid = true;
+ for (field in req){
+ if (!validation[req[field]]){
+ valid=false;
+ break;
+ }
+ }
+ if((valid || ($('input#override:checked').size()==1)) && !submitted && ($('input#tnc:checked').size()==1)){
+ $('input#submit').removeAttr("disabled");
+ return true;
+ }
+ else{
+ $('input#submit').attr("disabled","disabled");
+ return false;
+ }
+
+
+}
+function processPostcode(){
+ // lookup postcode
+ $.getJSON("/signup/ajax",{key: "postcode",value: $('input#postcode').val().replace(/ /g,'')}, function(j){
+ //populate dropdown
+ var options = '';
+ if (j.length > 1) {
+ // make dropdown visible
+ $('div#addseldiv').removeAttr("style");
+ for (var i = 0; i < j.length; i++) {
+ options += '<option>' + j[i] + '</option>';
+ }
+ $("select#addsel").html(options);
+ $('select#addsel option:first').attr('selected', 'selected');
+ }
+ if (j.length == 1) {
+ $('div#addseldiv').attr("style","display:none");
+ $("textarea#address").val(j[0].replace(/, /g,'\n'))
+ $('div#addressmessage').attr("style","color:green; float:right; clear:right;");
+ $('div#addressmessage').html("OK");
+ validation["address"]=true;
+ validate();
+ }
+ })
+}
+
+function lookupSID(setname){
+ $.get("/signup/ajax",{key:"sid" ,value: $('input#studentid').val()},function(j){
+ arr=j.split(":");
+ key=arr.shift();
+ val=arr.join(":");
+ if(key=="OK"){
+ if(setname=true)
+ $("input#realname").val(val);
+ $('div#studentidmessage').attr("style","color:green; float:right; clear:right;");
+ $('div#studentidmessage').html(key);
+ validation['studentid']=true;
+ processName("realname","realname");
+
+ }
+ else{
+ $('div#studentidmessage').attr("style","color:red; float:right; clear:right;");
+ $('div#studentidmessage').html(val);
+ validation['email']=false;
+ validate();
+ }
+ },'text')
+}
+function processSID(){
+ lookupSID(true);
+}
+
+function processUsername(){
+ $.get("/signup/ajax",{key: "username", value: $('input#username').val()},function(j){
+ if (j!="OK") {
+ $('div#usernamemessage').attr("style","color:red; float:right; clear:right;");
+ validation['username']=false;
+ }
+ else{
+ $('div#usernamemessage').attr("style","color:green; float:right; clear:right;");
+ validation['username']=true;
+ }
+ $('div#usernamemessage').html(j);
+ validate();
+ },'text')
+}
+
+function processName(type, input){
+ $.get("/signup/ajax",{key: type, value: $('input#'+input).val()},function(j){
+ if (j!="OK") {
+ $('div#'+input+'message').attr("style","color:red; float:right; clear:right;");
+ validation[input]=false;
+ }
+ else{
+ $('div#'+input+'message').attr("style","color:green; float:right; clear:right;");
+ validation[input]=true;
+ }
+ $('div#'+input+'message').html(j);
+ validate();
+ },'text')
+}
+function processContact(){
+ processName('realname','contact');
+}
+
+function processAddress(){
+ $.get("/signup/ajax",{key: "address", value: $('textarea#address').val()},function(j){
+ if (j!="OK") {
+ $('div#addressmessage').attr("style","color:red; float:right; clear:right;");
+ validation['address']=false;
+ }
+ else{
+ $('div#addressmessage').attr("style","color:green; float:right; clear:right;");
+ validation['address']=true;
+ }
+ $('div#addressmessage').html(j);
+ validate();
+ },'text')
+}
+
+function processEmail(){
+ $.get("/signup/ajax",{key: "email", value: $('input#email').val()},function(j){
+ if (j!="OK") {
+ $('div#emailmessage').attr("style","color:red; float:right; clear:right;");
+ validation['email']=false;
+ }
+ else{
+ $('div#emailmessage').attr("style","color:green; float:right; clear:right;");
+ validation['email']=true;
+ }
+ $('div#emailmessage').html(j);
+ validate();
+ },'text')
+}
+
+function processPhone(){
+ $.get("/signup/ajax",{key: "phone", value: $('input#phone').val()},function(j){
+ if (j!="OK") {
+ $('div#phonemessage').attr("style","color:red; float:right; clear:right;");
+ validation['phone']=false;
+ }
+ else{
+ $('div#phonemessage').attr("style","color:green; float:right; clear:right;");
+ validation['phone']=true;
+ }
+ $('div#phonemessage').html(j);
+ validate();
+ },'text')
+}
+
+$(function(){
+ if($('input#studentid').size()==1){
+ usertype=1;
+ }
+ else if($('input#contact').size()==1){
+ usertype=2;
+ }
+ else{
+ usertype=5;
+ }
+ req=new Array("username","realname","email","phone");
+ switch(usertype){
+ case "1":
+ req.push("studentid","address");
+ break;
+ case "2":
+ req.push("contact");
+ break;
+ case "5":
+ req.push("address");
+ }
+ //usertype=$('input#usertype').val();
+ $("document").ready(function(){
+ // makes script sutff appear
+ $('div#postcodediv').removeAttr("style");
+ $('input#submit').attr("disabled","disabled");
+ // if the fields are not empty validate them
+ if($('input#username').val()!="") processUsername();
+ if($('input#email').val()!="") processEmail();
+ if($('input#phone').val()!="") processPhone();
+ if(usertype!=2){
+ if($('input#postcode').val()!="") processPostcode();
+ if($('textarea#address').val()!="") processAddress();
+ if($('input#realname').val()!="") processName("realname","realname");
+ }
+ else{
+ if($('input#contact').val()!="") processContact();
+ if($('input#realname').val()!="") processName("socname","realname");
+ }
+ if((usertype==1) && ($('input#studentid').val()!="")){
+ if($('input#realname').val()=="") lookupSID(true);
+ else lookupSID(false);
+ }
+
+ validate();
+ })
+ // dont do address stuff for societies
+ if(usertype!=2){
+ // process postcode when the box changes
+ $("input#postcode").change(processPostcode);
+
+ //populate the address box when an address is selected
+ $("select#addsel").change(function(){
+ $("textarea#address").val($('select#addsel').val().replace(/, /g,'\n'));
+ $('div#addressmessage').attr("style","color:green; float:right; clear:right;");
+ $('div#addressmessage').html("OK");
+ validation['address']=true;
+ })
+ }
+ //else deal with the contact field
+ else{
+ $("input#contact").change(processContact)
+
+ }
+ //if is a student
+ if(usertype==1){
+ //lookup the real name from the studentid
+ $("input#studentid").change(processSID)
+ }
+ //validate username
+ $("input#username").change(processUsername)
+ //validate personal and society names differntly
+ if(usertype!=2){
+ persoc='realname';
+ }
+ else{
+ persoc='socname';
+ }
+ //validate real name
+ $("input#realname").change(function(){
+ processName(persoc, 'realname');
+ })
+
+ //validate email address
+ $("input#email").change(processEmail);
+ //validate phone number
+ $("input#phone").change(processPhone);
+ $("textarea#address").change(processAddress);
+ $("input#override").change(validate);
+ $("input#tnc").change(validate);
+ // Disable the submit button once clicked
+ $("form#mainform").submit(function() {
+ var valid = validate();
+ if(valid){
+ // mark form as submitted
+ submitted = true;
+ // disable the submit button
+ $('input#submit').attr("disabled","disabled");
+ }
+ return valid;
+ });
+})
+
Modified: trunk/htdocs/js/tiny_mce.js
===================================================================
--- trunk/htdocs/js/tiny_mce.js 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tiny_mce.js 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,14 +1,14 @@
tinyMCE.init({
mode: "textareas",
- plugins: "fullscreen",
+ height: "100%",
+ plugins: "safari,fullscreen,inlinepopups",
theme: "advanced",
- theme_advanced_buttons1 : "bold,italic,underline,strikethrough,separator,sup,sub,separator,bullist,numlist,outdent,indent,separator,undo,redo,link,unlink,anchor,separator,formatselect,separator,charmap,code,fullscreen",
+ theme_advanced_buttons1 : "bold,italic,underline,strikethrough,separator,styleselect,sup,sub,separator,bullist,numlist,outdent,indent,separator,undo,redo,link,unlink,anchor,image,separator,formatselect,separator,charmap,code,fullscreen",
theme_advanced_buttons2 : "",
theme_advanced_buttons3 : "",
theme_advanced_toolbar_location: "top",
theme_advanced_toolbar_align: "left",
content_css: "/css/editor.css",
- browsers: "msie,gecko,opera",
remove_linebreaks : false,
convert_urls : false,
valid_elements : ""
@@ -267,3 +267,4 @@
+"|onkeyup|onmousedown|onmousemove|onmouseout|onmouseover|onmouseup|style"
+"|title]"
})
+
Copied: trunk/htdocs/js/tinymce/changelog (from rev 656, branches/sucs-site/htdocs/js/tinymce/changelog)
===================================================================
--- trunk/htdocs/js/tinymce/changelog (rev 0)
+++ trunk/htdocs/js/tinymce/changelog 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,1045 @@
+Version 2.0.6.1 (2005-05-04)
+ Fixed issue where the layer and style plugins couldn't be added in incorrect order.
+ Fixed issue with Firefox nl not beeing defined in triggerSave correctly.
+Version 2.0.6 (2005-05-03)
+ Added new theme_advanced_source_editor_wrap option, this gives the possibility to force word wrapping.
+ Added new support for using div,blockquote,dt,dd,code,samp as a items in the theme_advanced_blockformats option.
+ Added new strict_loading_mode option, this switches the loading method from document.write to DOM.
+ Added new hidden_tab_class, display_tab_class options for resolving the MSIE image dimension bug.
+ Added new absolute layer support, this was added to a new plugin called layer.
+ Added new CSS style properties support, this was as a plugin called style.
+ Fixed bug where TinyMCE was reporting a warning when inserting a image while running on HTTPS.
+ Fixed bug where pressing the browser back button after submit removed empty paragraphs in MSIE.
+ Fixed bug where links the the same page as the editor page was converted into a /.
+ Fixed bug where the getSelectedHTML method was returning undefined when selecting controls in MSIE.
+ Fixed bug with unterminated string literal errors where reported in some browsers.
+ Fixed bug where src and href where converted into xsrc and xhref in text.
+ Fixed bug where two characters where removed by backspace sometimes in Gecko.
+ Fixed bug where class drop list wasn't visible in some of the table dialogs.
+ Fixed bug where br elements where incorrectly removed within paragraphs on backspace.
+ Fixed bug where drag/drop operations failed in MSIE when editor height was set to a % value.
+ Fixed bug where width/height was lost on images if they where placed in hidden tabs in MSIE.
+ Fixed bugs with CSS auto import parsing, contributed by Scott Eade.
+ Fixed compatiblity issues with MSIE 5.0. Some RegExps needed to be rewritten.
+ Fixed issue that made it impossible to remove the entity code/name for '.
+ Fixed issue with odd <br></br> elements not beeing handled properly.
+ Fixed issue where TinyMCE couldn't be loaded in a XML document.
+ Fixed issue with contextmenu beeing placed outside of visible area on Gecko browsers.
+ Fixed issue whith area tag not being closed.
+Version 2.0.5.1 (2005-03-22)
+ Fixed bug where emtpy paragraphs sometimes got removed in MSIE.
+ Fixed bug where autosave plugin was running even in fullscreen mode.
+ Fixed bug where browse and color image button urls in form_utils.js where hardcoded.
+Version 2.0.5 (2005-03-21)
+ Added API docs for the TinyMCE_Popup class that is used by all dialogs in TinyMCE.
+ Added new TinyMCE_Layer class to the core of TinyMCE plugins will be using this later on.
+ Added new loadPlugin function, use this to load external plugins.
+ Added instructions on how to contribute language packs.
+ Added new support for multiple content_css files, based on contribution by Man-Chicken.
+ Added new table_cell_limit, table_row_limit, table_col_limit options, based on contribution by Man-Chicken.
+ Added new fix_list_elements option, if this is set to true UL/OL lists will be forced XHTML valid on cleanup.
+ Added new fix_table_elements, if this is set to true tables will be moved outside paragraphs.
+ Fixed so input and button as closed elements in the cleanup logic.
+ Fixed so the mceButtonSelected is more visible with darker background in the editor_ui.css.
+ Fixed issue where charmap.js was calling switchClass that's reserved for buttons.
+ Fixed issue where the directionality option wasn't used in the preview plugin.
+ Fixed issues with nestled bullet lists pasted from Word 2003.
+ Fixed bug where button wasn't selected correctly in MSIE due to a CSS issue.
+ Fixed bug where ask mode wasn't working on DIV elements in Firefox and Opera.
+ Fixed bug where the mceAddFrameControl command wasn't working correctly.
+ Fixed bug where language packs wasn't imported correctly in plugins loaded externaly.
+ Fixed bug where focusing external input elements was visible in element path under MSIE.
+ Fixed bug where fullscreen plugin wasn't opening the window fullscreen in Firefox.
+ Fixed bug where style select dropdown wasn't working in Firefox when used in fullscreen mode.
+ Fixed bug where the fix_content_duplication wasn't working anymore.
+ Fixed bug where MSIE sometimes generated empty paragraphs.
+ Fixed bug where MSIE sometimes generated tags like <//tag>.
+ Fixed bug where the directionality option produced a error for the color picker dialog.
+ Fixed bug where configured callback options wasn't executed correctly in fullscreen mode.
+ Fixed bug where tags got generated as <*> some times in Gecko.
+ Fixed bug where the cursor was placed within a the anchor when inserting a new one in Gecko.
+ Fixed bug where convert_fonts_to_span option wasn't working correctly with new cleanup engine.
+ Fixed various language pack issues such as invalid characters.
+ Fixed naming conflict with zoom plugin and the format select box.
+ Fixed so that the initialization of the editor is slightly faster.
+ Removed all language packs except the english one from the core package. [BREAKS COMPATIBLITY]
+Version 2.0.4 (2006-02-24)
+ Fixed bug where fullscreen plugin was using the tinymce_dev.js script.
+ Fixed bug where events where having a return true; statement infront of them.
+ Fixed bug where theme_advanced_toolbar_location option wasn't working.
+ Fixed bug where select lists wasn't working if you touched them with the tab key.
+ Fixed bug where auto reset design mode wasn't working correctly.
+ Fixed bug where null was inserted in paste button action in MSIE.
+ Fixed bug where _template plugin had a , instead of . character on e.type.
+ Fixed bug where src, href where replaced to xsrc and xhref in comments.
+ Fixed bug where paste_cleanup_on_paste option wasn't working correctly with the paste plugin.
+ Fixed bug where MSIE was reporting an error when TinyMCE was placed in a frame and not focused.
+ Fixed bug where clipboard_msg wasn't entity decoded corectly before displaying it in confirm box.
+ Fixed bug where mceRemoveControl wasn't working correctly on DIV elements.
+ Fixed bug where mceInsertContent/mceReplaceContent produced error when a empty string was inserted.
+ Fixed so the default valid_elements option is more XHTML valid.
+ Fixed issue where style formatting wasn't handled when pasting content from Word.
+ Fixed issue where ' characters wasn't entity encoded, they are now encoded into ' and not '.
+ Fixed issue with empty paragraphs, these are now filled with &nsbp; if they are empty.
+ Added documentation on how the # prefix can be used in the valid_elements option.
+ Added new options paste_remove_styles and paste_remove_spans to paste plugin.
+ Added possibility to have empty default attributes values.
+Version 2.0.3 (2006-02-13)
+ Added missing buttons to button reference page in documentation.
+ Added dt,dl,dd elements to default_valid elements config value.
+ Added new support for self registrering plugins.
+ Added new callback for themes and plugins handleEvent and the handle_event_callback option.
+ Added new execcommand_callback option, this enables you to add custom execcommand logic on page level.
+ Added new custom_shortcuts option, this enables you to disable plugin/theme specific keyboard shortcuts.
+ Added new addShortcut to TinyMCE_Control, this enables plugin to register custom keyboard shortcuts.
+ Added new getButtonHTML function to TinyMCE core, this function makes it easier for plugins/themes to make buttons.
+ Added more documentation on how to write plugins and updated the _template plugin.
+ Added more documentation on how to write custom themes.
+ Fixed so the default window size of the source editor is larger in the advanced theme.
+ Fixed so all internal plugins use the new auto registration and separation logic.
+ Fixed so all internal themes use the new auto registration and separation logic.
+ Fixed so the Safari warning is switched off by default.
+ Fixed so cursor position isn't moved when performing a cleanup.
+ Fixed so cursor position is correct when performing undo/redo actions.
+ Fixed so all themes/plugins now use a:hover to produce the mouse over button effect.
+ Fixed so it uses the DOMContentLoaded and onreadystatechange instead of onload.
+ Fixed so the simple theme also supports the button_tile_map option.
+ Fixed so the selection/cursor is moved to the beginning of area on search/replace.
+ Fixed callback handling to reduce logic, improve performance and flexibility.
+ Fixed documentarion error for the paste plugin, contributed by Jochen Metzger.
+ Fixed bug that made the cleanup process to hang MSIE on specific content.
+ Fixed bug with absolute to relative URL convertion logic if the absolute URL didn't have a path.
+ Fixed bug where about.htm in advanced theme refered to a non existing css file.
+ Fixed bug with defParam and the event_elements option.
+ Fixed bug where fullscreen plugin wasn't correctly setup with editor contents.
+ Fixed bug where paste/drop converted relative URLs incorrectly in MSIE.
+ Fixed bug with inlinepopups not restoring selection on close window in MSIE.
+ Fixed bug where selection was lost when a new column/row was inserted in a table running in Gecko.
+ Fixed bug where save plugin wasn't working in fullscreen mode.
+ Fixed bug where fullscreen plugin wasn't working in Opera.
+ Fixed bug where editor resizing in advanced theme wasn't working in Opera.
+ Fixed bug where cursor position was placed at the end of instance on word paste.
+ Fixed bug where a tinyMCE is undefined error was reported in Firefox.
+ Fixed compatiblity issues with new cleanup plugin and the prototype.js library.
+ Renamed the mceItemEditable/mceItemNonEditable to mceEditable/mceNonEditable.
+ Renamed the TinyMCEControl class to TinyMCE_Control, TinyMCE_ is the valid class prefix.
+ Removed the getInsertLinkTemplate and getInsertImageTemplate functions from themes and from API.
+ Removed insertImage and insertLink from TinyMCE core, they are moved to the advanced theme.
+ Removed opacity workaround made for Opera Preview 1, download Opera Preview 2 instead.
+ Removed search backward function from replace dialog since it could result in a infinite loop.
+ Marked insertlink_callback, insertimage_callback options as deprecated these can be replaced with execcommand_callback.
+ Moved selection specific methods to a new class. For example inst.selectNode is now inst.selection.selectNode.
+ Updated German language pack, contributed by Ace Man.
+Version 2.0.2 (2006-01-24)
+ Added updated Danish language pack contributed by Jan Moelgaard, John Dalsgaard and Bo Frederiksen.
+ Added updated Czech language pack contributed by michi aka mishal.
+ Added new Slovenian language pack contributed by Domen Kosir.
+ Added new Turkish language pack contributed by Engin Dumlu.
+ Added new save_onsavecallback option to the save plugin, this function is called on save.
+ Added new save_enablewhendirty option to the save plugin, this will disable the button until changes are made.
+ Added new onpageload callback event, this event is called when the page is loaded but before instances are made.
+ Added new accessibility_focus option, this enables you to control if buttons should be tab focusable or not.
+ Added new greek alpha character to charmap dialog.
+ Added new Scaron,scaron,Alpha entities to the default value of the entities option thanks to Kevin Rodgers.
+ Added new contextmenu items link.unlink,advhr contributed by Speednet.
+ Added new paste_insert_word_content_callback option for the paste plugin.
+ Added new cleanup plugin, this will replace the one inside the core ones it's considered stable.
+ Added cancel button to color picker contributed by Speednet.
+ Fixed various documentation errors and typos, modified the FAQ.
+ Fixed issue where the first handleNodeChange call was done to early in initialization.
+ Fixed issue with Dutch language pack for advlink plugin.
+ Fixed issue where dialogs was to short when dialog_type option was set to modal in MSIE.
+ Fixed bug where insert image under Gecko resulted in a broken image if it was inserted a the beginning of a element.
+ Fixed bug where mceVisualAid class wasn't removed from TH elements on save.
+ Fixed bug where the href attribute area elements gets converted to xhref.
+ Fixed bug with document relative anchors being forced absolute even when the convert_urls was set to false.
+ Fixed bug where some plugins produced &gr; intead of > entities on string encoding.
+ Fixed bug where some characters in charmap dialog was double encoded in Firefox/Gecko.
+ Fixed bug with XML core entities wasn't encoded when using raw or numeric value in entity_encoding option.
+ Fixed bug where classes was removed from table,td,th elements when the verify_css_classes option was enabled.
+ Fixed bug where elements was getting a visual aid class if a default or force class attribute value rule was used.
+ Fixed bug where strong/em rules didn't handle the -/+ prefixes correctly under Firefox/Mozilla.
+ Fixed bug where non textarea elements didn't work when submiting content.
+ Fixed bug where a access denied error was produced when using contextmenu together with modal dialogs under MSIE.
+ Fixed bug where fullscreen plugin didn't call custom cleanup functions when passing content back and forth.
+ Fixed issue where default rule for font tags didn't have a + prefix in valid_elements.
+ Fixed issue with CSS where "arrow" was used instead of "default" for cursor replacement.
+ Fixed issue where the replace button replaced the current selection first time it was used.
+ Fixed issue with missing title for the advhr dialog.
+ Fixed issue with div not beeing usable in the theme_advanced_blockformats option.
+ Fixed issue in with translation in the German language pack.
+ Fixed so the word wrap toggle for source view functions in Firefox/Mozilla.
+ Fixed so title attribute of emotion images gets inserted aswell as alt.
+ Fixed so the insert return on popups is checked by default in advlink.
+ Fixed so url gets filled when empty if a user selects a popup url.
+ Fixed so some init settings gets trimmed from whitespace.
+ Fixed so charmap closes when a char is selected since most of the time users only need one char.
+ Fixed so the link and image dialogs of advanced theme are styled with the new 2.x layout.
+ Fixed accessibility issuew with the link, image and advhr dialogs.
+ Fixed so the advhr dialog uses the new 2.x layout.
+ Fixed XHTML compliance for Preview plugin contributed by Bo Frederiksen.
+ Fixed entity decoding problem with insert button of the advhr plugin contributed by Bo Frederiksen.
+Version 2.0.1 (2005-12-02)
+ Fixed critical bug in some MSIE versions when submiting content.
+Version 2.0 (2005-12-01)
+ Added new paste_replace_list option to the paste plugin, this replaces some MS specific characters into normal characters.
+ Added new convert_urls option, this was required to address some issues with Firefox 1.5.
+ Added new paste_create_linebreaks option to paste plugin contributed by Kevin Rodgers.
+ Added new advimage_update_dimensions_onchange option to advimage plugin, this is enabled by default.
+ Added new table_inline_editing option, this enables you to toggle the inline table editing controls in FF 1.5.
+ Added new object_resizing option, this enables you to toggle the resizing controls of table and images in FF 1.5.
+ Added updated simplified Chinese language pack contributed by Wang Yang (tom_cat).
+ Added updated Dutch language pack contributed by Mark van der Sanden.
+ Added updated French language pack contributed by Normand Lamoureux.
+ Added updated Polish language pack contributed by Wooya.
+ Added updated Brazilian Portuguese language pack contributed by Marcio Barbosa.
+ Added new Traditional Chinese language pack contributed by Twapweb.
+ Added new Slovak language pack contributed by Vladimir VASIL.
+ Added new Norwegian Nynorsk pack contributed by Knut B. Jacobsen.
+ Fixed bug where getting init settings in handleNodeChange callback wasn't working correctly when multiple configs where used.
+ Fixed bug with urls being converted into incorrect values in Firefox 1.5.
+ Fixed bug where editor and cursor was flickering when TinyMCE was placed in a hidden div in Firefox 1.5.
+ Fixed bug with missing parenthesis in a MSIE setInnerHTML call.
+ Fixed bug where MSIE was producing a "Invalid source HTML for this operation" javascript error when placed in P tags.
+ Fixed bug where some styles with RGB values was parsed/serialized incorrectly in Firefox/Mozilla.
+ Fixed bug where reset form action didn't reset all editor instances to their original values.
+ Fixed bug where a javascript exception whas thrown when the editor was resized to a negative value in MSIE.
+ Fixed bug where inserting custom characters or date/time within a font element removed formatting in Firefox/Mozilla.
+ Fixed bug where image urls was inserted incorrectly if relative_urls was set to false due to issues with inserthtml command.
+ Fixed bug where encoding option wasn't working correctly becurse the entities list wasn't initialized.
+ Fixed bug where MSIE removed the first comment from the HTML of a mceInsertContent call.
+ Fixed bug where update all cells in table/row wasn't working on some tables with lots of whitespace.
+ Fixed bug with td background attribute when inline_styles option was set to true in MSIE.
+ Fixed bug where forms submitted with accesskey or return produced a JS error in Firefox 1.5.
+ Fixed bug with URL convertion logic not converting paths correctly to relative/absolute URLs.
+ Fixed bug where inline_styles option and flash moviews produced strange results.
+ Fixed bug where tabs and links where opened in a new window in MSIE when dialog_type option was set to modal.
+ Fixed bug where dialogs didn't open in Opera if the dialog_type option was set to modal.
+ Fixed bug where the table plugin wasn't working with the inlinepopups plugin while running in MSIE.
+ Fixed bug where embed elements whasn't parsed correctly by the flash plugin if no object tag was surrounding it.
+ Fixed bug where contents wasn't stored/restored when using the browser back button in Firefox 1.5.
+ Fixed issue where the ghost resize handles in Firefox/Mozilla was appearing when resizing images/tables.
+ Fixed issue with constrain proportions feature in advimage plugin, when trying to reset the values to blank.
+ Fixed issue where inlinepopups option couldn't be enabled/disabled on individual instances.
+ Fixed issue where TDs was created instead of TH elements when inserting a column on a row with TH elements.
+ Fixed issue with editor_selector/editor_deselector options couldn't be used when mode was specific_textareas.
+ Fixed issue where font selection produced null face attributes in MSIE.
+ Fixed issue where document local anchors where prefixed with the document name.
+ Fixed issue where link/image dialogs of the advanced theme didn't open using inlinepopups when enabled.
+ Fixed so the CSS select list gets hidden in the link dialog in advanced theme if there isn't any CSS classes.
+ Fixed so that the onsubmit handler of a form was processed correctly when posting using the save plugin.
+ Fixed so TinyMCE makes some very simple cleanups even if cleanup option is set to false.
+ Fixed so alignment button gifs have the justify prefix, such as justifyleft, for compatiblity with Drupal.
+ Fixed compatiblity issues with the .NET version of TinyMCE Compressor.
+ Fixed performance issue with fullscreen plugin, it switches back to normal view a lot faster now.
+ Fixed issues with mceSelectList class in advanced theme and compressed it some.
+ Renamed the Norwegian language pack from no to nb since it's "Norwegian Bokmål".
+Version 2.0RC4 (2005-10-30)
+ Fixed bug with font face/size/color wasn't working correctly in Firefox 1.5b1.
+ Fixed bug where all actions where dispatching the onbeforeunload event.
+ Fixed bug where buttons in fullscreen mode wasn't working in MSIE.
+ Fixed bug where style removal with drop list wasn't working correctly.
+ Fixed bug where element path list or return key some times didn't scroll to the right location.
+ Fixed bug where return key in Firefox/Mozilla some times produced a error.
+ Fixed bug where MSIE was presenting a alert box about insecure items when running TinyMCE over HTTPS.
+ Fixed bug where TR/TD elements width/height attributes produced a JS error on cleanup.
+ Fixed bug where Polish Ctrl+Alt+Z executed the undo function instead of inserting national character.
+ Fixed bug where editor couldn't be initialized if no rows or height where specified on a textarea.
+ Fixed bug where comments sometimes got removed from HTML code.
+ Fixed bug with advimage not inserting onmouseover attribute correctly.
+ Fixed bug where anchors with child nodes messed up list elements.
+ Fixed bug where apply_source_formatting option wasn't working when used together with remove_linebreaks.
+ Fixed bug where empty paragraphs where invisible in Firefox. These are now padded with a .
+ Fixed bug where tables without a border attribute didn't get visual aid borders until cleanup.
+ Fixed bug with URL convertion, absolute URLs to the same domain without trailing slash produced incorrect results.
+ Fixed bug with URL convertion of urls like this somedir/?id=3 produced somedir?id=3.
+ Fixed bug with weird cursor movement when pressing return/enter in a list when running on Firefox/Mozilla.
+ Fixed bug where contents where deleted sometimes when user pressed return/enter running on Firefox/Mozilla.
+ Fixed bug where style elements what generated empty in MSIE, but using style tags is not recommended.
+ Fixed bug with not beeing able to have absolute urls in the external_link_list_url and simmilar.
+ Fixed bug with bold, italic, underline, strikethrough buttons not beeing selected correctly.
+ Fixed bug with font size and font face select list not beeing selected correctly.
+ Fixed bug where document anchors was incorrectly converted if document_base_url was defined.
+ Fixed bug where changing border width/color of a table didn't update CSS styles correcty.
+ Fixed bug where emotions plugin didn't insert a new smiley the second time you insert one.
+ Fixed bug with blockquote command produced javascript error when used on lists in MSIE.
+ Fixed bug with cleanup converting flash elements to images.
+ Fixed bug where class wasn't selected in drop list of advlink/advimage dialogs when editing links/images.
+ Fixed bug where cellpadding/cellspacing/scope wasn't correctly handled in MSIE 5.5SP2.
+ Fixed bug where hreflang,charset and type attributes wasn't returned correctly in MSIE 5.5SP2.
+ Fixed bug with broken image URLs when user clicked the cleanup button in Firefox 1.5b2.
+ Fixed some compatiblity issues with call to createStyleSheet and event.target setup.
+ Fixed more compatiblity issues with scripts extending core JS logic such as the Array class.
+ Fixed issue where paragraphs wasn't generated if user pressed returned inside a H1-H6 running on Firefox/Mozilla.
+ Fixed issue with context menu plugin messing up some onclick events.
+ Fixed issue with missing </tbody> HTML in advanced theme.
+ Fixed issue with Finnish language pack, it wasn't working at all.
+ Fixed issue where button control styles needed to be overriden in default editor_ui.css.
+ Fixed issue with a broken link in the documentation to the theme_advanced_resize_horizontal option.
+ Fixed issue with missing var declaration of a buttons variable in the advanced theme.
+ Fixed issue with missing block elements in block element regexp.
+ Fixed issue where advhr plugin didn't produce valid attribute for noshade.
+ Fixed issue with misslabeled option, plaintext_create_paragraphs is renamed to paste_create_paragraphs.
+ Fixed issue where remove_script_host and relative_urls where treated as true if they where specified as strings.
+ Fixed issue with charmap, made it easier to select/click characters.
+ Fixed issue with search/replace dialogs not being refocused in MSIE.
+ Fixed issues with dialogs being to small if large class names where added. Made sure they can grow.
+ Fixed issues with some dialogs being to small in NS 7.2 and not working correctly in NS 7.1.
+ Fixed missing HEAD element in fullscreen.htm file, contributed by monkeybrain.
+ Fixed some HTML issues with the advhr plugin, contributed by monkeybrain.
+ Fixed some small issues with the span element rule of the XHTML rule set in valid_elements documentation.
+ Added new Opera 9 support, most of the functions is working in the prerelease of Opera 9.
+ Added new paste_strip_class_attributes option to paste plugin, contributed by monkeybrain.
+ Added new merge_styles_invalid_parents option, allows users to control what elements gets styles.
+ Added new theme_advanced_resizing_use_cookie option, this enables you to disable the cookie used by resize.
+ Added new function that converts all font elements to span elements when the editor loads.
+ Added new force_hex_style_colors option, enables you to control the color format of CSS styles.
+ Added new convert_fonts_to_spans option, this option converts fonts to span elements.
+ Added new font_size_classes option, this option is used together with convert_fonts_to_spans.
+ Added new doctype option, enables you to control the internal doctype declaration.
+ Added new event_elements option contributed by happy_noodle_boy.
+ Added new path tooltips for font, span and flash elements such as color, font-family, src and so forth.
+ Added trim_span_elements back again, this option removes unneeded span elements.
+ Added documentation of the apply_source_formatting option.
+ Added updated Danish language pack, contributed by Jan Moelgaard.
+ Added updated Hebrew language pack, contributed by Liron Newman.
+ Added updated Russian language pack, contributed by Vladimir Vitkovsky.
+ Added updated Finnish language pack, contributed by Tuomo Aura.
+ Added updated Spanish language pack, contributed by Adolfo Sanz De Diego.
+ Added updated Italian language pack, contributed by grueff.
+ Added updated Icelandic language pack, contributed by Johannes Birgir Jensson.
+ Removed option convert_fonts_to_styles due to various compatiblity issues. Use convert_fonts_to_spans instead.
+Version 2.0RC3 (2005-09-26)
+ Fixed bug where colorpicker in table plugin wasn't working in Mozilla/Firefox.
+ Fixed bug where closed anchors produced strange results. Anchors are now forced open.
+ Fixed bug where the font style/color functions wasn't producing correct results.
+ Fixed bug where buttons not working if a target was defined in head element.
+ Fixed bug where paragraphs wasn't generated when pressing return/enter in a floating div.
+ Fixed bug where anchor contents was getting lost, contents of anchors are now placed behind them.
+ Fixed bug where style info such font size/face/color was removing parent elements such as LI.
+ Fixed bug where %I wasn't inserting correct hour in the insertdatetime plugin.
+ Fixed bug where MSIE sometimes doesn't output attributes correctly, contributed by Luke Bennett.
+ Fixed bug where images was lost if the user pressed return after a image in a TD on FF.
+ Fixed bug where empty non block elements where produced when hitting return in Gecko browsers.
+ Fixed bug where it was impossible to update tables.
+ Fixed various bugs and issues with removeformatting function it will now remove classes and styles.
+ Fixed compatiblity issues with prototype.js and other scripts that modifies the Object.prototype.
+ Fixed issue where a unnecessary dir and style attribute was generated on the blockquote command in MSIE.
+ Fixed issue with access denied error if page contained iframes with external URLs.
+ Fixed issue where the plugin links in about dialog was linking to blank.
+ Fixed issue with useCSS command not working in Deer park beta.
+ Fixed XHTML table compatiblity issues. Placed bordercolor and height in styles instead of attributes.
+ Fixed issue with tables getting empty summary attribute in MSIE.
+ Fixes so the insert custom character dialog is accessible through keyboard.
+ Removed _self as the default target for links inorder to produce more XHTML compliant code.
+ Removed bordercolor field from table row properties dialog since this is not a valid attribute.
+ Added accessibility warnings to image and table plugin. These can be disabled by the accessibility_warnings option.
+ Added updated Danish language pack, contributed by Jan Moelgaard.
+ Added updated Hebrew language pack, contributed by Liron Newman.
+ Added updated Norwegian language pack, contributed by Knut B. Jacobsen.
+ Added updated German language pack, contributed by salzbermat.
+Version 2.0RC2 (2005-09-12)
+ Fixed bug with plugin tab in about dialog not working in MSIE 5.01.
+ Fixed bug issues with paste and noneditable plugin in MSIE 5.01.
+ Fixed bug where dialogs in the search/replace plugin was to small.
+ Fixed bug where about dialog sometimes produced unknown runtime error in MSIE.
+ Fixed bug where é and í characters was converted the wrong entities.
+ Fixed bug where it was possible to click on the disabled link icon when nothing was selected.
+ Fixed bug where autosave plugin wasn't working with JS submit calls or the save plugin.
+ Fixed bug where file/image browser wasn't working with the default link/image dialogs.
+ Fixed bug where style attributes where parsed/serialized incorrectly when using - and #.
+ Fixed bug where inline popups plugin wasn't working when loading the compressed JS files.
+ Fixed bug with contextmenu showing theme image dialog instead of advimage dialog.
+ Fixed bug with flash plugin trying to include a empty external list JS file.
+ Fixed bug with some fields beeing to short if the file browser was disabled.
+ Fixed bug where contextmenu wasn't recognizing flash elements.
+ Fixed bug where border styles on images and tables was removed.
+ Fixed accessibility issue with colorpicker, added titles and keyboard access.
+ Fixed accessibility issue with toolbar buttons, all toolbar buttons are now wrapped in links.
+ Fixed accessibility issue width browse buttons, these are now wrapped in links.
+ Fixed accessibility issue with select lists, all select lists has now keyboard access.
+ Fixed accessibility issues with missing labels in various dialogs.
+ Fixed accessibility issue with the emotions plugin, this one now inserts a alt text for smileys.
+ Fixed accessibility issue with the locationbar, menubar and so fort in advlink plugin.
+ Fixed accessibility issue with TOC in english help pages. This is not wrapped in a acronym element.
+ Fixed issue with the directionality plugin. It will now get disabled on invalid elements.
+ Fixed issue where popups was the wrong size a new resizeToInnerSize function resizes popups to the correct size.
+ Fixed so empty <a> elements gets removed since they serve no purpose.
+ Added support for TinyMCE grabbing text from input elements if specified in exact mode.
+ Added language specific relative popup width/heights to all build in dialogs.
+ Added missing browser for popup url in advlink plugin.
+ Added missing delete table icon to context menu.
+ Added so it's possible to see the target value in the target select dropdown in the advlink plugin.
+ Updated the documentation to include information about the new language packs.
+ Updated the swedish language pack.
+Version 2.0RC1 (2005-09-06)
+ Renamed CSS classes mcePathTop,mcePathBottom,mcePath to mceStatusbarTop,mceStatusbarBottom,mceStatusbar. [BREAKS COMPATIBLITY].
+ Moved all theme CSS files to a css directory within the theme. [BREAKS COMPATIBLITY].
+ Removed the default theme since the advanced theme can be configured to be as the default theme. [BREAKS COMPATIBLITY].
+ Removed closeDialog method from TinyMCE use tinyMCEPopup.close(); instead of tinyMCE.closeDialog();. [BREAKS COMPATIBLITY].
+ Removed the auto_cleanup_word option, since the paste plugin now handles this better than the build in function.
+ Added improved undo/redo and onchange handling. All modifications are now undo/redo:able.
+ Added new mceBeginUndoLevel/mceEndUndoLevel commands. Used to begin/end a undo/redo:able action.
+ Added new link dialog with tab interface and lots of new fields and options.
+ Added new image dialog with tab interface and lots of new fields and options.
+ Added new about dialog with tab interface, this one replaces the old help dialog.
+ Added new table dialogs with tab interface and lots of new fileds and options.
+ Added new utils directory in tiny_mce script dir. This directory contains various utility classes.
+ Added new TinyMCEPopup class to tiny_mce_popup.js, used for common popup logic.
+ Added new inlinepopups plugin, this makes the popup windows to open as DHTML windows (divs).
+ Added new version info constants to TinyMCE (majorVersion, minorVersion, releaseDate).
+ Added new resizing functionality to the advanced theme, the editor instance can now be resized.
+ Added new theme_advanced_resizing option, enables/disables the new resizing functionality.
+ Added new theme_advanced_resize_horizontal option, enables/disables the horizontal resizing.
+ Added new theme_advanced_path option, enables/disables the element path functionality in statusbar.
+ Added new compressed icons about 1/3 of the original size, contributed by Jozef.
+ Added new center support of images, images are now wrapped in a div with alignment.
+ Added new - character to the valid_elements/extended_valid_elements options this feature removes empty elements.
+ Added new setup_content_dom and submit_content types to custom cleanup callbacks.
+ Added new inst parameter to custom cleanup callbacks, this is a reference to the editor instance.
+ Added new mceColorPicker command to the advanced theme, enables the possibility invoke the color picker.
+ Added new safari_warning option, this enables you to disable the alert that gets presented when running on Safari.
+ Added new editor_selector/editor_deselector options that enables you to specify a include/exclude from convertion class.
+ Added new tinyMCE.addToLang function to reduce the overall size of the language files.
+ Added new auto save plugin. This plugin will confirm that the user want's the leave any modifications unsaved.
+ Added new noneditable plugin. This plugin enables you to disable/enable the possibility to edit various elements.
+ Added new word example, to better illustrate how TinyMCE is to be used when pasting content from Office/Word.
+ Added missing entities eactute,iacute,oacute,uacute,Aacute,Eacute,Iacute,Oacute,Uacute,Yacute,Aacute.
+ Added updated Hebrew language pack contributed by Liron Newman.
+ Added visual aid icon for invisible anchors elements.
+ Added new insert table and delete table commands to context menu.
+ Added new convert_fonts_to_styles option, this option controls if font or span will be used when using font size, color etc.
+ Renamed the theme_advanced_path_location to theme_advanced_statusbar_location.
+ Moved all popup javascript logic into external .js files, inorder to separate presentation and logic.
+ Removed the automatic resizing of popups. Better to use relative window sizes for each language when opening a dialog.
+ Fixed issue where the character map dialog lost focus when inserting a char.
+ Fixed issue where the attribute values where not XML encoded correctly. For example: & will be &.
+ Fixed performance issue with the table plugin, it was executing logic even when it was inactive.
+ Fixed so the directionality gets inherited by all popups/dialogs.
+ Fixed so the CSS file content_css loads after the theme content CSS, user specific CSS extends theme CSS.
+ Fixed so more than 3 toolbar rows may be added in when using the default simple layout.
+ Fixed so the insertdatetime plugin polls it's default date formats from the language pack.
+ Fixes so auto_reset_designmode is enabled by default, to avoid the question about the editor not working in tabs.
+ Fixed better inline styles support for images and tables.
+ Fixed duplicate IDs on advanced theme with external toolbar, contributed by Miguel Fortea.
+ Fixed issue with remove formatting under MSIE, if all contents of a element is selected the element is also selected.
+ Fixed issue with visual aids not being removed from content when cleanup is disabled. But it's NOT recommended to disable the cleanup.
+ Fixed bug where return/enter key sometimes produced empty elements in MSIE.
+ Fixed bug where link list was generated twice in the advanced themes link dialog.
+ Fixed bug issue where embed was converted in to ibed due to some invalid regexps.
+ Fixed bug where summary attribute on tables got lost in MSIE.
+ Fixed bug where the editor scrolled to the top of content when the pasting text with the paste plugin.
+ Fixed bug where external toolbar wasn't translated, contributed by Miguel Fortea.
+ Fixed bug where the editor had a incorrect height, contributed by Miguel Fortea.
+ Fixed bug where visual aid class where presented in element path.
+ Fixed bug where HR elements with a id set to "null" produced runtime error in MSIE.
+ Fixed bug where isDirty wasn't working due to the same function name and variable name.
+ Fixed bug where events like onclick wasn't removed/stored correctly in old MSIE.
+Version 1.45 (2005-06-23)
+ Fixed so the newdocument button shows again, was removed by accident in RC2.
+ Fixed so styles drop down in link dialog gets hidden if no classes are defined.
+ Fixed bug where Paste command in context menu wasn't working.
+ Fixed bug issue with not having a base href element in preview plugin.
+ Fixed bug where input elements produced double type/value attributes in MSIE.
+ Fixed so the check for empty contents in cleanup handled uppercase elements.
+ Added a alert box is a popup is blocked by a popup blocker.
+ Added updated dutch language pack, contributed by Fred Stuurman.
+ Added a confirm dialog for the newdocument action.
+ Added mceContentBody class to the iframe document body.
+ Added allowtransparency attribute to iframe.
+ Added fix where some HTML content produced runtime error in MSIE.
+ Added a lot better Safari support, but many things are still very buggy.
+ Added flash_wmode, flash_quality and flash_menu options for the flash plugin.
+ Added new dialog_type option, this enables you to switch back to modal dialogs in MSIE.
+ Updated Canadian French table language pack contributed by Virtuelcom.
+ Fixed some minor issues with Simplified Chinese language pack.
+ Re-added Tahoma font to font drop list, was removed in previous version.
+Version 1.45 RC2 (2005-06-15)
+ Fixed bug where paste_use_dialog option for the paste plugin wasn't working correctly.
+ Fixed bug issue with setContent not calling custom cleanups correctly. Inflicts the Flash plugin.
+ Fixed bug where external_link_list_url/external_image_list_url in fullscreen mode.
+ Fixed so TinyMCE doesn't use modal dialogs on MSIE, these where giving some problems with for example lost sessions.
+ Fixed the auto resize function for popups to use new logic.
+ Fixed so callback functions gets called correctly from fullscreen mode.
+ Fixed misspelled language pack for canadian french in the advimage plugin.
+ Fixed so openWindow can open use absolute URL:s.
+ Fixed bug issue where auto_cleanup_word sometimes didn't work in MSIE.
+ Fixed bug issue where the close button in dialogs wasn't available on Firefox on MacOSX.
+ Added new pastetext icon contributed by speednet.
+ Added new browsers option that enables you to specify what browsers is to be WYSIWYG enabled or not.
+ Added partial Catalan translation contributed by Marc Bria Ramírez.
+ Added portuguese Brazil translation contributed by João Borges.
+ Added updated Simplified Chinese language pack contributed by cube316.
+ Added beforeunload handler for fullscreen plugin so contents gets updated when the window is closed.
+ Added a new fullscreen_settings option for the fullscreen plugin contributed by David Glick.
+ Added new insert table command to context menu when user clicks within a table.
+ Added new advimage_constrain_proportions option to advimage plugin, contributed by Knut B. Jacobsen.
+ Added updated advanced theme with a new external toolbar location option, contributed by Man-Chicken (http://www.zoomshare.com/).
+ Added new tiny_mce_gzip.php file, this PHP script merges and compressed the requested .js files to improve loading times.
+ Added updated czech language pack, contributed by Stanislav Lacko.
+ Added new mceRemoveNode command, this command removes a node and inserts the node contents instead.
+ Added new behavior to format select box, you can now remove a paragraph by selecting -- Format --.
+ Removed ?rnd from external_link_list_url/external_image_list_url since it doesn't work well with serverside scripts.
+Version 1.45 RC1 (2005-05-27)
+ Fixed bug where character map inserted & and </> when using & < >.
+ Fixed so paragraphs containing is converted to numeric or raw if entity_encoding is set.
+ Fixed bug in searchreplace plugin when user tried to search on a empty string or the editor contents was empty.
+ Fixed repaint/trail graphics issues with images and tables in FF/Mozilla.
+ Fixed some memory leaks in TinyMCE core and context menu plugin, only MSIE was inflicted by this.
+ Fixed stange issue where elements sometimes disappeared in MSIE.
+ Fixed URL convertion problems with onmouseover, onmouseout image urls in advimage plugin.
+ Fixed URL convertion problems with Flash plugin.
+ Fixed the experimental Safari support, some features work some doesn't.
+ Fixed bug where multiple a elements where created when updating links on images in FF/Mozilla.
+ Fixed bug in importCSS function, was having a meaning less if statement.
+ Fixed so the contextmenu plugin uses images from the configurated theme instead of the advanced theme.
+ Fixed so the external_link_list_url/external_image_list_url options can use relative or absolute path.
+ Fixed so the external_link_list_url/external_image_list_url has a random query parameter to prevent it from cache.
+ Added new mceInsertRawHTML command, this inserts raw as it is HTML code in the the selected position.
+ Added paste plain text plugin contributed by Ryan Demmer, converted it into a paste plugin.
+ Added updated paste plugin contributed by speednet, includes paste directly feature for MSIE.
+ Added split/merge table cells support, to table plugin and context menus.
+ Added cut/copy/paste table rows functionality to context menu and table plugin.
+ Added new mceSetContent command, this does the same as the setContent function.
+ Added new clear all/new document icon to advanced theme.
+ Added new remove formatting and select text color icons.
+ Added new directionality plugin to better support languages that write from right to left.
+ Added new fullscreen plugin, enables users to toggle fullscreen editing mode.
+ Added a new template/tutorial plugin to aid people in the development of own plugins.
+ Removed visual_table_style and replaced it with visual_table_class. [BREAKS COMPATIBLITY].
+ Renamed urlconvertor_callback option to urlconverter_callback.
+Version 1.44 (2005-05-03)
+ Fixed bug with contextmenu not showing at the correct location in MSIE.
+ Fixed bug where a error was produced by the Flash plugin if the user reloaded the page in MSIE.
+ Fixed issue where mceAddControl and mceRemoveControl commands produced a error in MSIE.
+ Fixed bug when images and flash movies where mixed in the editor produced strange results.
+ Fixed so trailing / characters isn't removed from URLs.
+ Fixed so the contextmenu uses a diffrent method of loading it's custom CSS file.
+ Fixed getAttributes problem, it should read getAttribute.
+ Fixed so "Edit HTML source" window may be maximized.
+ Added French eacute entitiy to default entities option.
+ Added a height CSS value for the element path in advanced themes editor_ui.css since it keept bobbing up and down.
+ Added updated Polish language pack contributed by Marcin Szymon Sznyra.
+ Added better window auto resize method for most dialogs.
+ Added new feature to set what tags are to be left open in valid_elements. Add a + before the element names to enable.
+ Added nowrap for the editor table cells, sometimes the editors controls wrapped.
+ Updated German language pack contributed by Krokogras.
+Version 1.44 RC2 (2005-04-25)
+ Fixed bug with host prefixes and port numbers when having relative_urls set to false and remove_script_host set to true.
+ Fixed bug when site absolute URLs for example /something was converted incorrectly in Firefox/Mozilla.
+ Fixed bug where the link wasn't auto selected in the drop list in the advanced themes default link dialog.
+ Fixed bug issue with the flash plugin and croping out characters before and after the movie.
+ Fixed bug where the editor jumped to top of editor area on enter/return when doctype was set to XML Transitional.
+ Fixed bug where context menu was appearing in the wrong location if the window was resized.
+ Fixed bug in the context menu where table properties wasn't working.
+ Fixed bug where a selectorText exception was trown if the CSS file contained @import or @charset.
+ Fixed bug where bold/italic/strikethough/underline wasn't selected/unselected in toolbar some times.
+ Fixed issue with hspace and vspace when having the inline_styles option enabled. Contributed by speednet.
+ Fixed bug where access denied error was thrown sometimes in MSIE.
+ Fixed so images without src won't be inserted.
+ Fixed some issues with width/height fields in the advimage plugin.
+ Fixed so the contextmenu plugin doesn't appear in MSIE 5.0, now functions with 5.5+.
+ Added filebrowser icon to mouse over and mouse out fields in the advimage plugin.
+ Added filebrowser icon to popup field in the advlink plugin.
+ Added so the triggerSave function gets auto executed when a user calls submit on a form, this can be disabled with the submit_patch option.
+ Added missing readme.txt file for the context menu plugin.
+ Added new border and background color fields to table dialog, based on contribution by Neirda. Enable them by the table_color_fields option.
+ Removed some old outdated items from FAQ.
+Version 1.44 RC1 (2005-04-20)
+ Fixed bug where width/height attributes of a image wasn't stored some times in Firefox/Mozilla.
+ Fixed bug where P elements where created if a user pressed return/enter within a h1-h6 in Firefox/Mozilla.
+ Fixed bug where the remove format fuction didn't work some times in MSIE.
+ Fixed so backspace/delete gets added in one undo level in MSIE (improves performance).
+ Fixed so the "Could not find element by id or name" alert only shows when the debug option is set to true.
+ Fixed bug where bold/italic didn't work in Mozilla 1.3.
+ Fixed bug where width/height of a hidden TinyMCE instance where incorrect.
+ Fixed so the function layout of classes in tiny_mce_src.js uses prototype keyword instead of TinyMCE_ prefix (reduces size).
+ Fixed bug where triggerNodeChange produced javascript error some times in MSIE.
+ Fixed some issues in the Swedish and Spanish language packs.
+ Fixed bug where first undo level wasn't working correctly.
+ Fixed so flash plugin loads it's needed CSS data from within the plugin.
+ Fixed button images and CSS in the simple theme.
+ Fixed so the simple example shows how to use the simple theme instead of the default theme.
+ Fixed so cleanup default values can be set to empty. For example alt= generated alt="" on img elements.
+ Fixed memory leaks in MSIE (circular closure problem) events are now removed in a better way.
+ Fixed bug where URLs where converted incorrectly if the editor page URL contained / characters.
+ Fixed bug where table guidlines didn't work correctly when using the build in Mozilla table buttons.
+ Fixed bug where the Flash plugin was breaking other elements.
+ Added new contextmenu plugin, this plugin adds a menu if the user right clicks/uses the contextmenu on elements.
+ Added new multiple configuration support, the init method may now be called multiple times.
+ Added new remove_linebreaks option, this option is enabled by default and removes all HTML code linebreaks.
+ Added new behavior to the textarea_trigger option, if mode is textareas and trigger is false those elements will not be converted into editors.
+ Added new entity_encoding option, enabled user to better control the behavior of how character are converted into entities.
+ Added new isDirty command to TinyMCEControl, this method returns true if the user has done any modifications to the content.
+ Added new onchange_callback option, this callback is executed when contents within the editor instance is changed.
+ Added new init function for themes/plugins this gets called when a editor instance has finished it's setup.
+ Added new init_instance_callback option this callback is executed when instances are added to the editor.
+ Added new cleanup option this option enables users to totaly disable the whole cleanup process.
+ Added new importCSS method to TinyMCE. This method allows plugins and themes to load custom CSS files on initialization.
+ Added new getSelectedHTML method to TinyMCEControl class, this method returns the currently selected HTML contents.
+ Added new getSelectedText method to TinyMCEControl class, this method returns the currently selected contents as text.
+ Added new removeclass behavior to the removeformat button. The current class will be removed if no contents is selected.
+ Added new queryInstanceCommandValue and queryInstanceCommandState methods.
+ Added new option button_tile_map, this option contols the usage of button tile maps and is disabled by default.
+Version 1.43 (2005-03-06)
+ Fixed bug with ask option not working at all.
+ Fixed bug where a "instance is not defined bug" error was produced.
+ Fixed bug with empty image src produced a error.
+ Fixed so the simple and default theme used the same CSS style as the advanced theme.
+ Fixed bug with the relative to absolute URL convertion logic if a empty string was passed used.
+ Fixed parse error bug with the source editor some servers can't handle XML PI declarations.
+ Fixed bug issue with HR elements in MSIE, if a specific work pattern where used a runtime error was produced by MSIE.
+ Fixed bug in the URL convertor logic, port numbers was not correctly handled.
+ Fixed issue where the cursor was placed before a insert of custom charater or date/time.
+ Fixed bug where the editor height option didn't work on MSIE.
+ Fixed bug where a linefeed within a table cell broke the table in Firefox/Mozilla.
+ Fixed bug where return/enter key after a image removed all content.
+ Fixed bug where return/enter key sometimes produced nestled P elements.
+ Fixed bug where the editor was stealing focus on load in MSIE.
+ Fixed bug where the visual aid logic forces width/height attributes on tables.
+ Fixed bug where getCSSClasses some times returned null value.
+ Fixed issue where the lang_insert/lang_update language variables wasn't entity decoded.
+ Fixed so the image/link/flash drop list gets auto selected thanks goes to Randy Simons and salzbermat.
+ Fixed so remove formatting button in MSIE removes all classes aswell.
+ Fixed issue where output contained single br element when the editor area was empty.
+ Added new %A/%a/%B/%b format chunks to insertdatetime, these insert localized date names such as January.
+ Added new oninit callback option for TinyMCE this callback is executed when all editor instances been initialized.
+ Added new preview panel to dialog in the advimage plugin, contributed by Virtuelcom.
+ Added element class name to element path in the advanced theme.
+ Updated Canadian French table language pack contributed by Virtuelcom.
+ Updated the swedish language pack, contributed by Mats Löfström, York Consulting AB.
+Version 1.42 (2005-02-14)
+ Fixed bug with the element path beeing resized if width/height of editor was 100%.
+ Fixed bug with reloading/flicker of all button images in MSIE if browser cache is disabled.
+ Fixed backspace/delete bug in Firefox, some times the cursor got stuck.
+ Fixed bug issues with enter/return key in Firefox/Mozilla.
+ Fixed bug where copy/paste and drag drop of images/links failed in Firefox/Mozilla if a document_base_url is provided.
+ Fixed so when relative_urls is set to false it forces absolute URLs for images/links.
+ Fixed so the _src.js suffix versions of the themes and plugins gets loaded with the tiny_mce_src.js script is used.
+ Fixed so verify_css_classes option is disabled by default.
+ Fixed bug where tables where resized when toggling visual aid in Firefox/Mozilla.
+ Fixed bugs with advhr plugin running in a hidden div element.
+ Added new auto_focus option that enabled a specific editor area to be focused on startup.
+ Added a extra argument to the filebrowser callback inorder to get the calling window reference.
+ Added a new persian (farsi) language pack contributed by Morteza Zafari.
+ Added new more nice looking icons contributed by Morteza Zafari and Michael Keck. The old icons are available in a separate icon pack.
+ Added updated Canadian French language pack contributed by Virtuelcom.
+ Added updated French languahe pack contributed by Laurent Dran.
+ Added updated German language pack contributed by Tobias Heer.
+ Added some documentation regarding the layout manager options made by SlyD.
+Version 1.41 (2005-01-31)
+ Added new table plugin, all table code is moved into this plugin [BREAKS COMPATIBLITY].
+ Added new external_link_list_url/external_image_list_url options for better backend integration.
+ Added new file_browser_callback option for better backend integration.
+ Added new layout manager code into the advanced theme, contributed by SlyD.
+ Added new nowrap option, enables so users may change the word wraping behavior.
+ Added new Thai language pack contributed by Innozent.
+ Added obfuscated version of all plugins and themes to reduce over all startup/download time.
+ Added Simplified Chinese language pack contributed by cube316.
+ Added a updated Czech language pack thanks to Josef Klimosz.
+ Fixed issue where anchor elements where closed. This results in browser problems with the outputed HTML.
+ Fixed bug where the first return key press didn't produce a paragraph in Firefox/Mozilla.
+ Fixed bug in the searchreplace plugin where replace content sometimes fails in Firefox/Mozilla.
+ Fixed so all language packs now uses the ISO-639-2 code instead of ISO 3166-1 [BREAKS COMPATIBLITY].
+ Fixed some issues with the force_br_newlines option in MSIE.
+ Fixed bug where the backspace or delete key produced BR elements in Firefox/Mozilla.
+ Fixed bug issue with link and image dialogs of the default theme/simple example.
+ Fixed some bugs when having the editor hidden in a tab/div, contributed by Ernst de Moor.
+ Fixed some character issues with the Danish language packs, contributed by someone unknown.
+Version 1.40 (2005-01-09)
+ Added a new default value for the font size drop down, if no font size where found this gets selected.
+ Added a auto resize window feature, this is enabled by default but can be disabled with a window argument.
+ Added a new print plugin, prints the current editor contents to a printer.
+ Added a new searchreplace plugin, adds a search, searchnext and replace button.
+ Fixed bug issue where buttons didn't display correctly on some Firefox installations.
+ Fixed issue with value and type attributes of input elements getting lost in cleanup on MSIE.
+ Fixed so that the getEditorInstance command is public, returns a TinyMCEControl by id.
+ Fixed issue where "true" and "false" string wasn't treated as booleans in TinyMCE init options.
+ Fixed so cursor/mousepointer allways remains a arrow in all themes when rolling over buttons.
+ Fixed the popup windows so they are mode "modal" in Mozilla/Firefox.
+ Fixed so the ask question is displayed when elements are focused with the tab key.
+ Fixed so the ask option works when mode option is set to exact.
+ Fixed issue with visualaids on tables not working correctly when the user uses the tab key in Firefox/Mozilla.
+ Fixed some bugs with the mceSetCSSClass class command and the element path.
+ Fixed a new version of the mceInsertContent command.
+ Fixed so the auto_cleanup_word option is disabled by default.
+ Removed the langs of the zoom plugin, it now uses + instead of the "zoom" word.
+Version 1.391 (2005-01-04)
+ Fixed major spacebar bug in MSIE, spacebar was disabled.
+Version 1.39 (2005-01-04)
+ Updated the Flash plugin with a new version, contributed by jamesw.
+ Added new setWindowArg function, useful if plugins are to call other plugins.
+ Added new save plugin, this plugin adds a save/submit form button to tinyMCE, contributed by SlyD.
+ Added new hilite color support, sets a background-color style on the selected text.
+ Added new variable replacement popup URLs, check the openWindow function documentation for details.
+ Added new force_p_newlines option, forces P elements on return/enter key in Mozilla/Firefox.
+ Added new theme_advanced_path_location, adds a element path list.
+ Added new theme_advanced_toolbar_align option, defaults to center.
+ Added new Portuguese translation contributed by José Pedro Pereira.
+ Added new mceSelectNode and mceSelectNodeDepth commands.
+ Added new add_unload_trigger option, this adds a unload triggerSave call. Enabled by default.
+ Added am/pm time format to the insertdatetime plugin.
+ Fixed font color and size attribute bug, contributed by Vincent FIACK.
+ Fixed className undefined bug, Firefox/Mozilla produced a console error sometimes.
+ Fixed so mceSetCSSClass command may be applied to all sorts of elements.
+ Fixed so anchor elements can be removed by setting the anchor name to nothing.
+ Fixed typing performance some in Firefox/Mozilla, removed some nodechange triggers.
+ Fixed so the zoom plugin is invisible in MSIE 5.0, since zoom isn't available in that browser.
+ Fixed bug with the emotions plugin in MSIE 5.0, it was opening a new window.
+ Fixed so contents stay within the editor if the user hits the back/forward buttons.
+ Fixed bug where the window.name property was set to the image name.
+ Fixed so anchors links within the same page are made relative when relative_urls are set to false.
+ Updated the advanced theme so most of the images are loaded from a tiled image, improves loading time.
+ Updated the Swedish language pack, contributed by Martin.
+ Updated the readme.txt in the advlink plugin, was some problems with the valid_elements.
+ Updated the default CSS for the advanced theme some, added button backgrounds to look like office2k.
+Version 1.38 (2004-11-28)
+ Added new textarea field for form elements when debug mode is enabled, contributed by Michael Keck.
+ Added new spacer item support for the theme_advanced_buttons<n> options, contributed by Michael Keck.
+ Added new selection borders for images and hr elements, contributed by Michael Keck.
+ Added new advhr plugin, this plugin handles advanced settings on HR elements, contributed by Michael Keck.
+ Added new german language pack for the preview plugin, contributed by Michael Keck.
+ Added new word wrap and source formatting to the source editor, contributed by Michael Keck.
+ Added new updated charmap, contributed by Michael Keck.
+ Added new flash plugin that enabled flash movied to be handled, contributed by Michael Keck.
+ Added the old cut/copy/paste commands to the advanced theme, these are not visible by default.
+ Added new theme_advanced_buttons<N>_add_before option to advanced theme.
+ Added new "update" button title for a popup windows.
+ Added new zoom prefix language variable to the zoom plugin.
+ Added new entities option, that enables you to config entity code to name convertion.
+ Added new custom cleanup possibility to plugins.
+ Added new cleanup_callback option, adds the possibilty to add custom cleanup logic.
+ Added new Norwegian language pack, contributed by Sten Aksel Heien.
+ Added new Korean language pack, contributed by Setzer Gabbiani.
+ Fixed the layout of the color picker, contributed by Michael Keck.
+ Fixed so the preview plugin doesn't include the any toolsbars in preview popup window, contributed by Michael Keck.
+ Fixed bug where anchors elements was treated as links.
+ Fixed so all popup windows are modal dialogs in MSIE.
+ Fixed bug where the word "null" sometimes appares in HTML after cleanup in Firefox/Mozilla.
+ Fixed bug where form elements with missing name attributes produced errors.
+ Fixed some default value bugs and issues with the new advlink plugin.
+ Fixed the link/image dialog sizes in the SE language pack.
+ Fixed the content duplication bug, it seems to be fixed anyway, if not please let me know.
+ Fixed bug where plugin handleNodeChange extentions broke the theme function.
+Version 1.37 (2004-11-12)
+ Added new mceResetDesignMode command that can be used when the editor is placed in tabs.
+ Added new updated Italian language pack thanks goes to "Fabrix Xm" for the contribtion.
+ Added new greek language pack thanks goes to "Jacaranda Bill" for the contribution.
+ Added new french language pack thanks goes to "Pat Boens" for the contribution.
+ Added new russian language pack thanks goes to "Roman Filippov" for the contribution.
+ Added new updated Dutch language pack thanks goes to Arnoud van Delden and Ernst de Moor for the contribution.
+ Added new convert_newlines_to_brs option, that enables newlines to be converted to br elements.
+ Added new custom_undo_redo_keyboard_shortcuts option, enables keyboard shortcuts to be enabled/disabled.
+ Added new auto_reset_designmode option, thats resets the design mode when a editor instance is focused.
+ Added new form reset handler, resets the contents of TinyMCE areas when the onreset event is trigged.
+ Added new skip_cleanup parameter to triggerSave, this parameter is optional and defaults to false.
+ Added new lang_underline_img language variable to all themes.
+ Added new title attribute to all images, enables tooltips in Mozilla and Firefox.
+ Added new insert and cancel CSS id's for all submit and cancel buttons.
+ Added new full featured example that includes all available plugins and buttons.
+ Added new advlink and advimage plugins to TinyMCE, these are more advanced link and image tools. Contributed by Michael Keck.
+ Added new parameters to insertImage and insertLink commands. Contributed by Michael Keck.
+ Added updated compatiblity chart, includes a matrix table thanks goes to Ernst de Moor.
+ Added new insert image icon contributed by Arnoud van Delden and Ernst de Moor.
+ Added window focus on all popup windows, contributed by Arnoud van Delden and Ernst de Moor.
+ Fixed some issues with the char map added some characters and removed duplicate ones, contributed by Arnoud van Delden and Ernst de Moor.
+ Fixed the insert row icon, rotated it 180 degrees, contributed by Arnoud van Delden and Ernst de Moor.
+ Fixed the visual aid icon, made it a bit darker. Contributed by Arnoud van Delden and Ernst de Moor.
+ Fixed some issues with entity encoding in source editor aswell as in core cleanup code.
+ Fixed bug where the auto import CSS feature imported invalid CSS rules with : or spaces.
+ Fixed bug where unnecessary entity encoding of characters was done.
+ Fixed the window sizes some to better function on MSIE with SP2.
+ Fixed some issued with the auto word cleanup feature, fixes some issued with content duplication.
+ Fixed bug that made the editor to throw weird error when HTML code includes <!a or <!/a> content.
+ Fixed bug where the style attribute was returned on images in source output even if it was disabled.
+ Fixed issue where the UI form elements of TinyMCE was submitted with the form submit.
+Version 1.36 (2004-10-19)
+ Added a newly modified version of the German language pack from "krokogras".
+ Added auto resizing to popup windows with the same name.
+ Added example page for the plugin_preview_pageurl option in the preview plugin.
+ Fixed issue with link button auto enable/disable feature when content selection was made with the keyboard.
+ Fixed bug where events wasn't handled correctly in MSIE 5.5 and some 6.0 versions.
+ Fixed so align on images gets set as float style when the inline_styles option is enabled.
+ Fixed so solid border style isn't applied on elements with a border when the inline_styles option is enabled.
+ Fixed some issues with tables and the inline_styles option.
+ Fixed back button issue with MSIE, iframes was placed in browser history.
+Version 1.35 (2004-10-13)
+ Added so that whitespace gets stripped in plugin and theme_advanced_buttons options.
+ Added custom plugin_preview_pageurl option to preview plugin.
+ Added Canadian French language packs for the new plugins, contributed by Virtuelcom.
+ Added new theme_advanced_blockformats option.
+ Added new title support to advanced theme link dialog.
+ Added new Ctrl+B/I/U keyboard shortcuts for Firefox.
+ Added Polish language pack contributed by "revyag".
+ Added Taiwanese language pack contributed by "Jim Kou".
+ Added updated German language pack contributed by "Krokogras".
+ Fixed some issues with ieSpell including better language support.
+ Fixed bug with default value in valid_elements not working in Firefox some times.
+ Fixed bug when focusing links without selecting any characters.
+ Fixed some typos in Swedish language pack.
+ Fixed bug with content selection and link button auto enable/disable feature.
+ Fixed bug issue when "theme_advanced_buttons<N>" options where left empty.
+ Fixed various bugs with absolute URLs.
+Version 1.34 (2004-10-03)
+ Added new insertdatetime plugin, inserts date/time in various formats.
+ Added new preview plugin, previews the HTML page in a new window.
+ Added new zoom plugin, adds the possibility zoom the editor in MSIE.
+ Added new emotions plugin, adds the possibility to add smileys.
+ Fixed so that TinyMCE functions on MSIE 5.0 again.
+ Fixed so that TinyMCE functions better on Mozilla 1.3.
+ Fixed so that the cursor doesn't jump to the top when setting styles.
+ Fixed bug with STRONG and EM elements wasn't handled correctly in Firefox.
+ Optimized the key handling some, gives better typing performance.
+ Removed key down statusbar debug info.
+Version 1.33 (2004-09-29)
+ Removed the need of loading blank.html, iframes are now created dynamicly.
+ Fixed bug when selecting tables, MSIE was casting errors.
+ Fixed bug with pluginurl variable.
+ Fixed bug when tinyMCE.selectedElement error was cast in Mozilla.
+ Added new Arabic language pack contributed by Hani Suleiman.
+ Added "lang_dir" support to language packs like Arabic.
+Version 1.32 (2004-09-25)
+ Added new ieSpell plugin, only works in MSIE.
+ Added new "theme_advanced_buttons<N>_add" option.
+ Added new importPluginLanguagePack function.
+ Added new Danish language pack contributed by Jan Moelgaard.
+ Added updated German language pack contributed by Christopher Müller.
+ Added new any_selection to handleNodeChange callback.
+ Modified so link/unlink is dimmed if nothing is selected.
+ Fixed bug when deleting images in Firefox.
+ Changed the plugin location to a new plugin directory.
+ Renamed the "theme_plugins" option to "plugins".
+Version 1.31 (2004-09-18)
+ Added Canadian French language pack, contributed by Virtuelcom.
+ Added so link/unlink buttons gets selected when user enters a link element.
+ Fixed URL bug when drag dropping/copy pasting images in Mozilla.
+ Fixed so mso style attribs don't get trimmed if auto_cleanup_word option is set to false.
+ Fixed bug with text alignment buttons.
+ Fixed bug with CSS auto import function in MSIE.
+ Fixed initialization bugs and issues.
+Version 1.30 (2004-09-10)
+ Fixed bug issue where the editor was stealing focus from location bar.
+ Fixed bug issue with absolute aligned images lost focus when using tools.
+ Fixed bug #1025483, Url converting broken.
+ Added ability to send command values in advanced theme button list, contributed by someone helpfull.
+ Added new cleanup_on_startup option, to increase startup speed.
+ Added new inline_styles partly based on a contribution by Victor Nilsson.
+ Added new named anchor support.
+ Added custom_undo_redo_levels option.
+Version 1.29 (2004-09-08)
+ Added new getEditorId function, to retrive the editor id of a form element.
+ Readded so cleanup is automaticly executed on editor startup in MSIE.
+ Added some various cleanup fixes for MS Word HTML.
+ Added new auto_cleanup_word option, enabled auto MS Word HTML cleanup on paste events.
+ Fixed parameter issue with insertImage function. Bug #1022863.
+ Fixed bug #1022874, Where the small theme had underline command on strikethrough button.
+ Fixed some bugs with table commands.
+ Fixed bug #1023204, mceRemoveControl brings back the old HTML.
+ Fixed bug issue with tinyMCE.selectedInstance in Mozilla.
+ Fixed bug issue with Mozilla not saving content.
+Version 1.28 (2004-09-04)
+ Added new Finnish language pack thanks to Urho Konttori.
+ Added new rowseparator as a possible value of the theme_advanced_buttons<n> options.
+ Added new theme_advanced_toolbar_location option.
+ Added new uid variable option to valid_elements. (Generates unique IDs)
+ Added new "directionality" option to support languages like Arabic.
+ Added new character map button/window.
+ Added new guidelines/visual aid toggle button.
+ Reduced the source of the advanced theme some, and added some better comments.
+ Separated the default theme in to files aswell.
+ Removed source area size options and made source editor resizable instead.
+ Increased the default width and height of the source editor.
+ Fixed bug where image width/height default to 0x0 if these attributes wasn't defined.
+ Fixed some bug issues with MSIE 5.5.
+Version 1.27 (2004-08-29)
+ Added new cleanup logic, with new options and smarter behavior.
+ Added new "trim_span_elements" option (removed unneeded span elements).
+ Added new "verify_css_classes" option (verifies so class attributes contain a valid class).
+ Added new "verify_html" option (enables/disabled verification of elements and attributes).
+ Added new value verification type to "valid_elements" option.
+ Added new simple wildcard support in "valid_elements" option.
+ Added class as a valid attribute to table elements by default.
+ Added so non existent classes gets removed HTML output.
+ Added fix for entities, so they get converted correctly.
+ Added new class select box in table dialog.
+ Added hr as a default valid element.
+ Fixed some issues with the language packs.
+ Fixed some weird bugs and issues with hr elements.
+ Fixed bug where Mozilla was casting exceptions on keypress.
+Version 1.26 (2004-08-25)
+ Added a better way to create theme popup windows (External files).
+ Added new getWindowArg function, returns window arguments in theme popups.
+ Modified the advanced theme to adopt the new theme popup idea.
+ Fixed critical Mozilla bug, where the editor didn't work at all some times.
+ Fixed bug with auto CSS class import feature running on Firefox.
+Version 1.25 (2004-08-22)
+ Added new format select box in advanced theme (Can be disabled).
+ Added new "theme_advanced_disable" option to advanced theme.
+ Added some new elements to default list of valid elements (Format select box elements).
+ Added new font face, forecolor and font size support, these are not enabled by default.
+ Added new "mceAddControl" command, enables users to dynamicly add editors.
+ Added new execInstanceCommand function, check the documentation for details.
+ Added new "mceSetAttribute" command.
+ Modified the themes so that the focus alert doesn't popup as often as before.
+ Modified the "mceRemoveControl" command so it can handle element id aswell as editor ids.
+ Fixed some bugs and issues with the new custom undo/redo logic.
+ Fixed weird Mozilla bug #997860.
+Version 1.24 (2004-08-17)
+ Modified so that span with CSS classes that don't exists get removed.
+ Added new "custom_undo_redo" option, this option is enabled by default.
+ Added new "fix_content_duplication" option, that fixes some MSIE content duplication issues.
+ Added new "mceFocus" command, that changes focus to the specified editor instance.
+ Added new "mceReplaceContent" command, that enables users to replace the current selection.
+ Fixed so styles including spaces doesn't get listed in style selection box.
+ Fixed bug with form element names and exact mode in Mozilla.
+ Fixed so tiny_mce_src.js can be used aswell as tiny_mce.js.
+ Converted some of the language packs to better support unicode.
+Version 1.23 (2004-07-31)
+ Modified the mceSetCSSClass command to address bug #997071.
+ Added new Hungarian language pack thanks to 2XP.
+ Added new callback "setupcontent_callback" check the manual for details.
+ Fixed bug #994506, where empty theme_plugins option generated a 404 error.
+ Fixed bug #999332, where image properties wasn't removed if the user deleted the image.
+Version 1.22 (2004-07-19)
+ Fixed bug #989846, Image resize bug.
+ Changed so that style attribute values get converted to lowercase in MSIE.
+ Changed so the alignment called "middle" is "center" in table properties.
+ Fixed so visual aids work correctly after using the source editor.
+ Fixed some issues with anchor links.
+ Fixed so that javascript: links can be used.
+ Added width/height options for the advanced source editor.
+ Fixed bug issue with URL:s containing quotes or single quotes.
+ Fixed so that document_base_url can point to another domain.
+Version 1.21 (2004-07-12)
+ Added new "theme_plugins" option, check the manuals for details.
+ Added new "execCommand" plugin extention possibility.
+ Added new "buttons<n>" config options to the advanced theme.
+ Added new "mceRemoveControl" command.
+ Added Spanish language pack thanks to "Alvaro Velasco".
+ Fixed first click bug.
+ Fixed so CSS url:s can be absolute.
+ Updated the FAQ regarding the Cut/Copy/Paste issue.
+Version 1.20 (2004-07-05)
+ Fixed bug issue #983257, JS runtime error when template contains no controls.
+ Removed cut/copy/paste commands and icons due to security reasons in Mozilla.
+ Added Czech language pack, thanks goes to "Pavel Novák" for the contribution.
+ Fixed minor bug regarding empty attributes.
+ Fixed so the "extended_valid_elements" overrides previous declarations.
+Version 1.19 (2004-06-28)
+ Fixed focus bug that appared on Linux version of Mozilla.
+ Fixed major bug issues with some Firefox/Firebird versions on Linux.
+ Fixed minor visual aid bugs on tables.
+ Fixed minor bugs with table commands.
+ Fixed scroll issue in HTML source windows on Mozilla/Linux.
+ Added a compatiblity chart to the manuals.
+Version 1.18 (2004-06-20)
+ Added new option "remove_script_host".
+ Some minor fixes to the mceInsertContent command.
+ Fixed some issues with visual aids for tables.
+ Fixed strange focus bug in MSIE.
+ Updated some of the documentation.
+Version 1.17 (2004-06-16)
+ Fixed bug, #972666 - Doesn't save edits when id != name.
+ Added more Italian, user manuals. Thanks goes to "Fabrix Xm".
+ Added Dutch language pack thanks to "Meint Post".
+ Modified the MSIE version of mceInsertContent command.
+Version 1.16 (2004-06-14)
+ Added new table dialog and TinyMCE_<theme>_getInsertTableTemplate template function.
+ Added auto class import feature and Italian language pack thanks goes to "Lorenzo Pavani".
+ Added border, alignment, vspace, hspace, width, height fields to the image properties dialog in advanced theme.
+ Updates advanced theme help pages for Swedish and English.
+ Fixed some minor issues with the mceSetCSSClass command.
+ Fixed minor MSIE bug in built in default URL convertor.
+ Fixed some image alignment issues.
+ Fixed support for site root script paths like src="/jscripts/tiny_mce.js".
+ Removed the use of "TinyMCE_advanced_cssClasses" from "advanced" theme.
+ Modified the default value of "valid_elements" to include table align and class as valid attributes.
+ Modified the default value of "valid_elements" to set img border attribute to 0 by default instead of by force.
+ Modified so that popup windows gets centered on screen.
+Version 1.15 (2004-06-09)
+ Added new "advanced" theme, that adds some new functions.
+ Added new public js functions "getContent, setContent, applyTemplate, openWindow".
+ Added new custom command "mceSetCSSClass", that sets css class of the selection.
+ Added new custom command "mceInsertContent", that inserts HTML content.
+ Added class attributes to some of the elements in the default value of "valid_elements".
+ Added ability to have theme specific language packs by the js function "importThemeLanguagePack".
+ Added more documentation to the usage and themes sections.
+ Added table support, with custom commands and in advanced theme.
+ Modified the advanced example to include the new advanced theme.
+ Fixed tooltips for buttons in Mozilla.
+Version 1.14 (2004-06-07)
+ Added new conversion possibility to save callback.
+ Added some more usage documentation.
+ Fixed some issues will updateContent function in Mozilla.
+ Fixed some issues with relative paths.
+ Fixed small Mozilla issue with visual aids.
+ Fixed so that the default theme sets image border to 0.
+ Fixed bug #968079, Removing editor buttons in template can cause errors.
+Version 1.13 (2004-06-04)
+ Fixed critical bug where the editor didn't work at all in MSIE.
+ Fixed bug where table visual aids didn't work in Mozilla.
+Version 1.12 (2004-06-03)
+ Added updateContent function thanks to "Jürgen Baute" contribution.
+ Added documentation of the diffrent public javascript functions of tinyMCE.
+ Fixed bug #965615, Empty editor content returns "<br />" as value after cleanup.
+ Fixed bug where Bold and Italic didn't work correctly in Mozilla.
+Version 1.11 (2004-06-01)
+ Added new option "document_base_url", it's used when converting absolute URLs to relative ones.
+ Added so that align button sets the align attribute of selected images.
+ Fixed bug when / was passed within query string to the editors page.
+ Fixed bug #961041, Image attributes are not removed.
+Version 1.1 (2004-05-26)
+ Fixed bug #960112 JavaScript error when opening image window.
+ Fixed bug #926644 Multiple forms with elements having the same name failed.
+ Added function so that "specific_textareas" mode handles the "ask" option.
+ Added new option "focus_alert", to remove annoying focus alert message.
+Version 1.09 (2004-05-24)
+ Added new option "extended_valid_elements", this option adds extra elements to the "valid_elements" list.
+ Fixed bug #958637, Resized images are displayed in original size
+ Fixed bug #958942, Bug on realitive_urls (Bug with absolute URLs to insertlink_callback, insertimage_callback callbacks)
+ Fixed bug #958498, Unable to change Bold and italic text in Mozilla.
+Version 1.08 (2004-05-21)
+ Added new attributes "border, hspace, vspace, width, height, align" to the getInsertImageTemplate theme function.
+ Added new relative_urls option, this new feature converts all absolute URLs to relative URLs and it's on by default.
+ Fixed bug #956007, the CSS theme URL:s was allways pointing to the default theme.
+ Fixed bug where enter/return key produced a error in the insert link popup window form. (This was done in the default template)
+ Fixed bug #957681, Could not delete text without first adding character bug in Mozilla.
+Version 1.07 (2004-05-10)
+ Added experimental support for option "force_br_newlines" to address bug #922416 and feature request #936270.
+ Fixed bug with mailto: links.
+Version 1.06 (2004-04-15)
+ Added new German language pack. Thanks goes to "Simon Rupf" for the contribution.
+ Added new German/Swedish bold/italic language specific icons to both default and simple theme.
+ Added new Swedish documentation.
+Version 1.05 (2004-04-02)
+ Added new Italian language pack and documentation. Thanks goes to "Fabrix Xm" for the contribution.
+ Fixed missing "lang_help_desc" definition in UK and SE langpacks.
+ Added better documentation for the "valid_elements" option and it's format.
+ Added new "preformatted" option to address feature request #927948.
+ Added browser checker so that the script don't break on non compatible browsers.
+ Fixed bug #926639, now the editor instance gets resized if a width/height is specified in %.
+ Added new simple theme, this theme has only basic functions.
+Version 1.04 (2004-03-30)
+ Fixed bug when insertLink and insertImage function didn't use the url_convertor callback.
+ Fixed MSIE bug when images was 32x32 on initialization on slow connections.
+ Fixed bug that made request on images with wrong path, produced some 404 error in webserver logs.
+ Fixed MSIE bug where users could add images outside of the editor scope.
+Version 1.03 (2004-03-26)
+ Added new "add_form_submit_trigger" this option is default and is added on all document forms within the page. To address bug #923362
+ Moved javascript sourcecode file to "jscripts/tiny_mce/tiny_mce_src.js".
+ Added new obfuscated version of tinymce to reduce size of script.
+ Added some performance boosting code to the switchClassSticky function.
+ Removed the "autosave" option, this is no longer needed and is replaced with "add_form_submit_trigger" or triggerSave call.
+ Fixed undo bug in MSIE.
+ Removed some unused eventhandlers results in better performance.
+Version 1.02 (2004-03-26)
+ Added new handleNodeChange callback to themes.
+ Fixed some bugs regarding events and themes function checks.
+ Fixed bug issue when user focused nodes with keyboard.
+Version 1.01 (2004-03-12)
+ Added some more documentation.
+ Added new "visual" option to editor.
+ Fixed bug on empty P elements.
+ Fixed bug on table width/height.
+Version 1.0 (2004-03-11)
+ Added new "debug" option and fixed some path issues.
Deleted: trunk/htdocs/js/tinymce/docs/about.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/about.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/about.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,41 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>About</title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
- <h1>About</h1>
-</div>
-
-<div class="content">
- <h2>General information</h2>
- <div class="section">
- <p>TinyMCE is a powerful WYSIWYG editor control for web browsers such as MSIE or Mozilla that enables the user to edit HTML contents in a more user friendly way. The editor control is very flexible and it's built for integration purposes for example usage within systems like Intranets, CMS, LMS and so forth.</p>
- <p>
- TinyMCE is developed by <a href="http://www.moxiecode.com">Moxiecode Systems AB</a> and is currently released under the "LGPL" license, read the license agreement for details.
- </p>
- <h2>Features</h2>
- <p>
- <ul>
- <li>Easy to integrate, takes only a couple lines of code.</li>
- <li>Theme and template support.</li>
- <li>Easy to extend with custom code. (Plugins and callbacks)</li>
- <li>Customizable HTML output. Block elements and force attributes.</li>
- <li>International language support (Language packs).</li>
- <li>Multiple browser support, currently Mozilla (PC, Mac and Linux), MSIE (PC) and FireFox (PC, Mac and Linux) and some limited Safari support.</li>
- </ul>
- </p>
- </div>
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/about.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/about.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/about.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/about.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,41 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>About</title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+ <h1>About</h1>
+</div>
+
+<div class="content">
+ <h2>General information</h2>
+ <div class="section">
+ <p>TinyMCE is a powerful WYSIWYG editor control for web browsers such as MSIE or Mozilla that enables the user to edit HTML contents in a more user friendly way. The editor control is very flexible and it's built for integration purposes for example usage within systems like Intranets, CMS, LMS and so forth.</p>
+ <p>
+ TinyMCE is developed by <a href="http://www.moxiecode.com">Moxiecode Systems AB</a> and is currently released under the "LGPL" license, read the license agreement for details.
+ </p>
+ <h2>Features</h2>
+ <p>
+ <ul>
+ <li>Easy to integrate, takes only a couple lines of code.</li>
+ <li>Theme and template support.</li>
+ <li>Easy to extend with custom code. (Plugins and callbacks)</li>
+ <li>Customizable HTML output. Block elements and force attributes.</li>
+ <li>International language support (Language packs).</li>
+ <li>Multiple browser support, currently Mozilla (PC, Mac and Linux), MSIE (PC) and FireFox (PC, Mac and Linux) and some limited Safari support.</li>
+ </ul>
+ </p>
+ </div>
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/compatiblity_chart.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/compatiblity_chart.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/compatiblity_chart.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,84 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Compatiblity Chart</title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
- <h1>Compatiblity Chart</h1>
-</div>
-
-<div class="content">
- <h2>Browser support</h2>
- <div class="section">
- <p>TinyMCE uses advanced JavaScript and tries to be as smart as possible when it comes to different browsers, the main focus is on Microsoft Internet Explorer and Mozilla/Firefox. The table was reset to only show the browsers we ourselves can test on. It works with many older versions of Mozilla and Firefox. <strong>Just cause a browser is not listed on this page doesn't mean it does not work, try out the examples on our website.</strong></p>
-
- <p>Since MacOS X 10.4 is more or less Linux we are not testing much on Linux any more, use the Sourceforge bug report system to submit bugs on the very latest browsers only.</p>
- <p>
- <table border="1" cellspacing="0" cellpadding="4">
- <tr>
- <td> </td>
- <td>Windows XP</td>
- <td>MacOS X 10.4</td>
- </tr>
- <tr>
- <td>MSIE 6</td>
- <td>OK</td>
- <td> </td>
- </tr>
- <tr>
- <td>MSIE 5.5 SP2</td>
- <td>OK</td>
- <td> </td>
- </tr>
- <tr>
- <td>MSIE 5.0</td>
- <td>OK</td>
- <td> </td>
- </tr>
- <tr>
- <td>Mozilla 1.7.x</td>
- <td>OK</td>
- <td>OK</td>
- </tr>
- <tr>
- <td>Firefox 1.0.x</td>
- <td>OK</td>
- <td>OK</td>
- </tr>
- <tr>
- <td>Firefox 1.5b2</td>
- <td>OK</td>
- <td>OK</td>
- </tr>
- <tr>
- <td>Safari 2.0 (412)</td>
- <td> </td>
- <td>OK(1)</td>
- </tr>
- <tr>
- <td>Opera 9 Preview 1</td>
- <td>OK(1)</td>
- <td>OK(1)</td>
- </tr>
- </table>
- </p>
- <p>
- <ul>
- <li>(1) - Partialy working</li>
- <li>(2) - Buggy browser version</li>
- </ul>
- </p>
- </div>
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/compatiblity_chart.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/compatiblity_chart.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/compatiblity_chart.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/compatiblity_chart.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,84 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Compatiblity Chart</title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+ <h1>Compatiblity Chart</h1>
+</div>
+
+<div class="content">
+ <h2>Browser support</h2>
+ <div class="section">
+ <p>TinyMCE uses advanced JavaScript and tries to be as smart as possible when it comes to different browsers, the main focus is on Microsoft Internet Explorer and Mozilla/Firefox. The table was reset to only show the browsers we ourselves can test on. It works with many older versions of Mozilla and Firefox. <strong>Just cause a browser is not listed on this page doesn't mean it does not work, try out the examples on our website.</strong></p>
+
+ <p>Since MacOS X 10.4 is more or less Linux we are not testing much on Linux any more, use the Sourceforge bug report system to submit bugs on the very latest browsers only.</p>
+ <p>
+ <table border="1" cellspacing="0" cellpadding="4">
+ <tr>
+ <td> </td>
+ <td>Windows XP</td>
+ <td>MacOS X 10.4</td>
+ </tr>
+ <tr>
+ <td>MSIE 6</td>
+ <td>OK</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>MSIE 5.5 SP2</td>
+ <td>OK</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>MSIE 5.0</td>
+ <td>OK</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>Mozilla 1.7.x</td>
+ <td>OK</td>
+ <td>OK</td>
+ </tr>
+ <tr>
+ <td>Firefox 1.0.x</td>
+ <td>OK</td>
+ <td>OK</td>
+ </tr>
+ <tr>
+ <td>Firefox 1.5b2</td>
+ <td>OK</td>
+ <td>OK</td>
+ </tr>
+ <tr>
+ <td>Safari 2.0 (412)</td>
+ <td> </td>
+ <td>OK(1)</td>
+ </tr>
+ <tr>
+ <td>Opera 9 Preview 1</td>
+ <td>OK(1)</td>
+ <td>OK(1)</td>
+ </tr>
+ </table>
+ </p>
+ <p>
+ <ul>
+ <li>(1) - Partialy working</li>
+ <li>(2) - Buggy browser version</li>
+ </ul>
+ </p>
+ </div>
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/credits.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/credits.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/credits.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,83 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Credits</title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
- <h1>Credits</h1>
-</div>
-
-<div class="content">
- <h2>Contributors</h2>
- <div class="section">
- <p>These are the people, companies or organizations that have contributed in some way to the TinyMCE project. If you feel we are missing someone please inform us right away and we will correct this in future versions of TinyMCE.</p>
- <p>
- Please note that some of these have contributed with complete language packs and some have updated parts of language packs or similar.
- </p>
- </div>
- <div class="separator"></div>
- <div class="section">
- <p>
- <ul>
- <li class="list_subtitle">Code / Solutions / Features</li>
- <ul>
- <li>Digital Ventures</li>
- <li>donadoni</li>
- <li>Michael Keck</li>
- <li>Victor Nilsson</li>
- <li>Jürgen Baute</li>
- <li>"Neirda"</li>
- <li>"speednet"</li>
- <li>Virtuelcom</li>
- <li>"SlyD"</li>
- <li>Ernst de Moor</li>
- <li>"jamesw"</li>
- <li>Vincent FIACK</li>
- <li>Aptest</li>
- </ul>
- <li class="list_subtitle">Language packs</li>
- <ul>
- <li>Marcin Szymon Sznyra</li>
- <li>"revyag"</li>
- <li>Jim Kou</li>
- <li>"Krokogras"</li>
- <li>Hani Suleiman</li>
- <li>Jan Moelgaard</li>
- <li>Christopher Müller</li>
- <li>Virtuelcom</li>
- <li>Pavel Novák</li>
- <li>Simon Rupf</li>
- <li>"Fabrix Xm"</li>
- <li>Mats Löfström, York Consulting AB</li>
- <li>Morteza Zafari</li>
- <li>Laurent Dran</li>
- <li>Tobias Heer</li>
- <li>"Innozent"</li>
- <li>"cube316"</li>
- <li>José Pedro Pereira</li>
- <li>"Martin"</li>
- <li>Sten Aksel Heien</li>
- <li>Setzer Gabbiani</li>
- <li>Jacaranda Bill</li>
- <li>Pat Boens</li>
- <li>Roman Filippov</li>
- <li>Arnoud van Delden</li>
- </ul>
- </ul>
- </p>
- <p>There are also a few corporations that have contributed in various ways to have features developed by payed support.
- </p>
- </div>
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/credits.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/credits.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/credits.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/credits.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,83 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Credits</title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+ <h1>Credits</h1>
+</div>
+
+<div class="content">
+ <h2>Contributors</h2>
+ <div class="section">
+ <p>These are the people, companies or organizations that have contributed in some way to the TinyMCE project. If you feel we are missing someone please inform us right away and we will correct this in future versions of TinyMCE.</p>
+ <p>
+ Please note that some of these have contributed with complete language packs and some have updated parts of language packs or similar.
+ </p>
+ </div>
+ <div class="separator"></div>
+ <div class="section">
+ <p>
+ <ul>
+ <li class="list_subtitle">Code / Solutions / Features</li>
+ <ul>
+ <li>Digital Ventures</li>
+ <li>donadoni</li>
+ <li>Michael Keck</li>
+ <li>Victor Nilsson</li>
+ <li>Jürgen Baute</li>
+ <li>"Neirda"</li>
+ <li>"speednet"</li>
+ <li>Virtuelcom</li>
+ <li>"SlyD"</li>
+ <li>Ernst de Moor</li>
+ <li>"jamesw"</li>
+ <li>Vincent FIACK</li>
+ <li>Aptest</li>
+ </ul>
+ <li class="list_subtitle">Language packs</li>
+ <ul>
+ <li>Marcin Szymon Sznyra</li>
+ <li>"revyag"</li>
+ <li>Jim Kou</li>
+ <li>"Krokogras"</li>
+ <li>Hani Suleiman</li>
+ <li>Jan Moelgaard</li>
+ <li>Christopher Müller</li>
+ <li>Virtuelcom</li>
+ <li>Pavel Novák</li>
+ <li>Simon Rupf</li>
+ <li>"Fabrix Xm"</li>
+ <li>Mats Löfström, York Consulting AB</li>
+ <li>Morteza Zafari</li>
+ <li>Laurent Dran</li>
+ <li>Tobias Heer</li>
+ <li>"Innozent"</li>
+ <li>"cube316"</li>
+ <li>José Pedro Pereira</li>
+ <li>"Martin"</li>
+ <li>Sten Aksel Heien</li>
+ <li>Setzer Gabbiani</li>
+ <li>Jacaranda Bill</li>
+ <li>Pat Boens</li>
+ <li>Roman Filippov</li>
+ <li>Arnoud van Delden</li>
+ </ul>
+ </ul>
+ </p>
+ <p>There are also a few corporations that have contributed in various ways to have features developed by payed support.
+ </p>
+ </div>
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/css/screen.css
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/css/screen.css 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/css/screen.css 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,168 +0,0 @@
-body {
- background-color: #FFFFFF;
- font-family: Verdana, Arial, helvetica, sans-serif;
- font-size: 12px;
-}
-
-.header {
- border: #E0E0E0 solid 1px;
-}
-
-.footer {
- border: #E0E0E0 solid 1px;
- height: 20px;
-}
-
-h1 {
- font-size: 18px;
- font-weight: bold;
- padding: 0;
- margin: 4px;
-}
-
-h2 {
- font-size: 14px;
- font-weight: bold;
- padding: 0;
- margin: 0;
- margin-top: 4px;
- margin-bottom: 4px;
-}
-
-h3 {
- font-size: 11px;
- font-weight: bold;
- padding: 0;
- margin: 0;
- margin-bottom: 3px;
-}
-
-.section {
- margin-left: 15px;
-}
-
-.column {
- margin-right: 20px;
- float: left
-}
-
-.separator {
- border-bottom: 1px solid #E6EBF1;
- margin-top: 10px;
- margin-bottom: 10px;
-}
-
-p {
-}
-
-.helpindex {
- margin-left: 20px;
- padding-left: 0;
-}
-
-
-.optionlist {
- margin: 0;
- padding: 0;
- margin-bottom: 10px;
-}
-
-.optionlist li {
- padding: 0;
- margin: 0;
- margin-top: 3px;
- margin-bottom: 3px;
- margin-left: 10px;
- list-style-type: none;
-}
-
-.helpindex li {
- margin-top: 3px;
-}
-
-.content {
- margin: 10px;
-}
-
-.example {
- background-color: #E6EBF1;
- margin-left: 10px;
-}
-
-code, pre {
- margin: 0;
- padding: 0;
- background-color: #E6EBF1;
-}
-
-.copyright {
- margin: 3px;
- float: left;
-}
-
-.helpindexlink {
- margin: 3px;
- float: right;
-}
-
-a:visited {
- color: #666666;
- text-decoration: underline;
-}
-
-a:active {
- color: #666666;
- text-decoration: underline;
-}
-
-a:hover {
- color: #666666;
- text-decoration: underline;
-}
-
-a {
- color: #666666;
- text-decoration: underline;
-}
-
-.list_subtitle {
- padding-top: 5px;
-}
-
-.note {
- margin-top: 5px;
- margin-left: 10px;
- font-size: 10px;
-}
-
-.marked {
- color: red;
- font-weight: bold;
-}
-
-thead {
- background-color: #E6EBF1;
-}
-
-.btable {
-}
-
-.btable th {
- border: 1px solid gray;
- vertical-align: top;
-}
-
-.btable td {
- border: 1px solid gray;
- vertical-align: top;
-}
-
-.plist {
- list-style-type: none;
- margin: 0;
- padding: 0;
-}
-
-.plist li {
- padding-bottom: 3px;
-}
\ No newline at end of file
Copied: trunk/htdocs/js/tinymce/docs/css/screen.css (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/css/screen.css)
===================================================================
--- trunk/htdocs/js/tinymce/docs/css/screen.css (rev 0)
+++ trunk/htdocs/js/tinymce/docs/css/screen.css 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,168 @@
+body {
+ background-color: #FFFFFF;
+ font-family: Verdana, Arial, helvetica, sans-serif;
+ font-size: 12px;
+}
+
+.header {
+ border: #E0E0E0 solid 1px;
+}
+
+.footer {
+ border: #E0E0E0 solid 1px;
+ height: 20px;
+}
+
+h1 {
+ font-size: 18px;
+ font-weight: bold;
+ padding: 0;
+ margin: 4px;
+}
+
+h2 {
+ font-size: 14px;
+ font-weight: bold;
+ padding: 0;
+ margin: 0;
+ margin-top: 4px;
+ margin-bottom: 4px;
+}
+
+h3 {
+ font-size: 11px;
+ font-weight: bold;
+ padding: 0;
+ margin: 0;
+ margin-bottom: 3px;
+}
+
+.section {
+ margin-left: 15px;
+}
+
+.column {
+ margin-right: 20px;
+ float: left
+}
+
+.separator {
+ border-bottom: 1px solid #E6EBF1;
+ margin-top: 10px;
+ margin-bottom: 10px;
+}
+
+p {
+}
+
+.helpindex {
+ margin-left: 20px;
+ padding-left: 0;
+}
+
+
+.optionlist {
+ margin: 0;
+ padding: 0;
+ margin-bottom: 10px;
+}
+
+.optionlist li {
+ padding: 0;
+ margin: 0;
+ margin-top: 3px;
+ margin-bottom: 3px;
+ margin-left: 10px;
+ list-style-type: none;
+}
+
+.helpindex li {
+ margin-top: 3px;
+}
+
+.content {
+ margin: 10px;
+}
+
+.example {
+ background-color: #E6EBF1;
+ margin-left: 10px;
+}
+
+code, pre {
+ margin: 0;
+ padding: 0;
+ background-color: #E6EBF1;
+}
+
+.copyright {
+ margin: 3px;
+ float: left;
+}
+
+.helpindexlink {
+ margin: 3px;
+ float: right;
+}
+
+a:visited {
+ color: #666666;
+ text-decoration: underline;
+}
+
+a:active {
+ color: #666666;
+ text-decoration: underline;
+}
+
+a:hover {
+ color: #666666;
+ text-decoration: underline;
+}
+
+a {
+ color: #666666;
+ text-decoration: underline;
+}
+
+.list_subtitle {
+ padding-top: 5px;
+}
+
+.note {
+ margin-top: 5px;
+ margin-left: 10px;
+ font-size: 10px;
+}
+
+.marked {
+ color: red;
+ font-weight: bold;
+}
+
+thead {
+ background-color: #E6EBF1;
+}
+
+.btable {
+}
+
+.btable th {
+ border: 1px solid gray;
+ vertical-align: top;
+}
+
+.btable td {
+ border: 1px solid gray;
+ vertical-align: top;
+}
+
+.plist {
+ list-style-type: none;
+ margin: 0;
+ padding: 0;
+}
+
+.plist li {
+ padding-bottom: 3px;
+}
\ No newline at end of file
Deleted: trunk/htdocs/js/tinymce/docs/customization_language_packs.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/customization_language_packs.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/customization_language_packs.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,57 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Customization - Creating a language pack</title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
- <h1>Customization - Creating a language pack</h1>
-</div>
-
-<div class="content">
- <h2>Making language packs</h2>
- <p>Language packs are simply JavaScript name/value arrays placed in the "<ISO-639-1 code>.js" files in the "lang" directory. Remember to allways use the "lang_" prefix for these value names so that they don't override other variables in the templates. The example below shows how the cut, copy and paste texts are lang packed. Notice there are three kinds of language packs the first one is the general one shared by all themes these are located in the "jscripts/tiny_mce/langs" directory the secound ones are theme specific language packs these are contained in "jscripts/tiny_mce/themes/<some theme>/langs" and the last one is plugin specific language packs located in each plugin.
- </p>
- <p>
- <div class="example">
-<pre>
-tinyMCE.addToLang('',{
-cut_desc : 'Cut (Ctrl+X)',
-copy_desc : 'Copy (Ctrl+C)',
-paste_desc : 'Paste (Ctrl+P)'
-);
-</pre>
- </div>
- </p>
- <p>
- Remember the last translation line should not have a , character at the end. The first parameter to the addToLang is the prefix to add before each variable, this was added to reduce the overall size of the language packs to reduce the overall download time.
- </p>
- <h3>Files to edit</h3>
- <p>
- When translating TinyMCE, these are the files that currently needs to be translated:
- </p>
- <p>
- /tinymce/jscripts/tiny_mce/langs/en.js<br />
- /tinymce/jscripts/tiny_mce/plugins/<plugin>/langs/en.js<br />
- /tinymce/jscripts/tiny_mce/themes/advanced/langs/en.js<br />
- </p>
- <p>
- Notice some language variables may include a name/url of a gif image or simmilar, for example the button for bold has a "F" character in the Swedish language pack. There are also relative window sizes located in the language packs, for example is the link dialog needs to be bigger inorder to fit a specific translation you can alter the width of the window by modifying these variables.
- </p>
- <h3>Contributing your language pack</h3>
- <p>
- Go to the <a href="http://sourceforge.net/tracker/?atid=635684&group_id=103281&func=browse">sourceforge patch page</a> and upload a zip containing all the language files in the correct directory structure.<br /><br />
- Please translate all the plugins, even if you aren't using them.<br />
- </p>
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/customization_language_packs.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/customization_language_packs.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/customization_language_packs.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/customization_language_packs.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,57 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Customization - Creating a language pack</title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+ <h1>Customization - Creating a language pack</h1>
+</div>
+
+<div class="content">
+ <h2>Making language packs</h2>
+ <p>Language packs are simply JavaScript name/value arrays placed in the "<ISO-639-1 code>.js" files in the "lang" directory. Remember to allways use the "lang_" prefix for these value names so that they don't override other variables in the templates. The example below shows how the cut, copy and paste texts are lang packed. Notice there are three kinds of language packs the first one is the general one shared by all themes these are located in the "jscripts/tiny_mce/langs" directory the secound ones are theme specific language packs these are contained in "jscripts/tiny_mce/themes/<some theme>/langs" and the last one is plugin specific language packs located in each plugin.
+ </p>
+ <p>
+ <div class="example">
+<pre>
+tinyMCE.addToLang('',{
+cut_desc : 'Cut (Ctrl+X)',
+copy_desc : 'Copy (Ctrl+C)',
+paste_desc : 'Paste (Ctrl+P)'
+);
+</pre>
+ </div>
+ </p>
+ <p>
+ Remember the last translation line should not have a , character at the end. The first parameter to the addToLang is the prefix to add before each variable, this was added to reduce the overall size of the language packs to reduce the overall download time.
+ </p>
+ <h3>Files to edit</h3>
+ <p>
+ When translating TinyMCE, these are the files that currently needs to be translated:
+ </p>
+ <p>
+ /tinymce/jscripts/tiny_mce/langs/en.js<br />
+ /tinymce/jscripts/tiny_mce/plugins/<plugin>/langs/en.js<br />
+ /tinymce/jscripts/tiny_mce/themes/advanced/langs/en.js<br />
+ </p>
+ <p>
+ Notice some language variables may include a name/url of a gif image or simmilar, for example the button for bold has a "F" character in the Swedish language pack. There are also relative window sizes located in the language packs, for example is the link dialog needs to be bigger inorder to fit a specific translation you can alter the width of the window by modifying these variables.
+ </p>
+ <h3>Contributing your language pack</h3>
+ <p>
+ Go to the <a href="http://sourceforge.net/tracker/?atid=635684&group_id=103281&func=browse">sourceforge patch page</a> and upload a zip containing all the language files in the correct directory structure.<br /><br />
+ Please translate all the plugins, even if you aren't using them.<br />
+ </p>
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/customization_plugins.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/customization_plugins.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/customization_plugins.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,227 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Customization - Creating a plugin</title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
- <h1>Customization - Creating a plugin</h1>
-</div>
-
-<div class="content">
-
-<h2>Creating your own plugins</h2>
-<p>
-Creating you own plugins for the TinyMCE application is fairly easy if you know the basics of HTML, CSS and Javascript. The most easy way is to copy the "_template" directory or one of the other core plugins and work from there. The "_template" directory is a tutorial plugin that shows how to create a plugin. After you copy the template you need to change the red sections marked below to the name of your plugin this is needed so that plugins don't overlap in other words it gives the plugin a unique name.
-</p>
-<p>If you want you may add plugin specific options/settings but remember to namespace them in the following format "<your plugin>_<option>" for example "yourplugin_someoption".</p>
-<p>Specific callback functions that you don't need or doesn't do anything can be removed.</p>
-
-<div class="separator"></div>
-<h3>Plugin directory structure</h3>
-<p>
-<table class="btable">
-<thead>
- <th>File/Directory</td>
- <th>Description</td>
-</thead>
-<tbody>
- <tr><td>css</td><td>Plugin specific CSS files</td></tr>
- <tr><td>docs</td><td>Plugin specific documentation</td></tr>
- <tr><td>images</td><td>Plugin specific images</td></tr>
- <tr><td>jscripts</td><td>Plugin specific jscripts for HTML dialogs</td></tr>
- <tr><td>langs</td><td>Plugin specific language files</td></tr>
- <tr><td>editor_plugin.js</td><td>Editor plugin file (compressed).</td></tr>
- <tr><td>editor_plugin_src.js</td><td>Editor plugin file (source).</td></tr>
- <tr><td>somedialog.htm</td><td>Plugin specific dialog HTML file.</td></tr>
-</table>
-</p>
-<div class="separator"></div>
-<h3>Plugin example source</h3>
-<p>
-The example below shows a simple empty plugin and all possible callbacks.
-</p>
-<p>
-<div class="example">
-<pre>
-var TinyMCE_<span class="marked">SomeName</span>Plugin = {
- /**
- * Returns information about the plugin as a name/value array.
- * The current keys are longname, author, authorurl, infourl and version.
- *
- * @returns Name/value array containing information about the plugin.
- * @type Array
- */
- getInfo : function() {
- return {
- longname : 'Your plugin',
- author : 'Your name',
- authorurl : 'http://www.yoursite.com',
- infourl : 'http://www.yoursite.com/docs/template.html',
- version : "1.0"
- };
- },
-
- /**
- * Gets executed when a TinyMCE editor instance is initialized.
- *
- * @param {TinyMCE_Control} Initialized TinyMCE editor control instance.
- */
- initInstance : function(inst) {
- // You can take out plugin specific parameters
- alert("Initialization parameter:" + tinyMCE.getParam("<span class="marked">somename</span>_someparam", false));
-
- // Register custom keyboard shortcut
- inst.addShortcut('ctrl', 't', 'lang_<span class="marked">somename</span>_desc', 'mceSomeCommand');
- },
-
- /**
- * Returns the HTML code for a specific control or empty string if this plugin doesn't have that control.
- * A control can be a button, select list or any other HTML item to present in the TinyMCE user interface.
- * The variable {$editor_id} will be replaced with the current editor instance id and {$pluginurl} will be replaced
- * with the URL of the plugin. Language variables such as {$lang_somekey} will also be replaced with contents from
- * the language packs.
- *
- * @param {string} cn Editor control/button name to get HTML for.
- * @return HTML code for a specific control or empty string.
- * @type string
- */
- getControlHTML : function(cn) {
- switch (cn) {
- case "<span class="marked">SomeControl</span>":
- return tinyMCE.getButtonHTML(cn, 'lang_<span class="marked">someplugin</span>_<span class="marked">button</span>_desc', '{$pluginurl}/images/<span class="marked">someimage</span>.gif', '<span class="marked">mceSomeCommand</span>');
- }
-
- return "";
- },
-
- getControlHTML : function(cn) {
- switch (cn) {
- case "advhr":
- return tinyMCE.getButtonHTML(cn, 'lang_insert_advhr_desc', '{$pluginurl}/images/advhr.gif', 'mceAdvancedHr');
- }
-
- return "";
- },
-
-
- /**
- * Executes a specific command, this function handles plugin commands.
- *
- * @param {string} editor_id TinyMCE editor instance id that issued the command.
- * @param {HTMLElement} element Body or root element for the editor instance.
- * @param {string} command Command name to be executed.
- * @param {string} user_interface True/false if a user interface should be presented.
- * @param {mixed} value Custom value argument, can be anything.
- * @return true/false if the command was executed by this plugin or not.
- * @type
- */
- execCommand : function(editor_id, element, command, user_interface, value) {
- // Handle commands
- switch (command) {
- // Remember to have the "mce" prefix for commands so they don't intersect with built in ones in the browser.
- case "mce<span class="marked">SomeCommand</span>":
- // Do your custom command logic here.
-
- return true;
- }
-
- // Pass to next handler in chain
- return false;
- },
-
- /**
- * Gets called ones the cursor/selection in a TinyMCE instance changes. This is useful to enable/disable
- * button controls depending on where the user are and what they have selected. This method gets executed
- * alot and should be as performance tuned as possible.
- *
- * @param {string} editor_id TinyMCE editor instance id that was changed.
- * @param {HTMLNode} node Current node location, where the cursor is in the DOM tree.
- * @param {int} undo_index The current undo index, if this is -1 custom undo/redo is disabled.
- * @param {int} undo_levels The current undo levels, if this is -1 custom undo/redo is disabled.
- * @param {boolean} visual_aid Is visual aids enabled/disabled ex: dotted lines on tables.
- * @param {boolean} any_selection Is there any selection at all or is there only a cursor.
- */
- handleNodeChange : function(editor_id, node, undo_index, undo_levels, visual_aid, any_selection) {
- },
-
- /**
- * Gets called when a TinyMCE editor instance gets filled with content on startup.
- *
- * @param {string} editor_id TinyMCE editor instance id that was filled with content.
- * @param {HTMLElement} body HTML body element of editor instance.
- * @param {HTMLDocument} doc HTML document instance.
- */
- setupContent : function(editor_id, body, doc) {
- },
-
- /**
- * Gets called when the contents of a TinyMCE area is modified, in other words when a undo level is
- * added.
- *
- * @param {TinyMCE_Control} inst TinyMCE editor area control instance that got modified.
- */
- onChange : function(inst) {
- },
-
- /**
- * Gets called when TinyMCE handles events such as keydown, mousedown etc. TinyMCE
- * doesn't listen on all types of events so custom event handling may be required for
- * some purposes.
- *
- * @param {Event} e HTML editor event reference.
- * @return true - pass to next handler in chain, false - stop chain execution
- * @type boolean
- */
- handleEvent : function(e) {
- return true;
- },
-
- /**
- * Gets called when HTML contents is inserted or retrived from a TinyMCE editor instance.
- * The type parameter contains what type of event that was performed and what format the content is in.
- * Possible valuses for type is get_from_editor, insert_to_editor, get_from_editor_dom, insert_to_editor_dom.
- *
- * @param {string} type Cleanup event type.
- * @param {mixed} content Editor contents that gets inserted/extracted can be a string or DOM element.
- * @param {TinyMCE_Control} inst TinyMCE editor instance control that performes the cleanup.
- * @return New content or the input content depending on action.
- * @type string
- */
- cleanup : function(type, content, inst) {
- return content;
- },
-
- // Private plugin internal methods
-
- /**
- * This is just a internal plugin method, prefix all internal methods with a _ character.
- * The prefix is needed so they doesn't collide with future TinyMCE callback functions.
- *
- * @param {string} a Some arg1.
- * @param {string} b Some arg2.
- * @return Some return.
- * @type string
- */
- _someInternalFunction : function(a, b) {
- return 1;
- }
-};
-
-// Adds the plugin class to the list of available TinyMCE plugins
-tinyMCE.addPlugin("<span class="marked">someplugin</span>", TinyMCE_<span class="marked">SomePlugin</span>Plugin);
-</pre>
-</div>
-</p>
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/customization_plugins.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/customization_plugins.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/customization_plugins.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/customization_plugins.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,227 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Customization - Creating a plugin</title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+ <h1>Customization - Creating a plugin</h1>
+</div>
+
+<div class="content">
+
+<h2>Creating your own plugins</h2>
+<p>
+Creating you own plugins for the TinyMCE application is fairly easy if you know the basics of HTML, CSS and Javascript. The most easy way is to copy the "_template" directory or one of the other core plugins and work from there. The "_template" directory is a tutorial plugin that shows how to create a plugin. After you copy the template you need to change the red sections marked below to the name of your plugin this is needed so that plugins don't overlap in other words it gives the plugin a unique name.
+</p>
+<p>If you want you may add plugin specific options/settings but remember to namespace them in the following format "<your plugin>_<option>" for example "yourplugin_someoption".</p>
+<p>Specific callback functions that you don't need or doesn't do anything can be removed.</p>
+
+<div class="separator"></div>
+<h3>Plugin directory structure</h3>
+<p>
+<table class="btable">
+<thead>
+ <th>File/Directory</td>
+ <th>Description</td>
+</thead>
+<tbody>
+ <tr><td>css</td><td>Plugin specific CSS files</td></tr>
+ <tr><td>docs</td><td>Plugin specific documentation</td></tr>
+ <tr><td>images</td><td>Plugin specific images</td></tr>
+ <tr><td>jscripts</td><td>Plugin specific jscripts for HTML dialogs</td></tr>
+ <tr><td>langs</td><td>Plugin specific language files</td></tr>
+ <tr><td>editor_plugin.js</td><td>Editor plugin file (compressed).</td></tr>
+ <tr><td>editor_plugin_src.js</td><td>Editor plugin file (source).</td></tr>
+ <tr><td>somedialog.htm</td><td>Plugin specific dialog HTML file.</td></tr>
+</table>
+</p>
+<div class="separator"></div>
+<h3>Plugin example source</h3>
+<p>
+The example below shows a simple empty plugin and all possible callbacks.
+</p>
+<p>
+<div class="example">
+<pre>
+var TinyMCE_<span class="marked">SomeName</span>Plugin = {
+ /**
+ * Returns information about the plugin as a name/value array.
+ * The current keys are longname, author, authorurl, infourl and version.
+ *
+ * @returns Name/value array containing information about the plugin.
+ * @type Array
+ */
+ getInfo : function() {
+ return {
+ longname : 'Your plugin',
+ author : 'Your name',
+ authorurl : 'http://www.yoursite.com',
+ infourl : 'http://www.yoursite.com/docs/template.html',
+ version : "1.0"
+ };
+ },
+
+ /**
+ * Gets executed when a TinyMCE editor instance is initialized.
+ *
+ * @param {TinyMCE_Control} Initialized TinyMCE editor control instance.
+ */
+ initInstance : function(inst) {
+ // You can take out plugin specific parameters
+ alert("Initialization parameter:" + tinyMCE.getParam("<span class="marked">somename</span>_someparam", false));
+
+ // Register custom keyboard shortcut
+ inst.addShortcut('ctrl', 't', 'lang_<span class="marked">somename</span>_desc', 'mceSomeCommand');
+ },
+
+ /**
+ * Returns the HTML code for a specific control or empty string if this plugin doesn't have that control.
+ * A control can be a button, select list or any other HTML item to present in the TinyMCE user interface.
+ * The variable {$editor_id} will be replaced with the current editor instance id and {$pluginurl} will be replaced
+ * with the URL of the plugin. Language variables such as {$lang_somekey} will also be replaced with contents from
+ * the language packs.
+ *
+ * @param {string} cn Editor control/button name to get HTML for.
+ * @return HTML code for a specific control or empty string.
+ * @type string
+ */
+ getControlHTML : function(cn) {
+ switch (cn) {
+ case "<span class="marked">SomeControl</span>":
+ return tinyMCE.getButtonHTML(cn, 'lang_<span class="marked">someplugin</span>_<span class="marked">button</span>_desc', '{$pluginurl}/images/<span class="marked">someimage</span>.gif', '<span class="marked">mceSomeCommand</span>');
+ }
+
+ return "";
+ },
+
+ getControlHTML : function(cn) {
+ switch (cn) {
+ case "advhr":
+ return tinyMCE.getButtonHTML(cn, 'lang_insert_advhr_desc', '{$pluginurl}/images/advhr.gif', 'mceAdvancedHr');
+ }
+
+ return "";
+ },
+
+
+ /**
+ * Executes a specific command, this function handles plugin commands.
+ *
+ * @param {string} editor_id TinyMCE editor instance id that issued the command.
+ * @param {HTMLElement} element Body or root element for the editor instance.
+ * @param {string} command Command name to be executed.
+ * @param {string} user_interface True/false if a user interface should be presented.
+ * @param {mixed} value Custom value argument, can be anything.
+ * @return true/false if the command was executed by this plugin or not.
+ * @type
+ */
+ execCommand : function(editor_id, element, command, user_interface, value) {
+ // Handle commands
+ switch (command) {
+ // Remember to have the "mce" prefix for commands so they don't intersect with built in ones in the browser.
+ case "mce<span class="marked">SomeCommand</span>":
+ // Do your custom command logic here.
+
+ return true;
+ }
+
+ // Pass to next handler in chain
+ return false;
+ },
+
+ /**
+ * Gets called ones the cursor/selection in a TinyMCE instance changes. This is useful to enable/disable
+ * button controls depending on where the user are and what they have selected. This method gets executed
+ * alot and should be as performance tuned as possible.
+ *
+ * @param {string} editor_id TinyMCE editor instance id that was changed.
+ * @param {HTMLNode} node Current node location, where the cursor is in the DOM tree.
+ * @param {int} undo_index The current undo index, if this is -1 custom undo/redo is disabled.
+ * @param {int} undo_levels The current undo levels, if this is -1 custom undo/redo is disabled.
+ * @param {boolean} visual_aid Is visual aids enabled/disabled ex: dotted lines on tables.
+ * @param {boolean} any_selection Is there any selection at all or is there only a cursor.
+ */
+ handleNodeChange : function(editor_id, node, undo_index, undo_levels, visual_aid, any_selection) {
+ },
+
+ /**
+ * Gets called when a TinyMCE editor instance gets filled with content on startup.
+ *
+ * @param {string} editor_id TinyMCE editor instance id that was filled with content.
+ * @param {HTMLElement} body HTML body element of editor instance.
+ * @param {HTMLDocument} doc HTML document instance.
+ */
+ setupContent : function(editor_id, body, doc) {
+ },
+
+ /**
+ * Gets called when the contents of a TinyMCE area is modified, in other words when a undo level is
+ * added.
+ *
+ * @param {TinyMCE_Control} inst TinyMCE editor area control instance that got modified.
+ */
+ onChange : function(inst) {
+ },
+
+ /**
+ * Gets called when TinyMCE handles events such as keydown, mousedown etc. TinyMCE
+ * doesn't listen on all types of events so custom event handling may be required for
+ * some purposes.
+ *
+ * @param {Event} e HTML editor event reference.
+ * @return true - pass to next handler in chain, false - stop chain execution
+ * @type boolean
+ */
+ handleEvent : function(e) {
+ return true;
+ },
+
+ /**
+ * Gets called when HTML contents is inserted or retrived from a TinyMCE editor instance.
+ * The type parameter contains what type of event that was performed and what format the content is in.
+ * Possible valuses for type is get_from_editor, insert_to_editor, get_from_editor_dom, insert_to_editor_dom.
+ *
+ * @param {string} type Cleanup event type.
+ * @param {mixed} content Editor contents that gets inserted/extracted can be a string or DOM element.
+ * @param {TinyMCE_Control} inst TinyMCE editor instance control that performes the cleanup.
+ * @return New content or the input content depending on action.
+ * @type string
+ */
+ cleanup : function(type, content, inst) {
+ return content;
+ },
+
+ // Private plugin internal methods
+
+ /**
+ * This is just a internal plugin method, prefix all internal methods with a _ character.
+ * The prefix is needed so they doesn't collide with future TinyMCE callback functions.
+ *
+ * @param {string} a Some arg1.
+ * @param {string} b Some arg2.
+ * @return Some return.
+ * @type string
+ */
+ _someInternalFunction : function(a, b) {
+ return 1;
+ }
+};
+
+// Adds the plugin class to the list of available TinyMCE plugins
+tinyMCE.addPlugin("<span class="marked">someplugin</span>", TinyMCE_<span class="marked">SomePlugin</span>Plugin);
+</pre>
+</div>
+</p>
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/customization_themes.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/customization_themes.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/customization_themes.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,262 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Customization - Creating a theme</title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
- <h1>Customization - Creating a theme</h1>
-</div>
-
-<div class="content">
-<h2>Creating your own Themes</h2>
-<p>
-Creating you own themes for the TinyMCE application is fairly easy if you know the basics of HTML, CSS and Javascript. The most easy way is to copy the "simple" or the "advanced" template and rename it as your own name to for example "mytheme". After you copy the template you need to change the red sections marked below to "mytheme" this is needed so that themes don't overlap in other words it gives the theme a unique name. Then just alter the HTML code as you see fit but notice some elements needs to be there so check the docs below on each function also remember that your custom themes needs to be located in tiny_mce's "themes" directory. If you want you may add theme specific options/settings but remember to namespace them in the following format "theme_<your theme>_<option>".
-</p>
-<div class="separator"></div>
-<h3>Theme directory structure</h3>
-<p>
-<table class="btable">
-<thead>
- <th>File/Directory</td>
- <th>Description</td>
-</thead>
-<tbody>
- <tr><td>css</td><td>Theme specific CSS files</td></tr>
- <tr><td>docs</td><td>Theme specific documentation</td></tr>
- <tr><td>images</td><td>Theme specific images</td></tr>
- <tr><td>jscripts</td><td>Theme specific jscripts for HTML dialogs</td></tr>
- <tr><td>langs</td><td>Theme specific language files</td></tr>
- <tr><td>editor_template.js</td><td>Editor theme template file (compressed).</td></tr>
- <tr><td>editor_template_src.js</td><td>Editor theme template file (source).</td></tr>
- <tr><td>somedialog.htm</td><td>Theme specific dialog HTML file.</td></tr>
-</table>
-</p>
-<div class="separator"></div>
-<h3>Theme example source</h3>
-<p>
-The example below shows a simple empty theme and all possible callbacks.
-</p>
-<p>
-<div class="example">
-<pre>
-var TinyMCE_<span class="marked">SomeName</span>Theme = {
- /**
- * Returns information about the theme as a name/value array.
- * The current keys are longname, author, authorurl, infourl and version.
- *
- * @returns Name/value array containing information about the theme.
- * @type Array
- */
- getInfo : function() {
- return {
- longname : 'Your Theme',
- author : 'Your name',
- authorurl : 'http://www.yoursite.com',
- infourl : 'http://www.yoursite.com/docs/template.html',
- version : "1.0"
- };
- },
-
- /**
- * Gets executed when a TinyMCE editor instance is initialized.
- *
- * @param {TinyMCE_Control} Initialized TinyMCE editor control instance.
- */
- initInstance : function(inst) {
- // You can take out theme specific parameters
- alert("Initialization parameter:" + tinyMCE.getParam("<span class="marked">somename</span>_someparam", false));
-
- // Register custom keyboard shortcut
- inst.addShortcut('ctrl', 't', 'lang_<span class="marked">somename</span>_desc', 'mceSomeCommand');
- },
-
- /**
- * Returns the HTML code for a specific control or empty string if this theme doesn't have that control.
- * A control can be a button, select list or any other HTML item to present in the TinyMCE user interface.
- * The variable {$editor_id} will be replaced with the current editor instance id and {$themeurl} will be replaced
- * with the URL of the theme. Language variables such as {$lang_somekey} will also be replaced with contents from
- * the language packs.
- *
- * @param {string} cn Editor control/button name to get HTML for.
- * @return HTML code for a specific control or empty string.
- * @type string
- */
- getControlHTML : function(cn) {
- switch (cn) {
- case "<span class="marked">SomeControl</span>":
- return tinyMCE.getButtonHTML(cn, 'lang_<span class="marked">sometheme</span>_<span class="marked">button</span>_desc', '{$themeurl}/images/<span class="marked">someimage</span>.gif', '<span class="marked">mceSomeCommand</span>');
- }
-
- return "";
- },
-
- /**
- * Returns the HTML code that should be inserted for a specific editor instance.
- * This function should return a name/value array with three items html, delta_width, delta_height.
- * The html item should contain the HTML code to insert as a editor instance.
- * The variable {$editor_id} will be replaced with the current editor instance id and {$themeurl} will be replaced
- * with the URL of the theme. Language variables such as {$lang_somekey} will also be replaced with contents from
- * the language packs. Any element with the id {$editor_id} will be replaced with the editor iframe element.
- * The {$width} and {$height} variables will be replaced with the editors outside dimension values.
- * The delta_width/height is the relative width/height in pixels to add or remove from the iframe dimensions.
- *
- * @param {Array} settings Name/Value array instance settings.
- * @param {string} editor_id TinMYCE editor control instance id.
- * @return Name/Value array of editor template data.
- * @type Array
- */
- getEditorTemplate : function(settings, editor_id) {
- var html = "";
-
- // Build toolbar and editor instance
- html += "..";
-
- return {
- html : html,
- delta_width : 0,
- delta_height : 0
- };
- },
-
- /**
- * Executes a specific command, this function handles theme commands.
- *
- * @param {string} editor_id TinyMCE editor instance id that issued the command.
- * @param {HTMLElement} element Body or root element for the editor instance.
- * @param {string} command Command name to be executed.
- * @param {string} user_interface True/false if a user interface should be presented.
- * @param {mixed} value Custom value argument, can be anything.
- * @return true/false if the command was executed by this theme or not.
- * @type
- */
- execCommand : function(editor_id, element, command, user_interface, value) {
- // Handle commands
- switch (command) {
- // Remember to have the "mce" prefix for commands so they don't intersect with built in ones in the browser.
- case "mce<span class="marked">SomeCommand</span>":
- // Do your custom command logic here.
-
- return true;
- }
-
- // Pass to next handler in chain
- return false;
- },
-
- /**
- * Gets called ones the cursor/selection in a TinyMCE instance changes. This is useful to enable/disable
- * button controls depending on where the user are and what they have selected. This method gets executed
- * alot and should be as performance tuned as possible.
- *
- * @param {string} editor_id TinyMCE editor instance id that was changed.
- * @param {HTMLNode} node Current node location, where the cursor is in the DOM tree.
- * @param {int} undo_index The current undo index, if this is -1 custom undo/redo is disabled.
- * @param {int} undo_levels The current undo levels, if this is -1 custom undo/redo is disabled.
- * @param {boolean} visual_aid Is visual aids enabled/disabled ex: dotted lines on tables.
- * @param {boolean} any_selection Is there any selection at all or is there only a cursor.
- */
- handleNodeChange : function(editor_id, node, undo_index, undo_levels, visual_aid, any_selection) {
- },
-
- /**
- * Gets called when a TinyMCE editor instance gets filled with content on startup.
- *
- * @param {string} editor_id TinyMCE editor instance id that was filled with content.
- * @param {HTMLElement} body HTML body element of editor instance.
- * @param {HTMLDocument} doc HTML document instance.
- */
- setupContent : function(editor_id, body, doc) {
- },
-
- /**
- * Gets called when the contents of a TinyMCE area is modified, in other words when a undo level is
- * added.
- *
- * @param {TinyMCE_Control} inst TinyMCE editor area control instance that got modified.
- */
- onChange : function(inst) {
- },
-
- /**
- * Gets called when TinyMCE handles events such as keydown, mousedown etc. TinyMCE
- * doesn't listen on all types of events so custom event handling may be required for
- * some purposes.
- *
- * @param {Event} e HTML editor event reference.
- * @return true - pass to next handler in chain, false - stop chain execution
- * @type boolean
- */
- handleEvent : function(e) {
- return true;
- },
-
- /**
- * Gets called when HTML contents is inserted or retrived from a TinyMCE editor instance.
- * The type parameter contains what type of event that was performed and what format the content is in.
- * Possible valuses for type is get_from_editor, insert_to_editor, get_from_editor_dom, insert_to_editor_dom.
- *
- * @param {string} type Cleanup event type.
- * @param {mixed} content Editor contents that gets inserted/extracted can be a string or DOM element.
- * @param {TinyMCE_Control} inst TinyMCE editor instance control that performes the cleanup.
- * @return New content or the input content depending on action.
- * @type string
- */
- cleanup : function(type, content, inst) {
- return content;
- },
-
- // Private theme internal methods
-
- /**
- * This is just a internal theme method, prefix all internal methods with a _ character.
- * The prefix is needed so they doesn't collide with future TinyMCE callback functions.
- *
- * @param {string} a Some arg1.
- * @param {string} b Some arg2.
- * @return Some return.
- * @type string
- */
- _someInternalFunction : function(a, b) {
- return 1;
- }
-};
-
-// Adds the theme class to the list of available TinyMCE themes
-tinyMCE.addTheme("<span class="marked">sometheme</span>", TinyMCE_<span class="marked">SomeTheme</span>Theme);
-</pre>
-</div>
-</p>
-<div class="separator"></div>
-
-<h3>Creating popup HTML files</h3>
-<p>
-When creating a popup you need to include the "tiny_mce_popup.js" this enables you to retrive the tinyMCE global instance in all popup windows. All variables and language definitions gets replaced in the page when it loads. So language variables such as {$lang_something} can be places in the HTML code, if you need to get a language string in JavaScript simply use the tinyMCE.getLang function.
-</p>
-<h3>Example of simple popup file:</h3>
-<div class="example">
-<pre>
-<html>
-<head>
-<title>{$lang_theme_sample_title}</title>
-<script language="javascript" src="../../tiny_mce_popup.js"></script>
-<script language="javascript">
- // getWindowArg returns any arguments passed to the window
- alert(tinyMCE.getWindowArg('some_arg'));
-</script>
-<body>
- <strong>{$lang_theme_sample_desc}</strong>
-</body>
-</pre>
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/customization_themes.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/customization_themes.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/customization_themes.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/customization_themes.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,262 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Customization - Creating a theme</title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+ <h1>Customization - Creating a theme</h1>
+</div>
+
+<div class="content">
+<h2>Creating your own Themes</h2>
+<p>
+Creating you own themes for the TinyMCE application is fairly easy if you know the basics of HTML, CSS and Javascript. The most easy way is to copy the "simple" or the "advanced" template and rename it as your own name to for example "mytheme". After you copy the template you need to change the red sections marked below to "mytheme" this is needed so that themes don't overlap in other words it gives the theme a unique name. Then just alter the HTML code as you see fit but notice some elements needs to be there so check the docs below on each function also remember that your custom themes needs to be located in tiny_mce's "themes" directory. If you want you may add theme specific options/settings but remember to namespace them in the following format "theme_<your theme>_<option>".
+</p>
+<div class="separator"></div>
+<h3>Theme directory structure</h3>
+<p>
+<table class="btable">
+<thead>
+ <th>File/Directory</td>
+ <th>Description</td>
+</thead>
+<tbody>
+ <tr><td>css</td><td>Theme specific CSS files</td></tr>
+ <tr><td>docs</td><td>Theme specific documentation</td></tr>
+ <tr><td>images</td><td>Theme specific images</td></tr>
+ <tr><td>jscripts</td><td>Theme specific jscripts for HTML dialogs</td></tr>
+ <tr><td>langs</td><td>Theme specific language files</td></tr>
+ <tr><td>editor_template.js</td><td>Editor theme template file (compressed).</td></tr>
+ <tr><td>editor_template_src.js</td><td>Editor theme template file (source).</td></tr>
+ <tr><td>somedialog.htm</td><td>Theme specific dialog HTML file.</td></tr>
+</table>
+</p>
+<div class="separator"></div>
+<h3>Theme example source</h3>
+<p>
+The example below shows a simple empty theme and all possible callbacks.
+</p>
+<p>
+<div class="example">
+<pre>
+var TinyMCE_<span class="marked">SomeName</span>Theme = {
+ /**
+ * Returns information about the theme as a name/value array.
+ * The current keys are longname, author, authorurl, infourl and version.
+ *
+ * @returns Name/value array containing information about the theme.
+ * @type Array
+ */
+ getInfo : function() {
+ return {
+ longname : 'Your Theme',
+ author : 'Your name',
+ authorurl : 'http://www.yoursite.com',
+ infourl : 'http://www.yoursite.com/docs/template.html',
+ version : "1.0"
+ };
+ },
+
+ /**
+ * Gets executed when a TinyMCE editor instance is initialized.
+ *
+ * @param {TinyMCE_Control} Initialized TinyMCE editor control instance.
+ */
+ initInstance : function(inst) {
+ // You can take out theme specific parameters
+ alert("Initialization parameter:" + tinyMCE.getParam("<span class="marked">somename</span>_someparam", false));
+
+ // Register custom keyboard shortcut
+ inst.addShortcut('ctrl', 't', 'lang_<span class="marked">somename</span>_desc', 'mceSomeCommand');
+ },
+
+ /**
+ * Returns the HTML code for a specific control or empty string if this theme doesn't have that control.
+ * A control can be a button, select list or any other HTML item to present in the TinyMCE user interface.
+ * The variable {$editor_id} will be replaced with the current editor instance id and {$themeurl} will be replaced
+ * with the URL of the theme. Language variables such as {$lang_somekey} will also be replaced with contents from
+ * the language packs.
+ *
+ * @param {string} cn Editor control/button name to get HTML for.
+ * @return HTML code for a specific control or empty string.
+ * @type string
+ */
+ getControlHTML : function(cn) {
+ switch (cn) {
+ case "<span class="marked">SomeControl</span>":
+ return tinyMCE.getButtonHTML(cn, 'lang_<span class="marked">sometheme</span>_<span class="marked">button</span>_desc', '{$themeurl}/images/<span class="marked">someimage</span>.gif', '<span class="marked">mceSomeCommand</span>');
+ }
+
+ return "";
+ },
+
+ /**
+ * Returns the HTML code that should be inserted for a specific editor instance.
+ * This function should return a name/value array with three items html, delta_width, delta_height.
+ * The html item should contain the HTML code to insert as a editor instance.
+ * The variable {$editor_id} will be replaced with the current editor instance id and {$themeurl} will be replaced
+ * with the URL of the theme. Language variables such as {$lang_somekey} will also be replaced with contents from
+ * the language packs. Any element with the id {$editor_id} will be replaced with the editor iframe element.
+ * The {$width} and {$height} variables will be replaced with the editors outside dimension values.
+ * The delta_width/height is the relative width/height in pixels to add or remove from the iframe dimensions.
+ *
+ * @param {Array} settings Name/Value array instance settings.
+ * @param {string} editor_id TinMYCE editor control instance id.
+ * @return Name/Value array of editor template data.
+ * @type Array
+ */
+ getEditorTemplate : function(settings, editor_id) {
+ var html = "";
+
+ // Build toolbar and editor instance
+ html += "..";
+
+ return {
+ html : html,
+ delta_width : 0,
+ delta_height : 0
+ };
+ },
+
+ /**
+ * Executes a specific command, this function handles theme commands.
+ *
+ * @param {string} editor_id TinyMCE editor instance id that issued the command.
+ * @param {HTMLElement} element Body or root element for the editor instance.
+ * @param {string} command Command name to be executed.
+ * @param {string} user_interface True/false if a user interface should be presented.
+ * @param {mixed} value Custom value argument, can be anything.
+ * @return true/false if the command was executed by this theme or not.
+ * @type
+ */
+ execCommand : function(editor_id, element, command, user_interface, value) {
+ // Handle commands
+ switch (command) {
+ // Remember to have the "mce" prefix for commands so they don't intersect with built in ones in the browser.
+ case "mce<span class="marked">SomeCommand</span>":
+ // Do your custom command logic here.
+
+ return true;
+ }
+
+ // Pass to next handler in chain
+ return false;
+ },
+
+ /**
+ * Gets called ones the cursor/selection in a TinyMCE instance changes. This is useful to enable/disable
+ * button controls depending on where the user are and what they have selected. This method gets executed
+ * alot and should be as performance tuned as possible.
+ *
+ * @param {string} editor_id TinyMCE editor instance id that was changed.
+ * @param {HTMLNode} node Current node location, where the cursor is in the DOM tree.
+ * @param {int} undo_index The current undo index, if this is -1 custom undo/redo is disabled.
+ * @param {int} undo_levels The current undo levels, if this is -1 custom undo/redo is disabled.
+ * @param {boolean} visual_aid Is visual aids enabled/disabled ex: dotted lines on tables.
+ * @param {boolean} any_selection Is there any selection at all or is there only a cursor.
+ */
+ handleNodeChange : function(editor_id, node, undo_index, undo_levels, visual_aid, any_selection) {
+ },
+
+ /**
+ * Gets called when a TinyMCE editor instance gets filled with content on startup.
+ *
+ * @param {string} editor_id TinyMCE editor instance id that was filled with content.
+ * @param {HTMLElement} body HTML body element of editor instance.
+ * @param {HTMLDocument} doc HTML document instance.
+ */
+ setupContent : function(editor_id, body, doc) {
+ },
+
+ /**
+ * Gets called when the contents of a TinyMCE area is modified, in other words when a undo level is
+ * added.
+ *
+ * @param {TinyMCE_Control} inst TinyMCE editor area control instance that got modified.
+ */
+ onChange : function(inst) {
+ },
+
+ /**
+ * Gets called when TinyMCE handles events such as keydown, mousedown etc. TinyMCE
+ * doesn't listen on all types of events so custom event handling may be required for
+ * some purposes.
+ *
+ * @param {Event} e HTML editor event reference.
+ * @return true - pass to next handler in chain, false - stop chain execution
+ * @type boolean
+ */
+ handleEvent : function(e) {
+ return true;
+ },
+
+ /**
+ * Gets called when HTML contents is inserted or retrived from a TinyMCE editor instance.
+ * The type parameter contains what type of event that was performed and what format the content is in.
+ * Possible valuses for type is get_from_editor, insert_to_editor, get_from_editor_dom, insert_to_editor_dom.
+ *
+ * @param {string} type Cleanup event type.
+ * @param {mixed} content Editor contents that gets inserted/extracted can be a string or DOM element.
+ * @param {TinyMCE_Control} inst TinyMCE editor instance control that performes the cleanup.
+ * @return New content or the input content depending on action.
+ * @type string
+ */
+ cleanup : function(type, content, inst) {
+ return content;
+ },
+
+ // Private theme internal methods
+
+ /**
+ * This is just a internal theme method, prefix all internal methods with a _ character.
+ * The prefix is needed so they doesn't collide with future TinyMCE callback functions.
+ *
+ * @param {string} a Some arg1.
+ * @param {string} b Some arg2.
+ * @return Some return.
+ * @type string
+ */
+ _someInternalFunction : function(a, b) {
+ return 1;
+ }
+};
+
+// Adds the theme class to the list of available TinyMCE themes
+tinyMCE.addTheme("<span class="marked">sometheme</span>", TinyMCE_<span class="marked">SomeTheme</span>Theme);
+</pre>
+</div>
+</p>
+<div class="separator"></div>
+
+<h3>Creating popup HTML files</h3>
+<p>
+When creating a popup you need to include the "tiny_mce_popup.js" this enables you to retrive the tinyMCE global instance in all popup windows. All variables and language definitions gets replaced in the page when it loads. So language variables such as {$lang_something} can be places in the HTML code, if you need to get a language string in JavaScript simply use the tinyMCE.getLang function.
+</p>
+<h3>Example of simple popup file:</h3>
+<div class="example">
+<pre>
+<html>
+<head>
+<title>{$lang_theme_sample_title}</title>
+<script language="javascript" src="../../tiny_mce_popup.js"></script>
+<script language="javascript">
+ // getWindowArg returns any arguments passed to the window
+ alert(tinyMCE.getWindowArg('some_arg'));
+</script>
+<body>
+ <strong>{$lang_theme_sample_desc}</strong>
+</body>
+</pre>
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/faq.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/faq.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/faq.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,220 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Frequently Asked Questions</title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
- <h1>Frequently Asked Questions</h1>
-</div>
-
-<div class="content">
- <p>Here are some common answers to common questions. If you need more help you can always visit the <a href="http://tinymce.moxiecode.com/">TinyMCE Forum</a> on the TinyMCE web site.</p>
- <p>
- <ul class="plist">
- <li><a href="#broken">TinyMCE is broken, what should I do?</a></li>
- <li><a href="#paths">Why is my paths incorrect, I want absolute/relative URLs?</a></li>
- <li><a href="#strip">Why does TinyMCE strip aways attributes or tags from my source?</a></li>
- <li><a href="#font">How do I change the default font size/face color of the editor?</a></li>
- <li><a href="#remove">How do I remove/add buttons/controls to TinyMCE?</a></li>
- <li><a href="#quotes">Why does my HTML output include lots of \" like <a href=\"mylink.htm\">link</a>?</a></li>
- <li><a href="#load">TinyMCE takes ages to load, is there a way to make it load quicker?</a></li>
- <li><a href="#hidden">TinyMCE stops working when placed in tabs or hidden divs?</a></li>
- <li><a href="#commercial">Can I use TinyMCE in my commercial application?</a></li>
- <li><a href="#commercial2">Are there any restrictions to using TinyMCE in my commercial application?</a></li>
- <li><a href="#lgpl">I don't like LGPL, is there a commercial license available for me?</a></li>
- <li><a href="#support">Do you provide support?</a></li>
- <li><a href="#who">Who made this software?</a></li>
- </ul>
- </p>
-
- <div class="separator"></div>
-
- <a name="broken"></a>
- <h2>TinyMCE is broken, what should I do?</h2>
- <div class="section">
- <p>There are a few things you should check before posting questions about your problem at the forum or sourceforge.</p>
- <p>
- <ul>
- <li>Does TinyMCE work on the <a href="http://tinymce.moxiecode.com/example_full.php?example=true">TinyMCE website</a>. Then you know that TinyMCE works with your browser.</li>
- <li>Try to disable any other JavaScripts on the page, some scripts interfere with internal functions that TinyMCE uses. Those scripts are probably poorly written.</li>
- <li>Check that you havn't missed removing the last , character in your initialization code and that all the other rows have a trailing , character.</li>
- <li>Verify that the path/URL to TinyMCE is correct, you can use the excellent tool <a href="http://www.fiddlertool.com/fiddler/">Fiddler</a> for this and other HTTP debugging.</li>
- <li>Do not cross domain load TinyMCE or any other script unless you really really must, since this will invoke various browser security features. In other words, try placing everything on the same server.</li>
- <li>Don't place textareas within paragraph elements since this is not valid HTML and it will break MSIE and TinyMCE.</li>
- </ul>
- </p>
- </div>
-
- <div class="separator"></div>
-
- <a name="paths"></a>
- <h2>Why is my paths incorrect, I want absolute/relative URLs?</h2>
- <div class="section">
- <p>
- These are the diffrent configuration scenarios for URLs within TinyMCE:
- <table class="btable">
- <thead>
- <th>Output</th>
- <th>Config</th>
- <th>Description</th>
- </thead>
- <tbody>
- <tr>
- <td><strong>http://www.site.com/path1/path2/file.htm</strong> will be converted to <strong>path2/file.htm</strong></td>
- <td nowrap="nowrap">
-<a href="option_relative_urls.html">relative_urls</a> : true,<br />
-<a href="option_document_base_url.html">document_base_url</a> : "http://www.site.com/path1/"<br />
-</td>
- <td>This will convert all URLs within the same domain to relative URLs.<br /> <strong>The URLs will be relative from the <a href="option_document_base_url.html">document_base_url</a></strong>.</td>
- </tr>
-
- <tr>
- <td><strong>path2/file.htm</strong> will be converted to <strong>/path1/path2/file.htm</strong></td>
- <td nowrap="nowrap">
-<a href="option_relative_urls.html">relative_urls</a> : false,<br />
-<a href="option_remove_script_host.html">remove_script_host</a> : true,<br />
-<a href="option_document_base_url.html">document_base_url</a> : "http://www.site.com/path1/"<br />
-</td>
- <td>This will convert all relative URLs to absolute URLs.<br /> <strong>The URLs will be absolute based on the <a href="option_document_base_url.html">document_base_url</a></strong>.</td>
- </tr>
-
- <tr>
- <td><strong>path2/file.htm</strong> will be converted to <strong>http://www.site.com/path1/path2/file.htm</strong></td>
- <td nowrap="nowrap">
-<a href="option_relative_urls.html">relative_urls</a> : false,<br />
-<a href="option_remove_script_host.html">remove_script_host</a> : false,<br />
-<a href="option_document_base_url.html">document_base_url</a> : "http://www.site.com/path1/"<br />
-</td>
- <td>This will convert all relative URLs to absolute URLs.<br /> <strong>The URLs will be absolute based on the <a href="option_document_base_url.html">document_base_url</a></strong>.</td>
- </tr>
-
- <tr>
- <td><strong>path2/file.htm</strong> or <strong>http://www.site.com/path1/path2/file.htm</strong> will not be converted at all.</td>
- <td nowrap="nowrap">
-<a href="option_convert_urls.html">convert_urls</a> : false<br />
-</td>
- <td>This option will preserve the URLs as they are in a separate attribute while editing, <strong>since browsers tend to auto convert URLs</strong>.</td>
- </tr>
-
- </tbody>
- </table>
- </p>
- </div>
-
- <div class="separator"></div>
-
- <a name="strip"></a>
- <h2>Why does TinyMCE strip aways attributes or tags from my source?</h2>
- <div class="section">
- <p>You need to check out the "<a href="option_valid_elements.html">valid_elements</a>" and "<a href="option_extended_valid_elements.html">extended_valid_elements</a>" option in the configuration. By default, TinyMCE only allows certain tags and attributes. TinyMCE also tries to follow the XHTML specification as much as possible (and so should you), this can cause some unexpected source changes, there are however configuration options to battle this issue, study the configuration options in details.</p>
- </div>
-
- <div class="separator"></div>
-
- <a name="font"></a>
- <h2>How do I change the default font size/face color of the editor?</h2>
- <div class="section">
- <p>
- We recommend that you have a look at the <a href="option_content_css.html">content_css</a> option, this enables you to switch the CSS file TinyMCE uses for it's editing area with a file with your CSS rules for font size and so forth.
- </p>
- </div>
-
- <div class="separator"></div>
-
- <a name="remove"></a>
- <h2>How do I remove/add buttons/controls to TinyMCE?</h2>
- <div class="section">
- <p>
- There are quite a few options for this but a reference of all available buttons/control names can be found in the <a href="reference_buttons.html">button/control reference</a>.
- </p>
- </div>
-
- <div class="separator"></div>
-
- <a name="quotes"></a>
- <h2>Why does my HTML output include lots of \" like <a href=\"mylink.htm\">link</a>?</h2>
- <div class="section">
- <p>This is probably because you are using PHP and it has a feature that's called magic quotes that is enabled by default. You can read more about this at the <a href="http://se2.php.net/magic_quotes/">PHP website</a> or use the <a href="http://www.php.net/manual/en/function.stripslashes.php">stripslashes</a> function.</p>
- </div>
-
- <div class="separator"></div>
-
- <a name="load"></a>
- <h2>TinyMCE takes ages to load, is there a way to make it load quicker?</h2>
- <div class="section">
- <p>
- If you use PHP on your server you can use tiny_mce_gzip.php instead of tiny_mce.js in page script call. This PHP file bundles all .js files together into two HTTP requests instead of one for each plugin, language file and theme and it also GZip compresses these files.
- </p>
- </div>
-
- <div class="separator"></div>
-
- <a name="hidden"></a>
- <h2>TinyMCE stops working when placed in tabs or hidden divs?</h2>
- <div class="section">
- <p>Since Gecko based browsers Mozilla/Firefox has a bug where it looses designMode on iframes that are hidden a special option is needed that re-enables the design mode when reappearing after being hidden. Enable this option to resolve the issue: "<a href="option_auto_reset_designmode.html">auto_reset_designmode</a>".</p>
- </div>
-
- <div class="separator"></div>
-
- <a name="commercial"></a>
- <h2>Can I use TinyMCE in my commercial application?</h2>
- <div class="section">
- <p>Yes you can, the LGPL license is a Free Software License. You can read the whole license <a href="license.html">here</a> or visit Free Software Foundation web site <a href="http://www.fsf.org/" target="_blank">here</a></p>
- </div>
-
- <div class="separator"></div>
-
- <a name="commercial2"></a>
- <h2>Are there any restrictions to using TinyMCE in my commercial application?</h2>
- <div class="section">
- <p>
- Yes, all copyright notices must be intact. Moxiecode Systems are still the copyright holders of the source code, so you can not use the code for other applications. Any modifications or add-ons you make to the source has to be contributes back to the TinyMCE community.
- </p>
- <p>
- If you start to make a lot of revenue from using TinyMCE, please remember the time and dedication that has been put into this by other developers, respect this and give credit to those who deserve it.
- </p>
- </div>
-
- <div class="separator"></div>
-
- <a name="lgpl"></a>
- <h2>I don't like LGPL, is there a commercial license available for me?</h2>
- <div class="section">
- <p>
- Yes, we can draw up a license for you that enables you to remove copyright restrictions or anything else you would like to have in this license agreement. Contact us through email, sales (at) moxiecode (dot) com.
- </p>
- </div>
-
- <div class="separator"></div>
-
- <a name="support"></a>
- <h2>Do you provide support?</h2>
- <div class="section">
- <p>
- We do not provide any non-commercial support outside the forum on the <a href="http://tinymce.moxiecode.com/">TinyMCE</a> web site. If you require commercial support, contact us by email, sales (at) moxiecode (dot) com.
- </p>
- </div>
-
- <div class="separator"></div>
-
- <a name="who"></a>
- <h2>Who made this software?</h2>
- <div class="section">
- <p>
- The author of TinyMCE is <a href="http://www.moxiecode.com/" target="_blank">Moxiecode Systems</a>, parts of code has also been contributed by others, <a href="credits.html">here</a> are the credits list.
- </p>
- </div>
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/faq.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/faq.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/faq.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/faq.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,220 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Frequently Asked Questions</title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+ <h1>Frequently Asked Questions</h1>
+</div>
+
+<div class="content">
+ <p>Here are some common answers to common questions. If you need more help you can always visit the <a href="http://tinymce.moxiecode.com/">TinyMCE Forum</a> on the TinyMCE web site.</p>
+ <p>
+ <ul class="plist">
+ <li><a href="#broken">TinyMCE is broken, what should I do?</a></li>
+ <li><a href="#paths">Why is my paths incorrect, I want absolute/relative URLs?</a></li>
+ <li><a href="#strip">Why does TinyMCE strip aways attributes or tags from my source?</a></li>
+ <li><a href="#font">How do I change the default font size/face color of the editor?</a></li>
+ <li><a href="#remove">How do I remove/add buttons/controls to TinyMCE?</a></li>
+ <li><a href="#quotes">Why does my HTML output include lots of \" like <a href=\"mylink.htm\">link</a>?</a></li>
+ <li><a href="#load">TinyMCE takes ages to load, is there a way to make it load quicker?</a></li>
+ <li><a href="#hidden">TinyMCE stops working when placed in tabs or hidden divs?</a></li>
+ <li><a href="#commercial">Can I use TinyMCE in my commercial application?</a></li>
+ <li><a href="#commercial2">Are there any restrictions to using TinyMCE in my commercial application?</a></li>
+ <li><a href="#lgpl">I don't like LGPL, is there a commercial license available for me?</a></li>
+ <li><a href="#support">Do you provide support?</a></li>
+ <li><a href="#who">Who made this software?</a></li>
+ </ul>
+ </p>
+
+ <div class="separator"></div>
+
+ <a name="broken"></a>
+ <h2>TinyMCE is broken, what should I do?</h2>
+ <div class="section">
+ <p>There are a few things you should check before posting questions about your problem at the forum or sourceforge.</p>
+ <p>
+ <ul>
+ <li>Does TinyMCE work on the <a href="http://tinymce.moxiecode.com/example_full.php?example=true">TinyMCE website</a>. Then you know that TinyMCE works with your browser.</li>
+ <li>Try to disable any other JavaScripts on the page, some scripts interfere with internal functions that TinyMCE uses. Those scripts are probably poorly written.</li>
+ <li>Check that you havn't missed removing the last , character in your initialization code and that all the other rows have a trailing , character.</li>
+ <li>Verify that the path/URL to TinyMCE is correct, you can use the excellent tool <a href="http://www.fiddlertool.com/fiddler/">Fiddler</a> for this and other HTTP debugging.</li>
+ <li>Do not cross domain load TinyMCE or any other script unless you really really must, since this will invoke various browser security features. In other words, try placing everything on the same server.</li>
+ <li>Don't place textareas within paragraph elements since this is not valid HTML and it will break MSIE and TinyMCE.</li>
+ </ul>
+ </p>
+ </div>
+
+ <div class="separator"></div>
+
+ <a name="paths"></a>
+ <h2>Why is my paths incorrect, I want absolute/relative URLs?</h2>
+ <div class="section">
+ <p>
+ These are the diffrent configuration scenarios for URLs within TinyMCE:
+ <table class="btable">
+ <thead>
+ <th>Output</th>
+ <th>Config</th>
+ <th>Description</th>
+ </thead>
+ <tbody>
+ <tr>
+ <td><strong>http://www.site.com/path1/path2/file.htm</strong> will be converted to <strong>path2/file.htm</strong></td>
+ <td nowrap="nowrap">
+<a href="option_relative_urls.html">relative_urls</a> : true,<br />
+<a href="option_document_base_url.html">document_base_url</a> : "http://www.site.com/path1/"<br />
+</td>
+ <td>This will convert all URLs within the same domain to relative URLs.<br /> <strong>The URLs will be relative from the <a href="option_document_base_url.html">document_base_url</a></strong>.</td>
+ </tr>
+
+ <tr>
+ <td><strong>path2/file.htm</strong> will be converted to <strong>/path1/path2/file.htm</strong></td>
+ <td nowrap="nowrap">
+<a href="option_relative_urls.html">relative_urls</a> : false,<br />
+<a href="option_remove_script_host.html">remove_script_host</a> : true,<br />
+<a href="option_document_base_url.html">document_base_url</a> : "http://www.site.com/path1/"<br />
+</td>
+ <td>This will convert all relative URLs to absolute URLs.<br /> <strong>The URLs will be absolute based on the <a href="option_document_base_url.html">document_base_url</a></strong>.</td>
+ </tr>
+
+ <tr>
+ <td><strong>path2/file.htm</strong> will be converted to <strong>http://www.site.com/path1/path2/file.htm</strong></td>
+ <td nowrap="nowrap">
+<a href="option_relative_urls.html">relative_urls</a> : false,<br />
+<a href="option_remove_script_host.html">remove_script_host</a> : false,<br />
+<a href="option_document_base_url.html">document_base_url</a> : "http://www.site.com/path1/"<br />
+</td>
+ <td>This will convert all relative URLs to absolute URLs.<br /> <strong>The URLs will be absolute based on the <a href="option_document_base_url.html">document_base_url</a></strong>.</td>
+ </tr>
+
+ <tr>
+ <td><strong>path2/file.htm</strong> or <strong>http://www.site.com/path1/path2/file.htm</strong> will not be converted at all.</td>
+ <td nowrap="nowrap">
+<a href="option_convert_urls.html">convert_urls</a> : false<br />
+</td>
+ <td>This option will preserve the URLs as they are in a separate attribute while editing, <strong>since browsers tend to auto convert URLs</strong>.</td>
+ </tr>
+
+ </tbody>
+ </table>
+ </p>
+ </div>
+
+ <div class="separator"></div>
+
+ <a name="strip"></a>
+ <h2>Why does TinyMCE strip aways attributes or tags from my source?</h2>
+ <div class="section">
+ <p>You need to check out the "<a href="option_valid_elements.html">valid_elements</a>" and "<a href="option_extended_valid_elements.html">extended_valid_elements</a>" option in the configuration. By default, TinyMCE only allows certain tags and attributes. TinyMCE also tries to follow the XHTML specification as much as possible (and so should you), this can cause some unexpected source changes, there are however configuration options to battle this issue, study the configuration options in details.</p>
+ </div>
+
+ <div class="separator"></div>
+
+ <a name="font"></a>
+ <h2>How do I change the default font size/face color of the editor?</h2>
+ <div class="section">
+ <p>
+ We recommend that you have a look at the <a href="option_content_css.html">content_css</a> option, this enables you to switch the CSS file TinyMCE uses for it's editing area with a file with your CSS rules for font size and so forth.
+ </p>
+ </div>
+
+ <div class="separator"></div>
+
+ <a name="remove"></a>
+ <h2>How do I remove/add buttons/controls to TinyMCE?</h2>
+ <div class="section">
+ <p>
+ There are quite a few options for this but a reference of all available buttons/control names can be found in the <a href="reference_buttons.html">button/control reference</a>.
+ </p>
+ </div>
+
+ <div class="separator"></div>
+
+ <a name="quotes"></a>
+ <h2>Why does my HTML output include lots of \" like <a href=\"mylink.htm\">link</a>?</h2>
+ <div class="section">
+ <p>This is probably because you are using PHP and it has a feature that's called magic quotes that is enabled by default. You can read more about this at the <a href="http://se2.php.net/magic_quotes/">PHP website</a> or use the <a href="http://www.php.net/manual/en/function.stripslashes.php">stripslashes</a> function.</p>
+ </div>
+
+ <div class="separator"></div>
+
+ <a name="load"></a>
+ <h2>TinyMCE takes ages to load, is there a way to make it load quicker?</h2>
+ <div class="section">
+ <p>
+ If you use PHP on your server you can use tiny_mce_gzip.php instead of tiny_mce.js in page script call. This PHP file bundles all .js files together into two HTTP requests instead of one for each plugin, language file and theme and it also GZip compresses these files.
+ </p>
+ </div>
+
+ <div class="separator"></div>
+
+ <a name="hidden"></a>
+ <h2>TinyMCE stops working when placed in tabs or hidden divs?</h2>
+ <div class="section">
+ <p>Since Gecko based browsers Mozilla/Firefox has a bug where it looses designMode on iframes that are hidden a special option is needed that re-enables the design mode when reappearing after being hidden. Enable this option to resolve the issue: "<a href="option_auto_reset_designmode.html">auto_reset_designmode</a>".</p>
+ </div>
+
+ <div class="separator"></div>
+
+ <a name="commercial"></a>
+ <h2>Can I use TinyMCE in my commercial application?</h2>
+ <div class="section">
+ <p>Yes you can, the LGPL license is a Free Software License. You can read the whole license <a href="license.html">here</a> or visit Free Software Foundation web site <a href="http://www.fsf.org/" target="_blank">here</a></p>
+ </div>
+
+ <div class="separator"></div>
+
+ <a name="commercial2"></a>
+ <h2>Are there any restrictions to using TinyMCE in my commercial application?</h2>
+ <div class="section">
+ <p>
+ Yes, all copyright notices must be intact. Moxiecode Systems are still the copyright holders of the source code, so you can not use the code for other applications. Any modifications or add-ons you make to the source has to be contributes back to the TinyMCE community.
+ </p>
+ <p>
+ If you start to make a lot of revenue from using TinyMCE, please remember the time and dedication that has been put into this by other developers, respect this and give credit to those who deserve it.
+ </p>
+ </div>
+
+ <div class="separator"></div>
+
+ <a name="lgpl"></a>
+ <h2>I don't like LGPL, is there a commercial license available for me?</h2>
+ <div class="section">
+ <p>
+ Yes, we can draw up a license for you that enables you to remove copyright restrictions or anything else you would like to have in this license agreement. Contact us through email, sales (at) moxiecode (dot) com.
+ </p>
+ </div>
+
+ <div class="separator"></div>
+
+ <a name="support"></a>
+ <h2>Do you provide support?</h2>
+ <div class="section">
+ <p>
+ We do not provide any non-commercial support outside the forum on the <a href="http://tinymce.moxiecode.com/">TinyMCE</a> web site. If you require commercial support, contact us by email, sales (at) moxiecode (dot) com.
+ </p>
+ </div>
+
+ <div class="separator"></div>
+
+ <a name="who"></a>
+ <h2>Who made this software?</h2>
+ <div class="section">
+ <p>
+ The author of TinyMCE is <a href="http://www.moxiecode.com/" target="_blank">Moxiecode Systems</a>, parts of code has also been contributed by others, <a href="credits.html">here</a> are the credits list.
+ </p>
+ </div>
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/images/moxiecode.gif
===================================================================
(Binary files differ)
Copied: trunk/htdocs/js/tinymce/docs/images/moxiecode.gif (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/images/moxiecode.gif)
===================================================================
(Binary files differ)
Deleted: trunk/htdocs/js/tinymce/docs/index.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/index.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/index.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,44 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>TinyMCE Documentation - Index</title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
- <h1>TinyMCE Documentation</h1>
-</div>
-
-<div class="content">
- <ul class="helpindex">
- <li><a href="about.html">About TinyMCE</a></li>
- <li><a href="installing.html">Installation instructions</a></li>
- <li class="list_subtitle"><strong>Reference</strong></li>
- <ul>
- <li><a href="reference_configuration.html">Configuration</a></li>
- <li><a href="reference_buttons.html">Button/control reference</a></li>
- <li><a href="reference_javascript_functions.html">JavaScript functions</a></li>
- <li><a href="reference_plugins.html">Plugins</a></li>
- </ul>
- <li class="list_subtitle"><strong>Customization</strong></li>
- <ul style="padding-bottom: 5px;">
- <li><a href="customization_plugins.html">Creating a plugin</a></li>
- <li><a href="customization_language_packs.html">Creating a language pack</a></li>
- <li><a href="customization_themes.html">Creating a theme</a></li>
- </ul>
- <li><a href="compatiblity_chart.html">Compatiblity chart</a></li>
- <li><a href="faq.html">Frequently asked questions</a></li>
- <li><a href="credits.html">Credits</a></li>
- <li><a href="license.html">License (LGPL)</a></li>
- </ul>
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/index.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/index.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/index.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/index.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,44 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>TinyMCE Documentation - Index</title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+ <h1>TinyMCE Documentation</h1>
+</div>
+
+<div class="content">
+ <ul class="helpindex">
+ <li><a href="about.html">About TinyMCE</a></li>
+ <li><a href="installing.html">Installation instructions</a></li>
+ <li class="list_subtitle"><strong>Reference</strong></li>
+ <ul>
+ <li><a href="reference_configuration.html">Configuration</a></li>
+ <li><a href="reference_buttons.html">Button/control reference</a></li>
+ <li><a href="reference_javascript_functions.html">JavaScript functions</a></li>
+ <li><a href="reference_plugins.html">Plugins</a></li>
+ </ul>
+ <li class="list_subtitle"><strong>Customization</strong></li>
+ <ul style="padding-bottom: 5px;">
+ <li><a href="customization_plugins.html">Creating a plugin</a></li>
+ <li><a href="customization_language_packs.html">Creating a language pack</a></li>
+ <li><a href="customization_themes.html">Creating a theme</a></li>
+ </ul>
+ <li><a href="compatiblity_chart.html">Compatiblity chart</a></li>
+ <li><a href="faq.html">Frequently asked questions</a></li>
+ <li><a href="credits.html">Credits</a></li>
+ <li><a href="license.html">License (LGPL)</a></li>
+ </ul>
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/installation_example_00.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/installation_example_00.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/installation_example_00.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,35 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Installation Example 00</title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-<script language="javascript" type="text/javascript" src="../jscripts/tiny_mce/tiny_mce.js"></script>
-<script language="javascript" type="text/javascript">
-tinyMCE.init({
- mode : "textareas",
- theme : "simple"
-});
-</script>
-</head>
-<body>
-
-<div class="header">
- <h1>Installation example 00</h1>
-</div>
-
-<div class="content">
- <h3>Example</h3>
- <form method="post">
- <textarea name="content" cols="50" rows="15">This is some content that will be editable with TinyMCE.</textarea>
- </form>
- </div>
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/installation_example_00.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/installation_example_00.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/installation_example_00.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/installation_example_00.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,35 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Installation Example 00</title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+<script language="javascript" type="text/javascript" src="../jscripts/tiny_mce/tiny_mce.js"></script>
+<script language="javascript" type="text/javascript">
+tinyMCE.init({
+ mode : "textareas",
+ theme : "simple"
+});
+</script>
+</head>
+<body>
+
+<div class="header">
+ <h1>Installation example 00</h1>
+</div>
+
+<div class="content">
+ <h3>Example</h3>
+ <form method="post">
+ <textarea name="content" cols="50" rows="15">This is some content that will be editable with TinyMCE.</textarea>
+ </form>
+ </div>
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/installation_example_01.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/installation_example_01.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/installation_example_01.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,36 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Installation Example 01</title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-<script language="javascript" type="text/javascript" src="../jscripts/tiny_mce/tiny_mce_src.js"></script>
-<script language="javascript" type="text/javascript">
-tinyMCE.init({
- mode : "textareas",
- theme : "advanced"
-});
-</script>
-</head>
-<body>
-
-<div class="header">
- <h1>Installation example 01</h1>
-</div>
-
-<div class="content">
- <h3>Example</h3>
- <p>Open this page with "View source" or similar to see how the configuration is made.</p>
- <form method="post">
- <textarea name="content" cols="50" rows="15">This is some content that will be editable with TinyMCE.</textarea>
- </form>
- </div>
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/installation_example_01.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/installation_example_01.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/installation_example_01.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/installation_example_01.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,36 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Installation Example 01</title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+<script language="javascript" type="text/javascript" src="../jscripts/tiny_mce/tiny_mce_src.js"></script>
+<script language="javascript" type="text/javascript">
+tinyMCE.init({
+ mode : "textareas",
+ theme : "advanced"
+});
+</script>
+</head>
+<body>
+
+<div class="header">
+ <h1>Installation example 01</h1>
+</div>
+
+<div class="content">
+ <h3>Example</h3>
+ <p>Open this page with "View source" or similar to see how the configuration is made.</p>
+ <form method="post">
+ <textarea name="content" cols="50" rows="15">This is some content that will be editable with TinyMCE.</textarea>
+ </form>
+ </div>
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/installation_example_02.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/installation_example_02.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/installation_example_02.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,52 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Installation Example 02</title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-<script language="javascript" type="text/javascript" src="../jscripts/tiny_mce/tiny_mce.js"></script>
-<script language="javascript" type="text/javascript">
-tinyMCE.init({
- mode : "textareas",
- theme : "advanced",
- plugins : "table,save,advhr,advimage,advlink,emotions,iespell,insertdatetime,preview,zoom,flash,searchreplace,print,contextmenu",
- theme_advanced_buttons1_add_before : "save,separator",
- theme_advanced_buttons1_add : "fontselect,fontsizeselect",
- theme_advanced_buttons2_add : "separator,insertdate,inserttime,preview,zoom,separator,forecolor,backcolor",
- theme_advanced_buttons2_add_before: "cut,copy,paste,separator,search,replace,separator",
- theme_advanced_buttons3_add_before : "tablecontrols,separator",
- theme_advanced_buttons3_add : "emotions,iespell,flash,advhr,separator,print",
- theme_advanced_toolbar_location : "top",
- theme_advanced_toolbar_align : "left",
- theme_advanced_path_location : "bottom",
- plugin_insertdate_dateFormat : "%Y-%m-%d",
- plugin_insertdate_timeFormat : "%H:%M:%S",
- extended_valid_elements : "a[name|href|target|title|onclick],img[class|src|border=0|alt|title|hspace|vspace|width|height|align|onmouseover|onmouseout|name],hr[class|width|size|noshade],font[face|size|color|style],span[class|align|style]",
- external_link_list_url : "example_data/example_link_list.js",
- external_image_list_url : "example_data/example_image_list.js",
- flash_external_list_url : "example_data/example_flash_list.js"
-});
-</script>
-</head>
-<body>
-
-<div class="header">
- <h1>Installation example 02</h1>
-</div>
-
-<div class="content">
- <h3>Example</h3>
- <p>Open this page with "View source" or similar to see how the configuration is made.</p>
- <form method="post">
- <textarea name="content" cols="85" rows="15">This is some content that will be editable with TinyMCE.</textarea>
- </form>
- </div>
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/installation_example_02.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/installation_example_02.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/installation_example_02.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/installation_example_02.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,52 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Installation Example 02</title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+<script language="javascript" type="text/javascript" src="../jscripts/tiny_mce/tiny_mce.js"></script>
+<script language="javascript" type="text/javascript">
+tinyMCE.init({
+ mode : "textareas",
+ theme : "advanced",
+ plugins : "table,save,advhr,advimage,advlink,emotions,iespell,insertdatetime,preview,zoom,flash,searchreplace,print,contextmenu",
+ theme_advanced_buttons1_add_before : "save,separator",
+ theme_advanced_buttons1_add : "fontselect,fontsizeselect",
+ theme_advanced_buttons2_add : "separator,insertdate,inserttime,preview,zoom,separator,forecolor,backcolor",
+ theme_advanced_buttons2_add_before: "cut,copy,paste,separator,search,replace,separator",
+ theme_advanced_buttons3_add_before : "tablecontrols,separator",
+ theme_advanced_buttons3_add : "emotions,iespell,flash,advhr,separator,print",
+ theme_advanced_toolbar_location : "top",
+ theme_advanced_toolbar_align : "left",
+ theme_advanced_path_location : "bottom",
+ plugin_insertdate_dateFormat : "%Y-%m-%d",
+ plugin_insertdate_timeFormat : "%H:%M:%S",
+ extended_valid_elements : "a[name|href|target|title|onclick],img[class|src|border=0|alt|title|hspace|vspace|width|height|align|onmouseover|onmouseout|name],hr[class|width|size|noshade],font[face|size|color|style],span[class|align|style]",
+ external_link_list_url : "example_data/example_link_list.js",
+ external_image_list_url : "example_data/example_image_list.js",
+ flash_external_list_url : "example_data/example_flash_list.js"
+});
+</script>
+</head>
+<body>
+
+<div class="header">
+ <h1>Installation example 02</h1>
+</div>
+
+<div class="content">
+ <h3>Example</h3>
+ <p>Open this page with "View source" or similar to see how the configuration is made.</p>
+ <form method="post">
+ <textarea name="content" cols="85" rows="15">This is some content that will be editable with TinyMCE.</textarea>
+ </form>
+ </div>
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/installation_example_03.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/installation_example_03.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/installation_example_03.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,43 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Installation Example 02</title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-<script language="javascript" type="text/javascript" src="../jscripts/tiny_mce/tiny_mce.js"></script>
-<script language="javascript" type="text/javascript">
-tinyMCE.init({
- mode : "textareas",
- theme : "advanced",
- theme_advanced_buttons1 : "bold,italic,underline,separator,strikethrough,justifyleft,justifycenter,justifyright, justifyfull,bullist,numlist,undo,redo,link,unlink",
- theme_advanced_buttons2 : "",
- theme_advanced_buttons3 : "",
- theme_advanced_toolbar_location : "top",
- theme_advanced_toolbar_align : "left",
- theme_advanced_path_location : "bottom",
- extended_valid_elements : "a[name|href|target|title|onclick],img[class|src|border=0|alt|title|hspace|vspace|width|height|align|onmouseover|onmouseout|name],hr[class|width|size|noshade],font[face|size|color|style],span[class|align|style]"
-});
-</script>
-</head>
-<body>
-
-<div class="header">
- <h1>Installation example 02</h1>
-</div>
-
-<div class="content">
- <h3>Example</h3>
- <p>Open this page with "View source" or similar to see how the configuration is made.</p>
- <form method="post">
- <textarea name="content" cols="85" rows="15">This is some content that will be editable with TinyMCE.</textarea>
- </form>
- </div>
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/installation_example_03.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/installation_example_03.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/installation_example_03.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/installation_example_03.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,43 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Installation Example 02</title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+<script language="javascript" type="text/javascript" src="../jscripts/tiny_mce/tiny_mce.js"></script>
+<script language="javascript" type="text/javascript">
+tinyMCE.init({
+ mode : "textareas",
+ theme : "advanced",
+ theme_advanced_buttons1 : "bold,italic,underline,separator,strikethrough,justifyleft,justifycenter,justifyright, justifyfull,bullist,numlist,undo,redo,link,unlink",
+ theme_advanced_buttons2 : "",
+ theme_advanced_buttons3 : "",
+ theme_advanced_toolbar_location : "top",
+ theme_advanced_toolbar_align : "left",
+ theme_advanced_path_location : "bottom",
+ extended_valid_elements : "a[name|href|target|title|onclick],img[class|src|border=0|alt|title|hspace|vspace|width|height|align|onmouseover|onmouseout|name],hr[class|width|size|noshade],font[face|size|color|style],span[class|align|style]"
+});
+</script>
+</head>
+<body>
+
+<div class="header">
+ <h1>Installation example 02</h1>
+</div>
+
+<div class="content">
+ <h3>Example</h3>
+ <p>Open this page with "View source" or similar to see how the configuration is made.</p>
+ <form method="post">
+ <textarea name="content" cols="85" rows="15">This is some content that will be editable with TinyMCE.</textarea>
+ </form>
+ </div>
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/installing.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/installing.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/installing.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,121 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Installation instructions</title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
- <h1>Installation instructions</h1>
-</div>
-
-<div class="content">
- <p>Installing TinyMCE is very simple, follow the instructions here. We give a few examples of to integrate TinyMCE, also look at the extensive <a href="reference_configuration.html">options</a> for configuration.</p>
-
- <div class="separator"></div>
-
- <h2>Requirements</h2>
- <div class="section">
- <p>TinyMCE has no direct requirements except for <a href="compatiblity_chart.html">browser compatibility</a> and of course JavaScript needs to be turned on. There is NO backend code distributed with TinyMCE.
- </p>
- </div>
-
- <div class="separator"></div>
-
- <h2>Downloading</h2>
- <div class="section">
- <p>For download instructions check our <a href="http://tinymce.moxiecode.com">web site.</a></p>
- </div>
-
- <div class="separator"></div>
-
- <h2>Extracting the archives</h2>
- <div class="section">
- <p>On windows you could use <a href="http://www.winzip.com">WinZip</a> or something similar. And on other operating systems such as Linux you simply extract the archive with the tar command. You can find a example on how to extract the archived file on Linux below.</p>
- <p>
- You should extract TinyMCE in your wwwroot or site domain root folder
- </p>
- <h3>Extract example using a shell:</h3>
- <div class="example">
-<pre>
-$ cd wwwroot
-$ gzip -d tinymce_1_44.tar.gz
-$ tar xvf tinymce_1_44.tar
-</pre>
- </div>
- <p>
- <h3>A folder structure looking like this is created:</h3>
- <div class="example">
-<pre>
-/tinymce/
-/tinymce/docs/
-/tinymce/docs/zh_cn/
-/tinymce/examples/
-/tinymce/examples/zh_cn/
-/tinymce/jscripts/
-/tinymce/jscripts/tiny_mce/
-/tinymce/jscripts/tiny_mce/langs/
-/tinymce/jscripts/tiny_mce/plugins/
-/tinymce/jscripts/tiny_mce/plugins/<plugin folders>
-/tinymce/jscripts/tiny_mce/themes/
-/tinymce/jscripts/tiny_mce/themes/advanced/
-/tinymce/jscripts/tiny_mce/themes/default/
-/tinymce/jscripts/tiny_mce/themes/simple/
-</pre>
- </div>
- </p>
- </div>
-
- <div class="separator"></div>
-
- <h2>Making changes on your web site</h2>
- <div class="section">
- <p>Once you have extracted the archive you will need to edit the pages to include the configuration and javascript for TinyMCE. Please note that you should probably only include the TinyMCE javascript on the pages that need it, not all the pages of the web site. Remember to change the URL to the .js below to match your installation path.</p>
- <p>
- <h3>The most basic page integration (converts all textarea elements into editors):</h3>
- <div class="example">
-<pre>
-<html>
-<head>
-<title>TinyMCE Test</title>
-<strong><script language="javascript" type="text/javascript" src="../jscripts/tiny_mce/tiny_mce.js"></script>
-<script language="javascript" type="text/javascript">
-tinyMCE.init({
- mode : "textareas"
-});
-</script></strong>
-</head>
-<body>
-<form method="post">
- <textarea name="content" cols="50" rows="15">This is some content that will be editable with TinyMCE.</textarea>
-</form>
-</body>
-</html>
-</pre>
- </div>
- </p>
- <p>
- Here are a few different example of how you could integrate TinyMCE.
- </p>
- <p>
- <ul>
- <li><a href="installation_example_00.html">Example 00</a> - Simple Theme</li>
- <li><a href="installation_example_01.html">Example 01</a> - Advanced Theme</li>
- <li><a href="installation_example_02.html">Example 02</a> - Advanced Theme Full</li>
- <li><a href="installation_example_03.html">Example 03</a> - Advanced Theme Simplified</li>
- </ul>
- </p>
- <p>
- If you have any problems, you should check the forum on the <a href="http://tinymce.moxiecode.com/" target="_blank">TinyMCE web site.</a></p>
- </div>
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/installing.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/installing.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/installing.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/installing.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,121 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Installation instructions</title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+ <h1>Installation instructions</h1>
+</div>
+
+<div class="content">
+ <p>Installing TinyMCE is very simple, follow the instructions here. We give a few examples of to integrate TinyMCE, also look at the extensive <a href="reference_configuration.html">options</a> for configuration.</p>
+
+ <div class="separator"></div>
+
+ <h2>Requirements</h2>
+ <div class="section">
+ <p>TinyMCE has no direct requirements except for <a href="compatiblity_chart.html">browser compatibility</a> and of course JavaScript needs to be turned on. There is NO backend code distributed with TinyMCE.
+ </p>
+ </div>
+
+ <div class="separator"></div>
+
+ <h2>Downloading</h2>
+ <div class="section">
+ <p>For download instructions check our <a href="http://tinymce.moxiecode.com">web site.</a></p>
+ </div>
+
+ <div class="separator"></div>
+
+ <h2>Extracting the archives</h2>
+ <div class="section">
+ <p>On windows you could use <a href="http://www.winzip.com">WinZip</a> or something similar. And on other operating systems such as Linux you simply extract the archive with the tar command. You can find a example on how to extract the archived file on Linux below.</p>
+ <p>
+ You should extract TinyMCE in your wwwroot or site domain root folder
+ </p>
+ <h3>Extract example using a shell:</h3>
+ <div class="example">
+<pre>
+$ cd wwwroot
+$ gzip -d tinymce_1_44.tar.gz
+$ tar xvf tinymce_1_44.tar
+</pre>
+ </div>
+ <p>
+ <h3>A folder structure looking like this is created:</h3>
+ <div class="example">
+<pre>
+/tinymce/
+/tinymce/docs/
+/tinymce/docs/zh_cn/
+/tinymce/examples/
+/tinymce/examples/zh_cn/
+/tinymce/jscripts/
+/tinymce/jscripts/tiny_mce/
+/tinymce/jscripts/tiny_mce/langs/
+/tinymce/jscripts/tiny_mce/plugins/
+/tinymce/jscripts/tiny_mce/plugins/<plugin folders>
+/tinymce/jscripts/tiny_mce/themes/
+/tinymce/jscripts/tiny_mce/themes/advanced/
+/tinymce/jscripts/tiny_mce/themes/default/
+/tinymce/jscripts/tiny_mce/themes/simple/
+</pre>
+ </div>
+ </p>
+ </div>
+
+ <div class="separator"></div>
+
+ <h2>Making changes on your web site</h2>
+ <div class="section">
+ <p>Once you have extracted the archive you will need to edit the pages to include the configuration and javascript for TinyMCE. Please note that you should probably only include the TinyMCE javascript on the pages that need it, not all the pages of the web site. Remember to change the URL to the .js below to match your installation path.</p>
+ <p>
+ <h3>The most basic page integration (converts all textarea elements into editors):</h3>
+ <div class="example">
+<pre>
+<html>
+<head>
+<title>TinyMCE Test</title>
+<strong><script language="javascript" type="text/javascript" src="../jscripts/tiny_mce/tiny_mce.js"></script>
+<script language="javascript" type="text/javascript">
+tinyMCE.init({
+ mode : "textareas"
+});
+</script></strong>
+</head>
+<body>
+<form method="post">
+ <textarea name="content" cols="50" rows="15">This is some content that will be editable with TinyMCE.</textarea>
+</form>
+</body>
+</html>
+</pre>
+ </div>
+ </p>
+ <p>
+ Here are a few different example of how you could integrate TinyMCE.
+ </p>
+ <p>
+ <ul>
+ <li><a href="installation_example_00.html">Example 00</a> - Simple Theme</li>
+ <li><a href="installation_example_01.html">Example 01</a> - Advanced Theme</li>
+ <li><a href="installation_example_02.html">Example 02</a> - Advanced Theme Full</li>
+ <li><a href="installation_example_03.html">Example 03</a> - Advanced Theme Simplified</li>
+ </ul>
+ </p>
+ <p>
+ If you have any problems, you should check the forum on the <a href="http://tinymce.moxiecode.com/" target="_blank">TinyMCE web site.</a></p>
+ </div>
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/license.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/license.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/license.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,465 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>TinyMCE License (LGPL)</title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
- <h1>TinyMCE License (LGPL)</h1>
-</div>
-
-<div class="content">
-<p>
-Visit the <a href="faq.html">FAQ</a> for general answers surrounding TinyMCE. Or visit <a href="http://www.fsf.org" target="_blank">http://www.fsf.org</a> for more information about Open-Source licenses.
-</p>
-<pre>
- GNU LIBRARY GENERAL PUBLIC LICENSE
- Version 2, June 1991
-
- Copyright (C) 1991 Free Software Foundation, Inc.
- 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
-[This is the first released version of the library GPL. It is
- numbered 2 because it goes with version 2 of the ordinary GPL.]
-
- Preamble
-
- The licenses for most software are designed to take away your
-freedom to share and change it. By contrast, the GNU General Public
-Licenses are intended to guarantee your freedom to share and change
-free software--to make sure the software is free for all its users.
-
- This license, the Library General Public License, applies to some
-specially designated Free Software Foundation software, and to any
-other libraries whose authors decide to use it. You can use it for
-your libraries, too.
-
- When we speak of free software, we are referring to freedom, not
-price. Our General Public Licenses are designed to make sure that you
-have the freedom to distribute copies of free software (and charge for
-this service if you wish), that you receive source code or can get it
-if you want it, that you can change the software or use pieces of it
-in new free programs; and that you know you can do these things.
-
- To protect your rights, we need to make restrictions that forbid
-anyone to deny you these rights or to ask you to surrender the rights.
-These restrictions translate to certain responsibilities for you if
-you distribute copies of the library, or if you modify it.
-
- For example, if you distribute copies of the library, whether gratis
-or for a fee, you must give the recipients all the rights that we gave
-you. You must make sure that they, too, receive or can get the source
-code. If you link a program with the library, you must provide
-complete object files to the recipients so that they can relink them
-with the library, after making changes to the library and recompiling
-it. And you must show them these terms so they know their rights.
-
- Our method of protecting your rights has two steps: (1) copyright
-the library, and (2) offer you this license which gives you legal
-permission to copy, distribute and/or modify the library.
-
- Also, for each distributor's protection, we want to make certain
-that everyone understands that there is no warranty for this free
-library. If the library is modified by someone else and passed on, we
-want its recipients to know that what they have is not the original
-version, so that any problems introduced by others will not reflect on
-the original authors' reputations.
-.
- Finally, any free program is threatened constantly by software
-patents. We wish to avoid the danger that companies distributing free
-software will individually obtain patent licenses, thus in effect
-transforming the program into proprietary software. To prevent this,
-we have made it clear that any patent must be licensed for everyone's
-free use or not licensed at all.
-
- Most GNU software, including some libraries, is covered by the ordinary
-GNU General Public License, which was designed for utility programs. This
-license, the GNU Library General Public License, applies to certain
-designated libraries. This license is quite different from the ordinary
-one; be sure to read it in full, and don't assume that anything in it is
-the same as in the ordinary license.
-
- The reason we have a separate public license for some libraries is that
-they blur the distinction we usually make between modifying or adding to a
-program and simply using it. Linking a program with a library, without
-changing the library, is in some sense simply using the library, and is
-analogous to running a utility program or application program. However, in
-a textual and legal sense, the linked executable is a combined work, a
-derivative of the original library, and the ordinary General Public License
-treats it as such.
-
- Because of this blurred distinction, using the ordinary General
-Public License for libraries did not effectively promote software
-sharing, because most developers did not use the libraries. We
-concluded that weaker conditions might promote sharing better.
-
- However, unrestricted linking of non-free programs would deprive the
-users of those programs of all benefit from the free status of the
-libraries themselves. This Library General Public License is intended to
-permit developers of non-free programs to use free libraries, while
-preserving your freedom as a user of such programs to change the free
-libraries that are incorporated in them. (We have not seen how to achieve
-this as regards changes in header files, but we have achieved it as regards
-changes in the actual functions of the Library.) The hope is that this
-will lead to faster development of free libraries.
-
- The precise terms and conditions for copying, distribution and
-modification follow. Pay close attention to the difference between a
-"work based on the library" and a "work that uses the library". The
-former contains code derived from the library, while the latter only
-works together with the library.
-
- Note that it is possible for a library to be covered by the ordinary
-General Public License rather than by this special one.
-.
- GNU LIBRARY GENERAL PUBLIC LICENSE
- TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
- 0. This License Agreement applies to any software library which
-contains a notice placed by the copyright holder or other authorized
-party saying it may be distributed under the terms of this Library
-General Public License (also called "this License"). Each licensee is
-addressed as "you".
-
- A "library" means a collection of software functions and/or data
-prepared so as to be conveniently linked with application programs
-(which use some of those functions and data) to form executables.
-
- The "Library", below, refers to any such software library or work
-which has been distributed under these terms. A "work based on the
-Library" means either the Library or any derivative work under
-copyright law: that is to say, a work containing the Library or a
-portion of it, either verbatim or with modifications and/or translated
-straightforwardly into another language. (Hereinafter, translation is
-included without limitation in the term "modification".)
-
- "Source code" for a work means the preferred form of the work for
-making modifications to it. For a library, complete source code means
-all the source code for all modules it contains, plus any associated
-interface definition files, plus the scripts used to control compilation
-and installation of the library.
-
- Activities other than copying, distribution and modification are not
-covered by this License; they are outside its scope. The act of
-running a program using the Library is not restricted, and output from
-such a program is covered only if its contents constitute a work based
-on the Library (independent of the use of the Library in a tool for
-writing it). Whether that is true depends on what the Library does
-and what the program that uses the Library does.
-
- 1. You may copy and distribute verbatim copies of the Library's
-complete source code as you receive it, in any medium, provided that
-you conspicuously and appropriately publish on each copy an
-appropriate copyright notice and disclaimer of warranty; keep intact
-all the notices that refer to this License and to the absence of any
-warranty; and distribute a copy of this License along with the
-Library.
-
- You may charge a fee for the physical act of transferring a copy,
-and you may at your option offer warranty protection in exchange for a
-fee.
-.
- 2. You may modify your copy or copies of the Library or any portion
-of it, thus forming a work based on the Library, and copy and
-distribute such modifications or work under the terms of Section 1
-above, provided that you also meet all of these conditions:
-
- a) The modified work must itself be a software library.
-
- b) You must cause the files modified to carry prominent notices
- stating that you changed the files and the date of any change.
-
- c) You must cause the whole of the work to be licensed at no
- charge to all third parties under the terms of this License.
-
- d) If a facility in the modified Library refers to a function or a
- table of data to be supplied by an application program that uses
- the facility, other than as an argument passed when the facility
- is invoked, then you must make a good faith effort to ensure that,
- in the event an application does not supply such function or
- table, the facility still operates, and performs whatever part of
- its purpose remains meaningful.
-
- (For example, a function in a library to compute square roots has
- a purpose that is entirely well-defined independent of the
- application. Therefore, Subsection 2d requires that any
- application-supplied function or table used by this function must
- be optional: if the application does not supply it, the square
- root function must still compute square roots.)
-
-These requirements apply to the modified work as a whole. If
-identifiable sections of that work are not derived from the Library,
-and can be reasonably considered independent and separate works in
-themselves, then this License, and its terms, do not apply to those
-sections when you distribute them as separate works. But when you
-distribute the same sections as part of a whole which is a work based
-on the Library, the distribution of the whole must be on the terms of
-this License, whose permissions for other licensees extend to the
-entire whole, and thus to each and every part regardless of who wrote
-it.
-
-Thus, it is not the intent of this section to claim rights or contest
-your rights to work written entirely by you; rather, the intent is to
-exercise the right to control the distribution of derivative or
-collective works based on the Library.
-
-In addition, mere aggregation of another work not based on the Library
-with the Library (or with a work based on the Library) on a volume of
-a storage or distribution medium does not bring the other work under
-the scope of this License.
-
- 3. You may opt to apply the terms of the ordinary GNU General Public
-License instead of this License to a given copy of the Library. To do
-this, you must alter all the notices that refer to this License, so
-that they refer to the ordinary GNU General Public License, version 2,
-instead of to this License. (If a newer version than version 2 of the
-ordinary GNU General Public License has appeared, then you can specify
-that version instead if you wish.) Do not make any other change in
-these notices.
-.
- Once this change is made in a given copy, it is irreversible for
-that copy, so the ordinary GNU General Public License applies to all
-subsequent copies and derivative works made from that copy.
-
- This option is useful when you wish to copy part of the code of
-the Library into a program that is not a library.
-
- 4. You may copy and distribute the Library (or a portion or
-derivative of it, under Section 2) in object code or executable form
-under the terms of Sections 1 and 2 above provided that you accompany
-it with the complete corresponding machine-readable source code, which
-must be distributed under the terms of Sections 1 and 2 above on a
-medium customarily used for software interchange.
-
- If distribution of object code is made by offering access to copy
-from a designated place, then offering equivalent access to copy the
-source code from the same place satisfies the requirement to
-distribute the source code, even though third parties are not
-compelled to copy the source along with the object code.
-
- 5. A program that contains no derivative of any portion of the
-Library, but is designed to work with the Library by being compiled or
-linked with it, is called a "work that uses the Library". Such a
-work, in isolation, is not a derivative work of the Library, and
-therefore falls outside the scope of this License.
-
- However, linking a "work that uses the Library" with the Library
-creates an executable that is a derivative of the Library (because it
-contains portions of the Library), rather than a "work that uses the
-library". The executable is therefore covered by this License.
-Section 6 states terms for distribution of such executables.
-
- When a "work that uses the Library" uses material from a header file
-that is part of the Library, the object code for the work may be a
-derivative work of the Library even though the source code is not.
-Whether this is true is especially significant if the work can be
-linked without the Library, or if the work is itself a library. The
-threshold for this to be true is not precisely defined by law.
-
- If such an object file uses only numerical parameters, data
-structure layouts and accessors, and small macros and small inline
-functions (ten lines or less in length), then the use of the object
-file is unrestricted, regardless of whether it is legally a derivative
-work. (Executables containing this object code plus portions of the
-Library will still fall under Section 6.)
-
- Otherwise, if the work is a derivative of the Library, you may
-distribute the object code for the work under the terms of Section 6.
-Any executables containing that work also fall under Section 6,
-whether or not they are linked directly with the Library itself.
-.
- 6. As an exception to the Sections above, you may also compile or
-link a "work that uses the Library" with the Library to produce a
-work containing portions of the Library, and distribute that work
-under terms of your choice, provided that the terms permit
-modification of the work for the customer's own use and reverse
-engineering for debugging such modifications.
-
- You must give prominent notice with each copy of the work that the
-Library is used in it and that the Library and its use are covered by
-this License. You must supply a copy of this License. If the work
-during execution displays copyright notices, you must include the
-copyright notice for the Library among them, as well as a reference
-directing the user to the copy of this License. Also, you must do one
-of these things:
-
- a) Accompany the work with the complete corresponding
- machine-readable source code for the Library including whatever
- changes were used in the work (which must be distributed under
- Sections 1 and 2 above); and, if the work is an executable linked
- with the Library, with the complete machine-readable "work that
- uses the Library", as object code and/or source code, so that the
- user can modify the Library and then relink to produce a modified
- executable containing the modified Library. (It is understood
- that the user who changes the contents of definitions files in the
- Library will not necessarily be able to recompile the application
- to use the modified definitions.)
-
- b) Accompany the work with a written offer, valid for at
- least three years, to give the same user the materials
- specified in Subsection 6a, above, for a charge no more
- than the cost of performing this distribution.
-
- c) If distribution of the work is made by offering access to copy
- from a designated place, offer equivalent access to copy the above
- specified materials from the same place.
-
- d) Verify that the user has already received a copy of these
- materials or that you have already sent this user a copy.
-
- For an executable, the required form of the "work that uses the
-Library" must include any data and utility programs needed for
-reproducing the executable from it. However, as a special exception,
-the source code distributed need not include anything that is normally
-distributed (in either source or binary form) with the major
-components (compiler, kernel, and so on) of the operating system on
-which the executable runs, unless that component itself accompanies
-the executable.
-
- It may happen that this requirement contradicts the license
-restrictions of other proprietary libraries that do not normally
-accompany the operating system. Such a contradiction means you cannot
-use both them and the Library together in an executable that you
-distribute.
-.
- 7. You may place library facilities that are a work based on the
-Library side-by-side in a single library together with other library
-facilities not covered by this License, and distribute such a combined
-library, provided that the separate distribution of the work based on
-the Library and of the other library facilities is otherwise
-permitted, and provided that you do these two things:
-
- a) Accompany the combined library with a copy of the same work
- based on the Library, uncombined with any other library
- facilities. This must be distributed under the terms of the
- Sections above.
-
- b) Give prominent notice with the combined library of the fact
- that part of it is a work based on the Library, and explaining
- where to find the accompanying uncombined form of the same work.
-
- 8. You may not copy, modify, sublicense, link with, or distribute
-the Library except as expressly provided under this License. Any
-attempt otherwise to copy, modify, sublicense, link with, or
-distribute the Library is void, and will automatically terminate your
-rights under this License. However, parties who have received copies,
-or rights, from you under this License will not have their licenses
-terminated so long as such parties remain in full compliance.
-
- 9. You are not required to accept this License, since you have not
-signed it. However, nothing else grants you permission to modify or
-distribute the Library or its derivative works. These actions are
-prohibited by law if you do not accept this License. Therefore, by
-modifying or distributing the Library (or any work based on the
-Library), you indicate your acceptance of this License to do so, and
-all its terms and conditions for copying, distributing or modifying
-the Library or works based on it.
-
- 10. Each time you redistribute the Library (or any work based on the
-Library), the recipient automatically receives a license from the
-original licensor to copy, distribute, link with or modify the Library
-subject to these terms and conditions. You may not impose any further
-restrictions on the recipients' exercise of the rights granted herein.
-You are not responsible for enforcing compliance by third parties to
-this License.
-.
- 11. If, as a consequence of a court judgment or allegation of patent
-infringement or for any other reason (not limited to patent issues),
-conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License. If you cannot
-distribute so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you
-may not distribute the Library at all. For example, if a patent
-license would not permit royalty-free redistribution of the Library by
-all those who receive copies directly or indirectly through you, then
-the only way you could satisfy both it and this License would be to
-refrain entirely from distribution of the Library.
-
-If any portion of this section is held invalid or unenforceable under any
-particular circumstance, the balance of the section is intended to apply,
-and the section as a whole is intended to apply in other circumstances.
-
-It is not the purpose of this section to induce you to infringe any
-patents or other property right claims or to contest validity of any
-such claims; this section has the sole purpose of protecting the
-integrity of the free software distribution system which is
-implemented by public license practices. Many people have made
-generous contributions to the wide range of software distributed
-through that system in reliance on consistent application of that
-system; it is up to the author/donor to decide if he or she is willing
-to distribute software through any other system and a licensee cannot
-impose that choice.
-
-This section is intended to make thoroughly clear what is believed to
-be a consequence of the rest of this License.
-
- 12. If the distribution and/or use of the Library is restricted in
-certain countries either by patents or by copyrighted interfaces, the
-original copyright holder who places the Library under this License may add
-an explicit geographical distribution limitation excluding those countries,
-so that distribution is permitted only in or among countries not thus
-excluded. In such case, this License incorporates the limitation as if
-written in the body of this License.
-
- 13. The Free Software Foundation may publish revised and/or new
-versions of the Library General Public License from time to time.
-Such new versions will be similar in spirit to the present version,
-but may differ in detail to address new problems or concerns.
-
-Each version is given a distinguishing version number. If the Library
-specifies a version number of this License which applies to it and
-"any later version", you have the option of following the terms and
-conditions either of that version or of any later version published by
-the Free Software Foundation. If the Library does not specify a
-license version number, you may choose any version ever published by
-the Free Software Foundation.
-.
- 14. If you wish to incorporate parts of the Library into other free
-programs whose distribution conditions are incompatible with these,
-write to the author to ask for permission. For software which is
-copyrighted by the Free Software Foundation, write to the Free
-Software Foundation; we sometimes make exceptions for this. Our
-decision will be guided by the two goals of preserving the free status
-of all derivatives of our free software and of promoting the sharing
-and reuse of software generally.
-
- NO WARRANTY
-
- 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
-WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
-EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
-OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
-KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
-LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
-THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
-
- 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
-WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
-AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
-FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
-CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
-LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
-RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
-FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
-SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
-DAMAGES.
-
- END OF TERMS AND CONDITIONS
-</pre>
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/license.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/license.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/license.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/license.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,465 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>TinyMCE License (LGPL)</title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+ <h1>TinyMCE License (LGPL)</h1>
+</div>
+
+<div class="content">
+<p>
+Visit the <a href="faq.html">FAQ</a> for general answers surrounding TinyMCE. Or visit <a href="http://www.fsf.org" target="_blank">http://www.fsf.org</a> for more information about Open-Source licenses.
+</p>
+<pre>
+ GNU LIBRARY GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1991 Free Software Foundation, Inc.
+ 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+[This is the first released version of the library GPL. It is
+ numbered 2 because it goes with version 2 of the ordinary GPL.]
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+ This license, the Library General Public License, applies to some
+specially designated Free Software Foundation software, and to any
+other libraries whose authors decide to use it. You can use it for
+your libraries, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if
+you distribute copies of the library, or if you modify it.
+
+ For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you. You must make sure that they, too, receive or can get the source
+code. If you link a program with the library, you must provide
+complete object files to the recipients so that they can relink them
+with the library, after making changes to the library and recompiling
+it. And you must show them these terms so they know their rights.
+
+ Our method of protecting your rights has two steps: (1) copyright
+the library, and (2) offer you this license which gives you legal
+permission to copy, distribute and/or modify the library.
+
+ Also, for each distributor's protection, we want to make certain
+that everyone understands that there is no warranty for this free
+library. If the library is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original
+version, so that any problems introduced by others will not reflect on
+the original authors' reputations.
+.
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that companies distributing free
+software will individually obtain patent licenses, thus in effect
+transforming the program into proprietary software. To prevent this,
+we have made it clear that any patent must be licensed for everyone's
+free use or not licensed at all.
+
+ Most GNU software, including some libraries, is covered by the ordinary
+GNU General Public License, which was designed for utility programs. This
+license, the GNU Library General Public License, applies to certain
+designated libraries. This license is quite different from the ordinary
+one; be sure to read it in full, and don't assume that anything in it is
+the same as in the ordinary license.
+
+ The reason we have a separate public license for some libraries is that
+they blur the distinction we usually make between modifying or adding to a
+program and simply using it. Linking a program with a library, without
+changing the library, is in some sense simply using the library, and is
+analogous to running a utility program or application program. However, in
+a textual and legal sense, the linked executable is a combined work, a
+derivative of the original library, and the ordinary General Public License
+treats it as such.
+
+ Because of this blurred distinction, using the ordinary General
+Public License for libraries did not effectively promote software
+sharing, because most developers did not use the libraries. We
+concluded that weaker conditions might promote sharing better.
+
+ However, unrestricted linking of non-free programs would deprive the
+users of those programs of all benefit from the free status of the
+libraries themselves. This Library General Public License is intended to
+permit developers of non-free programs to use free libraries, while
+preserving your freedom as a user of such programs to change the free
+libraries that are incorporated in them. (We have not seen how to achieve
+this as regards changes in header files, but we have achieved it as regards
+changes in the actual functions of the Library.) The hope is that this
+will lead to faster development of free libraries.
+
+ The precise terms and conditions for copying, distribution and
+modification follow. Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library". The
+former contains code derived from the library, while the latter only
+works together with the library.
+
+ Note that it is possible for a library to be covered by the ordinary
+General Public License rather than by this special one.
+.
+ GNU LIBRARY GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License Agreement applies to any software library which
+contains a notice placed by the copyright holder or other authorized
+party saying it may be distributed under the terms of this Library
+General Public License (also called "this License"). Each licensee is
+addressed as "you".
+
+ A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+ The "Library", below, refers to any such software library or work
+which has been distributed under these terms. A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language. (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+ "Source code" for a work means the preferred form of the work for
+making modifications to it. For a library, complete source code means
+all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control compilation
+and installation of the library.
+
+ Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it). Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+
+ 1. You may copy and distribute verbatim copies of the Library's
+complete source code as you receive it, in any medium, provided that
+you conspicuously and appropriately publish on each copy an
+appropriate copyright notice and disclaimer of warranty; keep intact
+all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the
+Library.
+
+ You may charge a fee for the physical act of transferring a copy,
+and you may at your option offer warranty protection in exchange for a
+fee.
+.
+ 2. You may modify your copy or copies of the Library or any portion
+of it, thus forming a work based on the Library, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) The modified work must itself be a software library.
+
+ b) You must cause the files modified to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ c) You must cause the whole of the work to be licensed at no
+ charge to all third parties under the terms of this License.
+
+ d) If a facility in the modified Library refers to a function or a
+ table of data to be supplied by an application program that uses
+ the facility, other than as an argument passed when the facility
+ is invoked, then you must make a good faith effort to ensure that,
+ in the event an application does not supply such function or
+ table, the facility still operates, and performs whatever part of
+ its purpose remains meaningful.
+
+ (For example, a function in a library to compute square roots has
+ a purpose that is entirely well-defined independent of the
+ application. Therefore, Subsection 2d requires that any
+ application-supplied function or table used by this function must
+ be optional: if the application does not supply it, the square
+ root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Library,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Library, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library. To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License. (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.) Do not make any other change in
+these notices.
+.
+ Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+ This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+ 4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you accompany
+it with the complete corresponding machine-readable source code, which
+must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange.
+
+ If distribution of object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the
+source code from the same place satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library". Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+ However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library". The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+ When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library. The
+threshold for this to be true is not precisely defined by law.
+
+ If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work. (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+ Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+.
+ 6. As an exception to the Sections above, you may also compile or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+ You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License. You must supply a copy of this License. If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License. Also, you must do one
+of these things:
+
+ a) Accompany the work with the complete corresponding
+ machine-readable source code for the Library including whatever
+ changes were used in the work (which must be distributed under
+ Sections 1 and 2 above); and, if the work is an executable linked
+ with the Library, with the complete machine-readable "work that
+ uses the Library", as object code and/or source code, so that the
+ user can modify the Library and then relink to produce a modified
+ executable containing the modified Library. (It is understood
+ that the user who changes the contents of definitions files in the
+ Library will not necessarily be able to recompile the application
+ to use the modified definitions.)
+
+ b) Accompany the work with a written offer, valid for at
+ least three years, to give the same user the materials
+ specified in Subsection 6a, above, for a charge no more
+ than the cost of performing this distribution.
+
+ c) If distribution of the work is made by offering access to copy
+ from a designated place, offer equivalent access to copy the above
+ specified materials from the same place.
+
+ d) Verify that the user has already received a copy of these
+ materials or that you have already sent this user a copy.
+
+ For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it. However, as a special exception,
+the source code distributed need not include anything that is normally
+distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies
+the executable.
+
+ It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system. Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+.
+ 7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+ a) Accompany the combined library with a copy of the same work
+ based on the Library, uncombined with any other library
+ facilities. This must be distributed under the terms of the
+ Sections above.
+
+ b) Give prominent notice with the combined library of the fact
+ that part of it is a work based on the Library, and explaining
+ where to find the accompanying uncombined form of the same work.
+
+ 8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License. Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library is void, and will automatically terminate your
+rights under this License. However, parties who have received copies,
+or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+ 9. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Library or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+ 10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+subject to these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+.
+ 11. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Library at all. For example, if a patent
+license would not permit royalty-free redistribution of the Library by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply,
+and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library under this License may add
+an explicit geographical distribution limitation excluding those countries,
+so that distribution is permitted only in or among countries not thus
+excluded. In such case, this License incorporates the limitation as if
+written in the body of this License.
+
+ 13. The Free Software Foundation may publish revised and/or new
+versions of the Library General Public License from time to time.
+Such new versions will be similar in spirit to the present version,
+but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Library
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation. If the Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+.
+ 14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+write to the author to ask for permission. For software which is
+copyrighted by the Free Software Foundation, write to the Free
+Software Foundation; we sometimes make exceptions for this. Our
+decision will be guided by the two goals of preserving the free status
+of all derivatives of our free software and of promoting the sharing
+and reuse of software generally.
+
+ NO WARRANTY
+
+ 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+</pre>
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/option_accessibility_focus.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/option_accessibility_focus.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/option_accessibility_focus.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,38 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Option: accessibility_focus</title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
- <h1>Option: accessibility_focus</h1>
-</div>
-
-<div class="content">
- <p>
- If this option is set to true some accessibility focus will available to all buttons, you will be able to tab through them all. If you set this option to false, focus will be placed inside the text area when you tab through the interface.
- </p>
-
- <div class="separator"></div>
-
- <h3>Example of usage of the accessibility_focus option:</h3>
- <div class="example">
-<pre>
-tinyMCE.init({
- ...
- <strong>accessibility_focus : false</strong>
-});
-</pre>
- </div>
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/option_accessibility_focus.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/option_accessibility_focus.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/option_accessibility_focus.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/option_accessibility_focus.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,38 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Option: accessibility_focus</title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+ <h1>Option: accessibility_focus</h1>
+</div>
+
+<div class="content">
+ <p>
+ If this option is set to true some accessibility focus will available to all buttons, you will be able to tab through them all. If you set this option to false, focus will be placed inside the text area when you tab through the interface.
+ </p>
+
+ <div class="separator"></div>
+
+ <h3>Example of usage of the accessibility_focus option:</h3>
+ <div class="example">
+<pre>
+tinyMCE.init({
+ ...
+ <strong>accessibility_focus : false</strong>
+});
+</pre>
+ </div>
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/option_accessibility_warnings.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/option_accessibility_warnings.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/option_accessibility_warnings.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,38 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Option: accessibility_warnings</title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
- <h1>Option: accessibility_warnings</h1>
-</div>
-
-<div class="content">
- <p>
- If this option is set to true some accessibility warnings will be presented to the user if they miss specifying that information. This option is set to true default, since we should all try to make this world a better place for disabled people. But if you are annoyed with the warnings, set this option to false.
- </p>
-
- <div class="separator"></div>
-
- <h3>Example of usage of the accessibility_warnings option:</h3>
- <div class="example">
-<pre>
-tinyMCE.init({
- ...
- <strong>accessibility_warnings : false</strong>
-});
-</pre>
- </div>
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/option_accessibility_warnings.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/option_accessibility_warnings.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/option_accessibility_warnings.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/option_accessibility_warnings.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,38 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Option: accessibility_warnings</title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+ <h1>Option: accessibility_warnings</h1>
+</div>
+
+<div class="content">
+ <p>
+ If this option is set to true some accessibility warnings will be presented to the user if they miss specifying that information. This option is set to true default, since we should all try to make this world a better place for disabled people. But if you are annoyed with the warnings, set this option to false.
+ </p>
+
+ <div class="separator"></div>
+
+ <h3>Example of usage of the accessibility_warnings option:</h3>
+ <div class="example">
+<pre>
+tinyMCE.init({
+ ...
+ <strong>accessibility_warnings : false</strong>
+});
+</pre>
+ </div>
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/option_add_form_submit_trigger.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/option_add_form_submit_trigger.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/option_add_form_submit_trigger.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,38 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Option: add_form_submit_trigger</title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
- <h1>Option: add_form_submit_trigger</h1>
-</div>
-
-<div class="content">
- <p>
- This option enables you to turn on/off the onsubmit event listener. This feature adds a onsubmit event listener on all forms on the page, if a form is submitted a tinyMCE.triggerSave() JavaScript calls gets executed, this function moves HTML content from the editor iframe and to the hidden form element. This option is set to true by default.
- </p>
-
- <div class="separator"></div>
-
- <h3>Example of usage of the add_form_submit_trigger option:</h3>
- <div class="example">
-<pre>
-tinyMCE.init({
- ...
- <strong>add_form_submit_trigger : false</strong>
-});
-</pre>
- </div>
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/option_add_form_submit_trigger.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/option_add_form_submit_trigger.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/option_add_form_submit_trigger.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/option_add_form_submit_trigger.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,38 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Option: add_form_submit_trigger</title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+ <h1>Option: add_form_submit_trigger</h1>
+</div>
+
+<div class="content">
+ <p>
+ This option enables you to turn on/off the onsubmit event listener. This feature adds a onsubmit event listener on all forms on the page, if a form is submitted a tinyMCE.triggerSave() JavaScript calls gets executed, this function moves HTML content from the editor iframe and to the hidden form element. This option is set to true by default.
+ </p>
+
+ <div class="separator"></div>
+
+ <h3>Example of usage of the add_form_submit_trigger option:</h3>
+ <div class="example">
+<pre>
+tinyMCE.init({
+ ...
+ <strong>add_form_submit_trigger : false</strong>
+});
+</pre>
+ </div>
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/option_add_unload_trigger.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/option_add_unload_trigger.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/option_add_unload_trigger.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,38 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Option: add_unload_trigger</title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
- <h1>Option: add_unload_trigger</h1>
-</div>
-
-<div class="content">
- <p>
- If you set this option to true, page contents will be stored away is the page is unloaded for example is the user navigates away from the page and then navigated back to it by pressing the back button. This option is set to true by default.
- </p>
-
- <div class="separator"></div>
-
- <h3>Example of usage of the add_unload_trigger option:</h3>
- <div class="example">
-<pre>
-tinyMCE.init({
- ...
- <strong>add_unload_trigger : false</strong>
-});
-</pre>
- </div>
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/option_add_unload_trigger.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/option_add_unload_trigger.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/option_add_unload_trigger.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/option_add_unload_trigger.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,38 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Option: add_unload_trigger</title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+ <h1>Option: add_unload_trigger</h1>
+</div>
+
+<div class="content">
+ <p>
+ If you set this option to true, page contents will be stored away is the page is unloaded for example is the user navigates away from the page and then navigated back to it by pressing the back button. This option is set to true by default.
+ </p>
+
+ <div class="separator"></div>
+
+ <h3>Example of usage of the add_unload_trigger option:</h3>
+ <div class="example">
+<pre>
+tinyMCE.init({
+ ...
+ <strong>add_unload_trigger : false</strong>
+});
+</pre>
+ </div>
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/option_apply_source_formatting.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/option_apply_source_formatting.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/option_apply_source_formatting.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,38 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Option: apply_source_formatting</title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
- <h1>Option: apply_source_formatting</h1>
-</div>
-
-<div class="content">
- <p>
- This option enables you to tell TinyMCE to apply some source formatting to the output HTML code. This function is disabled by default.
- </p>
-
- <div class="separator"></div>
-
- <h3>Example of usage of the apply_source_formatting option:</h3>
- <div class="example">
-<pre>
-tinyMCE.init({
- ...
- <strong>apply_source_formatting : true</strong>
-});
-</pre>
- </div>
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/option_apply_source_formatting.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/option_apply_source_formatting.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/option_apply_source_formatting.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/option_apply_source_formatting.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,38 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Option: apply_source_formatting</title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+ <h1>Option: apply_source_formatting</h1>
+</div>
+
+<div class="content">
+ <p>
+ This option enables you to tell TinyMCE to apply some source formatting to the output HTML code. This function is disabled by default.
+ </p>
+
+ <div class="separator"></div>
+
+ <h3>Example of usage of the apply_source_formatting option:</h3>
+ <div class="example">
+<pre>
+tinyMCE.init({
+ ...
+ <strong>apply_source_formatting : true</strong>
+});
+</pre>
+ </div>
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/option_ask.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/option_ask.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/option_ask.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,38 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Option: ask</title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
- <h1>Option: ask</h1>
-</div>
-
-<div class="content">
- <p>
- This option enables you to add a confirmation dialog when focusing textareas. This dialog asks if the focused textarea should be converted into a editor instance or not. It will only ask once since it would get annoying otherwice. The default value of this option is "false".
- </p>
-
- <div class="separator"></div>
-
- <h3>Example of usage of the ask option:</h3>
- <div class="example">
-<pre>
-tinyMCE.init({
- ...
- <strong>ask : true</strong>
-});
-</pre>
- </div>
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/option_ask.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/option_ask.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/option_ask.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/option_ask.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,38 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Option: ask</title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+ <h1>Option: ask</h1>
+</div>
+
+<div class="content">
+ <p>
+ This option enables you to add a confirmation dialog when focusing textareas. This dialog asks if the focused textarea should be converted into a editor instance or not. It will only ask once since it would get annoying otherwice. The default value of this option is "false".
+ </p>
+
+ <div class="separator"></div>
+
+ <h3>Example of usage of the ask option:</h3>
+ <div class="example">
+<pre>
+tinyMCE.init({
+ ...
+ <strong>ask : true</strong>
+});
+</pre>
+ </div>
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/option_auto_focus.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/option_auto_focus.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/option_auto_focus.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,38 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Option: auto_focus</title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
- <h1>Option: auto_focus</h1>
-</div>
-
-<div class="content">
- <p>
- This option enables you to auto focus a editor instance. The value of this option should be a editor instance id. Editor instance ids are specified as "mce_editor_<index>" where index is a value starting from 0. So if there are 3 editor instances on a page these would have the following ids mce_editor_0, mce_editor_1 and mce_editor_2.
- </p>
-
- <div class="separator"></div>
-
- <h3>Example of usage of the auto_focus option:</h3>
- <div class="example">
-<pre>
-tinyMCE.init({
- ...
- <strong>auto_focus : "mce_editor_2"</strong>
-});
-</pre>
- </div>
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/option_auto_focus.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/option_auto_focus.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/option_auto_focus.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/option_auto_focus.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,38 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Option: auto_focus</title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+ <h1>Option: auto_focus</h1>
+</div>
+
+<div class="content">
+ <p>
+ This option enables you to auto focus a editor instance. The value of this option should be a editor instance id. Editor instance ids are specified as "mce_editor_<index>" where index is a value starting from 0. So if there are 3 editor instances on a page these would have the following ids mce_editor_0, mce_editor_1 and mce_editor_2.
+ </p>
+
+ <div class="separator"></div>
+
+ <h3>Example of usage of the auto_focus option:</h3>
+ <div class="example">
+<pre>
+tinyMCE.init({
+ ...
+ <strong>auto_focus : "mce_editor_2"</strong>
+});
+</pre>
+ </div>
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/option_auto_reset_designmode.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/option_auto_reset_designmode.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/option_auto_reset_designmode.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,38 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Option: auto_reset_designmode</title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
- <h1>Option: auto_reset_designmode</h1>
-</div>
-
-<div class="content">
- <p>
- This option is very useful if TinyMCE is used in a DHTML tab system or other divs that are hidden and displayed by some JavaScript. Since Mozilla has a bug when using display:none, the designMode state gets lost. To prevent this from happening you should enable this option. The default value of this option is "true".
- </p>
-
- <div class="separator"></div>
-
- <h3>Example of usage of the auto_reset_designmode option:</h3>
- <div class="example">
-<pre>
-tinyMCE.init({
- ...
- <strong>auto_reset_designmode : true</strong>
-});
-</pre>
- </div>
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/option_auto_reset_designmode.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/option_auto_reset_designmode.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/option_auto_reset_designmode.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/option_auto_reset_designmode.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,38 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Option: auto_reset_designmode</title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+ <h1>Option: auto_reset_designmode</h1>
+</div>
+
+<div class="content">
+ <p>
+ This option is very useful if TinyMCE is used in a DHTML tab system or other divs that are hidden and displayed by some JavaScript. Since Mozilla has a bug when using display:none, the designMode state gets lost. To prevent this from happening you should enable this option. The default value of this option is "true".
+ </p>
+
+ <div class="separator"></div>
+
+ <h3>Example of usage of the auto_reset_designmode option:</h3>
+ <div class="example">
+<pre>
+tinyMCE.init({
+ ...
+ <strong>auto_reset_designmode : true</strong>
+});
+</pre>
+ </div>
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/option_auto_resize.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/option_auto_resize.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/option_auto_resize.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,38 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Option: auto_resize</title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
- <h1>Option: auto_resize</h1>
-</div>
-
-<div class="content">
- <p>
- This option enables you to get the TinyMCE editor area to resize to the bounderies of the contents. This option is very experimental and is set to false by default.
- </p>
-
- <div class="separator"></div>
-
- <h3>Example of usage of the auto_resize option:</h3>
- <div class="example">
-<pre>
-tinyMCE.init({
- ...
- <strong>auto_resize : true</strong>
-});
-</pre>
- </div>
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/option_auto_resize.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/option_auto_resize.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/option_auto_resize.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/option_auto_resize.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,38 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Option: auto_resize</title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+ <h1>Option: auto_resize</h1>
+</div>
+
+<div class="content">
+ <p>
+ This option enables you to get the TinyMCE editor area to resize to the bounderies of the contents. This option is very experimental and is set to false by default.
+ </p>
+
+ <div class="separator"></div>
+
+ <h3>Example of usage of the auto_resize option:</h3>
+ <div class="example">
+<pre>
+tinyMCE.init({
+ ...
+ <strong>auto_resize : true</strong>
+});
+</pre>
+ </div>
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/option_browsers.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/option_browsers.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/option_browsers.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,38 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Option: browsers</title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
- <h1>Option: browsers</h1>
-</div>
-
-<div class="content">
- <p>
- This option should contain a comma separated list of supported browsers. This enables you to for example disable the editor while running on Safari. The default value of this option is: msie,gecko,safari,opera and since the support for Safari is very limited a warning message will appear until a better version is released. The possible values of this option is msie, gecko and safari.
- </p>
-
- <div class="separator"></div>
-
- <h3>Example of usage of the browsers option:</h3>
- <div class="example">
-<pre>
-tinyMCE.init({
- ...
- <strong>browsers : "msie,gecko,opera"</strong>
-});
-</pre>
- </div>
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/option_browsers.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/option_browsers.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/option_browsers.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/option_browsers.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,38 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Option: browsers</title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+ <h1>Option: browsers</h1>
+</div>
+
+<div class="content">
+ <p>
+ This option should contain a comma separated list of supported browsers. This enables you to for example disable the editor while running on Safari. The default value of this option is: msie,gecko,safari,opera and since the support for Safari is very limited a warning message will appear until a better version is released. The possible values of this option is msie, gecko and safari.
+ </p>
+
+ <div class="separator"></div>
+
+ <h3>Example of usage of the browsers option:</h3>
+ <div class="example">
+<pre>
+tinyMCE.init({
+ ...
+ <strong>browsers : "msie,gecko,opera"</strong>
+});
+</pre>
+ </div>
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/option_button_tile_map.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/option_button_tile_map.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/option_button_tile_map.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,38 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Option: button_tile_map</title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
- <h1>Option: button_tile_map</h1>
-</div>
-
-<div class="content">
- <p>
- If this option is set to true TinyMCE will use tiled images instead of individual images for most of the editor controls. This produces faster loading time since only one GIF image needs to be loaded instead of a GIF for each individual button. This option is set to false by default since it doesn't work with some DOCTYPE declarations.
- </p>
-
- <div class="separator"></div>
-
- <h3>Example of usage of the button_tile_map option:</h3>
- <div class="example">
-<pre>
-tinyMCE.init({
- ...
- <strong>button_tile_map : true</strong>
-});
-</pre>
- </div>
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/option_button_tile_map.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/option_button_tile_map.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/option_button_tile_map.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/option_button_tile_map.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,38 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Option: button_tile_map</title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+ <h1>Option: button_tile_map</h1>
+</div>
+
+<div class="content">
+ <p>
+ If this option is set to true TinyMCE will use tiled images instead of individual images for most of the editor controls. This produces faster loading time since only one GIF image needs to be loaded instead of a GIF for each individual button. This option is set to false by default since it doesn't work with some DOCTYPE declarations.
+ </p>
+
+ <div class="separator"></div>
+
+ <h3>Example of usage of the button_tile_map option:</h3>
+ <div class="example">
+<pre>
+tinyMCE.init({
+ ...
+ <strong>button_tile_map : true</strong>
+});
+</pre>
+ </div>
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/option_cleanup.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/option_cleanup.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/option_cleanup.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,38 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Option: cleanup</title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
- <h1>Option: cleanup</h1>
-</div>
-
-<div class="content">
- <p>
- This option enables you to turn on/off the built in cleanup functionality. TinyMCE is equipped with powerful cleanup functionality that enables you to specify what elements and attributes are allowed and how HTML contents should be generated. This option is set to true by default, but if you want to disable it you may set it to false. <strong>Notice: It's not recommended to disable this feature.</strong>
- </p>
-
- <div class="separator"></div>
-
- <h3>Example of usage of the cleanup option:</h3>
- <div class="example">
-<pre>
-tinyMCE.init({
- ...
- <strong>cleanup : true</strong>
-});
-</pre>
- </div>
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/option_cleanup.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/option_cleanup.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/option_cleanup.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/option_cleanup.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,38 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Option: cleanup</title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+ <h1>Option: cleanup</h1>
+</div>
+
+<div class="content">
+ <p>
+ This option enables you to turn on/off the built in cleanup functionality. TinyMCE is equipped with powerful cleanup functionality that enables you to specify what elements and attributes are allowed and how HTML contents should be generated. This option is set to true by default, but if you want to disable it you may set it to false. <strong>Notice: It's not recommended to disable this feature.</strong>
+ </p>
+
+ <div class="separator"></div>
+
+ <h3>Example of usage of the cleanup option:</h3>
+ <div class="example">
+<pre>
+tinyMCE.init({
+ ...
+ <strong>cleanup : true</strong>
+});
+</pre>
+ </div>
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/option_cleanup_callback.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/option_cleanup_callback.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/option_cleanup_callback.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,72 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Option: cleanup_callback</title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
- <h1>Option: cleanup_callback</h1>
-</div>
-
-<div class="content">
- <p>
- This option enables you to add custom cleanup logic to TinyMCE. This function is called when the cleanup process is executed this process occures when the editor saves/submits content, user hits the cleanup button and when the HTML editor dialog is presented. The format of this function is: customCleanup(type, value). Where type can be "get_from_editor" when the contents is extracted from TinyMCE for example when the user submits the form. The "insert_to_editor" type value gets passed when new contents is inserted into the editor on initialization or when the HTML editor dialog commits new content. The "get_from_editor_dom" value is executed when cleanup process has a valid DOM tree and is extracted from the editor. The "insert_to_editor_dom" gets passed when the editor has a valid DOM tree and contents has been inserted into the editor. The example below illustrated all these types.
- </p>
-
- <div class="separator"></div>
-
- <h3>Example of usage of the cleanup_callback option:</h3>
- <div class="example">
-<pre>
-function <strong>myCustomCleanup</strong>(type, value) {
- switch (type) {
- case "get_from_editor":
- alert("Value HTML string: " + value);
-
- // Do custom cleanup code here
-
- break;
-
- case "insert_to_editor":
- alert("Value HTML string: " + value);
-
- // Do custom cleanup code here
-
- break;
-
- case "get_from_editor_dom":
- alert("Value DOM Element " + value);
-
- // Do custom cleanup code here
-
- break;
-
- case "insert_to_editor_dom":
- alert("Value DOM Element: " + value);
-
- // Do custom cleanup code here
-
- break;
- }
-
- return value;
-}
-
-tinyMCE.init({
- ...
- <strong>cleanup_callback : "myCustomCleanup"</strong>
-});
-</pre>
- </div>
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/option_cleanup_callback.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/option_cleanup_callback.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/option_cleanup_callback.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/option_cleanup_callback.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,72 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Option: cleanup_callback</title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+ <h1>Option: cleanup_callback</h1>
+</div>
+
+<div class="content">
+ <p>
+ This option enables you to add custom cleanup logic to TinyMCE. This function is called when the cleanup process is executed this process occures when the editor saves/submits content, user hits the cleanup button and when the HTML editor dialog is presented. The format of this function is: customCleanup(type, value). Where type can be "get_from_editor" when the contents is extracted from TinyMCE for example when the user submits the form. The "insert_to_editor" type value gets passed when new contents is inserted into the editor on initialization or when the HTML editor dialog commits new content. The "get_from_editor_dom" value is executed when cleanup process has a valid DOM tree and is extracted from the editor. The "insert_to_editor_dom" gets passed when the editor has a valid DOM tree and contents has been inserted into the editor. The example below illustrated all these types.
+ </p>
+
+ <div class="separator"></div>
+
+ <h3>Example of usage of the cleanup_callback option:</h3>
+ <div class="example">
+<pre>
+function <strong>myCustomCleanup</strong>(type, value) {
+ switch (type) {
+ case "get_from_editor":
+ alert("Value HTML string: " + value);
+
+ // Do custom cleanup code here
+
+ break;
+
+ case "insert_to_editor":
+ alert("Value HTML string: " + value);
+
+ // Do custom cleanup code here
+
+ break;
+
+ case "get_from_editor_dom":
+ alert("Value DOM Element " + value);
+
+ // Do custom cleanup code here
+
+ break;
+
+ case "insert_to_editor_dom":
+ alert("Value DOM Element: " + value);
+
+ // Do custom cleanup code here
+
+ break;
+ }
+
+ return value;
+}
+
+tinyMCE.init({
+ ...
+ <strong>cleanup_callback : "myCustomCleanup"</strong>
+});
+</pre>
+ </div>
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/option_cleanup_on_startup.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/option_cleanup_on_startup.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/option_cleanup_on_startup.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,38 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Option: cleanup_on_startup</title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
- <h1>Option: cleanup_on_startup</h1>
-</div>
-
-<div class="content">
- <p>
- If you set this option to true, TinyMCE will perform a HTML cleanup call when the editor loads. This option is set to false by default.
- </p>
-
- <div class="separator"></div>
-
- <h3>Example of usage of the cleanup_on_startup option:</h3>
- <div class="example">
-<pre>
-tinyMCE.init({
- ...
- <strong>cleanup_on_startup : true</strong>
-});
-</pre>
- </div>
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/option_cleanup_on_startup.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/option_cleanup_on_startup.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/option_cleanup_on_startup.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/option_cleanup_on_startup.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,38 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Option: cleanup_on_startup</title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+ <h1>Option: cleanup_on_startup</h1>
+</div>
+
+<div class="content">
+ <p>
+ If you set this option to true, TinyMCE will perform a HTML cleanup call when the editor loads. This option is set to false by default.
+ </p>
+
+ <div class="separator"></div>
+
+ <h3>Example of usage of the cleanup_on_startup option:</h3>
+ <div class="example">
+<pre>
+tinyMCE.init({
+ ...
+ <strong>cleanup_on_startup : true</strong>
+});
+</pre>
+ </div>
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/option_content_css.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/option_content_css.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/option_content_css.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,38 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Option: content_css</title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
- <h1>Option: content_css</h1>
-</div>
-
-<div class="content">
- <p>
- This option enables you to specify a custom CSS file that extends the theme content CSS. This CSS file is the one used within the editor (the editable area). The default location of this CSS file is within the current theme. This option can also be a comma separated list of URLs.
- </p>
-
- <div class="separator"></div>
-
- <h3>Example of usage of the content_css option:</h3>
- <div class="example">
-<pre>
-tinyMCE.init({
- ...
- <strong>content_css : "/mycontent.css"</strong>
-});
-</pre>
- </div>
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/option_content_css.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/option_content_css.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/option_content_css.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/option_content_css.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,38 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Option: content_css</title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+ <h1>Option: content_css</h1>
+</div>
+
+<div class="content">
+ <p>
+ This option enables you to specify a custom CSS file that extends the theme content CSS. This CSS file is the one used within the editor (the editable area). The default location of this CSS file is within the current theme. This option can also be a comma separated list of URLs.
+ </p>
+
+ <div class="separator"></div>
+
+ <h3>Example of usage of the content_css option:</h3>
+ <div class="example">
+<pre>
+tinyMCE.init({
+ ...
+ <strong>content_css : "/mycontent.css"</strong>
+});
+</pre>
+ </div>
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/option_convert_fonts_to_spans.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/option_convert_fonts_to_spans.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/option_convert_fonts_to_spans.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,38 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Option: convert_fonts_to_spans</title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
- <h1>Option: convert_fonts_to_spans</h1>
-</div>
-
-<div class="content">
- <p>If you set this option to true, all TinyMCE will convert all font elements to span elements and generate span elements instead of font elements. This option should be used inorder to get more W3C compatible code, since font elements are deprecated. How sizes gets converted can be controlled by the <a href="option_font_size_classes.html">font_size_classes</a> and <a href="option_font_size_style_values.html">font_size_style_values</a> options.</p>
- <p>
- More information about this subject can be found in this article: <a href="http://www.microsoft.com/typography/web/designer/face7.htm">What's wrong with FONT FACE</a>
- </p>
- <div class="separator"></div>
-
- <h3>Example of usage of the convert_fonts_to_spans option:</h3>
- <div class="example">
-<pre>
-tinyMCE.init({
- ...
- <strong>convert_fonts_to_spans : false</strong>
-});
-</pre>
- </div>
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/option_convert_fonts_to_spans.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/option_convert_fonts_to_spans.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/option_convert_fonts_to_spans.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/option_convert_fonts_to_spans.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,38 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Option: convert_fonts_to_spans</title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+ <h1>Option: convert_fonts_to_spans</h1>
+</div>
+
+<div class="content">
+ <p>If you set this option to true, all TinyMCE will convert all font elements to span elements and generate span elements instead of font elements. This option should be used inorder to get more W3C compatible code, since font elements are deprecated. How sizes gets converted can be controlled by the <a href="option_font_size_classes.html">font_size_classes</a> and <a href="option_font_size_style_values.html">font_size_style_values</a> options.</p>
+ <p>
+ More information about this subject can be found in this article: <a href="http://www.microsoft.com/typography/web/designer/face7.htm">What's wrong with FONT FACE</a>
+ </p>
+ <div class="separator"></div>
+
+ <h3>Example of usage of the convert_fonts_to_spans option:</h3>
+ <div class="example">
+<pre>
+tinyMCE.init({
+ ...
+ <strong>convert_fonts_to_spans : false</strong>
+});
+</pre>
+ </div>
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/option_convert_newlines_to_brs.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/option_convert_newlines_to_brs.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/option_convert_newlines_to_brs.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,38 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Option: convert_newlines_to_brs</title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
- <h1>Option: convert_newlines_to_brs</h1>
-</div>
-
-<div class="content">
- <p>
- If you set this option to true newline characters codes gets converted in to br elements. This option is set to false by default.
- </p>
-
- <div class="separator"></div>
-
- <h3>Example of usage of the convert_newlines_to_brs option:</h3>
- <div class="example">
-<pre>
-tinyMCE.init({
- ...
- <strong>convert_newlines_to_brs : true</strong>
-});
-</pre>
- </div>
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/option_convert_newlines_to_brs.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/option_convert_newlines_to_brs.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/option_convert_newlines_to_brs.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/option_convert_newlines_to_brs.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,38 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Option: convert_newlines_to_brs</title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+ <h1>Option: convert_newlines_to_brs</h1>
+</div>
+
+<div class="content">
+ <p>
+ If you set this option to true newline characters codes gets converted in to br elements. This option is set to false by default.
+ </p>
+
+ <div class="separator"></div>
+
+ <h3>Example of usage of the convert_newlines_to_brs option:</h3>
+ <div class="example">
+<pre>
+tinyMCE.init({
+ ...
+ <strong>convert_newlines_to_brs : true</strong>
+});
+</pre>
+ </div>
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/option_convert_urls.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/option_convert_urls.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/option_convert_urls.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,36 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Option: convert_urls</title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
- <h1>Option: convert_urls</h1>
-</div>
-
-<div class="content">
- <p>This option enables you to control if TinyMCE is to be clever and restore urls to their original values. URLs are auto converted/messed up by default since the built in browser logic works this way, there is no way to get the real URL unless you store it away. If you set this option to false it will try to keep these URLs intact. This option is set to true by default that means URLs will be forced absolute or relative depending on the state of <a href="option_relative_urls.html">relative_urls</a>.</p>
-
- <div class="separator"></div>
-
- <h3>Example of usage of the convert_urls option:</h3>
- <div class="example">
-<pre>
-tinyMCE.init({
- ...
- <strong>convert_urls : false</strong>
-});
-</pre>
- </div>
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/option_convert_urls.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/option_convert_urls.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/option_convert_urls.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/option_convert_urls.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,36 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Option: convert_urls</title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+ <h1>Option: convert_urls</h1>
+</div>
+
+<div class="content">
+ <p>This option enables you to control if TinyMCE is to be clever and restore urls to their original values. URLs are auto converted/messed up by default since the built in browser logic works this way, there is no way to get the real URL unless you store it away. If you set this option to false it will try to keep these URLs intact. This option is set to true by default that means URLs will be forced absolute or relative depending on the state of <a href="option_relative_urls.html">relative_urls</a>.</p>
+
+ <div class="separator"></div>
+
+ <h3>Example of usage of the convert_urls option:</h3>
+ <div class="example">
+<pre>
+tinyMCE.init({
+ ...
+ <strong>convert_urls : false</strong>
+});
+</pre>
+ </div>
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/option_custom_shortcuts.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/option_custom_shortcuts.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/option_custom_shortcuts.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,39 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Option: custom_shortcuts</title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
- <h1>Option: custom_shortcuts</h1>
-</div>
-
-<div class="content">
- <p>
- This option enables you to disable/enable the custom keyboard shortcuts plugins and themes may register. The value of this
- option is set to true by default.
- </p>
-
- <div class="separator"></div>
-
- <h3>Example of usage of the custom_shortcuts option:</h3>
- <div class="example">
-<pre>
-tinyMCE.init({
- ...
- <strong>custom_shortcuts : false</strong>
-});
-</pre>
- </div>
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/option_custom_shortcuts.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/option_custom_shortcuts.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/option_custom_shortcuts.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/option_custom_shortcuts.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,39 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Option: custom_shortcuts</title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+ <h1>Option: custom_shortcuts</h1>
+</div>
+
+<div class="content">
+ <p>
+ This option enables you to disable/enable the custom keyboard shortcuts plugins and themes may register. The value of this
+ option is set to true by default.
+ </p>
+
+ <div class="separator"></div>
+
+ <h3>Example of usage of the custom_shortcuts option:</h3>
+ <div class="example">
+<pre>
+tinyMCE.init({
+ ...
+ <strong>custom_shortcuts : false</strong>
+});
+</pre>
+ </div>
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/option_custom_undo_redo.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/option_custom_undo_redo.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/option_custom_undo_redo.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,38 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Option: custom_undo_redo</title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
- <h1>Option: custom_undo_redo</h1>
-</div>
-
-<div class="content">
- <p>
- This option is a true/false option that enables you to disable/enable the custom undo/redo logic within TinyMCE. This option is enabled by default, if you disable it some operations may not be undoable.
- </p>
-
- <div class="separator"></div>
-
- <h3>Example of usage of the custom_undo_redo option:</h3>
- <div class="example">
-<pre>
-tinyMCE.init({
- ...
- <strong>custom_undo_redo : false</strong>
-});
-</pre>
- </div>
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/option_custom_undo_redo.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/option_custom_undo_redo.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/option_custom_undo_redo.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/option_custom_undo_redo.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,38 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Option: custom_undo_redo</title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+ <h1>Option: custom_undo_redo</h1>
+</div>
+
+<div class="content">
+ <p>
+ This option is a true/false option that enables you to disable/enable the custom undo/redo logic within TinyMCE. This option is enabled by default, if you disable it some operations may not be undoable.
+ </p>
+
+ <div class="separator"></div>
+
+ <h3>Example of usage of the custom_undo_redo option:</h3>
+ <div class="example">
+<pre>
+tinyMCE.init({
+ ...
+ <strong>custom_undo_redo : false</strong>
+});
+</pre>
+ </div>
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/option_custom_undo_redo_keyboard_shortcuts.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/option_custom_undo_redo_keyboard_shortcuts.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/option_custom_undo_redo_keyboard_shortcuts.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,38 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Option: custom_undo_redo_keyboard_shortcuts</title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
- <h1>Option: custom_undo_redo_keyboard_shortcuts</h1>
-</div>
-
-<div class="content">
- <p>
- This option enables you to disable/enable the usage of keyboard shortcuts for undo/redo. This feature is enabled by default. Keyboard shortcurs are Ctrl+Z for undo, Ctrl+Y for redo.
- </p>
-
- <div class="separator"></div>
-
- <h3>Example of usage of the custom_undo_redo_keyboard_shortcuts option:</h3>
- <div class="example">
-<pre>
-tinyMCE.init({
- ...
- <strong>custom_undo_redo_keyboard_shortcuts : "false"</strong>
-});
-</pre>
- </div>
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/option_custom_undo_redo_keyboard_shortcuts.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/option_custom_undo_redo_keyboard_shortcuts.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/option_custom_undo_redo_keyboard_shortcuts.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/option_custom_undo_redo_keyboard_shortcuts.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,38 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Option: custom_undo_redo_keyboard_shortcuts</title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+ <h1>Option: custom_undo_redo_keyboard_shortcuts</h1>
+</div>
+
+<div class="content">
+ <p>
+ This option enables you to disable/enable the usage of keyboard shortcuts for undo/redo. This feature is enabled by default. Keyboard shortcurs are Ctrl+Z for undo, Ctrl+Y for redo.
+ </p>
+
+ <div class="separator"></div>
+
+ <h3>Example of usage of the custom_undo_redo_keyboard_shortcuts option:</h3>
+ <div class="example">
+<pre>
+tinyMCE.init({
+ ...
+ <strong>custom_undo_redo_keyboard_shortcuts : "false"</strong>
+});
+</pre>
+ </div>
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/option_custom_undo_redo_levels.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/option_custom_undo_redo_levels.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/option_custom_undo_redo_levels.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,38 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Option: custom_undo_redo_levels</title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
- <h1>Option: custom_undo_redo_levels</h1>
-</div>
-
-<div class="content">
- <p>
- This option should contain the number of undo levels to keep in memory. This is set to -1 by default and such a value tells TinyMCE to use a unlimited number of undo levels. But this steals lots of memory so for low end systems a value of 10 may be better.
- </p>
-
- <div class="separator"></div>
-
- <h3>Example of usage of the custom_undo_redo_levels option:</h3>
- <div class="example">
-<pre>
-tinyMCE.init({
- ...
- <strong>custom_undo_redo_levels : 10</strong>
-});
-</pre>
- </div>
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/option_custom_undo_redo_levels.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/option_custom_undo_redo_levels.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/option_custom_undo_redo_levels.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/option_custom_undo_redo_levels.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,38 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Option: custom_undo_redo_levels</title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+ <h1>Option: custom_undo_redo_levels</h1>
+</div>
+
+<div class="content">
+ <p>
+ This option should contain the number of undo levels to keep in memory. This is set to -1 by default and such a value tells TinyMCE to use a unlimited number of undo levels. But this steals lots of memory so for low end systems a value of 10 may be better.
+ </p>
+
+ <div class="separator"></div>
+
+ <h3>Example of usage of the custom_undo_redo_levels option:</h3>
+ <div class="example">
+<pre>
+tinyMCE.init({
+ ...
+ <strong>custom_undo_redo_levels : 10</strong>
+});
+</pre>
+ </div>
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/option_custom_undo_redo_restore_selection.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/option_custom_undo_redo_restore_selection.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/option_custom_undo_redo_restore_selection.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,38 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Option: custom_undo_redo_restore_selection</title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
- <h1>Option: custom_undo_redo_restore_selection</h1>
-</div>
-
-<div class="content">
- <p>
- This option gives you the possibility to turn on/off the restoration of the cursor/selection when a undo/redo event occurs. This option is enabled by default.
- </p>
-
- <div class="separator"></div>
-
- <h3>Example of usage of the custom_undo_redo_restore_selection option:</h3>
- <div class="example">
-<pre>
-tinyMCE.init({
- ...
- <strong>custom_undo_redo_restore_selection : false</strong>
-});
-</pre>
- </div>
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/option_custom_undo_redo_restore_selection.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/option_custom_undo_redo_restore_selection.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/option_custom_undo_redo_restore_selection.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/option_custom_undo_redo_restore_selection.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,38 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Option: custom_undo_redo_restore_selection</title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+ <h1>Option: custom_undo_redo_restore_selection</h1>
+</div>
+
+<div class="content">
+ <p>
+ This option gives you the possibility to turn on/off the restoration of the cursor/selection when a undo/redo event occurs. This option is enabled by default.
+ </p>
+
+ <div class="separator"></div>
+
+ <h3>Example of usage of the custom_undo_redo_restore_selection option:</h3>
+ <div class="example">
+<pre>
+tinyMCE.init({
+ ...
+ <strong>custom_undo_redo_restore_selection : false</strong>
+});
+</pre>
+ </div>
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/option_debug.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/option_debug.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/option_debug.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,38 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Option: debug</title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
- <h1>Option: debug</h1>
-</div>
-
-<div class="content">
- <p>
- If the value of this option is set to "true" some debugging information will appear such as a list of what CSS files are used. The default value of this option is false.
- </p>
-
- <div class="separator"></div>
-
- <h3>Example of usage of the debug option:</h3>
- <div class="example">
-<pre>
-tinyMCE.init({
- ...
- <strong>debug : true</strong>
-});
-</pre>
- </div>
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/option_debug.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/option_debug.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/option_debug.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/option_debug.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,38 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Option: debug</title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+ <h1>Option: debug</h1>
+</div>
+
+<div class="content">
+ <p>
+ If the value of this option is set to "true" some debugging information will appear such as a list of what CSS files are used. The default value of this option is false.
+ </p>
+
+ <div class="separator"></div>
+
+ <h3>Example of usage of the debug option:</h3>
+ <div class="example">
+<pre>
+tinyMCE.init({
+ ...
+ <strong>debug : true</strong>
+});
+</pre>
+ </div>
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/option_dialog_type.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/option_dialog_type.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/option_dialog_type.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,38 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Option: dialog_type</title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
- <h1>Option: dialog_type</h1>
-</div>
-
-<div class="content">
- <p>
- This option enables you to specify how dialogs/popups should be opened, possible values are "window" and "modal", where the window option opens a normal window and the dialog option opens a modal dialog. This option is set to "window" by default.
- </p>
-
- <div class="separator"></div>
-
- <h3>Example of usage of the dialog_type option:</h3>
- <div class="example">
-<pre>
-tinyMCE.init({
- ...
- <strong>dialog_type : "modal"</strong>
-});
-</pre>
- </div>
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/option_dialog_type.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/option_dialog_type.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/option_dialog_type.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/option_dialog_type.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,38 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Option: dialog_type</title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+ <h1>Option: dialog_type</h1>
+</div>
+
+<div class="content">
+ <p>
+ This option enables you to specify how dialogs/popups should be opened, possible values are "window" and "modal", where the window option opens a normal window and the dialog option opens a modal dialog. This option is set to "window" by default.
+ </p>
+
+ <div class="separator"></div>
+
+ <h3>Example of usage of the dialog_type option:</h3>
+ <div class="example">
+<pre>
+tinyMCE.init({
+ ...
+ <strong>dialog_type : "modal"</strong>
+});
+</pre>
+ </div>
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/option_directionality.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/option_directionality.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/option_directionality.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,38 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Option: directionality</title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
- <h1>Option: directionality</h1>
-</div>
-
-<div class="content">
- <p>
- This option specifies the default writing direction, some languages writes from right to left instead of left to right. The default value of this option is ":ltr" but if you want to use from right to left mode specify "rtl" instead.
- </p>
-
- <div class="separator"></div>
-
- <h3>Example of usage of the directionality option:</h3>
- <div class="example">
-<pre>
-tinyMCE.init({
- ...
- <strong>directionality : "rtl"</strong>
-});
-</pre>
- </div>
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/option_directionality.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/option_directionality.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/option_directionality.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/option_directionality.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,38 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Option: directionality</title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+ <h1>Option: directionality</h1>
+</div>
+
+<div class="content">
+ <p>
+ This option specifies the default writing direction, some languages writes from right to left instead of left to right. The default value of this option is ":ltr" but if you want to use from right to left mode specify "rtl" instead.
+ </p>
+
+ <div class="separator"></div>
+
+ <h3>Example of usage of the directionality option:</h3>
+ <div class="example">
+<pre>
+tinyMCE.init({
+ ...
+ <strong>directionality : "rtl"</strong>
+});
+</pre>
+ </div>
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/option_display_tab_class.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/option_display_tab_class.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/option_display_tab_class.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,38 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Option: display_tab_class</title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
- <h1>Option: display_tab_class</h1>
-</div>
-
-<div class="content">
- <p>
- This option is useful when TinyMCE is used within tabs in MSIE. This property is needed since MSIE has a bug where it's impossible to retrive the width/height on elements like images while it's hidden using display:none. So use this property to define the class name that is used to hide a specific tab, this will help TinyMCE to display the tab while getting the image data.
- </p>
-
- <div class="separator"></div>
-
- <h3>Example of usage of the display_tab_class option:</h3>
- <div class="example">
-<pre>
-tinyMCE.init({
- ...
- <strong>display_tab_class : "showTab"</strong>
-});
-</pre>
- </div>
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/option_display_tab_class.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/option_display_tab_class.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/option_display_tab_class.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/option_display_tab_class.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,38 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Option: display_tab_class</title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+ <h1>Option: display_tab_class</h1>
+</div>
+
+<div class="content">
+ <p>
+ This option is useful when TinyMCE is used within tabs in MSIE. This property is needed since MSIE has a bug where it's impossible to retrive the width/height on elements like images while it's hidden using display:none. So use this property to define the class name that is used to hide a specific tab, this will help TinyMCE to display the tab while getting the image data.
+ </p>
+
+ <div class="separator"></div>
+
+ <h3>Example of usage of the display_tab_class option:</h3>
+ <div class="example">
+<pre>
+tinyMCE.init({
+ ...
+ <strong>display_tab_class : "showTab"</strong>
+});
+</pre>
+ </div>
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/option_docs_language.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/option_docs_language.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/option_docs_language.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,38 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Option: docs_language</title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
- <h1>Option: docs_language</h1>
-</div>
-
-<div class="content">
- <p>
- This option should contain a language code of the editor documentation to use with TinyMCE. These codes are in <a href="http://www.loc.gov/standards/iso639-2/englangn.html">ISO-639-1</a> format to see if your language is available check the contents of "tinymce/jscripts/tiny_mce/theme/<theme used>/docs". The default value of this option is the value specified in the "language" option or "en" for English.
- </p>
-
- <div class="separator"></div>
-
- <h3>Example of usage of the docs_language option:</h3>
- <div class="example">
-<pre>
-tinyMCE.init({
- ...
- <strong>docs_language : "sv"</strong>
-});
-</pre>
- </div>
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/option_docs_language.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/option_docs_language.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/option_docs_language.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/option_docs_language.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,38 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Option: docs_language</title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+ <h1>Option: docs_language</h1>
+</div>
+
+<div class="content">
+ <p>
+ This option should contain a language code of the editor documentation to use with TinyMCE. These codes are in <a href="http://www.loc.gov/standards/iso639-2/englangn.html">ISO-639-1</a> format to see if your language is available check the contents of "tinymce/jscripts/tiny_mce/theme/<theme used>/docs". The default value of this option is the value specified in the "language" option or "en" for English.
+ </p>
+
+ <div class="separator"></div>
+
+ <h3>Example of usage of the docs_language option:</h3>
+ <div class="example">
+<pre>
+tinyMCE.init({
+ ...
+ <strong>docs_language : "sv"</strong>
+});
+</pre>
+ </div>
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/option_doctype.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/option_doctype.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/option_doctype.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,35 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Option: doctype</title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
- <h1>Option: doctype</h1>
-</div>
-
-<div class="content">
- <p>This option enables you to specify the doctype that is used while editing content within TinyMCE, this defaults to <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">.</p>
- <div class="separator"></div>
-
- <h3>Example of usage of the doctype option:</h3>
- <div class="example">
-<pre>
-tinyMCE.init({
- ...
- <strong>doctype : "<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">"</strong>
-});
-</pre>
- </div>
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/option_doctype.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/option_doctype.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/option_doctype.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/option_doctype.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,35 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Option: doctype</title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+ <h1>Option: doctype</h1>
+</div>
+
+<div class="content">
+ <p>This option enables you to specify the doctype that is used while editing content within TinyMCE, this defaults to <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">.</p>
+ <div class="separator"></div>
+
+ <h3>Example of usage of the doctype option:</h3>
+ <div class="example">
+<pre>
+tinyMCE.init({
+ ...
+ <strong>doctype : "<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">"</strong>
+});
+</pre>
+ </div>
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/option_document_base_url.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/option_document_base_url.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/option_document_base_url.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,36 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Option: document_base_url</title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
- <h1>Option: document_base_url</h1>
-</div>
-
-<div class="content">
- <p>This option enables you to specify the URL from where all URLs will be relative to this option is only used when the <a href="option_relative_urls.html">relative_urls</a> option is set to true. The value of this option is set to the current document by default.</p>
-
- <div class="separator"></div>
-
- <h3>Example of usage of the document_base_url option:</h3>
- <div class="example">
-<pre>
-tinyMCE.init({
- ...
- <strong>document_base_url : "/somedir/somfile.html"</strong>
-});
-</pre>
- </div>
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/option_document_base_url.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/option_document_base_url.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/option_document_base_url.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/option_document_base_url.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,36 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Option: document_base_url</title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+ <h1>Option: document_base_url</h1>
+</div>
+
+<div class="content">
+ <p>This option enables you to specify the URL from where all URLs will be relative to this option is only used when the <a href="option_relative_urls.html">relative_urls</a> option is set to true. The value of this option is set to the current document by default.</p>
+
+ <div class="separator"></div>
+
+ <h3>Example of usage of the document_base_url option:</h3>
+ <div class="example">
+<pre>
+tinyMCE.init({
+ ...
+ <strong>document_base_url : "/somedir/somfile.html"</strong>
+});
+</pre>
+ </div>
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/option_editor_css.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/option_editor_css.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/option_editor_css.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,38 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Option: editor_css</title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
- <h1>Option: editor_css</h1>
-</div>
-
-<div class="content">
- <p>
- This option enables you to specify the CSS to be used for the editor toolbars/user interface of TinyMCE this option is set to a CSS file found in the currently used theme by default. This CSS contains layout information about panels and buttons used by TinyMCE.
- </p>
-
- <div class="separator"></div>
-
- <h3>Example of usage of the editor_css option:</h3>
- <div class="example">
-<pre>
-tinyMCE.init({
- ...
- <strong>editor_css : "/myeditor.css"</strong>
-});
-</pre>
- </div>
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/option_editor_css.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/option_editor_css.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/option_editor_css.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/option_editor_css.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,38 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Option: editor_css</title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+ <h1>Option: editor_css</h1>
+</div>
+
+<div class="content">
+ <p>
+ This option enables you to specify the CSS to be used for the editor toolbars/user interface of TinyMCE this option is set to a CSS file found in the currently used theme by default. This CSS contains layout information about panels and buttons used by TinyMCE.
+ </p>
+
+ <div class="separator"></div>
+
+ <h3>Example of usage of the editor_css option:</h3>
+ <div class="example">
+<pre>
+tinyMCE.init({
+ ...
+ <strong>editor_css : "/myeditor.css"</strong>
+});
+</pre>
+ </div>
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/option_editor_deselector.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/option_editor_deselector.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/option_editor_deselector.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,49 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Option: editor_deselector</title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
- <h1>Option: editor_deselector</h1>
-</div>
-
-<div class="content">
- <p>
- This option enables you to specify a CSS class name that will be deselect textareas from being converted into editor instances. If this option isn't set to a value this option will not have any effect and the <a href="option_mode.html">mode</a> option will choose textareas instead. The default value of this option is "mceNoEditor" so if mceNoEditor is added to the class attribute of a textarea it will be excluded for convertion.
- </p>
-
- <div class="separator"></div>
-
- <h3>Example of usage of the editor_deselector option:</h3>
- <div class="example">
-<pre>
-tinyMCE.init({
- ...
- <strong>editor_deselector : "mceNoEditor"</strong>
-});
-</pre>
- </div>
-
- <div class="separator"></div>
-
- <h3>Example of usage in the HTML:</h3>
- <div class="example">
-<pre>
-<textarea id="myarea1" class="<strong>mceNoEditor</strong>">This will be a NOT be a editor.</textarea>
-
-<textarea id="myarea2">This will be a editor.</textarea>
-</pre>
- </div>
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/option_editor_deselector.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/option_editor_deselector.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/option_editor_deselector.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/option_editor_deselector.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,49 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Option: editor_deselector</title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+ <h1>Option: editor_deselector</h1>
+</div>
+
+<div class="content">
+ <p>
+ This option enables you to specify a CSS class name that will be deselect textareas from being converted into editor instances. If this option isn't set to a value this option will not have any effect and the <a href="option_mode.html">mode</a> option will choose textareas instead. The default value of this option is "mceNoEditor" so if mceNoEditor is added to the class attribute of a textarea it will be excluded for convertion.
+ </p>
+
+ <div class="separator"></div>
+
+ <h3>Example of usage of the editor_deselector option:</h3>
+ <div class="example">
+<pre>
+tinyMCE.init({
+ ...
+ <strong>editor_deselector : "mceNoEditor"</strong>
+});
+</pre>
+ </div>
+
+ <div class="separator"></div>
+
+ <h3>Example of usage in the HTML:</h3>
+ <div class="example">
+<pre>
+<textarea id="myarea1" class="<strong>mceNoEditor</strong>">This will be a NOT be a editor.</textarea>
+
+<textarea id="myarea2">This will be a editor.</textarea>
+</pre>
+ </div>
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/option_editor_selector.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/option_editor_selector.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/option_editor_selector.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,49 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Option: editor_selector</title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
- <h1>Option: editor_selector</h1>
-</div>
-
-<div class="content">
- <p>
- This option enables you to specify a CSS class name that will be required on the text areas that is to be converted. This enables you to select specific text areas for convertion by adding this CSS class name to the class attribute of the text area. If this option isn't set to a value this option will not have any effect and the <a href="option_mode.html">mode</a> option will choose textareas instead. If you want all editors to be converted and just specific editors to be excluded check the <a href="option_editor_deselector.html">editor_deselector</a> option.
- </p>
-
- <div class="separator"></div>
-
- <h3>Example of usage of the editor_selector option:</h3>
- <div class="example">
-<pre>
-tinyMCE.init({
- ...
- <strong>editor_selector : "mceEditor"</strong>
-});
-</pre>
- </div>
-
- <div class="separator"></div>
-
- <h3>Example of usage in the HTML:</h3>
- <div class="example">
-<pre>
-<textarea id="myarea1" class="<strong>mceEditor</strong>">This will be a editor.</textarea>
-
-<textarea id="myarea2">This will NOT be a editor.</textarea>
-</pre>
- </div>
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/option_editor_selector.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/option_editor_selector.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/option_editor_selector.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/option_editor_selector.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,49 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Option: editor_selector</title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+ <h1>Option: editor_selector</h1>
+</div>
+
+<div class="content">
+ <p>
+ This option enables you to specify a CSS class name that will be required on the text areas that is to be converted. This enables you to select specific text areas for convertion by adding this CSS class name to the class attribute of the text area. If this option isn't set to a value this option will not have any effect and the <a href="option_mode.html">mode</a> option will choose textareas instead. If you want all editors to be converted and just specific editors to be excluded check the <a href="option_editor_deselector.html">editor_deselector</a> option.
+ </p>
+
+ <div class="separator"></div>
+
+ <h3>Example of usage of the editor_selector option:</h3>
+ <div class="example">
+<pre>
+tinyMCE.init({
+ ...
+ <strong>editor_selector : "mceEditor"</strong>
+});
+</pre>
+ </div>
+
+ <div class="separator"></div>
+
+ <h3>Example of usage in the HTML:</h3>
+ <div class="example">
+<pre>
+<textarea id="myarea1" class="<strong>mceEditor</strong>">This will be a editor.</textarea>
+
+<textarea id="myarea2">This will NOT be a editor.</textarea>
+</pre>
+ </div>
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/option_elements.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/option_elements.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/option_elements.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,38 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Option: elements</title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
- <h1>Option: elements</h1>
-</div>
-
-<div class="content">
- <p>
- This option should contain a comma separated list of element id's to convert into editor instances. This option is only used if <a href="option_mode.html">mode</a> is set to "exact".
- </p>
-
- <div class="separator"></div>
-
- <h3>Example of usage of the elements option:</h3>
- <div class="example">
-<pre>
-tinyMCE.init({
- ...
- <strong>elements : "elm1,elm2"</strong>
-});
-</pre>
- </div>
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/option_elements.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/option_elements.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/option_elements.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/option_elements.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,38 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Option: elements</title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+ <h1>Option: elements</h1>
+</div>
+
+<div class="content">
+ <p>
+ This option should contain a comma separated list of element id's to convert into editor instances. This option is only used if <a href="option_mode.html">mode</a> is set to "exact".
+ </p>
+
+ <div class="separator"></div>
+
+ <h3>Example of usage of the elements option:</h3>
+ <div class="example">
+<pre>
+tinyMCE.init({
+ ...
+ <strong>elements : "elm1,elm2"</strong>
+});
+</pre>
+ </div>
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/option_encoding.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/option_encoding.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/option_encoding.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,38 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Option: encoding</title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
- <h1>Option: encoding</h1>
-</div>
-
-<div class="content">
- <p>
- This option enables you to get XML escaped contents out of TinyMCE. Posted content will be converted to a XML string escaping characters such as < > " & to < > " &. This option is set nothing by default and is there for disabled.
- </p>
-
- <div class="separator"></div>
-
- <h3>Example of usage of the encoding option:</h3>
- <div class="example">
-<pre>
-tinyMCE.init({
- ...
- <strong>encoding : "xml"</strong>
-});
-</pre>
- </div>
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/option_encoding.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/option_encoding.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/option_encoding.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/option_encoding.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,38 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Option: encoding</title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+ <h1>Option: encoding</h1>
+</div>
+
+<div class="content">
+ <p>
+ This option enables you to get XML escaped contents out of TinyMCE. Posted content will be converted to a XML string escaping characters such as < > " & to < > " &. This option is set nothing by default and is there for disabled.
+ </p>
+
+ <div class="separator"></div>
+
+ <h3>Example of usage of the encoding option:</h3>
+ <div class="example">
+<pre>
+tinyMCE.init({
+ ...
+ <strong>encoding : "xml"</strong>
+});
+</pre>
+ </div>
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/option_entities.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/option_entities.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/option_entities.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,38 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Option: entities</title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
- <h1>Option: entities</h1>
-</div>
-
-<div class="content">
- <p>
- This option contains a comma separated list of entity names that is used instead of characters. Odd items are the character code and even items are the name of the character code. The default value of this option is placed in the example below.
- </p>
-
- <div class="separator"></div>
-
- <h3>Example of usage of the entities option / default value:</h3>
- <div class="example">
-<pre>
-tinyMCE.init({
- ...
- <strong>entities : "160,nbsp,38,amp,34,quot,162,cent,8364,euro,163,pound,165,yen,169,copy,174,reg,8482,trade,8240,permil,181,micro,183,middot,8226,bull,8230,hellip,8242,prime,8243,Prime,167,sect,182,para,223,szlig,8249,lsaquo,8250,rsaquo,171,laquo,187,raquo,8216,lsquo,8217,rsquo,8220,ldquo,8221,rdquo,8218,sbquo,8222,bdquo,60,lt,62,gt,8804,le,8805,ge,8211,ndash,8212,mdash,175,macr,8254,oline,164,curren,166,brvbar,168,uml,161,iexcl,191,iquest,710,circ,732,tilde,176,deg,8722,minus,177,plusmn,247,divide,8260,frasl,215,times,185,sup1,178,sup2,179,sup3,188,frac14,189,frac12,190,frac34,402,fnof,8747,int,8721,sum,8734,infin,8730,radic,8764,sim,8773,cong,8776,asymp,8800,ne,8801,equiv,8712,isin,8713,notin,8715,ni,8719,prod,8743,and,8744,or,172,not,8745,cap,8746,cup,8706,part,8704,forall,8707,exist,8709,empty,8711,nabla,8727,lowast,8733,prop,8736,ang,180,acute,184,cedil,170,ordf,186,ordm,8224,dagger,8225,Dagger,192,Agrave,194,Acirc,195,Atilde,196,Auml,197,Aring,198,AElig,199,Ccedil,200,Egrave,202,Ecirc,203,Euml,204,Igrave,206,Icirc,207,Iuml,208,ETH,209,Ntilde,210,Ograve,212,Ocirc,213,Otilde,214,Ouml,216,Oslash,338,OElig,217,Ugrave,219,Ucirc,220,Uuml,376,Yuml,222,THORN,224,agrave,226,acirc,227,atilde,228,auml,229,aring,230,aelig,231,ccedil,232,egrave,234,ecirc,235,euml,236,igrave,238,icirc,239,iuml,240,eth,241,ntilde,242,ograve,244,ocirc,245,otilde,246,ouml,248,oslash,339,oelig,249,ugrave,251,ucirc,252,uuml,254,thorn,255,yuml,914,Beta,915,Gamma,916,Delta,917,Epsilon,918,Zeta,919,Eta,920,Theta,921,Iota,922,Kappa,923,Lambda,924,Mu,925,Nu,926,Xi,927,Omicron,928,Pi,929,Rho,931,Sigma,932,Tau,933,Upsilon,934,Phi,935,Chi,936,Psi,937,Omega,945,alpha,946,beta,947,gamma,948,delta,949,epsilon,950,zeta,951,eta,952,theta,953,iota,954,kappa,955,lambda,956,mu,957,nu,958,xi,959,omicron,960,pi,961,rho,962,sigmaf,963,sigma,964,tau,965,upsilon,966,phi,967,chi,968,psi,969,omega,8501,alefsym,982,piv,8476,real,977,thetasym,978,upsih,8472,weierp,8465,image,8592,larr,8593,uarr,8594,rarr,8595,darr,8596,harr,8629,crarr,8656,lArr,8657,uArr,8658,rArr,8659,dArr,8660,hArr,8756,there4,8834,sub,8835,sup,8836,nsub,8838,sube,8839,supe,8853,oplus,8855,otimes,8869,perp,8901,sdot,8968,lceil,8969,rceil,8970,lfloor,8971,rfloor,9001,lang,9002,rang,9674,loz,9824,spades,9827,clubs,9829,hearts,9830,diams,8194,ensp,8195,emsp,8201,thinsp,8204,zwnj,8205,zwj,8206,lrm,8207,rlm,173,shy,233,eacute,237,iacute,243,oacute,250,uacute,193,Aacute,225,aacute,201,Eacute,205,Iacute,211,Oacute,218,Uacute,221,Yacute,253,yacute"</strong>
-});
-</pre>
- </div>
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/option_entities.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/option_entities.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/option_entities.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/option_entities.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,38 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Option: entities</title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+ <h1>Option: entities</h1>
+</div>
+
+<div class="content">
+ <p>
+ This option contains a comma separated list of entity names that is used instead of characters. Odd items are the character code and even items are the name of the character code. The default value of this option is placed in the example below.
+ </p>
+
+ <div class="separator"></div>
+
+ <h3>Example of usage of the entities option / default value:</h3>
+ <div class="example">
+<pre>
+tinyMCE.init({
+ ...
+ <strong>entities : "160,nbsp,38,amp,34,quot,162,cent,8364,euro,163,pound,165,yen,169,copy,174,reg,8482,trade,8240,permil,181,micro,183,middot,8226,bull,8230,hellip,8242,prime,8243,Prime,167,sect,182,para,223,szlig,8249,lsaquo,8250,rsaquo,171,laquo,187,raquo,8216,lsquo,8217,rsquo,8220,ldquo,8221,rdquo,8218,sbquo,8222,bdquo,60,lt,62,gt,8804,le,8805,ge,8211,ndash,8212,mdash,175,macr,8254,oline,164,curren,166,brvbar,168,uml,161,iexcl,191,iquest,710,circ,732,tilde,176,deg,8722,minus,177,plusmn,247,divide,8260,frasl,215,times,185,sup1,178,sup2,179,sup3,188,frac14,189,frac12,190,frac34,402,fnof,8747,int,8721,sum,8734,infin,8730,radic,8764,sim,8773,cong,8776,asymp,8800,ne,8801,equiv,8712,isin,8713,notin,8715,ni,8719,prod,8743,and,8744,or,172,not,8745,cap,8746,cup,8706,part,8704,forall,8707,exist,8709,empty,8711,nabla,8727,lowast,8733,prop,8736,ang,180,acute,184,cedil,170,ordf,186,ordm,8224,dagger,8225,Dagger,192,Agrave,194,Acirc,195,Atilde,196,Auml,197,Aring,198,AElig,199,Ccedil,200,Egrave,202,Ecirc,203,Euml,204,Igrave,206,Icirc,207,Iuml,208,ETH,209,Ntilde,210,Ograve,212,Ocirc,213,Otilde,214,Ouml,216,Oslash,338,OElig,217,Ugrave,219,Ucirc,220,Uuml,376,Yuml,222,THORN,224,agrave,226,acirc,227,atilde,228,auml,229,aring,230,aelig,231,ccedil,232,egrave,234,ecirc,235,euml,236,igrave,238,icirc,239,iuml,240,eth,241,ntilde,242,ograve,244,ocirc,245,otilde,246,ouml,248,oslash,339,oelig,249,ugrave,251,ucirc,252,uuml,254,thorn,255,yuml,914,Beta,915,Gamma,916,Delta,917,Epsilon,918,Zeta,919,Eta,920,Theta,921,Iota,922,Kappa,923,Lambda,924,Mu,925,Nu,926,Xi,927,Omicron,928,Pi,929,Rho,931,Sigma,932,Tau,933,Upsilon,934,Phi,935,Chi,936,Psi,937,Omega,945,alpha,946,beta,947,gamma,948,delta,949,epsilon,950,zeta,951,eta,952,theta,953,iota,954,kappa,955,lambda,956,mu,957,nu,958,xi,959,omicron,960,pi,961,rho,962,sigmaf,963,sigma,964,tau,965,upsilon,966,phi,967,chi,968,psi,969,omega,8501,alefsym,982,piv,8476,real,977,thetasym,978,upsih,8472,weierp,8465,image,8592,larr,8593,uarr,8594,rarr,8595,darr,8596,harr,8629,crarr,8656,lArr,8657,uArr,8658,rArr,8659,dArr,8660,hArr,8756,there4,8834,sub,8835,sup,8836,nsub,8838,sube,8839,supe,8853,oplus,8855,otimes,8869,perp,8901,sdot,8968,lceil,8969,rceil,8970,lfloor,8971,rfloor,9001,lang,9002,rang,9674,loz,9824,spades,9827,clubs,9829,hearts,9830,diams,8194,ensp,8195,emsp,8201,thinsp,8204,zwnj,8205,zwj,8206,lrm,8207,rlm,173,shy,233,eacute,237,iacute,243,oacute,250,uacute,193,Aacute,225,aacute,201,Eacute,205,Iacute,211,Oacute,218,Uacute,221,Yacute,253,yacute"</strong>
+});
+</pre>
+ </div>
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/option_entity_encoding.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/option_entity_encoding.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/option_entity_encoding.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,38 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Option: entity_encoding</title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
- <h1>Option: entity_encoding</h1>
-</div>
-
-<div class="content">
- <p>
- This option controls how entities/characters gets processed by TinyMCE. The value can be set to numeric, named or raw. Where numeric is numeric representation such as " " named is entity names such as " " and raw is " ". The default value of this option is named, if named is used the <a href="option_entities.html">entities</a> option will be used to convert the codes into names.
- </p>
-
- <div class="separator"></div>
-
- <h3>Example of usage of the entity_encoding option:</h3>
- <div class="example">
-<pre>
-tinyMCE.init({
- ...
- <strong>entity_encoding : "raw"</strong>
-});
-</pre>
- </div>
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/option_entity_encoding.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/option_entity_encoding.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/option_entity_encoding.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/option_entity_encoding.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,38 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Option: entity_encoding</title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+ <h1>Option: entity_encoding</h1>
+</div>
+
+<div class="content">
+ <p>
+ This option controls how entities/characters gets processed by TinyMCE. The value can be set to numeric, named or raw. Where numeric is numeric representation such as " " named is entity names such as " " and raw is " ". The default value of this option is named, if named is used the <a href="option_entities.html">entities</a> option will be used to convert the codes into names.
+ </p>
+
+ <div class="separator"></div>
+
+ <h3>Example of usage of the entity_encoding option:</h3>
+ <div class="example">
+<pre>
+tinyMCE.init({
+ ...
+ <strong>entity_encoding : "raw"</strong>
+});
+</pre>
+ </div>
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/option_event_elements.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/option_event_elements.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/option_event_elements.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,38 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Option: event_elements</title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
- <h1>Option: event_elements</h1>
-</div>
-
-<div class="content">
- <p>
- This option should contain a comma separated list of elements thay may have event attributes such as onclick and simmilar. This option is needed since some browsers execute these events while editing content. This option is set to "a,img" default.
- </p>
-
- <div class="separator"></div>
-
- <h3>Example of usage of the event_elements option:</h3>
- <div class="example">
-<pre>
-tinyMCE.init({
- ...
- <strong>event_elements : "a,img,span"</strong>
-});
-</pre>
- </div>
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/option_event_elements.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/option_event_elements.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/option_event_elements.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/option_event_elements.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,38 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Option: event_elements</title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+ <h1>Option: event_elements</h1>
+</div>
+
+<div class="content">
+ <p>
+ This option should contain a comma separated list of elements thay may have event attributes such as onclick and simmilar. This option is needed since some browsers execute these events while editing content. This option is set to "a,img" default.
+ </p>
+
+ <div class="separator"></div>
+
+ <h3>Example of usage of the event_elements option:</h3>
+ <div class="example">
+<pre>
+tinyMCE.init({
+ ...
+ <strong>event_elements : "a,img,span"</strong>
+});
+</pre>
+ </div>
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/option_execcommand_callback.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/option_execcommand_callback.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/option_execcommand_callback.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,69 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Option: execcommand_callback</title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
- <h1>Option: execcommand_callback</h1>
-</div>
-
-<div class="content">
- <p>
- This option allows you to add a custom callback function for execCommand handling. This enables you to override internal
- command functions in TinyMCE. The example below shows how the mceLink and mceImage are overriden.
- </p>
-
- <div class="separator"></div>
-
- <h3>Example of usage of the execcommand_callback option:</h3>
- <div class="example">
-<pre>
-function <strong>myCustomExecCommandHandler</strong>(editor_id, elm, command, user_interface, value) {
- var linkElm, imageElm, inst;
-
- switch (command) {
- case "mceLink":
- inst = tinyMCE.getInstanceById(editor_id);
- linkElm = tinyMCE.getParentElement(inst.selection.getFocusElement(), "a");
-
- if (linkElm)
- alert("Link dialog has been overriden. Found link href: " + tinyMCE.getAttrib(linkElm, "href"));
- else
- alert("Link dialog has been overriden.");
-
- return true;
-
- case "mceImage":
- inst = tinyMCE.getInstanceById(editor_id);
- imageElm = tinyMCE.getParentElement(inst.selection.getFocusElement(), "img");
-
- if (imageElm)
- alert("Image dialog has been overriden. Found image src: " + tinyMCE.getAttrib(imageElm, "src"));
- else
- alert("Image dialog has been overriden.");
-
- return true;
- }
-
- return false; // Pass to next handler in chain
-}
-
-tinyMCE.init({
- ...
- <strong>execcommand_callback : "myCustomExecCommandHandler"</strong>
-});
-</pre>
- </div>
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/option_execcommand_callback.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/option_execcommand_callback.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/option_execcommand_callback.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/option_execcommand_callback.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,69 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Option: execcommand_callback</title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+ <h1>Option: execcommand_callback</h1>
+</div>
+
+<div class="content">
+ <p>
+ This option allows you to add a custom callback function for execCommand handling. This enables you to override internal
+ command functions in TinyMCE. The example below shows how the mceLink and mceImage are overriden.
+ </p>
+
+ <div class="separator"></div>
+
+ <h3>Example of usage of the execcommand_callback option:</h3>
+ <div class="example">
+<pre>
+function <strong>myCustomExecCommandHandler</strong>(editor_id, elm, command, user_interface, value) {
+ var linkElm, imageElm, inst;
+
+ switch (command) {
+ case "mceLink":
+ inst = tinyMCE.getInstanceById(editor_id);
+ linkElm = tinyMCE.getParentElement(inst.selection.getFocusElement(), "a");
+
+ if (linkElm)
+ alert("Link dialog has been overriden. Found link href: " + tinyMCE.getAttrib(linkElm, "href"));
+ else
+ alert("Link dialog has been overriden.");
+
+ return true;
+
+ case "mceImage":
+ inst = tinyMCE.getInstanceById(editor_id);
+ imageElm = tinyMCE.getParentElement(inst.selection.getFocusElement(), "img");
+
+ if (imageElm)
+ alert("Image dialog has been overriden. Found image src: " + tinyMCE.getAttrib(imageElm, "src"));
+ else
+ alert("Image dialog has been overriden.");
+
+ return true;
+ }
+
+ return false; // Pass to next handler in chain
+}
+
+tinyMCE.init({
+ ...
+ <strong>execcommand_callback : "myCustomExecCommandHandler"</strong>
+});
+</pre>
+ </div>
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/option_extended_valid_elements.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/option_extended_valid_elements.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/option_extended_valid_elements.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,38 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Option: extended_valid_elements</title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
- <h1>Option: extended_valid_elements</h1>
-</div>
-
-<div class="content">
- <p>
- This option is very similar to <a href="option_valid_elements.html">valid_elements</a> the only diffrance between this option and valid_elements is that this one gets added to the existing rule set. This can be very useful if the existing rule set is fine but you want to add some specific elements that also should be valid.
- </p>
-
- <div class="separator"></div>
-
- <h3>Example of usage of the extended_valid_elements option:</h3>
- <div class="example">
-<pre>
-tinyMCE.init({
- ...
- <strong>extended_valid_elements : "img[class|src|border=0|alt|title|hspace|vspace|width|height|align|onmouseover|onmouseout|name]"</strong>
-});
-</pre>
- </div>
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/option_extended_valid_elements.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/option_extended_valid_elements.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/option_extended_valid_elements.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/option_extended_valid_elements.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,38 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Option: extended_valid_elements</title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+ <h1>Option: extended_valid_elements</h1>
+</div>
+
+<div class="content">
+ <p>
+ This option is very similar to <a href="option_valid_elements.html">valid_elements</a> the only diffrance between this option and valid_elements is that this one gets added to the existing rule set. This can be very useful if the existing rule set is fine but you want to add some specific elements that also should be valid.
+ </p>
+
+ <div class="separator"></div>
+
+ <h3>Example of usage of the extended_valid_elements option:</h3>
+ <div class="example">
+<pre>
+tinyMCE.init({
+ ...
+ <strong>extended_valid_elements : "img[class|src|border=0|alt|title|hspace|vspace|width|height|align|onmouseover|onmouseout|name]"</strong>
+});
+</pre>
+ </div>
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/option_external_image_list_url.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/option_external_image_list_url.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/option_external_image_list_url.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,51 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Option: external_image_list_url</title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
- <h1>Option: external_image_list_url</h1>
-</div>
-
-<div class="content">
- <p>
- This option enables you to have a external list of images this list of images can be generated by a server side page and then inserted into the image dialog windows of TinyMCE. The images can be to internal site images or external URLs.
- </p>
-
- <div class="separator"></div>
-
- <h3>Example of usage of the external_image_list_url option:</h3>
- <div class="example">
-<pre>
-tinyMCE.init({
- ...
- <strong>external_image_list_url : "myexternallist.js"</strong>
-});
-</pre>
- </div>
-
- <div class="separator"></div>
-
- <h3>Example of a external link list file: (myexternallist.js)</h3>
- <div class="example">
-<pre>
-var tinyMCEImageList = new Array(
- // Name, URL
- ["Logo 1", "logo.jpg"],
- ["Logo 2 Over", "logo_over.jpg"]
-);
-</pre>
- </div>
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/option_external_image_list_url.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/option_external_image_list_url.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/option_external_image_list_url.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/option_external_image_list_url.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,51 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Option: external_image_list_url</title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+ <h1>Option: external_image_list_url</h1>
+</div>
+
+<div class="content">
+ <p>
+ This option enables you to have a external list of images this list of images can be generated by a server side page and then inserted into the image dialog windows of TinyMCE. The images can be to internal site images or external URLs.
+ </p>
+
+ <div class="separator"></div>
+
+ <h3>Example of usage of the external_image_list_url option:</h3>
+ <div class="example">
+<pre>
+tinyMCE.init({
+ ...
+ <strong>external_image_list_url : "myexternallist.js"</strong>
+});
+</pre>
+ </div>
+
+ <div class="separator"></div>
+
+ <h3>Example of a external link list file: (myexternallist.js)</h3>
+ <div class="example">
+<pre>
+var tinyMCEImageList = new Array(
+ // Name, URL
+ ["Logo 1", "logo.jpg"],
+ ["Logo 2 Over", "logo_over.jpg"]
+);
+</pre>
+ </div>
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/option_external_link_list_url.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/option_external_link_list_url.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/option_external_link_list_url.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,52 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Option: external_link_list_url</title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
- <h1>Option: external_link_list_url</h1>
-</div>
-
-<div class="content">
- <p>
- This option enables you to have a external list of links this list of links can be generated by a server side page and then inserted into the link dialog windows of TinyMCE. The links can be to internal site documents or external URLs.
- </p>
-
- <div class="separator"></div>
-
- <h3>Example of usage of the external_link_list_url option:</h3>
- <div class="example">
-<pre>
-tinyMCE.init({
- ...
- <strong>external_link_list_url : "myexternallist.js"</strong>
-});
-</pre>
- </div>
-
- <div class="separator"></div>
-
- <h3>Example of a external link list file: (myexternallist.js)</h3>
- <div class="example">
-<pre>
-var tinyMCELinkList = new Array(
- // Name, URL
- ["Moxiecode", "http://www.moxiecode.com"],
- ["Freshmeat", "http://www.freshmeat.com"],
- ["Sourceforge", "http://www.sourceforge.com"]
-);
-</pre>
- </div>
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/option_external_link_list_url.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/option_external_link_list_url.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/option_external_link_list_url.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/option_external_link_list_url.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,52 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Option: external_link_list_url</title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+ <h1>Option: external_link_list_url</h1>
+</div>
+
+<div class="content">
+ <p>
+ This option enables you to have a external list of links this list of links can be generated by a server side page and then inserted into the link dialog windows of TinyMCE. The links can be to internal site documents or external URLs.
+ </p>
+
+ <div class="separator"></div>
+
+ <h3>Example of usage of the external_link_list_url option:</h3>
+ <div class="example">
+<pre>
+tinyMCE.init({
+ ...
+ <strong>external_link_list_url : "myexternallist.js"</strong>
+});
+</pre>
+ </div>
+
+ <div class="separator"></div>
+
+ <h3>Example of a external link list file: (myexternallist.js)</h3>
+ <div class="example">
+<pre>
+var tinyMCELinkList = new Array(
+ // Name, URL
+ ["Moxiecode", "http://www.moxiecode.com"],
+ ["Freshmeat", "http://www.freshmeat.com"],
+ ["Sourceforge", "http://www.sourceforge.com"]
+);
+</pre>
+ </div>
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/option_file_browser_callback.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/option_file_browser_callback.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/option_file_browser_callback.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,43 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Option: file_browser_callback</title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
- <h1>Option: file_browser_callback</h1>
-</div>
-
-<div class="content">
- <p>
- This option enables you to add your own file browser/image browser to TinyMCE. This function is executed each time a user clicks on the "browse" buttons in various dialogs. The format of this callback function is: fileBrowser(field_name, url, type, win) where field_name is the id/name of the form element that the browser should insert it's URL into. The url parameter contains the URL value that is currently inside the field. The type parameter contains what type of browser to present this value can be file, image or flash depending on what dialog is calling the function. The win parameter contains a reference to the dialog/window that executes the function.
- </p>
-
- <div class="separator"></div>
-
- <h3>Example of usage of the file_browser_callback option:</h3>
- <div class="example">
-<pre>
-function <strong>myCustomFileBrowser</strong>(field_name, url, type, win) {
- // Do custom browser logic
- win.document.forms[0].elements[field_name].value = 'my browser value';
-}
-
-tinyMCE.init({
- ...
- <strong>file_browser_callback : "myCustomFileBrowser"</strong>
-});
-</pre>
- </div>
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/option_file_browser_callback.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/option_file_browser_callback.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/option_file_browser_callback.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/option_file_browser_callback.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,43 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Option: file_browser_callback</title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+ <h1>Option: file_browser_callback</h1>
+</div>
+
+<div class="content">
+ <p>
+ This option enables you to add your own file browser/image browser to TinyMCE. This function is executed each time a user clicks on the "browse" buttons in various dialogs. The format of this callback function is: fileBrowser(field_name, url, type, win) where field_name is the id/name of the form element that the browser should insert it's URL into. The url parameter contains the URL value that is currently inside the field. The type parameter contains what type of browser to present this value can be file, image or flash depending on what dialog is calling the function. The win parameter contains a reference to the dialog/window that executes the function.
+ </p>
+
+ <div class="separator"></div>
+
+ <h3>Example of usage of the file_browser_callback option:</h3>
+ <div class="example">
+<pre>
+function <strong>myCustomFileBrowser</strong>(field_name, url, type, win) {
+ // Do custom browser logic
+ win.document.forms[0].elements[field_name].value = 'my browser value';
+}
+
+tinyMCE.init({
+ ...
+ <strong>file_browser_callback : "myCustomFileBrowser"</strong>
+});
+</pre>
+ </div>
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/option_fix_content_duplication.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/option_fix_content_duplication.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/option_fix_content_duplication.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,38 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Option: fix_content_duplication</title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
- <h1>Option: fix_content_duplication</h1>
-</div>
-
-<div class="content">
- <p>
- This option is available since MSIE has a serious bug where the DOM tree sometimes can include the same node twice. This produces duplication of content when the cleanup process runs. This option is enabled by default and removes any duplicated nodes.
- </p>
-
- <div class="separator"></div>
-
- <h3>Example of usage of the fix_content_duplication option:</h3>
- <div class="example">
-<pre>
-tinyMCE.init({
- ...
- <strong>fix_content_duplication : false</strong>
-});
-</pre>
- </div>
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/option_fix_content_duplication.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/option_fix_content_duplication.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/option_fix_content_duplication.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/option_fix_content_duplication.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,38 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Option: fix_content_duplication</title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+ <h1>Option: fix_content_duplication</h1>
+</div>
+
+<div class="content">
+ <p>
+ This option is available since MSIE has a serious bug where the DOM tree sometimes can include the same node twice. This produces duplication of content when the cleanup process runs. This option is enabled by default and removes any duplicated nodes.
+ </p>
+
+ <div class="separator"></div>
+
+ <h3>Example of usage of the fix_content_duplication option:</h3>
+ <div class="example">
+<pre>
+tinyMCE.init({
+ ...
+ <strong>fix_content_duplication : false</strong>
+});
+</pre>
+ </div>
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/option_fix_list_elements.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/option_fix_list_elements.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/option_fix_list_elements.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,62 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Option: fix_list_elements</title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
- <h1>Option: fix_list_elements</h1>
-</div>
-
-<div class="content">
- <p>
- This option enables you to specify that list elements UL/OL is to be converted to valid XHTML. This option is disabled by default.<br /><br />
- <div class="example">
-<pre>
-This invalid list:
-<ol>
- <li>a</li>
- <ol>
- <li>b</li>
- <li>c</li>
- </ol>
- <li>e</li>
-</ol>
-
-Gets converted into this valid list:
-<ol>
- <li>a
- <ol>
- <li>b</li>
- <li>c</li>
- </ol>
- </li>
- <li>e</li>
-</ol>
-</pre>
- </div>
- </p>
-
- <div class="separator"></div>
-
- <h3>Example of usage of the fix_list_elements option:</h3>
- <div class="example">
-<pre>
-tinyMCE.init({
- ...
- <strong>fix_list_elements : true</strong>
-});
-</pre>
- </div>
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/option_fix_list_elements.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/option_fix_list_elements.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/option_fix_list_elements.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/option_fix_list_elements.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,62 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Option: fix_list_elements</title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+ <h1>Option: fix_list_elements</h1>
+</div>
+
+<div class="content">
+ <p>
+ This option enables you to specify that list elements UL/OL is to be converted to valid XHTML. This option is disabled by default.<br /><br />
+ <div class="example">
+<pre>
+This invalid list:
+<ol>
+ <li>a</li>
+ <ol>
+ <li>b</li>
+ <li>c</li>
+ </ol>
+ <li>e</li>
+</ol>
+
+Gets converted into this valid list:
+<ol>
+ <li>a
+ <ol>
+ <li>b</li>
+ <li>c</li>
+ </ol>
+ </li>
+ <li>e</li>
+</ol>
+</pre>
+ </div>
+ </p>
+
+ <div class="separator"></div>
+
+ <h3>Example of usage of the fix_list_elements option:</h3>
+ <div class="example">
+<pre>
+tinyMCE.init({
+ ...
+ <strong>fix_list_elements : true</strong>
+});
+</pre>
+ </div>
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/option_fix_table_elements.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/option_fix_table_elements.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/option_fix_table_elements.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,63 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Option: fix_table_elements</title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
- <h1>Option: fix_table_elements</h1>
-</div>
-
-<div class="content">
- <p>
- This option enables you to specify that list table elements should be moved outside paragraphs or other block elements. If you enable this option block elements will be split into two chunks when a table is found within it, see the example below for details. This option is disabled by default.<br /><br />
- <div class="example">
-<pre>
-This invalid table:
-<p>
-a
-<table>
- <tr><td>b</td></tr>
- <tr><td>c</td></tr>
-</table>
-d
-</p>
-
-Gets converted into this valid XHTML:
-<p>
-a
-</p>
-<table>
- <tr><td>b</td></tr>
- <tr><td>c</td></tr>
-</table>
-<p>
-d
-</p>
-</pre>
- </div>
- </p>
-
- <div class="separator"></div>
-
- <h3>Example of usage of the fix_table_elements option:</h3>
- <div class="example">
-<pre>
-tinyMCE.init({
- ...
- <strong>fix_table_elements : true</strong>
-});
-</pre>
- </div>
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/option_fix_table_elements.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/option_fix_table_elements.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/option_fix_table_elements.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/option_fix_table_elements.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,63 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Option: fix_table_elements</title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+ <h1>Option: fix_table_elements</h1>
+</div>
+
+<div class="content">
+ <p>
+ This option enables you to specify that list table elements should be moved outside paragraphs or other block elements. If you enable this option block elements will be split into two chunks when a table is found within it, see the example below for details. This option is disabled by default.<br /><br />
+ <div class="example">
+<pre>
+This invalid table:
+<p>
+a
+<table>
+ <tr><td>b</td></tr>
+ <tr><td>c</td></tr>
+</table>
+d
+</p>
+
+Gets converted into this valid XHTML:
+<p>
+a
+</p>
+<table>
+ <tr><td>b</td></tr>
+ <tr><td>c</td></tr>
+</table>
+<p>
+d
+</p>
+</pre>
+ </div>
+ </p>
+
+ <div class="separator"></div>
+
+ <h3>Example of usage of the fix_table_elements option:</h3>
+ <div class="example">
+<pre>
+tinyMCE.init({
+ ...
+ <strong>fix_table_elements : true</strong>
+});
+</pre>
+ </div>
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/option_focus_alert.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/option_focus_alert.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/option_focus_alert.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,38 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Option: focus_alert</title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
- <h1>Option: focus_alert</h1>
-</div>
-
-<div class="content">
- <p>
- This option enables you to specify if a "Editor is not focused" alert message should appear if the user calls tinyMCE.execCommand and havn't selected a editor instance before. This message will normaly not appear unless some integration has been made. Using tinyMCE.execInstanceCommand prevents this from happening since it auto focuses the editor specified. The default value of this option is "true".
- </p>
-
- <div class="separator"></div>
-
- <h3>Example of usage of the focus_alert option:</h3>
- <div class="example">
-<pre>
-tinyMCE.init({
- ...
- <strong>focus_alert : false</strong>
-});
-</pre>
- </div>
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/option_focus_alert.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/option_focus_alert.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/option_focus_alert.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/option_focus_alert.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,38 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Option: focus_alert</title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+ <h1>Option: focus_alert</h1>
+</div>
+
+<div class="content">
+ <p>
+ This option enables you to specify if a "Editor is not focused" alert message should appear if the user calls tinyMCE.execCommand and havn't selected a editor instance before. This message will normaly not appear unless some integration has been made. Using tinyMCE.execInstanceCommand prevents this from happening since it auto focuses the editor specified. The default value of this option is "true".
+ </p>
+
+ <div class="separator"></div>
+
+ <h3>Example of usage of the focus_alert option:</h3>
+ <div class="example">
+<pre>
+tinyMCE.init({
+ ...
+ <strong>focus_alert : false</strong>
+});
+</pre>
+ </div>
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/option_font_size_classes.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/option_font_size_classes.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/option_font_size_classes.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,35 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Option: font_size_classes</title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
- <h1>Option: font_size_classes</h1>
-</div>
-
-<div class="content">
- <p>Comma separated list of class names that is to be used when the user selects font sizes, this option is only used when the <a href="option_convert_fonts_to_spans.html">convert_fonts_to_spans</a> option is enabled. This list of classes should be 7 items. This option is not used by default, but can be useful if you want to have custom classes for each font size for browser compatiblity.</p>
- <div class="separator"></div>
-
- <h3>Example of usage of the font_size_classes option:</h3>
- <div class="example">
-<pre>
-tinyMCE.init({
- ...
- <strong>font_size_classes : "fontSize1,fontSize2,fontSize3,fontSize4,fontSize5,fontSize6,fontSize7"</strong>
-});
-</pre>
- </div>
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/option_font_size_classes.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/option_font_size_classes.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/option_font_size_classes.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/option_font_size_classes.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,35 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Option: font_size_classes</title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+ <h1>Option: font_size_classes</h1>
+</div>
+
+<div class="content">
+ <p>Comma separated list of class names that is to be used when the user selects font sizes, this option is only used when the <a href="option_convert_fonts_to_spans.html">convert_fonts_to_spans</a> option is enabled. This list of classes should be 7 items. This option is not used by default, but can be useful if you want to have custom classes for each font size for browser compatiblity.</p>
+ <div class="separator"></div>
+
+ <h3>Example of usage of the font_size_classes option:</h3>
+ <div class="example">
+<pre>
+tinyMCE.init({
+ ...
+ <strong>font_size_classes : "fontSize1,fontSize2,fontSize3,fontSize4,fontSize5,fontSize6,fontSize7"</strong>
+});
+</pre>
+ </div>
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/option_font_size_style_values.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/option_font_size_style_values.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/option_font_size_style_values.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,35 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Option: font_size_style_values</title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
- <h1>Option: font_size_style_values</h1>
-</div>
-
-<div class="content">
- <p>Comma separated list of style values that is to be used when the user selects font sizes, this option is only used when the <a href="option_convert_fonts_to_spans.html">convert_fonts_to_spans</a> option is enabled. This list of style values should be 7 items. This option is not used by default, but can be useful if you want to have custom CSS values for each font size for browser compatiblity. Defaults to: xx-small,x-small,small,medium,large,x-large,xx-large.</p>
- <div class="separator"></div>
-
- <h3>Example of usage of the font_size_style_values option:</h3>
- <div class="example">
-<pre>
-tinyMCE.init({
- ...
- <strong>font_size_style_values : "xx-small,x-small,small,medium,large,x-large,xx-large"</strong>
-});
-</pre>
- </div>
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/option_font_size_style_values.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/option_font_size_style_values.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/option_font_size_style_values.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/option_font_size_style_values.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,35 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Option: font_size_style_values</title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+ <h1>Option: font_size_style_values</h1>
+</div>
+
+<div class="content">
+ <p>Comma separated list of style values that is to be used when the user selects font sizes, this option is only used when the <a href="option_convert_fonts_to_spans.html">convert_fonts_to_spans</a> option is enabled. This list of style values should be 7 items. This option is not used by default, but can be useful if you want to have custom CSS values for each font size for browser compatiblity. Defaults to: xx-small,x-small,small,medium,large,x-large,xx-large.</p>
+ <div class="separator"></div>
+
+ <h3>Example of usage of the font_size_style_values option:</h3>
+ <div class="example">
+<pre>
+tinyMCE.init({
+ ...
+ <strong>font_size_style_values : "xx-small,x-small,small,medium,large,x-large,xx-large"</strong>
+});
+</pre>
+ </div>
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/option_force_br_newlines.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/option_force_br_newlines.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/option_force_br_newlines.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,38 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Option: force_br_newlines</title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
- <h1>Option: force_br_newlines</h1>
-</div>
-
-<div class="content">
- <p>
- If you set this option to true, TinyMCE will force BR elements on newlines instead of inserting paragraphs. This option is set to false by default since paragraphs is a much better concept. You can style P elements to be one row by adding p { margin: 0; padding: 0; } to your CSS, P tags where invented for a reason and should be used. <strong>BR elements should only be used when you really have to (mostly never)</strong>.
- </p>
-
- <div class="separator"></div>
-
- <h3>Example of usage of the force_br_newlines option:</h3>
- <div class="example">
-<pre>
-tinyMCE.init({
- ...
- <strong>force_br_newlines : true</strong>
-});
-</pre>
- </div>
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/option_force_br_newlines.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/option_force_br_newlines.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/option_force_br_newlines.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/option_force_br_newlines.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,38 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Option: force_br_newlines</title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+ <h1>Option: force_br_newlines</h1>
+</div>
+
+<div class="content">
+ <p>
+ If you set this option to true, TinyMCE will force BR elements on newlines instead of inserting paragraphs. This option is set to false by default since paragraphs is a much better concept. You can style P elements to be one row by adding p { margin: 0; padding: 0; } to your CSS, P tags where invented for a reason and should be used. <strong>BR elements should only be used when you really have to (mostly never)</strong>.
+ </p>
+
+ <div class="separator"></div>
+
+ <h3>Example of usage of the force_br_newlines option:</h3>
+ <div class="example">
+<pre>
+tinyMCE.init({
+ ...
+ <strong>force_br_newlines : true</strong>
+});
+</pre>
+ </div>
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/option_force_hex_style_colors.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/option_force_hex_style_colors.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/option_force_hex_style_colors.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,35 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Option: force_hex_style_colors</title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
- <h1>Option: force_hex_style_colors</h1>
-</div>
-
-<div class="content">
- <p>This option enables you to control TinyMCE to force the color format to use hexa decimal instead of rgb strings. It converts for example "color: rgb(255, 255, 0)" to "#FFFF00". This option is set to true by default since otherwice MSIE and Firefox would differ in this behavior.</p>
- <div class="separator"></div>
-
- <h3>Example of usage of the force_hex_style_colors option:</h3>
- <div class="example">
-<pre>
-tinyMCE.init({
- ...
- <strong>force_hex_style_colors : false</strong>
-});
-</pre>
- </div>
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/option_force_hex_style_colors.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/option_force_hex_style_colors.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/option_force_hex_style_colors.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/option_force_hex_style_colors.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,35 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Option: force_hex_style_colors</title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+ <h1>Option: force_hex_style_colors</h1>
+</div>
+
+<div class="content">
+ <p>This option enables you to control TinyMCE to force the color format to use hexa decimal instead of rgb strings. It converts for example "color: rgb(255, 255, 0)" to "#FFFF00". This option is set to true by default since otherwice MSIE and Firefox would differ in this behavior.</p>
+ <div class="separator"></div>
+
+ <h3>Example of usage of the force_hex_style_colors option:</h3>
+ <div class="example">
+<pre>
+tinyMCE.init({
+ ...
+ <strong>force_hex_style_colors : false</strong>
+});
+</pre>
+ </div>
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/option_force_p_newlines.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/option_force_p_newlines.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/option_force_p_newlines.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,38 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Option: force_p_newlines</title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
- <h1>Option: force_p_newlines</h1>
-</div>
-
-<div class="content">
- <p>
- This option enables you to disable/enable the creation of paragraphs on return/enter in Mozilla/Firefox. The default value of this option is true.
- </p>
-
- <div class="separator"></div>
-
- <h3>Example of usage of the force_p_newlines option:</h3>
- <div class="example">
-<pre>
-tinyMCE.init({
- ...
- <strong>force_p_newlines : true</strong>
-});
-</pre>
- </div>
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/option_force_p_newlines.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/option_force_p_newlines.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/option_force_p_newlines.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/option_force_p_newlines.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,38 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Option: force_p_newlines</title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+ <h1>Option: force_p_newlines</h1>
+</div>
+
+<div class="content">
+ <p>
+ This option enables you to disable/enable the creation of paragraphs on return/enter in Mozilla/Firefox. The default value of this option is true.
+ </p>
+
+ <div class="separator"></div>
+
+ <h3>Example of usage of the force_p_newlines option:</h3>
+ <div class="example">
+<pre>
+tinyMCE.init({
+ ...
+ <strong>force_p_newlines : true</strong>
+});
+</pre>
+ </div>
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/option_handle_event_callback.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/option_handle_event_callback.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/option_handle_event_callback.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,46 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Option: handle_event_callback</title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
- <h1>Option: handle_event_callback</h1>
-</div>
-
-<div class="content">
- <p>
- This option should contain a function name to be executed each time TinyMCE intercepts and handles a event such as keydown, mousedown and so forth. The format of this function is: handleEvent(event), where inst is the editor instance object reference. If the handle event function returns false it will terminate the internal event handling.
- </p>
-
- <div class="separator"></div>
-
- <h3>Example of usage of the handle_event_callback option:</h3>
- <div class="example">
-<pre>
-// Remember to enable the possibility to switch status messages in the browser before trying the example below
-
-function <strong>myHandleEvent</strong>(e) {
- window.status = "event:" + e.type;
-
- return true; // Continue handling
-}
-
-tinyMCE.init({
- ...
- <strong>handle_event_callback : "myHandleEvent"</strong>
-});
-</pre>
- </div>
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/option_handle_event_callback.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/option_handle_event_callback.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/option_handle_event_callback.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/option_handle_event_callback.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,46 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Option: handle_event_callback</title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+ <h1>Option: handle_event_callback</h1>
+</div>
+
+<div class="content">
+ <p>
+ This option should contain a function name to be executed each time TinyMCE intercepts and handles a event such as keydown, mousedown and so forth. The format of this function is: handleEvent(event), where inst is the editor instance object reference. If the handle event function returns false it will terminate the internal event handling.
+ </p>
+
+ <div class="separator"></div>
+
+ <h3>Example of usage of the handle_event_callback option:</h3>
+ <div class="example">
+<pre>
+// Remember to enable the possibility to switch status messages in the browser before trying the example below
+
+function <strong>myHandleEvent</strong>(e) {
+ window.status = "event:" + e.type;
+
+ return true; // Continue handling
+}
+
+tinyMCE.init({
+ ...
+ <strong>handle_event_callback : "myHandleEvent"</strong>
+});
+</pre>
+ </div>
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/option_height.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/option_height.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/option_height.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,38 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Option: height</title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
- <h1>Option: height</h1>
-</div>
-
-<div class="content">
- <p>
- This option gives you the ability to specify the height of the editor in pixels or percent. This height can be very userful to specify if the editor is used in hidden tabs or if the editor area should be bigger than the replaced element. The default value of this option is set to the height of the HTML element TinyMCE replaces for example the pixel height of a textarea.
- </p>
-
- <div class="separator"></div>
-
- <h3>Example of usage of the height option:</h3>
- <div class="example">
-<pre>
-tinyMCE.init({
- ...
- <strong>height : "480"</strong>
-});
-</pre>
- </div>
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/option_height.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/option_height.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/option_height.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/option_height.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,38 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Option: height</title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+ <h1>Option: height</h1>
+</div>
+
+<div class="content">
+ <p>
+ This option gives you the ability to specify the height of the editor in pixels or percent. This height can be very userful to specify if the editor is used in hidden tabs or if the editor area should be bigger than the replaced element. The default value of this option is set to the height of the HTML element TinyMCE replaces for example the pixel height of a textarea.
+ </p>
+
+ <div class="separator"></div>
+
+ <h3>Example of usage of the height option:</h3>
+ <div class="example">
+<pre>
+tinyMCE.init({
+ ...
+ <strong>height : "480"</strong>
+});
+</pre>
+ </div>
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/option_hidden_tab_class.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/option_hidden_tab_class.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/option_hidden_tab_class.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,38 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Option: hidden_tab_class</title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
- <h1>Option: hidden_tab_class</h1>
-</div>
-
-<div class="content">
- <p>
- This option is useful when TinyMCE is used within tabs in MSIE. This property is needed since MSIE has a bug where it's impossible to retrive the width/height on elements like images while it's hidden using display:none. So use this property to define the class name that is used to hide a specific tab, this will help TinyMCE to display the tab while getting the image data.
- </p>
-
- <div class="separator"></div>
-
- <h3>Example of usage of the hidden_tab_class option:</h3>
- <div class="example">
-<pre>
-tinyMCE.init({
- ...
- <strong>hidden_tab_class : "hideTab"</strong>
-});
-</pre>
- </div>
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/option_hidden_tab_class.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/option_hidden_tab_class.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/option_hidden_tab_class.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/option_hidden_tab_class.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,38 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Option: hidden_tab_class</title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+ <h1>Option: hidden_tab_class</h1>
+</div>
+
+<div class="content">
+ <p>
+ This option is useful when TinyMCE is used within tabs in MSIE. This property is needed since MSIE has a bug where it's impossible to retrive the width/height on elements like images while it's hidden using display:none. So use this property to define the class name that is used to hide a specific tab, this will help TinyMCE to display the tab while getting the image data.
+ </p>
+
+ <div class="separator"></div>
+
+ <h3>Example of usage of the hidden_tab_class option:</h3>
+ <div class="example">
+<pre>
+tinyMCE.init({
+ ...
+ <strong>hidden_tab_class : "hideTab"</strong>
+});
+</pre>
+ </div>
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/option_init_instance_callback.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/option_init_instance_callback.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/option_init_instance_callback.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,42 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Option: init_instance_callback</title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
- <h1>Option: init_instance_callback</h1>
-</div>
-
-<div class="content">
- <p>
- This option should contain a function name to be executed each time a editor instance is initialized. The format of this function is: initInstance(inst) where inst is the editor instance object reference.
- </p>
-
- <div class="separator"></div>
-
- <h3>Example of usage of the init_instance_callback option:</h3>
- <div class="example">
-<pre>
-function <strong>myCustomInitInstance</strong>(inst) {
- alert("Editor: " + inst.editorId + " is now initialized.");
-}
-
-tinyMCE.init({
- ...
- <strong>init_instance_callback : "myCustomInitInstance"</strong>
-});
-</pre>
- </div>
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/option_init_instance_callback.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/option_init_instance_callback.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/option_init_instance_callback.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/option_init_instance_callback.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,42 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Option: init_instance_callback</title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+ <h1>Option: init_instance_callback</h1>
+</div>
+
+<div class="content">
+ <p>
+ This option should contain a function name to be executed each time a editor instance is initialized. The format of this function is: initInstance(inst) where inst is the editor instance object reference.
+ </p>
+
+ <div class="separator"></div>
+
+ <h3>Example of usage of the init_instance_callback option:</h3>
+ <div class="example">
+<pre>
+function <strong>myCustomInitInstance</strong>(inst) {
+ alert("Editor: " + inst.editorId + " is now initialized.");
+}
+
+tinyMCE.init({
+ ...
+ <strong>init_instance_callback : "myCustomInitInstance"</strong>
+});
+</pre>
+ </div>
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/option_inline_styles.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/option_inline_styles.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/option_inline_styles.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,38 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Option: inline_styles</title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
- <h1>Option: inline_styles</h1>
-</div>
-
-<div class="content">
- <p>
- If you enable the inline styles feature by setting this option to true. Most of the attributes gets converted into CSS style attributes instead. This will make the editor output more XHTML strict compatible.
- </p>
-
- <div class="separator"></div>
-
- <h3>Example of usage of the inline_styles option:</h3>
- <div class="example">
-<pre>
-tinyMCE.init({
- ...
- <strong>inline_styles : true</strong>
-});
-</pre>
- </div>
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/option_inline_styles.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/option_inline_styles.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/option_inline_styles.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/option_inline_styles.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,38 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Option: inline_styles</title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+ <h1>Option: inline_styles</h1>
+</div>
+
+<div class="content">
+ <p>
+ If you enable the inline styles feature by setting this option to true. Most of the attributes gets converted into CSS style attributes instead. This will make the editor output more XHTML strict compatible.
+ </p>
+
+ <div class="separator"></div>
+
+ <h3>Example of usage of the inline_styles option:</h3>
+ <div class="example">
+<pre>
+tinyMCE.init({
+ ...
+ <strong>inline_styles : true</strong>
+});
+</pre>
+ </div>
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/option_insertimage_callback.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/option_insertimage_callback.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/option_insertimage_callback.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,60 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Option: insertimage_callback</title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
- <h1><span class="marked">(deprecated)</span> Option: insertimage_callback</h1>
-</div>
-
-<div class="content">
- <p>
- This callback was removed in 2.0.3, use <a href="option_execcommand_callback.html">execcommand_callback</a> instead this also enables you to override other things than the image and link dialogs.
- </p>
- <p>
- This option enables you to override the built in functionality for inserting images. This option should contain a function name to be executed when a new image is inserted into TinyMCE. The format of this callback function is: insertImage(src, alt, border, hspace, vspace, width, height, align, title, onmouseover, onmouseout, action). Where most of these options are self explained the action can be "update" or "insert" depending on what operation type. This function should return an array with the same values as the incomming parameters, the example below describes how this is done. This option is set to a internal TinyMCE function by default.
- </p>
-
- <div class="separator"></div>
-
- <h3>Example of usage of the insertimage_callback option:</h3>
- <div class="example">
-<pre>
-function <strong>myCustomInsertImage</strong>(src, alt, border, hspace, vspace, width, height, align, title, onmouseover, onmouseout, action) {
- var result = new Array();
-
- // Do some custom logic
- result['src'] = "logo.jpg";
- result['alt'] = "test description";
- result['border'] = "2";
- result['hspace'] = "5";
- result['vspace'] = "5";
- result['width'] = width;
- result['height'] = height;
- result['align'] = "right";
- result['title'] = "Some title";
- result['onmouseover'] = "";
- result['onmouseout'] = "";
-
- return data;
-}
-
-tinyMCE.init({
- ...
- <strong>insertimage_callback : "myCustomInsertImage"</strong>
-});
-</pre>
- </div>
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/option_insertimage_callback.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/option_insertimage_callback.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/option_insertimage_callback.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/option_insertimage_callback.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,60 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Option: insertimage_callback</title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+ <h1><span class="marked">(deprecated)</span> Option: insertimage_callback</h1>
+</div>
+
+<div class="content">
+ <p>
+ This callback was removed in 2.0.3, use <a href="option_execcommand_callback.html">execcommand_callback</a> instead this also enables you to override other things than the image and link dialogs.
+ </p>
+ <p>
+ This option enables you to override the built in functionality for inserting images. This option should contain a function name to be executed when a new image is inserted into TinyMCE. The format of this callback function is: insertImage(src, alt, border, hspace, vspace, width, height, align, title, onmouseover, onmouseout, action). Where most of these options are self explained the action can be "update" or "insert" depending on what operation type. This function should return an array with the same values as the incomming parameters, the example below describes how this is done. This option is set to a internal TinyMCE function by default.
+ </p>
+
+ <div class="separator"></div>
+
+ <h3>Example of usage of the insertimage_callback option:</h3>
+ <div class="example">
+<pre>
+function <strong>myCustomInsertImage</strong>(src, alt, border, hspace, vspace, width, height, align, title, onmouseover, onmouseout, action) {
+ var result = new Array();
+
+ // Do some custom logic
+ result['src'] = "logo.jpg";
+ result['alt'] = "test description";
+ result['border'] = "2";
+ result['hspace'] = "5";
+ result['vspace'] = "5";
+ result['width'] = width;
+ result['height'] = height;
+ result['align'] = "right";
+ result['title'] = "Some title";
+ result['onmouseover'] = "";
+ result['onmouseout'] = "";
+
+ return data;
+}
+
+tinyMCE.init({
+ ...
+ <strong>insertimage_callback : "myCustomInsertImage"</strong>
+});
+</pre>
+ </div>
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/option_insertlink_callback.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/option_insertlink_callback.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/option_insertlink_callback.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,53 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Option: insertlink_callback</title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
- <h1><span class="marked">(deprecated)</span> Option: insertlink_callback</h1>
-</div>
-
-<div class="content">
- <p>
- This callback was removed in 2.0.3, use <a href="option_execcommand_callback.html">execcommand_callback</a> instead this also enables you to override other things than the image and link dialogs.
- </p>
- <p>
- This option enables you to override the built in functionality for inserting links. This option should contain a function name to be executed when a new link is inserted into TinyMCE. The format of this callback function is: insertLink(href, target, title, onclick, action). Where most of these options are self explained the action can be "update" or "insert" depending on what operation type. This function should return an array with the same values as the incomming parameters, the example below describes how this is done. This option is set to a internal TinyMCE function by default.
- </p>
-
- <div class="separator"></div>
-
- <h3>Example of usage of the insertlink_callback option:</h3>
- <div class="example">
-<pre>
-function <strong>myCustomInsertLink</strong>(href, target, title, onclick, action) {
- var result = new Array();
-
- // Do some custom logic
- result['href'] = "some_page.htm";
- result['target'] = "_self";
- result['title'] = "Some link title";
- result['onclick'] = "";
-
- return data;
-}
-
-tinyMCE.init({
- ...
- <strong>insertlink_callback : "myCustomInsertLink"</strong>
-});
-</pre>
- </div>
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/option_insertlink_callback.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/option_insertlink_callback.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/option_insertlink_callback.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/option_insertlink_callback.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,53 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Option: insertlink_callback</title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+ <h1><span class="marked">(deprecated)</span> Option: insertlink_callback</h1>
+</div>
+
+<div class="content">
+ <p>
+ This callback was removed in 2.0.3, use <a href="option_execcommand_callback.html">execcommand_callback</a> instead this also enables you to override other things than the image and link dialogs.
+ </p>
+ <p>
+ This option enables you to override the built in functionality for inserting links. This option should contain a function name to be executed when a new link is inserted into TinyMCE. The format of this callback function is: insertLink(href, target, title, onclick, action). Where most of these options are self explained the action can be "update" or "insert" depending on what operation type. This function should return an array with the same values as the incomming parameters, the example below describes how this is done. This option is set to a internal TinyMCE function by default.
+ </p>
+
+ <div class="separator"></div>
+
+ <h3>Example of usage of the insertlink_callback option:</h3>
+ <div class="example">
+<pre>
+function <strong>myCustomInsertLink</strong>(href, target, title, onclick, action) {
+ var result = new Array();
+
+ // Do some custom logic
+ result['href'] = "some_page.htm";
+ result['target'] = "_self";
+ result['title'] = "Some link title";
+ result['onclick'] = "";
+
+ return data;
+}
+
+tinyMCE.init({
+ ...
+ <strong>insertlink_callback : "myCustomInsertLink"</strong>
+});
+</pre>
+ </div>
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/option_invalid_elements.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/option_invalid_elements.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/option_invalid_elements.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,38 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Option: invalid_elements</title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
- <h1>Option: invalid_elements</h1>
-</div>
-
-<div class="content">
- <p>
- This option should contain a comma separated list of element names to exclude from the content. Elements in this list will removed when TinyMCE executes a cleanup.
- </p>
-
- <div class="separator"></div>
-
- <h3>Example of usage of the invalid_elements option:</h3>
- <div class="example">
-<pre>
-tinyMCE.init({
- ...
- <strong>invalid_elements : "strong,em"</strong>
-});
-</pre>
- </div>
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/option_invalid_elements.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/option_invalid_elements.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/option_invalid_elements.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/option_invalid_elements.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,38 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Option: invalid_elements</title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+ <h1>Option: invalid_elements</h1>
+</div>
+
+<div class="content">
+ <p>
+ This option should contain a comma separated list of element names to exclude from the content. Elements in this list will removed when TinyMCE executes a cleanup.
+ </p>
+
+ <div class="separator"></div>
+
+ <h3>Example of usage of the invalid_elements option:</h3>
+ <div class="example">
+<pre>
+tinyMCE.init({
+ ...
+ <strong>invalid_elements : "strong,em"</strong>
+});
+</pre>
+ </div>
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/option_language.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/option_language.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/option_language.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,42 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Option: language</title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
- <h1>Option: language</h1>
-</div>
-
-<div class="content">
- <p>
- This option should contain a language code of the language pack to use with TinyMCE. These codes are in <a href="http://www.loc.gov/standards/iso639-2/englangn.html">ISO-639-1</a> format to see if your language is available check the contents of "tinymce/jscripts/tiny_mce/langs". The default value of this option is "en" for English.
- </p>
-
- <p>
- If TinyMCE doesn't have a language pack for your language you could always write your own and contribute this back to this project by uploading it as a Patch at <a href="http://sourceforge.net/projects/tinymce/">SourceForge</a>. A description on how to create language packs can be found in <a href="customization_language_packs.html">Language packs</a> section.
- </p>
-
- <div class="separator"></div>
-
- <h3>Example of usage of the language option:</h3>
- <div class="example">
-<pre>
-tinyMCE.init({
- ...
- <strong>language : "en"</strong>
-});
-</pre>
- </div>
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/option_language.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/option_language.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/option_language.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/option_language.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,42 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Option: language</title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+ <h1>Option: language</h1>
+</div>
+
+<div class="content">
+ <p>
+ This option should contain a language code of the language pack to use with TinyMCE. These codes are in <a href="http://www.loc.gov/standards/iso639-2/englangn.html">ISO-639-1</a> format to see if your language is available check the contents of "tinymce/jscripts/tiny_mce/langs". The default value of this option is "en" for English.
+ </p>
+
+ <p>
+ If TinyMCE doesn't have a language pack for your language you could always write your own and contribute this back to this project by uploading it as a Patch at <a href="http://sourceforge.net/projects/tinymce/">SourceForge</a>. A description on how to create language packs can be found in <a href="customization_language_packs.html">Language packs</a> section.
+ </p>
+
+ <div class="separator"></div>
+
+ <h3>Example of usage of the language option:</h3>
+ <div class="example">
+<pre>
+tinyMCE.init({
+ ...
+ <strong>language : "en"</strong>
+});
+</pre>
+ </div>
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/option_merge_styles_invalid_parents.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/option_merge_styles_invalid_parents.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/option_merge_styles_invalid_parents.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,37 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Option: merge_styles_invalid_parents</title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
- <h1>Option: merge_styles_invalid_parents</h1>
-</div>
-
-<div class="content">
- <p>This option enables you to specify a regexp with elements you want to exclude from parent mergeing. By default style information are attached to the parent element of a selection if all childrent/the whole element contents is selected. For example if you select a whole strong element and select a font size, the font-size style will be applied to the strong element and not with a wrapping style element. But sometimes you want to force a span element, this is where this option comes in to place. This option is set to nothing by default and applies to the font size/face/color and class drop drown lists.</p>
-
- <div class="separator"></div>
-
- <h3>Example of usage of the merge_styles_invalid_parents option:</h3>
- <div class="example">
-<pre>
-tinyMCE.init({
- ...
- // Excludes table cells and strong elements from any parent merge operation
- <strong>merge_styles_invalid_parents : "^TD|STRONG$"</strong>
-});
-</pre>
- </div>
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/option_merge_styles_invalid_parents.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/option_merge_styles_invalid_parents.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/option_merge_styles_invalid_parents.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/option_merge_styles_invalid_parents.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Option: merge_styles_invalid_parents</title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+ <h1>Option: merge_styles_invalid_parents</h1>
+</div>
+
+<div class="content">
+ <p>This option enables you to specify a regexp with elements you want to exclude from parent mergeing. By default style information are attached to the parent element of a selection if all childrent/the whole element contents is selected. For example if you select a whole strong element and select a font size, the font-size style will be applied to the strong element and not with a wrapping style element. But sometimes you want to force a span element, this is where this option comes in to place. This option is set to nothing by default and applies to the font size/face/color and class drop drown lists.</p>
+
+ <div class="separator"></div>
+
+ <h3>Example of usage of the merge_styles_invalid_parents option:</h3>
+ <div class="example">
+<pre>
+tinyMCE.init({
+ ...
+ // Excludes table cells and strong elements from any parent merge operation
+ <strong>merge_styles_invalid_parents : "^TD|STRONG$"</strong>
+});
+</pre>
+ </div>
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/option_mode.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/option_mode.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/option_mode.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,54 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Option: mode</title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
- <h1>Option: mode</h1>
-</div>
-
-<div class="content">
- <p>
- This option specifies how elements is to be converted into TinyMCE WYSIWYG editor instances. This option can be set to any of the values below.
- </p>
-
- <p>
- <h3>textareas</h3>
- Converts all textarea elements to editors when the page loads.
- </p>
-
- <p>
- <h3>specific_textareas</h3>
- Converts all textarea elements with the a <a href="option_textarea_trigger.html">textarea_trigger</a> attribute set to "true".
- </p>
-
- <p>
- <h3>exact</h3>
- exact - Converts only explicit elements, these are listed in the <a href="option_elements.html">elements</a> option. These elements can be any kind for example textareas or divs.
- </p>
-
- <div class="separator"></div>
-
- <h3>Example of usage of the mode option:</h3>
- <div class="example">
-<pre>
-tinyMCE.init({
- ...
- <strong>mode : "exact",</strong>
- elements : "elm1,elm2"
-});
-</pre>
- </div>
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/option_mode.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/option_mode.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/option_mode.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/option_mode.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,54 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Option: mode</title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+ <h1>Option: mode</h1>
+</div>
+
+<div class="content">
+ <p>
+ This option specifies how elements is to be converted into TinyMCE WYSIWYG editor instances. This option can be set to any of the values below.
+ </p>
+
+ <p>
+ <h3>textareas</h3>
+ Converts all textarea elements to editors when the page loads.
+ </p>
+
+ <p>
+ <h3>specific_textareas</h3>
+ Converts all textarea elements with the a <a href="option_textarea_trigger.html">textarea_trigger</a> attribute set to "true".
+ </p>
+
+ <p>
+ <h3>exact</h3>
+ exact - Converts only explicit elements, these are listed in the <a href="option_elements.html">elements</a> option. These elements can be any kind for example textareas or divs.
+ </p>
+
+ <div class="separator"></div>
+
+ <h3>Example of usage of the mode option:</h3>
+ <div class="example">
+<pre>
+tinyMCE.init({
+ ...
+ <strong>mode : "exact",</strong>
+ elements : "elm1,elm2"
+});
+</pre>
+ </div>
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/option_nowrap.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/option_nowrap.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/option_nowrap.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,38 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Option: nowrap</title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
- <h1>Option: nowrap</h1>
-</div>
-
-<div class="content">
- <p>
- This nowrap option enables you to control how whitespace is to be wordwrapped within the editor. This option is set to false by default, but if you enable it by setting it to true editor contents will never wrap.
- </p>
-
- <div class="separator"></div>
-
- <h3>Example of usage of the nowrap option:</h3>
- <div class="example">
-<pre>
-tinyMCE.init({
- ...
- <strong>nowrap : true</strong>
-});
-</pre>
- </div>
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/option_nowrap.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/option_nowrap.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/option_nowrap.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/option_nowrap.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,38 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Option: nowrap</title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+ <h1>Option: nowrap</h1>
+</div>
+
+<div class="content">
+ <p>
+ This nowrap option enables you to control how whitespace is to be wordwrapped within the editor. This option is set to false by default, but if you enable it by setting it to true editor contents will never wrap.
+ </p>
+
+ <div class="separator"></div>
+
+ <h3>Example of usage of the nowrap option:</h3>
+ <div class="example">
+<pre>
+tinyMCE.init({
+ ...
+ <strong>nowrap : true</strong>
+});
+</pre>
+ </div>
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/option_object_resizing.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/option_object_resizing.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/option_object_resizing.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,38 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Option: object_resizing</title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
- <h1>Option: object_resizing</h1>
-</div>
-
-<div class="content">
- <p>
- This true/false option gives you the ability to turn on/off the inline resizing controls of tables and images in Firefox/Mozilla. These are enabled by default.
- </p>
-
- <div class="separator"></div>
-
- <h3>Example of usage of the object_resizing option:</h3>
- <div class="example">
-<pre>
-tinyMCE.init({
- ...
- <strong>object_resizing : false</strong>
-});
-</pre>
- </div>
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/option_object_resizing.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/option_object_resizing.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/option_object_resizing.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/option_object_resizing.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,38 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Option: object_resizing</title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+ <h1>Option: object_resizing</h1>
+</div>
+
+<div class="content">
+ <p>
+ This true/false option gives you the ability to turn on/off the inline resizing controls of tables and images in Firefox/Mozilla. These are enabled by default.
+ </p>
+
+ <div class="separator"></div>
+
+ <h3>Example of usage of the object_resizing option:</h3>
+ <div class="example">
+<pre>
+tinyMCE.init({
+ ...
+ <strong>object_resizing : false</strong>
+});
+</pre>
+ </div>
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/option_onchange_callback.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/option_onchange_callback.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/option_onchange_callback.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,43 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Option: onchange_callback</title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
- <h1>Option: onchange_callback</h1>
-</div>
-
-<div class="content">
- <p>
- This option should contain a function name to be executed each time contents is modified by TinyMCE. This function is called each time a undo level is added to TinyMCE. The format of this function is: onchange(inst), where inst is the editor instance object reference.
- </p>
-
- <div class="separator"></div>
-
- <h3>Example of usage of the onchange_callback option:</h3>
- <div class="example">
-<pre>
-function <strong>myCustomOnChangeHandler</strong>(inst) {
- alert("Some one modified something");
- alert("The HTML is now:" + inst.getBody().innerHTML);
-}
-
-tinyMCE.init({
- ...
- <strong>onchange_callback : "myCustomOnChangeHandler"</strong>
-});
-</pre>
- </div>
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/option_onchange_callback.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/option_onchange_callback.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/option_onchange_callback.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/option_onchange_callback.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,43 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Option: onchange_callback</title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+ <h1>Option: onchange_callback</h1>
+</div>
+
+<div class="content">
+ <p>
+ This option should contain a function name to be executed each time contents is modified by TinyMCE. This function is called each time a undo level is added to TinyMCE. The format of this function is: onchange(inst), where inst is the editor instance object reference.
+ </p>
+
+ <div class="separator"></div>
+
+ <h3>Example of usage of the onchange_callback option:</h3>
+ <div class="example">
+<pre>
+function <strong>myCustomOnChangeHandler</strong>(inst) {
+ alert("Some one modified something");
+ alert("The HTML is now:" + inst.getBody().innerHTML);
+}
+
+tinyMCE.init({
+ ...
+ <strong>onchange_callback : "myCustomOnChangeHandler"</strong>
+});
+</pre>
+ </div>
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/option_oninit.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/option_oninit.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/option_oninit.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,42 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Option: oninit</title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
- <h1>Option: oninit</h1>
-</div>
-
-<div class="content">
- <p>
- This option enables you to specify a function name to be executed when all editor instances has finished it's initialization. This is much like the onload event of a HTML page.
- </p>
-
- <div class="separator"></div>
-
- <h3>Example of usage of the oninit option:</h3>
- <div class="example">
-<pre>
-function <strong>myCustomOnInit</strong>() {
- alert("We are ready to rumble!!");
-}
-
-tinyMCE.init({
- ...
- <strong>oninit : "myCustomOnInit"</strong>
-});
-</pre>
- </div>
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/option_oninit.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/option_oninit.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/option_oninit.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/option_oninit.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,42 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Option: oninit</title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+ <h1>Option: oninit</h1>
+</div>
+
+<div class="content">
+ <p>
+ This option enables you to specify a function name to be executed when all editor instances has finished it's initialization. This is much like the onload event of a HTML page.
+ </p>
+
+ <div class="separator"></div>
+
+ <h3>Example of usage of the oninit option:</h3>
+ <div class="example">
+<pre>
+function <strong>myCustomOnInit</strong>() {
+ alert("We are ready to rumble!!");
+}
+
+tinyMCE.init({
+ ...
+ <strong>oninit : "myCustomOnInit"</strong>
+});
+</pre>
+ </div>
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/option_onpageload.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/option_onpageload.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/option_onpageload.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,42 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Option: onpageload</title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
- <h1>Option: onpageload</h1>
-</div>
-
-<div class="content">
- <p>
- This option enables you to specify a function name to be executed when the page is loaded but before the TinyMCE instances are created.
- </p>
-
- <div class="separator"></div>
-
- <h3>Example of usage of the onpageload option:</h3>
- <div class="example">
-<pre>
-function <strong>myCustomOnPageLoad</strong>() {
- alert("We are nearly ready to rumble!!");
-}
-
-tinyMCE.init({
- ...
- <strong>onpageload : "myCustomOnPageLoad"</strong>
-});
-</pre>
- </div>
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/option_onpageload.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/option_onpageload.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/option_onpageload.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/option_onpageload.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,42 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Option: onpageload</title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+ <h1>Option: onpageload</h1>
+</div>
+
+<div class="content">
+ <p>
+ This option enables you to specify a function name to be executed when the page is loaded but before the TinyMCE instances are created.
+ </p>
+
+ <div class="separator"></div>
+
+ <h3>Example of usage of the onpageload option:</h3>
+ <div class="example">
+<pre>
+function <strong>myCustomOnPageLoad</strong>() {
+ alert("We are nearly ready to rumble!!");
+}
+
+tinyMCE.init({
+ ...
+ <strong>onpageload : "myCustomOnPageLoad"</strong>
+});
+</pre>
+ </div>
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/option_plugins.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/option_plugins.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/option_plugins.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,45 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Option: plugins</title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
- <h1>Option: plugins</h1>
-</div>
-
-<div class="content">
- <p>
- This option should contain a comma separated list of plugins. Plugins are loaded from the "tinymce/jscripts/tiny_mce/plugins" directory and the plugin name matches the name of the directory. TinyMCE is shipped with some core plugins these are described in greater detail in the <a href="reference_plugins.html">Plugins reference</a>.
- </p>
- <p>
- TinyMCE also supports the ability to have plugins added from a external resource, these plugins needs to be self registrering and loaded after the tinyMCE.init call. You should also prefix these plugins with a "-" character so that TinyMCE doesn't try to load it from the TinyMCE plugins directory.
- </p>
-
- <p>
- There are many third party plugins for TinyMCE some of these may be found under "Plugins" at <a href="http://sourceforge.net/projects/tinymce/">SourceForge</a> and if you have developed one of your own please contribute it to this project by uploading it to SourceForge.
- </p>
-
- <div class="separator"></div>
-
- <h3>Example of usage of the plugins option:</h3>
- <div class="example">
-<pre>
-tinyMCE.init({
- ...
- <strong>plugins : "table,contextmenu,paste,-externalplugin"</strong>
-});
-</pre>
- </div>
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/option_plugins.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/option_plugins.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/option_plugins.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/option_plugins.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,45 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Option: plugins</title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+ <h1>Option: plugins</h1>
+</div>
+
+<div class="content">
+ <p>
+ This option should contain a comma separated list of plugins. Plugins are loaded from the "tinymce/jscripts/tiny_mce/plugins" directory and the plugin name matches the name of the directory. TinyMCE is shipped with some core plugins these are described in greater detail in the <a href="reference_plugins.html">Plugins reference</a>.
+ </p>
+ <p>
+ TinyMCE also supports the ability to have plugins added from a external resource, these plugins needs to be self registrering and loaded after the tinyMCE.init call. You should also prefix these plugins with a "-" character so that TinyMCE doesn't try to load it from the TinyMCE plugins directory.
+ </p>
+
+ <p>
+ There are many third party plugins for TinyMCE some of these may be found under "Plugins" at <a href="http://sourceforge.net/projects/tinymce/">SourceForge</a> and if you have developed one of your own please contribute it to this project by uploading it to SourceForge.
+ </p>
+
+ <div class="separator"></div>
+
+ <h3>Example of usage of the plugins option:</h3>
+ <div class="example">
+<pre>
+tinyMCE.init({
+ ...
+ <strong>plugins : "table,contextmenu,paste,-externalplugin"</strong>
+});
+</pre>
+ </div>
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/option_popups_css.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/option_popups_css.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/option_popups_css.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,38 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Option: popups_css</title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
- <h1>Option: popups_css</h1>
-</div>
-
-<div class="content">
- <p>
- This option enables you to specify the CSS to be used in all popup/dialog windows within TinyMCE this option is set to a CSS file found in the currently used theme by default.
- </p>
-
- <div class="separator"></div>
-
- <h3>Example of usage of the popups_css option:</h3>
- <div class="example">
-<pre>
-tinyMCE.init({
- ...
- <strong>popups_css : "/mypopup.css"</strong>
-});
-</pre>
- </div>
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/option_popups_css.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/option_popups_css.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/option_popups_css.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/option_popups_css.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,38 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Option: popups_css</title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+ <h1>Option: popups_css</h1>
+</div>
+
+<div class="content">
+ <p>
+ This option enables you to specify the CSS to be used in all popup/dialog windows within TinyMCE this option is set to a CSS file found in the currently used theme by default.
+ </p>
+
+ <div class="separator"></div>
+
+ <h3>Example of usage of the popups_css option:</h3>
+ <div class="example">
+<pre>
+tinyMCE.init({
+ ...
+ <strong>popups_css : "/mypopup.css"</strong>
+});
+</pre>
+ </div>
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/option_preformatted.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/option_preformatted.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/option_preformatted.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,38 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Option: preformatted</title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
- <h1>Option: preformatted</h1>
-</div>
-
-<div class="content">
- <p>
- If you enable this feature, whitespace such as tabs and spaces will be preserved. Much like the bahavior of a PRE element. This can be handy when integrating TinyMCE with webmail clients. This option is disabled by default.
- </p>
-
- <div class="separator"></div>
-
- <h3>Example of usage of the preformatted option:</h3>
- <div class="example">
-<pre>
-tinyMCE.init({
- ...
- <strong>preformatted : true</strong>
-});
-</pre>
- </div>
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/option_preformatted.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/option_preformatted.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/option_preformatted.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/option_preformatted.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,38 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Option: preformatted</title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+ <h1>Option: preformatted</h1>
+</div>
+
+<div class="content">
+ <p>
+ If you enable this feature, whitespace such as tabs and spaces will be preserved. Much like the bahavior of a PRE element. This can be handy when integrating TinyMCE with webmail clients. This option is disabled by default.
+ </p>
+
+ <div class="separator"></div>
+
+ <h3>Example of usage of the preformatted option:</h3>
+ <div class="example">
+<pre>
+tinyMCE.init({
+ ...
+ <strong>preformatted : true</strong>
+});
+</pre>
+ </div>
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/option_relative_urls.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/option_relative_urls.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/option_relative_urls.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,36 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Option: relative_urls</title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
- <h1>Option: relative_urls</h1>
-</div>
-
-<div class="content">
- <p>If this option is set to true, all URLs returned from the MCFileManager will be relative from the specified <a href="option_document_base_url.html">document_base_url</a> if it's set to false all URLs will be converted to absolute URLs. This feature can not be disabled since MSIE and FF modifies the URLs of DOM objects by them self so TinyMCE tries to solve this problem by reconverting them. This option is set to true by default.</p>
-
- <div class="separator"></div>
-
- <h3>Example of usage of the relative_urls option:</h3>
- <div class="example">
-<pre>
-tinyMCE.init({
- ...
- <strong>relative_urls : false</strong>
-});
-</pre>
- </div>
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/option_relative_urls.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/option_relative_urls.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/option_relative_urls.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/option_relative_urls.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,36 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Option: relative_urls</title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+ <h1>Option: relative_urls</h1>
+</div>
+
+<div class="content">
+ <p>If this option is set to true, all URLs returned from the MCFileManager will be relative from the specified <a href="option_document_base_url.html">document_base_url</a> if it's set to false all URLs will be converted to absolute URLs. This feature can not be disabled since MSIE and FF modifies the URLs of DOM objects by them self so TinyMCE tries to solve this problem by reconverting them. This option is set to true by default.</p>
+
+ <div class="separator"></div>
+
+ <h3>Example of usage of the relative_urls option:</h3>
+ <div class="example">
+<pre>
+tinyMCE.init({
+ ...
+ <strong>relative_urls : false</strong>
+});
+</pre>
+ </div>
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/option_remove_linebreaks.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/option_remove_linebreaks.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/option_remove_linebreaks.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,38 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Option: remove_linebreaks</title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
- <h1>Option: remove_linebreaks</h1>
-</div>
-
-<div class="content">
- <p>
- This option controls if linebreak characters should be removed from output HTML or not. This option is enabled by default since many backend systems use newline to <br /> convertion since they used to be plain old textarea based. With this option enables all HTML content will be placed on one line.
- </p>
-
- <div class="separator"></div>
-
- <h3>Example of usage of the remove_linebreaks option:</h3>
- <div class="example">
-<pre>
-tinyMCE.init({
- ...
- <strong>remove_linebreaks : false</strong>
-});
-</pre>
- </div>
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/option_remove_linebreaks.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/option_remove_linebreaks.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/option_remove_linebreaks.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/option_remove_linebreaks.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,38 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Option: remove_linebreaks</title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+ <h1>Option: remove_linebreaks</h1>
+</div>
+
+<div class="content">
+ <p>
+ This option controls if linebreak characters should be removed from output HTML or not. This option is enabled by default since many backend systems use newline to <br /> convertion since they used to be plain old textarea based. With this option enables all HTML content will be placed on one line.
+ </p>
+
+ <div class="separator"></div>
+
+ <h3>Example of usage of the remove_linebreaks option:</h3>
+ <div class="example">
+<pre>
+tinyMCE.init({
+ ...
+ <strong>remove_linebreaks : false</strong>
+});
+</pre>
+ </div>
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/option_remove_script_host.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/option_remove_script_host.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/option_remove_script_host.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,37 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Option: remove_script_host</title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
- <h1>Option: remove_script_host</h1>
-</div>
-
-<div class="content">
- <p>If this option is enabled the protocol and host part of the URLs returned from the MCFileManager will be removed. This option is only used if the <a href="option_relative_urls.html">relative_urls</a> option is set to false. This option is set to true by default.</p>
- <p>URL:s will be returned in this format: "/somedir/somefile.htm" instead of the default mode: "http://www.somesite.com/somedir/somefile.htm".</p>
-
- <div class="separator"></div>
-
- <h3>Example of usage of the remove_script_host option:</h3>
- <div class="example">
-<pre>
-tinyMCE.init({
- ...
- <strong>remove_script_host : false</strong>
-});
-</pre>
- </div>
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/option_remove_script_host.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/option_remove_script_host.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/option_remove_script_host.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/option_remove_script_host.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Option: remove_script_host</title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+ <h1>Option: remove_script_host</h1>
+</div>
+
+<div class="content">
+ <p>If this option is enabled the protocol and host part of the URLs returned from the MCFileManager will be removed. This option is only used if the <a href="option_relative_urls.html">relative_urls</a> option is set to false. This option is set to true by default.</p>
+ <p>URL:s will be returned in this format: "/somedir/somefile.htm" instead of the default mode: "http://www.somesite.com/somedir/somefile.htm".</p>
+
+ <div class="separator"></div>
+
+ <h3>Example of usage of the remove_script_host option:</h3>
+ <div class="example">
+<pre>
+tinyMCE.init({
+ ...
+ <strong>remove_script_host : false</strong>
+});
+</pre>
+ </div>
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/option_save_callback.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/option_save_callback.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/option_save_callback.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,45 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Option: save_callback</title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
- <h1>Option: save_callback</h1>
-</div>
-
-<div class="content">
- <p>
- This option enables you to add custom logic to be executed when the contents is extracted/saved. This custom logic can then modify the contents before it's submited to a serverside page. This can be useful if you want to do your own regexp cleanups and so forth. The format of this function is: saveContent(element_id, html, body). Where element id is the form element/div id of the editor and HTML is the HTML contents after the built in cleanup process has executed. This function should return the new HTML contents.
- </p>
-
- <div class="separator"></div>
-
- <h3>Example of usage of the save_callback option:</h3>
- <div class="example">
-<pre>
-function <strong>myCustomSaveContent</strong>(element_id, html, body) {
- // Do some custom HTML cleanup
- html = html.replace(/a/g,'b');
-
- return html;
-}
-
-tinyMCE.init({
- ...
- <strong>save_callback : "myCustomSaveContent"</strong>
-});
-</pre>
- </div>
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/option_save_callback.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/option_save_callback.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/option_save_callback.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/option_save_callback.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,45 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Option: save_callback</title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+ <h1>Option: save_callback</h1>
+</div>
+
+<div class="content">
+ <p>
+ This option enables you to add custom logic to be executed when the contents is extracted/saved. This custom logic can then modify the contents before it's submited to a serverside page. This can be useful if you want to do your own regexp cleanups and so forth. The format of this function is: saveContent(element_id, html, body). Where element id is the form element/div id of the editor and HTML is the HTML contents after the built in cleanup process has executed. This function should return the new HTML contents.
+ </p>
+
+ <div class="separator"></div>
+
+ <h3>Example of usage of the save_callback option:</h3>
+ <div class="example">
+<pre>
+function <strong>myCustomSaveContent</strong>(element_id, html, body) {
+ // Do some custom HTML cleanup
+ html = html.replace(/a/g,'b');
+
+ return html;
+}
+
+tinyMCE.init({
+ ...
+ <strong>save_callback : "myCustomSaveContent"</strong>
+});
+</pre>
+ </div>
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/option_setupcontent_callback.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/option_setupcontent_callback.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/option_setupcontent_callback.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,43 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Option: setupcontent_callback</title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
- <h1>Option: setupcontent_callback</h1>
-</div>
-
-<div class="content">
- <p>
- This option enables you to execute custom setup content logic when the editor initializes. The format of this callback is:
- setupContent(editor_id, body, doc). Where editor_id is the TinyMCE editor instance id the editor instance object reference can be retrived by using tinyMCE.getInstanceById(editor_id). The body parameter is a reference to the iframes body element and doc is the iframes document element. This option is not used if it's not specified.
- </p>
-
- <div class="separator"></div>
-
- <h3>Example of usage of the setupcontent_callback option:</h3>
- <div class="example">
-<pre>
-function myCustomSetupContent(editor_id, body, doc) {
- body.innerHTML = "my new content" + body.innerHTML;
-}
-
-tinyMCE.init({
- ...
- <strong>setupcontent_callback : "myCustomSetupContent"</strong>
-});
-</pre>
- </div>
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/option_setupcontent_callback.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/option_setupcontent_callback.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/option_setupcontent_callback.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/option_setupcontent_callback.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,43 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Option: setupcontent_callback</title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+ <h1>Option: setupcontent_callback</h1>
+</div>
+
+<div class="content">
+ <p>
+ This option enables you to execute custom setup content logic when the editor initializes. The format of this callback is:
+ setupContent(editor_id, body, doc). Where editor_id is the TinyMCE editor instance id the editor instance object reference can be retrived by using tinyMCE.getInstanceById(editor_id). The body parameter is a reference to the iframes body element and doc is the iframes document element. This option is not used if it's not specified.
+ </p>
+
+ <div class="separator"></div>
+
+ <h3>Example of usage of the setupcontent_callback option:</h3>
+ <div class="example">
+<pre>
+function myCustomSetupContent(editor_id, body, doc) {
+ body.innerHTML = "my new content" + body.innerHTML;
+}
+
+tinyMCE.init({
+ ...
+ <strong>setupcontent_callback : "myCustomSetupContent"</strong>
+});
+</pre>
+ </div>
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/option_strict_loading_mode.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/option_strict_loading_mode.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/option_strict_loading_mode.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,38 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
- <title>Option: strict_loading_mode</title>
- <link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
- <h1>Option: strict_loading_mode</h1>
-</div>
-
-<div class="content">
- <p>
- This option will force TinyMCE to load script using a DOM insert method instead of document.write on Gecko browsers. Since this results in asynchronous script loading a build in synchronized will ensure that themes, plugins and language packs files are loaded in the correct order. This will on the otherhand make the initialization procedure of TinyMCE a bit slower thats why this isn't the default behavior. So this option is set to true by default if the document content type is application/xhtml+xml.
- </p>
-
- <div class="separator"></div>
-
- <h3>Example of usage of the strict_loading_mode option:</h3>
- <div class="example">
-<pre>
-tinyMCE.init({
- ...
- <strong>strict_loading_mode : true</strong>
-});
-</pre>
- </div>
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/option_strict_loading_mode.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/option_strict_loading_mode.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/option_strict_loading_mode.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/option_strict_loading_mode.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,38 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+ <title>Option: strict_loading_mode</title>
+ <link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+ <h1>Option: strict_loading_mode</h1>
+</div>
+
+<div class="content">
+ <p>
+ This option will force TinyMCE to load script using a DOM insert method instead of document.write on Gecko browsers. Since this results in asynchronous script loading a build in synchronized will ensure that themes, plugins and language packs files are loaded in the correct order. This will on the otherhand make the initialization procedure of TinyMCE a bit slower thats why this isn't the default behavior. So this option is set to true by default if the document content type is application/xhtml+xml.
+ </p>
+
+ <div class="separator"></div>
+
+ <h3>Example of usage of the strict_loading_mode option:</h3>
+ <div class="example">
+<pre>
+tinyMCE.init({
+ ...
+ <strong>strict_loading_mode : true</strong>
+});
+</pre>
+ </div>
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/option_submit_patch.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/option_submit_patch.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/option_submit_patch.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,38 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Option: submit_patch</title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
- <h1>Option: submit_patch</h1>
-</div>
-
-<div class="content">
- <p>
- This toggle option enables you to turn on/off the auto patching of the submit function in forms. TinyMCE will auto move contents from the iframe to the hidden textarea field if for example a JavaScript uses a form[0].submit() call. This is the same as using the tinyMCE.triggerSave() call. This option is set to true by default.
- </p>
-
- <div class="separator"></div>
-
- <h3>Example of usage of the submit_patch option:</h3>
- <div class="example">
-<pre>
-tinyMCE.init({
- ...
- <strong>submit_patch : false</strong>
-});
-</pre>
- </div>
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/option_submit_patch.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/option_submit_patch.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/option_submit_patch.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/option_submit_patch.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,38 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Option: submit_patch</title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+ <h1>Option: submit_patch</h1>
+</div>
+
+<div class="content">
+ <p>
+ This toggle option enables you to turn on/off the auto patching of the submit function in forms. TinyMCE will auto move contents from the iframe to the hidden textarea field if for example a JavaScript uses a form[0].submit() call. This is the same as using the tinyMCE.triggerSave() call. This option is set to true by default.
+ </p>
+
+ <div class="separator"></div>
+
+ <h3>Example of usage of the submit_patch option:</h3>
+ <div class="example">
+<pre>
+tinyMCE.init({
+ ...
+ <strong>submit_patch : false</strong>
+});
+</pre>
+ </div>
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/option_table_inline_editing.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/option_table_inline_editing.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/option_table_inline_editing.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,38 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Option: table_inline_editing</title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
- <h1>Option: table_inline_editing</h1>
-</div>
-
-<div class="content">
- <p>
- This true/false option gives you the ability to turn on/off the inline table editing controls in Firefox/Mozilla. These controls are somewhat buggy and not redesignable so they are disabled by default.
- </p>
-
- <div class="separator"></div>
-
- <h3>Example of usage of the table_inline_editing option:</h3>
- <div class="example">
-<pre>
-tinyMCE.init({
- ...
- <strong>table_inline_editing : true</strong>
-});
-</pre>
- </div>
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/option_table_inline_editing.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/option_table_inline_editing.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/option_table_inline_editing.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/option_table_inline_editing.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,38 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Option: table_inline_editing</title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+ <h1>Option: table_inline_editing</h1>
+</div>
+
+<div class="content">
+ <p>
+ This true/false option gives you the ability to turn on/off the inline table editing controls in Firefox/Mozilla. These controls are somewhat buggy and not redesignable so they are disabled by default.
+ </p>
+
+ <div class="separator"></div>
+
+ <h3>Example of usage of the table_inline_editing option:</h3>
+ <div class="example">
+<pre>
+tinyMCE.init({
+ ...
+ <strong>table_inline_editing : true</strong>
+});
+</pre>
+ </div>
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/option_textarea_trigger.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/option_textarea_trigger.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/option_textarea_trigger.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,47 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Option: textarea_trigger</title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
- <h1>Option: textarea_trigger</h1>
-</div>
-
-<div class="content">
- <p>
- This option enables you to specify the name of the attribute to check if it's value is true/false. If the <a href="option_mode.html">mode</a> option is set to "specific_textareas", only specific textareas with a attribute by the name of the value of this option gets converted and only if it's set to true. This option defaults to "mce_editable".
- </p>
-
- <p>
- If the mode is set to textareas and the textarea trigger attribute value is set to false, these textareas will not be converted.
- </p>
-
- <p>
- <strong>Notice: This option is deprecated.</strong>
- We strongly recommend you to use the <a href="option_editor_selector.html">editor_selector</a>/<a href="option_editor_deselector.html">editor_deselector</a> options instead since they validate with W3C specifications.<strong>
- </p>
-
- <div class="separator"></div>
-
- <h3>Example of usage of the textarea_trigger option:</h3>
- <div class="example">
-<pre>
-tinyMCE.init({
- ...
- <strong>textarea_trigger : "convert_this"</strong>
-});
-</pre>
- </div>
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/option_textarea_trigger.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/option_textarea_trigger.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/option_textarea_trigger.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/option_textarea_trigger.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,47 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Option: textarea_trigger</title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+ <h1>Option: textarea_trigger</h1>
+</div>
+
+<div class="content">
+ <p>
+ This option enables you to specify the name of the attribute to check if it's value is true/false. If the <a href="option_mode.html">mode</a> option is set to "specific_textareas", only specific textareas with a attribute by the name of the value of this option gets converted and only if it's set to true. This option defaults to "mce_editable".
+ </p>
+
+ <p>
+ If the mode is set to textareas and the textarea trigger attribute value is set to false, these textareas will not be converted.
+ </p>
+
+ <p>
+ <strong>Notice: This option is deprecated.</strong>
+ We strongly recommend you to use the <a href="option_editor_selector.html">editor_selector</a>/<a href="option_editor_deselector.html">editor_deselector</a> options instead since they validate with W3C specifications.<strong>
+ </p>
+
+ <div class="separator"></div>
+
+ <h3>Example of usage of the textarea_trigger option:</h3>
+ <div class="example">
+<pre>
+tinyMCE.init({
+ ...
+ <strong>textarea_trigger : "convert_this"</strong>
+});
+</pre>
+ </div>
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/option_theme.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/option_theme.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/option_theme.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,49 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Option: theme</title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
- <h1>Option: theme</h1>
-</div>
-
-<div class="content">
- <p>
- This option enables you to specify what theme to use when rendering the TinyMCE WYSIWYG editor instances. This name matches the directories located in "tinymce/jscripts/tiny_mce/themes". The default value of this option is "advanced". TinyMCE has three built in themes and these are described in greater detail below.
- </p>
-
- <p>
- <h3>advanced</h3>
- This is the advanced theme of TinyMCE, this theme enables users to add/remove buttons and panels and is a lot more flexible than the simple or default theme. For more information about this themes specific options check the "Advanced theme" configuration section.
- </p>
-
- <p>
- <h3>simple</h3>
- This is the most simple theme for TinyMCE it contains only the basic functions.
- </p>
-
- <div class="separator"></div>
-
- <h3>Example of usage of the theme option:</h3>
- <div class="example">
-<pre>
-tinyMCE.init({
- ...
- <strong>theme : "advanced",</strong>
- theme_advanced_buttons3_add_before : "tablecontrols,separator"
-});
-</pre>
- </div>
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/option_theme.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/option_theme.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/option_theme.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/option_theme.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,49 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Option: theme</title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+ <h1>Option: theme</h1>
+</div>
+
+<div class="content">
+ <p>
+ This option enables you to specify what theme to use when rendering the TinyMCE WYSIWYG editor instances. This name matches the directories located in "tinymce/jscripts/tiny_mce/themes". The default value of this option is "advanced". TinyMCE has three built in themes and these are described in greater detail below.
+ </p>
+
+ <p>
+ <h3>advanced</h3>
+ This is the advanced theme of TinyMCE, this theme enables users to add/remove buttons and panels and is a lot more flexible than the simple or default theme. For more information about this themes specific options check the "Advanced theme" configuration section.
+ </p>
+
+ <p>
+ <h3>simple</h3>
+ This is the most simple theme for TinyMCE it contains only the basic functions.
+ </p>
+
+ <div class="separator"></div>
+
+ <h3>Example of usage of the theme option:</h3>
+ <div class="example">
+<pre>
+tinyMCE.init({
+ ...
+ <strong>theme : "advanced",</strong>
+ theme_advanced_buttons3_add_before : "tablecontrols,separator"
+});
+</pre>
+ </div>
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/option_theme_advanced_blockformats.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/option_theme_advanced_blockformats.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/option_theme_advanced_blockformats.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,38 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Option: theme_advanced_blockformats</title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
- <h1>Option: theme_advanced_blockformats</h1>
-</div>
-
-<div class="content">
- <p>
- This option should contain a comma separated list of block formats the default value of this option is "p,div,address,pre,h1,h2,h3,h4,h5,h6". This option is only available if the advanced theme is used.
- </p>
-
- <div class="separator"></div>
-
- <h3>Example of usage of the theme_advanced_blockformats option:</h3>
- <div class="example">
-<pre>
-tinyMCE.init({
- ...
- <strong>theme_advanced_blockformats : "p,div,h1,h2,h3,h4,h5,h6,div,blockquote,dt,dd,code,samp"</strong>
-});
-</pre>
- </div>
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/option_theme_advanced_blockformats.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/option_theme_advanced_blockformats.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/option_theme_advanced_blockformats.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/option_theme_advanced_blockformats.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,38 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Option: theme_advanced_blockformats</title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+ <h1>Option: theme_advanced_blockformats</h1>
+</div>
+
+<div class="content">
+ <p>
+ This option should contain a comma separated list of block formats the default value of this option is "p,div,address,pre,h1,h2,h3,h4,h5,h6". This option is only available if the advanced theme is used.
+ </p>
+
+ <div class="separator"></div>
+
+ <h3>Example of usage of the theme_advanced_blockformats option:</h3>
+ <div class="example">
+<pre>
+tinyMCE.init({
+ ...
+ <strong>theme_advanced_blockformats : "p,div,h1,h2,h3,h4,h5,h6,div,blockquote,dt,dd,code,samp"</strong>
+});
+</pre>
+ </div>
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/option_theme_advanced_buttons_n.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/option_theme_advanced_buttons_n.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/option_theme_advanced_buttons_n.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,44 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Option: theme_advanced_buttons<1-n></title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
- <h1>Option: theme_advanced_buttons<1-n></h1>
-</div>
-
-<div class="content">
- <p>
- This option should contain a comma separated list of button/control names to insert into the toolbar. The number 1-n is the row number to insert the buttons/controls to. Below is a list of built in controls, plugins may include other controls names that can be inserted but these are documented in the individual plugins.
- This option can only be used when <a href="option_theme.html">theme</a> is set to advanced and when the <a href="option_theme_advanced_layout_manager.html">theme_advanced_layout_manager</a> option is set to the default value of "SimpleLayout".
- </p>
- <p>
- A complete reference of all built in buttons and controls can be found in the <a href="reference_buttons.html">button/control reference</a> page.
- </p>
-
- <div class="separator"></div>
-
- <h3>Example of usage of the theme_advanced_buttons<1-n> option:</h3>
- <div class="example">
-<pre>
-tinyMCE.init({
- ...
- <strong>theme_advanced_buttons1 : "separator,insertdate,inserttime,preview,zoom,separator,forecolor,backcolor"</strong>
- <strong>theme_advanced_buttons2 : "bullist,numlist,separator,outdent,indent,separator,undo,redo,separator,link,unlink,anchor,image,cleanup,help,code"</strong>
- <strong>theme_advanced_buttons3 : "hr,removeformat,visualaid,separator,sub,sup,separator,charmap"</strong>
-});
-</pre>
- </div>
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/option_theme_advanced_buttons_n.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/option_theme_advanced_buttons_n.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/option_theme_advanced_buttons_n.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/option_theme_advanced_buttons_n.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,44 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Option: theme_advanced_buttons<1-n></title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+ <h1>Option: theme_advanced_buttons<1-n></h1>
+</div>
+
+<div class="content">
+ <p>
+ This option should contain a comma separated list of button/control names to insert into the toolbar. The number 1-n is the row number to insert the buttons/controls to. Below is a list of built in controls, plugins may include other controls names that can be inserted but these are documented in the individual plugins.
+ This option can only be used when <a href="option_theme.html">theme</a> is set to advanced and when the <a href="option_theme_advanced_layout_manager.html">theme_advanced_layout_manager</a> option is set to the default value of "SimpleLayout".
+ </p>
+ <p>
+ A complete reference of all built in buttons and controls can be found in the <a href="reference_buttons.html">button/control reference</a> page.
+ </p>
+
+ <div class="separator"></div>
+
+ <h3>Example of usage of the theme_advanced_buttons<1-n> option:</h3>
+ <div class="example">
+<pre>
+tinyMCE.init({
+ ...
+ <strong>theme_advanced_buttons1 : "separator,insertdate,inserttime,preview,zoom,separator,forecolor,backcolor"</strong>
+ <strong>theme_advanced_buttons2 : "bullist,numlist,separator,outdent,indent,separator,undo,redo,separator,link,unlink,anchor,image,cleanup,help,code"</strong>
+ <strong>theme_advanced_buttons3 : "hr,removeformat,visualaid,separator,sub,sup,separator,charmap"</strong>
+});
+</pre>
+ </div>
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/option_theme_advanced_buttons_n_add.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/option_theme_advanced_buttons_n_add.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/option_theme_advanced_buttons_n_add.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,44 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Option: theme_advanced_buttons<1-n_add></title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
- <h1>Option: theme_advanced_buttons<1-n_add></h1>
-</div>
-
-<div class="content">
- <p>
- This option should contain a comma separated list of button/control names to add to the end of the specified toolbar row. The number 1-n is the row number to add the buttons/controls to. Below is a list of built in controls, plugins may include other controls names that can be inserted but these are documented in the individual plugins.
- This option can only be used when <a href="option_theme.html">theme</a> is set to advanced and when the <a href="option_theme_advanced_layout_manager.html">theme_advanced_layout_manager</a> option is set to the default value of "SimpleLayout".
- </p>
- <p>
- A complete reference of all built in buttons and controls can be found in the <a href="reference_buttons.html">button/control reference</a> page.
- </p>
-
- <div class="separator"></div>
-
- <h3>Example of usage of the theme_advanced_buttons<1-n>_add option:</h3>
- <div class="example">
-<pre>
-tinyMCE.init({
- ...
- <strong>theme_advanced_buttons1_add : "separator,insertdate,inserttime,preview,zoom,separator,forecolor,backcolor"</strong>
- <strong>theme_advanced_buttons2_add : "bullist,numlist,separator,outdent,indent,separator,undo,redo,separator,link,unlink,anchor,image,cleanup,help,code"</strong>
- <strong>theme_advanced_buttons3_add : "hr,removeformat,visualaid,separator,sub,sup,separator,charmap"</strong>
-});
-</pre>
- </div>
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/option_theme_advanced_buttons_n_add.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/option_theme_advanced_buttons_n_add.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/option_theme_advanced_buttons_n_add.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/option_theme_advanced_buttons_n_add.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,44 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Option: theme_advanced_buttons<1-n_add></title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+ <h1>Option: theme_advanced_buttons<1-n_add></h1>
+</div>
+
+<div class="content">
+ <p>
+ This option should contain a comma separated list of button/control names to add to the end of the specified toolbar row. The number 1-n is the row number to add the buttons/controls to. Below is a list of built in controls, plugins may include other controls names that can be inserted but these are documented in the individual plugins.
+ This option can only be used when <a href="option_theme.html">theme</a> is set to advanced and when the <a href="option_theme_advanced_layout_manager.html">theme_advanced_layout_manager</a> option is set to the default value of "SimpleLayout".
+ </p>
+ <p>
+ A complete reference of all built in buttons and controls can be found in the <a href="reference_buttons.html">button/control reference</a> page.
+ </p>
+
+ <div class="separator"></div>
+
+ <h3>Example of usage of the theme_advanced_buttons<1-n>_add option:</h3>
+ <div class="example">
+<pre>
+tinyMCE.init({
+ ...
+ <strong>theme_advanced_buttons1_add : "separator,insertdate,inserttime,preview,zoom,separator,forecolor,backcolor"</strong>
+ <strong>theme_advanced_buttons2_add : "bullist,numlist,separator,outdent,indent,separator,undo,redo,separator,link,unlink,anchor,image,cleanup,help,code"</strong>
+ <strong>theme_advanced_buttons3_add : "hr,removeformat,visualaid,separator,sub,sup,separator,charmap"</strong>
+});
+</pre>
+ </div>
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/option_theme_advanced_buttons_n_add_before.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/option_theme_advanced_buttons_n_add_before.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/option_theme_advanced_buttons_n_add_before.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,44 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Option: theme_advanced_buttons<1-n_add_before></title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
- <h1>Option: theme_advanced_buttons<1-n_add_before></h1>
-</div>
-
-<div class="content">
- <p>
- This option should contain a comma separated list of button/control names to add to the beginning of the specified toolbar row. The number 1-n is the row number to add the buttons/controls to. Below is a list of built in controls, plugins may include other controls names that can be inserted but these are documented in the individual plugins.
- This option can only be used when <a href="option_theme.html">theme</a> is set to advanced and when the <a href="option_theme_advanced_layout_manager.html">theme_advanced_layout_manager</a> option is set to the default value of "SimpleLayout".
- </p>
- <p>
- A complete reference of all built in buttons and controls can be found in the <a href="reference_buttons.html">button/control reference</a> page.
- </p>
-
- <div class="separator"></div>
-
- <h3>Example of usage of the theme_advanced_buttons<1-n>_add_before option:</h3>
- <div class="example">
-<pre>
-tinyMCE.init({
- ...
- <strong>theme_advanced_buttons1_add_before : "separator,insertdate,inserttime,preview,zoom,separator,forecolor,backcolor"</strong>
- <strong>theme_advanced_buttons2_add_before : "bullist,numlist,separator,outdent,indent,separator,undo,redo,separator,link,unlink,anchor,image,cleanup,help,code"</strong>
- <strong>theme_advanced_buttons3_add_before : "hr,removeformat,visualaid,separator,sub,sup,separator,charmap"</strong>
-});
-</pre>
- </div>
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/option_theme_advanced_buttons_n_add_before.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/option_theme_advanced_buttons_n_add_before.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/option_theme_advanced_buttons_n_add_before.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/option_theme_advanced_buttons_n_add_before.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,44 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Option: theme_advanced_buttons<1-n_add_before></title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+ <h1>Option: theme_advanced_buttons<1-n_add_before></h1>
+</div>
+
+<div class="content">
+ <p>
+ This option should contain a comma separated list of button/control names to add to the beginning of the specified toolbar row. The number 1-n is the row number to add the buttons/controls to. Below is a list of built in controls, plugins may include other controls names that can be inserted but these are documented in the individual plugins.
+ This option can only be used when <a href="option_theme.html">theme</a> is set to advanced and when the <a href="option_theme_advanced_layout_manager.html">theme_advanced_layout_manager</a> option is set to the default value of "SimpleLayout".
+ </p>
+ <p>
+ A complete reference of all built in buttons and controls can be found in the <a href="reference_buttons.html">button/control reference</a> page.
+ </p>
+
+ <div class="separator"></div>
+
+ <h3>Example of usage of the theme_advanced_buttons<1-n>_add_before option:</h3>
+ <div class="example">
+<pre>
+tinyMCE.init({
+ ...
+ <strong>theme_advanced_buttons1_add_before : "separator,insertdate,inserttime,preview,zoom,separator,forecolor,backcolor"</strong>
+ <strong>theme_advanced_buttons2_add_before : "bullist,numlist,separator,outdent,indent,separator,undo,redo,separator,link,unlink,anchor,image,cleanup,help,code"</strong>
+ <strong>theme_advanced_buttons3_add_before : "hr,removeformat,visualaid,separator,sub,sup,separator,charmap"</strong>
+});
+</pre>
+ </div>
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/option_theme_advanced_container.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/option_theme_advanced_container.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/option_theme_advanced_container.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,39 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Option: theme_advanced_container_<container></title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
- <h1>Option: theme_advanced_container_<container></h1>
-</div>
-
-<div class="content">
- <p>
- This option should contain buttons/control that you wich to insert into the container, the button names available is the same as in the <a href="option_theme_advanced_buttons_n.html">theme_advanced_buttons_<1-3></a> option but two extra controls available when this layout option is used these are "mceEditor" and "mceElementpath". The <container> part of this option should be replaced with a name within the <a href="option_theme_advanced_containers.html">theme_advanced_containers</a> list. This option can only be used when <a href="option_theme.html">theme</a> is set to advanced and when the <a href="option_theme_advanced_layout_manager.html">theme_advanced_layout_manager</a> option is set to the value of "RowLayout".
- </p>
-
- <div class="separator"></div>
-
- <h3>Example of usage of the theme_advanced_container_<container> option:</h3>
- <div class="example">
-<pre>
-tinyMCE.init({
- ...
- <strong>theme_advanced_container_somecontainer1 : "bold,italic",</strong>
- <strong>theme_advanced_container_somecontainer2 : "strikethrough,cut"</strong>
-});
-</pre>
- </div>
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/option_theme_advanced_container.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/option_theme_advanced_container.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/option_theme_advanced_container.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/option_theme_advanced_container.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,39 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Option: theme_advanced_container_<container></title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+ <h1>Option: theme_advanced_container_<container></h1>
+</div>
+
+<div class="content">
+ <p>
+ This option should contain buttons/control that you wich to insert into the container, the button names available is the same as in the <a href="option_theme_advanced_buttons_n.html">theme_advanced_buttons_<1-3></a> option but two extra controls available when this layout option is used these are "mceEditor" and "mceElementpath". The <container> part of this option should be replaced with a name within the <a href="option_theme_advanced_containers.html">theme_advanced_containers</a> list. This option can only be used when <a href="option_theme.html">theme</a> is set to advanced and when the <a href="option_theme_advanced_layout_manager.html">theme_advanced_layout_manager</a> option is set to the value of "RowLayout".
+ </p>
+
+ <div class="separator"></div>
+
+ <h3>Example of usage of the theme_advanced_container_<container> option:</h3>
+ <div class="example">
+<pre>
+tinyMCE.init({
+ ...
+ <strong>theme_advanced_container_somecontainer1 : "bold,italic",</strong>
+ <strong>theme_advanced_container_somecontainer2 : "strikethrough,cut"</strong>
+});
+</pre>
+ </div>
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/option_theme_advanced_container_align.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/option_theme_advanced_container_align.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/option_theme_advanced_container_align.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,39 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Option: theme_advanced_container_align</title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
- <h1>Option: theme_advanced_container_<container>_align</h1>
-</div>
-
-<div class="content">
- <p>
- This option is used to set the alignment of a specific containerer. The <container> part of this option should be replaced with a name within the <a href="option_theme_advanced_containers.html">theme_advanced_containers</a> list. This option can only be used when <a href="option_theme.html">theme</a> is set to advanced and when the <a href="option_theme_advanced_layout_manager.html">theme_advanced_layout_manager</a> option is set to the value of "RowLayout".
- </p>
-
- <div class="separator"></div>
-
- <h3>Example of usage of the theme_advanced_container_<container>_align option:</h3>
- <div class="example">
-<pre>
-tinyMCE.init({
- ...
- <strong>theme_advanced_container_somecontainer1_align : "left"</strong>
- <strong>theme_advanced_container_somecontainer2_align : "right"</strong>
-});
-</pre>
- </div>
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/option_theme_advanced_container_align.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/option_theme_advanced_container_align.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/option_theme_advanced_container_align.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/option_theme_advanced_container_align.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,39 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Option: theme_advanced_container_align</title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+ <h1>Option: theme_advanced_container_<container>_align</h1>
+</div>
+
+<div class="content">
+ <p>
+ This option is used to set the alignment of a specific containerer. The <container> part of this option should be replaced with a name within the <a href="option_theme_advanced_containers.html">theme_advanced_containers</a> list. This option can only be used when <a href="option_theme.html">theme</a> is set to advanced and when the <a href="option_theme_advanced_layout_manager.html">theme_advanced_layout_manager</a> option is set to the value of "RowLayout".
+ </p>
+
+ <div class="separator"></div>
+
+ <h3>Example of usage of the theme_advanced_container_<container>_align option:</h3>
+ <div class="example">
+<pre>
+tinyMCE.init({
+ ...
+ <strong>theme_advanced_container_somecontainer1_align : "left"</strong>
+ <strong>theme_advanced_container_somecontainer2_align : "right"</strong>
+});
+</pre>
+ </div>
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/option_theme_advanced_container_class.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/option_theme_advanced_container_class.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/option_theme_advanced_container_class.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,39 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Option: theme_advanced_container_<container>_class</title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
- <h1>Option: theme_advanced_container_<container>_class</h1>
-</div>
-
-<div class="content">
- <p>
- This option is used to set the class of a specific container. The <container> part of this option should be replaced with a name within the <a href="option_theme_advanced_containers.html">theme_advanced_containers</a> list. This option can only be used when <a href="option_theme.html">theme</a> is set to advanced and when the <a href="option_theme_advanced_layout_manager.html">theme_advanced_layout_manager</a> option is set to the value of "RowLayout".
- </p>
-
- <div class="separator"></div>
-
- <h3>Example of usage of the theme_advanced_container_<container>_class option:</h3>
- <div class="example">
-<pre>
-tinyMCE.init({
- ...
- <strong>theme_advanced_container_somecontainer1_class : "someclass",</strong>
- <strong>theme_advanced_container_somecontainer2_class : "someotherclass"</strong>
-});
-</pre>
- </div>
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/option_theme_advanced_container_class.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/option_theme_advanced_container_class.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/option_theme_advanced_container_class.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/option_theme_advanced_container_class.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,39 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Option: theme_advanced_container_<container>_class</title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+ <h1>Option: theme_advanced_container_<container>_class</h1>
+</div>
+
+<div class="content">
+ <p>
+ This option is used to set the class of a specific container. The <container> part of this option should be replaced with a name within the <a href="option_theme_advanced_containers.html">theme_advanced_containers</a> list. This option can only be used when <a href="option_theme.html">theme</a> is set to advanced and when the <a href="option_theme_advanced_layout_manager.html">theme_advanced_layout_manager</a> option is set to the value of "RowLayout".
+ </p>
+
+ <div class="separator"></div>
+
+ <h3>Example of usage of the theme_advanced_container_<container>_class option:</h3>
+ <div class="example">
+<pre>
+tinyMCE.init({
+ ...
+ <strong>theme_advanced_container_somecontainer1_class : "someclass",</strong>
+ <strong>theme_advanced_container_somecontainer2_class : "someotherclass"</strong>
+});
+</pre>
+ </div>
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/option_theme_advanced_containers.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/option_theme_advanced_containers.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/option_theme_advanced_containers.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,38 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Option: theme_advanced_containers</title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
- <h1>Option: theme_advanced_containers</h1>
-</div>
-
-<div class="content">
- <p>
- This option should contain a comma separated list of container/panel names. These names are then matched agains the other container options. This option can only be used when <a href="option_theme.html">theme</a> is set to advanced and when the <a href="option_theme_advanced_layout_manager.html">theme_advanced_layout_manager</a> option is set to the value of "RowLayout".
- </p>
-
- <div class="separator"></div>
-
- <h3>Example of usage of the theme_advanced_containers option:</h3>
- <div class="example">
-<pre>
-tinyMCE.init({
- ...
- <strong>theme_advanced_containers : "mycontainer1,mycontainer2"</strong>
-});
-</pre>
- </div>
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/option_theme_advanced_containers.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/option_theme_advanced_containers.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/option_theme_advanced_containers.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/option_theme_advanced_containers.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,38 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Option: theme_advanced_containers</title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+ <h1>Option: theme_advanced_containers</h1>
+</div>
+
+<div class="content">
+ <p>
+ This option should contain a comma separated list of container/panel names. These names are then matched agains the other container options. This option can only be used when <a href="option_theme.html">theme</a> is set to advanced and when the <a href="option_theme_advanced_layout_manager.html">theme_advanced_layout_manager</a> option is set to the value of "RowLayout".
+ </p>
+
+ <div class="separator"></div>
+
+ <h3>Example of usage of the theme_advanced_containers option:</h3>
+ <div class="example">
+<pre>
+tinyMCE.init({
+ ...
+ <strong>theme_advanced_containers : "mycontainer1,mycontainer2"</strong>
+});
+</pre>
+ </div>
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/option_theme_advanced_containers_default_align.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/option_theme_advanced_containers_default_align.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/option_theme_advanced_containers_default_align.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,38 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Option: theme_advanced_containers_default_align</title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
- <h1>Option: theme_advanced_containers_default_align</h1>
-</div>
-
-<div class="content">
- <p>
- This option should contain the default container/panel alignment this can be a value of "left", "center" or "right". This option can only be used when <a href="option_theme.html">theme</a> is set to advanced and when the <a href="option_theme_advanced_layout_manager.html">theme_advanced_layout_manager</a> option is set to the value of "RowLayout".
- </p>
-
- <div class="separator"></div>
-
- <h3>Example of usage of the theme_advanced_containers_default_align option:</h3>
- <div class="example">
-<pre>
-tinyMCE.init({
- ...
- <strong>theme_advanced_containers_default_align : "left"</strong>
-});
-</pre>
- </div>
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/option_theme_advanced_containers_default_align.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/option_theme_advanced_containers_default_align.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/option_theme_advanced_containers_default_align.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/option_theme_advanced_containers_default_align.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,38 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Option: theme_advanced_containers_default_align</title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+ <h1>Option: theme_advanced_containers_default_align</h1>
+</div>
+
+<div class="content">
+ <p>
+ This option should contain the default container/panel alignment this can be a value of "left", "center" or "right". This option can only be used when <a href="option_theme.html">theme</a> is set to advanced and when the <a href="option_theme_advanced_layout_manager.html">theme_advanced_layout_manager</a> option is set to the value of "RowLayout".
+ </p>
+
+ <div class="separator"></div>
+
+ <h3>Example of usage of the theme_advanced_containers_default_align option:</h3>
+ <div class="example">
+<pre>
+tinyMCE.init({
+ ...
+ <strong>theme_advanced_containers_default_align : "left"</strong>
+});
+</pre>
+ </div>
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/option_theme_advanced_containers_default_class.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/option_theme_advanced_containers_default_class.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/option_theme_advanced_containers_default_class.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,38 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Option: theme_advanced_containers_default_class</title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
- <h1>Option: theme_advanced_containers_default_class</h1>
-</div>
-
-<div class="content">
- <p>
- This option should contain the default container/panel class name. This option can only be used when <a href="option_theme.html">theme</a> is set to advanced and when the <a href="option_theme_advanced_layout_manager.html">theme_advanced_layout_manager</a> option is set to the value of "RowLayout".
- </p>
-
- <div class="separator"></div>
-
- <h3>Example of usage of the theme_advanced_containers_default_class option:</h3>
- <div class="example">
-<pre>
-tinyMCE.init({
- ...
- <strong>theme_advanced_containers_default_class : "myPanelClass"</strong>
-});
-</pre>
- </div>
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/option_theme_advanced_containers_default_class.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/option_theme_advanced_containers_default_class.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/option_theme_advanced_containers_default_class.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/option_theme_advanced_containers_default_class.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,38 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Option: theme_advanced_containers_default_class</title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+ <h1>Option: theme_advanced_containers_default_class</h1>
+</div>
+
+<div class="content">
+ <p>
+ This option should contain the default container/panel class name. This option can only be used when <a href="option_theme.html">theme</a> is set to advanced and when the <a href="option_theme_advanced_layout_manager.html">theme_advanced_layout_manager</a> option is set to the value of "RowLayout".
+ </p>
+
+ <div class="separator"></div>
+
+ <h3>Example of usage of the theme_advanced_containers_default_class option:</h3>
+ <div class="example">
+<pre>
+tinyMCE.init({
+ ...
+ <strong>theme_advanced_containers_default_class : "myPanelClass"</strong>
+});
+</pre>
+ </div>
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/option_theme_advanced_custom_layout.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/option_theme_advanced_custom_layout.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/option_theme_advanced_custom_layout.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,49 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Option: theme_advanced_custom_layout</title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
- <h1>Option: theme_advanced_custom_layout</h1>
-</div>
-
-<div class="content">
- <p>
- This option is used to specify a custom layout manager function. The format of this function is: customLayout(template) where template is the template array within the advanced theme, this function should return a new template array containing the editor HTML in a key called html. This option can only be used when <a href="option_theme.html">theme</a> is set to advanced and when the <a href="option_theme_advanced_layout_manager.html">theme_advanced_layout_manager</a> option is set to the value of "RowLayout".
-
- CustomLayout
-
- template
- </p>
-
- <div class="separator"></div>
-
- <h3>Example of usage of the theme_advanced_custom_layout option:</h3>
- <div class="example">
-<pre>
-function <strong>myCustomLayout</strong>(template) {
- // Make custom layout
- template['html'] = "make new layout";
-
- return template;
-}
-
-tinyMCE.init({
- ...
- <strong>theme_advanced_custom_layout : "myCustomLayout"</strong>
-});
-</pre>
- </div>
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/option_theme_advanced_custom_layout.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/option_theme_advanced_custom_layout.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/option_theme_advanced_custom_layout.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/option_theme_advanced_custom_layout.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,49 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Option: theme_advanced_custom_layout</title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+ <h1>Option: theme_advanced_custom_layout</h1>
+</div>
+
+<div class="content">
+ <p>
+ This option is used to specify a custom layout manager function. The format of this function is: customLayout(template) where template is the template array within the advanced theme, this function should return a new template array containing the editor HTML in a key called html. This option can only be used when <a href="option_theme.html">theme</a> is set to advanced and when the <a href="option_theme_advanced_layout_manager.html">theme_advanced_layout_manager</a> option is set to the value of "RowLayout".
+
+ CustomLayout
+
+ template
+ </p>
+
+ <div class="separator"></div>
+
+ <h3>Example of usage of the theme_advanced_custom_layout option:</h3>
+ <div class="example">
+<pre>
+function <strong>myCustomLayout</strong>(template) {
+ // Make custom layout
+ template['html'] = "make new layout";
+
+ return template;
+}
+
+tinyMCE.init({
+ ...
+ <strong>theme_advanced_custom_layout : "myCustomLayout"</strong>
+});
+</pre>
+ </div>
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/option_theme_advanced_disable.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/option_theme_advanced_disable.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/option_theme_advanced_disable.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,38 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Option: theme_advanced_disable</title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
- <h1>Option: theme_advanced_disable</h1>
-</div>
-
-<div class="content">
- <p>
- This option should contain a comma separated list of controls to disable from any toolbar row/panel in TinyMCE.
- </p>
-
- <div class="separator"></div>
-
- <h3>Example of usage of the theme_advanced_disable option:</h3>
- <div class="example">
-<pre>
-tinyMCE.init({
- ...
- <strong>theme_advanced_disable : "bold,italic"</strong>
-});
-</pre>
- </div>
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/option_theme_advanced_disable.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/option_theme_advanced_disable.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/option_theme_advanced_disable.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/option_theme_advanced_disable.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,38 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Option: theme_advanced_disable</title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+ <h1>Option: theme_advanced_disable</h1>
+</div>
+
+<div class="content">
+ <p>
+ This option should contain a comma separated list of controls to disable from any toolbar row/panel in TinyMCE.
+ </p>
+
+ <div class="separator"></div>
+
+ <h3>Example of usage of the theme_advanced_disable option:</h3>
+ <div class="example">
+<pre>
+tinyMCE.init({
+ ...
+ <strong>theme_advanced_disable : "bold,italic"</strong>
+});
+</pre>
+ </div>
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/option_theme_advanced_fonts.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/option_theme_advanced_fonts.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/option_theme_advanced_fonts.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,38 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Option: theme_advanced_fonts</title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
- <h1>Option: theme_advanced_fonts</h1>
-</div>
-
-<div class="content">
- <p>
- This option should contain a semicolon separated list of font titles and font families separated by =. The titles are the ones that get presented to the user in the fonts drop down list and and the font family names is the string that gets inserted into the font face or fontFamily CSS style.
- </p>
-
- <div class="separator"></div>
-
- <h3>Example of usage of the theme_advanced_fonts option:</h3>
- <div class="example">
-<pre>
-tinyMCE.init({
- ...
- <strong>theme_advanced_fonts : "Arial=arial,helvetica,sans-serif;Courier New=courier new,courier,monospace"</strong>
-});
-</pre>
- </div>
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/option_theme_advanced_fonts.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/option_theme_advanced_fonts.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/option_theme_advanced_fonts.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/option_theme_advanced_fonts.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,38 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Option: theme_advanced_fonts</title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+ <h1>Option: theme_advanced_fonts</h1>
+</div>
+
+<div class="content">
+ <p>
+ This option should contain a semicolon separated list of font titles and font families separated by =. The titles are the ones that get presented to the user in the fonts drop down list and and the font family names is the string that gets inserted into the font face or fontFamily CSS style.
+ </p>
+
+ <div class="separator"></div>
+
+ <h3>Example of usage of the theme_advanced_fonts option:</h3>
+ <div class="example">
+<pre>
+tinyMCE.init({
+ ...
+ <strong>theme_advanced_fonts : "Arial=arial,helvetica,sans-serif;Courier New=courier new,courier,monospace"</strong>
+});
+</pre>
+ </div>
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/option_theme_advanced_layout_manager.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/option_theme_advanced_layout_manager.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/option_theme_advanced_layout_manager.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,39 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Option: theme_advanced_layout_manager</title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
- <h1>Option: theme_advanced_layout_manager</h1>
-</div>
-
-<div class="content">
- <p>
- This option enables you to switch button and panel layout functionality. There are three diffrent layout manager options
- SimpleLayout that is the default layout manager, RowLayout that is the more advanced manager and finaly CustomLayout that executes a custom layout manager function. Each of these layout managers have diffrent options and can be configurated in diffrent ways. This option is only available if the advanced theme is used.
- </p>
-
- <div class="separator"></div>
-
- <h3>Example of usage of the theme_advanced_layout_manager option:</h3>
- <div class="example">
-<pre>
-tinyMCE.init({
- ...
- <strong>theme_advanced_layout_manager : "RowLayout"</strong>
-});
-</pre>
- </div>
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/option_theme_advanced_layout_manager.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/option_theme_advanced_layout_manager.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/option_theme_advanced_layout_manager.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/option_theme_advanced_layout_manager.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,39 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Option: theme_advanced_layout_manager</title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+ <h1>Option: theme_advanced_layout_manager</h1>
+</div>
+
+<div class="content">
+ <p>
+ This option enables you to switch button and panel layout functionality. There are three diffrent layout manager options
+ SimpleLayout that is the default layout manager, RowLayout that is the more advanced manager and finaly CustomLayout that executes a custom layout manager function. Each of these layout managers have diffrent options and can be configurated in diffrent ways. This option is only available if the advanced theme is used.
+ </p>
+
+ <div class="separator"></div>
+
+ <h3>Example of usage of the theme_advanced_layout_manager option:</h3>
+ <div class="example">
+<pre>
+tinyMCE.init({
+ ...
+ <strong>theme_advanced_layout_manager : "RowLayout"</strong>
+});
+</pre>
+ </div>
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/option_theme_advanced_link_targets.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/option_theme_advanced_link_targets.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/option_theme_advanced_link_targets.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,38 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Option: theme_advanced_link_targets</title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
- <h1>Option: theme_advanced_link_targets</h1>
-</div>
-
-<div class="content">
- <p>
- This option should contain a semicolon separated list of link target titles and target names separated by =. The titles are the ones that get presented to the user in the link target drop down list and and the target names is the target that gets inserted as a target attribute.
- </p>
-
- <div class="separator"></div>
-
- <h3>Example of usage of the theme_advanced_link_targets option:</h3>
- <div class="example">
-<pre>
-tinyMCE.init({
- ...
- <strong>theme_advanced_link_targets : "Some frame=someframe;Some other frame=otherframe"</strong>
-});
-</pre>
- </div>
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/option_theme_advanced_link_targets.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/option_theme_advanced_link_targets.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/option_theme_advanced_link_targets.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/option_theme_advanced_link_targets.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,38 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Option: theme_advanced_link_targets</title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+ <h1>Option: theme_advanced_link_targets</h1>
+</div>
+
+<div class="content">
+ <p>
+ This option should contain a semicolon separated list of link target titles and target names separated by =. The titles are the ones that get presented to the user in the link target drop down list and and the target names is the target that gets inserted as a target attribute.
+ </p>
+
+ <div class="separator"></div>
+
+ <h3>Example of usage of the theme_advanced_link_targets option:</h3>
+ <div class="example">
+<pre>
+tinyMCE.init({
+ ...
+ <strong>theme_advanced_link_targets : "Some frame=someframe;Some other frame=otherframe"</strong>
+});
+</pre>
+ </div>
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/option_theme_advanced_path.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/option_theme_advanced_path.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/option_theme_advanced_path.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,38 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Option: theme_advanced_path</title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
- <h1>Option: theme_advanced_path</h1>
-</div>
-
-<div class="content">
- <p>
- This option gives you the ability to enable/disable the element path. This option is only useful if the <a href="option_theme_advanced_statusbar_location.html">theme_advanced_statusbar_location</a> option is set to "top" or "bottom". This option is set to true by default.
- </p>
-
- <div class="separator"></div>
-
- <h3>Example of usage of the theme_advanced_path option:</h3>
- <div class="example">
-<pre>
-tinyMCE.init({
- ...
- <strong>theme_advanced_path : true</strong>
-});
-</pre>
- </div>
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/option_theme_advanced_path.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/option_theme_advanced_path.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/option_theme_advanced_path.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/option_theme_advanced_path.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,38 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Option: theme_advanced_path</title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+ <h1>Option: theme_advanced_path</h1>
+</div>
+
+<div class="content">
+ <p>
+ This option gives you the ability to enable/disable the element path. This option is only useful if the <a href="option_theme_advanced_statusbar_location.html">theme_advanced_statusbar_location</a> option is set to "top" or "bottom". This option is set to true by default.
+ </p>
+
+ <div class="separator"></div>
+
+ <h3>Example of usage of the theme_advanced_path option:</h3>
+ <div class="example">
+<pre>
+tinyMCE.init({
+ ...
+ <strong>theme_advanced_path : true</strong>
+});
+</pre>
+ </div>
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/option_theme_advanced_path_location.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/option_theme_advanced_path_location.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/option_theme_advanced_path_location.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,38 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Option: theme_advanced_path_location</title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
- <h1>Option: theme_advanced_path_location</h1>
-</div>
-
-<div class="content">
- <p>
- This option enables you to specify where the element path should be located. This option can be set to "top", "bottom" or "none". The default value is set to "none". This option can only be used when <a href="option_theme.html">theme</a> is set to advanced and when the <a href="option_theme_advanced_layout_manager.html">theme_advanced_layout_manager</a> option is set to the default value of "SimpleLayout".
- </p>
-
- <div class="separator"></div>
-
- <h3>Example of usage of the theme_advanced_path_location option:</h3>
- <div class="example">
-<pre>
-tinyMCE.init({
- ...
- <strong>theme_advanced_path_location : "bottom"</strong>
-});
-</pre>
- </div>
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/option_theme_advanced_path_location.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/option_theme_advanced_path_location.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/option_theme_advanced_path_location.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/option_theme_advanced_path_location.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,38 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Option: theme_advanced_path_location</title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+ <h1>Option: theme_advanced_path_location</h1>
+</div>
+
+<div class="content">
+ <p>
+ This option enables you to specify where the element path should be located. This option can be set to "top", "bottom" or "none". The default value is set to "none". This option can only be used when <a href="option_theme.html">theme</a> is set to advanced and when the <a href="option_theme_advanced_layout_manager.html">theme_advanced_layout_manager</a> option is set to the default value of "SimpleLayout".
+ </p>
+
+ <div class="separator"></div>
+
+ <h3>Example of usage of the theme_advanced_path_location option:</h3>
+ <div class="example">
+<pre>
+tinyMCE.init({
+ ...
+ <strong>theme_advanced_path_location : "bottom"</strong>
+});
+</pre>
+ </div>
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/option_theme_advanced_resize_horizontal.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/option_theme_advanced_resize_horizontal.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/option_theme_advanced_resize_horizontal.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,38 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
- <title>Option: theme_advanced_resize_horizontal</title>
- <link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
- <h1>Option: theme_advanced_resize_horizontal</h1>
-</div>
-
-<div class="content">
- <p>
- This option gives you the ability to enable/disable the horizontal resizing. This option is only useful if the <a href="option_theme_advanced_statusbar_location.html">theme_advanced_statusbar_location</a> option is set to "top" or "bottom" and when the <a href="option_theme_advanced_resizing.html">theme_advanced_resizing</a> is set to true. This option is set to true by default, that makes resizing horizontal and vertical.
- </p>
-
- <div class="separator"></div>
-
- <h3>Example of usage of the theme_advanced_resize_horizontal option:</h3>
- <div class="example">
-<pre>
-tinyMCE.init({
- ...
- <strong>theme_advanced_resize_horizontal : false</strong>
-});
-</pre>
- </div>
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/option_theme_advanced_resize_horizontal.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/option_theme_advanced_resize_horizontal.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/option_theme_advanced_resize_horizontal.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/option_theme_advanced_resize_horizontal.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,38 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+ <title>Option: theme_advanced_resize_horizontal</title>
+ <link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+ <h1>Option: theme_advanced_resize_horizontal</h1>
+</div>
+
+<div class="content">
+ <p>
+ This option gives you the ability to enable/disable the horizontal resizing. This option is only useful if the <a href="option_theme_advanced_statusbar_location.html">theme_advanced_statusbar_location</a> option is set to "top" or "bottom" and when the <a href="option_theme_advanced_resizing.html">theme_advanced_resizing</a> is set to true. This option is set to true by default, that makes resizing horizontal and vertical.
+ </p>
+
+ <div class="separator"></div>
+
+ <h3>Example of usage of the theme_advanced_resize_horizontal option:</h3>
+ <div class="example">
+<pre>
+tinyMCE.init({
+ ...
+ <strong>theme_advanced_resize_horizontal : false</strong>
+});
+</pre>
+ </div>
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/option_theme_advanced_resizing.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/option_theme_advanced_resizing.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/option_theme_advanced_resizing.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,38 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Option: theme_advanced_resizing</title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
- <h1>Option: theme_advanced_resizing</h1>
-</div>
-
-<div class="content">
- <p>
- This option gives you the ability to enable/disable the resizing button. This option is only useful if the <a href="option_theme_advanced_statusbar_location.html">theme_advanced_statusbar_location</a> option is set to "top" or "bottom". This option is set to false by default.
- </p>
-
- <div class="separator"></div>
-
- <h3>Example of usage of the theme_advanced_resizing option:</h3>
- <div class="example">
-<pre>
-tinyMCE.init({
- ...
- <strong>theme_advanced_resizing : true</strong>
-});
-</pre>
- </div>
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/option_theme_advanced_resizing.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/option_theme_advanced_resizing.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/option_theme_advanced_resizing.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/option_theme_advanced_resizing.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,38 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Option: theme_advanced_resizing</title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+ <h1>Option: theme_advanced_resizing</h1>
+</div>
+
+<div class="content">
+ <p>
+ This option gives you the ability to enable/disable the resizing button. This option is only useful if the <a href="option_theme_advanced_statusbar_location.html">theme_advanced_statusbar_location</a> option is set to "top" or "bottom". This option is set to false by default.
+ </p>
+
+ <div class="separator"></div>
+
+ <h3>Example of usage of the theme_advanced_resizing option:</h3>
+ <div class="example">
+<pre>
+tinyMCE.init({
+ ...
+ <strong>theme_advanced_resizing : true</strong>
+});
+</pre>
+ </div>
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/option_theme_advanced_resizing_use_cookie.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/option_theme_advanced_resizing_use_cookie.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/option_theme_advanced_resizing_use_cookie.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,35 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Option: theme_advanced_resizing_use_cookie</title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
- <h1>Option: theme_advanced_resizing_use_cookie</h1>
-</div>
-
-<div class="content">
- <p>This option enables you to disable the storage of editor size in a cookie. By default the editors size is stored and retrived from a cookie.</p>
- <div class="separator"></div>
-
- <h3>Example of usage of the theme_advanced_resizing_use_cookie option:</h3>
- <div class="example">
-<pre>
-tinyMCE.init({
- ...
- <strong>theme_advanced_resizing_use_cookie : false</strong>
-});
-</pre>
- </div>
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/option_theme_advanced_resizing_use_cookie.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/option_theme_advanced_resizing_use_cookie.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/option_theme_advanced_resizing_use_cookie.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/option_theme_advanced_resizing_use_cookie.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,35 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Option: theme_advanced_resizing_use_cookie</title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+ <h1>Option: theme_advanced_resizing_use_cookie</h1>
+</div>
+
+<div class="content">
+ <p>This option enables you to disable the storage of editor size in a cookie. By default the editors size is stored and retrived from a cookie.</p>
+ <div class="separator"></div>
+
+ <h3>Example of usage of the theme_advanced_resizing_use_cookie option:</h3>
+ <div class="example">
+<pre>
+tinyMCE.init({
+ ...
+ <strong>theme_advanced_resizing_use_cookie : false</strong>
+});
+</pre>
+ </div>
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/option_theme_advanced_source_editor_height.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/option_theme_advanced_source_editor_height.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/option_theme_advanced_source_editor_height.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,38 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Option: theme_advanced_source_editor_height</title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
- <h1>Option: theme_advanced_source_editor_height</h1>
-</div>
-
-<div class="content">
- <p>
- This option is used to define the height of the source editor dialog. This option is set to 400 by default.
- </p>
-
- <div class="separator"></div>
-
- <h3>Example of usage of the theme_advanced_source_editor_height option:</h3>
- <div class="example">
-<pre>
-tinyMCE.init({
- ...
- <strong>theme_advanced_source_editor_height : "600"</strong>
-});
-</pre>
- </div>
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/option_theme_advanced_source_editor_height.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/option_theme_advanced_source_editor_height.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/option_theme_advanced_source_editor_height.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/option_theme_advanced_source_editor_height.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,38 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Option: theme_advanced_source_editor_height</title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+ <h1>Option: theme_advanced_source_editor_height</h1>
+</div>
+
+<div class="content">
+ <p>
+ This option is used to define the height of the source editor dialog. This option is set to 400 by default.
+ </p>
+
+ <div class="separator"></div>
+
+ <h3>Example of usage of the theme_advanced_source_editor_height option:</h3>
+ <div class="example">
+<pre>
+tinyMCE.init({
+ ...
+ <strong>theme_advanced_source_editor_height : "600"</strong>
+});
+</pre>
+ </div>
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/option_theme_advanced_source_editor_width.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/option_theme_advanced_source_editor_width.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/option_theme_advanced_source_editor_width.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,38 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Option: theme_advanced_source_editor_width</title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
- <h1>Option: theme_advanced_source_editor_width</h1>
-</div>
-
-<div class="content">
- <p>
- This option is used to define the width of the source editor dialog. This option is set to 500 by default.
- </p>
-
- <div class="separator"></div>
-
- <h3>Example of usage of the theme_advanced_source_editor_width option:</h3>
- <div class="example">
-<pre>
-tinyMCE.init({
- ...
- <strong>theme_advanced_source_editor_width : "700"</strong>
-});
-</pre>
- </div>
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/option_theme_advanced_source_editor_width.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/option_theme_advanced_source_editor_width.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/option_theme_advanced_source_editor_width.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/option_theme_advanced_source_editor_width.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,38 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Option: theme_advanced_source_editor_width</title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+ <h1>Option: theme_advanced_source_editor_width</h1>
+</div>
+
+<div class="content">
+ <p>
+ This option is used to define the width of the source editor dialog. This option is set to 500 by default.
+ </p>
+
+ <div class="separator"></div>
+
+ <h3>Example of usage of the theme_advanced_source_editor_width option:</h3>
+ <div class="example">
+<pre>
+tinyMCE.init({
+ ...
+ <strong>theme_advanced_source_editor_width : "700"</strong>
+});
+</pre>
+ </div>
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/option_theme_advanced_source_editor_wrap.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/option_theme_advanced_source_editor_wrap.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/option_theme_advanced_source_editor_wrap.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,38 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Option: theme_advanced_source_editor_wrap</title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
- <h1>Option: theme_advanced_source_editor_wrap</h1>
-</div>
-
-<div class="content">
- <p>
- This option enables you to force word wrap for the source editor, this option is set to true by default.
- </p>
-
- <div class="separator"></div>
-
- <h3>Example of usage of the theme_advanced_source_editor_wrap option:</h3>
- <div class="example">
-<pre>
-tinyMCE.init({
- ...
- <strong>theme_advanced_source_editor_wrap : false</strong>
-});
-</pre>
- </div>
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/option_theme_advanced_source_editor_wrap.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/option_theme_advanced_source_editor_wrap.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/option_theme_advanced_source_editor_wrap.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/option_theme_advanced_source_editor_wrap.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,38 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Option: theme_advanced_source_editor_wrap</title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+ <h1>Option: theme_advanced_source_editor_wrap</h1>
+</div>
+
+<div class="content">
+ <p>
+ This option enables you to force word wrap for the source editor, this option is set to true by default.
+ </p>
+
+ <div class="separator"></div>
+
+ <h3>Example of usage of the theme_advanced_source_editor_wrap option:</h3>
+ <div class="example">
+<pre>
+tinyMCE.init({
+ ...
+ <strong>theme_advanced_source_editor_wrap : false</strong>
+});
+</pre>
+ </div>
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/option_theme_advanced_statusbar_location.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/option_theme_advanced_statusbar_location.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/option_theme_advanced_statusbar_location.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,38 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Option: theme_advanced_statusbar_location</title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
- <h1>Option: theme_advanced_statusbar_location</h1>
-</div>
-
-<div class="content">
- <p>
- This option enables you to specify where the element statusbar with the path and resize tool should be located. This option can be set to "top", "bottom" or "none". The default value is set to "none". This option can only be used when <a href="option_theme.html">theme</a> is set to advanced and when the <a href="option_theme_advanced_layout_manager.html">theme_advanced_layout_manager</a> option is set to the default value of "SimpleLayout".
- </p>
-
- <div class="separator"></div>
-
- <h3>Example of usage of the theme_advanced_statusbar_location option:</h3>
- <div class="example">
-<pre>
-tinyMCE.init({
- ...
- <strong>theme_advanced_statusbar_location : "bottom"</strong>
-});
-</pre>
- </div>
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/option_theme_advanced_statusbar_location.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/option_theme_advanced_statusbar_location.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/option_theme_advanced_statusbar_location.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/option_theme_advanced_statusbar_location.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,38 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Option: theme_advanced_statusbar_location</title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+ <h1>Option: theme_advanced_statusbar_location</h1>
+</div>
+
+<div class="content">
+ <p>
+ This option enables you to specify where the element statusbar with the path and resize tool should be located. This option can be set to "top", "bottom" or "none". The default value is set to "none". This option can only be used when <a href="option_theme.html">theme</a> is set to advanced and when the <a href="option_theme_advanced_layout_manager.html">theme_advanced_layout_manager</a> option is set to the default value of "SimpleLayout".
+ </p>
+
+ <div class="separator"></div>
+
+ <h3>Example of usage of the theme_advanced_statusbar_location option:</h3>
+ <div class="example">
+<pre>
+tinyMCE.init({
+ ...
+ <strong>theme_advanced_statusbar_location : "bottom"</strong>
+});
+</pre>
+ </div>
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/option_theme_advanced_styles.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/option_theme_advanced_styles.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/option_theme_advanced_styles.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,38 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Option: theme_advanced_styles</title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
- <h1>Option: theme_advanced_styles</h1>
-</div>
-
-<div class="content">
- <p>
- This option should contain a semicolon separated list of class titles and class names separated by =. The titles are the ones that get presented to the user in the styles drop down list and and the class names is the classes that gets inserted. If this option isn't defined TinyMCE auto imports the classes from the content CSS.
- </p>
-
- <div class="separator"></div>
-
- <h3>Example of usage of the theme_advanced_styles option:</h3>
- <div class="example">
-<pre>
-tinyMCE.init({
- ...
- <strong>theme_advanced_styles : "Header 1=header1;Header 2=header2;Header 3=header3;Table Row=tableRow1"</strong>
-});
-</pre>
- </div>
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/option_theme_advanced_styles.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/option_theme_advanced_styles.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/option_theme_advanced_styles.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/option_theme_advanced_styles.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,38 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Option: theme_advanced_styles</title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+ <h1>Option: theme_advanced_styles</h1>
+</div>
+
+<div class="content">
+ <p>
+ This option should contain a semicolon separated list of class titles and class names separated by =. The titles are the ones that get presented to the user in the styles drop down list and and the class names is the classes that gets inserted. If this option isn't defined TinyMCE auto imports the classes from the content CSS.
+ </p>
+
+ <div class="separator"></div>
+
+ <h3>Example of usage of the theme_advanced_styles option:</h3>
+ <div class="example">
+<pre>
+tinyMCE.init({
+ ...
+ <strong>theme_advanced_styles : "Header 1=header1;Header 2=header2;Header 3=header3;Table Row=tableRow1"</strong>
+});
+</pre>
+ </div>
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/option_theme_advanced_toolbar_align.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/option_theme_advanced_toolbar_align.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/option_theme_advanced_toolbar_align.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,38 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Option: theme_advanced_toolbar_align</title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
- <h1>Option: theme_advanced_toolbar_align</h1>
-</div>
-
-<div class="content">
- <p>
- This option enables you to specify the alignment of the toolbar, this value can be left, right or center the default value is center. This option can only be used when <a href="option_theme.html">theme</a> is set to advanced and when the <a href="option_theme_advanced_layout_manager.html">theme_advanced_layout_manager</a> option is set to the default value of "SimpleLayout".
- </p>
-
- <div class="separator"></div>
-
- <h3>Example of usage of the theme_advanced_toolbar_align option:</h3>
- <div class="example">
-<pre>
-tinyMCE.init({
- ...
- <strong>theme_advanced_toolbar_align : "left"</strong>
-});
-</pre>
- </div>
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/option_theme_advanced_toolbar_align.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/option_theme_advanced_toolbar_align.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/option_theme_advanced_toolbar_align.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/option_theme_advanced_toolbar_align.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,38 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Option: theme_advanced_toolbar_align</title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+ <h1>Option: theme_advanced_toolbar_align</h1>
+</div>
+
+<div class="content">
+ <p>
+ This option enables you to specify the alignment of the toolbar, this value can be left, right or center the default value is center. This option can only be used when <a href="option_theme.html">theme</a> is set to advanced and when the <a href="option_theme_advanced_layout_manager.html">theme_advanced_layout_manager</a> option is set to the default value of "SimpleLayout".
+ </p>
+
+ <div class="separator"></div>
+
+ <h3>Example of usage of the theme_advanced_toolbar_align option:</h3>
+ <div class="example">
+<pre>
+tinyMCE.init({
+ ...
+ <strong>theme_advanced_toolbar_align : "left"</strong>
+});
+</pre>
+ </div>
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/option_theme_advanced_toolbar_location.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/option_theme_advanced_toolbar_location.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/option_theme_advanced_toolbar_location.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,41 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Option: theme_advanced_toolbar_location</title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
- <h1>Option: theme_advanced_toolbar_location</h1>
-</div>
-
-<div class="content">
- <p>
- This option enables you to specify where the toolbar should be located. This option can be set to "top" or "bottom". The default value is set to "bottom". This option can only be used when <a href="option_theme.html">theme</a> is set to advanced and when the <a href="option_theme_advanced_layout_manager.html">theme_advanced_layout_manager</a> option is set to the default value of "SimpleLayout".
- </p>
- <p>
- There is a special "external" location, this option adds the toolbar to a DIV element and sets the class of this DIV to "mceToolbarExternal". This enables you to freely specify the location of the toolbar.
- </p>
-
- <div class="separator"></div>
-
- <h3>Example of usage of the theme_advanced_toolbar_location option:</h3>
- <div class="example">
-<pre>
-tinyMCE.init({
- ...
- <strong>theme_advanced_toolbar_location : "top"</strong>
-});
-</pre>
- </div>
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/option_theme_advanced_toolbar_location.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/option_theme_advanced_toolbar_location.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/option_theme_advanced_toolbar_location.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/option_theme_advanced_toolbar_location.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,41 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Option: theme_advanced_toolbar_location</title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+ <h1>Option: theme_advanced_toolbar_location</h1>
+</div>
+
+<div class="content">
+ <p>
+ This option enables you to specify where the toolbar should be located. This option can be set to "top" or "bottom". The default value is set to "bottom". This option can only be used when <a href="option_theme.html">theme</a> is set to advanced and when the <a href="option_theme_advanced_layout_manager.html">theme_advanced_layout_manager</a> option is set to the default value of "SimpleLayout".
+ </p>
+ <p>
+ There is a special "external" location, this option adds the toolbar to a DIV element and sets the class of this DIV to "mceToolbarExternal". This enables you to freely specify the location of the toolbar.
+ </p>
+
+ <div class="separator"></div>
+
+ <h3>Example of usage of the theme_advanced_toolbar_location option:</h3>
+ <div class="example">
+<pre>
+tinyMCE.init({
+ ...
+ <strong>theme_advanced_toolbar_location : "top"</strong>
+});
+</pre>
+ </div>
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/option_trim_span_elements.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/option_trim_span_elements.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/option_trim_span_elements.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,38 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html>
-<head>
-<title>Option: trim_span_elements</title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
- <h1>Option: trim_span_elements</h1>
-</div>
-
-<div class="content">
- <p>
- This option controls if spans without attributes will be removed or not. This option is set to true by default.
- </p>
-
- <div class="separator"></div>
-
- <h3>Example of usage of the trim_span_elements option:</h3>
- <div class="example">
-<pre>
-tinyMCE.init({
- ...
- <strong>trim_span_elements : false</strong>
-});
-</pre>
- </div>
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/option_trim_span_elements.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/option_trim_span_elements.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/option_trim_span_elements.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/option_trim_span_elements.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,38 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html>
+<head>
+<title>Option: trim_span_elements</title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+ <h1>Option: trim_span_elements</h1>
+</div>
+
+<div class="content">
+ <p>
+ This option controls if spans without attributes will be removed or not. This option is set to true by default.
+ </p>
+
+ <div class="separator"></div>
+
+ <h3>Example of usage of the trim_span_elements option:</h3>
+ <div class="example">
+<pre>
+tinyMCE.init({
+ ...
+ <strong>trim_span_elements : false</strong>
+});
+</pre>
+ </div>
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/option_urlconverter_callback.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/option_urlconverter_callback.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/option_urlconverter_callback.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,46 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Option: urlconverter_callback</title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
- <h1>Option: urlconverter_callback</h1>
-</div>
-
-<div class="content">
- <p>
- This option enable you to add your own URL converter logic. This option should contain a JavaScript function name. The format of this converter function is: URLConverter(url, node, on_save). There URL is the URL string to convert, node is the element that contains the URL that is to be converted this parameter may be set to null if there is no element for the URL and on_save is set to true when contents is to be extracted from the editor for example when the user submits the HTML form. This function should return the converted URL as a string. This option is set to a internal TinyMCE function "TinyMCE.prototype.convertURL" by default. You may call this function from your extention inorder to use the built in convert options.
- </p>
-
- <div class="separator"></div>
-
- <h3>Example of usage of the urlconverter_callback option:</h3>
- <div class="example">
-<pre>
-function <strong>myCustomURLConverter</strong>(url, node, on_save) {
- // Do some custom URL convertion
- url = url.substring(3);
-
- // Return new URL
- return url;
-}
-
-tinyMCE.init({
- ...
- <strong>urlconverter_callback : "myCustomURLConverter"</strong>
-});
-</pre>
- </div>
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/option_urlconverter_callback.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/option_urlconverter_callback.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/option_urlconverter_callback.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/option_urlconverter_callback.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,46 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Option: urlconverter_callback</title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+ <h1>Option: urlconverter_callback</h1>
+</div>
+
+<div class="content">
+ <p>
+ This option enable you to add your own URL converter logic. This option should contain a JavaScript function name. The format of this converter function is: URLConverter(url, node, on_save). There URL is the URL string to convert, node is the element that contains the URL that is to be converted this parameter may be set to null if there is no element for the URL and on_save is set to true when contents is to be extracted from the editor for example when the user submits the HTML form. This function should return the converted URL as a string. This option is set to a internal TinyMCE function "TinyMCE.prototype.convertURL" by default. You may call this function from your extention inorder to use the built in convert options.
+ </p>
+
+ <div class="separator"></div>
+
+ <h3>Example of usage of the urlconverter_callback option:</h3>
+ <div class="example">
+<pre>
+function <strong>myCustomURLConverter</strong>(url, node, on_save) {
+ // Do some custom URL convertion
+ url = url.substring(3);
+
+ // Return new URL
+ return url;
+}
+
+tinyMCE.init({
+ ...
+ <strong>urlconverter_callback : "myCustomURLConverter"</strong>
+});
+</pre>
+ </div>
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/option_valid_elements.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/option_valid_elements.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/option_valid_elements.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,348 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Option: valid_elements</title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
- <h1>Option: valid_elements</h1>
-</div>
-
-<div class="content">
- <p>
- This option should contain a comma separated list element convertion chunks. Each chunk contains information about how one element and it's attributes should be treated. The default rule set for this option is specified below.
- </p>
- <p>
-
- <table border="1" cellspacing="0" cellpadding="4">
- <thead><td colspan="2">Control characters:</td></thead>
- <tbody>
- <tr><td><strong>,</strong></td><td>Separates element chunk definitions.</td></tr>
- <tr><td><strong>/</strong></td><td>Separates element synonymous. The first element is the one that will be outputted.</td></tr>
- <tr><td><strong>|</strong></td><td>Separates attribute definitions.</td></tr>
- <tr><td><strong>[</strong></td><td>Starts a new attribute list for a element definition.</td></tr>
- <tr><td><strong>]</strong></td><td>Ends a attribute list for a element definition.</td></tr>
- <tr><td><strong>=</strong></td><td>Makes the attribute to default to the specified value. For example "target=_blank"</td></tr>
- <tr><td><strong>:</strong></td><td>Makes the attribute to be forced to the specified value. For example "border:0"</td></tr>
- <tr><td><strong><</strong></td><td>Verifies the value of a attribute. For example "target<_blank?_self"</td></tr>
- <tr><td><strong>?</strong></td><td>Separates attribute verification values, see above.</td></tr>
- <tr><td><strong>+</strong></td><td>Makes the element open if no child nodes exists. Example: +a.</td></tr>
- <tr><td><strong>-</strong></td><td>Enables removal of empty elements such as >strong /<. Example: -strong.</td></tr>
- <tr><td><strong>#</strong></td><td>Enables padding of empty elements, this will padd with if they are empty. Example: #p.</td></tr>
- </tbody>
- </table>
- Wildcards such as *,+,? may be used in element or attribute name matching.
- </p>
- <p>
- Special variables:<br />
- <strong>{$uid}</strong> Results in a unique ID. For example "p[id:{$uid}]".<br />
- <br />
- Use *[*] to include all elements and all attributes this can be very useful when used with the <a href="option_invalid_elements.html">invalid_elements</a> option.
- </p>
-
- <div class="separator"></div>
-
- <h3>Example of usage of the valid_elements option:</h3>
- <p>
- This example string tells TinyMCE to remove all elements that are not a "a, strong, div or br" element, convert b elements to strong elements, default target to "_blank" and keep the href, target and align attributes of the elements.
- </p>
- <div class="example">
-<pre>
-tinyMCE.init({
- ...
- <strong>valid_elements : "a[href|target=_blank],strong/b,div[align],br"</strong>
-});
-</pre>
- </div>
-
- <div class="separator"></div>
-
- <h3>Default rule set:</h3>
- <p>
- This is the default string used by TinyMCE to cleanup the HTML contents.
- </p>
- <div class="example">
-<pre>
-+a[id|style|rel|rev|charset|hreflang|dir|lang|tabindex|accesskey|type|name|href|target|title|class|onfocus|onblur|onclick|ondblclick|onmousedown|onmouseup|onmouseover|onmousemove|onmouseout|onkeypress|onkeydown|onkeyup],-strong/-b[class|style],-em/-i[class|style],-strike[class|style],-u[class|style],#p[id|style|dir|class|align],-ol[class|style],-ul[class|style],-li[class|style],br,img[id|dir|lang|longdesc|usemap|style|class|src|onmouseover|onmouseout|border|alt=|title|hspace|vspace|width|height|align],-sub[style|class],-sup[style|class],-blockquote[dir|style],-table[border=0|cellspacing|cellpadding|width|height|class|align|summary|style|dir|id|lang|bgcolor|background|bordercolor],-tr[id|lang|dir|class|rowspan|width|height|align|valign|style|bgcolor|background|bordercolor],tbody[id|class],thead[id|class],tfoot[id|class],-td[id|lang|dir|class|colspan|rowspan|width|height|align|valign|style|bgcolor|background|bordercolor|scope],-th[id|lang|dir|class|colspan|rowspan|width|height|align|valign|style|scope],caption[id|lang|dir|class|style],-div[id|dir|class|align|style],-span[style|class|align],-pre[class|align|style],address[class|align|style],-h1[id|style|dir|class|align],-h2[id|style|dir|class|align],-h3[id|style|dir|class|align],-h4[id|style|dir|class|align],-h5[id|style|dir|class|align],-h6[id|style|dir|class|align],hr[class|style],-font[face|size|style|id|class|dir|color],dd[id|class|title|style|dir|lang],dl[id|class|title|style|dir|lang],dt[id|class|title|style|dir|lang]
-</pre>
- </div>
-
- <div class="separator"></div>
-
- <h3>Full XHTML rule set:</h3>
- <p>
- The following will validate that the page complies fully with the XHTML specification.
- </p>
- <div class="example">
-<pre>
-valid_elements : ""
-+"a[accesskey|charset|class|coords|dir<ltr?rtl|href|hreflang|id|lang|name"
- +"|onblur|onclick|ondblclick|onfocus|onkeydown|onkeypress|onkeyup"
- +"|onmousedown|onmousemove|onmouseout|onmouseover|onmouseup|rel|rev"
- +"|shape<circle?default?poly?rect|style|tabindex|title|target|type],"
-+"abbr[class|dir<ltr?rtl|id|lang|onclick|ondblclick|onkeydown|onkeypress"
- +"|onkeyup|onmousedown|onmousemove|onmouseout|onmouseover|onmouseup|style"
- +"|title],"
-+"acronym[class|dir<ltr?rtl|id|id|lang|onclick|ondblclick|onkeydown|onkeypress"
- +"|onkeyup|onmousedown|onmousemove|onmouseout|onmouseover|onmouseup|style"
- +"|title],"
-+"address[class|align|dir<ltr?rtl|id|lang|onclick|ondblclick|onkeydown"
- +"|onkeypress|onkeyup|onmousedown|onmousemove|onmouseout|onmouseover"
- +"|onmouseup|style|title],"
-+"applet[align<bottom?left?middle?right?top|alt|archive|class|code|codebase"
- +"|height|hspace|id|name|object|style|title|vspace|width],"
-+"area[accesskey|alt|class|coords|dir<ltr?rtl|href|id|lang|nohref<nohref"
- +"|onblur|onclick|ondblclick|onfocus|onkeydown|onkeypress|onkeyup"
- +"|onmousedown|onmousemove|onmouseout|onmouseover|onmouseup"
- +"|shape<circle?default?poly?rect|style|tabindex|title|target],"
-+"base[href|target],"
-+"basefont[color|face|id|size],"
-+"bdo[class|dir<ltr?rtl|id|lang|style|title],"
-+"big[class|dir<ltr?rtl|id|lang|onclick|ondblclick|onkeydown|onkeypress"
- +"|onkeyup|onmousedown|onmousemove|onmouseout|onmouseover|onmouseup|style"
- +"|title],"
-+"blockquote[dir|style|cite|class|dir<ltr?rtl|id|lang|onclick|ondblclick"
- +"|onkeydown|onkeypress|onkeyup|onmousedown|onmousemove|onmouseout"
- +"|onmouseover|onmouseup|style|title],"
-+"body[alink|background|bgcolor|class|dir<ltr?rtl|id|lang|link|onclick"
- +"|ondblclick|onkeydown|onkeypress|onkeyup|onload|onmousedown|onmousemove"
- +"|onmouseout|onmouseover|onmouseup|onunload|style|title|text|vlink],"
-+"br[class|clear<all?left?none?right|id|style|title],"
-+"button[accesskey|class|dir<ltr?rtl|disabled<disabled|id|lang|name|onblur"
- +"|onclick|ondblclick|onfocus|onkeydown|onkeypress|onkeyup|onmousedown"
- +"|onmousemove|onmouseout|onmouseover|onmouseup|style|tabindex|title|type"
- +"|value],"
-+"caption[align<bottom?left?right?top|class|dir<ltr?rtl|id|lang|onclick"
- +"|ondblclick|onkeydown|onkeypress|onkeyup|onmousedown|onmousemove"
- +"|onmouseout|onmouseover|onmouseup|style|title],"
-+"center[class|dir<ltr?rtl|id|lang|onclick|ondblclick|onkeydown|onkeypress"
- +"|onkeyup|onmousedown|onmousemove|onmouseout|onmouseover|onmouseup|style"
- +"|title],"
-+"cite[class|dir<ltr?rtl|id|lang|onclick|ondblclick|onkeydown|onkeypress"
- +"|onkeyup|onmousedown|onmousemove|onmouseout|onmouseover|onmouseup|style"
- +"|title],"
-+"code[class|dir<ltr?rtl|id|lang|onclick|ondblclick|onkeydown|onkeypress"
- +"|onkeyup|onmousedown|onmousemove|onmouseout|onmouseover|onmouseup|style"
- +"|title],"
-+"col[align<center?char?justify?left?right|char|charoff|class|dir<ltr?rtl|id"
- +"|lang|onclick|ondblclick|onkeydown|onkeypress|onkeyup|onmousedown"
- +"|onmousemove|onmouseout|onmouseover|onmouseup|span|style|title"
- +"|valign<baseline?bottom?middle?top|width],"
-+"colgroup[align<center?char?justify?left?right|char|charoff|class|dir<ltr?rtl"
- +"|id|lang|onclick|ondblclick|onkeydown|onkeypress|onkeyup|onmousedown"
- +"|onmousemove|onmouseout|onmouseover|onmouseup|span|style|title"
- +"|valign<baseline?bottom?middle?top|width],"
-+"dd[class|dir<ltr?rtl|id|lang|onclick|ondblclick|onkeydown|onkeypress|onkeyup"
- +"|onmousedown|onmousemove|onmouseout|onmouseover|onmouseup|style|title],"
-+"del[cite|class|datetime|dir<ltr?rtl|id|lang|onclick|ondblclick|onkeydown"
- +"|onkeypress|onkeyup|onmousedown|onmousemove|onmouseout|onmouseover"
- +"|onmouseup|style|title],"
-+"dfn[class|dir<ltr?rtl|id|lang|onclick|ondblclick|onkeydown|onkeypress"
- +"|onkeyup|onmousedown|onmousemove|onmouseout|onmouseover|onmouseup|style"
- +"|title],"
-+"dir[class|compact<compact|dir<ltr?rtl|id|lang|onclick|ondblclick|onkeydown"
- +"|onkeypress|onkeyup|onmousedown|onmousemove|onmouseout|onmouseover"
- +"|onmouseup|style|title],"
-+"div[align<center?justify?left?right|class|dir<ltr?rtl|id|lang|onclick"
- +"|ondblclick|onkeydown|onkeypress|onkeyup|onmousedown|onmousemove"
- +"|onmouseout|onmouseover|onmouseup|style|title],"
-+"dl[class|compact<compact|dir<ltr?rtl|id|lang|onclick|ondblclick|onkeydown"
- +"|onkeypress|onkeyup|onmousedown|onmousemove|onmouseout|onmouseover"
- +"|onmouseup|style|title],"
-+"dt[class|dir<ltr?rtl|id|lang|onclick|ondblclick|onkeydown|onkeypress|onkeyup"
- +"|onmousedown|onmousemove|onmouseout|onmouseover|onmouseup|style|title],"
-+"em/i[class|dir<ltr?rtl|id|lang|onclick|ondblclick|onkeydown|onkeypress"
- +"|onkeyup|onmousedown|onmousemove|onmouseout|onmouseover|onmouseup|style"
- +"|title],"
-+"fieldset[class|dir<ltr?rtl|id|lang|onclick|ondblclick|onkeydown|onkeypress"
- +"|onkeyup|onmousedown|onmousemove|onmouseout|onmouseover|onmouseup|style"
- +"|title],"
-+"font[class|color|dir<ltr?rtl|face|id|lang|size|style|title],"
-+"form[accept|accept-charset|action|class|dir<ltr?rtl|enctype|id|lang"
- +"|method<get?post|name|onclick|ondblclick|onkeydown|onkeypress|onkeyup"
- +"|onmousedown|onmousemove|onmouseout|onmouseover|onmouseup|onreset|onsubmit"
- +"|style|title|target],"
-+"frame[class|frameborder|id|longdesc|marginheight|marginwidth|name"
- +"|noresize<noresize|scrolling<auto?no?yes|src|style|title],"
-+"frameset[class|cols|id|onload|onunload|rows|style|title],"
-+"h1[align<center?justify?left?right|class|dir<ltr?rtl|id|lang|onclick"
- +"|ondblclick|onkeydown|onkeypress|onkeyup|onmousedown|onmousemove"
- +"|onmouseout|onmouseover|onmouseup|style|title],"
-+"h2[align<center?justify?left?right|class|dir<ltr?rtl|id|lang|onclick"
- +"|ondblclick|onkeydown|onkeypress|onkeyup|onmousedown|onmousemove"
- +"|onmouseout|onmouseover|onmouseup|style|title],"
-+"h3[align<center?justify?left?right|class|dir<ltr?rtl|id|lang|onclick"
- +"|ondblclick|onkeydown|onkeypress|onkeyup|onmousedown|onmousemove"
- +"|onmouseout|onmouseover|onmouseup|style|title],"
-+"h4[align<center?justify?left?right|class|dir<ltr?rtl|id|lang|onclick"
- +"|ondblclick|onkeydown|onkeypress|onkeyup|onmousedown|onmousemove"
- +"|onmouseout|onmouseover|onmouseup|style|title],"
-+"h5[align<center?justify?left?right|class|dir<ltr?rtl|id|lang|onclick"
- +"|ondblclick|onkeydown|onkeypress|onkeyup|onmousedown|onmousemove"
- +"|onmouseout|onmouseover|onmouseup|style|title],"
-+"h6[align<center?justify?left?right|class|dir<ltr?rtl|id|lang|onclick"
- +"|ondblclick|onkeydown|onkeypress|onkeyup|onmousedown|onmousemove"
- +"|onmouseout|onmouseover|onmouseup|style|title],"
-+"head[dir<ltr?rtl|lang|profile],"
-+"hr[align<center?left?right|class|dir<ltr?rtl|id|lang|noshade<noshade|onclick"
- +"|ondblclick|onkeydown|onkeypress|onkeyup|onmousedown|onmousemove"
- +"|onmouseout|onmouseover|onmouseup|size|style|title|width],"
-+"html[dir<ltr?rtl|lang|version],"
-+"iframe[align<bottom?left?middle?right?top|class|frameborder|height|id"
- +"|longdesc|marginheight|marginwidth|name|scrolling<auto?no?yes|src|style"
- +"|title|width],"
-+"img[align<bottom?left?middle?right?top|alt|border|class|dir<ltr?rtl|height"
- +"|hspace|id|ismap<ismap|lang|longdesc|name|onclick|ondblclick|onkeydown"
- +"|onkeypress|onkeyup|onmousedown|onmousemove|onmouseout|onmouseover"
- +"|onmouseup|src|style|title|usemap|vspace|width],"
-+"input[accept|accesskey|align<bottom?left?middle?right?top|alt"
- +"|checked<checked|class|dir<ltr?rtl|disabled<disabled|id|ismap<ismap|lang"
- +"|maxlength|name|onblur|onclick|ondblclick|onfocus|onkeydown|onkeypress"
- +"|onkeyup|onmousedown|onmousemove|onmouseout|onmouseover|onmouseup|onselect"
- +"|readonly<readonly|size|src|style|tabindex|title"
- +"|type<button?checkbox?file?hidden?image?password?radio?reset?submit?text"
- +"|usemap|value],"
-+"ins[cite|class|datetime|dir<ltr?rtl|id|lang|onclick|ondblclick|onkeydown"
- +"|onkeypress|onkeyup|onmousedown|onmousemove|onmouseout|onmouseover"
- +"|onmouseup|style|title],"
-+"isindex[class|dir<ltr?rtl|id|lang|prompt|style|title],"
-+"kbd[class|dir<ltr?rtl|id|lang|onclick|ondblclick|onkeydown|onkeypress"
- +"|onkeyup|onmousedown|onmousemove|onmouseout|onmouseover|onmouseup|style"
- +"|title],"
-+"label[accesskey|class|dir<ltr?rtl|for|id|lang|onblur|onclick|ondblclick"
- +"|onfocus|onkeydown|onkeypress|onkeyup|onmousedown|onmousemove|onmouseout"
- +"|onmouseover|onmouseup|style|title],"
-+"legend[align<bottom?left?right?top|accesskey|class|dir<ltr?rtl|id|lang"
- +"|onclick|ondblclick|onkeydown|onkeypress|onkeyup|onmousedown|onmousemove"
- +"|onmouseout|onmouseover|onmouseup|style|title],"
-+"li[class|dir<ltr?rtl|id|lang|onclick|ondblclick|onkeydown|onkeypress|onkeyup"
- +"|onmousedown|onmousemove|onmouseout|onmouseover|onmouseup|style|title|type"
- +"|value],"
-+"link[charset|class|dir<ltr?rtl|href|hreflang|id|lang|media|onclick"
- +"|ondblclick|onkeydown|onkeypress|onkeyup|onmousedown|onmousemove"
- +"|onmouseout|onmouseover|onmouseup|rel|rev|style|title|target|type],"
-+"map[class|dir<ltr?rtl|id|lang|name|onclick|ondblclick|onkeydown|onkeypress"
- +"|onkeyup|onmousedown|onmousemove|onmouseout|onmouseover|onmouseup|style"
- +"|title],"
-+"menu[class|compact<compact|dir<ltr?rtl|id|lang|onclick|ondblclick|onkeydown"
- +"|onkeypress|onkeyup|onmousedown|onmousemove|onmouseout|onmouseover"
- +"|onmouseup|style|title],"
-+"meta[content|dir<ltr?rtl|http-equiv|lang|name|scheme],"
-+"noframes[class|dir<ltr?rtl|id|lang|onclick|ondblclick|onkeydown|onkeypress"
- +"|onkeyup|onmousedown|onmousemove|onmouseout|onmouseover|onmouseup|style"
- +"|title],"
-+"noscript[class|dir<ltr?rtl|id|lang|onclick|ondblclick|onkeydown|onkeypress"
- +"|onkeyup|onmousedown|onmousemove|onmouseout|onmouseover|onmouseup|style"
- +"|title],"
-+"object[align<bottom?left?middle?right?top|archive|border|class|classid"
- +"|codebase|codetype|data|declare|dir<ltr?rtl|height|hspace|id|lang|name"
- +"|onclick|ondblclick|onkeydown|onkeypress|onkeyup|onmousedown|onmousemove"
- +"|onmouseout|onmouseover|onmouseup|standby|style|tabindex|title|type|usemap"
- +"|vspace|width],"
-+"ol[class|compact<compact|dir<ltr?rtl|id|lang|onclick|ondblclick|onkeydown"
- +"|onkeypress|onkeyup|onmousedown|onmousemove|onmouseout|onmouseover"
- +"|onmouseup|start|style|title|type],"
-+"optgroup[class|dir<ltr?rtl|disabled<disabled|id|label|lang|onclick"
- +"|ondblclick|onkeydown|onkeypress|onkeyup|onmousedown|onmousemove"
- +"|onmouseout|onmouseover|onmouseup|style|title],"
-+"option[class|dir<ltr?rtl|disabled<disabled|id|label|lang|onclick|ondblclick"
- +"|onkeydown|onkeypress|onkeyup|onmousedown|onmousemove|onmouseout"
- +"|onmouseover|onmouseup|selected<selected|style|title|value],"
-+"p[align<center?justify?left?right|class|dir<ltr?rtl|id|lang|onclick"
- +"|ondblclick|onkeydown|onkeypress|onkeyup|onmousedown|onmousemove"
- +"|onmouseout|onmouseover|onmouseup|style|title],"
-+"param[id|name|type|value|valuetype<DATA?OBJECT?REF],"
-+"pre/listing/plaintext/xmp[align|class|dir<ltr?rtl|id|lang|onclick|ondblclick"
- +"|onkeydown|onkeypress|onkeyup|onmousedown|onmousemove|onmouseout"
- +"|onmouseover|onmouseup|style|title|width],"
-+"q[cite|class|dir<ltr?rtl|id|lang|onclick|ondblclick|onkeydown|onkeypress"
- +"|onkeyup|onmousedown|onmousemove|onmouseout|onmouseover|onmouseup|style"
- +"|title],"
-+"s[class|dir<ltr?rtl|id|lang|onclick|ondblclick|onkeydown|onkeypress|onkeyup"
- +"|onmousedown|onmousemove|onmouseout|onmouseover|onmouseup|style|title],"
-+"samp[class|dir<ltr?rtl|id|lang|onclick|ondblclick|onkeydown|onkeypress"
- +"|onkeyup|onmousedown|onmousemove|onmouseout|onmouseover|onmouseup|style"
- +"|title],"
-+"script[charset|defer|language|src|type],"
-+"select[class|dir<ltr?rtl|disabled<disabled|id|lang|multiple<multiple|name"
- +"|onblur|onclick|ondblclick|onfocus|onkeydown|onkeypress|onkeyup"
- +"|onmousedown|onmousemove|onmouseout|onmouseover|onmouseup|size|style"
- +"|tabindex|title],"
-+"small[class|dir<ltr?rtl|id|lang|onclick|ondblclick|onkeydown|onkeypress"
- +"|onkeyup|onmousedown|onmousemove|onmouseout|onmouseover|onmouseup|style"
- +"|title],"
-+"span[align<center?justify?left?right|class|dir<ltr?rtl|id|lang|onclick|ondblclick|onkeydown"
- +"|onkeypress|onkeyup|onmousedown|onmousemove|onmouseout|onmouseover"
- +"|onmouseup|style|title],"
-+"strike[class|class|dir<ltr?rtl|id|lang|onclick|ondblclick|onkeydown"
- +"|onkeypress|onkeyup|onmousedown|onmousemove|onmouseout|onmouseover"
- +"|onmouseup|style|title],"
-+"strong/b[class|dir<ltr?rtl|id|lang|onclick|ondblclick|onkeydown|onkeypress"
- +"|onkeyup|onmousedown|onmousemove|onmouseout|onmouseover|onmouseup|style"
- +"|title],"
-+"style[dir<ltr?rtl|lang|media|title|type],"
-+"sub[class|dir<ltr?rtl|id|lang|onclick|ondblclick|onkeydown|onkeypress"
- +"|onkeyup|onmousedown|onmousemove|onmouseout|onmouseover|onmouseup|style"
- +"|title],"
-+"sup[class|dir<ltr?rtl|id|lang|onclick|ondblclick|onkeydown|onkeypress"
- +"|onkeyup|onmousedown|onmousemove|onmouseout|onmouseover|onmouseup|style"
- +"|title],"
-+"table[align<center?left?right|bgcolor|border|cellpadding|cellspacing|class"
- +"|dir<ltr?rtl|frame|height|id|lang|onclick|ondblclick|onkeydown|onkeypress"
- +"|onkeyup|onmousedown|onmousemove|onmouseout|onmouseover|onmouseup|rules"
- +"|style|summary|title|width],"
-+"tbody[align<center?char?justify?left?right|char|class|charoff|dir<ltr?rtl|id"
- +"|lang|onclick|ondblclick|onkeydown|onkeypress|onkeyup|onmousedown"
- +"|onmousemove|onmouseout|onmouseover|onmouseup|style|title"
- +"|valign<baseline?bottom?middle?top],"
-+"td[abbr|align<center?char?justify?left?right|axis|bgcolor|char|charoff|class"
- +"|colspan|dir<ltr?rtl|headers|height|id|lang|nowrap<nowrap|onclick"
- +"|ondblclick|onkeydown|onkeypress|onkeyup|onmousedown|onmousemove"
- +"|onmouseout|onmouseover|onmouseup|rowspan|scope<col?colgroup?row?rowgroup"
- +"|style|title|valign<baseline?bottom?middle?top|width],"
-+"textarea[accesskey|class|cols|dir<ltr?rtl|disabled<disabled|id|lang|name"
- +"|onblur|onclick|ondblclick|onfocus|onkeydown|onkeypress|onkeyup"
- +"|onmousedown|onmousemove|onmouseout|onmouseover|onmouseup|onselect"
- +"|readonly<readonly|rows|style|tabindex|title],"
-+"tfoot[align<center?char?justify?left?right|char|charoff|class|dir<ltr?rtl|id"
- +"|lang|onclick|ondblclick|onkeydown|onkeypress|onkeyup|onmousedown"
- +"|onmousemove|onmouseout|onmouseover|onmouseup|style|title"
- +"|valign<baseline?bottom?middle?top],"
-+"th[abbr|align<center?char?justify?left?right|axis|bgcolor|char|charoff|class"
- +"|colspan|dir<ltr?rtl|headers|height|id|lang|nowrap<nowrap|onclick"
- +"|ondblclick|onkeydown|onkeypress|onkeyup|onmousedown|onmousemove"
- +"|onmouseout|onmouseover|onmouseup|rowspan|scope<col?colgroup?row?rowgroup"
- +"|style|title|valign<baseline?bottom?middle?top|width],"
-+"thead[align<center?char?justify?left?right|char|charoff|class|dir<ltr?rtl|id"
- +"|lang|onclick|ondblclick|onkeydown|onkeypress|onkeyup|onmousedown"
- +"|onmousemove|onmouseout|onmouseover|onmouseup|style|title"
- +"|valign<baseline?bottom?middle?top],"
-+"title[dir<ltr?rtl|lang],"
-+"tr[abbr|align<center?char?justify?left?right|bgcolor|char|charoff|class"
- +"|rowspan|dir<ltr?rtl|id|lang|onclick|ondblclick|onkeydown|onkeypress"
- +"|onkeyup|onmousedown|onmousemove|onmouseout|onmouseover|onmouseup|style"
- +"|title|valign<baseline?bottom?middle?top],"
-+"tt[class|dir<ltr?rtl|id|lang|onclick|ondblclick|onkeydown|onkeypress|onkeyup"
- +"|onmousedown|onmousemove|onmouseout|onmouseover|onmouseup|style|title],"
-+"u[class|dir<ltr?rtl|id|lang|onclick|ondblclick|onkeydown|onkeypress|onkeyup"
- +"|onmousedown|onmousemove|onmouseout|onmouseover|onmouseup|style|title],"
-+"ul[class|compact<compact|dir<ltr?rtl|id|lang|onclick|ondblclick|onkeydown"
- +"|onkeypress|onkeyup|onmousedown|onmousemove|onmouseout|onmouseover"
- +"|onmouseup|style|title|type],"
-+"var[class|dir<ltr?rtl|id|lang|onclick|ondblclick|onkeydown|onkeypress"
- +"|onkeyup|onmousedown|onmousemove|onmouseout|onmouseover|onmouseup|style"
- +"|title]"
-</pre>
- </div>
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/option_valid_elements.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/option_valid_elements.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/option_valid_elements.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/option_valid_elements.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,348 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Option: valid_elements</title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+ <h1>Option: valid_elements</h1>
+</div>
+
+<div class="content">
+ <p>
+ This option should contain a comma separated list element convertion chunks. Each chunk contains information about how one element and it's attributes should be treated. The default rule set for this option is specified below.
+ </p>
+ <p>
+
+ <table border="1" cellspacing="0" cellpadding="4">
+ <thead><td colspan="2">Control characters:</td></thead>
+ <tbody>
+ <tr><td><strong>,</strong></td><td>Separates element chunk definitions.</td></tr>
+ <tr><td><strong>/</strong></td><td>Separates element synonymous. The first element is the one that will be outputted.</td></tr>
+ <tr><td><strong>|</strong></td><td>Separates attribute definitions.</td></tr>
+ <tr><td><strong>[</strong></td><td>Starts a new attribute list for a element definition.</td></tr>
+ <tr><td><strong>]</strong></td><td>Ends a attribute list for a element definition.</td></tr>
+ <tr><td><strong>=</strong></td><td>Makes the attribute to default to the specified value. For example "target=_blank"</td></tr>
+ <tr><td><strong>:</strong></td><td>Makes the attribute to be forced to the specified value. For example "border:0"</td></tr>
+ <tr><td><strong><</strong></td><td>Verifies the value of a attribute. For example "target<_blank?_self"</td></tr>
+ <tr><td><strong>?</strong></td><td>Separates attribute verification values, see above.</td></tr>
+ <tr><td><strong>+</strong></td><td>Makes the element open if no child nodes exists. Example: +a.</td></tr>
+ <tr><td><strong>-</strong></td><td>Enables removal of empty elements such as >strong /<. Example: -strong.</td></tr>
+ <tr><td><strong>#</strong></td><td>Enables padding of empty elements, this will padd with if they are empty. Example: #p.</td></tr>
+ </tbody>
+ </table>
+ Wildcards such as *,+,? may be used in element or attribute name matching.
+ </p>
+ <p>
+ Special variables:<br />
+ <strong>{$uid}</strong> Results in a unique ID. For example "p[id:{$uid}]".<br />
+ <br />
+ Use *[*] to include all elements and all attributes this can be very useful when used with the <a href="option_invalid_elements.html">invalid_elements</a> option.
+ </p>
+
+ <div class="separator"></div>
+
+ <h3>Example of usage of the valid_elements option:</h3>
+ <p>
+ This example string tells TinyMCE to remove all elements that are not a "a, strong, div or br" element, convert b elements to strong elements, default target to "_blank" and keep the href, target and align attributes of the elements.
+ </p>
+ <div class="example">
+<pre>
+tinyMCE.init({
+ ...
+ <strong>valid_elements : "a[href|target=_blank],strong/b,div[align],br"</strong>
+});
+</pre>
+ </div>
+
+ <div class="separator"></div>
+
+ <h3>Default rule set:</h3>
+ <p>
+ This is the default string used by TinyMCE to cleanup the HTML contents.
+ </p>
+ <div class="example">
+<pre>
++a[id|style|rel|rev|charset|hreflang|dir|lang|tabindex|accesskey|type|name|href|target|title|class|onfocus|onblur|onclick|ondblclick|onmousedown|onmouseup|onmouseover|onmousemove|onmouseout|onkeypress|onkeydown|onkeyup],-strong/-b[class|style],-em/-i[class|style],-strike[class|style],-u[class|style],#p[id|style|dir|class|align],-ol[class|style],-ul[class|style],-li[class|style],br,img[id|dir|lang|longdesc|usemap|style|class|src|onmouseover|onmouseout|border|alt=|title|hspace|vspace|width|height|align],-sub[style|class],-sup[style|class],-blockquote[dir|style],-table[border=0|cellspacing|cellpadding|width|height|class|align|summary|style|dir|id|lang|bgcolor|background|bordercolor],-tr[id|lang|dir|class|rowspan|width|height|align|valign|style|bgcolor|background|bordercolor],tbody[id|class],thead[id|class],tfoot[id|class],-td[id|lang|dir|class|colspan|rowspan|width|height|align|valign|style|bgcolor|background|bordercolor|scope],-th[id|lang|dir|class|colspan|rowspan|width|height|align|valign|style|scope],caption[id|lang|dir|class|style],-div[id|dir|class|align|style],-span[style|class|align],-pre[class|align|style],address[class|align|style],-h1[id|style|dir|class|align],-h2[id|style|dir|class|align],-h3[id|style|dir|class|align],-h4[id|style|dir|class|align],-h5[id|style|dir|class|align],-h6[id|style|dir|class|align],hr[class|style],-font[face|size|style|id|class|dir|color],dd[id|class|title|style|dir|lang],dl[id|class|title|style|dir|lang],dt[id|class|title|style|dir|lang]
+</pre>
+ </div>
+
+ <div class="separator"></div>
+
+ <h3>Full XHTML rule set:</h3>
+ <p>
+ The following will validate that the page complies fully with the XHTML specification.
+ </p>
+ <div class="example">
+<pre>
+valid_elements : ""
++"a[accesskey|charset|class|coords|dir<ltr?rtl|href|hreflang|id|lang|name"
+ +"|onblur|onclick|ondblclick|onfocus|onkeydown|onkeypress|onkeyup"
+ +"|onmousedown|onmousemove|onmouseout|onmouseover|onmouseup|rel|rev"
+ +"|shape<circle?default?poly?rect|style|tabindex|title|target|type],"
++"abbr[class|dir<ltr?rtl|id|lang|onclick|ondblclick|onkeydown|onkeypress"
+ +"|onkeyup|onmousedown|onmousemove|onmouseout|onmouseover|onmouseup|style"
+ +"|title],"
++"acronym[class|dir<ltr?rtl|id|id|lang|onclick|ondblclick|onkeydown|onkeypress"
+ +"|onkeyup|onmousedown|onmousemove|onmouseout|onmouseover|onmouseup|style"
+ +"|title],"
++"address[class|align|dir<ltr?rtl|id|lang|onclick|ondblclick|onkeydown"
+ +"|onkeypress|onkeyup|onmousedown|onmousemove|onmouseout|onmouseover"
+ +"|onmouseup|style|title],"
++"applet[align<bottom?left?middle?right?top|alt|archive|class|code|codebase"
+ +"|height|hspace|id|name|object|style|title|vspace|width],"
++"area[accesskey|alt|class|coords|dir<ltr?rtl|href|id|lang|nohref<nohref"
+ +"|onblur|onclick|ondblclick|onfocus|onkeydown|onkeypress|onkeyup"
+ +"|onmousedown|onmousemove|onmouseout|onmouseover|onmouseup"
+ +"|shape<circle?default?poly?rect|style|tabindex|title|target],"
++"base[href|target],"
++"basefont[color|face|id|size],"
++"bdo[class|dir<ltr?rtl|id|lang|style|title],"
++"big[class|dir<ltr?rtl|id|lang|onclick|ondblclick|onkeydown|onkeypress"
+ +"|onkeyup|onmousedown|onmousemove|onmouseout|onmouseover|onmouseup|style"
+ +"|title],"
++"blockquote[dir|style|cite|class|dir<ltr?rtl|id|lang|onclick|ondblclick"
+ +"|onkeydown|onkeypress|onkeyup|onmousedown|onmousemove|onmouseout"
+ +"|onmouseover|onmouseup|style|title],"
++"body[alink|background|bgcolor|class|dir<ltr?rtl|id|lang|link|onclick"
+ +"|ondblclick|onkeydown|onkeypress|onkeyup|onload|onmousedown|onmousemove"
+ +"|onmouseout|onmouseover|onmouseup|onunload|style|title|text|vlink],"
++"br[class|clear<all?left?none?right|id|style|title],"
++"button[accesskey|class|dir<ltr?rtl|disabled<disabled|id|lang|name|onblur"
+ +"|onclick|ondblclick|onfocus|onkeydown|onkeypress|onkeyup|onmousedown"
+ +"|onmousemove|onmouseout|onmouseover|onmouseup|style|tabindex|title|type"
+ +"|value],"
++"caption[align<bottom?left?right?top|class|dir<ltr?rtl|id|lang|onclick"
+ +"|ondblclick|onkeydown|onkeypress|onkeyup|onmousedown|onmousemove"
+ +"|onmouseout|onmouseover|onmouseup|style|title],"
++"center[class|dir<ltr?rtl|id|lang|onclick|ondblclick|onkeydown|onkeypress"
+ +"|onkeyup|onmousedown|onmousemove|onmouseout|onmouseover|onmouseup|style"
+ +"|title],"
++"cite[class|dir<ltr?rtl|id|lang|onclick|ondblclick|onkeydown|onkeypress"
+ +"|onkeyup|onmousedown|onmousemove|onmouseout|onmouseover|onmouseup|style"
+ +"|title],"
++"code[class|dir<ltr?rtl|id|lang|onclick|ondblclick|onkeydown|onkeypress"
+ +"|onkeyup|onmousedown|onmousemove|onmouseout|onmouseover|onmouseup|style"
+ +"|title],"
++"col[align<center?char?justify?left?right|char|charoff|class|dir<ltr?rtl|id"
+ +"|lang|onclick|ondblclick|onkeydown|onkeypress|onkeyup|onmousedown"
+ +"|onmousemove|onmouseout|onmouseover|onmouseup|span|style|title"
+ +"|valign<baseline?bottom?middle?top|width],"
++"colgroup[align<center?char?justify?left?right|char|charoff|class|dir<ltr?rtl"
+ +"|id|lang|onclick|ondblclick|onkeydown|onkeypress|onkeyup|onmousedown"
+ +"|onmousemove|onmouseout|onmouseover|onmouseup|span|style|title"
+ +"|valign<baseline?bottom?middle?top|width],"
++"dd[class|dir<ltr?rtl|id|lang|onclick|ondblclick|onkeydown|onkeypress|onkeyup"
+ +"|onmousedown|onmousemove|onmouseout|onmouseover|onmouseup|style|title],"
++"del[cite|class|datetime|dir<ltr?rtl|id|lang|onclick|ondblclick|onkeydown"
+ +"|onkeypress|onkeyup|onmousedown|onmousemove|onmouseout|onmouseover"
+ +"|onmouseup|style|title],"
++"dfn[class|dir<ltr?rtl|id|lang|onclick|ondblclick|onkeydown|onkeypress"
+ +"|onkeyup|onmousedown|onmousemove|onmouseout|onmouseover|onmouseup|style"
+ +"|title],"
++"dir[class|compact<compact|dir<ltr?rtl|id|lang|onclick|ondblclick|onkeydown"
+ +"|onkeypress|onkeyup|onmousedown|onmousemove|onmouseout|onmouseover"
+ +"|onmouseup|style|title],"
++"div[align<center?justify?left?right|class|dir<ltr?rtl|id|lang|onclick"
+ +"|ondblclick|onkeydown|onkeypress|onkeyup|onmousedown|onmousemove"
+ +"|onmouseout|onmouseover|onmouseup|style|title],"
++"dl[class|compact<compact|dir<ltr?rtl|id|lang|onclick|ondblclick|onkeydown"
+ +"|onkeypress|onkeyup|onmousedown|onmousemove|onmouseout|onmouseover"
+ +"|onmouseup|style|title],"
++"dt[class|dir<ltr?rtl|id|lang|onclick|ondblclick|onkeydown|onkeypress|onkeyup"
+ +"|onmousedown|onmousemove|onmouseout|onmouseover|onmouseup|style|title],"
++"em/i[class|dir<ltr?rtl|id|lang|onclick|ondblclick|onkeydown|onkeypress"
+ +"|onkeyup|onmousedown|onmousemove|onmouseout|onmouseover|onmouseup|style"
+ +"|title],"
++"fieldset[class|dir<ltr?rtl|id|lang|onclick|ondblclick|onkeydown|onkeypress"
+ +"|onkeyup|onmousedown|onmousemove|onmouseout|onmouseover|onmouseup|style"
+ +"|title],"
++"font[class|color|dir<ltr?rtl|face|id|lang|size|style|title],"
++"form[accept|accept-charset|action|class|dir<ltr?rtl|enctype|id|lang"
+ +"|method<get?post|name|onclick|ondblclick|onkeydown|onkeypress|onkeyup"
+ +"|onmousedown|onmousemove|onmouseout|onmouseover|onmouseup|onreset|onsubmit"
+ +"|style|title|target],"
++"frame[class|frameborder|id|longdesc|marginheight|marginwidth|name"
+ +"|noresize<noresize|scrolling<auto?no?yes|src|style|title],"
++"frameset[class|cols|id|onload|onunload|rows|style|title],"
++"h1[align<center?justify?left?right|class|dir<ltr?rtl|id|lang|onclick"
+ +"|ondblclick|onkeydown|onkeypress|onkeyup|onmousedown|onmousemove"
+ +"|onmouseout|onmouseover|onmouseup|style|title],"
++"h2[align<center?justify?left?right|class|dir<ltr?rtl|id|lang|onclick"
+ +"|ondblclick|onkeydown|onkeypress|onkeyup|onmousedown|onmousemove"
+ +"|onmouseout|onmouseover|onmouseup|style|title],"
++"h3[align<center?justify?left?right|class|dir<ltr?rtl|id|lang|onclick"
+ +"|ondblclick|onkeydown|onkeypress|onkeyup|onmousedown|onmousemove"
+ +"|onmouseout|onmouseover|onmouseup|style|title],"
++"h4[align<center?justify?left?right|class|dir<ltr?rtl|id|lang|onclick"
+ +"|ondblclick|onkeydown|onkeypress|onkeyup|onmousedown|onmousemove"
+ +"|onmouseout|onmouseover|onmouseup|style|title],"
++"h5[align<center?justify?left?right|class|dir<ltr?rtl|id|lang|onclick"
+ +"|ondblclick|onkeydown|onkeypress|onkeyup|onmousedown|onmousemove"
+ +"|onmouseout|onmouseover|onmouseup|style|title],"
++"h6[align<center?justify?left?right|class|dir<ltr?rtl|id|lang|onclick"
+ +"|ondblclick|onkeydown|onkeypress|onkeyup|onmousedown|onmousemove"
+ +"|onmouseout|onmouseover|onmouseup|style|title],"
++"head[dir<ltr?rtl|lang|profile],"
++"hr[align<center?left?right|class|dir<ltr?rtl|id|lang|noshade<noshade|onclick"
+ +"|ondblclick|onkeydown|onkeypress|onkeyup|onmousedown|onmousemove"
+ +"|onmouseout|onmouseover|onmouseup|size|style|title|width],"
++"html[dir<ltr?rtl|lang|version],"
++"iframe[align<bottom?left?middle?right?top|class|frameborder|height|id"
+ +"|longdesc|marginheight|marginwidth|name|scrolling<auto?no?yes|src|style"
+ +"|title|width],"
++"img[align<bottom?left?middle?right?top|alt|border|class|dir<ltr?rtl|height"
+ +"|hspace|id|ismap<ismap|lang|longdesc|name|onclick|ondblclick|onkeydown"
+ +"|onkeypress|onkeyup|onmousedown|onmousemove|onmouseout|onmouseover"
+ +"|onmouseup|src|style|title|usemap|vspace|width],"
++"input[accept|accesskey|align<bottom?left?middle?right?top|alt"
+ +"|checked<checked|class|dir<ltr?rtl|disabled<disabled|id|ismap<ismap|lang"
+ +"|maxlength|name|onblur|onclick|ondblclick|onfocus|onkeydown|onkeypress"
+ +"|onkeyup|onmousedown|onmousemove|onmouseout|onmouseover|onmouseup|onselect"
+ +"|readonly<readonly|size|src|style|tabindex|title"
+ +"|type<button?checkbox?file?hidden?image?password?radio?reset?submit?text"
+ +"|usemap|value],"
++"ins[cite|class|datetime|dir<ltr?rtl|id|lang|onclick|ondblclick|onkeydown"
+ +"|onkeypress|onkeyup|onmousedown|onmousemove|onmouseout|onmouseover"
+ +"|onmouseup|style|title],"
++"isindex[class|dir<ltr?rtl|id|lang|prompt|style|title],"
++"kbd[class|dir<ltr?rtl|id|lang|onclick|ondblclick|onkeydown|onkeypress"
+ +"|onkeyup|onmousedown|onmousemove|onmouseout|onmouseover|onmouseup|style"
+ +"|title],"
++"label[accesskey|class|dir<ltr?rtl|for|id|lang|onblur|onclick|ondblclick"
+ +"|onfocus|onkeydown|onkeypress|onkeyup|onmousedown|onmousemove|onmouseout"
+ +"|onmouseover|onmouseup|style|title],"
++"legend[align<bottom?left?right?top|accesskey|class|dir<ltr?rtl|id|lang"
+ +"|onclick|ondblclick|onkeydown|onkeypress|onkeyup|onmousedown|onmousemove"
+ +"|onmouseout|onmouseover|onmouseup|style|title],"
++"li[class|dir<ltr?rtl|id|lang|onclick|ondblclick|onkeydown|onkeypress|onkeyup"
+ +"|onmousedown|onmousemove|onmouseout|onmouseover|onmouseup|style|title|type"
+ +"|value],"
++"link[charset|class|dir<ltr?rtl|href|hreflang|id|lang|media|onclick"
+ +"|ondblclick|onkeydown|onkeypress|onkeyup|onmousedown|onmousemove"
+ +"|onmouseout|onmouseover|onmouseup|rel|rev|style|title|target|type],"
++"map[class|dir<ltr?rtl|id|lang|name|onclick|ondblclick|onkeydown|onkeypress"
+ +"|onkeyup|onmousedown|onmousemove|onmouseout|onmouseover|onmouseup|style"
+ +"|title],"
++"menu[class|compact<compact|dir<ltr?rtl|id|lang|onclick|ondblclick|onkeydown"
+ +"|onkeypress|onkeyup|onmousedown|onmousemove|onmouseout|onmouseover"
+ +"|onmouseup|style|title],"
++"meta[content|dir<ltr?rtl|http-equiv|lang|name|scheme],"
++"noframes[class|dir<ltr?rtl|id|lang|onclick|ondblclick|onkeydown|onkeypress"
+ +"|onkeyup|onmousedown|onmousemove|onmouseout|onmouseover|onmouseup|style"
+ +"|title],"
++"noscript[class|dir<ltr?rtl|id|lang|onclick|ondblclick|onkeydown|onkeypress"
+ +"|onkeyup|onmousedown|onmousemove|onmouseout|onmouseover|onmouseup|style"
+ +"|title],"
++"object[align<bottom?left?middle?right?top|archive|border|class|classid"
+ +"|codebase|codetype|data|declare|dir<ltr?rtl|height|hspace|id|lang|name"
+ +"|onclick|ondblclick|onkeydown|onkeypress|onkeyup|onmousedown|onmousemove"
+ +"|onmouseout|onmouseover|onmouseup|standby|style|tabindex|title|type|usemap"
+ +"|vspace|width],"
++"ol[class|compact<compact|dir<ltr?rtl|id|lang|onclick|ondblclick|onkeydown"
+ +"|onkeypress|onkeyup|onmousedown|onmousemove|onmouseout|onmouseover"
+ +"|onmouseup|start|style|title|type],"
++"optgroup[class|dir<ltr?rtl|disabled<disabled|id|label|lang|onclick"
+ +"|ondblclick|onkeydown|onkeypress|onkeyup|onmousedown|onmousemove"
+ +"|onmouseout|onmouseover|onmouseup|style|title],"
++"option[class|dir<ltr?rtl|disabled<disabled|id|label|lang|onclick|ondblclick"
+ +"|onkeydown|onkeypress|onkeyup|onmousedown|onmousemove|onmouseout"
+ +"|onmouseover|onmouseup|selected<selected|style|title|value],"
++"p[align<center?justify?left?right|class|dir<ltr?rtl|id|lang|onclick"
+ +"|ondblclick|onkeydown|onkeypress|onkeyup|onmousedown|onmousemove"
+ +"|onmouseout|onmouseover|onmouseup|style|title],"
++"param[id|name|type|value|valuetype<DATA?OBJECT?REF],"
++"pre/listing/plaintext/xmp[align|class|dir<ltr?rtl|id|lang|onclick|ondblclick"
+ +"|onkeydown|onkeypress|onkeyup|onmousedown|onmousemove|onmouseout"
+ +"|onmouseover|onmouseup|style|title|width],"
++"q[cite|class|dir<ltr?rtl|id|lang|onclick|ondblclick|onkeydown|onkeypress"
+ +"|onkeyup|onmousedown|onmousemove|onmouseout|onmouseover|onmouseup|style"
+ +"|title],"
++"s[class|dir<ltr?rtl|id|lang|onclick|ondblclick|onkeydown|onkeypress|onkeyup"
+ +"|onmousedown|onmousemove|onmouseout|onmouseover|onmouseup|style|title],"
++"samp[class|dir<ltr?rtl|id|lang|onclick|ondblclick|onkeydown|onkeypress"
+ +"|onkeyup|onmousedown|onmousemove|onmouseout|onmouseover|onmouseup|style"
+ +"|title],"
++"script[charset|defer|language|src|type],"
++"select[class|dir<ltr?rtl|disabled<disabled|id|lang|multiple<multiple|name"
+ +"|onblur|onclick|ondblclick|onfocus|onkeydown|onkeypress|onkeyup"
+ +"|onmousedown|onmousemove|onmouseout|onmouseover|onmouseup|size|style"
+ +"|tabindex|title],"
++"small[class|dir<ltr?rtl|id|lang|onclick|ondblclick|onkeydown|onkeypress"
+ +"|onkeyup|onmousedown|onmousemove|onmouseout|onmouseover|onmouseup|style"
+ +"|title],"
++"span[align<center?justify?left?right|class|dir<ltr?rtl|id|lang|onclick|ondblclick|onkeydown"
+ +"|onkeypress|onkeyup|onmousedown|onmousemove|onmouseout|onmouseover"
+ +"|onmouseup|style|title],"
++"strike[class|class|dir<ltr?rtl|id|lang|onclick|ondblclick|onkeydown"
+ +"|onkeypress|onkeyup|onmousedown|onmousemove|onmouseout|onmouseover"
+ +"|onmouseup|style|title],"
++"strong/b[class|dir<ltr?rtl|id|lang|onclick|ondblclick|onkeydown|onkeypress"
+ +"|onkeyup|onmousedown|onmousemove|onmouseout|onmouseover|onmouseup|style"
+ +"|title],"
++"style[dir<ltr?rtl|lang|media|title|type],"
++"sub[class|dir<ltr?rtl|id|lang|onclick|ondblclick|onkeydown|onkeypress"
+ +"|onkeyup|onmousedown|onmousemove|onmouseout|onmouseover|onmouseup|style"
+ +"|title],"
++"sup[class|dir<ltr?rtl|id|lang|onclick|ondblclick|onkeydown|onkeypress"
+ +"|onkeyup|onmousedown|onmousemove|onmouseout|onmouseover|onmouseup|style"
+ +"|title],"
++"table[align<center?left?right|bgcolor|border|cellpadding|cellspacing|class"
+ +"|dir<ltr?rtl|frame|height|id|lang|onclick|ondblclick|onkeydown|onkeypress"
+ +"|onkeyup|onmousedown|onmousemove|onmouseout|onmouseover|onmouseup|rules"
+ +"|style|summary|title|width],"
++"tbody[align<center?char?justify?left?right|char|class|charoff|dir<ltr?rtl|id"
+ +"|lang|onclick|ondblclick|onkeydown|onkeypress|onkeyup|onmousedown"
+ +"|onmousemove|onmouseout|onmouseover|onmouseup|style|title"
+ +"|valign<baseline?bottom?middle?top],"
++"td[abbr|align<center?char?justify?left?right|axis|bgcolor|char|charoff|class"
+ +"|colspan|dir<ltr?rtl|headers|height|id|lang|nowrap<nowrap|onclick"
+ +"|ondblclick|onkeydown|onkeypress|onkeyup|onmousedown|onmousemove"
+ +"|onmouseout|onmouseover|onmouseup|rowspan|scope<col?colgroup?row?rowgroup"
+ +"|style|title|valign<baseline?bottom?middle?top|width],"
++"textarea[accesskey|class|cols|dir<ltr?rtl|disabled<disabled|id|lang|name"
+ +"|onblur|onclick|ondblclick|onfocus|onkeydown|onkeypress|onkeyup"
+ +"|onmousedown|onmousemove|onmouseout|onmouseover|onmouseup|onselect"
+ +"|readonly<readonly|rows|style|tabindex|title],"
++"tfoot[align<center?char?justify?left?right|char|charoff|class|dir<ltr?rtl|id"
+ +"|lang|onclick|ondblclick|onkeydown|onkeypress|onkeyup|onmousedown"
+ +"|onmousemove|onmouseout|onmouseover|onmouseup|style|title"
+ +"|valign<baseline?bottom?middle?top],"
++"th[abbr|align<center?char?justify?left?right|axis|bgcolor|char|charoff|class"
+ +"|colspan|dir<ltr?rtl|headers|height|id|lang|nowrap<nowrap|onclick"
+ +"|ondblclick|onkeydown|onkeypress|onkeyup|onmousedown|onmousemove"
+ +"|onmouseout|onmouseover|onmouseup|rowspan|scope<col?colgroup?row?rowgroup"
+ +"|style|title|valign<baseline?bottom?middle?top|width],"
++"thead[align<center?char?justify?left?right|char|charoff|class|dir<ltr?rtl|id"
+ +"|lang|onclick|ondblclick|onkeydown|onkeypress|onkeyup|onmousedown"
+ +"|onmousemove|onmouseout|onmouseover|onmouseup|style|title"
+ +"|valign<baseline?bottom?middle?top],"
++"title[dir<ltr?rtl|lang],"
++"tr[abbr|align<center?char?justify?left?right|bgcolor|char|charoff|class"
+ +"|rowspan|dir<ltr?rtl|id|lang|onclick|ondblclick|onkeydown|onkeypress"
+ +"|onkeyup|onmousedown|onmousemove|onmouseout|onmouseover|onmouseup|style"
+ +"|title|valign<baseline?bottom?middle?top],"
++"tt[class|dir<ltr?rtl|id|lang|onclick|ondblclick|onkeydown|onkeypress|onkeyup"
+ +"|onmousedown|onmousemove|onmouseout|onmouseover|onmouseup|style|title],"
++"u[class|dir<ltr?rtl|id|lang|onclick|ondblclick|onkeydown|onkeypress|onkeyup"
+ +"|onmousedown|onmousemove|onmouseout|onmouseover|onmouseup|style|title],"
++"ul[class|compact<compact|dir<ltr?rtl|id|lang|onclick|ondblclick|onkeydown"
+ +"|onkeypress|onkeyup|onmousedown|onmousemove|onmouseout|onmouseover"
+ +"|onmouseup|style|title|type],"
++"var[class|dir<ltr?rtl|id|lang|onclick|ondblclick|onkeydown|onkeypress"
+ +"|onkeyup|onmousedown|onmousemove|onmouseout|onmouseover|onmouseup|style"
+ +"|title]"
+</pre>
+ </div>
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/option_verify_css_classes.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/option_verify_css_classes.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/option_verify_css_classes.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,38 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Option: verify_css_classes</title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
- <h1><span class="marked">(Removed)</span>Option: verify_css_classes</h1>
-</div>
-
-<div class="content">
- <p>
- If you enable this function, class names placed in class attributes will be verified agains the content CSS. So elements with a class attribute containing a class that doesn't exist in the CSS will be removed.
- </p>
-
- <div class="separator"></div>
-
- <h3>Example of usage of the verify_css_classes option:</h3>
- <div class="example">
-<pre>
-tinyMCE.init({
- ...
- <strong>verify_css_classes : true</strong>
-});
-</pre>
- </div>
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/option_verify_css_classes.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/option_verify_css_classes.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/option_verify_css_classes.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/option_verify_css_classes.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,38 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Option: verify_css_classes</title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+ <h1><span class="marked">(Removed)</span>Option: verify_css_classes</h1>
+</div>
+
+<div class="content">
+ <p>
+ If you enable this function, class names placed in class attributes will be verified agains the content CSS. So elements with a class attribute containing a class that doesn't exist in the CSS will be removed.
+ </p>
+
+ <div class="separator"></div>
+
+ <h3>Example of usage of the verify_css_classes option:</h3>
+ <div class="example">
+<pre>
+tinyMCE.init({
+ ...
+ <strong>verify_css_classes : true</strong>
+});
+</pre>
+ </div>
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/option_verify_html.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/option_verify_html.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/option_verify_html.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,38 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Option: verify_html</title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
- <h1>Option: verify_html</h1>
-</div>
-
-<div class="content">
- <p>
- This option enabled or disables the element cleanup functionality. If you set this option to false, all element cleanup will be skipped but other cleanup functionality such as URL convertion will still be executed.
- </p>
-
- <div class="separator"></div>
-
- <h3>Example of usage of the verify_html option:</h3>
- <div class="example">
-<pre>
-tinyMCE.init({
- ...
- <strong>verify_html : false</strong>
-});
-</pre>
- </div>
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/option_verify_html.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/option_verify_html.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/option_verify_html.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/option_verify_html.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,38 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Option: verify_html</title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+ <h1>Option: verify_html</h1>
+</div>
+
+<div class="content">
+ <p>
+ This option enabled or disables the element cleanup functionality. If you set this option to false, all element cleanup will be skipped but other cleanup functionality such as URL convertion will still be executed.
+ </p>
+
+ <div class="separator"></div>
+
+ <h3>Example of usage of the verify_html option:</h3>
+ <div class="example">
+<pre>
+tinyMCE.init({
+ ...
+ <strong>verify_html : false</strong>
+});
+</pre>
+ </div>
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/option_visual.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/option_visual.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/option_visual.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,38 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Option: visual</title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
- <h1>Option: visual</h1>
-</div>
-
-<div class="content">
- <p>
- This true/false option gives you the ability to turn on/off the visual aid for border less tables. If a the border of a table is set to 0 TinyMCE adds a dotted line around the table by default.
- </p>
-
- <div class="separator"></div>
-
- <h3>Example of usage of the visual option:</h3>
- <div class="example">
-<pre>
-tinyMCE.init({
- ...
- <strong>visual : false</strong>
-});
-</pre>
- </div>
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/option_visual.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/option_visual.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/option_visual.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/option_visual.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,38 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Option: visual</title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+ <h1>Option: visual</h1>
+</div>
+
+<div class="content">
+ <p>
+ This true/false option gives you the ability to turn on/off the visual aid for border less tables. If a the border of a table is set to 0 TinyMCE adds a dotted line around the table by default.
+ </p>
+
+ <div class="separator"></div>
+
+ <h3>Example of usage of the visual option:</h3>
+ <div class="example">
+<pre>
+tinyMCE.init({
+ ...
+ <strong>visual : false</strong>
+});
+</pre>
+ </div>
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/option_visual_table_class.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/option_visual_table_class.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/option_visual_table_class.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,38 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Option: visual_table_class</title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
- <h1>Option: visual_table_class</h1>
-</div>
-
-<div class="content">
- <p>
- This option enables you to specify what CSS class to use for presenting visual aids for border less tables. The default value of this option is set to "mceVisualAid".
- </p>
-
- <div class="separator"></div>
-
- <h3>Example of usage of the visual_table_class option:</h3>
- <div class="example">
-<pre>
-tinyMCE.init({
- ...
- <strong>visual_table_class : "myCustomVisualAidTableClass"</strong>
-});
-</pre>
- </div>
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/option_visual_table_class.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/option_visual_table_class.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/option_visual_table_class.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/option_visual_table_class.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,38 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Option: visual_table_class</title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+ <h1>Option: visual_table_class</h1>
+</div>
+
+<div class="content">
+ <p>
+ This option enables you to specify what CSS class to use for presenting visual aids for border less tables. The default value of this option is set to "mceVisualAid".
+ </p>
+
+ <div class="separator"></div>
+
+ <h3>Example of usage of the visual_table_class option:</h3>
+ <div class="example">
+<pre>
+tinyMCE.init({
+ ...
+ <strong>visual_table_class : "myCustomVisualAidTableClass"</strong>
+});
+</pre>
+ </div>
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/option_width.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/option_width.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/option_width.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,38 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Option: width</title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
- <h1>Option: width</h1>
-</div>
-
-<div class="content">
- <p>
- This option gives you the ability to specify the width of the editor in pixels or percent. This width can be very useful to specify if the editor is used in hidden tabs or if the editor area should be bigger than the replaced element. The default value of this option is set to the width of the HTML element TinyMCE replaces for example the pixel width of a textarea.
- </p>
-
- <div class="separator"></div>
-
- <h3>Example of usage of the width option:</h3>
- <div class="example">
-<pre>
-tinyMCE.init({
- ...
- <strong>width : "640"</strong>
-});
-</pre>
- </div>
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/option_width.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/option_width.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/option_width.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/option_width.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,38 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Option: width</title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+ <h1>Option: width</h1>
+</div>
+
+<div class="content">
+ <p>
+ This option gives you the ability to specify the width of the editor in pixels or percent. This width can be very useful to specify if the editor is used in hidden tabs or if the editor area should be bigger than the replaced element. The default value of this option is set to the width of the HTML element TinyMCE replaces for example the pixel width of a textarea.
+ </p>
+
+ <div class="separator"></div>
+
+ <h3>Example of usage of the width option:</h3>
+ <div class="example">
+<pre>
+tinyMCE.init({
+ ...
+ <strong>width : "640"</strong>
+});
+</pre>
+ </div>
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/plugin_advhr.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/plugin_advhr.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/plugin_advhr.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,46 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Plugin: advhr</title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
- <h1>Plugin: advhr</h1>
-</div>
-
-<div class="content">
- <p>This is a more advanced hr dialog contributed by Michael Keck. This hr plugin supports noshade, width and size.</p>
-
- <h3>Installation Instructions</h3>
- <p>
- <ul>
- <li>Copy the advhr directory to the plugins directory of TinyMCE (/jscripts/tiny_mce/plugins).</li>
- <li>Add plugin to TinyMCE plugin option list example: plugins : "advhr".</li>
- <li>Add this "hr[class|width|size|noshade]" to extended_valid_elements option.</li>
- </ul>
- </p>
- <h3>Initialization Example</h3>
- <p>
- <div class="example">
- <pre>
-tinyMCE.init({
- theme : "advanced",
- mode : "textareas",
- plugins : "advhr",
- theme_advanced_buttons1_add : "advhr",
- extended_valid_elements : "hr[class|width|size|noshade]"
-});</pre>
- </div>
- </p>
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/plugin_advhr.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/plugin_advhr.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/plugin_advhr.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/plugin_advhr.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,46 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Plugin: advhr</title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+ <h1>Plugin: advhr</h1>
+</div>
+
+<div class="content">
+ <p>This is a more advanced hr dialog contributed by Michael Keck. This hr plugin supports noshade, width and size.</p>
+
+ <h3>Installation Instructions</h3>
+ <p>
+ <ul>
+ <li>Copy the advhr directory to the plugins directory of TinyMCE (/jscripts/tiny_mce/plugins).</li>
+ <li>Add plugin to TinyMCE plugin option list example: plugins : "advhr".</li>
+ <li>Add this "hr[class|width|size|noshade]" to extended_valid_elements option.</li>
+ </ul>
+ </p>
+ <h3>Initialization Example</h3>
+ <p>
+ <div class="example">
+ <pre>
+tinyMCE.init({
+ theme : "advanced",
+ mode : "textareas",
+ plugins : "advhr",
+ theme_advanced_buttons1_add : "advhr",
+ extended_valid_elements : "hr[class|width|size|noshade]"
+});</pre>
+ </div>
+ </p>
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/plugin_advimage.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/plugin_advimage.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/plugin_advimage.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,57 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Plugin: advimage</title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
- <h1>Plugin: advimage</h1>
-</div>
-
-<div class="content">
- <p>This is a more advanced image dialog mostly based on code contributed by Michael Keck. This one supports mouseover/out image swapping.</p>
-
- <h3>Installation Instructions</h3>
- <p>
- <ul>
- <li>Copy the advimage directory to the plugins directory of TinyMCE (/jscripts/tiny_mce/plugins).</li>
- <li>Add plugin to TinyMCE plugin option list example: plugins : "advimage".</li>
- <li>Add this "a[name|href|target|title|onclick]" to extended_valid_elements option.</li>
- </ul>
- </p>
-
- <p>
- <table border="1" cellspacing="0" cellpadding="4">
- <thead><td colspan="2">Advimage plugin options</td></thead>
- <tbody>
- <tr><td><strong>advimage_styles</strong></td><td>This option should contain a semicolon separated list of class titles and class names separated by =. The titles are the ones that get presented to the user in the styles drop down list and and the class names is the classes that gets inserted.</td></tr>
- <tr><td><strong>advimage_update_dimensions_onchange</strong></td><td>This option enables you to control if the image dimensions should be updated with new data if the image src field is changed. This option is enabled by default.</td></tr>
- </tbody>
- </table>
- <br />
- </p>
-
- <h3>Initialization Example</h3>
- <p>
- <div class="example">
- <pre>
-tinyMCE.init({
- theme : "advanced",
- mode : "textareas",
- plugins : "preview"
-});
-</pre>
- </div>
- </p>
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/plugin_advimage.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/plugin_advimage.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/plugin_advimage.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/plugin_advimage.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,57 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Plugin: advimage</title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+ <h1>Plugin: advimage</h1>
+</div>
+
+<div class="content">
+ <p>This is a more advanced image dialog mostly based on code contributed by Michael Keck. This one supports mouseover/out image swapping.</p>
+
+ <h3>Installation Instructions</h3>
+ <p>
+ <ul>
+ <li>Copy the advimage directory to the plugins directory of TinyMCE (/jscripts/tiny_mce/plugins).</li>
+ <li>Add plugin to TinyMCE plugin option list example: plugins : "advimage".</li>
+ <li>Add this "a[name|href|target|title|onclick]" to extended_valid_elements option.</li>
+ </ul>
+ </p>
+
+ <p>
+ <table border="1" cellspacing="0" cellpadding="4">
+ <thead><td colspan="2">Advimage plugin options</td></thead>
+ <tbody>
+ <tr><td><strong>advimage_styles</strong></td><td>This option should contain a semicolon separated list of class titles and class names separated by =. The titles are the ones that get presented to the user in the styles drop down list and and the class names is the classes that gets inserted.</td></tr>
+ <tr><td><strong>advimage_update_dimensions_onchange</strong></td><td>This option enables you to control if the image dimensions should be updated with new data if the image src field is changed. This option is enabled by default.</td></tr>
+ </tbody>
+ </table>
+ <br />
+ </p>
+
+ <h3>Initialization Example</h3>
+ <p>
+ <div class="example">
+ <pre>
+tinyMCE.init({
+ theme : "advanced",
+ mode : "textareas",
+ plugins : "preview"
+});
+</pre>
+ </div>
+ </p>
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/plugin_advlink.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/plugin_advlink.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/plugin_advlink.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,55 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Plugin: advlink</title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
- <h1>Plugin: advlink</h1>
-</div>
-
-<div class="content">
- <p>This is a more advanced link dialog mostly based on code contributed by Michael Keck. This link plugin supports popup windows and targets.</p>
-
- <h3>Installation Instructions</h3>
- <p>
- <ul>
- <li>Copy the advlink directory to the plugins directory of TinyMCE (/jscripts/tiny_mce/plugins).</li>
- <li>Add plugin to TinyMCE plugin option list example: plugins : "advlink".</li>
- <li>Add this "a[name|href|target|title|onclick]" to extended_valid_elements option.</li>
- </ul>
-
- <p>
- <table border="1" cellspacing="0" cellpadding="4">
- <thead><td colspan="2">Advlink plugin options</td></thead>
- <tbody>
- <tr><td><strong>advlink_styles</strong></td><td>This option should contain a semicolon separated list of class titles and class names separated by =. The titles are the ones that get presented to the user in the styles drop down list and and the class names is the classes that gets inserted.</td></tr>
- </tbody>
- </table>
- <br />
- </p>
-
- </p>
- <h3>Initialization Example</h3>
- <p>
- <div class="example">
- <pre>
-tinyMCE.init({
- theme : "advanced",
- mode : "textareas",
- plugins : "advlink"
-});</pre>
- </div>
- </p>
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/plugin_advlink.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/plugin_advlink.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/plugin_advlink.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/plugin_advlink.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,55 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Plugin: advlink</title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+ <h1>Plugin: advlink</h1>
+</div>
+
+<div class="content">
+ <p>This is a more advanced link dialog mostly based on code contributed by Michael Keck. This link plugin supports popup windows and targets.</p>
+
+ <h3>Installation Instructions</h3>
+ <p>
+ <ul>
+ <li>Copy the advlink directory to the plugins directory of TinyMCE (/jscripts/tiny_mce/plugins).</li>
+ <li>Add plugin to TinyMCE plugin option list example: plugins : "advlink".</li>
+ <li>Add this "a[name|href|target|title|onclick]" to extended_valid_elements option.</li>
+ </ul>
+
+ <p>
+ <table border="1" cellspacing="0" cellpadding="4">
+ <thead><td colspan="2">Advlink plugin options</td></thead>
+ <tbody>
+ <tr><td><strong>advlink_styles</strong></td><td>This option should contain a semicolon separated list of class titles and class names separated by =. The titles are the ones that get presented to the user in the styles drop down list and and the class names is the classes that gets inserted.</td></tr>
+ </tbody>
+ </table>
+ <br />
+ </p>
+
+ </p>
+ <h3>Initialization Example</h3>
+ <p>
+ <div class="example">
+ <pre>
+tinyMCE.init({
+ theme : "advanced",
+ mode : "textareas",
+ plugins : "advlink"
+});</pre>
+ </div>
+ </p>
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/plugin_autosave.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/plugin_autosave.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/plugin_autosave.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,35 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Plugin: autosave</title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
- <h1>Plugin: autosave</h1>
-</div>
-
-<div class="content">
- <p>This plugin gives the user a warning if they made modifications to a editor instance but didn't submit them. This plugin will most likely be extended in the future to provide AJAX auto save support.</p>
- <h3>Initialization Example</h3>
- <p>
- <div class="example">
- <pre>
-tinyMCE.init({
- theme : "advanced",
- mode : "textareas",
- plugins : "<strong>autosave</strong>"
-});</pre>
- </div>
- </p>
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/plugin_autosave.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/plugin_autosave.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/plugin_autosave.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/plugin_autosave.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,35 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Plugin: autosave</title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+ <h1>Plugin: autosave</h1>
+</div>
+
+<div class="content">
+ <p>This plugin gives the user a warning if they made modifications to a editor instance but didn't submit them. This plugin will most likely be extended in the future to provide AJAX auto save support.</p>
+ <h3>Initialization Example</h3>
+ <p>
+ <div class="example">
+ <pre>
+tinyMCE.init({
+ theme : "advanced",
+ mode : "textareas",
+ plugins : "<strong>autosave</strong>"
+});</pre>
+ </div>
+ </p>
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/plugin_contextmenu.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/plugin_contextmenu.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/plugin_contextmenu.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,43 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Plugin: contextmenu</title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
- <h1>Plugin: contextmenu</h1>
-</div>
-
-<div class="content">
- <p></p>
-
- <h3>Installation Instructions</h3>
- <p>
- <ul>
- <li>Copy the contextmenu directory to the plugins directory of TinyMCE (/jscripts/tiny_mce/plugins).</li>
- <li>Add plugin to TinyMCE plugin option list example: plugins : "contextmenu".</li>
- </ul>
- </p>
- <h3>Initialization Example</h3>
- <p>
- <div class="example">
- <pre>
-tinyMCE.init({
- theme : "advanced",
- mode : "textareas",
- plugins : "contextmenu"
-});</pre>
- </div>
- </p>
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/plugin_contextmenu.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/plugin_contextmenu.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/plugin_contextmenu.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/plugin_contextmenu.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,43 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Plugin: contextmenu</title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+ <h1>Plugin: contextmenu</h1>
+</div>
+
+<div class="content">
+ <p></p>
+
+ <h3>Installation Instructions</h3>
+ <p>
+ <ul>
+ <li>Copy the contextmenu directory to the plugins directory of TinyMCE (/jscripts/tiny_mce/plugins).</li>
+ <li>Add plugin to TinyMCE plugin option list example: plugins : "contextmenu".</li>
+ </ul>
+ </p>
+ <h3>Initialization Example</h3>
+ <p>
+ <div class="example">
+ <pre>
+tinyMCE.init({
+ theme : "advanced",
+ mode : "textareas",
+ plugins : "contextmenu"
+});</pre>
+ </div>
+ </p>
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/plugin_directionality.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/plugin_directionality.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/plugin_directionality.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,44 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Plugin: directionality</title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
- <h1>Plugin: directionality</h1>
-</div>
-
-<div class="content">
- <p>This plugin adds directionality icons to TinyMCE that enables TinyMCE to better handle languages that is written from right to left.</p>
-
- <h3>Installation Instructions</h3>
- <p>
- <ul>
- <li>Add plugin to TinyMCE plugin option list example: plugins : "directionality".</li>
- <li>Add the ltr, rtl button names to button list, example: theme_advanced_buttons3_add : "ltr,rtl".</li>
- </ul>
- </p>
- <h3>Initialization Example</h3>
- <p>
- <div class="example">
- <pre>
-tinyMCE.init({
- theme : "advanced",
- mode : "textareas",
- plugins : "<strong>directionality</strong>",
- theme_advanced_buttons3_add : "<strong>ltr,rtl</strong>"
-});</pre>
- </div>
- </p>
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/plugin_directionality.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/plugin_directionality.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/plugin_directionality.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/plugin_directionality.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,44 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Plugin: directionality</title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+ <h1>Plugin: directionality</h1>
+</div>
+
+<div class="content">
+ <p>This plugin adds directionality icons to TinyMCE that enables TinyMCE to better handle languages that is written from right to left.</p>
+
+ <h3>Installation Instructions</h3>
+ <p>
+ <ul>
+ <li>Add plugin to TinyMCE plugin option list example: plugins : "directionality".</li>
+ <li>Add the ltr, rtl button names to button list, example: theme_advanced_buttons3_add : "ltr,rtl".</li>
+ </ul>
+ </p>
+ <h3>Initialization Example</h3>
+ <p>
+ <div class="example">
+ <pre>
+tinyMCE.init({
+ theme : "advanced",
+ mode : "textareas",
+ plugins : "<strong>directionality</strong>",
+ theme_advanced_buttons3_add : "<strong>ltr,rtl</strong>"
+});</pre>
+ </div>
+ </p>
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/plugin_emotions.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/plugin_emotions.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/plugin_emotions.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,53 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Plugin: emotions</title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
- <h1>Plugin: emotions</h1>
-</div>
-
-<div class="content">
- <p>The emotions plugin is able to insert smiley images into the TinyMCE editable area.</p>
-
- <h3>Installation Instructions</h3>
- <p>
- <ul>
- <li>Copy the emotions directory to the plugins directory of TinyMCE (/jscripts/tiny_mce/plugins).</li>
- <li>Add plugin to TinyMCE plugin option list example: plugins : "emotions".</li>
- <li>Add the emotions button name to button list, example: theme_advanced_buttons3_add : "emotions".</li>
- </ul>
- </p>
- <h3>Initialization Example</h3>
- <p>
- <div class="example">
- <pre>
-tinyMCE.init({
- theme : "advanced",
- mode : "textareas",
- plugins : "emotions",
- theme_advanced_buttons3_add : "emotions"
-});</pre>
- </div>
- </p>
-
- <div class="separator"></div>
-
- <h3>Copyright notice</h3>
- <p>
- These emotions where taken from Mozilla Thunderbird. I hope they don't get angry if I use them here after all this is a open source project aswell and I realy love their product.
- </p>
- </div>
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/plugin_emotions.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/plugin_emotions.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/plugin_emotions.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/plugin_emotions.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,53 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Plugin: emotions</title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+ <h1>Plugin: emotions</h1>
+</div>
+
+<div class="content">
+ <p>The emotions plugin is able to insert smiley images into the TinyMCE editable area.</p>
+
+ <h3>Installation Instructions</h3>
+ <p>
+ <ul>
+ <li>Copy the emotions directory to the plugins directory of TinyMCE (/jscripts/tiny_mce/plugins).</li>
+ <li>Add plugin to TinyMCE plugin option list example: plugins : "emotions".</li>
+ <li>Add the emotions button name to button list, example: theme_advanced_buttons3_add : "emotions".</li>
+ </ul>
+ </p>
+ <h3>Initialization Example</h3>
+ <p>
+ <div class="example">
+ <pre>
+tinyMCE.init({
+ theme : "advanced",
+ mode : "textareas",
+ plugins : "emotions",
+ theme_advanced_buttons3_add : "emotions"
+});</pre>
+ </div>
+ </p>
+
+ <div class="separator"></div>
+
+ <h3>Copyright notice</h3>
+ <p>
+ These emotions where taken from Mozilla Thunderbird. I hope they don't get angry if I use them here after all this is a open source project aswell and I realy love their product.
+ </p>
+ </div>
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/plugin_flash.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/plugin_flash.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/plugin_flash.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,79 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Plugin: flash</title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
- <h1>Plugin: flash</h1>
-</div>
-
-<div class="content">
- <p>This is the "Insert Flash" Dialog, it enables users to insert flash movies into TinyMCE.</p>
- <p>You can control the wmode, quality and menu by setting the flash_wmode, flash_quality and flash_menu options.</p>
-
- <h3>Installation Instructions</h3>
- <p>
- <ul>
- <li>Copy the flash directory to the plugins directory of TinyMCE (/jscripts/tiny_mce/plugins).</li>
- <li>Add plugin to TinyMCE plugin option list example: plugins : "flash".</li>
- <li>Add this "img[class|src|border=0|alt|title|hspace|vspace|width|height|align|onmouseover|onmouseout|name]" to extended_valid_elements option.</li>
- <li>Add the flash button name to button list, example: theme_advanced_buttons3_add : "flash".</li>
- </ul>
- </p>
- <h3>Initialization Example</h3>
- <p>
- <div class="example">
- <pre>
-tinyMCE.init({
- theme : "advanced",
- mode : "textareas",
- plugins : "flash",
- extended_valid_elements : "img[class|src|border=0|alt|title|hspace|vspace|width|height|align|onmouseover|onmouseout|name]"
- flash_external_list_url : "example_flash_list.js", // Optional URL to a list of SWF movies
- flash_wmode : "transparent",
- flash_quality : "high",
- flash_menu : "false"
-});</pre>
- </div>
- </p>
-
- <div class="separator"></div>
-
- <h3>Additional note</h3>
- <p>
- The flash plugin has been heavily modified (the original is editor_plugin_original.js) since the original did not play nicely with html content that already contained existing flash tags and in fact stripped out the object
- tags for existing flash html. The rewrite corrects this as well attempts
- to preserve the existing flash tags where possible. The tinyMCE.init call
- should be be something like:
- </p>
- <h3>Initialization Example</h3>
- <p>
- <div class="example">
- <pre>
-tinyMCE.init({
- theme : "advanced",
- mode : "textareas",
- plugins : "flash",
- extended_valid_elements : "img[class|src|border=0|alt|title|hspace|vspace|width|height|align|onmouseover|onmouseout|name|obj|param|embed]"
-});</pre>
- </div>
- </p>
- <p>Note the extra obj,param,embed attributes for the img tag. These attributes
- are used to serialize data from existing flash tags so that they can be
- properly restored. Editing a flash tag with the plugin will cause this
- information to be lost (sorry!) but still produces a working flash nevertheless.
- </p>
- </div>
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/plugin_flash.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/plugin_flash.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/plugin_flash.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/plugin_flash.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,79 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Plugin: flash</title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+ <h1>Plugin: flash</h1>
+</div>
+
+<div class="content">
+ <p>This is the "Insert Flash" Dialog, it enables users to insert flash movies into TinyMCE.</p>
+ <p>You can control the wmode, quality and menu by setting the flash_wmode, flash_quality and flash_menu options.</p>
+
+ <h3>Installation Instructions</h3>
+ <p>
+ <ul>
+ <li>Copy the flash directory to the plugins directory of TinyMCE (/jscripts/tiny_mce/plugins).</li>
+ <li>Add plugin to TinyMCE plugin option list example: plugins : "flash".</li>
+ <li>Add this "img[class|src|border=0|alt|title|hspace|vspace|width|height|align|onmouseover|onmouseout|name]" to extended_valid_elements option.</li>
+ <li>Add the flash button name to button list, example: theme_advanced_buttons3_add : "flash".</li>
+ </ul>
+ </p>
+ <h3>Initialization Example</h3>
+ <p>
+ <div class="example">
+ <pre>
+tinyMCE.init({
+ theme : "advanced",
+ mode : "textareas",
+ plugins : "flash",
+ extended_valid_elements : "img[class|src|border=0|alt|title|hspace|vspace|width|height|align|onmouseover|onmouseout|name]"
+ flash_external_list_url : "example_flash_list.js", // Optional URL to a list of SWF movies
+ flash_wmode : "transparent",
+ flash_quality : "high",
+ flash_menu : "false"
+});</pre>
+ </div>
+ </p>
+
+ <div class="separator"></div>
+
+ <h3>Additional note</h3>
+ <p>
+ The flash plugin has been heavily modified (the original is editor_plugin_original.js) since the original did not play nicely with html content that already contained existing flash tags and in fact stripped out the object
+ tags for existing flash html. The rewrite corrects this as well attempts
+ to preserve the existing flash tags where possible. The tinyMCE.init call
+ should be be something like:
+ </p>
+ <h3>Initialization Example</h3>
+ <p>
+ <div class="example">
+ <pre>
+tinyMCE.init({
+ theme : "advanced",
+ mode : "textareas",
+ plugins : "flash",
+ extended_valid_elements : "img[class|src|border=0|alt|title|hspace|vspace|width|height|align|onmouseover|onmouseout|name|obj|param|embed]"
+});</pre>
+ </div>
+ </p>
+ <p>Note the extra obj,param,embed attributes for the img tag. These attributes
+ are used to serialize data from existing flash tags so that they can be
+ properly restored. Editing a flash tag with the plugin will cause this
+ information to be lost (sorry!) but still produces a working flash nevertheless.
+ </p>
+ </div>
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/plugin_fullpage.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/plugin_fullpage.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/plugin_fullpage.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,112 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Plugin: fullpage</title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
- <h1>Plugin: fullpage</h1>
-</div>
-
-<div class="content">
- <p>This plugin adds fullpage editing support. This enables you to edit whole documents with both head and body.</p>
-
- <h3>Installation Instructions</h3>
- <p>
- <ul>
- <li>Add plugin to TinyMCE plugin option list example: plugins : "fullpage".</li>
- <li>Add the fullpage button name to button list, example: theme_advanced_buttons3_add : "fullpage".</li>
- </ul>
- </p>
-
- <p>
- <h3>Options</h3>
- </p>
- <p>
- <table border="1" cellspacing="0" cellpadding="4">
- <tr>
- <td>[fullpage_doctypes]</td>
- <td>This is a name/value list of possible document types. The value format of this option is name=value,name=value. These document types will be presented in the document type selection list. The default value of this option is: XHTML 1.0 Transitional=<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">,XHTML 1.0 Frameset=<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">,XHTML 1.0 Strict=<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">,XHTML 1.1=<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">">,HTML 4.01 Transitional=<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">,HTML 4.01 Strict=<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">,HTML 4.01 Frameset=<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd">.</td>
- </tr>
- <tr>
- <td>[fullpage_fonts]</td>
- <td>This option enables you specify what font family style values that can be added to the body element. The value format of this option is name=value;name=value. The default value of this option is: Arial=arial,helvetica,sans-serif;Courier New=courier new,courier,monospace;Georgia=georgia,times new roman,times,serif;Tahoma=tahoma,arial,helvetica,sans-serif;Times New Roman=times new roman,times,serif;Verdana=verdana,arial,helvetica,sans-serif;Impact=impact;WingDings=wingdings
- </td>
- </tr>
- <tr>
- <td>[fullpage_fontsizes]</td>
- <td>This is a comma separated list of possible font sizes for the style attribute of the body element. This option defaults to: 10px,11px,12px,13px,14px,15px,16px.</td>
- </tr>
-<!-- <tr>
- <td>[fullpage_media_types]</td>
- <td>This is a name/value list of possible media types. The default value of this option is: all=all,screen=screen,print=print,tty=tty,tv=tv,projection=projection,handheld=handheld,braille=braille,aural=aural.</td>
- </tr> -->
- <tr>
- <td>[fullpage_encodings]</td>
- <td>This option enables you to specify what the document character encoding sets the user may select from. The default value of this option is: Western european (iso-8859-1)=iso-8859-1,Central European (iso-8859-2)=iso-8859-2,Unicode (UTF-8)=utf-8,Chinese traditional (Big5)=big5,Cyrillic (iso-8859-5)=iso-8859-5,Japanese (iso-2022-jp)=iso-2022-jp,Greek (iso-8859-7)=iso-8859-7,Korean (iso-2022-kr)=iso-2022-kr,ASCII (us-ascii)=us-ascii
- </td>
- </tr>
- <tr>
- <td>[fullpage_default_doctype]</td>
- <td>This option enables you to specify the default doctype for the output HTML.</td>
- </tr>
- <tr>
- <td>[fullpage_default_encoding]</td>
- <td>This option enables you to specify the default encoding for the output HTML.</td>
- </tr>
- <tr>
- <td>[fullpage_default_title]</td>
- <td>This option enables you to specify the default title for the output HTML.</td>
- </tr>
- <tr>
- <td>[fullpage_default_font_size]</td>
- <td>This option enables you to specify the default font size for body element.</td>
- </tr>
- <tr>
- <td>[fullpage_default_font_family]</td>
- <td>This option enables you to specify the default font family for body element.</td>
- </tr>
- <tr>
- <td>[fullpage_default_text_color]</td>
- <td>This option enables you to specify the default text color for body element.</td>
- </tr>
- <tr>
- <td>[fullpage_default_langcode]</td>
- <td>This option enables you to specify the default langcode for the output HTML.</td>
- </tr>
- <tr>
- <td>[fullpage_default_xml_pi]</td>
- <td>This option enables you to specify if a XML declaration should be added or not true/false option.</td>
- </tr>
- </table>
- </p>
- <p>
- <h3>Initialization Example</h3>
- </p>
- <p>
- <div class="example">
- <pre>
-tinyMCE.init({
- theme : "advanced",
- mode : "textareas",
- plugins : "<strong>fullpage</strong>",
- theme_advanced_buttons3_add : "<strong>fullpage</strong>",
- fullpage_fontsizes : '13px,14px,15px,18pt,xx-large',
- fullpage_default_xml_pi : false,
- fullpage_default_langcode : 'en',
- fullpage_default_title : "My document title"
-});</pre>
- </div>
- </p>
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/plugin_fullpage.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/plugin_fullpage.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/plugin_fullpage.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/plugin_fullpage.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,112 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Plugin: fullpage</title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+ <h1>Plugin: fullpage</h1>
+</div>
+
+<div class="content">
+ <p>This plugin adds fullpage editing support. This enables you to edit whole documents with both head and body.</p>
+
+ <h3>Installation Instructions</h3>
+ <p>
+ <ul>
+ <li>Add plugin to TinyMCE plugin option list example: plugins : "fullpage".</li>
+ <li>Add the fullpage button name to button list, example: theme_advanced_buttons3_add : "fullpage".</li>
+ </ul>
+ </p>
+
+ <p>
+ <h3>Options</h3>
+ </p>
+ <p>
+ <table border="1" cellspacing="0" cellpadding="4">
+ <tr>
+ <td>[fullpage_doctypes]</td>
+ <td>This is a name/value list of possible document types. The value format of this option is name=value,name=value. These document types will be presented in the document type selection list. The default value of this option is: XHTML 1.0 Transitional=<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">,XHTML 1.0 Frameset=<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">,XHTML 1.0 Strict=<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">,XHTML 1.1=<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">">,HTML 4.01 Transitional=<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">,HTML 4.01 Strict=<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">,HTML 4.01 Frameset=<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd">.</td>
+ </tr>
+ <tr>
+ <td>[fullpage_fonts]</td>
+ <td>This option enables you specify what font family style values that can be added to the body element. The value format of this option is name=value;name=value. The default value of this option is: Arial=arial,helvetica,sans-serif;Courier New=courier new,courier,monospace;Georgia=georgia,times new roman,times,serif;Tahoma=tahoma,arial,helvetica,sans-serif;Times New Roman=times new roman,times,serif;Verdana=verdana,arial,helvetica,sans-serif;Impact=impact;WingDings=wingdings
+ </td>
+ </tr>
+ <tr>
+ <td>[fullpage_fontsizes]</td>
+ <td>This is a comma separated list of possible font sizes for the style attribute of the body element. This option defaults to: 10px,11px,12px,13px,14px,15px,16px.</td>
+ </tr>
+<!-- <tr>
+ <td>[fullpage_media_types]</td>
+ <td>This is a name/value list of possible media types. The default value of this option is: all=all,screen=screen,print=print,tty=tty,tv=tv,projection=projection,handheld=handheld,braille=braille,aural=aural.</td>
+ </tr> -->
+ <tr>
+ <td>[fullpage_encodings]</td>
+ <td>This option enables you to specify what the document character encoding sets the user may select from. The default value of this option is: Western european (iso-8859-1)=iso-8859-1,Central European (iso-8859-2)=iso-8859-2,Unicode (UTF-8)=utf-8,Chinese traditional (Big5)=big5,Cyrillic (iso-8859-5)=iso-8859-5,Japanese (iso-2022-jp)=iso-2022-jp,Greek (iso-8859-7)=iso-8859-7,Korean (iso-2022-kr)=iso-2022-kr,ASCII (us-ascii)=us-ascii
+ </td>
+ </tr>
+ <tr>
+ <td>[fullpage_default_doctype]</td>
+ <td>This option enables you to specify the default doctype for the output HTML.</td>
+ </tr>
+ <tr>
+ <td>[fullpage_default_encoding]</td>
+ <td>This option enables you to specify the default encoding for the output HTML.</td>
+ </tr>
+ <tr>
+ <td>[fullpage_default_title]</td>
+ <td>This option enables you to specify the default title for the output HTML.</td>
+ </tr>
+ <tr>
+ <td>[fullpage_default_font_size]</td>
+ <td>This option enables you to specify the default font size for body element.</td>
+ </tr>
+ <tr>
+ <td>[fullpage_default_font_family]</td>
+ <td>This option enables you to specify the default font family for body element.</td>
+ </tr>
+ <tr>
+ <td>[fullpage_default_text_color]</td>
+ <td>This option enables you to specify the default text color for body element.</td>
+ </tr>
+ <tr>
+ <td>[fullpage_default_langcode]</td>
+ <td>This option enables you to specify the default langcode for the output HTML.</td>
+ </tr>
+ <tr>
+ <td>[fullpage_default_xml_pi]</td>
+ <td>This option enables you to specify if a XML declaration should be added or not true/false option.</td>
+ </tr>
+ </table>
+ </p>
+ <p>
+ <h3>Initialization Example</h3>
+ </p>
+ <p>
+ <div class="example">
+ <pre>
+tinyMCE.init({
+ theme : "advanced",
+ mode : "textareas",
+ plugins : "<strong>fullpage</strong>",
+ theme_advanced_buttons3_add : "<strong>fullpage</strong>",
+ fullpage_fontsizes : '13px,14px,15px,18pt,xx-large',
+ fullpage_default_xml_pi : false,
+ fullpage_default_langcode : 'en',
+ fullpage_default_title : "My document title"
+});</pre>
+ </div>
+ </p>
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/plugin_fullscreen.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/plugin_fullscreen.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/plugin_fullscreen.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,58 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Plugin: fullscreen</title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
- <h1>Plugin: fullscreen</h1>
-</div>
-
-<div class="content">
- <p>This plugin adds fullscreen editing mode to TinyMCE.</p>
-
- <h3>Installation Instructions</h3>
- <p>
- <ul>
- <li>Add plugin to TinyMCE plugin option list example: plugins : "fullscreen".</li>
- <li>Add the fullscreen button name to button list, example: theme_advanced_buttons3_add : "fullscreen".</li>
- </ul>
- </p>
-
- <p>
- <table border="1" cellspacing="0" cellpadding="4">
- <thead><td colspan="2">Fullscreen plugin options</td></thead>
- <tbody>
- <tr><td><strong>fullscreen_settings</strong></td><td>This option gives you the ability to have diffrent settings applied when the editor is in fullscreen mode for example more tools.</td></tr>
- </tbody>
- </table>
- <br />
- </p>
-
- <h3>Initialization Example</h3>
- <p>
- <div class="example">
- <pre>
-tinyMCE.init({
- theme : "advanced",
- mode : "textareas",
- plugins : "<strong>fullscreen</strong>",
- theme_advanced_buttons3_add : "<strong>fullscreen</strong>",
- fullscreen_settings : {
- theme_advanced_path_location : "top"
- }
-});</pre>
- </div>
- </p>
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/plugin_fullscreen.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/plugin_fullscreen.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/plugin_fullscreen.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/plugin_fullscreen.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,58 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Plugin: fullscreen</title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+ <h1>Plugin: fullscreen</h1>
+</div>
+
+<div class="content">
+ <p>This plugin adds fullscreen editing mode to TinyMCE.</p>
+
+ <h3>Installation Instructions</h3>
+ <p>
+ <ul>
+ <li>Add plugin to TinyMCE plugin option list example: plugins : "fullscreen".</li>
+ <li>Add the fullscreen button name to button list, example: theme_advanced_buttons3_add : "fullscreen".</li>
+ </ul>
+ </p>
+
+ <p>
+ <table border="1" cellspacing="0" cellpadding="4">
+ <thead><td colspan="2">Fullscreen plugin options</td></thead>
+ <tbody>
+ <tr><td><strong>fullscreen_settings</strong></td><td>This option gives you the ability to have diffrent settings applied when the editor is in fullscreen mode for example more tools.</td></tr>
+ </tbody>
+ </table>
+ <br />
+ </p>
+
+ <h3>Initialization Example</h3>
+ <p>
+ <div class="example">
+ <pre>
+tinyMCE.init({
+ theme : "advanced",
+ mode : "textareas",
+ plugins : "<strong>fullscreen</strong>",
+ theme_advanced_buttons3_add : "<strong>fullscreen</strong>",
+ fullscreen_settings : {
+ theme_advanced_path_location : "top"
+ }
+});</pre>
+ </div>
+ </p>
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/plugin_iespell.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/plugin_iespell.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/plugin_iespell.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,45 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Plugin: iespell</title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
- <h1>Plugin: iespell</h1>
-</div>
-
-<div class="content">
- <p></p>
-
- <h3>Installation Instructions</h3>
- <p>
- <ul>
- <li>Copy the iespell directory to the plugins directory of TinyMCE (/jscripts/tiny_mce/plugins).</li>
- <li>Add plugin to TinyMCE plugin option list example: plugins : "iespell".</li>
- <li>Add the iespell button name to button list, example: theme_advanced_buttons3_add : "iespell".</li>
- </ul>
- </p>
- <h3>Initialization Example</h3>
- <p>
- <div class="example">
- <pre>
-tinyMCE.init({
- theme : "advanced",
- mode : "textareas",
- plugins : "iespell",
- theme_advanced_buttons3_add : "iespell"
-});</pre>
- </div>
- </p>
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/plugin_iespell.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/plugin_iespell.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/plugin_iespell.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/plugin_iespell.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,45 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Plugin: iespell</title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+ <h1>Plugin: iespell</h1>
+</div>
+
+<div class="content">
+ <p></p>
+
+ <h3>Installation Instructions</h3>
+ <p>
+ <ul>
+ <li>Copy the iespell directory to the plugins directory of TinyMCE (/jscripts/tiny_mce/plugins).</li>
+ <li>Add plugin to TinyMCE plugin option list example: plugins : "iespell".</li>
+ <li>Add the iespell button name to button list, example: theme_advanced_buttons3_add : "iespell".</li>
+ </ul>
+ </p>
+ <h3>Initialization Example</h3>
+ <p>
+ <div class="example">
+ <pre>
+tinyMCE.init({
+ theme : "advanced",
+ mode : "textareas",
+ plugins : "iespell",
+ theme_advanced_buttons3_add : "iespell"
+});</pre>
+ </div>
+ </p>
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/plugin_inlinepopups.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/plugin_inlinepopups.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/plugin_inlinepopups.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,36 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Plugin: inlinepopups</title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
- <h1>Plugin: inlinepopups</h1>
-</div>
-
-<div class="content">
- <p>This plugin makes all dialogs to open as floating DIV layers instead of popup windows. This option can be very useful inorder to get around popup blockers. This plugin should be treated as experimental since it's not 100% compatible yet.</p>
-
- <h3>Initialization Example</h3>
- <p>
- <div class="example">
- <pre>
-tinyMCE.init({
- theme : "advanced",
- mode : "textareas",
- plugins : "inlinepopups"
-});</pre>
- </div>
- </p>
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/plugin_inlinepopups.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/plugin_inlinepopups.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/plugin_inlinepopups.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/plugin_inlinepopups.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,36 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Plugin: inlinepopups</title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+ <h1>Plugin: inlinepopups</h1>
+</div>
+
+<div class="content">
+ <p>This plugin makes all dialogs to open as floating DIV layers instead of popup windows. This option can be very useful inorder to get around popup blockers. This plugin should be treated as experimental since it's not 100% compatible yet.</p>
+
+ <h3>Initialization Example</h3>
+ <p>
+ <div class="example">
+ <pre>
+tinyMCE.init({
+ theme : "advanced",
+ mode : "textareas",
+ plugins : "inlinepopups"
+});</pre>
+ </div>
+ </p>
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/plugin_insertdatetime.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/plugin_insertdatetime.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/plugin_insertdatetime.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,107 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Plugin: insertdatetime</title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
- <h1>Plugin: insertdatetime</h1>
-</div>
-
-<div class="content">
- <p></p>
-
- <h3>Installation Instructions</h3>
- <p>
- <ul>
- <li>Copy the iespell directory to the plugins directory of TinyMCE (/jscripts/tiny_mce/plugins).</li>
- <li>Add plugin to TinyMCE plugin option list example: plugins : "iespell".</li>
- <li>Add the insertdate or inserttime button name to button list, example: theme_advanced_buttons3_add : "insertdate,inserttime".</li>
- </ul>
- </p>
- <h3>Initialization Example</h3>
- <p>
- <div class="example">
- <pre>
-tinyMCE.init({
- theme : "advanced",
- mode : "textareas",
- plugins : "insertdatetime",
- theme_advanced_buttons3_add : "insertdate,inserttime"
- plugin_insertdate_dateFormat : "%Y-%m-%d",
- plugin_insertdate_timeFormat : "%H:%M:%S"
-});</pre>
- </div>
- </p>
- <p>
- <h3>Options</h3>
- </p>
- <p>
- plugin_insertdate_dateFormat - Format that the date is output as. Defaults to: "%Y-%m-%d".<br />
- plugin_insertdate_timeFormat - Format that the time is output as. Defaults to: "%H:%M:%S".
- </p>
- <p>Replacement variables</p>
- <p>
- <table border="1" cellspacing="0" cellpadding="4">
- <tr>
- <td>%y</td>
- <td>year as a decimal number without a century (range 00 to 99)</td>
- </tr>
- <tr>
- <td>%Y</td>
- <td>year as a decimal number including the century</td>
- </tr>
- <tr>
- <td>%d</td>
- <td>day of the month as a decimal number (range 01 to 31)</td>
- </tr>
- <tr>
- <td>%m</td>
- <td>month as a decimal number (range 01 to 12)</td>
- </tr>
- <tr>
- <td>%D</td>
- <td>same as %m/%d/%y</td>
- </tr>
- <tr>
- <td>%r</td>
- <td>time in a.m. and p.m. notation</td>
- </tr>
- <tr>
- <td>%H</td>
- <td>hour as a decimal number using a 24-hour clock (range 00 to 23)</td>
- </tr>
- <tr>
- <td>%I</td>
- <td>hour as a decimal number using a 12-hour clock (range 01 to 12)</td>
- </tr>
- <tr>
- <td>%M</td>
- <td>minute as a decimal number (range 00-59)</td>
- </tr>
- <tr>
- <td>%S</td>
- <td>second as a decimal number (range 00-59)</td>
- </tr>
- <tr>
- <td>%p</td>
- <td>either "am" or "pm" according to the given time value</td>
- </tr>
- <tr>
- <td>%%</td>
- <td>a literal "%" character</td>
- </tr>
- </table>
- </p>
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/plugin_insertdatetime.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/plugin_insertdatetime.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/plugin_insertdatetime.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/plugin_insertdatetime.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,107 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Plugin: insertdatetime</title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+ <h1>Plugin: insertdatetime</h1>
+</div>
+
+<div class="content">
+ <p></p>
+
+ <h3>Installation Instructions</h3>
+ <p>
+ <ul>
+ <li>Copy the iespell directory to the plugins directory of TinyMCE (/jscripts/tiny_mce/plugins).</li>
+ <li>Add plugin to TinyMCE plugin option list example: plugins : "iespell".</li>
+ <li>Add the insertdate or inserttime button name to button list, example: theme_advanced_buttons3_add : "insertdate,inserttime".</li>
+ </ul>
+ </p>
+ <h3>Initialization Example</h3>
+ <p>
+ <div class="example">
+ <pre>
+tinyMCE.init({
+ theme : "advanced",
+ mode : "textareas",
+ plugins : "insertdatetime",
+ theme_advanced_buttons3_add : "insertdate,inserttime"
+ plugin_insertdate_dateFormat : "%Y-%m-%d",
+ plugin_insertdate_timeFormat : "%H:%M:%S"
+});</pre>
+ </div>
+ </p>
+ <p>
+ <h3>Options</h3>
+ </p>
+ <p>
+ plugin_insertdate_dateFormat - Format that the date is output as. Defaults to: "%Y-%m-%d".<br />
+ plugin_insertdate_timeFormat - Format that the time is output as. Defaults to: "%H:%M:%S".
+ </p>
+ <p>Replacement variables</p>
+ <p>
+ <table border="1" cellspacing="0" cellpadding="4">
+ <tr>
+ <td>%y</td>
+ <td>year as a decimal number without a century (range 00 to 99)</td>
+ </tr>
+ <tr>
+ <td>%Y</td>
+ <td>year as a decimal number including the century</td>
+ </tr>
+ <tr>
+ <td>%d</td>
+ <td>day of the month as a decimal number (range 01 to 31)</td>
+ </tr>
+ <tr>
+ <td>%m</td>
+ <td>month as a decimal number (range 01 to 12)</td>
+ </tr>
+ <tr>
+ <td>%D</td>
+ <td>same as %m/%d/%y</td>
+ </tr>
+ <tr>
+ <td>%r</td>
+ <td>time in a.m. and p.m. notation</td>
+ </tr>
+ <tr>
+ <td>%H</td>
+ <td>hour as a decimal number using a 24-hour clock (range 00 to 23)</td>
+ </tr>
+ <tr>
+ <td>%I</td>
+ <td>hour as a decimal number using a 12-hour clock (range 01 to 12)</td>
+ </tr>
+ <tr>
+ <td>%M</td>
+ <td>minute as a decimal number (range 00-59)</td>
+ </tr>
+ <tr>
+ <td>%S</td>
+ <td>second as a decimal number (range 00-59)</td>
+ </tr>
+ <tr>
+ <td>%p</td>
+ <td>either "am" or "pm" according to the given time value</td>
+ </tr>
+ <tr>
+ <td>%%</td>
+ <td>a literal "%" character</td>
+ </tr>
+ </table>
+ </p>
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/plugin_layer.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/plugin_layer.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/plugin_layer.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,46 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Plugin: layer</title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
- <h1>Plugin: layer</h1>
-</div>
-
-<div class="content">
- <p>Adds a layer suport to TinyMCE by making it possible to create/remove and z-index block elements.</p>
-
- <p>These are the possible button control that this plugin contains: insertlayer,moveforward,movebackward,absolute</p>
-
- <h3>Installation Instructions</h3>
- <p>
- <ul>
- <li>Add plugin to TinyMCE plugin option list example: plugins : "layer".</li>
- <li>Add the insertlayer,moveforward,movebackward,absolute button names to button list, example: theme_advanced_buttons3_add : "insertlayer,moveforward,movebackward,absolute".</li>
- </ul>
- </p>
- <h3>Initialization Example</h3>
- <p>
- <div class="example">
- <pre>
-tinyMCE.init({
- theme : "advanced",
- mode : "textareas",
- plugins : "<strong>layer</strong>",
- theme_advanced_buttons3_add : "<strong>insertlayer,moveforward,movebackward,absolute</strong>"
-});</pre>
- </div>
- </p>
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/plugin_layer.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/plugin_layer.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/plugin_layer.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/plugin_layer.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,46 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Plugin: layer</title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+ <h1>Plugin: layer</h1>
+</div>
+
+<div class="content">
+ <p>Adds a layer suport to TinyMCE by making it possible to create/remove and z-index block elements.</p>
+
+ <p>These are the possible button control that this plugin contains: insertlayer,moveforward,movebackward,absolute</p>
+
+ <h3>Installation Instructions</h3>
+ <p>
+ <ul>
+ <li>Add plugin to TinyMCE plugin option list example: plugins : "layer".</li>
+ <li>Add the insertlayer,moveforward,movebackward,absolute button names to button list, example: theme_advanced_buttons3_add : "insertlayer,moveforward,movebackward,absolute".</li>
+ </ul>
+ </p>
+ <h3>Initialization Example</h3>
+ <p>
+ <div class="example">
+ <pre>
+tinyMCE.init({
+ theme : "advanced",
+ mode : "textareas",
+ plugins : "<strong>layer</strong>",
+ theme_advanced_buttons3_add : "<strong>insertlayer,moveforward,movebackward,absolute</strong>"
+});</pre>
+ </div>
+ </p>
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/plugin_noneditable.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/plugin_noneditable.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/plugin_noneditable.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,54 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Plugin: noneditable</title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
- <h1>Plugin: noneditable</h1>
-</div>
-
-<div class="content">
- <p>Adds non editable elements support for MSIE and Mozilla/FF. Any element with the "mceItemNonEditable" class will be blocked from modifications and treated as a single character. This class name is configurable using the "noneditable_noneditable_class". Any elements with the MSIE specific attribute "contenteditable" will be converted into classes instead.</p>
- <h3>Initialization Example</h3>
- <p>
- <div class="example">
- <pre>
-tinyMCE.init({
- theme : "advanced",
- mode : "textareas",
- plugins : "<strong>noneditable</strong>",
- noneditable_leave_contenteditable : true
-});</pre>
- </div>
- </p>
-
- <p>
- <h3>Options</h3>
- <table border="1" cellspacing="0" cellpadding="4">
- <tr>
- <td>[noneditable_editable_class]</td>
- <td>Class name to be used for editable elements, this would be the the same as contenteditable=true, forcing a element to be editable. This option defaults to: "mceItemEditable". Notice that classes with the mceItem prefix is invisible within TinyMCE.</td>
- </tr>
- <tr>
- <td>[noneditable_noneditable_class]</td>
- <td>Class name to be used for non editable elements, this would be the same as contenteditable=false. This option defaults to: "mceItemNonEditable". Notice that classes with the mceItem prefix is invisible within TinyMCE.</td>
- </tr>
- <tr>
- <td>[noneditable_leave_contenteditable]</td>
- <td>If the value of this option is set to true, all contenteditable attributes will be left intact. This option is set to false by default, since this attribute is not a valid W3C attribute and the class approach is better.</td>
- </tr>
- </table>
- </p>
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/plugin_noneditable.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/plugin_noneditable.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/plugin_noneditable.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/plugin_noneditable.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,54 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Plugin: noneditable</title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+ <h1>Plugin: noneditable</h1>
+</div>
+
+<div class="content">
+ <p>Adds non editable elements support for MSIE and Mozilla/FF. Any element with the "mceItemNonEditable" class will be blocked from modifications and treated as a single character. This class name is configurable using the "noneditable_noneditable_class". Any elements with the MSIE specific attribute "contenteditable" will be converted into classes instead.</p>
+ <h3>Initialization Example</h3>
+ <p>
+ <div class="example">
+ <pre>
+tinyMCE.init({
+ theme : "advanced",
+ mode : "textareas",
+ plugins : "<strong>noneditable</strong>",
+ noneditable_leave_contenteditable : true
+});</pre>
+ </div>
+ </p>
+
+ <p>
+ <h3>Options</h3>
+ <table border="1" cellspacing="0" cellpadding="4">
+ <tr>
+ <td>[noneditable_editable_class]</td>
+ <td>Class name to be used for editable elements, this would be the the same as contenteditable=true, forcing a element to be editable. This option defaults to: "mceItemEditable". Notice that classes with the mceItem prefix is invisible within TinyMCE.</td>
+ </tr>
+ <tr>
+ <td>[noneditable_noneditable_class]</td>
+ <td>Class name to be used for non editable elements, this would be the same as contenteditable=false. This option defaults to: "mceItemNonEditable". Notice that classes with the mceItem prefix is invisible within TinyMCE.</td>
+ </tr>
+ <tr>
+ <td>[noneditable_leave_contenteditable]</td>
+ <td>If the value of this option is set to true, all contenteditable attributes will be left intact. This option is set to false by default, since this attribute is not a valid W3C attribute and the class approach is better.</td>
+ </tr>
+ </table>
+ </p>
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/plugin_paste.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/plugin_paste.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/plugin_paste.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,139 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Plugin: paste</title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
- <h1>Plugin: paste</h1>
-</div>
-
-<div class="content">
- <p>This plugin adds paste as plain text and paste from Word icons to TinyMCE. This plugin was developed by Ryan Demmer and modified by the TinyMCE crew to be more general and some extra features where added.</p>
- <p>
- On 25 May 2005, this plugin was modified by speednet: IE now pastes directly into the editor, bypassing the extra steps of opening the Insert box, selecting options, and clicking Insert. Speednet also added the Select All command, which highlights all the content in the editor when the user clicks the toolbar button (Other miscellaneous cleanup also).
- </p>
- <p>On 28 October 2005, this plugin was modified by monkeybrain: Added the paste_strip_class_attributes option.</p>
- <h3>Installation Instructions</h3>
- <p>
- <ul>
- <li>Copy the paste directory to the plugins directory of TinyMCE (/jscripts/tiny_mce/plugins).</li>
- <li>Add plugin to TinyMCE plugin option list example: plugins : "paste".</li>
- <li>Add the button names to button list, example: theme_advanced_buttons3_add : "pastetext,pasteword,selectall".</li>
- </ul>
- </p>
- <h3>Initialization Example</h3>
- <p>
- <div class="example">
- <pre>
-tinyMCE.init({
- theme : "advanced",
- mode : "textareas",
- plugins : "paste",
- theme_advanced_buttons3_add : "pastetext,pasteword,selectall",
- paste_create_paragraphs : false,
- paste_create_linebreaks : false,
- paste_use_dialog : true,
- paste_auto_cleanup_on_paste : true,
- paste_convert_middot_lists : false,
- paste_unindented_list_class : "unindentedList",
- paste_convert_headers_to_strong : true,
- paste_insert_word_content_callback : "convertWord"
-});
-
-function convertWord(type, content) {
- switch (type) {
- // Gets executed before the built in logic performes it's cleanups
- case "before":
- content = content.toLowerCase(); // Some dummy logic
- break;
-
- // Gets executed after the built in logic performes it's cleanups
- case "after":
- content = content.toLowerCase(); // Some dummy logic
- break;
- }
-
- return content;
-}
-</pre>
- </div>
- </p>
- <p>
- <h3>Options</h3>
- </p>
- <p>
- <table border="1" cellspacing="0" cellpadding="4">
- <tr>
- <td>[paste_create_paragraphs]</td>
- <td>If enabled double linefeeds are converted to paragraph elements when using the plain text dialog. This is enabled by default.</td>
- </tr>
- <tr>
- <td>[paste_create_linebreaks]</td>
- <td>If enabled single linefeeds are converted to hard line break elements when using the plain text dialog. This is enabled by default.</td>
- </tr>
- <tr>
- <td>[paste_use_dialog]</td>
- <td>MSIE specific option, if you set this to true both Mozilla and MSIE will present a paste dialog. If you set it to false pasting in MSIE will be done directly. This option is set to false by default.</td>
- </tr>
- <tr>
- <td>[paste_auto_cleanup_on_paste]</td>
- <td>MSIE specific option. If you enable this feature, a word paste will be executed when the user copy/paste content to the editor. This feature is disabled by default.</td>
- </tr>
- <tr>
- <td>[paste_convert_middot_lists]</td>
- <td>If this feature is enabled middot lists are converted into UL lists, these will be assign a special class.</td>
- </tr>
- <tr>
- <td>[paste_unindented_list_class]</td>
- <td>This option enables you to specify what class to assign to the UL list of middot converted lists. Middot lists are unindented in MS Office. This option defaults to "unIndentedList".</td>
- </tr>
- <tr>
- <td>[paste_convert_headers_to_strong]</td>
- <td>This feature converts H1-6 elements to strong elements on paste, this is feature is disabled by default.</td>
- </tr>
- <tr>
- <td>[paste_remove_spans]</td>
- <td>This enables you to control if the word parse operation should remove or keep span elements, they will be removed by default.</td>
- </tr>
- <tr>
- <td>[paste_remove_styles]</td>
- <td>This enables you to control if the word parse operation should remove or keep style attributes, they will be removed by default.</td>
- </tr>
- <tr>
- <td>[paste_replace_list]</td>
- <td>Comma separated list of search/replace chunks. Where even items is the regexp that is to be used for the search and odd values are the contents that are to be replaced.
- <p>This option defaults to: "\u2122,<sup>TM</sup>,\u2026,...,\u201c|\u201d,",\u2019,\',\u2013|\u2014|\u2015|\u2212,-" this list replaces some custom MS 1250 characters.
- </p>
- The \uXXXX values is the hex values of the Unicode characters. Trick use javascript:alert('<unicode char>'.charCodeAt(0).toString(16)); to retive these numbers.</td>
- </tr>
- <tr>
- <td>[paste_strip_class_attributes]</td>
- <td>This feature allows you to control whether or not class attributes are stripped when using pasteword. Valid values are:
- <ul>
- <li>all - will strip all class attributes from the pasted content. This is the default value.</li>
- <li>none - will not strip any class attributes from the pasted content.</li>
- <li>mso - will strip out all of the class attribute values that start with "Mso", but retain all others.</li>
- </ul>
- </td>
- </tr>
- <tr>
- <td>[paste_insert_word_content_callback]</td>
- <td>This option enables you to specify a callback function. This callback is executed when the user pastes word content, the return value of this function will be the new content string. Check the example above for more details.
- </td>
- </tr>
- </table>
- </p>
-
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/plugin_paste.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/plugin_paste.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/plugin_paste.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/plugin_paste.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,139 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Plugin: paste</title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+ <h1>Plugin: paste</h1>
+</div>
+
+<div class="content">
+ <p>This plugin adds paste as plain text and paste from Word icons to TinyMCE. This plugin was developed by Ryan Demmer and modified by the TinyMCE crew to be more general and some extra features where added.</p>
+ <p>
+ On 25 May 2005, this plugin was modified by speednet: IE now pastes directly into the editor, bypassing the extra steps of opening the Insert box, selecting options, and clicking Insert. Speednet also added the Select All command, which highlights all the content in the editor when the user clicks the toolbar button (Other miscellaneous cleanup also).
+ </p>
+ <p>On 28 October 2005, this plugin was modified by monkeybrain: Added the paste_strip_class_attributes option.</p>
+ <h3>Installation Instructions</h3>
+ <p>
+ <ul>
+ <li>Copy the paste directory to the plugins directory of TinyMCE (/jscripts/tiny_mce/plugins).</li>
+ <li>Add plugin to TinyMCE plugin option list example: plugins : "paste".</li>
+ <li>Add the button names to button list, example: theme_advanced_buttons3_add : "pastetext,pasteword,selectall".</li>
+ </ul>
+ </p>
+ <h3>Initialization Example</h3>
+ <p>
+ <div class="example">
+ <pre>
+tinyMCE.init({
+ theme : "advanced",
+ mode : "textareas",
+ plugins : "paste",
+ theme_advanced_buttons3_add : "pastetext,pasteword,selectall",
+ paste_create_paragraphs : false,
+ paste_create_linebreaks : false,
+ paste_use_dialog : true,
+ paste_auto_cleanup_on_paste : true,
+ paste_convert_middot_lists : false,
+ paste_unindented_list_class : "unindentedList",
+ paste_convert_headers_to_strong : true,
+ paste_insert_word_content_callback : "convertWord"
+});
+
+function convertWord(type, content) {
+ switch (type) {
+ // Gets executed before the built in logic performes it's cleanups
+ case "before":
+ content = content.toLowerCase(); // Some dummy logic
+ break;
+
+ // Gets executed after the built in logic performes it's cleanups
+ case "after":
+ content = content.toLowerCase(); // Some dummy logic
+ break;
+ }
+
+ return content;
+}
+</pre>
+ </div>
+ </p>
+ <p>
+ <h3>Options</h3>
+ </p>
+ <p>
+ <table border="1" cellspacing="0" cellpadding="4">
+ <tr>
+ <td>[paste_create_paragraphs]</td>
+ <td>If enabled double linefeeds are converted to paragraph elements when using the plain text dialog. This is enabled by default.</td>
+ </tr>
+ <tr>
+ <td>[paste_create_linebreaks]</td>
+ <td>If enabled single linefeeds are converted to hard line break elements when using the plain text dialog. This is enabled by default.</td>
+ </tr>
+ <tr>
+ <td>[paste_use_dialog]</td>
+ <td>MSIE specific option, if you set this to true both Mozilla and MSIE will present a paste dialog. If you set it to false pasting in MSIE will be done directly. This option is set to false by default.</td>
+ </tr>
+ <tr>
+ <td>[paste_auto_cleanup_on_paste]</td>
+ <td>MSIE specific option. If you enable this feature, a word paste will be executed when the user copy/paste content to the editor. This feature is disabled by default.</td>
+ </tr>
+ <tr>
+ <td>[paste_convert_middot_lists]</td>
+ <td>If this feature is enabled middot lists are converted into UL lists, these will be assign a special class.</td>
+ </tr>
+ <tr>
+ <td>[paste_unindented_list_class]</td>
+ <td>This option enables you to specify what class to assign to the UL list of middot converted lists. Middot lists are unindented in MS Office. This option defaults to "unIndentedList".</td>
+ </tr>
+ <tr>
+ <td>[paste_convert_headers_to_strong]</td>
+ <td>This feature converts H1-6 elements to strong elements on paste, this is feature is disabled by default.</td>
+ </tr>
+ <tr>
+ <td>[paste_remove_spans]</td>
+ <td>This enables you to control if the word parse operation should remove or keep span elements, they will be removed by default.</td>
+ </tr>
+ <tr>
+ <td>[paste_remove_styles]</td>
+ <td>This enables you to control if the word parse operation should remove or keep style attributes, they will be removed by default.</td>
+ </tr>
+ <tr>
+ <td>[paste_replace_list]</td>
+ <td>Comma separated list of search/replace chunks. Where even items is the regexp that is to be used for the search and odd values are the contents that are to be replaced.
+ <p>This option defaults to: "\u2122,<sup>TM</sup>,\u2026,...,\u201c|\u201d,",\u2019,\',\u2013|\u2014|\u2015|\u2212,-" this list replaces some custom MS 1250 characters.
+ </p>
+ The \uXXXX values is the hex values of the Unicode characters. Trick use javascript:alert('<unicode char>'.charCodeAt(0).toString(16)); to retive these numbers.</td>
+ </tr>
+ <tr>
+ <td>[paste_strip_class_attributes]</td>
+ <td>This feature allows you to control whether or not class attributes are stripped when using pasteword. Valid values are:
+ <ul>
+ <li>all - will strip all class attributes from the pasted content. This is the default value.</li>
+ <li>none - will not strip any class attributes from the pasted content.</li>
+ <li>mso - will strip out all of the class attribute values that start with "Mso", but retain all others.</li>
+ </ul>
+ </td>
+ </tr>
+ <tr>
+ <td>[paste_insert_word_content_callback]</td>
+ <td>This option enables you to specify a callback function. This callback is executed when the user pastes word content, the return value of this function will be the new content string. Check the example above for more details.
+ </td>
+ </tr>
+ </table>
+ </p>
+
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/plugin_preview.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/plugin_preview.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/plugin_preview.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,66 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Plugin: preview</title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
- <h1>Plugin: preview</h1>
-</div>
-
-<div class="content">
- <p>This plugin adds a preview button to TinyMCE, pressing the button opens a popup showing the current content.</p>
-
- <h3>Installation Instructions</h3>
- <p>
- <ul>
- <li>Copy the preview directory to the plugins directory of TinyMCE (/jscripts/tiny_mce/plugins).</li>
- <li>Add plugin to TinyMCE plugin option list example: plugins : "preview".</li>
- <li>Add the button name to button list, example: theme_advanced_buttons3_add : "preview".</li>
- </ul>
- </p>
- <h3>Initialization Example</h3>
- <p>
- <div class="example">
- <pre>
-tinyMCE.init({
- theme : "advanced",
- mode : "textareas",
- plugins : "preview",
- theme_advanced_buttons3_add : "preview",
- plugin_preview_width : "500",
- plugin_preview_height : "600"
-});</pre>
- </div>
- </p>
- <p>
- <h3>Options</h3>
- </p>
- <p>
- <table border="1" cellspacing="0" cellpadding="4">
- <tr>
- <td>[plugin_preview_width]</td>
- <td>Preview window width. Defaults to 550.</td>
- </tr>
- <tr>
- <td>[plugin_preview_height]</td>
- <td>Preview window height. Defaults to 600.</td>
- </tr>
- <tr>
- <td>[plugin_preview_pageurl]</td>
- <td>Custom preview page URL relative from theme use "../../plugins/preview/example.html" for a example.</td>
- </tr>
- </table>
- </p>
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/plugin_preview.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/plugin_preview.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/plugin_preview.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/plugin_preview.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,66 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Plugin: preview</title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+ <h1>Plugin: preview</h1>
+</div>
+
+<div class="content">
+ <p>This plugin adds a preview button to TinyMCE, pressing the button opens a popup showing the current content.</p>
+
+ <h3>Installation Instructions</h3>
+ <p>
+ <ul>
+ <li>Copy the preview directory to the plugins directory of TinyMCE (/jscripts/tiny_mce/plugins).</li>
+ <li>Add plugin to TinyMCE plugin option list example: plugins : "preview".</li>
+ <li>Add the button name to button list, example: theme_advanced_buttons3_add : "preview".</li>
+ </ul>
+ </p>
+ <h3>Initialization Example</h3>
+ <p>
+ <div class="example">
+ <pre>
+tinyMCE.init({
+ theme : "advanced",
+ mode : "textareas",
+ plugins : "preview",
+ theme_advanced_buttons3_add : "preview",
+ plugin_preview_width : "500",
+ plugin_preview_height : "600"
+});</pre>
+ </div>
+ </p>
+ <p>
+ <h3>Options</h3>
+ </p>
+ <p>
+ <table border="1" cellspacing="0" cellpadding="4">
+ <tr>
+ <td>[plugin_preview_width]</td>
+ <td>Preview window width. Defaults to 550.</td>
+ </tr>
+ <tr>
+ <td>[plugin_preview_height]</td>
+ <td>Preview window height. Defaults to 600.</td>
+ </tr>
+ <tr>
+ <td>[plugin_preview_pageurl]</td>
+ <td>Custom preview page URL relative from theme use "../../plugins/preview/example.html" for a example.</td>
+ </tr>
+ </table>
+ </p>
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/plugin_print.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/plugin_print.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/plugin_print.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,45 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Plugin: paste</title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
- <h1>Plugin: print</h1>
-</div>
-
-<div class="content">
- <p>This plugin adds a print button to TinyMCE.</p>
-
- <h3>Installation Instructions</h3>
- <p>
- <ul>
- <li>Copy the print directory to the plugins directory of TinyMCE (/jscripts/tiny_mce/plugins).</li>
- <li>Add plugin to TinyMCE plugin option list example: plugins : "print".</li>
- <li>Add the button name to button list, example: theme_advanced_buttons3_add : "print".</li>
- </ul>
- </p>
- <h3>Initialization Example</h3>
- <p>
- <div class="example">
- <pre>
-tinyMCE.init({
- theme : "advanced",
- mode : "textareas",
- plugins : "print",
- theme_advanced_buttons3_add : "print"
-});</pre>
- </div>
- </p>
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/plugin_print.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/plugin_print.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/plugin_print.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/plugin_print.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,45 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Plugin: paste</title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+ <h1>Plugin: print</h1>
+</div>
+
+<div class="content">
+ <p>This plugin adds a print button to TinyMCE.</p>
+
+ <h3>Installation Instructions</h3>
+ <p>
+ <ul>
+ <li>Copy the print directory to the plugins directory of TinyMCE (/jscripts/tiny_mce/plugins).</li>
+ <li>Add plugin to TinyMCE plugin option list example: plugins : "print".</li>
+ <li>Add the button name to button list, example: theme_advanced_buttons3_add : "print".</li>
+ </ul>
+ </p>
+ <h3>Initialization Example</h3>
+ <p>
+ <div class="example">
+ <pre>
+tinyMCE.init({
+ theme : "advanced",
+ mode : "textareas",
+ plugins : "print",
+ theme_advanced_buttons3_add : "print"
+});</pre>
+ </div>
+ </p>
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/plugin_save.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/plugin_save.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/plugin_save.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,65 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Plugin: save</title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
- <h1>Plugin: save</h1>
-</div>
-
-<div class="content">
- <p>This plugin adds a save button to TinyMCE this save button will submit the form that the editor is within.</p>
-
- <h3>Installation Instructions</h3>
- <p>
- <ul>
- <li>Add plugin to TinyMCE plugin option list example: plugins : "save".</li>
- <li>Add the ltr, rtl button names to button list, example: theme_advanced_buttons3_add : "save".</li>
- </ul>
- </p>
-
- <p>
- <h3>Options</h3>
- </p>
- <p>
- <table border="1" cellspacing="0" cellpadding="4">
- <tr>
- <td>[save_enablewhendirty]</td>
- <td>If you set this option to true, the edit button will be disabled/dimmed until modifications are made. This is disabled by default.</td>
- </tr>
- <tr>
- <td>[onchange_callback]</td>
- <td>This option enables you to add a custom function to be called when the save button/command is invoked. This is not used by default.</td>
- </tr>
- </table>
- </p>
-
- <p>
- <h3>Initialization Example</h3>
- </p>
- <p>
- <div class="example">
- <pre>
-tinyMCE.init({
- theme : "advanced",
- mode : "textareas",
- plugins : "<strong>save</strong>",
- theme_advanced_buttons3_add : "<strong>save</strong>",
- save_enablewhendirty : true,
- onchange_callback : "mysave"
-});</pre>
- </div>
- </p>
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/plugin_save.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/plugin_save.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/plugin_save.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/plugin_save.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,65 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Plugin: save</title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+ <h1>Plugin: save</h1>
+</div>
+
+<div class="content">
+ <p>This plugin adds a save button to TinyMCE this save button will submit the form that the editor is within.</p>
+
+ <h3>Installation Instructions</h3>
+ <p>
+ <ul>
+ <li>Add plugin to TinyMCE plugin option list example: plugins : "save".</li>
+ <li>Add the ltr, rtl button names to button list, example: theme_advanced_buttons3_add : "save".</li>
+ </ul>
+ </p>
+
+ <p>
+ <h3>Options</h3>
+ </p>
+ <p>
+ <table border="1" cellspacing="0" cellpadding="4">
+ <tr>
+ <td>[save_enablewhendirty]</td>
+ <td>If you set this option to true, the edit button will be disabled/dimmed until modifications are made. This is disabled by default.</td>
+ </tr>
+ <tr>
+ <td>[onchange_callback]</td>
+ <td>This option enables you to add a custom function to be called when the save button/command is invoked. This is not used by default.</td>
+ </tr>
+ </table>
+ </p>
+
+ <p>
+ <h3>Initialization Example</h3>
+ </p>
+ <p>
+ <div class="example">
+ <pre>
+tinyMCE.init({
+ theme : "advanced",
+ mode : "textareas",
+ plugins : "<strong>save</strong>",
+ theme_advanced_buttons3_add : "<strong>save</strong>",
+ save_enablewhendirty : true,
+ onchange_callback : "mysave"
+});</pre>
+ </div>
+ </p>
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/plugin_searchreplace.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/plugin_searchreplace.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/plugin_searchreplace.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,44 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Plugin: searchreplace</title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
- <h1>Plugin: searchreplace</h1>
-</div>
-
-<div class="content">
- <p>This plugin adds search/replace dialogs to TinyMCE.</p>
-
- <h3>Installation Instructions</h3>
- <p>
- <ul>
- <li>Add plugin to TinyMCE plugin option list example: plugins : "searchreplace".</li>
- <li>Add the ltr, rtl button names to button list, example: theme_advanced_buttons3_add : "search,replace".</li>
- </ul>
- </p>
- <h3>Initialization Example</h3>
- <p>
- <div class="example">
- <pre>
-tinyMCE.init({
- theme : "advanced",
- mode : "textareas",
- plugins : "<strong>searchreplace</strong>",
- theme_advanced_buttons3_add : "<strong>search,replace</strong>"
-});</pre>
- </div>
- </p>
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/plugin_searchreplace.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/plugin_searchreplace.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/plugin_searchreplace.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/plugin_searchreplace.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,44 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Plugin: searchreplace</title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+ <h1>Plugin: searchreplace</h1>
+</div>
+
+<div class="content">
+ <p>This plugin adds search/replace dialogs to TinyMCE.</p>
+
+ <h3>Installation Instructions</h3>
+ <p>
+ <ul>
+ <li>Add plugin to TinyMCE plugin option list example: plugins : "searchreplace".</li>
+ <li>Add the ltr, rtl button names to button list, example: theme_advanced_buttons3_add : "search,replace".</li>
+ </ul>
+ </p>
+ <h3>Initialization Example</h3>
+ <p>
+ <div class="example">
+ <pre>
+tinyMCE.init({
+ theme : "advanced",
+ mode : "textareas",
+ plugins : "<strong>searchreplace</strong>",
+ theme_advanced_buttons3_add : "<strong>search,replace</strong>"
+});</pre>
+ </div>
+ </p>
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/plugin_spellchecker.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/plugin_spellchecker.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/plugin_spellchecker.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,72 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Plugin: spellchecker</title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
- <h1>Plugin: spellchecker</h1>
-</div>
-
-<div class="content">
- <p>This plugin adds spellchecker functionality to TinyMCE by providing a new button that performs a AJAX call to a backend PHP page that uses pspell.</p>
- <h3>Installation Instructions</h3>
- <p>
- <ol>
- <li>Download the spellchecker plugin from the <a href="http://tinymce.moxiecode.com/download.php">TinyMCE website</a>.</li>
- <li>Copy the spellchecker directory to the plugins directory of TinyMCE (/jscripts/tiny_mce/plugins).</li>
- <li>Add plugin to TinyMCE plugin option list example: plugins : "spellchecker".</li>
- <li>Add the button name to button list, example: theme_advanced_buttons3_add : "spellchecker".</li>
- </ol>
- </p>
- <h3>Spellchecker plugins/modes</h3>
- <p>
- TinyMCE Spellchecker currently supports 3 modes. These are available as configurable PHP classes.
- <ul>
- <li>TinyPspell - Run pspell within PHP. (PHP needs to be compiled with pspell support)</li>
- <li>TinyPspellShell - Run pspell as a command line shell application.</li>
- <li>TinyGoogleSpell - Use HTTP proxy bridge to connect to a Google XML Web Service.</li>
- </ul>
- Use this as the value for the the languages option when you are using the GoogleSpell class: +English=en,Danish=da,Dutch=nl,Finnish=fi,French=fr,German=de,Italian=it,Polish=pl,Portuguese=pt,Spanish=es,Swedish=sv
- <br /><br /></p>
- <h3>Initialization Example</h3>
- <p>
- <div class="example">
- <pre>
-tinyMCE.init({
- theme : "advanced",
- mode : "textareas",
- plugins : "spellchecker",
- theme_advanced_buttons3_add : "spellchecker",
- spellchecker_languages : "+English=en,Swedish=sv",
- spellchecker_word_separator_chars : "\\s!\"#$%&()*+,-./:;<=>?@[\]ˆ_{|}§©«®±¶·¸»¼½¾¿×÷¤\u201d\u201c"
-});
-</pre>
- </div>
- </p>
- <p>
- <h3>Options</h3>
- </p>
- <p>
- <table border="1" cellspacing="0" cellpadding="4">
- <tr>
- <td>[spellchecker_languages]</td>
- <td>Enables you to specify what languages your pspell installation can handle. The value of this option should be a comma separated name value list in the following format name1=value1,name2=value,name3=value where name is the string to present in the menu and the value is a ISO language code like sv or en. If you add a + character infront of the name it will be the default value for the spellchecker. The default value for this option is: +English=en.</td>
- </tr>
- <tr>
- <td>[spellchecker_word_separator_chars]</td>
- <td>This option enables you to specify the word separator characters. The default value for this option is: \\s!"#$%&()*+,-./:;<=>?@[\]^_{|}§©«®±¶·¸»¼½¾¿×÷¤\u201d\u201c.</td>
- </tr>
- </table>
- </p>
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/plugin_spellchecker.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/plugin_spellchecker.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/plugin_spellchecker.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/plugin_spellchecker.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,72 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Plugin: spellchecker</title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+ <h1>Plugin: spellchecker</h1>
+</div>
+
+<div class="content">
+ <p>This plugin adds spellchecker functionality to TinyMCE by providing a new button that performs a AJAX call to a backend PHP page that uses pspell.</p>
+ <h3>Installation Instructions</h3>
+ <p>
+ <ol>
+ <li>Download the spellchecker plugin from the <a href="http://tinymce.moxiecode.com/download.php">TinyMCE website</a>.</li>
+ <li>Copy the spellchecker directory to the plugins directory of TinyMCE (/jscripts/tiny_mce/plugins).</li>
+ <li>Add plugin to TinyMCE plugin option list example: plugins : "spellchecker".</li>
+ <li>Add the button name to button list, example: theme_advanced_buttons3_add : "spellchecker".</li>
+ </ol>
+ </p>
+ <h3>Spellchecker plugins/modes</h3>
+ <p>
+ TinyMCE Spellchecker currently supports 3 modes. These are available as configurable PHP classes.
+ <ul>
+ <li>TinyPspell - Run pspell within PHP. (PHP needs to be compiled with pspell support)</li>
+ <li>TinyPspellShell - Run pspell as a command line shell application.</li>
+ <li>TinyGoogleSpell - Use HTTP proxy bridge to connect to a Google XML Web Service.</li>
+ </ul>
+ Use this as the value for the the languages option when you are using the GoogleSpell class: +English=en,Danish=da,Dutch=nl,Finnish=fi,French=fr,German=de,Italian=it,Polish=pl,Portuguese=pt,Spanish=es,Swedish=sv
+ <br /><br /></p>
+ <h3>Initialization Example</h3>
+ <p>
+ <div class="example">
+ <pre>
+tinyMCE.init({
+ theme : "advanced",
+ mode : "textareas",
+ plugins : "spellchecker",
+ theme_advanced_buttons3_add : "spellchecker",
+ spellchecker_languages : "+English=en,Swedish=sv",
+ spellchecker_word_separator_chars : "\\s!\"#$%&()*+,-./:;<=>?@[\]ˆ_{|}§©«®±¶·¸»¼½¾¿×÷¤\u201d\u201c"
+});
+</pre>
+ </div>
+ </p>
+ <p>
+ <h3>Options</h3>
+ </p>
+ <p>
+ <table border="1" cellspacing="0" cellpadding="4">
+ <tr>
+ <td>[spellchecker_languages]</td>
+ <td>Enables you to specify what languages your pspell installation can handle. The value of this option should be a comma separated name value list in the following format name1=value1,name2=value,name3=value where name is the string to present in the menu and the value is a ISO language code like sv or en. If you add a + character infront of the name it will be the default value for the spellchecker. The default value for this option is: +English=en.</td>
+ </tr>
+ <tr>
+ <td>[spellchecker_word_separator_chars]</td>
+ <td>This option enables you to specify the word separator characters. The default value for this option is: \\s!"#$%&()*+,-./:;<=>?@[\]^_{|}§©«®±¶·¸»¼½¾¿×÷¤\u201d\u201c.</td>
+ </tr>
+ </table>
+ </p>
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/plugin_style.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/plugin_style.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/plugin_style.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,303 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Plugin: style</title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
- <h1>Plugin: style</h1>
-</div>
-
-<div class="content">
- <p>Adds CSS style editing support to TinyMCE, this will enable you to edit allmost any CSS style property in a visual way.</p>
-
- <h3>Installation Instructions</h3>
- <p>
- <ul>
- <li>Add plugin to TinyMCE plugin option list example: plugins : "style".</li>
- <li>Add the styleprops butto names to button list, example: theme_advanced_buttons3_add : "styleprops".</li>
- </ul>
- </p>
- <h3>Initialization Example</h3>
- <p>
- <div class="example">
- <pre>
-tinyMCE.init({
- theme : "advanced",
- mode : "textareas",
- plugins : "<strong>style</strong>",
- theme_advanced_buttons3_add : "<strong>styleprops</strong>"
-});</pre>
- </div>
- </p>
- <br />
-
- <h3>Options</h3>
- <p>
- <table border="1" cellspacing="0" cellpadding="4">
- <tr>
- <td>[style_font]</td>
- <td>Semicolon separated list of select box option name/values. Default: Arial, Helvetica, sans-serif=Arial, Helvetica, sans-serif;Times New Roman, Times, serif=Times New Roman, Times, serif;Courier New, Courier, mono=Courier New, Courier, mono;Times New Roman, Times, serif=Times New Roman, Times, serif;Georgia, Times New Roman, Times, serif=Georgia, Times New Roman, Times, serif;Verdana, Arial, Helvetica, sans-serif=Verdana, Arial, Helvetica, sans-serif;Geneva, Arial, Helvetica, sans-serif=Geneva, Arial, Helvetica, sans-serif</td>
- </tr>
- <tr>
- <td>[style_font_size]</td>
- <td>Semicolon separated list of select box option name/values. In format key1=value1;key2=value2;..</td>
- </tr>
- <tr>
- <td>[style_font_size_measurement]</td>
- <td>Semicolon separated list of select box option name/values.</td>
- </tr>
- <tr>
- <td>[style_text_case]</td>
- <td>Semicolon separated list of select box option name/values.</td>
- </tr>
- <tr>
- <td>[style_font_weight]</td>
- <td>Semicolon separated list of select box option name/values.</td>
- </tr>
- <tr>
- <td>[style_font_style]</td>
- <td>Semicolon separated list of select box option name/values.</td>
- </tr>
- <tr>
- <td>[style_font_variant]</td>
- <td>Semicolon separated list of select box option name/values.</td>
- </tr>
- <tr>
- <td>[style_font_line_height]</td>
- <td>Semicolon separated list of select box option name/values.</td>
- </tr>
- <tr>
- <td>[style_font_line_height_measurement]</td>
- <td>Semicolon separated list of select box option name/values.</td>
- </tr>
- <tr>
- <td>[style_background_attachment]</td>
- <td>Semicolon separated list of select box option name/values.</td>
- </tr>
- <tr>
- <td>[style_background_repeat]</td>
- <td>Semicolon separated list of select box option name/values.</td>
- </tr>
- <tr>
- <td>[style_background_hpos_measurement]</td>
- <td>Semicolon separated list of select box option name/values.</td>
- </tr>
- <tr>
- <td>[style_background_vpos_measurement]</td>
- <td>Semicolon separated list of select box option name/values.</td>
- </tr>
- <tr>
- <td>[style_background_hpos]</td>
- <td>Semicolon separated list of select box option name/values.</td>
- </tr>
- <tr>
- <td>[style_background_vpos]</td>
- <td>Semicolon separated list of select box option name/values.</td>
- </tr>
- <tr>
- <td>[style_wordspacing]</td>
- <td>Semicolon separated list of select box option name/values.</td>
- </tr>
- <tr>
- <td>[style_wordspacing_measurement]</td>
- <td>Semicolon separated list of select box option name/values.</td>
- </tr>
- <tr>
- <td>[style_letterspacing]</td>
- <td>Semicolon separated list of select box option name/values.</td>
- </tr>
- <tr>
- <td>[style_letterspacing_measurement]</td>
- <td>Semicolon separated list of select box option name/values.</td>
- </tr>
- <tr>
- <td>[style_vertical_alignment]</td>
- <td>Semicolon separated list of select box option name/values.</td>
- </tr>
- <tr>
- <td>[style_text_align]</td>
- <td>Semicolon separated list of select box option name/values.</td>
- </tr>
- <tr>
- <td>[style_whitespace]</td>
- <td>Semicolon separated list of select box option name/values.</td>
- </tr>
- <tr>
- <td>[style_display]</td>
- <td>Semicolon separated list of select box option name/values.</td>
- </tr>
- <tr>
- <td>[style_text_indent_measurement]</td>
- <td>Semicolon separated list of select box option name/values.</td>
- </tr>
- <tr>
- <td>[style_box_width_measurement]</td>
- <td>Semicolon separated list of select box option name/values.</td>
- </tr>
- <tr>
- <td>[style_box_height_measurement]</td>
- <td>Semicolon separated list of select box option name/values.</td>
- </tr>
- <tr>
- <td>[style_float]</td>
- <td>Semicolon separated list of select box option name/values.</td>
- </tr>
- <tr>
- <td>[style_clear]</td>
- <td>Semicolon separated list of select box option name/values.</td>
- </tr>
- <tr>
- <td>[style_padding_left_measurement]</td>
- <td>Semicolon separated list of select box option name/values.</td>
- </tr>
- <tr>
- <td>[style_padding_top_measurement]</td>
- <td>Semicolon separated list of select box option name/values.</td>
- </tr>
- <tr>
- <td>[style_padding_bottom_measurement]</td>
- <td>Semicolon separated list of select box option name/values.</td>
- </tr>
- <tr>
- <td>[style_padding_right_measurement]</td>
- <td>Semicolon separated list of select box option name/values.</td>
- </tr>
- <tr>
- <td>[style_margin_left_measurement]</td>
- <td>Semicolon separated list of select box option name/values.</td>
- </tr>
- <tr>
- <td>[style_margin_top_measurement]</td>
- <td>Semicolon separated list of select box option name/values.</td>
- </tr>
- <tr>
- <td>[style_margin_bottom_measurement]</td>
- <td>Semicolon separated list of select box option name/values.</td>
- </tr>
- <tr>
- <td>[style_margin_right_measurement]</td>
- <td>Semicolon separated list of select box option name/values.</td>
- </tr>
- <tr>
- <td>[style_border_style_top]</td>
- <td>Semicolon separated list of select box option name/values.</td>
- </tr>
- <tr>
- <td>[style_border_style_right]</td>
- <td>Semicolon separated list of select box option name/values.</td>
- </tr>
- <tr>
- <td>[style_border_style_bottom]</td>
- <td>Semicolon separated list of select box option name/values.</td>
- </tr>
- <tr>
- <td>[style_border_style_left]</td>
- <td>Semicolon separated list of select box option name/values.</td>
- </tr>
- <tr>
- <td>[style_border_width_top]</td>
- <td>Semicolon separated list of select box option name/values.</td>
- </tr>
- <tr>
- <td>[style_border_width_right]</td>
- <td>Semicolon separated list of select box option name/values.</td>
- </tr>
- <tr>
- <td>[style_border_width_bottom]</td>
- <td>Semicolon separated list of select box option name/values.</td>
- </tr>
- <tr>
- <td>[style_border_width_left]</td>
- <td>Semicolon separated list of select box option name/values.</td>
- </tr>
- <tr>
- <td>[style_border_width_top_measurement]</td>
- <td>Semicolon separated list of select box option name/values.</td>
- </tr>
- <tr>
- <td>[style_border_width_right_measurement]</td>
- <td>Semicolon separated list of select box option name/values.</td>
- </tr>
- <tr>
- <td>[style_border_width_bottom_measurement]</td>
- <td>Semicolon separated list of select box option name/values.</td>
- </tr>
- <tr>
- <td>[style_border_width_left_measurement]</td>
- <td>Semicolon separated list of select box option name/values.</td>
- </tr>
- <tr>
- <td>[style_list_type]</td>
- <td>Semicolon separated list of select box option name/values.</td>
- </tr>
- <tr>
- <td>[style_list_position]</td>
- <td>Semicolon separated list of select box option name/values.</td>
- </tr>
- <tr>
- <td>[style_positioning_type]</td>
- <td>Semicolon separated list of select box option name/values.</td>
- </tr>
- <tr>
- <td>[style_positioning_visibility]</td>
- <td>Semicolon separated list of select box option name/values.</td>
- </tr>
- <tr>
- <td>[style_positioning_width_measurement]</td>
- <td>Semicolon separated list of select box option name/values.</td>
- </tr>
- <tr>
- <td>[style_positioning_height_measurement]</td>
- <td>Semicolon separated list of select box option name/values.</td>
- </tr>
- <tr>
- <td>[style_positioning_overflow]</td>
- <td>Semicolon separated list of select box option name/values.</td>
- </tr>
- <tr>
- <td>[style_positioning_placement_top_measurement]</td>
- <td>Semicolon separated list of select box option name/values.</td>
- </tr>
- <tr>
- <td>[style_positioning_placement_right_measurement]</td>
- <td>Semicolon separated list of select box option name/values.</td>
- </tr>
- <tr>
- <td>[style_positioning_placement_bottom_measurement]</td>
- <td>Semicolon separated list of select box option name/values.</td>
- </tr>
- <tr>
- <td>[style_positioning_placement_left_measurement]</td>
- <td>Semicolon separated list of select box option name/values.</td>
- </tr>
- <tr>
- <td>[style_positioning_clip_top_measurement]</td>
- <td>Semicolon separated list of select box option name/values.</td>
- </tr>
- <tr>
- <td>[style_positioning_clip_right_measurement]</td>
- <td>Semicolon separated list of select box option name/values.</td>
- </tr>
- <tr>
- <td>[style_positioning_clip_bottom_measurement]</td>
- <td>Semicolon separated list of select box option name/values.</td>
- </tr>
- <tr>
- <td>[style_positioning_clip_left_measurement]</td>
- <td>Semicolon separated list of select box option name/values.</td>
- </tr>
- </table>
- </p>
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/plugin_style.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/plugin_style.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/plugin_style.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/plugin_style.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,303 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Plugin: style</title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+ <h1>Plugin: style</h1>
+</div>
+
+<div class="content">
+ <p>Adds CSS style editing support to TinyMCE, this will enable you to edit allmost any CSS style property in a visual way.</p>
+
+ <h3>Installation Instructions</h3>
+ <p>
+ <ul>
+ <li>Add plugin to TinyMCE plugin option list example: plugins : "style".</li>
+ <li>Add the styleprops butto names to button list, example: theme_advanced_buttons3_add : "styleprops".</li>
+ </ul>
+ </p>
+ <h3>Initialization Example</h3>
+ <p>
+ <div class="example">
+ <pre>
+tinyMCE.init({
+ theme : "advanced",
+ mode : "textareas",
+ plugins : "<strong>style</strong>",
+ theme_advanced_buttons3_add : "<strong>styleprops</strong>"
+});</pre>
+ </div>
+ </p>
+ <br />
+
+ <h3>Options</h3>
+ <p>
+ <table border="1" cellspacing="0" cellpadding="4">
+ <tr>
+ <td>[style_font]</td>
+ <td>Semicolon separated list of select box option name/values. Default: Arial, Helvetica, sans-serif=Arial, Helvetica, sans-serif;Times New Roman, Times, serif=Times New Roman, Times, serif;Courier New, Courier, mono=Courier New, Courier, mono;Times New Roman, Times, serif=Times New Roman, Times, serif;Georgia, Times New Roman, Times, serif=Georgia, Times New Roman, Times, serif;Verdana, Arial, Helvetica, sans-serif=Verdana, Arial, Helvetica, sans-serif;Geneva, Arial, Helvetica, sans-serif=Geneva, Arial, Helvetica, sans-serif</td>
+ </tr>
+ <tr>
+ <td>[style_font_size]</td>
+ <td>Semicolon separated list of select box option name/values. In format key1=value1;key2=value2;..</td>
+ </tr>
+ <tr>
+ <td>[style_font_size_measurement]</td>
+ <td>Semicolon separated list of select box option name/values.</td>
+ </tr>
+ <tr>
+ <td>[style_text_case]</td>
+ <td>Semicolon separated list of select box option name/values.</td>
+ </tr>
+ <tr>
+ <td>[style_font_weight]</td>
+ <td>Semicolon separated list of select box option name/values.</td>
+ </tr>
+ <tr>
+ <td>[style_font_style]</td>
+ <td>Semicolon separated list of select box option name/values.</td>
+ </tr>
+ <tr>
+ <td>[style_font_variant]</td>
+ <td>Semicolon separated list of select box option name/values.</td>
+ </tr>
+ <tr>
+ <td>[style_font_line_height]</td>
+ <td>Semicolon separated list of select box option name/values.</td>
+ </tr>
+ <tr>
+ <td>[style_font_line_height_measurement]</td>
+ <td>Semicolon separated list of select box option name/values.</td>
+ </tr>
+ <tr>
+ <td>[style_background_attachment]</td>
+ <td>Semicolon separated list of select box option name/values.</td>
+ </tr>
+ <tr>
+ <td>[style_background_repeat]</td>
+ <td>Semicolon separated list of select box option name/values.</td>
+ </tr>
+ <tr>
+ <td>[style_background_hpos_measurement]</td>
+ <td>Semicolon separated list of select box option name/values.</td>
+ </tr>
+ <tr>
+ <td>[style_background_vpos_measurement]</td>
+ <td>Semicolon separated list of select box option name/values.</td>
+ </tr>
+ <tr>
+ <td>[style_background_hpos]</td>
+ <td>Semicolon separated list of select box option name/values.</td>
+ </tr>
+ <tr>
+ <td>[style_background_vpos]</td>
+ <td>Semicolon separated list of select box option name/values.</td>
+ </tr>
+ <tr>
+ <td>[style_wordspacing]</td>
+ <td>Semicolon separated list of select box option name/values.</td>
+ </tr>
+ <tr>
+ <td>[style_wordspacing_measurement]</td>
+ <td>Semicolon separated list of select box option name/values.</td>
+ </tr>
+ <tr>
+ <td>[style_letterspacing]</td>
+ <td>Semicolon separated list of select box option name/values.</td>
+ </tr>
+ <tr>
+ <td>[style_letterspacing_measurement]</td>
+ <td>Semicolon separated list of select box option name/values.</td>
+ </tr>
+ <tr>
+ <td>[style_vertical_alignment]</td>
+ <td>Semicolon separated list of select box option name/values.</td>
+ </tr>
+ <tr>
+ <td>[style_text_align]</td>
+ <td>Semicolon separated list of select box option name/values.</td>
+ </tr>
+ <tr>
+ <td>[style_whitespace]</td>
+ <td>Semicolon separated list of select box option name/values.</td>
+ </tr>
+ <tr>
+ <td>[style_display]</td>
+ <td>Semicolon separated list of select box option name/values.</td>
+ </tr>
+ <tr>
+ <td>[style_text_indent_measurement]</td>
+ <td>Semicolon separated list of select box option name/values.</td>
+ </tr>
+ <tr>
+ <td>[style_box_width_measurement]</td>
+ <td>Semicolon separated list of select box option name/values.</td>
+ </tr>
+ <tr>
+ <td>[style_box_height_measurement]</td>
+ <td>Semicolon separated list of select box option name/values.</td>
+ </tr>
+ <tr>
+ <td>[style_float]</td>
+ <td>Semicolon separated list of select box option name/values.</td>
+ </tr>
+ <tr>
+ <td>[style_clear]</td>
+ <td>Semicolon separated list of select box option name/values.</td>
+ </tr>
+ <tr>
+ <td>[style_padding_left_measurement]</td>
+ <td>Semicolon separated list of select box option name/values.</td>
+ </tr>
+ <tr>
+ <td>[style_padding_top_measurement]</td>
+ <td>Semicolon separated list of select box option name/values.</td>
+ </tr>
+ <tr>
+ <td>[style_padding_bottom_measurement]</td>
+ <td>Semicolon separated list of select box option name/values.</td>
+ </tr>
+ <tr>
+ <td>[style_padding_right_measurement]</td>
+ <td>Semicolon separated list of select box option name/values.</td>
+ </tr>
+ <tr>
+ <td>[style_margin_left_measurement]</td>
+ <td>Semicolon separated list of select box option name/values.</td>
+ </tr>
+ <tr>
+ <td>[style_margin_top_measurement]</td>
+ <td>Semicolon separated list of select box option name/values.</td>
+ </tr>
+ <tr>
+ <td>[style_margin_bottom_measurement]</td>
+ <td>Semicolon separated list of select box option name/values.</td>
+ </tr>
+ <tr>
+ <td>[style_margin_right_measurement]</td>
+ <td>Semicolon separated list of select box option name/values.</td>
+ </tr>
+ <tr>
+ <td>[style_border_style_top]</td>
+ <td>Semicolon separated list of select box option name/values.</td>
+ </tr>
+ <tr>
+ <td>[style_border_style_right]</td>
+ <td>Semicolon separated list of select box option name/values.</td>
+ </tr>
+ <tr>
+ <td>[style_border_style_bottom]</td>
+ <td>Semicolon separated list of select box option name/values.</td>
+ </tr>
+ <tr>
+ <td>[style_border_style_left]</td>
+ <td>Semicolon separated list of select box option name/values.</td>
+ </tr>
+ <tr>
+ <td>[style_border_width_top]</td>
+ <td>Semicolon separated list of select box option name/values.</td>
+ </tr>
+ <tr>
+ <td>[style_border_width_right]</td>
+ <td>Semicolon separated list of select box option name/values.</td>
+ </tr>
+ <tr>
+ <td>[style_border_width_bottom]</td>
+ <td>Semicolon separated list of select box option name/values.</td>
+ </tr>
+ <tr>
+ <td>[style_border_width_left]</td>
+ <td>Semicolon separated list of select box option name/values.</td>
+ </tr>
+ <tr>
+ <td>[style_border_width_top_measurement]</td>
+ <td>Semicolon separated list of select box option name/values.</td>
+ </tr>
+ <tr>
+ <td>[style_border_width_right_measurement]</td>
+ <td>Semicolon separated list of select box option name/values.</td>
+ </tr>
+ <tr>
+ <td>[style_border_width_bottom_measurement]</td>
+ <td>Semicolon separated list of select box option name/values.</td>
+ </tr>
+ <tr>
+ <td>[style_border_width_left_measurement]</td>
+ <td>Semicolon separated list of select box option name/values.</td>
+ </tr>
+ <tr>
+ <td>[style_list_type]</td>
+ <td>Semicolon separated list of select box option name/values.</td>
+ </tr>
+ <tr>
+ <td>[style_list_position]</td>
+ <td>Semicolon separated list of select box option name/values.</td>
+ </tr>
+ <tr>
+ <td>[style_positioning_type]</td>
+ <td>Semicolon separated list of select box option name/values.</td>
+ </tr>
+ <tr>
+ <td>[style_positioning_visibility]</td>
+ <td>Semicolon separated list of select box option name/values.</td>
+ </tr>
+ <tr>
+ <td>[style_positioning_width_measurement]</td>
+ <td>Semicolon separated list of select box option name/values.</td>
+ </tr>
+ <tr>
+ <td>[style_positioning_height_measurement]</td>
+ <td>Semicolon separated list of select box option name/values.</td>
+ </tr>
+ <tr>
+ <td>[style_positioning_overflow]</td>
+ <td>Semicolon separated list of select box option name/values.</td>
+ </tr>
+ <tr>
+ <td>[style_positioning_placement_top_measurement]</td>
+ <td>Semicolon separated list of select box option name/values.</td>
+ </tr>
+ <tr>
+ <td>[style_positioning_placement_right_measurement]</td>
+ <td>Semicolon separated list of select box option name/values.</td>
+ </tr>
+ <tr>
+ <td>[style_positioning_placement_bottom_measurement]</td>
+ <td>Semicolon separated list of select box option name/values.</td>
+ </tr>
+ <tr>
+ <td>[style_positioning_placement_left_measurement]</td>
+ <td>Semicolon separated list of select box option name/values.</td>
+ </tr>
+ <tr>
+ <td>[style_positioning_clip_top_measurement]</td>
+ <td>Semicolon separated list of select box option name/values.</td>
+ </tr>
+ <tr>
+ <td>[style_positioning_clip_right_measurement]</td>
+ <td>Semicolon separated list of select box option name/values.</td>
+ </tr>
+ <tr>
+ <td>[style_positioning_clip_bottom_measurement]</td>
+ <td>Semicolon separated list of select box option name/values.</td>
+ </tr>
+ <tr>
+ <td>[style_positioning_clip_left_measurement]</td>
+ <td>Semicolon separated list of select box option name/values.</td>
+ </tr>
+ </table>
+ </p>
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/plugin_table.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/plugin_table.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/plugin_table.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,104 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Plugin: table</title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
- <h1>Plugin: table</h1>
-</div>
-
-<div class="content">
- <p>
- This plugin adds table management functionality to TinyMCE.
- </p>
-
- <p>
- <table border="1" cellspacing="0" cellpadding="4">
- <thead><td colspan="2">Table controls/buttons</td></thead>
- <tbody>
- <tr><td><strong>tablecontrols</strong></td><td>All table control below and some separators between them.</td></tr>
- <tr><td><strong>table</strong></td><td>Insert table control.</td></tr>
- <tr><td><strong>row_props</strong></td><td>Edit row properties (tr).</td></tr>
- <tr><td><strong>cell_props</strong></td><td>Edit cell properties (td).</td></tr>
- <tr><td><strong>delete_col</strong></td><td>Delete column control.</td></tr>
- <tr><td><strong>delete_row</strong></td><td>Delete row control.</td></tr>
- <tr><td><strong>col_after</strong></td><td>Column after control.</td></tr>
- <tr><td><strong>col_before</strong></td><td>Column before control.</td></tr>
- <tr><td><strong>row_after</strong></td><td>Row after control.</td></tr>
- <tr><td><strong>row_before</strong></td><td>Row before control.</td></tr>
- <tr><td><strong>row_after</strong></td><td>Row after control.</td></tr>
- <tr><td><strong>row_before</strong></td><td>Row before control.</td></tr>
- <tr><td><strong>split_cells</strong></td><td>Splits a merged cell into rows and columns.</td></tr>
- <tr><td><strong>merge_cells</strong></td><td>Mergers selected cells into one cell.</td></tr>
- </tbody>
- </table>
- </p>
-
- <p>
- <table border="1" cellspacing="0" cellpadding="4">
- <thead><td colspan="2">Table commands to use with execCommand</td></thead>
- <tbody>
- <tr><td><strong>mceInsertTable</strong></td><td>Inserts a new table at cursor location the default size is 2x2. If the value parameter is specified it should contain a name/value array, this array has the following options cols, rows, border, cellspacing, cellpadding. The default border is set to: 0.</td></tr>
- <tr><td><strong>mceTableInsertRowBefore</strong></td><td>Inserts a row before/above the current cursor location.</td></tr>
- <tr><td><strong>mceTableInsertRowAfter</strong></td><td>Inserts a row after/under the current cursor location.</td></tr>
- <tr><td><strong>mceTableDeleteRow</strong></td><td>Deletes the row at the current cursor location.</td></tr>
- <tr><td><strong>mceTableInsertColBefore</strong></td><td>Inserts a column before the current cursor location.</td></tr>
- <tr><td><strong>mceTableInsertColAfter</strong></td><td>Inserts a column after the current cursor location.</td></tr>
- <tr><td><strong>mceTableDeleteCol</strong></td><td>Deletes the column at the current cursor location.</td></tr>
- </tbody>
- </table>
- </p>
-
- <p>
- <table border="1" cellspacing="0" cellpadding="4">
- <thead><td colspan="2">Options</td></thead>
- <tbody>
- <tr><td><strong>table_styles</strong></td><td>This option should contain a semicolon separated list of class titles and class names separated by =. The titles are the ones that get presented to the user in the styles drop down list and and the class names is the classes that gets inserted.</td></tr>
- <tr><td><strong>table_cell_styles</strong></td><td>This option should contain a semicolon separated list of class titles and class names separated by =. The titles are the ones that get presented to the user in the styles drop down list and and the class names is the classes that gets inserted.</td></tr>
- <tr><td><strong>table_row_styles</strong></td><td>This option should contain a semicolon separated list of class titles and class names separated by =. The titles are the ones that get presented to the user in the styles drop down list and and the class names is the classes that gets inserted.</td></tr>
- <tr><td><strong>table_cell_limit</strong></td><td>Enables you to specify the max number of cells for a table.</td></tr>
- <tr><td><strong>table_row_limit</strong></td><td>Enables you to specify the max number of rows for a table.</td></tr>
- <tr><td><strong>table_col_limit</strong></td><td>Enables you to specify the max number of columns for a table.</td></tr>
- </tbody>
- </table>
- <br />
- </p>
-
- <h3>Installation Instructions</h3>
- <p>
- <ul>
- <li>Add plugin to TinyMCE plugin option list example: plugins : "directionality".</li>
- <li>Add the ltr, rtl button names to button list, example: theme_advanced_buttons3_add : "ltr,rtl".</li>
- </ul>
- </p>
- <h3>Initialization Example</h3>
- <p>
- <div class="example">
- <pre>
-tinyMCE.init({
- theme : "advanced",
- mode : "textareas",
- plugins : "<strong>table</strong>",
- theme_advanced_buttons3_add : "<strong>tablecontrols</strong>",
- table_styles : "Header 1=header1;Header 2=header2;Header 3=header3",
- table_cell_styles : "Header 1=header1;Header 2=header2;Header 3=header3;Table Cell=tableCel1",
- table_row_styles : "Header 1=header1;Header 2=header2;Header 3=header3;Table Row=tableRow1",
- table_cell_limit : 100,
- table_row_limit : 5,
- table_col_limit : 5
-});</pre>
- </div>
- </p>
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/plugin_table.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/plugin_table.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/plugin_table.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/plugin_table.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,104 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Plugin: table</title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+ <h1>Plugin: table</h1>
+</div>
+
+<div class="content">
+ <p>
+ This plugin adds table management functionality to TinyMCE.
+ </p>
+
+ <p>
+ <table border="1" cellspacing="0" cellpadding="4">
+ <thead><td colspan="2">Table controls/buttons</td></thead>
+ <tbody>
+ <tr><td><strong>tablecontrols</strong></td><td>All table control below and some separators between them.</td></tr>
+ <tr><td><strong>table</strong></td><td>Insert table control.</td></tr>
+ <tr><td><strong>row_props</strong></td><td>Edit row properties (tr).</td></tr>
+ <tr><td><strong>cell_props</strong></td><td>Edit cell properties (td).</td></tr>
+ <tr><td><strong>delete_col</strong></td><td>Delete column control.</td></tr>
+ <tr><td><strong>delete_row</strong></td><td>Delete row control.</td></tr>
+ <tr><td><strong>col_after</strong></td><td>Column after control.</td></tr>
+ <tr><td><strong>col_before</strong></td><td>Column before control.</td></tr>
+ <tr><td><strong>row_after</strong></td><td>Row after control.</td></tr>
+ <tr><td><strong>row_before</strong></td><td>Row before control.</td></tr>
+ <tr><td><strong>row_after</strong></td><td>Row after control.</td></tr>
+ <tr><td><strong>row_before</strong></td><td>Row before control.</td></tr>
+ <tr><td><strong>split_cells</strong></td><td>Splits a merged cell into rows and columns.</td></tr>
+ <tr><td><strong>merge_cells</strong></td><td>Mergers selected cells into one cell.</td></tr>
+ </tbody>
+ </table>
+ </p>
+
+ <p>
+ <table border="1" cellspacing="0" cellpadding="4">
+ <thead><td colspan="2">Table commands to use with execCommand</td></thead>
+ <tbody>
+ <tr><td><strong>mceInsertTable</strong></td><td>Inserts a new table at cursor location the default size is 2x2. If the value parameter is specified it should contain a name/value array, this array has the following options cols, rows, border, cellspacing, cellpadding. The default border is set to: 0.</td></tr>
+ <tr><td><strong>mceTableInsertRowBefore</strong></td><td>Inserts a row before/above the current cursor location.</td></tr>
+ <tr><td><strong>mceTableInsertRowAfter</strong></td><td>Inserts a row after/under the current cursor location.</td></tr>
+ <tr><td><strong>mceTableDeleteRow</strong></td><td>Deletes the row at the current cursor location.</td></tr>
+ <tr><td><strong>mceTableInsertColBefore</strong></td><td>Inserts a column before the current cursor location.</td></tr>
+ <tr><td><strong>mceTableInsertColAfter</strong></td><td>Inserts a column after the current cursor location.</td></tr>
+ <tr><td><strong>mceTableDeleteCol</strong></td><td>Deletes the column at the current cursor location.</td></tr>
+ </tbody>
+ </table>
+ </p>
+
+ <p>
+ <table border="1" cellspacing="0" cellpadding="4">
+ <thead><td colspan="2">Options</td></thead>
+ <tbody>
+ <tr><td><strong>table_styles</strong></td><td>This option should contain a semicolon separated list of class titles and class names separated by =. The titles are the ones that get presented to the user in the styles drop down list and and the class names is the classes that gets inserted.</td></tr>
+ <tr><td><strong>table_cell_styles</strong></td><td>This option should contain a semicolon separated list of class titles and class names separated by =. The titles are the ones that get presented to the user in the styles drop down list and and the class names is the classes that gets inserted.</td></tr>
+ <tr><td><strong>table_row_styles</strong></td><td>This option should contain a semicolon separated list of class titles and class names separated by =. The titles are the ones that get presented to the user in the styles drop down list and and the class names is the classes that gets inserted.</td></tr>
+ <tr><td><strong>table_cell_limit</strong></td><td>Enables you to specify the max number of cells for a table.</td></tr>
+ <tr><td><strong>table_row_limit</strong></td><td>Enables you to specify the max number of rows for a table.</td></tr>
+ <tr><td><strong>table_col_limit</strong></td><td>Enables you to specify the max number of columns for a table.</td></tr>
+ </tbody>
+ </table>
+ <br />
+ </p>
+
+ <h3>Installation Instructions</h3>
+ <p>
+ <ul>
+ <li>Add plugin to TinyMCE plugin option list example: plugins : "directionality".</li>
+ <li>Add the ltr, rtl button names to button list, example: theme_advanced_buttons3_add : "ltr,rtl".</li>
+ </ul>
+ </p>
+ <h3>Initialization Example</h3>
+ <p>
+ <div class="example">
+ <pre>
+tinyMCE.init({
+ theme : "advanced",
+ mode : "textareas",
+ plugins : "<strong>table</strong>",
+ theme_advanced_buttons3_add : "<strong>tablecontrols</strong>",
+ table_styles : "Header 1=header1;Header 2=header2;Header 3=header3",
+ table_cell_styles : "Header 1=header1;Header 2=header2;Header 3=header3;Table Cell=tableCel1",
+ table_row_styles : "Header 1=header1;Header 2=header2;Header 3=header3;Table Row=tableRow1",
+ table_cell_limit : 100,
+ table_row_limit : 5,
+ table_col_limit : 5
+});</pre>
+ </div>
+ </p>
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/plugin_zoom.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/plugin_zoom.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/plugin_zoom.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,44 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Plugin: zoom</title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
- <h1>Plugin: zoom</h1>
-</div>
-
-<div class="content">
- <p>Adds a zoom drop list in MSIE5.5+, this plugin was mostly created to show how to add custom droplists as plugins.</p>
-
- <h3>Installation Instructions</h3>
- <p>
- <ul>
- <li>Add plugin to TinyMCE plugin option list example: plugins : "zoom".</li>
- <li>Add the ltr, rtl button names to button list, example: theme_advanced_buttons3_add : "zoom".</li>
- </ul>
- </p>
- <h3>Initialization Example</h3>
- <p>
- <div class="example">
- <pre>
-tinyMCE.init({
- theme : "advanced",
- mode : "textareas",
- plugins : "<strong>zoom</strong>",
- theme_advanced_buttons3_add : "<strong>zoom</strong>"
-});</pre>
- </div>
- </p>
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/plugin_zoom.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/plugin_zoom.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/plugin_zoom.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/plugin_zoom.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,44 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Plugin: zoom</title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+ <h1>Plugin: zoom</h1>
+</div>
+
+<div class="content">
+ <p>Adds a zoom drop list in MSIE5.5+, this plugin was mostly created to show how to add custom droplists as plugins.</p>
+
+ <h3>Installation Instructions</h3>
+ <p>
+ <ul>
+ <li>Add plugin to TinyMCE plugin option list example: plugins : "zoom".</li>
+ <li>Add the ltr, rtl button names to button list, example: theme_advanced_buttons3_add : "zoom".</li>
+ </ul>
+ </p>
+ <h3>Initialization Example</h3>
+ <p>
+ <div class="example">
+ <pre>
+tinyMCE.init({
+ theme : "advanced",
+ mode : "textareas",
+ plugins : "<strong>zoom</strong>",
+ theme_advanced_buttons3_add : "<strong>zoom</strong>"
+});</pre>
+ </div>
+ </p>
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/reference_buttons.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/reference_buttons.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/reference_buttons.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,149 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>List of all buttons/controls available, and their plugin requirements.</title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
- <h1>List of all buttons/controls available, and their plugin requirements.</h1>
-</div>
-
-<div class="content">
- <p>
- This is a list of all the avalible buttons that you can configure, the requirements are also listed as some buttons require you to include the plugin first. Check each plugin for more information, some plugins have seperate configurations. Use the <a href="option_theme_advanced_buttons_n.html">theme_advanced_buttons<1-n></a>, <a href="option_theme_advanced_buttons_n_add.html">theme_advanced_buttons<1-n>_add</a> or <a href="option_theme_advanced_buttons_n_add_before.html">theme_advanced_buttons<1-n>_add_before</a> options to add new buttons and to disable buttons use the <a href="option_theme_advanced_disable.html">theme_advanced_disable</a> option.
- </p>
- <div class="separator"></div>
-
- <p>
- <h3>Default buttons available in the advanced theme</h3>
- bold<br />
- italic<br />
- underline<br />
- strikethrough<br />
- justifyleft<br />
- justifycenter<br />
- justifyright<br />
- justifyfull<br />
- bullist<br />
- numlist<br />
- outdent<br />
- indent<br />
- cut<br />
- copy<br />
- paste<br />
- undo<br />
- redo<br />
- link<br />
- unlink<br />
- image<br />
- cleanup<br />
- help<br />
- code<br />
- hr<br />
- removeformat<br />
- formatselect<br />
- fontselect<br />
- fontsizeselect<br />
- styleselect<br />
- sub<br />
- sup<br />
- forecolor<br />
- backcolor<br />
- charmap<br />
- visualaid<br />
- anchor<br />
- newdocument<br />
- separator<br />
- </p>
- <p>
- <h3>Plugins with the button name same as plugin name</h3>
- <a href="plugin_save.html">save</a><br />
- <a href="plugin_emotions.html">emotions</a><br />
- <a href="plugin_flash.html">flash</a><br />
- <a href="plugin_iespell.html">iespell</a><br />
- <a href="plugin_preview.html">preview</a><br />
- <a href="plugin_print.html">print</a><br />
- <a href="plugin_zoom.html">zoom</a><br />
- <a href="plugin_fullscreen.html">fullscreen</a><br />
- <a href="plugin_advhr.html">advhr</a><br />
- <a href="plugin_fullpage.html">fullpage</a><br />
- <a href="plugin_spellchecker.html">spellchecker</a><br />
- <br />
- </p>
- <p>
- <h3>Plugins with custom buttons</h3>
- <ul>
-
- <li>advlink</li>
- <ul>
- <li>Will override the "link" button</li>
- </ul>
- <li>advimage</li>
- <ul>
- <li>Will override the "image" button</li>
- </ul>
- <li><a href="plugin_paste.html">paste</a></li>
- <ul>
- <li>pastetext</li>
- <li>pasteword</li>
- <li>selectall</li>
- </ul>
- <li><a href="plugin_searchreplace.html">searchreplace</a></li>
- <ul>
- <li>search</li>
- <li>replace</li>
- </ul>
- <li><a href="plugin_insertdatetime.html">insertdatetime</a></li>
- <ul>
- <li>insertdate</li>
- <li>inserttime</li>
- </ul>
- <li><a href="plugin_table.html">table</a></li>
- <ul>
- <li>tablecontrols</li>
- <li>table</li>
- <li>row_props</li>
- <li>cell_props</li>
- <li>delete_col</li>
- <li>delete_row</li>
- <li>col_after</li>
- <li>col_before</li>
- <li>row_after</li>
- <li>row_before</li>
- <li>row_after</li>
- <li>row_before</li>
- <li>split_cells</li>
- <li>merge_cells</li>
- </ul>
- <li><a href="plugin_directionality.html">directionality</a></li>
- <ul>
- <li>ltr</li>
- <li>rtl</li>
- </ul>
- <li><a href="plugin_layer.html">layer</a></li>
- <ul>
- <li>moveforward</li>
- <li>movebackward</li>
- <li>absolute</li>
- <li>insertlayer</li>
- </ul>
- <li><a href="plugin_style.html">style</a></li>
- <ul>
- <li>styleprops</li>
- </ul>
- </ul>
- </p>
-</div>
-
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
-
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/reference_buttons.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/reference_buttons.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/reference_buttons.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/reference_buttons.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,149 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>List of all buttons/controls available, and their plugin requirements.</title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+ <h1>List of all buttons/controls available, and their plugin requirements.</h1>
+</div>
+
+<div class="content">
+ <p>
+ This is a list of all the avalible buttons that you can configure, the requirements are also listed as some buttons require you to include the plugin first. Check each plugin for more information, some plugins have seperate configurations. Use the <a href="option_theme_advanced_buttons_n.html">theme_advanced_buttons<1-n></a>, <a href="option_theme_advanced_buttons_n_add.html">theme_advanced_buttons<1-n>_add</a> or <a href="option_theme_advanced_buttons_n_add_before.html">theme_advanced_buttons<1-n>_add_before</a> options to add new buttons and to disable buttons use the <a href="option_theme_advanced_disable.html">theme_advanced_disable</a> option.
+ </p>
+ <div class="separator"></div>
+
+ <p>
+ <h3>Default buttons available in the advanced theme</h3>
+ bold<br />
+ italic<br />
+ underline<br />
+ strikethrough<br />
+ justifyleft<br />
+ justifycenter<br />
+ justifyright<br />
+ justifyfull<br />
+ bullist<br />
+ numlist<br />
+ outdent<br />
+ indent<br />
+ cut<br />
+ copy<br />
+ paste<br />
+ undo<br />
+ redo<br />
+ link<br />
+ unlink<br />
+ image<br />
+ cleanup<br />
+ help<br />
+ code<br />
+ hr<br />
+ removeformat<br />
+ formatselect<br />
+ fontselect<br />
+ fontsizeselect<br />
+ styleselect<br />
+ sub<br />
+ sup<br />
+ forecolor<br />
+ backcolor<br />
+ charmap<br />
+ visualaid<br />
+ anchor<br />
+ newdocument<br />
+ separator<br />
+ </p>
+ <p>
+ <h3>Plugins with the button name same as plugin name</h3>
+ <a href="plugin_save.html">save</a><br />
+ <a href="plugin_emotions.html">emotions</a><br />
+ <a href="plugin_flash.html">flash</a><br />
+ <a href="plugin_iespell.html">iespell</a><br />
+ <a href="plugin_preview.html">preview</a><br />
+ <a href="plugin_print.html">print</a><br />
+ <a href="plugin_zoom.html">zoom</a><br />
+ <a href="plugin_fullscreen.html">fullscreen</a><br />
+ <a href="plugin_advhr.html">advhr</a><br />
+ <a href="plugin_fullpage.html">fullpage</a><br />
+ <a href="plugin_spellchecker.html">spellchecker</a><br />
+ <br />
+ </p>
+ <p>
+ <h3>Plugins with custom buttons</h3>
+ <ul>
+
+ <li>advlink</li>
+ <ul>
+ <li>Will override the "link" button</li>
+ </ul>
+ <li>advimage</li>
+ <ul>
+ <li>Will override the "image" button</li>
+ </ul>
+ <li><a href="plugin_paste.html">paste</a></li>
+ <ul>
+ <li>pastetext</li>
+ <li>pasteword</li>
+ <li>selectall</li>
+ </ul>
+ <li><a href="plugin_searchreplace.html">searchreplace</a></li>
+ <ul>
+ <li>search</li>
+ <li>replace</li>
+ </ul>
+ <li><a href="plugin_insertdatetime.html">insertdatetime</a></li>
+ <ul>
+ <li>insertdate</li>
+ <li>inserttime</li>
+ </ul>
+ <li><a href="plugin_table.html">table</a></li>
+ <ul>
+ <li>tablecontrols</li>
+ <li>table</li>
+ <li>row_props</li>
+ <li>cell_props</li>
+ <li>delete_col</li>
+ <li>delete_row</li>
+ <li>col_after</li>
+ <li>col_before</li>
+ <li>row_after</li>
+ <li>row_before</li>
+ <li>row_after</li>
+ <li>row_before</li>
+ <li>split_cells</li>
+ <li>merge_cells</li>
+ </ul>
+ <li><a href="plugin_directionality.html">directionality</a></li>
+ <ul>
+ <li>ltr</li>
+ <li>rtl</li>
+ </ul>
+ <li><a href="plugin_layer.html">layer</a></li>
+ <ul>
+ <li>moveforward</li>
+ <li>movebackward</li>
+ <li>absolute</li>
+ <li>insertlayer</li>
+ </ul>
+ <li><a href="plugin_style.html">style</a></li>
+ <ul>
+ <li>styleprops</li>
+ </ul>
+ </ul>
+ </p>
+</div>
+
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/reference_configuration.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/reference_configuration.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/reference_configuration.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,228 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Configuration reference</title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
- <h1>Configuration reference</h1>
-</div>
-
-<div class="content">
- <p>This document is the index/reference page for all available core configuration options in TinyMCE.</p>
-
- <div class="separator"></div>
-
- <h2>Configuration options</h2>
- <div class="section">
- <p>All configuration options below is to be placed within the init JavaScript call.<br /><br />
-
- <div class="column">
- <h3>General</h3>
- <ul class="optionlist">
- <li><a href="option_mode.html">mode</a></li>
- <li><a href="option_theme.html">theme</a></li>
- <li><a href="option_plugins.html">plugins</a></li>
- <li><a href="option_language.html">language</a></li>
- <li><a href="option_ask.html">ask</a></li>
- <li><a href="option_textarea_trigger.html">textarea_trigger</a></li>
- <li><a href="option_editor_selector.html">editor_selector</a></li>
- <li><a href="option_editor_deselector.html">editor_deselector</a></li>
- <li><a href="option_elements.html">elements</a></li>
- <li><a href="option_docs_language.html">docs_language</a></li>
- <li><a href="option_debug.html">debug</a></li>
- <li><a href="option_focus_alert.html">focus_alert</a></li>
- <li><a href="option_directionality.html">directionality</a></li>
- <li><a href="option_auto_reset_designmode.html">auto_reset_designmode</a></li>
- <li><a href="option_auto_focus.html">auto_focus</a></li>
- <li><a href="option_nowrap.html">nowrap</a></li>
- <li><a href="option_button_tile_map.html">button_tile_map</a></li>
- <li><a href="option_auto_resize.html">auto_resize</a></li>
- <li><a href="option_browsers.html">browsers</a></li>
- <li><a href="option_dialog_type.html">dialog_type</a></li>
- <li><a href="option_accessibility_warnings.html">accessibility_warnings</a></li>
- <li><a href="option_accessibility_focus.html">accessibility_focus</a></li>
- <li><a href="option_event_elements.html">event_elements</a></li>
- <li><a href="option_table_inline_editing.html">table_inline_editing</a></li>
- <li><a href="option_object_resizing.html">object_resizing</a></li>
- <li><a href="option_custom_shortcuts.html">custom_shortcuts</a></li>
- <li><a href="option_strict_loading_mode.html">strict_loading_mode</a></li>
- </ul>
-
- <h3>Cleanup/Output</h3>
- <ul class="optionlist">
- <li><a href="option_cleanup.html">cleanup</a></li>
- <li><a href="option_valid_elements.html">valid_elements</a></li>
- <li><a href="option_extended_valid_elements.html">extended_valid_elements</a></li>
- <li><a href="option_invalid_elements.html">invalid_elements</a></li>
- <li><a href="option_verify_css_classes.html">verify_css_classes</a></li>
- <li><a href="option_verify_html.html">verify_html</a></li>
- <li><a href="option_preformatted.html">preformatted</a></li>
- <li><a href="option_encoding.html">encoding</a></li>
- <li><a href="option_cleanup_on_startup.html">cleanup_on_startup</a></li>
- <li><a href="option_fix_content_duplication.html">fix_content_duplication</a></li>
- <li><a href="option_inline_styles.html">inline_styles</a></li>
- <li><a href="option_convert_newlines_to_brs.html">convert_newlines_to_brs</a></li>
- <li><a href="option_force_br_newlines.html">force_br_newlines</a></li>
- <li><a href="option_force_p_newlines.html">force_p_newlines</a></li>
- <li><a href="option_entities.html">entities</a></li>
- <li><a href="option_entity_encoding.html">entity_encoding</a></li>
- <li><a href="option_remove_linebreaks.html">remove_linebreaks</a></li>
- <li><a href="option_convert_fonts_to_spans.html">convert_fonts_to_spans</a></li>
- <li><a href="option_font_size_classes.html">font_size_classes</a></li>
- <li><a href="option_font_size_style_values.html">font_size_style_values</a></li>
- <li><a href="option_merge_styles_invalid_parents.html">merge_styles_invalid_parents</a></li>
- <li><a href="option_force_hex_style_colors.html">force_hex_style_colors</a></li>
- <li><a href="option_apply_source_formatting.html">apply_source_formatting</a></li>
- <li><a href="option_trim_span_elements.html">trim_span_elements</a></li>
- <li><a href="option_doctype.html">doctype</a></li>
- <li><a href="option_fix_list_elements.html">fix_list_elements</a></li>
- <li><a href="option_fix_table_elements.html">fix_table_elements</a></li>
- </ul>
-
- </div>
- <div class="column">
-
- <h3>URL</h3>
- <ul class="optionlist">
- <li><a href="option_convert_urls.html">convert_urls</a></li>
- <li><a href="option_relative_urls.html">relative_urls</a></li>
- <li><a href="option_remove_script_host.html">remove_script_host</a></li>
- <li><a href="option_document_base_url.html">document_base_url</a></li>
- </ul>
-
- <h3>Callbacks</h3>
- <ul class="optionlist">
- <li><a href="option_urlconverter_callback.html">urlconverter_callback</a></li>
- <li><a href="option_insertlink_callback.html">insertlink_callback</a></li>
- <li><a href="option_insertimage_callback.html">insertimage_callback</a></li>
- <li><a href="option_setupcontent_callback.html">setupcontent_callback</a></li>
- <li><a href="option_save_callback.html">save_callback</a></li>
- <li><a href="option_onchange_callback.html">onchange_callback</a></li>
- <li><a href="option_init_instance_callback.html">init_instance_callback</a></li>
- <li><a href="option_file_browser_callback.html">file_browser_callback</a></li>
- <li><a href="option_cleanup_callback.html">cleanup_callback</a></li>
- <li><a href="option_handle_event_callback.html">handle_event_callback</a></li>
- <li><a href="option_execcommand_callback.html">execcommand_callback</a></li>
- <li><a href="option_oninit.html">oninit</a></li>
- <li><a href="option_onpageload.html">onpageload</a></li>
- </ul>
-
- <h3>Layout</h3>
- <ul class="optionlist">
- <li><a href="option_content_css.html">content_css</a></li>
- <li><a href="option_popups_css.html">popups_css</a></li>
- <li><a href="option_editor_css.html">editor_css</a></li>
- <li><a href="option_width.html">width</a></li>
- <li><a href="option_height.html">height</a></li>
- </ul>
-
- <h3>Visual aids</h3>
- <ul class="optionlist">
- <li><a href="option_visual.html">visual</a></li>
- <li><a href="option_visual_table_class.html">visual_table_class</a></li>
- </ul>
-
- <h3>Undo/Redo</h3>
- <ul class="optionlist">
- <li><a href="option_custom_undo_redo.html">custom_undo_redo</a></li>
- <li><a href="option_custom_undo_redo_levels.html">custom_undo_redo_levels</a></li>
- <li><a href="option_custom_undo_redo_keyboard_shortcuts.html">custom_undo_redo_keyboard_shortcuts</a></li>
- <li><a href="option_custom_undo_redo_restore_selection.html">custom_undo_redo_restore_selection</a></li>
- </ul>
-
- <h3>File lists</h3>
- <ul class="optionlist">
- <li><a href="option_external_link_list_url.html">external_link_list_url</a></li>
- <li><a href="option_external_image_list_url.html">external_image_list_url</a></li>
- </ul>
-
- <h3>Tab specific</h3>
- <ul class="optionlist">
- <li><a href="option_display_tab_class.html">display_tab_class</a></li>
- <li><a href="option_hidden_tab_class.html">hidden_tab_class</a></li>
- </ul>
-
- </div>
- <div class="column">
-
- <h3>Triggers/Patches</h3>
- <ul class="optionlist">
- <li><a href="option_add_form_submit_trigger.html">add_form_submit_trigger</a></li>
- <li><a href="option_add_unload_trigger.html">add_unload_trigger</a></li>
- <li><a href="option_submit_patch.html">submit_patch</a></li>
- </ul>
-
- <h3>Advanced theme</h3>
- <ul class="optionlist">
- <li><a href="option_theme_advanced_layout_manager.html">theme_advanced_layout_manager</a></li>
- <li><a href="option_theme_advanced_blockformats.html">theme_advanced_blockformats</a></li>
- <li><a href="option_theme_advanced_styles.html">theme_advanced_styles</a></li>
- <li><a href="option_theme_advanced_source_editor_width.html">theme_advanced_source_editor_width</a></li>
- <li><a href="option_theme_advanced_source_editor_height.html">theme_advanced_source_editor_height</a></li>
- <li><a href="option_theme_advanced_source_editor_wrap.html">theme_advanced_source_editor_wrap</a></li>
- <li><a href="option_theme_advanced_toolbar_location.html">theme_advanced_toolbar_location</a></li>
- <li><a href="option_theme_advanced_toolbar_align.html">theme_advanced_toolbar_align</a></li>
- <li><a href="option_theme_advanced_statusbar_location.html">theme_advanced_statusbar_location</a></li>
- <li><a href="option_theme_advanced_buttons_n.html">theme_advanced_buttons<1-n></a></li>
- <li><a href="option_theme_advanced_buttons_n_add.html">theme_advanced_buttons<1-n>_add</a></li>
- <li><a href="option_theme_advanced_buttons_n_add_before.html">theme_advanced_buttons<1-n>_add_before</a></li>
- <li><a href="option_theme_advanced_disable.html">theme_advanced_disable</a></li>
- <li><a href="option_theme_advanced_containers.html">theme_advanced_containers</a></li>
- <li><a href="option_theme_advanced_containers_default_class.html">theme_advanced_containers_default_class</a></li>
- <li><a href="option_theme_advanced_containers_default_align.html">theme_advanced_containers_default_align</a></li>
- <li><a href="option_theme_advanced_container.html">theme_advanced_container_<container></a></li>
- <li><a href="option_theme_advanced_container_class.html">theme_advanced_container_<container>_class</a></li>
- <li><a href="option_theme_advanced_container_align.html">theme_advanced_container_<container>_align</a></li>
- <li><a href="option_theme_advanced_custom_layout.html">theme_advanced_custom_layout</a></li>
- <li><a href="option_theme_advanced_link_targets.html">theme_advanced_link_targets</a></li>
- <li><a href="option_theme_advanced_resizing.html">theme_advanced_resizing</a></li>
- <li><a href="option_theme_advanced_resizing_use_cookie.html">theme_advanced_resizing_use_cookie</a></li>
- <li><a href="option_theme_advanced_resize_horizontal.html">theme_advanced_resize_horizontal</a></li>
- <li><a href="option_theme_advanced_path.html">theme_advanced_path</a></li>
- <li><a href="option_theme_advanced_fonts.html">theme_advanced_fonts</a></li>
- </ul>
- </div>
-
- <br style="clear: both" />
- </p>
- </div>
-
- <div class="separator"></div>
-
- <h2>Initialization of TinyMCE</h2>
- <div class="section">
- <p>Inorder to initialize the TinyMCE the following code must be placed within HEAD element of a document. The following example is configurated to convert all TEXTAREA elements to into editors when the page loads, there are other <a href="option_mode.html">modes</a> as well.</p>
- <h3>Example of TinyMCE configuration:</h3>
- <div class="example">
-<pre>
-<html>
-<head>
-<strong><script language="javascript" type="text/javascript" src="../jscripts/tiny_mce/tiny_mce.js"></script>
-<script language="javascript" type="text/javascript">
-tinyMCE.init({
- theme : "advanced",
- mode : "textareas"
-});
-</script></strong>
-</head>
-</pre>
- </div>
- <div class="note">
- Note: Remember to remove the last "," character in the options list.
- </div>
- </div>
-
-
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/reference_configuration.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/reference_configuration.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/reference_configuration.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/reference_configuration.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,228 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Configuration reference</title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+ <h1>Configuration reference</h1>
+</div>
+
+<div class="content">
+ <p>This document is the index/reference page for all available core configuration options in TinyMCE.</p>
+
+ <div class="separator"></div>
+
+ <h2>Configuration options</h2>
+ <div class="section">
+ <p>All configuration options below is to be placed within the init JavaScript call.<br /><br />
+
+ <div class="column">
+ <h3>General</h3>
+ <ul class="optionlist">
+ <li><a href="option_mode.html">mode</a></li>
+ <li><a href="option_theme.html">theme</a></li>
+ <li><a href="option_plugins.html">plugins</a></li>
+ <li><a href="option_language.html">language</a></li>
+ <li><a href="option_ask.html">ask</a></li>
+ <li><a href="option_textarea_trigger.html">textarea_trigger</a></li>
+ <li><a href="option_editor_selector.html">editor_selector</a></li>
+ <li><a href="option_editor_deselector.html">editor_deselector</a></li>
+ <li><a href="option_elements.html">elements</a></li>
+ <li><a href="option_docs_language.html">docs_language</a></li>
+ <li><a href="option_debug.html">debug</a></li>
+ <li><a href="option_focus_alert.html">focus_alert</a></li>
+ <li><a href="option_directionality.html">directionality</a></li>
+ <li><a href="option_auto_reset_designmode.html">auto_reset_designmode</a></li>
+ <li><a href="option_auto_focus.html">auto_focus</a></li>
+ <li><a href="option_nowrap.html">nowrap</a></li>
+ <li><a href="option_button_tile_map.html">button_tile_map</a></li>
+ <li><a href="option_auto_resize.html">auto_resize</a></li>
+ <li><a href="option_browsers.html">browsers</a></li>
+ <li><a href="option_dialog_type.html">dialog_type</a></li>
+ <li><a href="option_accessibility_warnings.html">accessibility_warnings</a></li>
+ <li><a href="option_accessibility_focus.html">accessibility_focus</a></li>
+ <li><a href="option_event_elements.html">event_elements</a></li>
+ <li><a href="option_table_inline_editing.html">table_inline_editing</a></li>
+ <li><a href="option_object_resizing.html">object_resizing</a></li>
+ <li><a href="option_custom_shortcuts.html">custom_shortcuts</a></li>
+ <li><a href="option_strict_loading_mode.html">strict_loading_mode</a></li>
+ </ul>
+
+ <h3>Cleanup/Output</h3>
+ <ul class="optionlist">
+ <li><a href="option_cleanup.html">cleanup</a></li>
+ <li><a href="option_valid_elements.html">valid_elements</a></li>
+ <li><a href="option_extended_valid_elements.html">extended_valid_elements</a></li>
+ <li><a href="option_invalid_elements.html">invalid_elements</a></li>
+ <li><a href="option_verify_css_classes.html">verify_css_classes</a></li>
+ <li><a href="option_verify_html.html">verify_html</a></li>
+ <li><a href="option_preformatted.html">preformatted</a></li>
+ <li><a href="option_encoding.html">encoding</a></li>
+ <li><a href="option_cleanup_on_startup.html">cleanup_on_startup</a></li>
+ <li><a href="option_fix_content_duplication.html">fix_content_duplication</a></li>
+ <li><a href="option_inline_styles.html">inline_styles</a></li>
+ <li><a href="option_convert_newlines_to_brs.html">convert_newlines_to_brs</a></li>
+ <li><a href="option_force_br_newlines.html">force_br_newlines</a></li>
+ <li><a href="option_force_p_newlines.html">force_p_newlines</a></li>
+ <li><a href="option_entities.html">entities</a></li>
+ <li><a href="option_entity_encoding.html">entity_encoding</a></li>
+ <li><a href="option_remove_linebreaks.html">remove_linebreaks</a></li>
+ <li><a href="option_convert_fonts_to_spans.html">convert_fonts_to_spans</a></li>
+ <li><a href="option_font_size_classes.html">font_size_classes</a></li>
+ <li><a href="option_font_size_style_values.html">font_size_style_values</a></li>
+ <li><a href="option_merge_styles_invalid_parents.html">merge_styles_invalid_parents</a></li>
+ <li><a href="option_force_hex_style_colors.html">force_hex_style_colors</a></li>
+ <li><a href="option_apply_source_formatting.html">apply_source_formatting</a></li>
+ <li><a href="option_trim_span_elements.html">trim_span_elements</a></li>
+ <li><a href="option_doctype.html">doctype</a></li>
+ <li><a href="option_fix_list_elements.html">fix_list_elements</a></li>
+ <li><a href="option_fix_table_elements.html">fix_table_elements</a></li>
+ </ul>
+
+ </div>
+ <div class="column">
+
+ <h3>URL</h3>
+ <ul class="optionlist">
+ <li><a href="option_convert_urls.html">convert_urls</a></li>
+ <li><a href="option_relative_urls.html">relative_urls</a></li>
+ <li><a href="option_remove_script_host.html">remove_script_host</a></li>
+ <li><a href="option_document_base_url.html">document_base_url</a></li>
+ </ul>
+
+ <h3>Callbacks</h3>
+ <ul class="optionlist">
+ <li><a href="option_urlconverter_callback.html">urlconverter_callback</a></li>
+ <li><a href="option_insertlink_callback.html">insertlink_callback</a></li>
+ <li><a href="option_insertimage_callback.html">insertimage_callback</a></li>
+ <li><a href="option_setupcontent_callback.html">setupcontent_callback</a></li>
+ <li><a href="option_save_callback.html">save_callback</a></li>
+ <li><a href="option_onchange_callback.html">onchange_callback</a></li>
+ <li><a href="option_init_instance_callback.html">init_instance_callback</a></li>
+ <li><a href="option_file_browser_callback.html">file_browser_callback</a></li>
+ <li><a href="option_cleanup_callback.html">cleanup_callback</a></li>
+ <li><a href="option_handle_event_callback.html">handle_event_callback</a></li>
+ <li><a href="option_execcommand_callback.html">execcommand_callback</a></li>
+ <li><a href="option_oninit.html">oninit</a></li>
+ <li><a href="option_onpageload.html">onpageload</a></li>
+ </ul>
+
+ <h3>Layout</h3>
+ <ul class="optionlist">
+ <li><a href="option_content_css.html">content_css</a></li>
+ <li><a href="option_popups_css.html">popups_css</a></li>
+ <li><a href="option_editor_css.html">editor_css</a></li>
+ <li><a href="option_width.html">width</a></li>
+ <li><a href="option_height.html">height</a></li>
+ </ul>
+
+ <h3>Visual aids</h3>
+ <ul class="optionlist">
+ <li><a href="option_visual.html">visual</a></li>
+ <li><a href="option_visual_table_class.html">visual_table_class</a></li>
+ </ul>
+
+ <h3>Undo/Redo</h3>
+ <ul class="optionlist">
+ <li><a href="option_custom_undo_redo.html">custom_undo_redo</a></li>
+ <li><a href="option_custom_undo_redo_levels.html">custom_undo_redo_levels</a></li>
+ <li><a href="option_custom_undo_redo_keyboard_shortcuts.html">custom_undo_redo_keyboard_shortcuts</a></li>
+ <li><a href="option_custom_undo_redo_restore_selection.html">custom_undo_redo_restore_selection</a></li>
+ </ul>
+
+ <h3>File lists</h3>
+ <ul class="optionlist">
+ <li><a href="option_external_link_list_url.html">external_link_list_url</a></li>
+ <li><a href="option_external_image_list_url.html">external_image_list_url</a></li>
+ </ul>
+
+ <h3>Tab specific</h3>
+ <ul class="optionlist">
+ <li><a href="option_display_tab_class.html">display_tab_class</a></li>
+ <li><a href="option_hidden_tab_class.html">hidden_tab_class</a></li>
+ </ul>
+
+ </div>
+ <div class="column">
+
+ <h3>Triggers/Patches</h3>
+ <ul class="optionlist">
+ <li><a href="option_add_form_submit_trigger.html">add_form_submit_trigger</a></li>
+ <li><a href="option_add_unload_trigger.html">add_unload_trigger</a></li>
+ <li><a href="option_submit_patch.html">submit_patch</a></li>
+ </ul>
+
+ <h3>Advanced theme</h3>
+ <ul class="optionlist">
+ <li><a href="option_theme_advanced_layout_manager.html">theme_advanced_layout_manager</a></li>
+ <li><a href="option_theme_advanced_blockformats.html">theme_advanced_blockformats</a></li>
+ <li><a href="option_theme_advanced_styles.html">theme_advanced_styles</a></li>
+ <li><a href="option_theme_advanced_source_editor_width.html">theme_advanced_source_editor_width</a></li>
+ <li><a href="option_theme_advanced_source_editor_height.html">theme_advanced_source_editor_height</a></li>
+ <li><a href="option_theme_advanced_source_editor_wrap.html">theme_advanced_source_editor_wrap</a></li>
+ <li><a href="option_theme_advanced_toolbar_location.html">theme_advanced_toolbar_location</a></li>
+ <li><a href="option_theme_advanced_toolbar_align.html">theme_advanced_toolbar_align</a></li>
+ <li><a href="option_theme_advanced_statusbar_location.html">theme_advanced_statusbar_location</a></li>
+ <li><a href="option_theme_advanced_buttons_n.html">theme_advanced_buttons<1-n></a></li>
+ <li><a href="option_theme_advanced_buttons_n_add.html">theme_advanced_buttons<1-n>_add</a></li>
+ <li><a href="option_theme_advanced_buttons_n_add_before.html">theme_advanced_buttons<1-n>_add_before</a></li>
+ <li><a href="option_theme_advanced_disable.html">theme_advanced_disable</a></li>
+ <li><a href="option_theme_advanced_containers.html">theme_advanced_containers</a></li>
+ <li><a href="option_theme_advanced_containers_default_class.html">theme_advanced_containers_default_class</a></li>
+ <li><a href="option_theme_advanced_containers_default_align.html">theme_advanced_containers_default_align</a></li>
+ <li><a href="option_theme_advanced_container.html">theme_advanced_container_<container></a></li>
+ <li><a href="option_theme_advanced_container_class.html">theme_advanced_container_<container>_class</a></li>
+ <li><a href="option_theme_advanced_container_align.html">theme_advanced_container_<container>_align</a></li>
+ <li><a href="option_theme_advanced_custom_layout.html">theme_advanced_custom_layout</a></li>
+ <li><a href="option_theme_advanced_link_targets.html">theme_advanced_link_targets</a></li>
+ <li><a href="option_theme_advanced_resizing.html">theme_advanced_resizing</a></li>
+ <li><a href="option_theme_advanced_resizing_use_cookie.html">theme_advanced_resizing_use_cookie</a></li>
+ <li><a href="option_theme_advanced_resize_horizontal.html">theme_advanced_resize_horizontal</a></li>
+ <li><a href="option_theme_advanced_path.html">theme_advanced_path</a></li>
+ <li><a href="option_theme_advanced_fonts.html">theme_advanced_fonts</a></li>
+ </ul>
+ </div>
+
+ <br style="clear: both" />
+ </p>
+ </div>
+
+ <div class="separator"></div>
+
+ <h2>Initialization of TinyMCE</h2>
+ <div class="section">
+ <p>Inorder to initialize the TinyMCE the following code must be placed within HEAD element of a document. The following example is configurated to convert all TEXTAREA elements to into editors when the page loads, there are other <a href="option_mode.html">modes</a> as well.</p>
+ <h3>Example of TinyMCE configuration:</h3>
+ <div class="example">
+<pre>
+<html>
+<head>
+<strong><script language="javascript" type="text/javascript" src="../jscripts/tiny_mce/tiny_mce.js"></script>
+<script language="javascript" type="text/javascript">
+tinyMCE.init({
+ theme : "advanced",
+ mode : "textareas"
+});
+</script></strong>
+</head>
+</pre>
+ </div>
+ <div class="note">
+ Note: Remember to remove the last "," character in the options list.
+ </div>
+ </div>
+
+
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/reference_javascript_functions.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/reference_javascript_functions.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/reference_javascript_functions.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,597 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Javascript Functions</title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
- <h1>Javascript Functions</h1>
-</div>
-
-<div class="content">
-<p>This is for advanced users, TinyMCE has a global instance with some public functions that can be called from the page.</p>
-<h3>tinyMCE.triggerSave([skip_cleanup], [skip_callback]);</h3>
-<p>
-Makes a cleanup and moves the contents from the editor to the form field. This method is automaticly called by tinyMCE by adding a trigger on the forms submit method.
-</p>
-<p>
-<table border="1" cellspacing="0" cellpadding="4">
-<thead>
-<tr>
- <td colspan="2">Parameters</td>
-</tr>
-</thead>
-<tbody>
-<tr>
- <td>[skip_cleanup]</td>
- <td>Disables the cleanup process of trigger save. Defaults to false. (Optional)</td>
-</tr>
-<tr>
- <td>[skip_callback]</td>
- <td>Disables the execution of the <a href="option_save_callback.html">save_callback</a> function. Defaults to false. (Optional)</td>
-</tr>
-</tbody>
-</table>
-
-skip_callback
-</p>
-<p>
-Returns: Nothing
-</p>
-<div class="separator"></div>
-<h3>tinyMCE.updateContent(form_element_name);</h3>
-<p>
-Moves the contents from the form element to the editor, this does the opposite of triggerSave(). This method can be used when you want to change the contents of the editor dynamicly.
-</p>
-<p>
-<table border="1" cellspacing="0" cellpadding="4">
-<thead>
-<tr>
- <td colspan="2">Parameters</td>
-</tr>
-</thead>
-<tbody>
-<tr>
- <td>form_element_name</td>
- <td>The name of the form element to get contents from.</td>
-</tr>
-</tbody>
-</table>
-</p>
-<p>
-Returns: Nothing
-</p>
-<div class="separator"></div>
-<h3>tinyMCE.execInstanceCommand(editor_id, command, [user_interface], [value]);</h3>
-<p>
-This method executes a command by name on the editor instance specified by the editor_id parameter.
-</p>
-<p>
-<table border="1" cellspacing="0" cellpadding="4">
-<thead>
-<tr>
- <td colspan="2">Parameters</td>
-</tr>
-</thead>
-<tbody>
-<tr>
- <td>editor_id</td>
- <td>ID of editor instance or element id/name of the replaced element.</td>
-</tr>
-<tr>
- <td>command</td>
- <td>Command to execute check the execCommand function for details.</td>
-</tr>
-<tr>
- <td>[user_interface]</td>
- <td>Is a user interface to be used or not.</td>
-</tr>
-<tr>
- <td>[value]</td>
- <td>Value to pass with command for example a URL..</td>
-</tr>
-</tbody>
-</table>
-</p>
-<p>
-Returns: Nothing
-</p>
-<div class="separator"></div>
-<h3>tinyMCE.execCommand(command, [user_interface], [value]);</h3>
-<p>
-This method executes a command by name on the selected editor instance.
-</p>
-<p>
-<table border="1" cellspacing="0" cellpadding="4">
-<thead>
-<tr>
- <td colspan="2">Parameters</td>
-</tr>
-</thead>
-<tbody>
-<tr>
- <td>command</td>
- <td>Command to execute for example "Bold" or "Italic". These are defined by Mozilla <a href="http://www.mozilla.org/editor/midas-spec.html">Midas specification</a> or <a href="http://msdn.microsoft.com/workshop/author/dhtml/reference/commandids.asp">Microsoft specification</a>. But there are a some TinyMCE specific commands many other commands are available within plugins and themes.<br /><br />
- <table border="0" cellspacing="0" cellpadding="2">
- <tr>
- <td>mceLink</td>
- <td>Opens the insert link dialog and inserts a link.</td>
- </tr>
- <tr>
- <td>mceImage</td>
- <td>Opens the insert image dialog and inserts a image.</td>
- </tr>
- <tr>
- <td>mceCleanup</td>
- <td>Removed unwanted elements and attributes from the HTML code.</td>
- </tr>
- <tr>
- <td>mceHelp</td>
- <td>Opens the manual pages.</td>
- </tr>
- <tr>
- <td>mceAddControl</td>
- <td>Adds a editor control to the element id/name specified as value.</td>
- </tr>
- <tr>
- <td>mceRemoveControl</td>
- <td>Removes a specific control by editor_id name. The value is the editor_id to remove, editor ids are in the following format: "mce_editor_<index>". DOM element ids and form element names can allso be used.</td>
- </tr>
- <tr>
- <td>mceFocus</td>
- <td>Focuses the editor by the id placed in value. Editor id's are in the format "mce_editor_<index>". DOM element ids and form element names can allso be used.</td>
- </tr>
- <tr>
- <td>mceSetCSSClass</td>
- <td>Sets the CSS class attribute or creates a new span of the selection. The value is the css class name to assign to selected element or new span element.</td>
- </tr>
- <tr>
- <td>mceInsertContent</td>
- <td>Inserts contents of value parameter to current cursor position.</td>
- </tr>
- <tr>
- <td>mceReplaceContent</td>
- <td>Replaces the current selection with the HTML code in value. The {$selection} variable gets replaced with the currently selected text contents.</td>
- </tr>
- <tr>
- <td>mceSetAttribute</td>
- <td>Sets a attribute of the currenly selected element. The value of this command should be a name/value array with the following parameters.<br /><br />
- name - Attribute name to set.<br />
- value - Attrbute value to set.<br />
- [targets] - Target elements to add attribute on. Default: p,img,span,div,td,h1,h2,h3,h4,h5,h6,pre,address.<br /><br />
- Example of usage:<br />
- tinyMCE.execCommand('mceSetAttribute',false,{name:'align',value:'right'});<br />
- </td>
- </tr>
- <tr>
- <td>mceToggleVisualAid</td>
- <td>Toggles visual aid/guidelines mode on/off.</td>
- </tr>
- <tr>
- <td>mceAnchor</td>
- <td>Inserts a named anchor element, the value is the name of the anchor.</td>
- </tr>
- <tr>
- <td>mceResetDesignMode</td>
- <td>Resets the designMode state of all editor instances, this command is useful on Firefox if the editor is placed in tabs or shown/hidden with style.display="none/block". Call this command after the editor displayed again.</td>
- </tr>
- <tr>
- <td>mceSelectNode</td>
- <td>Selects the node/element passed as value. This command will also scroll to the elements location within the editor.</td>
- </tr>
- <tr>
- <td>mceSelectNodeDepth</td>
- <td>Selects the node/element by depth relative from the current node. So a value of 0 will select the currently focused node. This command will also scroll to the elements location within the editor.</td>
- </tr>
- <tr>
- <td>mceRemoveNode</td>
- <td>Removes the specified node and places the contents of the node in the same location. Specify the node reference to remove in the value parameter or null if the currently selected node is to be removed.</td>
- </tr>
- <tr>
- <td></td>
- <td></td>
- </tr>
- </tbody>
-</table>
- </td>
-</tr>
-<tr>
- <td>[user_interface]</td>
- <td>Tells if the command is to display a user interface or not. True/False option.</td>
-</tr>
-<tr>
- <td>[value]</td>
- <td>Value to pass for the command for example to insertLink it's the URL of the link.</td>
-</tr>
-</tbody>
-</table>
-
-</p>
-<p>
-Returns: Nothing
-</p>
-<p>
-Example:
-</p>
-<p>
-<div class="example">
-<pre>
-<a href="javascript:tinymce.execCommand('Bold');">[Do bold]</a>
-</pre>
-</div>
-</p>
-<div class="separator"></div>
-<h3><span class="marked">(Deprecated)</span> tinyMCE.insertLink(href, target);</h3>
-<p>This method is deprecated and removed as of 2.0.3. Use tinyMCE.execCommand('mceInsertContent',false,'custom html'); instead and tinyMCE.getInstanceById('<inst>').selection.getFocusElement() to retrive/update the selected element.</p>
-<p>But if you realy need the old function it's marked internal but is available in the advanced theme and you can call it by using tinyMCE.themes['advanced']._insertLink(href, target);. But the recommended way is to modify your code to use the logic above.</p>
-<p>This method inserts a link a the cursor position of the selected editor instance or updates the selected link with new data. This method should be called upon "ok" in the insertLink popup when you create custom themes.
-</p>
-<table border="1" cellspacing="0" cellpadding="4">
-<thead>
-<tr>
- <td colspan="2">Parameters</td>
-</tr>
-</thead>
-<tbody>
-<tr>
- <td>href</td>
- <td>HREF/URL of the link.</td>
-</tr>
-<tr>
- <td>target</td>
- <td>Target of the link.</td>
-</tr>
-</tbody>
-</table>
-<p>
-Returns: Nothing
-</p>
-<div class="separator"></div>
-<h3><span class="marked">(Deprecated)</span> tinyMCE.insertImage(src, alt, border, hspace, vspace, width, height, align, title, onmouseover, onmouseout);</h4>
-<p>This method is deprecated and removed as of 2.0.3. Use tinyMCE.execCommand('mceInsertContent',false,'custom html'); instead or if you realy need the old function it's marked internal but is available in the advanced theme and you can call it by using tinyMCE.themes['advanced']._insertImage(src, alt, border, hspace, vspace, width, height, align, title, onmouseover, onmouseout);. But the recommended way is to modify your code to use the logic above.</p>
-<p>
-This method inserts a image a the cursor position of the selected editor instance or updates the selected image with new data. This method should be called upon "ok" in the insertImage popup when you create custom themes.
-</p>
-<table border="1" cellspacing="0" cellpadding="4">
-<thead>
-<tr>
- <td colspan="2">Parameters</td>
-</tr>
-</thead>
-<tbody>
-<tr>
- <td>src</td>
- <td>Image src url.</td>
-</tr>
-<tr>
- <td>alt</td>
- <td>Alternative text of img element.</td>
-</tr>
-<tr>
- <td>border</td>
- <td>Border of image element.</td>
-</tr>
-<tr>
- <td>hspace</td>
- <td>Horizontal spacing of image element.</td>
-</tr>
-<tr>
- <td>vspace</td>
- <td>Vertical spacing of image element.</td>
-</tr>
-<tr>
- <td>width</td>
- <td>Width of image element.</td>
-</tr>
-<tr>
- <td>height</td>
- <td>Height of image element.</td>
-</tr>
-<tr>
- <td>align</td>
- <td>Alignment of image element.</td>
-</tr>
-<tr>
- <td>title</td>
- <td>Link title of image element.</td>
-</tr>
-<tr>
- <td>onmouseover</td>
- <td>On mouse over event handler of image element.</td>
-</tr>
-<tr>
- <td>onmouseout</td>
- <td>On mouse out event handler of image element.</td>
-</tr>
-</tbody>
-</table>
-<p>
-Returns: Nothing
-</p>
-<div class="separator"></div>
-<h3>tinyMCE.triggerNodeChange();</h3>
-<p>This method is to be called when external changes is made to the editor. This method will then call the "handleNodeChangeCallback" callback in the theme.
-</p>
-<p>
-Parameters:
-</p>
-<p>
-None
-</p>
-<p>
-Returns: Nothing
-</p>
-<div class="separator"></div>
-<h3>tinyMCE.getContent();</h3>
-<p>
-This method returns the HTML contents of the currently selected editor or null if no editor was selected.
-</p>
-<p>
-Parameters:
-</p>
-<p>
-None
-</p>
-<p>
-Returns: HTML contents of the currently selected editor or null.
-</p>
-<div class="separator"></div>
-<h3>Syntax: tinyMCE.setContent(html);</h3>
-
-<p>This method sets the HTML contents of the currently selected editor.</p>
-
-<p>
-<table border="1" cellspacing="0" cellpadding="4">
-<thead>
-<tr>
- <td colspan="2">Parameters</td>
-</tr>
-</thead>
-<tbody>
-<tr>
- <td>html</td>
- <td>HTML Source code to set.</td>
-</tr>
-</tbody>
-</table>
-</p>
-<p>
-Returns: None.
-</p>
-<div class="separator"></div>
-<h3>tinyMCE.getInstanceById(editor_id);</h3>
-<p>
-This method returns a editor instance by editor id.
-</p>
-<p>
-<table border="1" cellspacing="0" cellpadding="4">
-<thead>
-<tr>
- <td colspan="2">Parameters</td>
-</tr>
-</thead>
-<tbody>
-<tr>
- <td>editor_id</td>
- <td>Editor instance to retrive.</td>
-</tr>
-</tbody>
-</table>
-</p>
-<p>
-Returns: TinyMCE Editor instance (TinyMCE_Control).
-</p>
-<div class="separator"></div>
-<h3>tinyMCE.importThemeLanguagePack([theme]);</h3>
-<p>
-This method imports/loads theme specific language packs. This may be called from custom themes.
-</p>
-<p>
-<table border="1" cellspacing="0" cellpadding="4">
-<thead>
-<tr>
- <td colspan="2">Parameters</td>
-</tr>
-</thead>
-<tbody>
-<tr>
- <td>[theme]</td>
- <td>Name of the current theme. This is a optional parameter it defaults to the global "theme" setting. This parameter is useful within theme plugins.</td>
-</tr>
-</tbody>
-</table>
-</p>
-<p>
-Returns: None.
-</p>
-<div class="separator"></div>
-<h3>tinyMCE.importPluginLanguagePack(plugin, valid_languages);</h3>
-<p>
-This method imports/loads plugin specific language packs. This may be called from custom plugins.
-</p>
-<p>
-<table border="1" cellspacing="0" cellpadding="4">
-<thead>
-<tr>
- <td colspan="2">Parameters</td>
-</tr>
-</thead>
-<tbody>
-<tr>
- <td>plugin</td>
- <td>Name of the current plugin.</td>
-</tr>
-<tr>
- <td>valid_languages</td>
- <td>Comma separated list of supported languagepacks.</td>
-</tr>
-</tbody>
-</table>
-</p>
-<p>
-Returns: None.
-</p>
-<div class="separator"></div>
-<h3>tinyMCE.applyTemplate(html);</h3>
-<p>
-This method replaces settings and lang variables in the theme.
-</p>
-<p>
-<table border="1" cellspacing="0" cellpadding="4">
-<thead>
-<tr>
- <td colspan="2">Parameters</td>
-</tr>
-</thead>
-<tbody>
-<tr>
- <td>html</td>
- <td>HTML code to apply theme variable substitution on.</td>
-</tr>
-</tbody>
-</table>
-</p>
-<p>
-Returns: New converted, HTML code.
-</p>
-<div class="separator"></div>
-<h3>tinyMCE.openWindow(template, [args]);</h3>
-<p>This method opens a new window by the template data assigned, it will get the width, height and html data from template parameters. The args array contains variable names to be substituted.</p>
-<p>
-There are some custom window arguments:
-</p>
-<p>
-<table border="1" cellspacing="0" cellpadding="4">
-<thead>
-<tr>
- <td colspan="2">Parameters</td>
-</tr>
-</thead>
-<tbody>
-<tr>
- <td>mce_replacevariables</td>
- <td>Enables/Disables the language/variable replacement of the document HTML. Enabled by default.</td>
-</tr>
-<tr>
- <td>mce_windowresize</td>
- <td>Enables/Disables the auto resize feature of popupwindows. Enabled by default.</td>
-</tr>
-</tbody>
-</table>
-</p>
-
-<p>
-<table border="1" cellspacing="0" cellpadding="4">
-<thead>
-<tr>
- <td colspan="2">Parameters</td>
-</tr>
-</thead>
-<tbody>
-<tr>
- <td>template</td>
- <td>Name/Value array with width, height, html and file keys in it.</td>
-</tr>
-<tr>
- <td>[args]</td>
- <td>Name/Value array with variable names to replace. Variables in the template file key value (URL) gets replaced with the argument list.</td>
-</tr>
-</tbody>
-</table>
-</p>
-<p>
-Returns: None.
-</p>
-<div class="separator"></div>
-<h3>tinyMCE.getWindowArg(name, [default_value]);</h3>
-<p>
-This method returns a window argument defined by name. This function is to be used in theme popup windows to retrive dialog parameters.
-</p>
-<p>
-<table border="1" cellspacing="0" cellpadding="4">
-<thead>
-<tr>
- <td colspan="2">Parameters</td>
-</tr>
-</thead>
-<tbody>
-<tr>
- <td>name</td>
- <td>Name of window argument to get.</td>
-</tr>
-<tr>
- <td>[default_value]</td>
- <td>Default value to be returned if window argument is missing.</td>
-</tr>
-</tbody>
-</table>
-</p>
-<p>
-Returns: Window argument value.
-</p>
-<div class="separator"></div>
-<h3>tinyMCE.setWindowArg(name, value);</h3>
-<p>This method sets a window argument by name. This can for example be useful if plugin are to call other plugins.</p>
-<p>
-<table border="1" cellspacing="0" cellpadding="4">
-<thead>
-<tr>
- <td colspan="2">Parameters</td>
-</tr>
-</thead>
-<tbody>
-<tr>
- <td>name</td>
- <td>Name of window argument to set.</td>
-</tr>
-<tr>
- <td>value</td>
- <td>Value to set in window argument.</td>
-</tr>
-</tbody>
-</table>
-</p>
-<p>
-Returns: Window argument value.
-</p>
-<div class="separator"></div>
-<h3>tinyMCE.getParam(name, [default_value], [strip_whitespace]);</h3>
-<p>This method returns a TinyMCE configuration parameter.</p>
-<p>
-<table border="1" cellspacing="0" cellpadding="4">
-<thead>
-<tr>
- <td colspan="2">Parameters:</td>
-</tr>
-</thead>
-<tbody>
-<tr>
- <td>name</td>
- <td>Name of window argument to get.</td>
-</tr>
-<tr>
- <td>[default_value]</td>
- <td>Default value to be returned if window argument is missing.</td>
-</tr>
-<tr>
- <td>[strip_whitespace]</td>
- <td>If true all whitespace will be removed from return value, default: false.</td>
-</tr>
-</tbody>
-</table>
-</p>
-<p>
-Returns: TinyMCE configuration parameter.
-</p>
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/reference_javascript_functions.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/reference_javascript_functions.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/reference_javascript_functions.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/reference_javascript_functions.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,597 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Javascript Functions</title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+ <h1>Javascript Functions</h1>
+</div>
+
+<div class="content">
+<p>This is for advanced users, TinyMCE has a global instance with some public functions that can be called from the page.</p>
+<h3>tinyMCE.triggerSave([skip_cleanup], [skip_callback]);</h3>
+<p>
+Makes a cleanup and moves the contents from the editor to the form field. This method is automaticly called by tinyMCE by adding a trigger on the forms submit method.
+</p>
+<p>
+<table border="1" cellspacing="0" cellpadding="4">
+<thead>
+<tr>
+ <td colspan="2">Parameters</td>
+</tr>
+</thead>
+<tbody>
+<tr>
+ <td>[skip_cleanup]</td>
+ <td>Disables the cleanup process of trigger save. Defaults to false. (Optional)</td>
+</tr>
+<tr>
+ <td>[skip_callback]</td>
+ <td>Disables the execution of the <a href="option_save_callback.html">save_callback</a> function. Defaults to false. (Optional)</td>
+</tr>
+</tbody>
+</table>
+
+skip_callback
+</p>
+<p>
+Returns: Nothing
+</p>
+<div class="separator"></div>
+<h3>tinyMCE.updateContent(form_element_name);</h3>
+<p>
+Moves the contents from the form element to the editor, this does the opposite of triggerSave(). This method can be used when you want to change the contents of the editor dynamicly.
+</p>
+<p>
+<table border="1" cellspacing="0" cellpadding="4">
+<thead>
+<tr>
+ <td colspan="2">Parameters</td>
+</tr>
+</thead>
+<tbody>
+<tr>
+ <td>form_element_name</td>
+ <td>The name of the form element to get contents from.</td>
+</tr>
+</tbody>
+</table>
+</p>
+<p>
+Returns: Nothing
+</p>
+<div class="separator"></div>
+<h3>tinyMCE.execInstanceCommand(editor_id, command, [user_interface], [value]);</h3>
+<p>
+This method executes a command by name on the editor instance specified by the editor_id parameter.
+</p>
+<p>
+<table border="1" cellspacing="0" cellpadding="4">
+<thead>
+<tr>
+ <td colspan="2">Parameters</td>
+</tr>
+</thead>
+<tbody>
+<tr>
+ <td>editor_id</td>
+ <td>ID of editor instance or element id/name of the replaced element.</td>
+</tr>
+<tr>
+ <td>command</td>
+ <td>Command to execute check the execCommand function for details.</td>
+</tr>
+<tr>
+ <td>[user_interface]</td>
+ <td>Is a user interface to be used or not.</td>
+</tr>
+<tr>
+ <td>[value]</td>
+ <td>Value to pass with command for example a URL..</td>
+</tr>
+</tbody>
+</table>
+</p>
+<p>
+Returns: Nothing
+</p>
+<div class="separator"></div>
+<h3>tinyMCE.execCommand(command, [user_interface], [value]);</h3>
+<p>
+This method executes a command by name on the selected editor instance.
+</p>
+<p>
+<table border="1" cellspacing="0" cellpadding="4">
+<thead>
+<tr>
+ <td colspan="2">Parameters</td>
+</tr>
+</thead>
+<tbody>
+<tr>
+ <td>command</td>
+ <td>Command to execute for example "Bold" or "Italic". These are defined by Mozilla <a href="http://www.mozilla.org/editor/midas-spec.html">Midas specification</a> or <a href="http://msdn.microsoft.com/workshop/author/dhtml/reference/commandids.asp">Microsoft specification</a>. But there are a some TinyMCE specific commands many other commands are available within plugins and themes.<br /><br />
+ <table border="0" cellspacing="0" cellpadding="2">
+ <tr>
+ <td>mceLink</td>
+ <td>Opens the insert link dialog and inserts a link.</td>
+ </tr>
+ <tr>
+ <td>mceImage</td>
+ <td>Opens the insert image dialog and inserts a image.</td>
+ </tr>
+ <tr>
+ <td>mceCleanup</td>
+ <td>Removed unwanted elements and attributes from the HTML code.</td>
+ </tr>
+ <tr>
+ <td>mceHelp</td>
+ <td>Opens the manual pages.</td>
+ </tr>
+ <tr>
+ <td>mceAddControl</td>
+ <td>Adds a editor control to the element id/name specified as value.</td>
+ </tr>
+ <tr>
+ <td>mceRemoveControl</td>
+ <td>Removes a specific control by editor_id name. The value is the editor_id to remove, editor ids are in the following format: "mce_editor_<index>". DOM element ids and form element names can allso be used.</td>
+ </tr>
+ <tr>
+ <td>mceFocus</td>
+ <td>Focuses the editor by the id placed in value. Editor id's are in the format "mce_editor_<index>". DOM element ids and form element names can allso be used.</td>
+ </tr>
+ <tr>
+ <td>mceSetCSSClass</td>
+ <td>Sets the CSS class attribute or creates a new span of the selection. The value is the css class name to assign to selected element or new span element.</td>
+ </tr>
+ <tr>
+ <td>mceInsertContent</td>
+ <td>Inserts contents of value parameter to current cursor position.</td>
+ </tr>
+ <tr>
+ <td>mceReplaceContent</td>
+ <td>Replaces the current selection with the HTML code in value. The {$selection} variable gets replaced with the currently selected text contents.</td>
+ </tr>
+ <tr>
+ <td>mceSetAttribute</td>
+ <td>Sets a attribute of the currenly selected element. The value of this command should be a name/value array with the following parameters.<br /><br />
+ name - Attribute name to set.<br />
+ value - Attrbute value to set.<br />
+ [targets] - Target elements to add attribute on. Default: p,img,span,div,td,h1,h2,h3,h4,h5,h6,pre,address.<br /><br />
+ Example of usage:<br />
+ tinyMCE.execCommand('mceSetAttribute',false,{name:'align',value:'right'});<br />
+ </td>
+ </tr>
+ <tr>
+ <td>mceToggleVisualAid</td>
+ <td>Toggles visual aid/guidelines mode on/off.</td>
+ </tr>
+ <tr>
+ <td>mceAnchor</td>
+ <td>Inserts a named anchor element, the value is the name of the anchor.</td>
+ </tr>
+ <tr>
+ <td>mceResetDesignMode</td>
+ <td>Resets the designMode state of all editor instances, this command is useful on Firefox if the editor is placed in tabs or shown/hidden with style.display="none/block". Call this command after the editor displayed again.</td>
+ </tr>
+ <tr>
+ <td>mceSelectNode</td>
+ <td>Selects the node/element passed as value. This command will also scroll to the elements location within the editor.</td>
+ </tr>
+ <tr>
+ <td>mceSelectNodeDepth</td>
+ <td>Selects the node/element by depth relative from the current node. So a value of 0 will select the currently focused node. This command will also scroll to the elements location within the editor.</td>
+ </tr>
+ <tr>
+ <td>mceRemoveNode</td>
+ <td>Removes the specified node and places the contents of the node in the same location. Specify the node reference to remove in the value parameter or null if the currently selected node is to be removed.</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ </tr>
+ </tbody>
+</table>
+ </td>
+</tr>
+<tr>
+ <td>[user_interface]</td>
+ <td>Tells if the command is to display a user interface or not. True/False option.</td>
+</tr>
+<tr>
+ <td>[value]</td>
+ <td>Value to pass for the command for example to insertLink it's the URL of the link.</td>
+</tr>
+</tbody>
+</table>
+
+</p>
+<p>
+Returns: Nothing
+</p>
+<p>
+Example:
+</p>
+<p>
+<div class="example">
+<pre>
+<a href="javascript:tinymce.execCommand('Bold');">[Do bold]</a>
+</pre>
+</div>
+</p>
+<div class="separator"></div>
+<h3><span class="marked">(Deprecated)</span> tinyMCE.insertLink(href, target);</h3>
+<p>This method is deprecated and removed as of 2.0.3. Use tinyMCE.execCommand('mceInsertContent',false,'custom html'); instead and tinyMCE.getInstanceById('<inst>').selection.getFocusElement() to retrive/update the selected element.</p>
+<p>But if you realy need the old function it's marked internal but is available in the advanced theme and you can call it by using tinyMCE.themes['advanced']._insertLink(href, target);. But the recommended way is to modify your code to use the logic above.</p>
+<p>This method inserts a link a the cursor position of the selected editor instance or updates the selected link with new data. This method should be called upon "ok" in the insertLink popup when you create custom themes.
+</p>
+<table border="1" cellspacing="0" cellpadding="4">
+<thead>
+<tr>
+ <td colspan="2">Parameters</td>
+</tr>
+</thead>
+<tbody>
+<tr>
+ <td>href</td>
+ <td>HREF/URL of the link.</td>
+</tr>
+<tr>
+ <td>target</td>
+ <td>Target of the link.</td>
+</tr>
+</tbody>
+</table>
+<p>
+Returns: Nothing
+</p>
+<div class="separator"></div>
+<h3><span class="marked">(Deprecated)</span> tinyMCE.insertImage(src, alt, border, hspace, vspace, width, height, align, title, onmouseover, onmouseout);</h4>
+<p>This method is deprecated and removed as of 2.0.3. Use tinyMCE.execCommand('mceInsertContent',false,'custom html'); instead or if you realy need the old function it's marked internal but is available in the advanced theme and you can call it by using tinyMCE.themes['advanced']._insertImage(src, alt, border, hspace, vspace, width, height, align, title, onmouseover, onmouseout);. But the recommended way is to modify your code to use the logic above.</p>
+<p>
+This method inserts a image a the cursor position of the selected editor instance or updates the selected image with new data. This method should be called upon "ok" in the insertImage popup when you create custom themes.
+</p>
+<table border="1" cellspacing="0" cellpadding="4">
+<thead>
+<tr>
+ <td colspan="2">Parameters</td>
+</tr>
+</thead>
+<tbody>
+<tr>
+ <td>src</td>
+ <td>Image src url.</td>
+</tr>
+<tr>
+ <td>alt</td>
+ <td>Alternative text of img element.</td>
+</tr>
+<tr>
+ <td>border</td>
+ <td>Border of image element.</td>
+</tr>
+<tr>
+ <td>hspace</td>
+ <td>Horizontal spacing of image element.</td>
+</tr>
+<tr>
+ <td>vspace</td>
+ <td>Vertical spacing of image element.</td>
+</tr>
+<tr>
+ <td>width</td>
+ <td>Width of image element.</td>
+</tr>
+<tr>
+ <td>height</td>
+ <td>Height of image element.</td>
+</tr>
+<tr>
+ <td>align</td>
+ <td>Alignment of image element.</td>
+</tr>
+<tr>
+ <td>title</td>
+ <td>Link title of image element.</td>
+</tr>
+<tr>
+ <td>onmouseover</td>
+ <td>On mouse over event handler of image element.</td>
+</tr>
+<tr>
+ <td>onmouseout</td>
+ <td>On mouse out event handler of image element.</td>
+</tr>
+</tbody>
+</table>
+<p>
+Returns: Nothing
+</p>
+<div class="separator"></div>
+<h3>tinyMCE.triggerNodeChange();</h3>
+<p>This method is to be called when external changes is made to the editor. This method will then call the "handleNodeChangeCallback" callback in the theme.
+</p>
+<p>
+Parameters:
+</p>
+<p>
+None
+</p>
+<p>
+Returns: Nothing
+</p>
+<div class="separator"></div>
+<h3>tinyMCE.getContent();</h3>
+<p>
+This method returns the HTML contents of the currently selected editor or null if no editor was selected.
+</p>
+<p>
+Parameters:
+</p>
+<p>
+None
+</p>
+<p>
+Returns: HTML contents of the currently selected editor or null.
+</p>
+<div class="separator"></div>
+<h3>Syntax: tinyMCE.setContent(html);</h3>
+
+<p>This method sets the HTML contents of the currently selected editor.</p>
+
+<p>
+<table border="1" cellspacing="0" cellpadding="4">
+<thead>
+<tr>
+ <td colspan="2">Parameters</td>
+</tr>
+</thead>
+<tbody>
+<tr>
+ <td>html</td>
+ <td>HTML Source code to set.</td>
+</tr>
+</tbody>
+</table>
+</p>
+<p>
+Returns: None.
+</p>
+<div class="separator"></div>
+<h3>tinyMCE.getInstanceById(editor_id);</h3>
+<p>
+This method returns a editor instance by editor id.
+</p>
+<p>
+<table border="1" cellspacing="0" cellpadding="4">
+<thead>
+<tr>
+ <td colspan="2">Parameters</td>
+</tr>
+</thead>
+<tbody>
+<tr>
+ <td>editor_id</td>
+ <td>Editor instance to retrive.</td>
+</tr>
+</tbody>
+</table>
+</p>
+<p>
+Returns: TinyMCE Editor instance (TinyMCE_Control).
+</p>
+<div class="separator"></div>
+<h3>tinyMCE.importThemeLanguagePack([theme]);</h3>
+<p>
+This method imports/loads theme specific language packs. This may be called from custom themes.
+</p>
+<p>
+<table border="1" cellspacing="0" cellpadding="4">
+<thead>
+<tr>
+ <td colspan="2">Parameters</td>
+</tr>
+</thead>
+<tbody>
+<tr>
+ <td>[theme]</td>
+ <td>Name of the current theme. This is a optional parameter it defaults to the global "theme" setting. This parameter is useful within theme plugins.</td>
+</tr>
+</tbody>
+</table>
+</p>
+<p>
+Returns: None.
+</p>
+<div class="separator"></div>
+<h3>tinyMCE.importPluginLanguagePack(plugin, valid_languages);</h3>
+<p>
+This method imports/loads plugin specific language packs. This may be called from custom plugins.
+</p>
+<p>
+<table border="1" cellspacing="0" cellpadding="4">
+<thead>
+<tr>
+ <td colspan="2">Parameters</td>
+</tr>
+</thead>
+<tbody>
+<tr>
+ <td>plugin</td>
+ <td>Name of the current plugin.</td>
+</tr>
+<tr>
+ <td>valid_languages</td>
+ <td>Comma separated list of supported languagepacks.</td>
+</tr>
+</tbody>
+</table>
+</p>
+<p>
+Returns: None.
+</p>
+<div class="separator"></div>
+<h3>tinyMCE.applyTemplate(html);</h3>
+<p>
+This method replaces settings and lang variables in the theme.
+</p>
+<p>
+<table border="1" cellspacing="0" cellpadding="4">
+<thead>
+<tr>
+ <td colspan="2">Parameters</td>
+</tr>
+</thead>
+<tbody>
+<tr>
+ <td>html</td>
+ <td>HTML code to apply theme variable substitution on.</td>
+</tr>
+</tbody>
+</table>
+</p>
+<p>
+Returns: New converted, HTML code.
+</p>
+<div class="separator"></div>
+<h3>tinyMCE.openWindow(template, [args]);</h3>
+<p>This method opens a new window by the template data assigned, it will get the width, height and html data from template parameters. The args array contains variable names to be substituted.</p>
+<p>
+There are some custom window arguments:
+</p>
+<p>
+<table border="1" cellspacing="0" cellpadding="4">
+<thead>
+<tr>
+ <td colspan="2">Parameters</td>
+</tr>
+</thead>
+<tbody>
+<tr>
+ <td>mce_replacevariables</td>
+ <td>Enables/Disables the language/variable replacement of the document HTML. Enabled by default.</td>
+</tr>
+<tr>
+ <td>mce_windowresize</td>
+ <td>Enables/Disables the auto resize feature of popupwindows. Enabled by default.</td>
+</tr>
+</tbody>
+</table>
+</p>
+
+<p>
+<table border="1" cellspacing="0" cellpadding="4">
+<thead>
+<tr>
+ <td colspan="2">Parameters</td>
+</tr>
+</thead>
+<tbody>
+<tr>
+ <td>template</td>
+ <td>Name/Value array with width, height, html and file keys in it.</td>
+</tr>
+<tr>
+ <td>[args]</td>
+ <td>Name/Value array with variable names to replace. Variables in the template file key value (URL) gets replaced with the argument list.</td>
+</tr>
+</tbody>
+</table>
+</p>
+<p>
+Returns: None.
+</p>
+<div class="separator"></div>
+<h3>tinyMCE.getWindowArg(name, [default_value]);</h3>
+<p>
+This method returns a window argument defined by name. This function is to be used in theme popup windows to retrive dialog parameters.
+</p>
+<p>
+<table border="1" cellspacing="0" cellpadding="4">
+<thead>
+<tr>
+ <td colspan="2">Parameters</td>
+</tr>
+</thead>
+<tbody>
+<tr>
+ <td>name</td>
+ <td>Name of window argument to get.</td>
+</tr>
+<tr>
+ <td>[default_value]</td>
+ <td>Default value to be returned if window argument is missing.</td>
+</tr>
+</tbody>
+</table>
+</p>
+<p>
+Returns: Window argument value.
+</p>
+<div class="separator"></div>
+<h3>tinyMCE.setWindowArg(name, value);</h3>
+<p>This method sets a window argument by name. This can for example be useful if plugin are to call other plugins.</p>
+<p>
+<table border="1" cellspacing="0" cellpadding="4">
+<thead>
+<tr>
+ <td colspan="2">Parameters</td>
+</tr>
+</thead>
+<tbody>
+<tr>
+ <td>name</td>
+ <td>Name of window argument to set.</td>
+</tr>
+<tr>
+ <td>value</td>
+ <td>Value to set in window argument.</td>
+</tr>
+</tbody>
+</table>
+</p>
+<p>
+Returns: Window argument value.
+</p>
+<div class="separator"></div>
+<h3>tinyMCE.getParam(name, [default_value], [strip_whitespace]);</h3>
+<p>This method returns a TinyMCE configuration parameter.</p>
+<p>
+<table border="1" cellspacing="0" cellpadding="4">
+<thead>
+<tr>
+ <td colspan="2">Parameters:</td>
+</tr>
+</thead>
+<tbody>
+<tr>
+ <td>name</td>
+ <td>Name of window argument to get.</td>
+</tr>
+<tr>
+ <td>[default_value]</td>
+ <td>Default value to be returned if window argument is missing.</td>
+</tr>
+<tr>
+ <td>[strip_whitespace]</td>
+ <td>If true all whitespace will be removed from return value, default: false.</td>
+</tr>
+</tbody>
+</table>
+</p>
+<p>
+Returns: TinyMCE configuration parameter.
+</p>
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/reference_plugins.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/reference_plugins.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/reference_plugins.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,78 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Plugins Reference</title>
-<link href="css/screen.css" rel="stylesheet" type="text/css" />
-</head>
-<body>
-
-<div class="header">
- <h1>Plugins reference</h1>
-</div>
-
-<div class="content">
- <p>Here are some information about the different plugins.</p>
-
- <div class="separator"></div>
-
- <h2>Plugins</h2>
- <div class="section">
- <p>To use a plugin, you need to use the advanced theme and add the plugin name in the "<a href="option_plugin.html">plugin</a>" comma seperated line. You also need to add the button to the interface, read more about the advanced plugin to configure this.</p>
- <p>
- <div class="column">
- <ul class="optionlist">
- <li><a href="plugin_advhr.html">advhr</a></li>
- <li><a href="plugin_advimage.html">advimage</a></li>
- <li><a href="plugin_advlink.html">advlink</a></li>
- <li><a href="plugin_contextmenu.html">contextmenu</a></li>
- <li><a href="plugin_emotions.html">emotions</a></li>
- <li><a href="plugin_flash.html">flash</a></li>
- <li><a href="plugin_autosave.html">autosave</a></li>
- <li><a href="plugin_style.html">style</a></li>
- <li><a href="plugin_layer.html">layer</a></li>
- </ul>
- </div>
- <div class="column">
- <ul class="optionlist">
- <li><a href="plugin_iespell.html">iespell</a></li>
- <li><a href="plugin_insertdatetime.html">insertdatetime</a></li>
- <li><a href="plugin_paste.html">paste</a></li>
- <li><a href="plugin_preview.html">preview</a></li>
- <li><a href="plugin_print.html">print</a></li>
- <li><a href="plugin_save.html">save</a></li>
- <li><a href="plugin_noneditable.html">noneditable</a></li>
- <li><a href="plugin_spellchecker.html">spellchecker</a></li>
- </ul>
- </div>
- <div class="column">
- <ul class="optionlist">
- <li><a href="plugin_searchreplace.html">searchreplace</a></li>
- <li><a href="plugin_table.html">table</a></li>
- <li><a href="plugin_zoom.html">zoom</a></li>
- <li><a href="plugin_directionality.html">directionality</a></li>
- <li><a href="plugin_fullscreen.html">fullscreen</a></li>
- <li><a href="plugin_fullpage.html">fullpage</a></li>
- <li><a href="plugin_inlinepopups.html">inlinepopups</a></li>
- <li><a href="plugin_fullpage.html">fullpage</a></li>
- </ul>
- </div>
- <br style="clear: both" />
- </p>
- <p>
- Please notice that the plugins can require some configuration, click on the plugin link to read more about that plugin.
- </p>
- </div>
-
- <div class="separator"></div>
-
-
-</div>
-
-<div class="footer">
- <div class="helpindexlink"><a href="index.html">Index</a></div>
- <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
- <br style="clear: both" />
-</div>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/reference_plugins.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/reference_plugins.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/reference_plugins.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/reference_plugins.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,78 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Plugins Reference</title>
+<link href="css/screen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+
+<div class="header">
+ <h1>Plugins reference</h1>
+</div>
+
+<div class="content">
+ <p>Here are some information about the different plugins.</p>
+
+ <div class="separator"></div>
+
+ <h2>Plugins</h2>
+ <div class="section">
+ <p>To use a plugin, you need to use the advanced theme and add the plugin name in the "<a href="option_plugin.html">plugin</a>" comma seperated line. You also need to add the button to the interface, read more about the advanced plugin to configure this.</p>
+ <p>
+ <div class="column">
+ <ul class="optionlist">
+ <li><a href="plugin_advhr.html">advhr</a></li>
+ <li><a href="plugin_advimage.html">advimage</a></li>
+ <li><a href="plugin_advlink.html">advlink</a></li>
+ <li><a href="plugin_contextmenu.html">contextmenu</a></li>
+ <li><a href="plugin_emotions.html">emotions</a></li>
+ <li><a href="plugin_flash.html">flash</a></li>
+ <li><a href="plugin_autosave.html">autosave</a></li>
+ <li><a href="plugin_style.html">style</a></li>
+ <li><a href="plugin_layer.html">layer</a></li>
+ </ul>
+ </div>
+ <div class="column">
+ <ul class="optionlist">
+ <li><a href="plugin_iespell.html">iespell</a></li>
+ <li><a href="plugin_insertdatetime.html">insertdatetime</a></li>
+ <li><a href="plugin_paste.html">paste</a></li>
+ <li><a href="plugin_preview.html">preview</a></li>
+ <li><a href="plugin_print.html">print</a></li>
+ <li><a href="plugin_save.html">save</a></li>
+ <li><a href="plugin_noneditable.html">noneditable</a></li>
+ <li><a href="plugin_spellchecker.html">spellchecker</a></li>
+ </ul>
+ </div>
+ <div class="column">
+ <ul class="optionlist">
+ <li><a href="plugin_searchreplace.html">searchreplace</a></li>
+ <li><a href="plugin_table.html">table</a></li>
+ <li><a href="plugin_zoom.html">zoom</a></li>
+ <li><a href="plugin_directionality.html">directionality</a></li>
+ <li><a href="plugin_fullscreen.html">fullscreen</a></li>
+ <li><a href="plugin_fullpage.html">fullpage</a></li>
+ <li><a href="plugin_inlinepopups.html">inlinepopups</a></li>
+ <li><a href="plugin_fullpage.html">fullpage</a></li>
+ </ul>
+ </div>
+ <br style="clear: both" />
+ </p>
+ <p>
+ Please notice that the plugins can require some configuration, click on the plugin link to read more about that plugin.
+ </p>
+ </div>
+
+ <div class="separator"></div>
+
+
+</div>
+
+<div class="footer">
+ <div class="helpindexlink"><a href="index.html">Index</a></div>
+ <div class="copyright">Copyright © 2003-2006 <a href="http://www.moxiecode.com">Moxiecode Systems AB</a></div>
+ <br style="clear: both" />
+</div>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/tinymce_api/GLOBALS.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/tinymce_api/GLOBALS.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/tinymce_api/GLOBALS.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,267 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN""http://www.w3.org/TR/REC-html40/loose.dtd">
-<!--NewPage-->
-<HTML>
-<HEAD>
-<TITLE>
-GLOBALS
-</TITLE>
-<LINK REL ="stylesheet" TYPE="text/css" HREF="stylesheet.css" TITLE="Style">
-</HEAD>
-<SCRIPT>
-function asd()
-{
-parent.document.title="GLOBALS";
-}
-</SCRIPT>
-<BODY BGCOLOR="white" onload="asd();">
-
-<!-- ========== START OF NAVBAR ========== -->
-<A NAME="navbar_bottom"><!-- --></A>
-<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0">
-<TR>
-<TD COLSPAN=3 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
-<A NAME="navbar_bottom_firstrow"><!-- --></A>
-<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3">
- <TR ALIGN="center" VALIGN="top">
- <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="overview-summary.html"><FONT CLASS="NavBarFont1"><B>Overview</B></FONT></A> </TD>
- <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <FONT CLASS="NavBarFont1">File</FONT> </TD>
- <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> <FONT CLASS="NavBarFont1Rev"><B>Class</B></FONT> </TD>
- <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="overview-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A> </TD>
- <!--TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"--> <!--A HREF="deprecated-list.html"--><!--FONT CLASS="NavBarFont1">Deprecated</FONT--><!--/A--><!-- </TD-->
- <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="index-all.html"--><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
- <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
- </TR>
-</TABLE>
-</TD>
-<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
-<B></B>
-</EM>
-</TD
-</TR>
-
-<TR>
-<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
- <B>PREV CLASS</B><!--
- NEXT CLASS
--->
- <A HREF="TinyMCE_Cleanup.html"><B>NEXT CLASS</B></A></FONT></TD>
-<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
- <A HREF="index.html" TARGET="_top"><B>FRAMES</B></A>
- <A HREF="GLOBALS.html" TARGET="_top"><B>NO FRAMES</B></A>
-
-<SCRIPT>
- <!--
- if(window==top) {
- document.writeln('<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>');
- }
- //-->
-</SCRIPT>
-<NOSCRIPT>
-<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>
-</NOSCRIPT>
-</FONT></TD>
-</TR>
-<TR>
-<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
- SUMMARY: <A HREF="#field_summary">FIELD</A> | <A HREF="#constructor_summary">CONSTR</A> | <A HREF="#method_summary">METHOD</A></FONT></TD>
-<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
-DETAIL: <A HREF="#field_detail">FIELD</A> | <A HREF="#constructor_detail">CONSTR</A> | <A HREF="#method_detail">METHOD</A></FONT></TD>
-</TR>
-</TABLE>
-<!-- =========== END OF NAVBAR =========== -->
-<HR>
-
-<!-- ======== START OF CLASS DATA ======== -->
-<H2>Class GLOBALS</H2>
-<PRE>Object
- |
- +--<b>GLOBALS</b>
-</PRE>
-
-
-<HR>
-<DL>
- <!-- Class definition -->
- <DT>class
- <B>GLOBALS</B>
-
-
-</DL>
-
- <HR>
-
-<!-- ======== NESTED CLASS SUMMARY ======== -->
-
-<!-- ======== END NESTED CLASS SUMMARY ======== -->
-
-
-<!-- =========== FIELD SUMMARY =========== -->
-
-
-
-
-<!-- =========== END FIELD SUMMARY =========== -->
-
-
-<!-- ======== CONSTRUCTOR SUMMARY ======== -->
-
-<!-- ======== END CONSTRUCTOR SUMMARY ======== -->
-
-
-
-<!-- ========== METHOD SUMMARY =========== -->
-
-<A NAME="method_summary"><!-- --></A>
-<TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" WIDTH="100%">
-<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
-<TD COLSPAN=2><FONT SIZE="+2">
-<B>Method Summary</B></FONT></TD>
-</TR>
-
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE><static> void</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#!s!TinyMCE_Menu">TinyMCE_Menu</A></B>()
- </CODE>
- <BR>
-
- Constructor for the menu layer class.
- </TD>
- </TR>
-
-
-</TABLE>
-
-
-
-<P>
-<!-- ========== END METHOD SUMMARY =========== -->
-
-
-<!-- ============ FIELD DETAIL START =========== -->
-
-
-<!-- ============ FIELD DETAIL END =========== -->
-
- <!-- ========= CONSTRUCTOR DETAIL START ======== -->
-
-
-<!-- Constructor return value(s) -->
-
-<!-- End constructor return value(s) -->
-
-<!-- ADDITIONAL ATTRIBUTES -->
-
-<HR/>
-<!-- END ADDITIONAL ATTRIBUTES -->
-
-<!-- ========= CONSTRUCTOR DETAIL END ======== -->
-
-
-<!-- ============ METHOD DETAIL START ========== -->
-
-<A NAME="method_detail"><!-- --></A>
-<TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" WIDTH="100%">
- <TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
- <TD COLSPAN=1><FONT SIZE="+2">
- <B>Method Detail</B></FONT>
- </TD>
- </TR>
-</TABLE>
-
-<!-- One single method detail entry -->
-
- <A NAME="!s!TinyMCE_Menu"><!-- --></A>
- <H3>TinyMCE_Menu</H3>
- <PRE><static> void <B>TinyMCE_Menu</B>()</PRE>
-
- <UL>Constructor for the menu layer class.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <!-- METHOD PARAMETERS END -->
-
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
-
-
-<!-- ============ METHOD DETAIL END ========== -->
-
-<!-- ========= END OF CLASS DATA ========= -->
-
-<!-- ========== START OF NAVBAR ========== -->
-<A NAME="navbar_bottom"><!-- --></A>
-<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0">
-<TR>
-<TD COLSPAN=3 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
-<A NAME="navbar_bottom_firstrow"><!-- --></A>
-<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3">
- <TR ALIGN="center" VALIGN="top">
- <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="overview-summary.html"><FONT CLASS="NavBarFont1"><B>Overview</B></FONT></A> </TD>
- <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <FONT CLASS="NavBarFont1">File</FONT> </TD>
- <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> <FONT CLASS="NavBarFont1Rev"><B>Class</B></FONT> </TD>
- <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="overview-tree.html"><FONT CLASS="NavBarFont1"><b>Tree</b></FONT></A> </TD>
- <!--TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"--> <!--A HREF="deprecated-list.html"--><!--FONT CLASS="NavBarFont1">Deprecated</FONT--><!--/A--><!-- </TD-->
- <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
- <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
- </TR>
-</TABLE>
-</TD>
-<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
-<B></B>
-</EM>
-</TD
-</TR>
-
-<TR>
-<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
- <B>PREV CLASS</B><!--
- NEXT CLASS
--->
- <A HREF="TinyMCE_Cleanup.html"><B>NEXT CLASS</B></A></FONT></TD>
-<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
- <A HREF="index.html" TARGET="_top"><B>FRAMES</B></A>
- <A HREF="GLOBALS.html" TARGET="_top"><B>NO FRAMES</B></A>
-
-<SCRIPT>
- <!--
- if(window==top) {
- document.writeln('<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>');
- }
- //-->
-</SCRIPT>
-<NOSCRIPT>
-<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>
-</NOSCRIPT>
-</FONT></TD>
-</TR>
-<TR>
-<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
- SUMMARY: <A HREF="#field_summary">FIELD</A> | <A HREF="#constructor_summary">CONSTR</A> | <A HREF="#method_summary">METHOD</A></FONT></TD>
-<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
-DETAIL: <A HREF="#field_detail">FIELD</A> | <A HREF="#constructor_detail">CONSTR</A> | <A HREF="#method_detail">METHOD</A></FONT></TD>
-</TR>
-</TABLE>
-
-<!-- =========== END OF NAVBAR =========== -->
-
-<HR>
-<FONT SIZE="-1">
-
-</FONT>
-<div class="jsdoc_ctime">Documentation generated by <a href="http://jsdoc.sourceforge.net/" target="_parent">JSDoc</a> on Fri Apr 14 21:59:23 2006</div>
-</BODY>
-</HTML>
Copied: trunk/htdocs/js/tinymce/docs/tinymce_api/GLOBALS.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/tinymce_api/GLOBALS.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/tinymce_api/GLOBALS.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/tinymce_api/GLOBALS.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,267 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN""http://www.w3.org/TR/REC-html40/loose.dtd">
+<!--NewPage-->
+<HTML>
+<HEAD>
+<TITLE>
+GLOBALS
+</TITLE>
+<LINK REL ="stylesheet" TYPE="text/css" HREF="stylesheet.css" TITLE="Style">
+</HEAD>
+<SCRIPT>
+function asd()
+{
+parent.document.title="GLOBALS";
+}
+</SCRIPT>
+<BODY BGCOLOR="white" onload="asd();">
+
+<!-- ========== START OF NAVBAR ========== -->
+<A NAME="navbar_bottom"><!-- --></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0">
+<TR>
+<TD COLSPAN=3 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_bottom_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3">
+ <TR ALIGN="center" VALIGN="top">
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="overview-summary.html"><FONT CLASS="NavBarFont1"><B>Overview</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <FONT CLASS="NavBarFont1">File</FONT> </TD>
+ <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> <FONT CLASS="NavBarFont1Rev"><B>Class</B></FONT> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="overview-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A> </TD>
+ <!--TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"--> <!--A HREF="deprecated-list.html"--><!--FONT CLASS="NavBarFont1">Deprecated</FONT--><!--/A--><!-- </TD-->
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="index-all.html"--><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
+ </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+<B></B>
+</EM>
+</TD
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <B>PREV CLASS</B><!--
+ NEXT CLASS
+-->
+ <A HREF="TinyMCE_Cleanup.html"><B>NEXT CLASS</B></A></FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="index.html" TARGET="_top"><B>FRAMES</B></A>
+ <A HREF="GLOBALS.html" TARGET="_top"><B>NO FRAMES</B></A>
+
+<SCRIPT>
+ <!--
+ if(window==top) {
+ document.writeln('<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>');
+ }
+ //-->
+</SCRIPT>
+<NOSCRIPT>
+<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>
+</NOSCRIPT>
+</FONT></TD>
+</TR>
+<TR>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+ SUMMARY: <A HREF="#field_summary">FIELD</A> | <A HREF="#constructor_summary">CONSTR</A> | <A HREF="#method_summary">METHOD</A></FONT></TD>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+DETAIL: <A HREF="#field_detail">FIELD</A> | <A HREF="#constructor_detail">CONSTR</A> | <A HREF="#method_detail">METHOD</A></FONT></TD>
+</TR>
+</TABLE>
+<!-- =========== END OF NAVBAR =========== -->
+<HR>
+
+<!-- ======== START OF CLASS DATA ======== -->
+<H2>Class GLOBALS</H2>
+<PRE>Object
+ |
+ +--<b>GLOBALS</b>
+</PRE>
+
+
+<HR>
+<DL>
+ <!-- Class definition -->
+ <DT>class
+ <B>GLOBALS</B>
+
+
+</DL>
+
+ <HR>
+
+<!-- ======== NESTED CLASS SUMMARY ======== -->
+
+<!-- ======== END NESTED CLASS SUMMARY ======== -->
+
+
+<!-- =========== FIELD SUMMARY =========== -->
+
+
+
+
+<!-- =========== END FIELD SUMMARY =========== -->
+
+
+<!-- ======== CONSTRUCTOR SUMMARY ======== -->
+
+<!-- ======== END CONSTRUCTOR SUMMARY ======== -->
+
+
+
+<!-- ========== METHOD SUMMARY =========== -->
+
+<A NAME="method_summary"><!-- --></A>
+<TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" WIDTH="100%">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TD COLSPAN=2><FONT SIZE="+2">
+<B>Method Summary</B></FONT></TD>
+</TR>
+
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE><static> void</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#!s!TinyMCE_Menu">TinyMCE_Menu</A></B>()
+ </CODE>
+ <BR>
+
+ Constructor for the menu layer class.
+ </TD>
+ </TR>
+
+
+</TABLE>
+
+
+
+<P>
+<!-- ========== END METHOD SUMMARY =========== -->
+
+
+<!-- ============ FIELD DETAIL START =========== -->
+
+
+<!-- ============ FIELD DETAIL END =========== -->
+
+ <!-- ========= CONSTRUCTOR DETAIL START ======== -->
+
+
+<!-- Constructor return value(s) -->
+
+<!-- End constructor return value(s) -->
+
+<!-- ADDITIONAL ATTRIBUTES -->
+
+<HR/>
+<!-- END ADDITIONAL ATTRIBUTES -->
+
+<!-- ========= CONSTRUCTOR DETAIL END ======== -->
+
+
+<!-- ============ METHOD DETAIL START ========== -->
+
+<A NAME="method_detail"><!-- --></A>
+<TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" WIDTH="100%">
+ <TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+ <TD COLSPAN=1><FONT SIZE="+2">
+ <B>Method Detail</B></FONT>
+ </TD>
+ </TR>
+</TABLE>
+
+<!-- One single method detail entry -->
+
+ <A NAME="!s!TinyMCE_Menu"><!-- --></A>
+ <H3>TinyMCE_Menu</H3>
+ <PRE><static> void <B>TinyMCE_Menu</B>()</PRE>
+
+ <UL>Constructor for the menu layer class.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <!-- METHOD PARAMETERS END -->
+
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+
+
+<!-- ============ METHOD DETAIL END ========== -->
+
+<!-- ========= END OF CLASS DATA ========= -->
+
+<!-- ========== START OF NAVBAR ========== -->
+<A NAME="navbar_bottom"><!-- --></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0">
+<TR>
+<TD COLSPAN=3 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_bottom_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3">
+ <TR ALIGN="center" VALIGN="top">
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="overview-summary.html"><FONT CLASS="NavBarFont1"><B>Overview</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <FONT CLASS="NavBarFont1">File</FONT> </TD>
+ <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> <FONT CLASS="NavBarFont1Rev"><B>Class</B></FONT> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="overview-tree.html"><FONT CLASS="NavBarFont1"><b>Tree</b></FONT></A> </TD>
+ <!--TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"--> <!--A HREF="deprecated-list.html"--><!--FONT CLASS="NavBarFont1">Deprecated</FONT--><!--/A--><!-- </TD-->
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
+ </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+<B></B>
+</EM>
+</TD
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <B>PREV CLASS</B><!--
+ NEXT CLASS
+-->
+ <A HREF="TinyMCE_Cleanup.html"><B>NEXT CLASS</B></A></FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="index.html" TARGET="_top"><B>FRAMES</B></A>
+ <A HREF="GLOBALS.html" TARGET="_top"><B>NO FRAMES</B></A>
+
+<SCRIPT>
+ <!--
+ if(window==top) {
+ document.writeln('<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>');
+ }
+ //-->
+</SCRIPT>
+<NOSCRIPT>
+<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>
+</NOSCRIPT>
+</FONT></TD>
+</TR>
+<TR>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+ SUMMARY: <A HREF="#field_summary">FIELD</A> | <A HREF="#constructor_summary">CONSTR</A> | <A HREF="#method_summary">METHOD</A></FONT></TD>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+DETAIL: <A HREF="#field_detail">FIELD</A> | <A HREF="#constructor_detail">CONSTR</A> | <A HREF="#method_detail">METHOD</A></FONT></TD>
+</TR>
+</TABLE>
+
+<!-- =========== END OF NAVBAR =========== -->
+
+<HR>
+<FONT SIZE="-1">
+
+</FONT>
+<div class="jsdoc_ctime">Documentation generated by <a href="http://jsdoc.sourceforge.net/" target="_parent">JSDoc</a> on Fri Apr 14 21:59:23 2006</div>
+</BODY>
+</HTML>
Deleted: trunk/htdocs/js/tinymce/docs/tinymce_api/TinyMCE_Cleanup.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/tinymce_api/TinyMCE_Cleanup.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/tinymce_api/TinyMCE_Cleanup.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,675 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN""http://www.w3.org/TR/REC-html40/loose.dtd">
-<!--NewPage-->
-<HTML>
-<HEAD>
-<TITLE>
-TinyMCE_Cleanup
-</TITLE>
-<LINK REL ="stylesheet" TYPE="text/css" HREF="stylesheet.css" TITLE="Style">
-</HEAD>
-<SCRIPT>
-function asd()
-{
-parent.document.title="TinyMCE_Cleanup";
-}
-</SCRIPT>
-<BODY BGCOLOR="white" onload="asd();">
-
-<!-- ========== START OF NAVBAR ========== -->
-<A NAME="navbar_bottom"><!-- --></A>
-<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0">
-<TR>
-<TD COLSPAN=3 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
-<A NAME="navbar_bottom_firstrow"><!-- --></A>
-<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3">
- <TR ALIGN="center" VALIGN="top">
- <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="overview-summary.html"><FONT CLASS="NavBarFont1"><B>Overview</B></FONT></A> </TD>
- <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="overview-summary-TinyMCE_Cleanup.class.js.html"><FONT CLASS="NavBarFont1"><B>File</B></FONT></A> </TD>
- <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> <FONT CLASS="NavBarFont1Rev"><B>Class</B></FONT> </TD>
- <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="overview-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A> </TD>
- <!--TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"--> <!--A HREF="deprecated-list.html"--><!--FONT CLASS="NavBarFont1">Deprecated</FONT--><!--/A--><!-- </TD-->
- <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="index-all.html"--><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
- <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
- </TR>
-</TABLE>
-</TD>
-<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
-<B></B>
-</EM>
-</TD
-</TR>
-
-<TR>
-<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
- <A HREF="GLOBALS.html"><B>PREV CLASS</B></A><!--
- NEXT CLASS
--->
- <A HREF="TinyMCE_Control.html"><B>NEXT CLASS</B></A></FONT></TD>
-<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
- <A HREF="index.html" TARGET="_top"><B>FRAMES</B></A>
- <A HREF="TinyMCE_Cleanup.html" TARGET="_top"><B>NO FRAMES</B></A>
-
-<SCRIPT>
- <!--
- if(window==top) {
- document.writeln('<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>');
- }
- //-->
-</SCRIPT>
-<NOSCRIPT>
-<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>
-</NOSCRIPT>
-</FONT></TD>
-</TR>
-<TR>
-<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
- SUMMARY: <A HREF="#field_summary">FIELD</A> | <A HREF="#constructor_summary">CONSTR</A> | <A HREF="#method_summary">METHOD</A></FONT></TD>
-<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
-DETAIL: <A HREF="#field_detail">FIELD</A> | <A HREF="#constructor_detail">CONSTR</A> | <A HREF="#method_detail">METHOD</A></FONT></TD>
-</TR>
-</TABLE>
-<!-- =========== END OF NAVBAR =========== -->
-<HR>
-
-<!-- ======== START OF CLASS DATA ======== -->
-<H2>Class TinyMCE_Cleanup</H2>
-<PRE>Object
- |
- +--<b>TinyMCE_Cleanup</b>
-</PRE>
-
-
-<HR>
-<DL>
- <!-- Class definition -->
- <DT>class
- <B>TinyMCE_Cleanup</B>
-
-
-</DL>
-
- <P>
- <I>Defined in <a href='overview-summary-TinyMCE_Cleanup.class.js.html'>TinyMCE_Cleanup.class.js</a></I><BR/><BR/>
- </P>
-
- <HR>
-
-<!-- ======== NESTED CLASS SUMMARY ======== -->
-
-<!-- ======== END NESTED CLASS SUMMARY ======== -->
-
-
-<!-- =========== FIELD SUMMARY =========== -->
-
-
-
-
-<!-- =========== END FIELD SUMMARY =========== -->
-
-
-<!-- ======== CONSTRUCTOR SUMMARY ======== -->
-
-<A NAME="constructor_summary"><!-- --></A>
-<TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" WIDTH="100%">
-<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
-<TD COLSPAN=2><FONT SIZE="+2">
-<B>Constructor Summary</B></FONT></TD>
-</TR>
-<TR BGCOLOR="white" CLASS="TableRowColor">
- <TD>
- <CODE>
- <B>
- <A HREF="TinyMCE_Cleanup.html#TinyMCE_Cleanup()">TinyMCE_Cleanup</A>
- </B>
- ()
- </CODE>
- <BR>
-
- TinyMCE_Cleanup class.
- </TD>
-</TR>
-</TABLE>
-
-<!-- ======== END CONSTRUCTOR SUMMARY ======== -->
-
-
-
-<!-- ========== METHOD SUMMARY =========== -->
-
-<A NAME="method_summary"><!-- --></A>
-<TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" WIDTH="100%">
-<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
-<TD COLSPAN=2><FONT SIZE="+2">
-<B>Method Summary</B></FONT></TD>
-</TR>
-
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> void</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#addRuleStr">addRuleStr</A></B>(<string> s)
- </CODE>
- <BR>
-
- Adds a cleanup rule string, for TinyMCE_Cleanup.prototype.example = a;[href|name|title=title|class=class1?class2?class3].
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> string</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#formatHTML">formatHTML</A></B>(<string> h)
- </CODE>
- <BR>
-
- Applies source formatting/indentation on the specified HTML string.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> void</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#init">init</A></B>(<Array> s)
- </CODE>
- <BR>
-
- Initializes the cleanup engine with the specified config.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> Array</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#parseRuleStr">parseRuleStr</A></B>(<string> s)
- </CODE>
- <BR>
-
- Parses a cleanup rule string, for TinyMCE_Cleanup.prototype.example = a;[href|name|title=title|class=class1?class2?class3].
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> string</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#serializeNodeAsHTML">serializeNodeAsHTML</A></B>(<HTMLNode> n)
- </CODE>
- <BR>
-
- Serializes the specified node as a XHTML string.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> string</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#serializeNodeAsXML">serializeNodeAsXML</A></B>(<HTMLNode> n)
- </CODE>
- <BR>
-
- Serializes the specified node as a HTML string.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> string</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#split">split</A></B>(<RegEx> re, <string> s)
- </CODE>
- <BR>
-
- Splits the specified string and removed empty chunks.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> string</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#xmlEncode">xmlEncode</A></B>(<string> s)
- </CODE>
- <BR>
-
- XML Encodes the specified string based on configured entity encoding.
- </TD>
- </TR>
-
-
-</TABLE>
-
-
-
-<P>
-<!-- ========== END METHOD SUMMARY =========== -->
-
-
-<!-- ============ FIELD DETAIL START =========== -->
-
-
-<!-- ============ FIELD DETAIL END =========== -->
-
- <!-- ========= CONSTRUCTOR DETAIL START ======== -->
-
-<A NAME="constructor_detail"><!-- --></A>
-<TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" WIDTH="100%">
- <TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
- <TD COLSPAN=1>
- <FONT SIZE="+2"><B>Constructor Detail</B></FONT>
- </TD>
- </TR>
-</TABLE>
-
-<A NAME="TinyMCE_Cleanup()"><!-- --></A><H3>
-TinyMCE_Cleanup</H3>
-<PRE><B>TinyMCE_Cleanup</B>()</PRE>
-
-
-<UL>
- TinyMCE_Cleanup class.
-</UL>
-
-
-
- </UL>
-
-
-<!-- Constructor return value(s) -->
-
-<!-- End constructor return value(s) -->
-
-<!-- ADDITIONAL ATTRIBUTES -->
-
-<HR/>
-<!-- END ADDITIONAL ATTRIBUTES -->
-
-<!-- ========= CONSTRUCTOR DETAIL END ======== -->
-
-
-<!-- ============ METHOD DETAIL START ========== -->
-
-<A NAME="method_detail"><!-- --></A>
-<TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" WIDTH="100%">
- <TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
- <TD COLSPAN=1><FONT SIZE="+2">
- <B>Method Detail</B></FONT>
- </TD>
- </TR>
-</TABLE>
-
-<!-- One single method detail entry -->
-
- <A NAME="addRuleStr"><!-- --></A>
- <H3>addRuleStr</H3>
- <PRE>void <B>addRuleStr</B>(<string> s)</PRE>
-
- <UL>Adds a cleanup rule string, for TinyMCE_Cleanup.prototype.example = a;[href|name|title=title|class=class1?class2?class3].
- These rules are then used when serializing the DOM tree as a HTML string, it gives the possibility
- to control the valid elements and attributes and force attribute values or default them.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <UL>
- <B>Parameters:</B>
-
- <UL><CODE>s</CODE> - Rule string to parse and add to the cleanup rules array.
- </UL>
-
- </UL>
-
- <!-- METHOD PARAMETERS END -->
-
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="formatHTML"><!-- --></A>
- <H3>formatHTML</H3>
- <PRE>string <B>formatHTML</B>(<string> h)</PRE>
-
- <UL>Applies source formatting/indentation on the specified HTML string.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <UL>
- <B>Parameters:</B>
-
- <UL><CODE>h</CODE> - HTML string to apply formatting to.
- </UL>
-
- </UL>
-
- <!-- METHOD PARAMETERS END -->
-
-
- <UL>
- <B>Returns:</B>
- <UL>
- Formatted HTML string.
- </UL>
- </UL>
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="init"><!-- --></A>
- <H3>init</H3>
- <PRE>void <B>init</B>(<Array> s)</PRE>
-
- <UL>Initializes the cleanup engine with the specified config.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <UL>
- <B>Parameters:</B>
-
- <UL><CODE>s</CODE> - Name/Value array with config settings.
- </UL>
-
- </UL>
-
- <!-- METHOD PARAMETERS END -->
-
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="parseRuleStr"><!-- --></A>
- <H3>parseRuleStr</H3>
- <PRE>Array <B>parseRuleStr</B>(<string> s)</PRE>
-
- <UL>Parses a cleanup rule string, for TinyMCE_Cleanup.prototype.example = a;[href|name|title=title|class=class1?class2?class3].
- These rules are then used when serializing the DOM tree as a HTML string, it gives the possibility
- to control the valid elements and attributes and force attribute values or default them.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <UL>
- <B>Parameters:</B>
-
- <UL><CODE>s</CODE> - Rule string to parse as a name/value rule array.
- </UL>
-
- </UL>
-
- <!-- METHOD PARAMETERS END -->
-
-
- <UL>
- <B>Returns:</B>
- <UL>
- Parsed name/value rule array.
- </UL>
- </UL>
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="serializeNodeAsHTML"><!-- --></A>
- <H3>serializeNodeAsHTML</H3>
- <PRE>string <B>serializeNodeAsHTML</B>(<HTMLNode> n)</PRE>
-
- <UL>Serializes the specified node as a XHTML string. This uses the TinyMCE serializer logic since it gives more
- control over the output than the build in browser XML serializer.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <UL>
- <B>Parameters:</B>
-
- <UL><CODE>n</CODE> - Node to serialize as a XHTML string.
- </UL>
-
- </UL>
-
- <!-- METHOD PARAMETERS END -->
-
-
- <UL>
- <B>Returns:</B>
- <UL>
- Serialized XHTML string based on specified node.
- </UL>
- </UL>
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="serializeNodeAsXML"><!-- --></A>
- <H3>serializeNodeAsXML</H3>
- <PRE>string <B>serializeNodeAsXML</B>(<HTMLNode> n)</PRE>
-
- <UL>Serializes the specified node as a HTML string. This uses the XML parser and serializer
- to generate a XHTML string.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <UL>
- <B>Parameters:</B>
-
- <UL><CODE>n</CODE> - Node to serialize as a XHTML string.
- </UL>
-
- </UL>
-
- <!-- METHOD PARAMETERS END -->
-
-
- <UL>
- <B>Returns:</B>
- <UL>
- Serialized XHTML string based on specified node.
- </UL>
- </UL>
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="split"><!-- --></A>
- <H3>split</H3>
- <PRE>string <B>split</B>(<RegEx> re, <string> s)</PRE>
-
- <UL>Splits the specified string and removed empty chunks.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <UL>
- <B>Parameters:</B>
-
- <UL><CODE>re</CODE> - RegEx to split string by.
- </UL>
-
- <UL><CODE>s</CODE> - String value to split.
- </UL>
-
- </UL>
-
- <!-- METHOD PARAMETERS END -->
-
-
- <UL>
- <B>Returns:</B>
- <UL>
- Array with parts from specified string.
- </UL>
- </UL>
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="xmlEncode"><!-- --></A>
- <H3>xmlEncode</H3>
- <PRE>string <B>xmlEncode</B>(<string> s)</PRE>
-
- <UL>XML Encodes the specified string based on configured entity encoding. The entity encoding modes
- are raw, numeric and named. Where raw is the fastest and named is default.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <UL>
- <B>Parameters:</B>
-
- <UL><CODE>s</CODE> - String to convert to XML.
- </UL>
-
- </UL>
-
- <!-- METHOD PARAMETERS END -->
-
-
- <UL>
- <B>Returns:</B>
- <UL>
- Encoded XML string based on configured entity encoding.
- </UL>
- </UL>
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
-
-
-<!-- ============ METHOD DETAIL END ========== -->
-
-<!-- ========= END OF CLASS DATA ========= -->
-
-<!-- ========== START OF NAVBAR ========== -->
-<A NAME="navbar_bottom"><!-- --></A>
-<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0">
-<TR>
-<TD COLSPAN=3 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
-<A NAME="navbar_bottom_firstrow"><!-- --></A>
-<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3">
- <TR ALIGN="center" VALIGN="top">
- <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="overview-summary.html"><FONT CLASS="NavBarFont1"><B>Overview</B></FONT></A> </TD>
- <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="overview-summary-TinyMCE_Cleanup.class.js.html"><FONT CLASS="NavBarFont1"><B>File</B></FONT></A> </TD>
- <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> <FONT CLASS="NavBarFont1Rev"><B>Class</B></FONT> </TD>
- <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="overview-tree.html"><FONT CLASS="NavBarFont1"><b>Tree</b></FONT></A> </TD>
- <!--TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"--> <!--A HREF="deprecated-list.html"--><!--FONT CLASS="NavBarFont1">Deprecated</FONT--><!--/A--><!-- </TD-->
- <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
- <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
- </TR>
-</TABLE>
-</TD>
-<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
-<B></B>
-</EM>
-</TD
-</TR>
-
-<TR>
-<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
- <A HREF="GLOBALS.html"><B>PREV CLASS</B></A><!--
- NEXT CLASS
--->
- <A HREF="TinyMCE_Control.html"><B>NEXT CLASS</B></A></FONT></TD>
-<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
- <A HREF="index.html" TARGET="_top"><B>FRAMES</B></A>
- <A HREF="TinyMCE_Cleanup.html" TARGET="_top"><B>NO FRAMES</B></A>
-
-<SCRIPT>
- <!--
- if(window==top) {
- document.writeln('<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>');
- }
- //-->
-</SCRIPT>
-<NOSCRIPT>
-<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>
-</NOSCRIPT>
-</FONT></TD>
-</TR>
-<TR>
-<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
- SUMMARY: <A HREF="#field_summary">FIELD</A> | <A HREF="#constructor_summary">CONSTR</A> | <A HREF="#method_summary">METHOD</A></FONT></TD>
-<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
-DETAIL: <A HREF="#field_detail">FIELD</A> | <A HREF="#constructor_detail">CONSTR</A> | <A HREF="#method_detail">METHOD</A></FONT></TD>
-</TR>
-</TABLE>
-
-<!-- =========== END OF NAVBAR =========== -->
-
-<HR>
-<FONT SIZE="-1">
-
-</FONT>
-<div class="jsdoc_ctime">Documentation generated by <a href="http://jsdoc.sourceforge.net/" target="_parent">JSDoc</a> on Fri Apr 14 21:59:23 2006</div>
-</BODY>
-</HTML>
Copied: trunk/htdocs/js/tinymce/docs/tinymce_api/TinyMCE_Cleanup.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/tinymce_api/TinyMCE_Cleanup.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/tinymce_api/TinyMCE_Cleanup.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/tinymce_api/TinyMCE_Cleanup.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,675 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN""http://www.w3.org/TR/REC-html40/loose.dtd">
+<!--NewPage-->
+<HTML>
+<HEAD>
+<TITLE>
+TinyMCE_Cleanup
+</TITLE>
+<LINK REL ="stylesheet" TYPE="text/css" HREF="stylesheet.css" TITLE="Style">
+</HEAD>
+<SCRIPT>
+function asd()
+{
+parent.document.title="TinyMCE_Cleanup";
+}
+</SCRIPT>
+<BODY BGCOLOR="white" onload="asd();">
+
+<!-- ========== START OF NAVBAR ========== -->
+<A NAME="navbar_bottom"><!-- --></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0">
+<TR>
+<TD COLSPAN=3 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_bottom_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3">
+ <TR ALIGN="center" VALIGN="top">
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="overview-summary.html"><FONT CLASS="NavBarFont1"><B>Overview</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="overview-summary-TinyMCE_Cleanup.class.js.html"><FONT CLASS="NavBarFont1"><B>File</B></FONT></A> </TD>
+ <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> <FONT CLASS="NavBarFont1Rev"><B>Class</B></FONT> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="overview-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A> </TD>
+ <!--TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"--> <!--A HREF="deprecated-list.html"--><!--FONT CLASS="NavBarFont1">Deprecated</FONT--><!--/A--><!-- </TD-->
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="index-all.html"--><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
+ </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+<B></B>
+</EM>
+</TD
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="GLOBALS.html"><B>PREV CLASS</B></A><!--
+ NEXT CLASS
+-->
+ <A HREF="TinyMCE_Control.html"><B>NEXT CLASS</B></A></FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="index.html" TARGET="_top"><B>FRAMES</B></A>
+ <A HREF="TinyMCE_Cleanup.html" TARGET="_top"><B>NO FRAMES</B></A>
+
+<SCRIPT>
+ <!--
+ if(window==top) {
+ document.writeln('<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>');
+ }
+ //-->
+</SCRIPT>
+<NOSCRIPT>
+<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>
+</NOSCRIPT>
+</FONT></TD>
+</TR>
+<TR>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+ SUMMARY: <A HREF="#field_summary">FIELD</A> | <A HREF="#constructor_summary">CONSTR</A> | <A HREF="#method_summary">METHOD</A></FONT></TD>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+DETAIL: <A HREF="#field_detail">FIELD</A> | <A HREF="#constructor_detail">CONSTR</A> | <A HREF="#method_detail">METHOD</A></FONT></TD>
+</TR>
+</TABLE>
+<!-- =========== END OF NAVBAR =========== -->
+<HR>
+
+<!-- ======== START OF CLASS DATA ======== -->
+<H2>Class TinyMCE_Cleanup</H2>
+<PRE>Object
+ |
+ +--<b>TinyMCE_Cleanup</b>
+</PRE>
+
+
+<HR>
+<DL>
+ <!-- Class definition -->
+ <DT>class
+ <B>TinyMCE_Cleanup</B>
+
+
+</DL>
+
+ <P>
+ <I>Defined in <a href='overview-summary-TinyMCE_Cleanup.class.js.html'>TinyMCE_Cleanup.class.js</a></I><BR/><BR/>
+ </P>
+
+ <HR>
+
+<!-- ======== NESTED CLASS SUMMARY ======== -->
+
+<!-- ======== END NESTED CLASS SUMMARY ======== -->
+
+
+<!-- =========== FIELD SUMMARY =========== -->
+
+
+
+
+<!-- =========== END FIELD SUMMARY =========== -->
+
+
+<!-- ======== CONSTRUCTOR SUMMARY ======== -->
+
+<A NAME="constructor_summary"><!-- --></A>
+<TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" WIDTH="100%">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TD COLSPAN=2><FONT SIZE="+2">
+<B>Constructor Summary</B></FONT></TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="TinyMCE_Cleanup.html#TinyMCE_Cleanup()">TinyMCE_Cleanup</A>
+ </B>
+ ()
+ </CODE>
+ <BR>
+
+ TinyMCE_Cleanup class.
+ </TD>
+</TR>
+</TABLE>
+
+<!-- ======== END CONSTRUCTOR SUMMARY ======== -->
+
+
+
+<!-- ========== METHOD SUMMARY =========== -->
+
+<A NAME="method_summary"><!-- --></A>
+<TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" WIDTH="100%">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TD COLSPAN=2><FONT SIZE="+2">
+<B>Method Summary</B></FONT></TD>
+</TR>
+
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> void</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#addRuleStr">addRuleStr</A></B>(<string> s)
+ </CODE>
+ <BR>
+
+ Adds a cleanup rule string, for TinyMCE_Cleanup.prototype.example = a;[href|name|title=title|class=class1?class2?class3].
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> string</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#formatHTML">formatHTML</A></B>(<string> h)
+ </CODE>
+ <BR>
+
+ Applies source formatting/indentation on the specified HTML string.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> void</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#init">init</A></B>(<Array> s)
+ </CODE>
+ <BR>
+
+ Initializes the cleanup engine with the specified config.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> Array</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#parseRuleStr">parseRuleStr</A></B>(<string> s)
+ </CODE>
+ <BR>
+
+ Parses a cleanup rule string, for TinyMCE_Cleanup.prototype.example = a;[href|name|title=title|class=class1?class2?class3].
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> string</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#serializeNodeAsHTML">serializeNodeAsHTML</A></B>(<HTMLNode> n)
+ </CODE>
+ <BR>
+
+ Serializes the specified node as a XHTML string.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> string</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#serializeNodeAsXML">serializeNodeAsXML</A></B>(<HTMLNode> n)
+ </CODE>
+ <BR>
+
+ Serializes the specified node as a HTML string.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> string</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#split">split</A></B>(<RegEx> re, <string> s)
+ </CODE>
+ <BR>
+
+ Splits the specified string and removed empty chunks.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> string</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#xmlEncode">xmlEncode</A></B>(<string> s)
+ </CODE>
+ <BR>
+
+ XML Encodes the specified string based on configured entity encoding.
+ </TD>
+ </TR>
+
+
+</TABLE>
+
+
+
+<P>
+<!-- ========== END METHOD SUMMARY =========== -->
+
+
+<!-- ============ FIELD DETAIL START =========== -->
+
+
+<!-- ============ FIELD DETAIL END =========== -->
+
+ <!-- ========= CONSTRUCTOR DETAIL START ======== -->
+
+<A NAME="constructor_detail"><!-- --></A>
+<TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" WIDTH="100%">
+ <TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+ <TD COLSPAN=1>
+ <FONT SIZE="+2"><B>Constructor Detail</B></FONT>
+ </TD>
+ </TR>
+</TABLE>
+
+<A NAME="TinyMCE_Cleanup()"><!-- --></A><H3>
+TinyMCE_Cleanup</H3>
+<PRE><B>TinyMCE_Cleanup</B>()</PRE>
+
+
+<UL>
+ TinyMCE_Cleanup class.
+</UL>
+
+
+
+ </UL>
+
+
+<!-- Constructor return value(s) -->
+
+<!-- End constructor return value(s) -->
+
+<!-- ADDITIONAL ATTRIBUTES -->
+
+<HR/>
+<!-- END ADDITIONAL ATTRIBUTES -->
+
+<!-- ========= CONSTRUCTOR DETAIL END ======== -->
+
+
+<!-- ============ METHOD DETAIL START ========== -->
+
+<A NAME="method_detail"><!-- --></A>
+<TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" WIDTH="100%">
+ <TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+ <TD COLSPAN=1><FONT SIZE="+2">
+ <B>Method Detail</B></FONT>
+ </TD>
+ </TR>
+</TABLE>
+
+<!-- One single method detail entry -->
+
+ <A NAME="addRuleStr"><!-- --></A>
+ <H3>addRuleStr</H3>
+ <PRE>void <B>addRuleStr</B>(<string> s)</PRE>
+
+ <UL>Adds a cleanup rule string, for TinyMCE_Cleanup.prototype.example = a;[href|name|title=title|class=class1?class2?class3].
+ These rules are then used when serializing the DOM tree as a HTML string, it gives the possibility
+ to control the valid elements and attributes and force attribute values or default them.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <UL>
+ <B>Parameters:</B>
+
+ <UL><CODE>s</CODE> - Rule string to parse and add to the cleanup rules array.
+ </UL>
+
+ </UL>
+
+ <!-- METHOD PARAMETERS END -->
+
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="formatHTML"><!-- --></A>
+ <H3>formatHTML</H3>
+ <PRE>string <B>formatHTML</B>(<string> h)</PRE>
+
+ <UL>Applies source formatting/indentation on the specified HTML string.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <UL>
+ <B>Parameters:</B>
+
+ <UL><CODE>h</CODE> - HTML string to apply formatting to.
+ </UL>
+
+ </UL>
+
+ <!-- METHOD PARAMETERS END -->
+
+
+ <UL>
+ <B>Returns:</B>
+ <UL>
+ Formatted HTML string.
+ </UL>
+ </UL>
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="init"><!-- --></A>
+ <H3>init</H3>
+ <PRE>void <B>init</B>(<Array> s)</PRE>
+
+ <UL>Initializes the cleanup engine with the specified config.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <UL>
+ <B>Parameters:</B>
+
+ <UL><CODE>s</CODE> - Name/Value array with config settings.
+ </UL>
+
+ </UL>
+
+ <!-- METHOD PARAMETERS END -->
+
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="parseRuleStr"><!-- --></A>
+ <H3>parseRuleStr</H3>
+ <PRE>Array <B>parseRuleStr</B>(<string> s)</PRE>
+
+ <UL>Parses a cleanup rule string, for TinyMCE_Cleanup.prototype.example = a;[href|name|title=title|class=class1?class2?class3].
+ These rules are then used when serializing the DOM tree as a HTML string, it gives the possibility
+ to control the valid elements and attributes and force attribute values or default them.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <UL>
+ <B>Parameters:</B>
+
+ <UL><CODE>s</CODE> - Rule string to parse as a name/value rule array.
+ </UL>
+
+ </UL>
+
+ <!-- METHOD PARAMETERS END -->
+
+
+ <UL>
+ <B>Returns:</B>
+ <UL>
+ Parsed name/value rule array.
+ </UL>
+ </UL>
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="serializeNodeAsHTML"><!-- --></A>
+ <H3>serializeNodeAsHTML</H3>
+ <PRE>string <B>serializeNodeAsHTML</B>(<HTMLNode> n)</PRE>
+
+ <UL>Serializes the specified node as a XHTML string. This uses the TinyMCE serializer logic since it gives more
+ control over the output than the build in browser XML serializer.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <UL>
+ <B>Parameters:</B>
+
+ <UL><CODE>n</CODE> - Node to serialize as a XHTML string.
+ </UL>
+
+ </UL>
+
+ <!-- METHOD PARAMETERS END -->
+
+
+ <UL>
+ <B>Returns:</B>
+ <UL>
+ Serialized XHTML string based on specified node.
+ </UL>
+ </UL>
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="serializeNodeAsXML"><!-- --></A>
+ <H3>serializeNodeAsXML</H3>
+ <PRE>string <B>serializeNodeAsXML</B>(<HTMLNode> n)</PRE>
+
+ <UL>Serializes the specified node as a HTML string. This uses the XML parser and serializer
+ to generate a XHTML string.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <UL>
+ <B>Parameters:</B>
+
+ <UL><CODE>n</CODE> - Node to serialize as a XHTML string.
+ </UL>
+
+ </UL>
+
+ <!-- METHOD PARAMETERS END -->
+
+
+ <UL>
+ <B>Returns:</B>
+ <UL>
+ Serialized XHTML string based on specified node.
+ </UL>
+ </UL>
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="split"><!-- --></A>
+ <H3>split</H3>
+ <PRE>string <B>split</B>(<RegEx> re, <string> s)</PRE>
+
+ <UL>Splits the specified string and removed empty chunks.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <UL>
+ <B>Parameters:</B>
+
+ <UL><CODE>re</CODE> - RegEx to split string by.
+ </UL>
+
+ <UL><CODE>s</CODE> - String value to split.
+ </UL>
+
+ </UL>
+
+ <!-- METHOD PARAMETERS END -->
+
+
+ <UL>
+ <B>Returns:</B>
+ <UL>
+ Array with parts from specified string.
+ </UL>
+ </UL>
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="xmlEncode"><!-- --></A>
+ <H3>xmlEncode</H3>
+ <PRE>string <B>xmlEncode</B>(<string> s)</PRE>
+
+ <UL>XML Encodes the specified string based on configured entity encoding. The entity encoding modes
+ are raw, numeric and named. Where raw is the fastest and named is default.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <UL>
+ <B>Parameters:</B>
+
+ <UL><CODE>s</CODE> - String to convert to XML.
+ </UL>
+
+ </UL>
+
+ <!-- METHOD PARAMETERS END -->
+
+
+ <UL>
+ <B>Returns:</B>
+ <UL>
+ Encoded XML string based on configured entity encoding.
+ </UL>
+ </UL>
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+
+
+<!-- ============ METHOD DETAIL END ========== -->
+
+<!-- ========= END OF CLASS DATA ========= -->
+
+<!-- ========== START OF NAVBAR ========== -->
+<A NAME="navbar_bottom"><!-- --></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0">
+<TR>
+<TD COLSPAN=3 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_bottom_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3">
+ <TR ALIGN="center" VALIGN="top">
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="overview-summary.html"><FONT CLASS="NavBarFont1"><B>Overview</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="overview-summary-TinyMCE_Cleanup.class.js.html"><FONT CLASS="NavBarFont1"><B>File</B></FONT></A> </TD>
+ <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> <FONT CLASS="NavBarFont1Rev"><B>Class</B></FONT> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="overview-tree.html"><FONT CLASS="NavBarFont1"><b>Tree</b></FONT></A> </TD>
+ <!--TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"--> <!--A HREF="deprecated-list.html"--><!--FONT CLASS="NavBarFont1">Deprecated</FONT--><!--/A--><!-- </TD-->
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
+ </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+<B></B>
+</EM>
+</TD
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="GLOBALS.html"><B>PREV CLASS</B></A><!--
+ NEXT CLASS
+-->
+ <A HREF="TinyMCE_Control.html"><B>NEXT CLASS</B></A></FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="index.html" TARGET="_top"><B>FRAMES</B></A>
+ <A HREF="TinyMCE_Cleanup.html" TARGET="_top"><B>NO FRAMES</B></A>
+
+<SCRIPT>
+ <!--
+ if(window==top) {
+ document.writeln('<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>');
+ }
+ //-->
+</SCRIPT>
+<NOSCRIPT>
+<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>
+</NOSCRIPT>
+</FONT></TD>
+</TR>
+<TR>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+ SUMMARY: <A HREF="#field_summary">FIELD</A> | <A HREF="#constructor_summary">CONSTR</A> | <A HREF="#method_summary">METHOD</A></FONT></TD>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+DETAIL: <A HREF="#field_detail">FIELD</A> | <A HREF="#constructor_detail">CONSTR</A> | <A HREF="#method_detail">METHOD</A></FONT></TD>
+</TR>
+</TABLE>
+
+<!-- =========== END OF NAVBAR =========== -->
+
+<HR>
+<FONT SIZE="-1">
+
+</FONT>
+<div class="jsdoc_ctime">Documentation generated by <a href="http://jsdoc.sourceforge.net/" target="_parent">JSDoc</a> on Fri Apr 14 21:59:23 2006</div>
+</BODY>
+</HTML>
Deleted: trunk/htdocs/js/tinymce/docs/tinymce_api/TinyMCE_Control.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/tinymce_api/TinyMCE_Control.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/tinymce_api/TinyMCE_Control.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,1387 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN""http://www.w3.org/TR/REC-html40/loose.dtd">
-<!--NewPage-->
-<HTML>
-<HEAD>
-<TITLE>
-TinyMCE_Control
-</TITLE>
-<LINK REL ="stylesheet" TYPE="text/css" HREF="stylesheet.css" TITLE="Style">
-</HEAD>
-<SCRIPT>
-function asd()
-{
-parent.document.title="TinyMCE_Control";
-}
-</SCRIPT>
-<BODY BGCOLOR="white" onload="asd();">
-
-<!-- ========== START OF NAVBAR ========== -->
-<A NAME="navbar_bottom"><!-- --></A>
-<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0">
-<TR>
-<TD COLSPAN=3 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
-<A NAME="navbar_bottom_firstrow"><!-- --></A>
-<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3">
- <TR ALIGN="center" VALIGN="top">
- <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="overview-summary.html"><FONT CLASS="NavBarFont1"><B>Overview</B></FONT></A> </TD>
- <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="overview-summary-TinyMCE_Control.class.js.html"><FONT CLASS="NavBarFont1"><B>File</B></FONT></A> </TD>
- <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> <FONT CLASS="NavBarFont1Rev"><B>Class</B></FONT> </TD>
- <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="overview-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A> </TD>
- <!--TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"--> <!--A HREF="deprecated-list.html"--><!--FONT CLASS="NavBarFont1">Deprecated</FONT--><!--/A--><!-- </TD-->
- <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="index-all.html"--><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
- <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
- </TR>
-</TABLE>
-</TD>
-<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
-<B></B>
-</EM>
-</TD
-</TR>
-
-<TR>
-<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
- <A HREF="TinyMCE_Cleanup.html"><B>PREV CLASS</B></A><!--
- NEXT CLASS
--->
- <A HREF="TinyMCE_Engine.html"><B>NEXT CLASS</B></A></FONT></TD>
-<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
- <A HREF="index.html" TARGET="_top"><B>FRAMES</B></A>
- <A HREF="TinyMCE_Control.html" TARGET="_top"><B>NO FRAMES</B></A>
-
-<SCRIPT>
- <!--
- if(window==top) {
- document.writeln('<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>');
- }
- //-->
-</SCRIPT>
-<NOSCRIPT>
-<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>
-</NOSCRIPT>
-</FONT></TD>
-</TR>
-<TR>
-<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
- SUMMARY: <A HREF="#field_summary">FIELD</A> | <A HREF="#constructor_summary">CONSTR</A> | <A HREF="#method_summary">METHOD</A></FONT></TD>
-<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
-DETAIL: <A HREF="#field_detail">FIELD</A> | <A HREF="#constructor_detail">CONSTR</A> | <A HREF="#method_detail">METHOD</A></FONT></TD>
-</TR>
-</TABLE>
-<!-- =========== END OF NAVBAR =========== -->
-<HR>
-
-<!-- ======== START OF CLASS DATA ======== -->
-<H2>Class TinyMCE_Control</H2>
-<PRE>Object
- |
- +--<b>TinyMCE_Control</b>
-</PRE>
-
-
-<HR>
-<DL>
- <!-- Class definition -->
- <DT>class
- <B>TinyMCE_Control</B>
-
-
-</DL>
-
- <P>
- <I>Defined in <a href='overview-summary-TinyMCE_Control.class.js.html'>TinyMCE_Control.class.js</a></I><BR/><BR/>
- </P>
-
- <HR>
-
-<!-- ======== NESTED CLASS SUMMARY ======== -->
-
-<!-- ======== END NESTED CLASS SUMMARY ======== -->
-
-
-<!-- =========== FIELD SUMMARY =========== -->
-
- <A NAME="field_summary"><!-- --></A>
- <TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" WIDTH="100%">
- <TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
- <TD COLSPAN=2><FONT SIZE="+2">
- <B>Field Summary</B></FONT></TD>
- </TR>
-
- <!-- This is one instance field summary -->
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
- <CODE> Object</CODE></FONT></TD>
- <TD><CODE><B><A HREF="#cleanup">cleanup</A></B></CODE>
- <BR>
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
- <CODE> Object</CODE></FONT></TD>
- <TD><CODE><B><A HREF="#hasMouseMoved">hasMouseMoved</A></B></CODE>
- <BR>
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
- <CODE> Object</CODE></FONT></TD>
- <TD><CODE><B><A HREF="#isTinyMCE_Control">isTinyMCE_Control</A></B></CODE>
- <BR>
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
- <CODE> Object</CODE></FONT></TD>
- <TD><CODE><B><A HREF="#plugins">plugins</A></B></CODE>
- <BR>
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
- <CODE> Object</CODE></FONT></TD>
- <TD><CODE><B><A HREF="#selection">selection</A></B></CODE>
- <BR>
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
- <CODE> Object</CODE></FONT></TD>
- <TD><CODE><B><A HREF="#settings">settings</A></B></CODE>
- <BR>
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
- <CODE> Object</CODE></FONT></TD>
- <TD><CODE><B><A HREF="#shortcuts">shortcuts</A></B></CODE>
- <BR>
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
- <CODE> Object</CODE></FONT></TD>
- <TD><CODE><B><A HREF="#undoRedo">undoRedo</A></B></CODE>
- <BR>
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
- <CODE> Object</CODE></FONT></TD>
- <TD><CODE><B><A HREF="#undoRedoLevel">undoRedoLevel</A></B></CODE>
- <BR>
- </TD>
- </TR>
-
-
- </TABLE>
-
-
-
-
-
-<!-- =========== END FIELD SUMMARY =========== -->
-
-
-<!-- ======== CONSTRUCTOR SUMMARY ======== -->
-
-<A NAME="constructor_summary"><!-- --></A>
-<TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" WIDTH="100%">
-<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
-<TD COLSPAN=2><FONT SIZE="+2">
-<B>Constructor Summary</B></FONT></TD>
-</TR>
-<TR BGCOLOR="white" CLASS="TableRowColor">
- <TD>
- <CODE>
- <B>
- <A HREF="TinyMCE_Control.html#TinyMCE_Control()">TinyMCE_Control</A>
- </B>
- (<Array> settings)
- </CODE>
- <BR>
-
- This is the TinyMCE editor control instance class.
- </TD>
-</TR>
-</TABLE>
-
-<!-- ======== END CONSTRUCTOR SUMMARY ======== -->
-
-
-
-<!-- ========== METHOD SUMMARY =========== -->
-
-<A NAME="method_summary"><!-- --></A>
-<TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" WIDTH="100%">
-<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
-<TD COLSPAN=2><FONT SIZE="+2">
-<B>Method Summary</B></FONT></TD>
-</TR>
-
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> void</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#addPlugin">addPlugin</A></B>(<string> n, p)
- </CODE>
- <BR>
-
- Adds a plugin to the editor instance.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> boolean</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#addShortcut">addShortcut</A></B>(<string> m, <Object> k, <string> d, <string> cmd, <boolean> ui, <Object> va)
- </CODE>
- <BR>
-
- Adds a keyboard shortcut to a specific command.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> void</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#autoResetDesignMode">autoResetDesignMode</A></B>()
- </CODE>
- <BR>
-
- Auto resets the design mode of the document if it gets lost.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> Object</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#execCommand">execCommand</A></B>(<string> command, <boolean> user_interface, <mixed> value)
- </CODE>
- <BR>
-
- Executes a command on the current instance.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> HTMLElement</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#getBody">getBody</A></B>()
- </CODE>
- <BR>
-
- Returns the body element of a editor instance.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> DOMDocument</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#getDoc">getDoc</A></B>()
- </CODE>
- <BR>
-
- Returns the DOM document of a editor instance.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> HTMLElement</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#getFocusElement">getFocusElement</A></B>()
- </CODE>
- <BR>
-
- Returns the currently selected element.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> DOMRange</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#getRng">getRng</A></B>()
- </CODE>
- <BR>
-
- Returns the browsers selections first range instance.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> DOMSelection</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#getSel">getSel</A></B>()
- </CODE>
- <BR>
-
- Returns the browsers selection instance.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> Window</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#getWin">getWin</A></B>()
- </CODE>
- <BR>
-
- Returns the window of a editor instance.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> boolean</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#handleShortcut">handleShortcut</A></B>(<DOMEvent> e)
- </CODE>
- <BR>
-
- Executes shortcuts based on the event information.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> boolean</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#hasPlugin">hasPlugin</A></B>(<string> n)
- </CODE>
- <BR>
-
- Returns true/false if the instance has the current plugin available.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> boolean</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#isDirty">isDirty</A></B>()
- </CODE>
- <BR>
-
- Returns true/false if the editor instance is dirty or not.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> boolean</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#isHidden">isHidden</A></B>()
- </CODE>
- <BR>
-
- Returns if the instance is hidden or not.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> boolean</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#queryCommandState">queryCommandState</A></B>(<string> c)
- </CODE>
- <BR>
-
- Returns a command specific state, for example if bold is enabled or not.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> mixed</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#queryCommandValue">queryCommandValue</A></B>(<string> c)
- </CODE>
- <BR>
-
- Returns a command specific value, for example the current font size.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> void</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#repaint">repaint</A></B>()
- </CODE>
- <BR>
-
- Repaints the editarea in Gecko browsers.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> void</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#setBaseHREF">setBaseHREF</A></B>(<string> u)
- </CODE>
- <BR>
-
- Sets the base href url of the current document instance.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> void</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#switchSettings">switchSettings</A></B>()
- </CODE>
- <BR>
-
- Switches the global TinyMCE settings to the current instance settings.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> void</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#triggerSave">triggerSave</A></B>(<boolean> skip_cleanup, <boolean> skip_callback)
- </CODE>
- <BR>
-
- Moves the contents from the TinyMCE editor control instance to the hidden textarea
- that got replaced with TinyMCE.
- </TD>
- </TR>
-
-
-</TABLE>
-
-
-
-<P>
-<!-- ========== END METHOD SUMMARY =========== -->
-
-
-<!-- ============ FIELD DETAIL START =========== -->
-
- <A NAME="field_detail"><!-- --></A>
- <TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" WIDTH="100%">
- <TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
- <TD COLSPAN=1><FONT SIZE="+2"><B>Field Detail</B></FONT></TD>
- </TR>
- </TABLE>
-
-
- <A NAME="cleanup"><!-- --></A>
- <H3>cleanup</H3>
- <PRE>Object <B>cleanup</B></PRE>
- <UL>
-
-
- </UL>
- <HR>
-
- <A NAME="hasMouseMoved"><!-- --></A>
- <H3>hasMouseMoved</H3>
- <PRE>Object <B>hasMouseMoved</B></PRE>
- <UL>
-
-
- </UL>
- <HR>
-
- <A NAME="isTinyMCE_Control"><!-- --></A>
- <H3>isTinyMCE_Control</H3>
- <PRE>Object <B>isTinyMCE_Control</B></PRE>
- <UL>
-
-
- </UL>
- <HR>
-
- <A NAME="plugins"><!-- --></A>
- <H3>plugins</H3>
- <PRE>Object <B>plugins</B></PRE>
- <UL>
-
-
- </UL>
- <HR>
-
- <A NAME="selection"><!-- --></A>
- <H3>selection</H3>
- <PRE>Object <B>selection</B></PRE>
- <UL>
-
-
- </UL>
- <HR>
-
- <A NAME="settings"><!-- --></A>
- <H3>settings</H3>
- <PRE>Object <B>settings</B></PRE>
- <UL>
-
-
- </UL>
- <HR>
-
- <A NAME="shortcuts"><!-- --></A>
- <H3>shortcuts</H3>
- <PRE>Object <B>shortcuts</B></PRE>
- <UL>
-
-
- </UL>
- <HR>
-
- <A NAME="undoRedo"><!-- --></A>
- <H3>undoRedo</H3>
- <PRE>Object <B>undoRedo</B></PRE>
- <UL>
-
-
- </UL>
- <HR>
-
- <A NAME="undoRedoLevel"><!-- --></A>
- <H3>undoRedoLevel</H3>
- <PRE>Object <B>undoRedoLevel</B></PRE>
- <UL>
-
-
- </UL>
- <HR>
-
-
-
-<!-- ============ FIELD DETAIL END =========== -->
-
- <!-- ========= CONSTRUCTOR DETAIL START ======== -->
-
-<A NAME="constructor_detail"><!-- --></A>
-<TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" WIDTH="100%">
- <TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
- <TD COLSPAN=1>
- <FONT SIZE="+2"><B>Constructor Detail</B></FONT>
- </TD>
- </TR>
-</TABLE>
-
-<A NAME="TinyMCE_Control()"><!-- --></A><H3>
-TinyMCE_Control</H3>
-<PRE><B>TinyMCE_Control</B>(<Array> settings)</PRE>
-
-
-<UL>
- This is the TinyMCE editor control instance class. A instance of this class will is made for each
- converted text area.
-</UL>
-
-
-
- <UL>
- <B>Parameters:</B>
-
- <UL><CODE>settings</CODE> - Name/Value array of instance specific configuration settings.
- </UL>
-
-
- </UL>
-
-
-<!-- Constructor return value(s) -->
-
-<!-- End constructor return value(s) -->
-
-<!-- ADDITIONAL ATTRIBUTES -->
-
-<HR/>
-<!-- END ADDITIONAL ATTRIBUTES -->
-
-<!-- ========= CONSTRUCTOR DETAIL END ======== -->
-
-
-<!-- ============ METHOD DETAIL START ========== -->
-
-<A NAME="method_detail"><!-- --></A>
-<TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" WIDTH="100%">
- <TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
- <TD COLSPAN=1><FONT SIZE="+2">
- <B>Method Detail</B></FONT>
- </TD>
- </TR>
-</TABLE>
-
-<!-- One single method detail entry -->
-
- <A NAME="addPlugin"><!-- --></A>
- <H3>addPlugin</H3>
- <PRE>void <B>addPlugin</B>(<string> n, p)</PRE>
-
- <UL>Adds a plugin to the editor instance. This will also add it globaly.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <UL>
- <B>Parameters:</B>
-
- <UL><CODE>n</CODE> - Plugin name to check for.
- </UL>
-
- <UL><CODE>n</CODE> - TinyMCE plugin instance.
- </UL>
-
- </UL>
-
- <!-- METHOD PARAMETERS END -->
-
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="addShortcut"><!-- --></A>
- <H3>addShortcut</H3>
- <PRE>boolean <B>addShortcut</B>(<string> m, <Object> k, <string> d, <string> cmd, <boolean> ui, <Object> va)</PRE>
-
- <UL>Adds a keyboard shortcut to a specific command. These shortcuts can for example be added
- at the initInstance callback of a plugin. The shortcut description can be a language variable name
- or a string describing the function. If you don't specify a command, the shortcut will simply be a blocker
- shortcut. This enables you to remove built in shortcuts or remove theme specific shortcuts from a plugin.<br />
- Example shortcut inst.addShortcut('ctrl,alt', 'k', 'mceSomeCommand', false, 'somevalue');
- Example blocker inst.addShortcut('ctrl,alt', 'k');</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <UL>
- <B>Parameters:</B>
-
- <UL><CODE>m</CODE> - List of shortcut modifiers keys, for example "ctrl,alt".
- </UL>
-
- <UL><CODE>k</CODE> - Shortcut key char for example "s" or a keycode value "13".
- </UL>
-
- <UL><CODE>d</CODE> - Optional Shortcut description, this will be presented in the about dialog.
- </UL>
-
- <UL><CODE>cmd</CODE> - Optional Command name to execute, for example mceLink or Bold.
- </UL>
-
- <UL><CODE>ui</CODE> - Optional True/false state if a UI (dialog) should be presented or not.
- </UL>
-
- <UL><CODE>va</CODE> - Optional command value, this can be anything.
- </UL>
-
- </UL>
-
- <!-- METHOD PARAMETERS END -->
-
-
- <UL>
- <B>Returns:</B>
- <UL>
- true/false if the shortcut was added or not
- </UL>
- </UL>
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="autoResetDesignMode"><!-- --></A>
- <H3>autoResetDesignMode</H3>
- <PRE>void <B>autoResetDesignMode</B>()</PRE>
-
- <UL>Auto resets the design mode of the document if it gets lost.
- This is a Gecko specific function since it's a workaround for a bug where Gecko browsers
- loose the designMode state if the editor is hidden and shown in a tab or div.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <!-- METHOD PARAMETERS END -->
-
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="execCommand"><!-- --></A>
- <H3>execCommand</H3>
- <PRE>Object <B>execCommand</B>(<string> command, <boolean> user_interface, <mixed> value)</PRE>
-
- <UL>Executes a command on the current instance. These commands can be TinyMCE internal commands prefixed with "mce" or
- they can be build in browser commands such as "Bold". A compleate list of browser commands is available on MSDN or Mozilla.org.
- This function will dispatch the execCommand function on each plugin, theme or the execcommand_callback option if none of these
- return true it will handle the command as a internal browser command.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <UL>
- <B>Parameters:</B>
-
- <UL><CODE>command</CODE> - Command name to execute, for example mceLink or Bold.
- </UL>
-
- <UL><CODE>user_interface</CODE> - True/false state if a UI (dialog) should be presented or not.
- </UL>
-
- <UL><CODE>value</CODE> - Optional command value, this can be anything.
- </UL>
-
- </UL>
-
- <!-- METHOD PARAMETERS END -->
-
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="getBody"><!-- --></A>
- <H3>getBody</H3>
- <PRE>HTMLElement <B>getBody</B>()</PRE>
-
- <UL>Returns the body element of a editor instance.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <!-- METHOD PARAMETERS END -->
-
-
- <UL>
- <B>Returns:</B>
- <UL>
- Body element of a editor instance.
- </UL>
- </UL>
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="getDoc"><!-- --></A>
- <H3>getDoc</H3>
- <PRE>DOMDocument <B>getDoc</B>()</PRE>
-
- <UL>Returns the DOM document of a editor instance.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <!-- METHOD PARAMETERS END -->
-
-
- <UL>
- <B>Returns:</B>
- <UL>
- DOM document of a editor instance.
- </UL>
- </UL>
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="getFocusElement"><!-- --></A>
- <H3>getFocusElement</H3>
- <PRE>HTMLElement <B>getFocusElement</B>()</PRE>
-
- <UL>Returns the currently selected element. This is was added for compatiblity and is deprecated.
- Please use inst.selection.getFocusElement instead.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <!-- METHOD PARAMETERS END -->
-
-
- <UL>
- <B>Returns:</B>
- <UL>
- Currently selected element.
- </UL>
- </UL>
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <UL>
- <B>Deprecated</B> <I></I><BR/><BR/>
- </UL>
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="getRng"><!-- --></A>
- <H3>getRng</H3>
- <PRE>DOMRange <B>getRng</B>()</PRE>
-
- <UL>Returns the browsers selections first range instance. This is was added for compatiblity and is deprecated.
- Please use inst.selection.getRng instead.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <!-- METHOD PARAMETERS END -->
-
-
- <UL>
- <B>Returns:</B>
- <UL>
- Browsers selections first range instance.
- </UL>
- </UL>
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <UL>
- <B>Deprecated</B> <I></I><BR/><BR/>
- </UL>
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="getSel"><!-- --></A>
- <H3>getSel</H3>
- <PRE>DOMSelection <B>getSel</B>()</PRE>
-
- <UL>Returns the browsers selection instance. This is was added for compatiblity and is deprecated.
- Please use inst.selection.getSel instead.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <!-- METHOD PARAMETERS END -->
-
-
- <UL>
- <B>Returns:</B>
- <UL>
- Browser selection instance.
- </UL>
- </UL>
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <UL>
- <B>Deprecated</B> <I></I><BR/><BR/>
- </UL>
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="getWin"><!-- --></A>
- <H3>getWin</H3>
- <PRE>Window <B>getWin</B>()</PRE>
-
- <UL>Returns the window of a editor instance.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <!-- METHOD PARAMETERS END -->
-
-
- <UL>
- <B>Returns:</B>
- <UL>
- Window of a editor instance.
- </UL>
- </UL>
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="handleShortcut"><!-- --></A>
- <H3>handleShortcut</H3>
- <PRE>boolean <B>handleShortcut</B>(<DOMEvent> e)</PRE>
-
- <UL>Executes shortcuts based on the event information.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <UL>
- <B>Parameters:</B>
-
- <UL><CODE>e</CODE> - Keyboard event to handle.
- </UL>
-
- </UL>
-
- <!-- METHOD PARAMETERS END -->
-
-
- <UL>
- <B>Returns:</B>
- <UL>
- true/false if the shortcut was found and executed or not.
- </UL>
- </UL>
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="hasPlugin"><!-- --></A>
- <H3>hasPlugin</H3>
- <PRE>boolean <B>hasPlugin</B>(<string> n)</PRE>
-
- <UL>Returns true/false if the instance has the current plugin available.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <UL>
- <B>Parameters:</B>
-
- <UL><CODE>n</CODE> - Plugin name to check for.
- </UL>
-
- </UL>
-
- <!-- METHOD PARAMETERS END -->
-
-
- <UL>
- <B>Returns:</B>
- <UL>
- true/false if the instance has the current plugin available.
- </UL>
- </UL>
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="isDirty"><!-- --></A>
- <H3>isDirty</H3>
- <PRE>boolean <B>isDirty</B>()</PRE>
-
- <UL>Returns true/false if the editor instance is dirty or not. In other words if it has been modified
- or not.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <!-- METHOD PARAMETERS END -->
-
-
- <UL>
- <B>Returns:</B>
- <UL>
- Editor instance dirty state.
- </UL>
- </UL>
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="isHidden"><!-- --></A>
- <H3>isHidden</H3>
- <PRE>boolean <B>isHidden</B>()</PRE>
-
- <UL>Returns if the instance is hidden or not. This is a Gecko specific function
- other browsers will always return false. This function is used to workaround the lost
- designMode bug in Gecko browsers.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <!-- METHOD PARAMETERS END -->
-
-
- <UL>
- <B>Returns:</B>
- <UL>
- Returns if the instance is hidden or not.
- </UL>
- </UL>
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="queryCommandState"><!-- --></A>
- <H3>queryCommandState</H3>
- <PRE>boolean <B>queryCommandState</B>(<string> c)</PRE>
-
- <UL>Returns a command specific state, for example if bold is enabled or not.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <UL>
- <B>Parameters:</B>
-
- <UL><CODE>c</CODE> - Command to query state from.
- </UL>
-
- </UL>
-
- <!-- METHOD PARAMETERS END -->
-
-
- <UL>
- <B>Returns:</B>
- <UL>
- Command specific state, for example if bold is enabled or not.
- </UL>
- </UL>
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="queryCommandValue"><!-- --></A>
- <H3>queryCommandValue</H3>
- <PRE>mixed <B>queryCommandValue</B>(<string> c)</PRE>
-
- <UL>Returns a command specific value, for example the current font size.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <UL>
- <B>Parameters:</B>
-
- <UL><CODE>c</CODE> - Command to query value from.
- </UL>
-
- </UL>
-
- <!-- METHOD PARAMETERS END -->
-
-
- <UL>
- <B>Returns:</B>
- <UL>
- Command specific value, for example the current font size.
- </UL>
- </UL>
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="repaint"><!-- --></A>
- <H3>repaint</H3>
- <PRE>void <B>repaint</B>()</PRE>
-
- <UL>Repaints the editarea in Gecko browsers. This method removes ghost resize handlers
- and other trailing graphics.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <!-- METHOD PARAMETERS END -->
-
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="setBaseHREF"><!-- --></A>
- <H3>setBaseHREF</H3>
- <PRE>void <B>setBaseHREF</B>(<string> u)</PRE>
-
- <UL>Sets the base href url of the current document instance. This method is used
- to temporarly remove the base url during copy/paste and drag/drop operations
- of relative links from external sites into TinyMCE. MSIE has a bug and converts
- relative links from external sites to absolute links incorrectly.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <UL>
- <B>Parameters:</B>
-
- <UL><CODE>u</CODE> - URL to set as base URL or null to remove it.
- </UL>
-
- </UL>
-
- <!-- METHOD PARAMETERS END -->
-
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="switchSettings"><!-- --></A>
- <H3>switchSettings</H3>
- <PRE>void <B>switchSettings</B>()</PRE>
-
- <UL>Switches the global TinyMCE settings to the current instance settings. This method is
- used to handle multiple configurations.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <!-- METHOD PARAMETERS END -->
-
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="triggerSave"><!-- --></A>
- <H3>triggerSave</H3>
- <PRE>void <B>triggerSave</B>(<boolean> skip_cleanup, <boolean> skip_callback)</PRE>
-
- <UL>Moves the contents from the TinyMCE editor control instance to the hidden textarea
- that got replaced with TinyMCE. This is executed automaticly on for example form submit unless you configure otherwice.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <UL>
- <B>Parameters:</B>
-
- <UL><CODE>skip_cleanup</CODE> - Optional Skip cleanup, simply move the contents as fast as possible.
- </UL>
-
- <UL><CODE>skip_callback</CODE> - Optional Skip callback, don't call the save_callback function.
- </UL>
-
- </UL>
-
- <!-- METHOD PARAMETERS END -->
-
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
-
-
-<!-- ============ METHOD DETAIL END ========== -->
-
-<!-- ========= END OF CLASS DATA ========= -->
-
-<!-- ========== START OF NAVBAR ========== -->
-<A NAME="navbar_bottom"><!-- --></A>
-<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0">
-<TR>
-<TD COLSPAN=3 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
-<A NAME="navbar_bottom_firstrow"><!-- --></A>
-<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3">
- <TR ALIGN="center" VALIGN="top">
- <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="overview-summary.html"><FONT CLASS="NavBarFont1"><B>Overview</B></FONT></A> </TD>
- <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="overview-summary-TinyMCE_Control.class.js.html"><FONT CLASS="NavBarFont1"><B>File</B></FONT></A> </TD>
- <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> <FONT CLASS="NavBarFont1Rev"><B>Class</B></FONT> </TD>
- <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="overview-tree.html"><FONT CLASS="NavBarFont1"><b>Tree</b></FONT></A> </TD>
- <!--TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"--> <!--A HREF="deprecated-list.html"--><!--FONT CLASS="NavBarFont1">Deprecated</FONT--><!--/A--><!-- </TD-->
- <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
- <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
- </TR>
-</TABLE>
-</TD>
-<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
-<B></B>
-</EM>
-</TD
-</TR>
-
-<TR>
-<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
- <A HREF="TinyMCE_Cleanup.html"><B>PREV CLASS</B></A><!--
- NEXT CLASS
--->
- <A HREF="TinyMCE_Engine.html"><B>NEXT CLASS</B></A></FONT></TD>
-<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
- <A HREF="index.html" TARGET="_top"><B>FRAMES</B></A>
- <A HREF="TinyMCE_Control.html" TARGET="_top"><B>NO FRAMES</B></A>
-
-<SCRIPT>
- <!--
- if(window==top) {
- document.writeln('<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>');
- }
- //-->
-</SCRIPT>
-<NOSCRIPT>
-<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>
-</NOSCRIPT>
-</FONT></TD>
-</TR>
-<TR>
-<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
- SUMMARY: <A HREF="#field_summary">FIELD</A> | <A HREF="#constructor_summary">CONSTR</A> | <A HREF="#method_summary">METHOD</A></FONT></TD>
-<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
-DETAIL: <A HREF="#field_detail">FIELD</A> | <A HREF="#constructor_detail">CONSTR</A> | <A HREF="#method_detail">METHOD</A></FONT></TD>
-</TR>
-</TABLE>
-
-<!-- =========== END OF NAVBAR =========== -->
-
-<HR>
-<FONT SIZE="-1">
-
-</FONT>
-<div class="jsdoc_ctime">Documentation generated by <a href="http://jsdoc.sourceforge.net/" target="_parent">JSDoc</a> on Fri Apr 14 21:59:23 2006</div>
-</BODY>
-</HTML>
Copied: trunk/htdocs/js/tinymce/docs/tinymce_api/TinyMCE_Control.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/tinymce_api/TinyMCE_Control.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/tinymce_api/TinyMCE_Control.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/tinymce_api/TinyMCE_Control.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,1387 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN""http://www.w3.org/TR/REC-html40/loose.dtd">
+<!--NewPage-->
+<HTML>
+<HEAD>
+<TITLE>
+TinyMCE_Control
+</TITLE>
+<LINK REL ="stylesheet" TYPE="text/css" HREF="stylesheet.css" TITLE="Style">
+</HEAD>
+<SCRIPT>
+function asd()
+{
+parent.document.title="TinyMCE_Control";
+}
+</SCRIPT>
+<BODY BGCOLOR="white" onload="asd();">
+
+<!-- ========== START OF NAVBAR ========== -->
+<A NAME="navbar_bottom"><!-- --></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0">
+<TR>
+<TD COLSPAN=3 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_bottom_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3">
+ <TR ALIGN="center" VALIGN="top">
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="overview-summary.html"><FONT CLASS="NavBarFont1"><B>Overview</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="overview-summary-TinyMCE_Control.class.js.html"><FONT CLASS="NavBarFont1"><B>File</B></FONT></A> </TD>
+ <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> <FONT CLASS="NavBarFont1Rev"><B>Class</B></FONT> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="overview-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A> </TD>
+ <!--TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"--> <!--A HREF="deprecated-list.html"--><!--FONT CLASS="NavBarFont1">Deprecated</FONT--><!--/A--><!-- </TD-->
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="index-all.html"--><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
+ </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+<B></B>
+</EM>
+</TD
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="TinyMCE_Cleanup.html"><B>PREV CLASS</B></A><!--
+ NEXT CLASS
+-->
+ <A HREF="TinyMCE_Engine.html"><B>NEXT CLASS</B></A></FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="index.html" TARGET="_top"><B>FRAMES</B></A>
+ <A HREF="TinyMCE_Control.html" TARGET="_top"><B>NO FRAMES</B></A>
+
+<SCRIPT>
+ <!--
+ if(window==top) {
+ document.writeln('<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>');
+ }
+ //-->
+</SCRIPT>
+<NOSCRIPT>
+<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>
+</NOSCRIPT>
+</FONT></TD>
+</TR>
+<TR>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+ SUMMARY: <A HREF="#field_summary">FIELD</A> | <A HREF="#constructor_summary">CONSTR</A> | <A HREF="#method_summary">METHOD</A></FONT></TD>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+DETAIL: <A HREF="#field_detail">FIELD</A> | <A HREF="#constructor_detail">CONSTR</A> | <A HREF="#method_detail">METHOD</A></FONT></TD>
+</TR>
+</TABLE>
+<!-- =========== END OF NAVBAR =========== -->
+<HR>
+
+<!-- ======== START OF CLASS DATA ======== -->
+<H2>Class TinyMCE_Control</H2>
+<PRE>Object
+ |
+ +--<b>TinyMCE_Control</b>
+</PRE>
+
+
+<HR>
+<DL>
+ <!-- Class definition -->
+ <DT>class
+ <B>TinyMCE_Control</B>
+
+
+</DL>
+
+ <P>
+ <I>Defined in <a href='overview-summary-TinyMCE_Control.class.js.html'>TinyMCE_Control.class.js</a></I><BR/><BR/>
+ </P>
+
+ <HR>
+
+<!-- ======== NESTED CLASS SUMMARY ======== -->
+
+<!-- ======== END NESTED CLASS SUMMARY ======== -->
+
+
+<!-- =========== FIELD SUMMARY =========== -->
+
+ <A NAME="field_summary"><!-- --></A>
+ <TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" WIDTH="100%">
+ <TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+ <TD COLSPAN=2><FONT SIZE="+2">
+ <B>Field Summary</B></FONT></TD>
+ </TR>
+
+ <!-- This is one instance field summary -->
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+ <CODE> Object</CODE></FONT></TD>
+ <TD><CODE><B><A HREF="#cleanup">cleanup</A></B></CODE>
+ <BR>
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+ <CODE> Object</CODE></FONT></TD>
+ <TD><CODE><B><A HREF="#hasMouseMoved">hasMouseMoved</A></B></CODE>
+ <BR>
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+ <CODE> Object</CODE></FONT></TD>
+ <TD><CODE><B><A HREF="#isTinyMCE_Control">isTinyMCE_Control</A></B></CODE>
+ <BR>
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+ <CODE> Object</CODE></FONT></TD>
+ <TD><CODE><B><A HREF="#plugins">plugins</A></B></CODE>
+ <BR>
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+ <CODE> Object</CODE></FONT></TD>
+ <TD><CODE><B><A HREF="#selection">selection</A></B></CODE>
+ <BR>
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+ <CODE> Object</CODE></FONT></TD>
+ <TD><CODE><B><A HREF="#settings">settings</A></B></CODE>
+ <BR>
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+ <CODE> Object</CODE></FONT></TD>
+ <TD><CODE><B><A HREF="#shortcuts">shortcuts</A></B></CODE>
+ <BR>
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+ <CODE> Object</CODE></FONT></TD>
+ <TD><CODE><B><A HREF="#undoRedo">undoRedo</A></B></CODE>
+ <BR>
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+ <CODE> Object</CODE></FONT></TD>
+ <TD><CODE><B><A HREF="#undoRedoLevel">undoRedoLevel</A></B></CODE>
+ <BR>
+ </TD>
+ </TR>
+
+
+ </TABLE>
+
+
+
+
+
+<!-- =========== END FIELD SUMMARY =========== -->
+
+
+<!-- ======== CONSTRUCTOR SUMMARY ======== -->
+
+<A NAME="constructor_summary"><!-- --></A>
+<TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" WIDTH="100%">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TD COLSPAN=2><FONT SIZE="+2">
+<B>Constructor Summary</B></FONT></TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="TinyMCE_Control.html#TinyMCE_Control()">TinyMCE_Control</A>
+ </B>
+ (<Array> settings)
+ </CODE>
+ <BR>
+
+ This is the TinyMCE editor control instance class.
+ </TD>
+</TR>
+</TABLE>
+
+<!-- ======== END CONSTRUCTOR SUMMARY ======== -->
+
+
+
+<!-- ========== METHOD SUMMARY =========== -->
+
+<A NAME="method_summary"><!-- --></A>
+<TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" WIDTH="100%">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TD COLSPAN=2><FONT SIZE="+2">
+<B>Method Summary</B></FONT></TD>
+</TR>
+
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> void</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#addPlugin">addPlugin</A></B>(<string> n, p)
+ </CODE>
+ <BR>
+
+ Adds a plugin to the editor instance.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> boolean</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#addShortcut">addShortcut</A></B>(<string> m, <Object> k, <string> d, <string> cmd, <boolean> ui, <Object> va)
+ </CODE>
+ <BR>
+
+ Adds a keyboard shortcut to a specific command.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> void</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#autoResetDesignMode">autoResetDesignMode</A></B>()
+ </CODE>
+ <BR>
+
+ Auto resets the design mode of the document if it gets lost.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> Object</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#execCommand">execCommand</A></B>(<string> command, <boolean> user_interface, <mixed> value)
+ </CODE>
+ <BR>
+
+ Executes a command on the current instance.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> HTMLElement</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#getBody">getBody</A></B>()
+ </CODE>
+ <BR>
+
+ Returns the body element of a editor instance.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> DOMDocument</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#getDoc">getDoc</A></B>()
+ </CODE>
+ <BR>
+
+ Returns the DOM document of a editor instance.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> HTMLElement</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#getFocusElement">getFocusElement</A></B>()
+ </CODE>
+ <BR>
+
+ Returns the currently selected element.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> DOMRange</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#getRng">getRng</A></B>()
+ </CODE>
+ <BR>
+
+ Returns the browsers selections first range instance.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> DOMSelection</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#getSel">getSel</A></B>()
+ </CODE>
+ <BR>
+
+ Returns the browsers selection instance.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> Window</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#getWin">getWin</A></B>()
+ </CODE>
+ <BR>
+
+ Returns the window of a editor instance.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> boolean</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#handleShortcut">handleShortcut</A></B>(<DOMEvent> e)
+ </CODE>
+ <BR>
+
+ Executes shortcuts based on the event information.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> boolean</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#hasPlugin">hasPlugin</A></B>(<string> n)
+ </CODE>
+ <BR>
+
+ Returns true/false if the instance has the current plugin available.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> boolean</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#isDirty">isDirty</A></B>()
+ </CODE>
+ <BR>
+
+ Returns true/false if the editor instance is dirty or not.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> boolean</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#isHidden">isHidden</A></B>()
+ </CODE>
+ <BR>
+
+ Returns if the instance is hidden or not.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> boolean</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#queryCommandState">queryCommandState</A></B>(<string> c)
+ </CODE>
+ <BR>
+
+ Returns a command specific state, for example if bold is enabled or not.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> mixed</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#queryCommandValue">queryCommandValue</A></B>(<string> c)
+ </CODE>
+ <BR>
+
+ Returns a command specific value, for example the current font size.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> void</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#repaint">repaint</A></B>()
+ </CODE>
+ <BR>
+
+ Repaints the editarea in Gecko browsers.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> void</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#setBaseHREF">setBaseHREF</A></B>(<string> u)
+ </CODE>
+ <BR>
+
+ Sets the base href url of the current document instance.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> void</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#switchSettings">switchSettings</A></B>()
+ </CODE>
+ <BR>
+
+ Switches the global TinyMCE settings to the current instance settings.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> void</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#triggerSave">triggerSave</A></B>(<boolean> skip_cleanup, <boolean> skip_callback)
+ </CODE>
+ <BR>
+
+ Moves the contents from the TinyMCE editor control instance to the hidden textarea
+ that got replaced with TinyMCE.
+ </TD>
+ </TR>
+
+
+</TABLE>
+
+
+
+<P>
+<!-- ========== END METHOD SUMMARY =========== -->
+
+
+<!-- ============ FIELD DETAIL START =========== -->
+
+ <A NAME="field_detail"><!-- --></A>
+ <TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" WIDTH="100%">
+ <TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+ <TD COLSPAN=1><FONT SIZE="+2"><B>Field Detail</B></FONT></TD>
+ </TR>
+ </TABLE>
+
+
+ <A NAME="cleanup"><!-- --></A>
+ <H3>cleanup</H3>
+ <PRE>Object <B>cleanup</B></PRE>
+ <UL>
+
+
+ </UL>
+ <HR>
+
+ <A NAME="hasMouseMoved"><!-- --></A>
+ <H3>hasMouseMoved</H3>
+ <PRE>Object <B>hasMouseMoved</B></PRE>
+ <UL>
+
+
+ </UL>
+ <HR>
+
+ <A NAME="isTinyMCE_Control"><!-- --></A>
+ <H3>isTinyMCE_Control</H3>
+ <PRE>Object <B>isTinyMCE_Control</B></PRE>
+ <UL>
+
+
+ </UL>
+ <HR>
+
+ <A NAME="plugins"><!-- --></A>
+ <H3>plugins</H3>
+ <PRE>Object <B>plugins</B></PRE>
+ <UL>
+
+
+ </UL>
+ <HR>
+
+ <A NAME="selection"><!-- --></A>
+ <H3>selection</H3>
+ <PRE>Object <B>selection</B></PRE>
+ <UL>
+
+
+ </UL>
+ <HR>
+
+ <A NAME="settings"><!-- --></A>
+ <H3>settings</H3>
+ <PRE>Object <B>settings</B></PRE>
+ <UL>
+
+
+ </UL>
+ <HR>
+
+ <A NAME="shortcuts"><!-- --></A>
+ <H3>shortcuts</H3>
+ <PRE>Object <B>shortcuts</B></PRE>
+ <UL>
+
+
+ </UL>
+ <HR>
+
+ <A NAME="undoRedo"><!-- --></A>
+ <H3>undoRedo</H3>
+ <PRE>Object <B>undoRedo</B></PRE>
+ <UL>
+
+
+ </UL>
+ <HR>
+
+ <A NAME="undoRedoLevel"><!-- --></A>
+ <H3>undoRedoLevel</H3>
+ <PRE>Object <B>undoRedoLevel</B></PRE>
+ <UL>
+
+
+ </UL>
+ <HR>
+
+
+
+<!-- ============ FIELD DETAIL END =========== -->
+
+ <!-- ========= CONSTRUCTOR DETAIL START ======== -->
+
+<A NAME="constructor_detail"><!-- --></A>
+<TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" WIDTH="100%">
+ <TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+ <TD COLSPAN=1>
+ <FONT SIZE="+2"><B>Constructor Detail</B></FONT>
+ </TD>
+ </TR>
+</TABLE>
+
+<A NAME="TinyMCE_Control()"><!-- --></A><H3>
+TinyMCE_Control</H3>
+<PRE><B>TinyMCE_Control</B>(<Array> settings)</PRE>
+
+
+<UL>
+ This is the TinyMCE editor control instance class. A instance of this class will is made for each
+ converted text area.
+</UL>
+
+
+
+ <UL>
+ <B>Parameters:</B>
+
+ <UL><CODE>settings</CODE> - Name/Value array of instance specific configuration settings.
+ </UL>
+
+
+ </UL>
+
+
+<!-- Constructor return value(s) -->
+
+<!-- End constructor return value(s) -->
+
+<!-- ADDITIONAL ATTRIBUTES -->
+
+<HR/>
+<!-- END ADDITIONAL ATTRIBUTES -->
+
+<!-- ========= CONSTRUCTOR DETAIL END ======== -->
+
+
+<!-- ============ METHOD DETAIL START ========== -->
+
+<A NAME="method_detail"><!-- --></A>
+<TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" WIDTH="100%">
+ <TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+ <TD COLSPAN=1><FONT SIZE="+2">
+ <B>Method Detail</B></FONT>
+ </TD>
+ </TR>
+</TABLE>
+
+<!-- One single method detail entry -->
+
+ <A NAME="addPlugin"><!-- --></A>
+ <H3>addPlugin</H3>
+ <PRE>void <B>addPlugin</B>(<string> n, p)</PRE>
+
+ <UL>Adds a plugin to the editor instance. This will also add it globaly.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <UL>
+ <B>Parameters:</B>
+
+ <UL><CODE>n</CODE> - Plugin name to check for.
+ </UL>
+
+ <UL><CODE>n</CODE> - TinyMCE plugin instance.
+ </UL>
+
+ </UL>
+
+ <!-- METHOD PARAMETERS END -->
+
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="addShortcut"><!-- --></A>
+ <H3>addShortcut</H3>
+ <PRE>boolean <B>addShortcut</B>(<string> m, <Object> k, <string> d, <string> cmd, <boolean> ui, <Object> va)</PRE>
+
+ <UL>Adds a keyboard shortcut to a specific command. These shortcuts can for example be added
+ at the initInstance callback of a plugin. The shortcut description can be a language variable name
+ or a string describing the function. If you don't specify a command, the shortcut will simply be a blocker
+ shortcut. This enables you to remove built in shortcuts or remove theme specific shortcuts from a plugin.<br />
+ Example shortcut inst.addShortcut('ctrl,alt', 'k', 'mceSomeCommand', false, 'somevalue');
+ Example blocker inst.addShortcut('ctrl,alt', 'k');</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <UL>
+ <B>Parameters:</B>
+
+ <UL><CODE>m</CODE> - List of shortcut modifiers keys, for example "ctrl,alt".
+ </UL>
+
+ <UL><CODE>k</CODE> - Shortcut key char for example "s" or a keycode value "13".
+ </UL>
+
+ <UL><CODE>d</CODE> - Optional Shortcut description, this will be presented in the about dialog.
+ </UL>
+
+ <UL><CODE>cmd</CODE> - Optional Command name to execute, for example mceLink or Bold.
+ </UL>
+
+ <UL><CODE>ui</CODE> - Optional True/false state if a UI (dialog) should be presented or not.
+ </UL>
+
+ <UL><CODE>va</CODE> - Optional command value, this can be anything.
+ </UL>
+
+ </UL>
+
+ <!-- METHOD PARAMETERS END -->
+
+
+ <UL>
+ <B>Returns:</B>
+ <UL>
+ true/false if the shortcut was added or not
+ </UL>
+ </UL>
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="autoResetDesignMode"><!-- --></A>
+ <H3>autoResetDesignMode</H3>
+ <PRE>void <B>autoResetDesignMode</B>()</PRE>
+
+ <UL>Auto resets the design mode of the document if it gets lost.
+ This is a Gecko specific function since it's a workaround for a bug where Gecko browsers
+ loose the designMode state if the editor is hidden and shown in a tab or div.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <!-- METHOD PARAMETERS END -->
+
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="execCommand"><!-- --></A>
+ <H3>execCommand</H3>
+ <PRE>Object <B>execCommand</B>(<string> command, <boolean> user_interface, <mixed> value)</PRE>
+
+ <UL>Executes a command on the current instance. These commands can be TinyMCE internal commands prefixed with "mce" or
+ they can be build in browser commands such as "Bold". A compleate list of browser commands is available on MSDN or Mozilla.org.
+ This function will dispatch the execCommand function on each plugin, theme or the execcommand_callback option if none of these
+ return true it will handle the command as a internal browser command.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <UL>
+ <B>Parameters:</B>
+
+ <UL><CODE>command</CODE> - Command name to execute, for example mceLink or Bold.
+ </UL>
+
+ <UL><CODE>user_interface</CODE> - True/false state if a UI (dialog) should be presented or not.
+ </UL>
+
+ <UL><CODE>value</CODE> - Optional command value, this can be anything.
+ </UL>
+
+ </UL>
+
+ <!-- METHOD PARAMETERS END -->
+
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="getBody"><!-- --></A>
+ <H3>getBody</H3>
+ <PRE>HTMLElement <B>getBody</B>()</PRE>
+
+ <UL>Returns the body element of a editor instance.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <!-- METHOD PARAMETERS END -->
+
+
+ <UL>
+ <B>Returns:</B>
+ <UL>
+ Body element of a editor instance.
+ </UL>
+ </UL>
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="getDoc"><!-- --></A>
+ <H3>getDoc</H3>
+ <PRE>DOMDocument <B>getDoc</B>()</PRE>
+
+ <UL>Returns the DOM document of a editor instance.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <!-- METHOD PARAMETERS END -->
+
+
+ <UL>
+ <B>Returns:</B>
+ <UL>
+ DOM document of a editor instance.
+ </UL>
+ </UL>
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="getFocusElement"><!-- --></A>
+ <H3>getFocusElement</H3>
+ <PRE>HTMLElement <B>getFocusElement</B>()</PRE>
+
+ <UL>Returns the currently selected element. This is was added for compatiblity and is deprecated.
+ Please use inst.selection.getFocusElement instead.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <!-- METHOD PARAMETERS END -->
+
+
+ <UL>
+ <B>Returns:</B>
+ <UL>
+ Currently selected element.
+ </UL>
+ </UL>
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <UL>
+ <B>Deprecated</B> <I></I><BR/><BR/>
+ </UL>
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="getRng"><!-- --></A>
+ <H3>getRng</H3>
+ <PRE>DOMRange <B>getRng</B>()</PRE>
+
+ <UL>Returns the browsers selections first range instance. This is was added for compatiblity and is deprecated.
+ Please use inst.selection.getRng instead.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <!-- METHOD PARAMETERS END -->
+
+
+ <UL>
+ <B>Returns:</B>
+ <UL>
+ Browsers selections first range instance.
+ </UL>
+ </UL>
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <UL>
+ <B>Deprecated</B> <I></I><BR/><BR/>
+ </UL>
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="getSel"><!-- --></A>
+ <H3>getSel</H3>
+ <PRE>DOMSelection <B>getSel</B>()</PRE>
+
+ <UL>Returns the browsers selection instance. This is was added for compatiblity and is deprecated.
+ Please use inst.selection.getSel instead.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <!-- METHOD PARAMETERS END -->
+
+
+ <UL>
+ <B>Returns:</B>
+ <UL>
+ Browser selection instance.
+ </UL>
+ </UL>
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <UL>
+ <B>Deprecated</B> <I></I><BR/><BR/>
+ </UL>
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="getWin"><!-- --></A>
+ <H3>getWin</H3>
+ <PRE>Window <B>getWin</B>()</PRE>
+
+ <UL>Returns the window of a editor instance.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <!-- METHOD PARAMETERS END -->
+
+
+ <UL>
+ <B>Returns:</B>
+ <UL>
+ Window of a editor instance.
+ </UL>
+ </UL>
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="handleShortcut"><!-- --></A>
+ <H3>handleShortcut</H3>
+ <PRE>boolean <B>handleShortcut</B>(<DOMEvent> e)</PRE>
+
+ <UL>Executes shortcuts based on the event information.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <UL>
+ <B>Parameters:</B>
+
+ <UL><CODE>e</CODE> - Keyboard event to handle.
+ </UL>
+
+ </UL>
+
+ <!-- METHOD PARAMETERS END -->
+
+
+ <UL>
+ <B>Returns:</B>
+ <UL>
+ true/false if the shortcut was found and executed or not.
+ </UL>
+ </UL>
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="hasPlugin"><!-- --></A>
+ <H3>hasPlugin</H3>
+ <PRE>boolean <B>hasPlugin</B>(<string> n)</PRE>
+
+ <UL>Returns true/false if the instance has the current plugin available.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <UL>
+ <B>Parameters:</B>
+
+ <UL><CODE>n</CODE> - Plugin name to check for.
+ </UL>
+
+ </UL>
+
+ <!-- METHOD PARAMETERS END -->
+
+
+ <UL>
+ <B>Returns:</B>
+ <UL>
+ true/false if the instance has the current plugin available.
+ </UL>
+ </UL>
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="isDirty"><!-- --></A>
+ <H3>isDirty</H3>
+ <PRE>boolean <B>isDirty</B>()</PRE>
+
+ <UL>Returns true/false if the editor instance is dirty or not. In other words if it has been modified
+ or not.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <!-- METHOD PARAMETERS END -->
+
+
+ <UL>
+ <B>Returns:</B>
+ <UL>
+ Editor instance dirty state.
+ </UL>
+ </UL>
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="isHidden"><!-- --></A>
+ <H3>isHidden</H3>
+ <PRE>boolean <B>isHidden</B>()</PRE>
+
+ <UL>Returns if the instance is hidden or not. This is a Gecko specific function
+ other browsers will always return false. This function is used to workaround the lost
+ designMode bug in Gecko browsers.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <!-- METHOD PARAMETERS END -->
+
+
+ <UL>
+ <B>Returns:</B>
+ <UL>
+ Returns if the instance is hidden or not.
+ </UL>
+ </UL>
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="queryCommandState"><!-- --></A>
+ <H3>queryCommandState</H3>
+ <PRE>boolean <B>queryCommandState</B>(<string> c)</PRE>
+
+ <UL>Returns a command specific state, for example if bold is enabled or not.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <UL>
+ <B>Parameters:</B>
+
+ <UL><CODE>c</CODE> - Command to query state from.
+ </UL>
+
+ </UL>
+
+ <!-- METHOD PARAMETERS END -->
+
+
+ <UL>
+ <B>Returns:</B>
+ <UL>
+ Command specific state, for example if bold is enabled or not.
+ </UL>
+ </UL>
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="queryCommandValue"><!-- --></A>
+ <H3>queryCommandValue</H3>
+ <PRE>mixed <B>queryCommandValue</B>(<string> c)</PRE>
+
+ <UL>Returns a command specific value, for example the current font size.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <UL>
+ <B>Parameters:</B>
+
+ <UL><CODE>c</CODE> - Command to query value from.
+ </UL>
+
+ </UL>
+
+ <!-- METHOD PARAMETERS END -->
+
+
+ <UL>
+ <B>Returns:</B>
+ <UL>
+ Command specific value, for example the current font size.
+ </UL>
+ </UL>
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="repaint"><!-- --></A>
+ <H3>repaint</H3>
+ <PRE>void <B>repaint</B>()</PRE>
+
+ <UL>Repaints the editarea in Gecko browsers. This method removes ghost resize handlers
+ and other trailing graphics.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <!-- METHOD PARAMETERS END -->
+
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="setBaseHREF"><!-- --></A>
+ <H3>setBaseHREF</H3>
+ <PRE>void <B>setBaseHREF</B>(<string> u)</PRE>
+
+ <UL>Sets the base href url of the current document instance. This method is used
+ to temporarly remove the base url during copy/paste and drag/drop operations
+ of relative links from external sites into TinyMCE. MSIE has a bug and converts
+ relative links from external sites to absolute links incorrectly.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <UL>
+ <B>Parameters:</B>
+
+ <UL><CODE>u</CODE> - URL to set as base URL or null to remove it.
+ </UL>
+
+ </UL>
+
+ <!-- METHOD PARAMETERS END -->
+
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="switchSettings"><!-- --></A>
+ <H3>switchSettings</H3>
+ <PRE>void <B>switchSettings</B>()</PRE>
+
+ <UL>Switches the global TinyMCE settings to the current instance settings. This method is
+ used to handle multiple configurations.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <!-- METHOD PARAMETERS END -->
+
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="triggerSave"><!-- --></A>
+ <H3>triggerSave</H3>
+ <PRE>void <B>triggerSave</B>(<boolean> skip_cleanup, <boolean> skip_callback)</PRE>
+
+ <UL>Moves the contents from the TinyMCE editor control instance to the hidden textarea
+ that got replaced with TinyMCE. This is executed automaticly on for example form submit unless you configure otherwice.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <UL>
+ <B>Parameters:</B>
+
+ <UL><CODE>skip_cleanup</CODE> - Optional Skip cleanup, simply move the contents as fast as possible.
+ </UL>
+
+ <UL><CODE>skip_callback</CODE> - Optional Skip callback, don't call the save_callback function.
+ </UL>
+
+ </UL>
+
+ <!-- METHOD PARAMETERS END -->
+
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+
+
+<!-- ============ METHOD DETAIL END ========== -->
+
+<!-- ========= END OF CLASS DATA ========= -->
+
+<!-- ========== START OF NAVBAR ========== -->
+<A NAME="navbar_bottom"><!-- --></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0">
+<TR>
+<TD COLSPAN=3 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_bottom_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3">
+ <TR ALIGN="center" VALIGN="top">
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="overview-summary.html"><FONT CLASS="NavBarFont1"><B>Overview</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="overview-summary-TinyMCE_Control.class.js.html"><FONT CLASS="NavBarFont1"><B>File</B></FONT></A> </TD>
+ <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> <FONT CLASS="NavBarFont1Rev"><B>Class</B></FONT> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="overview-tree.html"><FONT CLASS="NavBarFont1"><b>Tree</b></FONT></A> </TD>
+ <!--TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"--> <!--A HREF="deprecated-list.html"--><!--FONT CLASS="NavBarFont1">Deprecated</FONT--><!--/A--><!-- </TD-->
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
+ </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+<B></B>
+</EM>
+</TD
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="TinyMCE_Cleanup.html"><B>PREV CLASS</B></A><!--
+ NEXT CLASS
+-->
+ <A HREF="TinyMCE_Engine.html"><B>NEXT CLASS</B></A></FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="index.html" TARGET="_top"><B>FRAMES</B></A>
+ <A HREF="TinyMCE_Control.html" TARGET="_top"><B>NO FRAMES</B></A>
+
+<SCRIPT>
+ <!--
+ if(window==top) {
+ document.writeln('<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>');
+ }
+ //-->
+</SCRIPT>
+<NOSCRIPT>
+<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>
+</NOSCRIPT>
+</FONT></TD>
+</TR>
+<TR>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+ SUMMARY: <A HREF="#field_summary">FIELD</A> | <A HREF="#constructor_summary">CONSTR</A> | <A HREF="#method_summary">METHOD</A></FONT></TD>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+DETAIL: <A HREF="#field_detail">FIELD</A> | <A HREF="#constructor_detail">CONSTR</A> | <A HREF="#method_detail">METHOD</A></FONT></TD>
+</TR>
+</TABLE>
+
+<!-- =========== END OF NAVBAR =========== -->
+
+<HR>
+<FONT SIZE="-1">
+
+</FONT>
+<div class="jsdoc_ctime">Documentation generated by <a href="http://jsdoc.sourceforge.net/" target="_parent">JSDoc</a> on Fri Apr 14 21:59:23 2006</div>
+</BODY>
+</HTML>
Deleted: trunk/htdocs/js/tinymce/docs/tinymce_api/TinyMCE_Engine.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/tinymce_api/TinyMCE_Engine.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/tinymce_api/TinyMCE_Engine.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,6390 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN""http://www.w3.org/TR/REC-html40/loose.dtd">
-<!--NewPage-->
-<HTML>
-<HEAD>
-<TITLE>
-TinyMCE_Engine
-</TITLE>
-<LINK REL ="stylesheet" TYPE="text/css" HREF="stylesheet.css" TITLE="Style">
-</HEAD>
-<SCRIPT>
-function asd()
-{
-parent.document.title="TinyMCE_Engine";
-}
-</SCRIPT>
-<BODY BGCOLOR="white" onload="asd();">
-
-<!-- ========== START OF NAVBAR ========== -->
-<A NAME="navbar_bottom"><!-- --></A>
-<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0">
-<TR>
-<TD COLSPAN=3 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
-<A NAME="navbar_bottom_firstrow"><!-- --></A>
-<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3">
- <TR ALIGN="center" VALIGN="top">
- <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="overview-summary.html"><FONT CLASS="NavBarFont1"><B>Overview</B></FONT></A> </TD>
- <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="overview-summary-TinyMCE_Engine.class.js.html"><FONT CLASS="NavBarFont1"><B>File</B></FONT></A> </TD>
- <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> <FONT CLASS="NavBarFont1Rev"><B>Class</B></FONT> </TD>
- <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="overview-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A> </TD>
- <!--TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"--> <!--A HREF="deprecated-list.html"--><!--FONT CLASS="NavBarFont1">Deprecated</FONT--><!--/A--><!-- </TD-->
- <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="index-all.html"--><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
- <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
- </TR>
-</TABLE>
-</TD>
-<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
-<B></B>
-</EM>
-</TD
-</TR>
-
-<TR>
-<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
- <A HREF="TinyMCE_Control.html"><B>PREV CLASS</B></A><!--
- NEXT CLASS
--->
- <A HREF="TinyMCE_Layer.html"><B>NEXT CLASS</B></A></FONT></TD>
-<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
- <A HREF="index.html" TARGET="_top"><B>FRAMES</B></A>
- <A HREF="TinyMCE_Engine.html" TARGET="_top"><B>NO FRAMES</B></A>
-
-<SCRIPT>
- <!--
- if(window==top) {
- document.writeln('<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>');
- }
- //-->
-</SCRIPT>
-<NOSCRIPT>
-<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>
-</NOSCRIPT>
-</FONT></TD>
-</TR>
-<TR>
-<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
- SUMMARY: <A HREF="#field_summary">FIELD</A> | <A HREF="#constructor_summary">CONSTR</A> | <A HREF="#method_summary">METHOD</A></FONT></TD>
-<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
-DETAIL: <A HREF="#field_detail">FIELD</A> | <A HREF="#constructor_detail">CONSTR</A> | <A HREF="#method_detail">METHOD</A></FONT></TD>
-</TR>
-</TABLE>
-<!-- =========== END OF NAVBAR =========== -->
-<HR>
-
-<!-- ======== START OF CLASS DATA ======== -->
-<H2>Class TinyMCE_Engine</H2>
-<PRE>Object
- |
- +--<b>TinyMCE_Engine</b>
-</PRE>
-
-
-<HR>
-<DL>
- <!-- Class definition -->
- <DT>class
- <B>TinyMCE_Engine</B>
-
-
-</DL>
-
- <P>
- <I>Defined in <a href='overview-summary-TinyMCE_Engine.class.js.html'>TinyMCE_Engine.class.js</a></I><BR/><BR/>
- </P>
-
- <HR>
-
-<!-- ======== NESTED CLASS SUMMARY ======== -->
-
-<!-- ======== END NESTED CLASS SUMMARY ======== -->
-
-
-<!-- =========== FIELD SUMMARY =========== -->
-
- <A NAME="field_summary"><!-- --></A>
- <TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" WIDTH="100%">
- <TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
- <TD COLSPAN=2><FONT SIZE="+2">
- <B>Field Summary</B></FONT></TD>
- </TR>
-
- <!-- This is one instance field summary -->
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
- <CODE> Object</CODE></FONT></TD>
- <TD><CODE><B><A HREF="#buttonMap">buttonMap</A></B></CODE>
- <BR>
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
- <CODE> Object</CODE></FONT></TD>
- <TD><CODE><B><A HREF="#configs">configs</A></B></CODE>
- <BR>
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
- <CODE> Object</CODE></FONT></TD>
- <TD><CODE><B><A HREF="#currentConfig">currentConfig</A></B></CODE>
- <BR>
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
- <CODE> Object</CODE></FONT></TD>
- <TD><CODE><B><A HREF="#dialogCounter">dialogCounter</A></B></CODE>
- <BR>
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
- <CODE> Object</CODE></FONT></TD>
- <TD><CODE><B><A HREF="#eventHandlers">eventHandlers</A></B></CODE>
- <BR>
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
- <CODE> Object</CODE></FONT></TD>
- <TD><CODE><B><A HREF="#idCounter">idCounter</A></B></CODE>
- <BR>
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
- <CODE> Object</CODE></FONT></TD>
- <TD><CODE><B><A HREF="#instances">instances</A></B></CODE>
- <BR>
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
- <CODE> Object</CODE></FONT></TD>
- <TD><CODE><B><A HREF="#isGecko">isGecko</A></B></CODE>
- <BR>
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
- <CODE> Object</CODE></FONT></TD>
- <TD><CODE><B><A HREF="#isLoaded">isLoaded</A></B></CODE>
- <BR>
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
- <CODE> Object</CODE></FONT></TD>
- <TD><CODE><B><A HREF="#isMac">isMac</A></B></CODE>
- <BR>
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
- <CODE> Object</CODE></FONT></TD>
- <TD><CODE><B><A HREF="#isMSIE">isMSIE</A></B></CODE>
- <BR>
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
- <CODE> Object</CODE></FONT></TD>
- <TD><CODE><B><A HREF="#isMSIE5">isMSIE5</A></B></CODE>
- <BR>
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
- <CODE> Object</CODE></FONT></TD>
- <TD><CODE><B><A HREF="#isMSIE5_0">isMSIE5_0</A></B></CODE>
- <BR>
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
- <CODE> Object</CODE></FONT></TD>
- <TD><CODE><B><A HREF="#isNS7">isNS7</A></B></CODE>
- <BR>
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
- <CODE> Object</CODE></FONT></TD>
- <TD><CODE><B><A HREF="#isNS71">isNS71</A></B></CODE>
- <BR>
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
- <CODE> Object</CODE></FONT></TD>
- <TD><CODE><B><A HREF="#isOpera">isOpera</A></B></CODE>
- <BR>
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
- <CODE> Object</CODE></FONT></TD>
- <TD><CODE><B><A HREF="#isSafari">isSafari</A></B></CODE>
- <BR>
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
- <CODE> Object</CODE></FONT></TD>
- <TD><CODE><B><A HREF="#loadedFiles">loadedFiles</A></B></CODE>
- <BR>
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
- <CODE> Object</CODE></FONT></TD>
- <TD><CODE><B><A HREF="#loadedPlugins">loadedPlugins</A></B></CODE>
- <BR>
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
- <CODE> Object</CODE></FONT></TD>
- <TD><CODE><B><A HREF="#majorVersion">majorVersion</A></B></CODE>
- <BR>
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
- <CODE> Object</CODE></FONT></TD>
- <TD><CODE><B><A HREF="#menus">menus</A></B></CODE>
- <BR>
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
- <CODE> Object</CODE></FONT></TD>
- <TD><CODE><B><A HREF="#minorVersion">minorVersion</A></B></CODE>
- <BR>
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
- <CODE> Object</CODE></FONT></TD>
- <TD><CODE><B><A HREF="#plugins">plugins</A></B></CODE>
- <BR>
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
- <CODE> Object</CODE></FONT></TD>
- <TD><CODE><B><A HREF="#releaseDate">releaseDate</A></B></CODE>
- <BR>
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
- <CODE> Object</CODE></FONT></TD>
- <TD><CODE><B><A HREF="#switchClassCache">switchClassCache</A></B></CODE>
- <BR>
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
- <CODE> Object</CODE></FONT></TD>
- <TD><CODE><B><A HREF="#themes">themes</A></B></CODE>
- <BR>
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
- <CODE> Object</CODE></FONT></TD>
- <TD><CODE><B><A HREF="#windowArgs">windowArgs</A></B></CODE>
- <BR>
- </TD>
- </TR>
-
-
- </TABLE>
-
-
-
-
-
-<!-- =========== END FIELD SUMMARY =========== -->
-
-
-<!-- ======== CONSTRUCTOR SUMMARY ======== -->
-
-<A NAME="constructor_summary"><!-- --></A>
-<TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" WIDTH="100%">
-<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
-<TD COLSPAN=2><FONT SIZE="+2">
-<B>Constructor Summary</B></FONT></TD>
-</TR>
-<TR BGCOLOR="white" CLASS="TableRowColor">
- <TD>
- <CODE>
- <B>
- <A HREF="TinyMCE_Engine.html#TinyMCE_Engine()">TinyMCE_Engine</A>
- </B>
- ()
- </CODE>
- <BR>
-
- Core engine class for TinyMCE, a instance of this class is available as a global called tinyMCE.
- </TD>
-</TR>
-</TABLE>
-
-<!-- ======== END CONSTRUCTOR SUMMARY ======== -->
-
-
-
-<!-- ========== METHOD SUMMARY =========== -->
-
-<A NAME="method_summary"><!-- --></A>
-<TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" WIDTH="100%">
-<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
-<TD COLSPAN=2><FONT SIZE="+2">
-<B>Method Summary</B></FONT></TD>
-</TR>
-
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> HTMLElement</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#_getElementById">_getElementById</A></B>(<string> i<DOMDocument> d, d)
- </CODE>
- <BR>
-
- Returns a element by id, this will also search the form names to match the id.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> void</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#_removeInternal">_removeInternal</A></B>(<DOMNode> n)
- </CODE>
- <BR>
-
- Removes any internal content inserted by regexps.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> Object</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#accessibleEventHandler">accessibleEventHandler</A></B>(<DOMEvent> e)
- </CODE>
- <BR>
-
- Accessibility handler that gets executed when the user hits a key in a select element.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> void</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#addButtonMap">addButtonMap</A></B>(<string> m)
- </CODE>
- <BR>
-
- Adds a list of buttons available in the tiled button image used by the button_tile_map option.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> string</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#addCSSClass">addCSSClass</A></B>(<HTMLElement> e, c, b)
- </CODE>
- <BR>
-
- Adds a CSS class to the specified element.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> void</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#addEvent">addEvent</A></B>(<HTMLElement> o, <string> n, <function> h)
- </CODE>
- <BR>
-
- Adds a event handler function to the specified object.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> void</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#addEventHandlers">addEventHandlers</A></B>(<inst> inst)
- </CODE>
- <BR>
-
- Adds the handleEvent function to the specified editor instance.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> void</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#addMCEControl">addMCEControl</A></B>(<HTMLElement> replace_element, <string> form_element_name, <DOMDocument> target_document)
- </CODE>
- <BR>
-
- Adds a TinyMCE editor control instance to a specific form element.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> void</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#addMenu">addMenu</A></B>(<string> n, <TinyMCE_Menu> m)
- </CODE>
- <BR>
-
- Adds a floating menu instance to TinyMCE.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> void</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#addPlugin">addPlugin</A></B>(n, <TinyMCE_Plugin> p)
- </CODE>
- <BR>
-
- Adds the specified plugin to the list of loaded plugins, this will also setup the baseURL
- property of the plugin.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> Object</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#addSelectAccessibility">addSelectAccessibility</A></B>(<DOMEvent> e, <HTMLElement> s, <DOMWindow> w)
- </CODE>
- <BR>
-
- Adds accessibility keydown handler to the specified select element.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> void</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#addTheme">addTheme</A></B>(&l<TinyMCE_Theme> t;string> n, t)
- </CODE>
- <BR>
-
- Adds the specified theme in to the list of loaded themes.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> void</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#addToLang">addToLang</A></B>(<string> prefix, <Array> ar)
- </CODE>
- <BR>
-
- Adds language items to the global language array.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> string</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#applyTemplate">applyTemplate</A></B>(<string> h, <Array> as)
- </CODE>
- <BR>
-
- Replaces language, args and settings variables in a HTML string.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> boolean</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#callFunc">callFunc</A></B>(<<<Array> a href="TinyMCE_Control.html">TinyMCE_Control</a>> ins, <string> p, <string> n, <int> m, a)
- </CODE>
- <BR>
-
- Executes callback chain.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> void</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#cancelEvent">cancelEvent</A></B>(<DOMEvent> e)
- </CODE>
- <BR>
-
- Cancels the specified event, this will disable the event from be passed to other listeners in event chain.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> void</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#cleanupAnchors">cleanupAnchors</A></B>(<DOMDocument> doc)
- </CODE>
- <BR>
-
- Moves the contents of a anchor outside and after the anchor.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> string</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#cleanupEventStr">cleanupEventStr</A></B>(<string> s)
- </CODE>
- <BR>
-
- Removes MSIE 5.5 specific event wrapper function form a event string.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> string</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#cleanupHTMLCode">cleanupHTMLCode</A></B>(<string> s)
- </CODE>
- <BR>
-
- Makes some preprocessing cleanup routines on the specified HTML string.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> Array</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#clearArray">clearArray</A></B>(a)
- </CODE>
- <BR>
-
- Returns a cleared array, since some external libraries tend to extend the Array core object
- arrays needs to be cleaned from these extended functions.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> void</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#closeWindow">closeWindow</A></B>(<DOMWindow> win)
- </CODE>
- <BR>
-
- Closes the specified window.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> void</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#compressStyle">compressStyle</A></B>(<Array> ar, <string> pr, <string> sf, <string> res)
- </CODE>
- <BR>
-
- Compresses larger styles into a smaller.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> void</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#confirmAdd">confirmAdd</A></B>(<DOMEvent> e, <Array> settings)
- </CODE>
- <BR>
-
- Displays a confirm dialog when a user clicks/focus a textarea that is to be converted into
- a TinyMCE instance.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> string</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#convertAbsoluteURLToRelativeURL">convertAbsoluteURLToRelativeURL</A></B>(<string> base_url, <string> url_to_relative)
- </CODE>
- <BR>
-
- Converts an absolute path to relative path.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> void</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#convertAllRelativeURLs">convertAllRelativeURLs</A></B>(<HTMLElement> body)
- </CODE>
- <BR>
-
- Converts all img and a element URLs to absolute URLs.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> void</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#convertFontsToSpans">convertFontsToSpans</A></B>(<DOMDocument> doc)
- </CODE>
- <BR>
-
- Convers fonts to spans in the specified document.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> string</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#convertHexToRGB">convertHexToRGB</A></B>(<string> s)
- </CODE>
- <BR>
-
- Returns a rgb(n,n,n) string from a hexadecimal value.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> string</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#convertRelativeToAbsoluteURL">convertRelativeToAbsoluteURL</A></B>(<string> base_url, <string> relative_url)
- </CODE>
- <BR>
-
- Converts an relative path to absolute path.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> string</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#convertRGBToHex">convertRGBToHex</A></B>(<string> s, <boolean> k)
- </CODE>
- <BR>
-
- Returns a hexadecimal version of the specified rgb(1,2,3) string.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> void</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#convertSpansToFonts">convertSpansToFonts</A></B>(<DOMDocument> doc)
- </CODE>
- <BR>
-
- Converts span elements to font elements in the specified document instance.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> string</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#convertURL">convertURL</A></B>(<string> url, <HTMLElement> node, <boolean> on_save)
- </CODE>
- <BR>
-
- Converts the specified URL based in TinyMCE configuration settings.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> void</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#debug">debug</A></B>()
- </CODE>
- <BR>
-
- Debugs the specified message to a screen.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> Object</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#dispatchCallback">dispatchCallback</A></B>(<<a href="TinyMCE_Control.html">TinyMCE_Control</a>> i, <string> p, <string> n)
- </CODE>
- <BR>
-
- Dispatches the specified callback on all options, plugins and themes.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> string</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#entityDecode">entityDecode</A></B>(<string> s)
- </CODE>
- <BR>
-
- HTML entity decode a string, replaces < with <.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> object</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#evalFunc">evalFunc</A></B>(<string> f, <int> idx, <Array> a)
- </CODE>
- <BR>
-
- Evaluates the specified function and uses the array of arguments.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> void</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#execCommand">execCommand</A></B>(<string> command, <boolean> user_interface, <object> value)
- </CODE>
- <BR>
-
- Executes a command on the selected or last selected TinyMCE editor control instance.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> Object</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#execCommandCallback">execCommandCallback</A></B>(<<a href="TinyMCE_Control.html">TinyMCE_Control</a>> i, <string> p, <string> n)
- </CODE>
- <BR>
-
- Executes the specified execcommand callback on all options, plugins and themes.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> void</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#execInstanceCommand">execInstanceCommand</A></B>(<string> editor_id, <string> command, <boolean> user_interface, <object> value, <boolean> focus)
- </CODE>
- <BR>
-
- Executes a command on a specific editor instance by id.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> Object</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#executeCallback">executeCallback</A></B>(<<a href="TinyMCE_Control.html">TinyMCE_Control</a>> i, <string> p, <string> n)
- </CODE>
- <BR>
-
- Executes the specified callback on all options, plugins and themes.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> Array</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#explode">explode</A></B>(<string> d, <string> s)
- </CODE>
- <BR>
-
- Splits a string by the specified delimiter and skips any empty items.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> Object</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#extend">extend</A></B>(<Object> p, <Object> np)
- </CODE>
- <BR>
-
- Extends the specified prototype with new methods.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> string</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#fixGeckoBaseHREFBug">fixGeckoBaseHREFBug</A></B>(<boolean> m, <HTMLElement> e, <string> h)
- </CODE>
- <BR>
-
- Fixes a Gecko specific bug where href, src attribute values gets converted incorrectly
- when inserted into editor.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> TinyMCE_ElementPosition</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#getAbsPosition">getAbsPosition</A></B>(<HTMLNode> n)
- </CODE>
- <BR>
-
- Returns the absolute x, y position of a node.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> string</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#getAttrib">getAttrib</A></B>(<HTMLElement> elm, <string> name, <string> default_value)
- </CODE>
- <BR>
-
- Returns the attribute value of a element or the default value if it wasn't found.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> string</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#getButtonHTML">getButtonHTML</A></B>(<string> id, <string> lang, <string> img, <string> cmd, <string> ui, <string> val)
- </CODE>
- <BR>
-
- Returns the HTML code for a normal button control.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> string</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#getContent">getContent</A></B>(<string> editor_id)
- </CODE>
- <BR>
-
- Returns the HTML contents of the specified editor instance id.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> string</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#getControlHTML">getControlHTML</A></B>(<string> c)
- </CODE>
- <BR>
-
- Returns the HTML for the specified control this will loop through
- the theme and all plugins inorder to find the control.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> Array</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#getCSSClasses">getCSSClasses</A></B>(<string> editor_id, <DOMDocument> doc)
- </CODE>
- <BR>
-
- Returns a array of CSS classes that is available in a document.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> string</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#getEditorId">getEditorId</A></B>(<string> form_element)
- </CODE>
- <BR>
-
- Returns the editor instance id of a specific form element.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> HTMLElement</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#getElementByAttributeValue">getElementByAttributeValue</A></B>(<HTMLElement> n, <string> e, <string> a, <string> v)
- </CODE>
- <BR>
-
- Returns a element by a specific attribute and it's value.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> Array</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#getElementsByAttributeValue">getElementsByAttributeValue</A></B>(<HTMLElement> n, <string> e, <string> a, <string> v)
- </CODE>
- <BR>
-
- Returns a element array by a specific attribute and it's value.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> <a href="TinyMCE_Control.html">TinyMCE_Control</a></CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#getInstanceById">getInstanceById</A></B>(<string> editor_id)
- </CODE>
- <BR>
-
- Returns a TinyMCE editor instance by the specified editor id or null if it wasn't found.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> object</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#getLang">getLang</A></B>(<string> name, <string> default_value, <boolean> parse_entities, <Array> va)
- </CODE>
- <BR>
-
- Returns a language variable value from the language packs.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> Array</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#getNodeTree">getNodeTree</A></B>(&l<int> t;HTMLNode> n, <Array> na, t, <string> nn)
- </CODE>
- <BR>
-
- Returns a array of nodes selected retrived from the child nodes of the specified node.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> string</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#getOuterHTML">getOuterHTML</A></B>(<HTMLElement> e)
- </CODE>
- <BR>
-
- Returns the outer HTML of a element, this uses the outerHTML
- property in MSIE and Opera and a workaround for Gecko.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> object</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#getParam">getParam</A></B>(<string> name, <string> default_value, <boolean> strip_whitespace, <string> split_chr)
- </CODE>
- <BR>
-
- Returns a specific configuration setting or the default value if it wasn't found.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> HTMLElement</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#getParentBlockElement">getParentBlockElement</A></B>(<HTMLNode> n)
- </CODE>
- <BR>
-
- Returns the first block element parent of the specified node.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> HTMLElement</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#getParentElement">getParentElement</A></B>(<HTMLNode> node, <string> names, <string> attrib_name, <string> attrib_value)
- </CODE>
- <BR>
-
- Returns the parent element of the specified node based on the search criteria.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> DOMNode</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#getParentNode">getParentNode</A></B>(<DOMNode> n, <function> f)
- </CODE>
- <BR>
-
- Returns a node by the specified selector function.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> string</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#getVisualAidClass">getVisualAidClass</A></B>(<string> class_name, <boolean> state)
- </CODE>
- <BR>
-
- Returns the visual aid class string, this will add/remove the visual aid class.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> Object</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#getWindowArg">getWindowArg</A></B>(<string> n, d)
- </CODE>
- <BR>
-
- Returns the window argument to be passed to TinyMCE popup.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> boolean</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#handleEvent">handleEvent</A></B>(<DOMEvent> e)
- </CODE>
- <BR>
-
- Event handler function that gets executed each time a event occurs in a TinyMCE editor control instance.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> void</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#handleVisualAid">handleVisualAid</A></B>(<HTMLElement> el, <boolean> deep, <boolean> state, <<a href="TinyMCE_Control.html">TinyMCE_Control</a>> inst, skip_dispatch)
- </CODE>
- <BR>
-
- Adds visual aid classes to all elements that need them recursive in the DOM tree.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> boolean</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#hasMenu">hasMenu</A></B>(<string> n)
- </CODE>
- <BR>
-
- Checks if the specified menu by name is added to TinyMCE.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> boolean</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#hasPlugin">hasPlugin</A></B>(<string> n)
- </CODE>
- <BR>
-
- Returns true/false if the specified plugin is loaded or not.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> boolean</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#hasTheme">hasTheme</A></B>(<string> n)
- </CODE>
- <BR>
-
- Returns true/false if the specified theme is loaded or not.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> void</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#importCSS">importCSS</A></B>(<DOMDocument> doc, <string> css)
- </CODE>
- <BR>
-
- Imports a CSS file into a allready loaded document.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> void</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#importPluginLanguagePack">importPluginLanguagePack</A></B>(<string> name, <string> valid_languages)
- </CODE>
- <BR>
-
- Loads a plugin specific language pack.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> void</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#importThemeLanguagePack">importThemeLanguagePack</A></B>(<string> name)
- </CODE>
- <BR>
-
- Loads a theme specific language pack.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> void</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#init">init</A></B>(settings)
- </CODE>
- <BR>
-
- Initializes TinyMCE with the specific configuration settings.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> void</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#insertAfter">insertAfter</A></B>(<HTMLNode> n, <HTMLNode> r)
- </CODE>
- <BR>
-
- Inserts a node after the specific node.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> boolean</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#isBlockElement">isBlockElement</A></B>(<HTMLNode> n)
- </CODE>
- <BR>
-
- Returns true/false if the specified node is a block element or not.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> boolean</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#isInstance">isInstance</A></B>(<object> o)
- </CODE>
- <BR>
-
- Returns true/false if a specific object is a TinyMCE_Control instance or not.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> void</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#loadCSS">loadCSS</A></B>(<string> url)
- </CODE>
- <BR>
-
- Loads the specified CSS by writing the a link tag to the current page.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> void</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#loadPlugin">loadPlugin</A></B>(<string> n, <string> u)
- </CODE>
- <BR>
-
- Load plugin from external URL.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> void</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#loadScript">loadScript</A></B>(<string> url)
- </CODE>
- <BR>
-
- Loads the specified script by writing the a script tag to the current page.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> HTMLElement</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#nextNode">nextNode</A></B>(<HTMLNode> e, <string> n)
- </CODE>
- <BR>
-
- Finds any element after the current one by name.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> boolean</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#onLoad">onLoad</A></B>()
- </CODE>
- <BR>
-
- Gets executed when the page loads or get intitialized.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> void</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#onMouseMove">onMouseMove</A></B>()
- </CODE>
- <BR>
-
- Mouse move handler function, this will be executed each time
- the mouse is moved within a editor instance.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> void</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#openWindow">openWindow</A></B>(<Array> template, <Array> args)
- </CODE>
- <BR>
-
- Opens a popup window based in the specified input data.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> Array</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#parseStyle">parseStyle</A></B>(<string> str)
- </CODE>
- <BR>
-
- Parses the specified HTML style data.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> TinyMCE_URL_Item</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#parseURL">parseURL</A></B>(<string> url_str)
- </CODE>
- <BR>
-
- Parses a URL in to its diffrent components.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> HTMLElement</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#prevNode">prevNode</A></B>(<HTMLNode> e, <string> n)
- </CODE>
- <BR>
-
- Finds any previous element by name.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> boolean</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#queryInstanceCommandState">queryInstanceCommandState</A></B>(<string> editor_id, <string> command)
- </CODE>
- <BR>
-
- Queries a command state for a specific command on a specific editor instance.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> object</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#queryInstanceCommandValue">queryInstanceCommandValue</A></B>(<string> editor_id, <string> command)
- </CODE>
- <BR>
-
- Queries a command value for a specific command on a specific editor instance.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> string</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#regexpReplace">regexpReplace</A></B>(<string> in_str, <string> reg_exp, <string> replace_str, opts)
- </CODE>
- <BR>
-
- Regexp replaces the contents of a string.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> string</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#removeCSSClass">removeCSSClass</A></B>(<HTMLElement> e, c)
- </CODE>
- <BR>
-
- Removes the specified CSS class from the element.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> void</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#removeMCEControl">removeMCEControl</A></B>(<string> editor_id)
- </CODE>
- <BR>
-
- Removes a TinyMCE editor control instance by id.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> void</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#removeTinyMCEFormElements">removeTinyMCEFormElements</A></B>(<HTMLElement> form_obj)
- </CODE>
- <BR>
-
- Removes/disables TinyMCE built in form elements such as select boxes for font sizes etc.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> void</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#renameElement">renameElement</A></B>(<HTMLElement> e, <string> n, <DOMDocument> d)
- </CODE>
- <BR>
-
- Renames the specified element to the specified name.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> string</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#replaceVar">replaceVar</A></B>(<string> h, <string> r, <string> v)
- </CODE>
- <BR>
-
- Replaces a specific variable in the string with a nother string.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> void</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#resetForm">resetForm</A></B>(<int> form_index)
- </CODE>
- <BR>
-
- Resets a forms TinyMCE instances based on form index.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> Array</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#selectNodes">selectNodes</A></B>(<DOMNode> n, <function> f, <Array> a)
- </CODE>
- <BR>
-
- Returns a array of nodes when the specified function matches a node.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> string</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#serializeStyle">serializeStyle</A></B>(<Array> ar)
- </CODE>
- <BR>
-
- Serializes the specified style item name/value array into a HTML string.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> string</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#serializeURL">serializeURL</A></B>(<TinyMCE_URL_Item> up)
- </CODE>
- <BR>
-
- Serializes the specified URL object into a string.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> void</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#setAttrib">setAttrib</A></B>(<HTMLElement> element, <string> name, <string> value, <boolean> fix_value)
- </CODE>
- <BR>
-
- Sets the attribute value for a specific attribute.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> void</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#setContent">setContent</A></B>(<string> h)
- </CODE>
- <BR>
-
- Sets the HTML contents of the selected editor instance.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> void</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#setInnerHTML">setInnerHTML</A></B>(<HTMLElement> e, <string> h)
- </CODE>
- <BR>
-
- Sets the innerHTML property of a element, this function also
- fixes a MSIE bug where the first comment is removed.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> void</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#setOuterHTML">setOuterHTML</A></B>(<HTMLElement> e, <string> h)
- </CODE>
- <BR>
-
- Sets the outer HTML of a element, this uses the outerHTML
- property in MSIE and Opera and a workaround for Gecko.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> void</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#setPluginBaseURL">setPluginBaseURL</A></B>(<string> n, <string> u)
- </CODE>
- <BR>
-
- Sets the baseURL of the specified plugin, this is useful if the plugin is loaded from
- a external location.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> void</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#setStyleAttrib">setStyleAttrib</A></B>(<HTMLElement> elm, <string> name, <string> value)
- </CODE>
- <BR>
-
- Sets a style attribute item value.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> void</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#setupContent">setupContent</A></B>(<string> editor_id)
- </CODE>
- <BR>
-
- Setups the contents of TinyMCE editor instance and fills it with contents.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> void</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#setWindowArg">setWindowArg</A></B>(<string> n, <string> v)
- </CODE>
- <BR>
-
- Sets the window argument to be passed to TinyMCE popup.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> string</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#storeAwayURLs">storeAwayURLs</A></B>(<string> s)
- </CODE>
- <BR>
-
- Stores away the src and href attribute values in separate mce_src and mce_href attributes.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> void</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#submitPatch">submitPatch</A></B>()
- </CODE>
- <BR>
-
- Piggyback onsubmit event handler function, this will remove/hide the TinyMCE specific form elements
- call triggerSave to fill the textarea with the correct contents then call the old piggy backed event handler.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> void</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#switchClass">switchClass</A></B>(<HTMLElement> ei, <string> c)
- </CODE>
- <BR>
-
- Switches the CSS class of the specified element.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> void</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#triggerNodeChange">triggerNodeChange</A></B>(<boolean> focus, <boolean> setup_content)
- </CODE>
- <BR>
-
- Triggers a nodeChange event to every theme and plugin.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> void</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#triggerSave">triggerSave</A></B>(<boolean> skip_cleanup, <boolean> skip_callback)
- </CODE>
- <BR>
-
- Moves the contents from a TinyMCE editor control instance to the hidden textarea
- that got replaced with TinyMCE.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> string</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#trim">trim</A></B>(<string> s)
- </CODE>
- <BR>
-
- Removes all prefix, suffix whitespace of a string.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> void</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#unloadHandler">unloadHandler</A></B>()
- </CODE>
- <BR>
-
- Unload document event handler function.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> void</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#updateContent">updateContent</A></B>(<string> form_element_name)
- </CODE>
- <BR>
-
- Moves the contents from the hidden textarea to the editor that gets inserted.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> string</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#xmlEncode">xmlEncode</A></B>(<string> s)
- </CODE>
- <BR>
-
- Encodes the string to raw XML entities.
- </TD>
- </TR>
-
-
-</TABLE>
-
-
-
-<P>
-<!-- ========== END METHOD SUMMARY =========== -->
-
-
-<!-- ============ FIELD DETAIL START =========== -->
-
- <A NAME="field_detail"><!-- --></A>
- <TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" WIDTH="100%">
- <TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
- <TD COLSPAN=1><FONT SIZE="+2"><B>Field Detail</B></FONT></TD>
- </TR>
- </TABLE>
-
-
- <A NAME="buttonMap"><!-- --></A>
- <H3>buttonMap</H3>
- <PRE>Object <B>buttonMap</B></PRE>
- <UL>
-
-
- </UL>
- <HR>
-
- <A NAME="configs"><!-- --></A>
- <H3>configs</H3>
- <PRE>Object <B>configs</B></PRE>
- <UL>
-
-
- </UL>
- <HR>
-
- <A NAME="currentConfig"><!-- --></A>
- <H3>currentConfig</H3>
- <PRE>Object <B>currentConfig</B></PRE>
- <UL>
-
-
- </UL>
- <HR>
-
- <A NAME="dialogCounter"><!-- --></A>
- <H3>dialogCounter</H3>
- <PRE>Object <B>dialogCounter</B></PRE>
- <UL>
-
-
- </UL>
- <HR>
-
- <A NAME="eventHandlers"><!-- --></A>
- <H3>eventHandlers</H3>
- <PRE>Object <B>eventHandlers</B></PRE>
- <UL>
-
-
- </UL>
- <HR>
-
- <A NAME="idCounter"><!-- --></A>
- <H3>idCounter</H3>
- <PRE>Object <B>idCounter</B></PRE>
- <UL>
-
-
- </UL>
- <HR>
-
- <A NAME="instances"><!-- --></A>
- <H3>instances</H3>
- <PRE>Object <B>instances</B></PRE>
- <UL>
-
-
- </UL>
- <HR>
-
- <A NAME="isGecko"><!-- --></A>
- <H3>isGecko</H3>
- <PRE>Object <B>isGecko</B></PRE>
- <UL>
-
-
- </UL>
- <HR>
-
- <A NAME="isLoaded"><!-- --></A>
- <H3>isLoaded</H3>
- <PRE>Object <B>isLoaded</B></PRE>
- <UL>
-
-
- </UL>
- <HR>
-
- <A NAME="isMac"><!-- --></A>
- <H3>isMac</H3>
- <PRE>Object <B>isMac</B></PRE>
- <UL>
-
-
- </UL>
- <HR>
-
- <A NAME="isMSIE"><!-- --></A>
- <H3>isMSIE</H3>
- <PRE>Object <B>isMSIE</B></PRE>
- <UL>
-
-
- </UL>
- <HR>
-
- <A NAME="isMSIE5"><!-- --></A>
- <H3>isMSIE5</H3>
- <PRE>Object <B>isMSIE5</B></PRE>
- <UL>
-
-
- </UL>
- <HR>
-
- <A NAME="isMSIE5_0"><!-- --></A>
- <H3>isMSIE5_0</H3>
- <PRE>Object <B>isMSIE5_0</B></PRE>
- <UL>
-
-
- </UL>
- <HR>
-
- <A NAME="isNS7"><!-- --></A>
- <H3>isNS7</H3>
- <PRE>Object <B>isNS7</B></PRE>
- <UL>
-
-
- </UL>
- <HR>
-
- <A NAME="isNS71"><!-- --></A>
- <H3>isNS71</H3>
- <PRE>Object <B>isNS71</B></PRE>
- <UL>
-
-
- </UL>
- <HR>
-
- <A NAME="isOpera"><!-- --></A>
- <H3>isOpera</H3>
- <PRE>Object <B>isOpera</B></PRE>
- <UL>
-
-
- </UL>
- <HR>
-
- <A NAME="isSafari"><!-- --></A>
- <H3>isSafari</H3>
- <PRE>Object <B>isSafari</B></PRE>
- <UL>
-
-
- </UL>
- <HR>
-
- <A NAME="loadedFiles"><!-- --></A>
- <H3>loadedFiles</H3>
- <PRE>Object <B>loadedFiles</B></PRE>
- <UL>
-
-
- </UL>
- <HR>
-
- <A NAME="loadedPlugins"><!-- --></A>
- <H3>loadedPlugins</H3>
- <PRE>Object <B>loadedPlugins</B></PRE>
- <UL>
-
-
- </UL>
- <HR>
-
- <A NAME="majorVersion"><!-- --></A>
- <H3>majorVersion</H3>
- <PRE>Object <B>majorVersion</B></PRE>
- <UL>
-
-
- </UL>
- <HR>
-
- <A NAME="menus"><!-- --></A>
- <H3>menus</H3>
- <PRE>Object <B>menus</B></PRE>
- <UL>
-
-
- </UL>
- <HR>
-
- <A NAME="minorVersion"><!-- --></A>
- <H3>minorVersion</H3>
- <PRE>Object <B>minorVersion</B></PRE>
- <UL>
-
-
- </UL>
- <HR>
-
- <A NAME="plugins"><!-- --></A>
- <H3>plugins</H3>
- <PRE>Object <B>plugins</B></PRE>
- <UL>
-
-
- </UL>
- <HR>
-
- <A NAME="releaseDate"><!-- --></A>
- <H3>releaseDate</H3>
- <PRE>Object <B>releaseDate</B></PRE>
- <UL>
-
-
- </UL>
- <HR>
-
- <A NAME="switchClassCache"><!-- --></A>
- <H3>switchClassCache</H3>
- <PRE>Object <B>switchClassCache</B></PRE>
- <UL>
-
-
- </UL>
- <HR>
-
- <A NAME="themes"><!-- --></A>
- <H3>themes</H3>
- <PRE>Object <B>themes</B></PRE>
- <UL>
-
-
- </UL>
- <HR>
-
- <A NAME="windowArgs"><!-- --></A>
- <H3>windowArgs</H3>
- <PRE>Object <B>windowArgs</B></PRE>
- <UL>
-
-
- </UL>
- <HR>
-
-
-
-<!-- ============ FIELD DETAIL END =========== -->
-
- <!-- ========= CONSTRUCTOR DETAIL START ======== -->
-
-<A NAME="constructor_detail"><!-- --></A>
-<TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" WIDTH="100%">
- <TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
- <TD COLSPAN=1>
- <FONT SIZE="+2"><B>Constructor Detail</B></FONT>
- </TD>
- </TR>
-</TABLE>
-
-<A NAME="TinyMCE_Engine()"><!-- --></A><H3>
-TinyMCE_Engine</H3>
-<PRE><B>TinyMCE_Engine</B>()</PRE>
-
-
-<UL>
- Core engine class for TinyMCE, a instance of this class is available as a global called tinyMCE.
-</UL>
-
-
-
- </UL>
-
-
-<!-- Constructor return value(s) -->
-
-<!-- End constructor return value(s) -->
-
-<!-- ADDITIONAL ATTRIBUTES -->
-
-<HR/>
-<!-- END ADDITIONAL ATTRIBUTES -->
-
-<!-- ========= CONSTRUCTOR DETAIL END ======== -->
-
-
-<!-- ============ METHOD DETAIL START ========== -->
-
-<A NAME="method_detail"><!-- --></A>
-<TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" WIDTH="100%">
- <TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
- <TD COLSPAN=1><FONT SIZE="+2">
- <B>Method Detail</B></FONT>
- </TD>
- </TR>
-</TABLE>
-
-<!-- One single method detail entry -->
-
- <A NAME="_getElementById"><!-- --></A>
- <H3>_getElementById</H3>
- <PRE>HTMLElement <B>_getElementById</B>(<string> i<DOMDocument> d, d)</PRE>
-
- <UL>Returns a element by id, this will also search the form names to match the id.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <UL>
- <B>Parameters:</B>
-
- <UL><CODE>id</CODE> - Id of element.
- </UL>
-
- <UL><CODE>d</CODE> - Optional document.
- </UL>
-
- </UL>
-
- <!-- METHOD PARAMETERS END -->
-
-
- <UL>
- <B>Returns:</B>
- <UL>
- HTML element that matches the id.
- </UL>
- </UL>
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="_removeInternal"><!-- --></A>
- <H3>_removeInternal</H3>
- <PRE>void <B>_removeInternal</B>(<DOMNode> n)</PRE>
-
- <UL>Removes any internal content inserted by regexps.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <UL>
- <B>Parameters:</B>
-
- <UL><CODE>n</CODE> - Node to remove internal content from.
- </UL>
-
- </UL>
-
- <!-- METHOD PARAMETERS END -->
-
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="accessibleEventHandler"><!-- --></A>
- <H3>accessibleEventHandler</H3>
- <PRE>Object <B>accessibleEventHandler</B>(<DOMEvent> e)</PRE>
-
- <UL>Accessibility handler that gets executed when the user hits a key in a select element.
- This handler trams the enter/return or space key and then executes the onchange event handler.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <UL>
- <B>Parameters:</B>
-
- <UL><CODE>e</CODE> - DOM event object instance.
- </UL>
-
- </UL>
-
- <!-- METHOD PARAMETERS END -->
-
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="addButtonMap"><!-- --></A>
- <H3>addButtonMap</H3>
- <PRE>void <B>addButtonMap</B>(<string> m)</PRE>
-
- <UL>Adds a list of buttons available in the tiled button image used by the button_tile_map option.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <UL>
- <B>Parameters:</B>
-
- <UL><CODE>m</CODE> - Comma separated list of buttons that are available in tiled image.
- </UL>
-
- </UL>
-
- <!-- METHOD PARAMETERS END -->
-
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="addCSSClass"><!-- --></A>
- <H3>addCSSClass</H3>
- <PRE>string <B>addCSSClass</B>(<HTMLElement> e, c, b)</PRE>
-
- <UL>Adds a CSS class to the specified element. It will remove any previous item with the same name
- so adding a class that already exists will move it to the end.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <UL>
- <B>Parameters:</B>
-
- <UL><CODE>e</CODE> - HTML element to add CSS class to.
- </UL>
-
- <UL><CODE>string</CODE> - ] c CSS class to add to HTML element.
- </UL>
-
- <UL><CODE>boolean</CODE> - ] b Optional parameter, if set to true, class will be added to the beginning.
- </UL>
-
- </UL>
-
- <!-- METHOD PARAMETERS END -->
-
-
- <UL>
- <B>Returns:</B>
- <UL>
- Returns the new class attribute value.
- </UL>
- </UL>
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="addEvent"><!-- --></A>
- <H3>addEvent</H3>
- <PRE>void <B>addEvent</B>(<HTMLElement> o, <string> n, <function> h)</PRE>
-
- <UL>Adds a event handler function to the specified object.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <UL>
- <B>Parameters:</B>
-
- <UL><CODE>o</CODE> - Object to add event handler to.
- </UL>
-
- <UL><CODE>n</CODE> - Event name to listen to for example "click".
- </UL>
-
- <UL><CODE>h</CODE> - Function handler to execute when event occurs.
- </UL>
-
- </UL>
-
- <!-- METHOD PARAMETERS END -->
-
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="addEventHandlers"><!-- --></A>
- <H3>addEventHandlers</H3>
- <PRE>void <B>addEventHandlers</B>(<inst> inst)</PRE>
-
- <UL>Adds the handleEvent function to the specified editor instance.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <UL>
- <B>Parameters:</B>
-
- <UL><CODE>inst</CODE> - Editor control instance to add event handler to.
- </UL>
-
- </UL>
-
- <!-- METHOD PARAMETERS END -->
-
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="addMCEControl"><!-- --></A>
- <H3>addMCEControl</H3>
- <PRE>void <B>addMCEControl</B>(<HTMLElement> replace_element, <string> form_element_name, <DOMDocument> target_document)</PRE>
-
- <UL>Adds a TinyMCE editor control instance to a specific form element.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <UL>
- <B>Parameters:</B>
-
- <UL><CODE>replace_element</CODE> - HTML element object to replace.
- </UL>
-
- <UL><CODE>form_element_name</CODE> - HTML form element name,
- </UL>
-
- <UL><CODE>target_document</CODE> - Target document that holds the element.
- </UL>
-
- </UL>
-
- <!-- METHOD PARAMETERS END -->
-
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="addMenu"><!-- --></A>
- <H3>addMenu</H3>
- <PRE>void <B>addMenu</B>(<string> n, <TinyMCE_Menu> m)</PRE>
-
- <UL>Adds a floating menu instance to TinyMCE.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <UL>
- <B>Parameters:</B>
-
- <UL><CODE>n</CODE> - TinyMCE menu id.
- </UL>
-
- <UL><CODE>m</CODE> - TinyMCE menu instance.
- </UL>
-
- </UL>
-
- <!-- METHOD PARAMETERS END -->
-
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="addPlugin"><!-- --></A>
- <H3>addPlugin</H3>
- <PRE>void <B>addPlugin</B>(n, <TinyMCE_Plugin> p)</PRE>
-
- <UL>Adds the specified plugin to the list of loaded plugins, this will also setup the baseURL
- property of the plugin.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <UL>
- <B>Parameters:</B>
-
- <UL><CODE>p</CODE> - Plugin instance to add.
- </UL>
-
- <UL><CODE>Plugin</CODE> - name/id.
- </UL>
-
- </UL>
-
- <!-- METHOD PARAMETERS END -->
-
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="addSelectAccessibility"><!-- --></A>
- <H3>addSelectAccessibility</H3>
- <PRE>Object <B>addSelectAccessibility</B>(<DOMEvent> e, <HTMLElement> s, <DOMWindow> w)</PRE>
-
- <UL>Adds accessibility keydown handler to the specified select element.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <UL>
- <B>Parameters:</B>
-
- <UL><CODE>e</CODE> - Event that gets passed when the element is focused.
- </UL>
-
- <UL><CODE>s</CODE> - Select element that the keydown handler gets added to.
- </UL>
-
- <UL><CODE>w</CODE> - DOM window reference to add.
- </UL>
-
- </UL>
-
- <!-- METHOD PARAMETERS END -->
-
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="addTheme"><!-- --></A>
- <H3>addTheme</H3>
- <PRE>void <B>addTheme</B>(&l<TinyMCE_Theme> t;string> n, t)</PRE>
-
- <UL>Adds the specified theme in to the list of loaded themes.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <UL>
- <B>Parameters:</B>
-
- <UL><CODE>n</CODE> - Theme name/id to add the object reference to.
- </UL>
-
- <UL><CODE>t</CODE> - Theme instance to add to the loaded list.
- </UL>
-
- </UL>
-
- <!-- METHOD PARAMETERS END -->
-
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="addToLang"><!-- --></A>
- <H3>addToLang</H3>
- <PRE>void <B>addToLang</B>(<string> prefix, <Array> ar)</PRE>
-
- <UL>Adds language items to the global language array.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <UL>
- <B>Parameters:</B>
-
- <UL><CODE>prefix</CODE> - Prefix string to add infront of every array item before adding it.
- </UL>
-
- <UL><CODE>ar</CODE> - Language item array to add to global language array.
- </UL>
-
- </UL>
-
- <!-- METHOD PARAMETERS END -->
-
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="applyTemplate"><!-- --></A>
- <H3>applyTemplate</H3>
- <PRE>string <B>applyTemplate</B>(<string> h, <Array> as)</PRE>
-
- <UL>Replaces language, args and settings variables in a HTML string.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <UL>
- <B>Parameters:</B>
-
- <UL><CODE>h</CODE> - HTML string to replace language variables in.
- </UL>
-
- <UL><CODE>as</CODE> - Optional arguments array to take variables from.
- </UL>
-
- </UL>
-
- <!-- METHOD PARAMETERS END -->
-
-
- <UL>
- <B>Returns:</B>
- <UL>
- HTML string with replaced varliables.
- </UL>
- </UL>
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="callFunc"><!-- --></A>
- <H3>callFunc</H3>
- <PRE>boolean <B>callFunc</B>(<<<Array> a href="TinyMCE_Control.html">TinyMCE_Control</a>> ins, <string> p, <string> n, <int> m, a)</PRE>
-
- <UL>Executes callback chain. Callback TinyMCE_Engine.prototype.order = Option; Plugins, Themes.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <UL>
- <B>Parameters:</B>
-
- <UL><CODE>ins</CODE> - TinyMCE editor control instance to execute callback on.
- </UL>
-
- <UL><CODE>p</CODE> - TinyMCE callback parameter name.
- </UL>
-
- <UL><CODE>n</CODE> - Function name to execute.
- </UL>
-
- <UL><CODE>m</CODE> - Execution mode value, 0 = no chain, 1 = event chain, 2 = execcommand chain.
- </UL>
-
- <UL><CODE>a</CODE> - Array with function arguments.
- </UL>
-
- </UL>
-
- <!-- METHOD PARAMETERS END -->
-
-
- <UL>
- <B>Returns:</B>
- <UL>
- true - if the callback was executed, false if it wasn't.
- </UL>
- </UL>
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="cancelEvent"><!-- --></A>
- <H3>cancelEvent</H3>
- <PRE>void <B>cancelEvent</B>(<DOMEvent> e)</PRE>
-
- <UL>Cancels the specified event, this will disable the event from be passed to other listeners in event chain.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <UL>
- <B>Parameters:</B>
-
- <UL><CODE>e</CODE> - Event to cancel.
- </UL>
-
- </UL>
-
- <!-- METHOD PARAMETERS END -->
-
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="cleanupAnchors"><!-- --></A>
- <H3>cleanupAnchors</H3>
- <PRE>void <B>cleanupAnchors</B>(<DOMDocument> doc)</PRE>
-
- <UL>Moves the contents of a anchor outside and after the anchor. Only if the anchor doesn't
- have a href.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <UL>
- <B>Parameters:</B>
-
- <UL><CODE>doc</CODE> - DOM document instance to fix anchors in.
- </UL>
-
- </UL>
-
- <!-- METHOD PARAMETERS END -->
-
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="cleanupEventStr"><!-- --></A>
- <H3>cleanupEventStr</H3>
- <PRE>string <B>cleanupEventStr</B>(<string> s)</PRE>
-
- <UL>Removes MSIE 5.5 specific event wrapper function form a event string.
- This will also remove the event blocker if it's added in front of the event.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <UL>
- <B>Parameters:</B>
-
- <UL><CODE>s</CODE> - String to replace event data in.
- </UL>
-
- </UL>
-
- <!-- METHOD PARAMETERS END -->
-
-
- <UL>
- <B>Returns:</B>
- <UL>
- Replaced string value.
- </UL>
- </UL>
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="cleanupHTMLCode"><!-- --></A>
- <H3>cleanupHTMLCode</H3>
- <PRE>string <B>cleanupHTMLCode</B>(<string> s)</PRE>
-
- <UL>Makes some preprocessing cleanup routines on the specified HTML string.
- This includes forcing some tags to be open so MSIE doesn't fail. Forcing other to close and
- padding paragraphs with non breaking spaces. This function is used when the editor gets
- initialized with content.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <UL>
- <B>Parameters:</B>
-
- <UL><CODE>s</CODE> - HTML string to cleanup.
- </UL>
-
- </UL>
-
- <!-- METHOD PARAMETERS END -->
-
-
- <UL>
- <B>Returns:</B>
- <UL>
- Cleaned HTML string.
- </UL>
- </UL>
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="clearArray"><!-- --></A>
- <H3>clearArray</H3>
- <PRE>Array <B>clearArray</B>(a)</PRE>
-
- <UL>Returns a cleared array, since some external libraries tend to extend the Array core object
- arrays needs to be cleaned from these extended functions. So this function simply sets any
- named properties back to null.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <UL>
- <B>Parameters:</B>
-
- <UL><CODE>Name</CODE> - /Value array to clear.
- </UL>
-
- </UL>
-
- <!-- METHOD PARAMETERS END -->
-
-
- <UL>
- <B>Returns:</B>
- <UL>
- Cleared name/value array.
- </UL>
- </UL>
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="closeWindow"><!-- --></A>
- <H3>closeWindow</H3>
- <PRE>void <B>closeWindow</B>(<DOMWindow> win)</PRE>
-
- <UL>Closes the specified window. This function is deprecated and should be replaced with
- tinyMCEPopup.close();.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <UL>
- <B>Parameters:</B>
-
- <UL><CODE>win</CODE> - Window reference to close.
- </UL>
-
- </UL>
-
- <!-- METHOD PARAMETERS END -->
-
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <UL>
- <B>Deprecated</B> <I></I><BR/><BR/>
- </UL>
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="compressStyle"><!-- --></A>
- <H3>compressStyle</H3>
- <PRE>void <B>compressStyle</B>(<Array> ar, <string> pr, <string> sf, <string> res)</PRE>
-
- <UL>Compresses larger styles into a smaller. Since MSIE automaticly converts
- border: 1px solid red to border-left: 1px solid red, border-righ: 1px solid red and so forth.'
- This will bundle them together again if the information is the same in each item.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <UL>
- <B>Parameters:</B>
-
- <UL><CODE>ar</CODE> - Style name/value array with items.
- </UL>
-
- <UL><CODE>pr</CODE> - Style item prefix to bundle for example border.
- </UL>
-
- <UL><CODE>sf</CODE> - Style item suffix to bunlde for example -width or -width.
- </UL>
-
- <UL><CODE>res</CODE> - Result name, for example border-width.
- </UL>
-
- </UL>
-
- <!-- METHOD PARAMETERS END -->
-
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="confirmAdd"><!-- --></A>
- <H3>confirmAdd</H3>
- <PRE>void <B>confirmAdd</B>(<DOMEvent> e, <Array> settings)</PRE>
-
- <UL>Displays a confirm dialog when a user clicks/focus a textarea that is to be converted into
- a TinyMCE instance.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <UL>
- <B>Parameters:</B>
-
- <UL><CODE>e</CODE> - DOM event instance.
- </UL>
-
- <UL><CODE>settings</CODE> - Name/Value array of initialization settings.
- </UL>
-
- </UL>
-
- <!-- METHOD PARAMETERS END -->
-
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="convertAbsoluteURLToRelativeURL"><!-- --></A>
- <H3>convertAbsoluteURLToRelativeURL</H3>
- <PRE>string <B>convertAbsoluteURLToRelativeURL</B>(<string> base_url, <string> url_to_relative)</PRE>
-
- <UL>Converts an absolute path to relative path.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <UL>
- <B>Parameters:</B>
-
- <UL><CODE>base_url</CODE> - URL to make as a base path, URLs will be converted relative from this point.
- </UL>
-
- <UL><CODE>url_to_relative</CODE> - URL to convert into a relative URL.
- </UL>
-
- </UL>
-
- <!-- METHOD PARAMETERS END -->
-
-
- <UL>
- <B>Returns:</B>
- <UL>
- Relative URL based in input.
- </UL>
- </UL>
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="convertAllRelativeURLs"><!-- --></A>
- <H3>convertAllRelativeURLs</H3>
- <PRE>void <B>convertAllRelativeURLs</B>(<HTMLElement> body)</PRE>
-
- <UL>Converts all img and a element URLs to absolute URLs. This will use the mce_src or mce_href attribute values
- if they are provided. This function is used when the editor is initialized.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <UL>
- <B>Parameters:</B>
-
- <UL><CODE>body</CODE> - HTML element to convert all URLs in.
- </UL>
-
- </UL>
-
- <!-- METHOD PARAMETERS END -->
-
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="convertFontsToSpans"><!-- --></A>
- <H3>convertFontsToSpans</H3>
- <PRE>void <B>convertFontsToSpans</B>(<DOMDocument> doc)</PRE>
-
- <UL>Convers fonts to spans in the specified document.
- Todo: Move this function into a XHTML plugin or simmilar.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <UL>
- <B>Parameters:</B>
-
- <UL><CODE>doc</CODE> - Document instance to convert fonts in.
- </UL>
-
- </UL>
-
- <!-- METHOD PARAMETERS END -->
-
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="convertHexToRGB"><!-- --></A>
- <H3>convertHexToRGB</H3>
- <PRE>string <B>convertHexToRGB</B>(<string> s)</PRE>
-
- <UL>Returns a rgb(n,n,n) string from a hexadecimal value.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <UL>
- <B>Parameters:</B>
-
- <UL><CODE>s</CODE> - Hexadecimal string to parse.
- </UL>
-
- </UL>
-
- <!-- METHOD PARAMETERS END -->
-
-
- <UL>
- <B>Returns:</B>
- <UL>
- rgb(n,n,n) string from a hexadecimal value.
- </UL>
- </UL>
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="convertRelativeToAbsoluteURL"><!-- --></A>
- <H3>convertRelativeToAbsoluteURL</H3>
- <PRE>string <B>convertRelativeToAbsoluteURL</B>(<string> base_url, <string> relative_url)</PRE>
-
- <UL>Converts an relative path to absolute path.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <UL>
- <B>Parameters:</B>
-
- <UL><CODE>base_url</CODE> - URL to make as a base path, URLs will be converted absolute from this point.
- </UL>
-
- <UL><CODE>relative_url</CODE> - URL to convert into a absolute URL.
- </UL>
-
- </UL>
-
- <!-- METHOD PARAMETERS END -->
-
-
- <UL>
- <B>Returns:</B>
- <UL>
- Absolute URL based in input.
- </UL>
- </UL>
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="convertRGBToHex"><!-- --></A>
- <H3>convertRGBToHex</H3>
- <PRE>string <B>convertRGBToHex</B>(<string> s, <boolean> k)</PRE>
-
- <UL>Returns a hexadecimal version of the specified rgb(1,2,3) string.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <UL>
- <B>Parameters:</B>
-
- <UL><CODE>s</CODE> - RGB string to parse, if this doesn't isn't a rgb(n,n,n) it will passthrough the string.
- </UL>
-
- <UL><CODE>k</CODE> - Keep before/after contents. If enabled contents before after the rgb(n,n,n) will be intact.
- </UL>
-
- </UL>
-
- <!-- METHOD PARAMETERS END -->
-
-
- <UL>
- <B>Returns:</B>
- <UL>
- Hexadecimal version of the specified rgb(1,2,3) string.
- </UL>
- </UL>
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="convertSpansToFonts"><!-- --></A>
- <H3>convertSpansToFonts</H3>
- <PRE>void <B>convertSpansToFonts</B>(<DOMDocument> doc)</PRE>
-
- <UL>Converts span elements to font elements in the specified document instance.
- Todo: Move this function into a XHTML plugin or simmilar.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <UL>
- <B>Parameters:</B>
-
- <UL><CODE>doc</CODE> - Document instance to convert spans in.
- </UL>
-
- </UL>
-
- <!-- METHOD PARAMETERS END -->
-
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="convertURL"><!-- --></A>
- <H3>convertURL</H3>
- <PRE>string <B>convertURL</B>(<string> url, <HTMLElement> node, <boolean> on_save)</PRE>
-
- <UL>Converts the specified URL based in TinyMCE configuration settings.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <UL>
- <B>Parameters:</B>
-
- <UL><CODE>url</CODE> - URL to convert based on config.
- </UL>
-
- <UL><CODE>node</CODE> - HTML element that holds the URL.
- </UL>
-
- <UL><CODE>on_save</CODE> - Is this convertion the final output URL.
- </UL>
-
- </UL>
-
- <!-- METHOD PARAMETERS END -->
-
-
- <UL>
- <B>Returns:</B>
- <UL>
- Converted URL string.
- </UL>
- </UL>
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="debug"><!-- --></A>
- <H3>debug</H3>
- <PRE>void <B>debug</B>()</PRE>
-
- <UL>Debugs the specified message to a screen.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <UL>
- <B>Parameters:</B>
-
- <UL><CODE>Numerous</CODE> - arguments that will be outputed.
- </UL>
-
- </UL>
-
- <!-- METHOD PARAMETERS END -->
-
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="dispatchCallback"><!-- --></A>
- <H3>dispatchCallback</H3>
- <PRE>Object <B>dispatchCallback</B>(<<a href="TinyMCE_Control.html">TinyMCE_Control</a>> i, <string> p, <string> n)</PRE>
-
- <UL>Dispatches the specified callback on all options, plugins and themes. This will not
- chain them, so all functions callbacks will be executed regardless if the return true/false.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <UL>
- <B>Parameters:</B>
-
- <UL><CODE>i</CODE> - TinyMCE editor control instance to execute callback on.
- </UL>
-
- <UL><CODE>p</CODE> - TinyMCE callback parameter to execute.
- </UL>
-
- <UL><CODE>n</CODE> - Function name to execute.
- </UL>
-
- </UL>
-
- <!-- METHOD PARAMETERS END -->
-
-
- <UL>
- <B>Returns:</B>
- <UL>
- true/false if they where dispatched.
- </UL>
- </UL>
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="entityDecode"><!-- --></A>
- <H3>entityDecode</H3>
- <PRE>string <B>entityDecode</B>(<string> s)</PRE>
-
- <UL>HTML entity decode a string, replaces < with <.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <UL>
- <B>Parameters:</B>
-
- <UL><CODE>s</CODE> - Entity string to decode into normal string.
- </UL>
-
- </UL>
-
- <!-- METHOD PARAMETERS END -->
-
-
- <UL>
- <B>Returns:</B>
- <UL>
- Entity decoded string.
- </UL>
- </UL>
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="evalFunc"><!-- --></A>
- <H3>evalFunc</H3>
- <PRE>object <B>evalFunc</B>(<string> f, <int> idx, <Array> a)</PRE>
-
- <UL>Evaluates the specified function and uses the array of arguments.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <UL>
- <B>Parameters:</B>
-
- <UL><CODE>f</CODE> - Function reference to execute.
- </UL>
-
- <UL><CODE>idx</CODE> - Index in array to start grabbing arguments from.
- </UL>
-
- <UL><CODE>a</CODE> - Array of function arguments.
- </UL>
-
- </UL>
-
- <!-- METHOD PARAMETERS END -->
-
-
- <UL>
- <B>Returns:</B>
- <UL>
- Value returned from the evaluated function.
- </UL>
- </UL>
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="execCommand"><!-- --></A>
- <H3>execCommand</H3>
- <PRE>void <B>execCommand</B>(<string> command, <boolean> user_interface, <object> value)</PRE>
-
- <UL>Executes a command on the selected or last selected TinyMCE editor control instance. This function also handles
- some non instance specific commands like mceAddControl, mceRemoveControl, mceHelp or mceFocus.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <UL>
- <B>Parameters:</B>
-
- <UL><CODE>command</CODE> - Command name to execute, for example mceLink or Bold.
- </UL>
-
- <UL><CODE>user_interface</CODE> - True/false state if a UI (dialog) should be presented or not.
- </UL>
-
- <UL><CODE>value</CODE> - Optional command value, this can be anything.
- </UL>
-
- </UL>
-
- <!-- METHOD PARAMETERS END -->
-
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="execCommandCallback"><!-- --></A>
- <H3>execCommandCallback</H3>
- <PRE>Object <B>execCommandCallback</B>(<<a href="TinyMCE_Control.html">TinyMCE_Control</a>> i, <string> p, <string> n)</PRE>
-
- <UL>Executes the specified execcommand callback on all options, plugins and themes. This will
- chain them, so callback chain will be broken if one function returns true.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <UL>
- <B>Parameters:</B>
-
- <UL><CODE>i</CODE> - TinyMCE editor control instance to execute callback on.
- </UL>
-
- <UL><CODE>p</CODE> - TinyMCE callback parameter to execute.
- </UL>
-
- <UL><CODE>n</CODE> - Function name to execute.
- </UL>
-
- </UL>
-
- <!-- METHOD PARAMETERS END -->
-
-
- <UL>
- <B>Returns:</B>
- <UL>
- true/false if a callback was executed.
- </UL>
- </UL>
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="execInstanceCommand"><!-- --></A>
- <H3>execInstanceCommand</H3>
- <PRE>void <B>execInstanceCommand</B>(<string> editor_id, <string> command, <boolean> user_interface, <object> value, <boolean> focus)</PRE>
-
- <UL>Executes a command on a specific editor instance by id.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <UL>
- <B>Parameters:</B>
-
- <UL><CODE>editor_id</CODE> - TinyMCE editor control instance id to perform comman on.
- </UL>
-
- <UL><CODE>command</CODE> - Command name to execute, for example mceLink or Bold.
- </UL>
-
- <UL><CODE>user_interface</CODE> - True/false state if a UI (dialog) should be presented or not.
- </UL>
-
- <UL><CODE>value</CODE> - Optional command value, this can be anything.
- </UL>
-
- <UL><CODE>focus</CODE> - True/false if the editor instance should be focused first.
- </UL>
-
- </UL>
-
- <!-- METHOD PARAMETERS END -->
-
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="executeCallback"><!-- --></A>
- <H3>executeCallback</H3>
- <PRE>Object <B>executeCallback</B>(<<a href="TinyMCE_Control.html">TinyMCE_Control</a>> i, <string> p, <string> n)</PRE>
-
- <UL>Executes the specified callback on all options, plugins and themes. This will
- chain them, so callback chain will be broken if one function returns false.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <UL>
- <B>Parameters:</B>
-
- <UL><CODE>i</CODE> - TinyMCE editor control instance to execute callback on.
- </UL>
-
- <UL><CODE>p</CODE> - TinyMCE callback parameter to execute.
- </UL>
-
- <UL><CODE>n</CODE> - Function name to execute.
- </UL>
-
- </UL>
-
- <!-- METHOD PARAMETERS END -->
-
-
- <UL>
- <B>Returns:</B>
- <UL>
- true/false if a callback was executed.
- </UL>
- </UL>
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="explode"><!-- --></A>
- <H3>explode</H3>
- <PRE>Array <B>explode</B>(<string> d, <string> s)</PRE>
-
- <UL>Splits a string by the specified delimiter and skips any empty items.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <UL>
- <B>Parameters:</B>
-
- <UL><CODE>d</CODE> - Delimiter to split by.
- </UL>
-
- <UL><CODE>s</CODE> - String to split.
- </UL>
-
- </UL>
-
- <!-- METHOD PARAMETERS END -->
-
-
- <UL>
- <B>Returns:</B>
- <UL>
- Array with chunks from string.
- </UL>
- </UL>
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="extend"><!-- --></A>
- <H3>extend</H3>
- <PRE>Object <B>extend</B>(<Object> p, <Object> np)</PRE>
-
- <UL>Extends the specified prototype with new methods.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <UL>
- <B>Parameters:</B>
-
- <UL><CODE>p</CODE> - Prototype to extend with new methods.
- </UL>
-
- <UL><CODE>np</CODE> - New prototype to extend the other one with.
- </UL>
-
- </UL>
-
- <!-- METHOD PARAMETERS END -->
-
-
- <UL>
- <B>Returns:</B>
- <UL>
- Extended prototype array.
- </UL>
- </UL>
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="fixGeckoBaseHREFBug"><!-- --></A>
- <H3>fixGeckoBaseHREFBug</H3>
- <PRE>string <B>fixGeckoBaseHREFBug</B>(<boolean> m, <HTMLElement> e, <string> h)</PRE>
-
- <UL>Fixes a Gecko specific bug where href, src attribute values gets converted incorrectly
- when inserted into editor. This function will replace all src, href with mce_tsrc and mce_thref
- to keep the values from chaging when they get inserted.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <UL>
- <B>Parameters:</B>
-
- <UL><CODE>m</CODE> - Mode state, true is to replace the src, href attributes to mce_tsrc and mce_thref.
- </UL>
-
- <UL><CODE>e</CODE> - HTML element to replace them in. (Will be used if m is 0)
- </UL>
-
- <UL><CODE>h</CODE> - HTML code to replace them in. (Will be used if m is 1)
- </UL>
-
- </UL>
-
- <!-- METHOD PARAMETERS END -->
-
-
- <UL>
- <B>Returns:</B>
- <UL>
- Converted string or the specified HTML value depending on mode.
- </UL>
- </UL>
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="getAbsPosition"><!-- --></A>
- <H3>getAbsPosition</H3>
- <PRE>TinyMCE_ElementPosition <B>getAbsPosition</B>(<HTMLNode> n)</PRE>
-
- <UL>Returns the absolute x, y position of a node. The position will be returned in a object with
- two properties absLeft and absTop.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <UL>
- <B>Parameters:</B>
-
- <UL><CODE>n</CODE> - HTML element to get x, y position from.
- </UL>
-
- </UL>
-
- <!-- METHOD PARAMETERS END -->
-
-
- <UL>
- <B>Returns:</B>
- <UL>
- Absolute position of the specified element.
- </UL>
- </UL>
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="getAttrib"><!-- --></A>
- <H3>getAttrib</H3>
- <PRE>string <B>getAttrib</B>(<HTMLElement> elm, <string> name, <string> default_value)</PRE>
-
- <UL>Returns the attribute value of a element or the default value if it wasn't found.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <UL>
- <B>Parameters:</B>
-
- <UL><CODE>elm</CODE> - HTML element to get attribute from.
- </UL>
-
- <UL><CODE>name</CODE> - Attribute name to retrive.
- </UL>
-
- <UL><CODE>default_value</CODE> - Optional default value to return, this value defaults to a empty string.
- </UL>
-
- </UL>
-
- <!-- METHOD PARAMETERS END -->
-
-
- <UL>
- <B>Returns:</B>
- <UL>
- Attribute value or default value if it wasn't found in element.
- </UL>
- </UL>
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="getButtonHTML"><!-- --></A>
- <H3>getButtonHTML</H3>
- <PRE>string <B>getButtonHTML</B>(<string> id, <string> lang, <string> img, <string> cmd, <string> ui, <string> val)</PRE>
-
- <UL>Returns the HTML code for a normal button control.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <UL>
- <B>Parameters:</B>
-
- <UL><CODE>id</CODE> - Button control id, this will be the suffix for the element id, the prefix is the editor id.
- </UL>
-
- <UL><CODE>lang</CODE> - Language variable key name to insert as the title/alt of the button image.
- </UL>
-
- <UL><CODE>img</CODE> - Image URL to insert, {$themeurl} and {$pluginurl} will be replaced.
- </UL>
-
- <UL><CODE>cmd</CODE> - Command to execute when the user clicks the button.
- </UL>
-
- <UL><CODE>ui</CODE> - Optional user interface boolean for command.
- </UL>
-
- <UL><CODE>val</CODE> - Optional value for command.
- </UL>
-
- </UL>
-
- <!-- METHOD PARAMETERS END -->
-
-
- <UL>
- <B>Returns:</B>
- <UL>
- HTML code for a normal button based in input information.
- </UL>
- </UL>
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="getContent"><!-- --></A>
- <H3>getContent</H3>
- <PRE>string <B>getContent</B>(<string> editor_id)</PRE>
-
- <UL>Returns the HTML contents of the specified editor instance id.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <UL>
- <B>Parameters:</B>
-
- <UL><CODE>editor_id</CODE> - Editor instance id to retrive HTML code from.
- </UL>
-
- </UL>
-
- <!-- METHOD PARAMETERS END -->
-
-
- <UL>
- <B>Returns:</B>
- <UL>
- HTML contents of editor id or null if it wasn't found.
- </UL>
- </UL>
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="getControlHTML"><!-- --></A>
- <H3>getControlHTML</H3>
- <PRE>string <B>getControlHTML</B>(<string> c)</PRE>
-
- <UL>Returns the HTML for the specified control this will loop through
- the theme and all plugins inorder to find the control. The callback for each
- theme and plugin is called getControlHTML.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <UL>
- <B>Parameters:</B>
-
- <UL><CODE>c</CODE> - Control name/id to get HTML code for.
- </UL>
-
- </UL>
-
- <!-- METHOD PARAMETERS END -->
-
-
- <UL>
- <B>Returns:</B>
- <UL>
- HTML code for the specified control or empty string if it wasn't found.
- </UL>
- </UL>
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="getCSSClasses"><!-- --></A>
- <H3>getCSSClasses</H3>
- <PRE>Array <B>getCSSClasses</B>(<string> editor_id, <DOMDocument> doc)</PRE>
-
- <UL>Returns a array of CSS classes that is available in a document.
- TinyMCE_Engine.prototype.Todo = Fix;this one, it's so ugly. :)</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <UL>
- <B>Parameters:</B>
-
- <UL><CODE>editor_id</CODE> - Editor id to get CSS classes from.
- </UL>
-
- <UL><CODE>doc</CODE> - DOM document to get the CSS classes from.
- </UL>
-
- </UL>
-
- <!-- METHOD PARAMETERS END -->
-
-
- <UL>
- <B>Returns:</B>
- <UL>
- Array of CSS classes that is available in a document.
- </UL>
- </UL>
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="getEditorId"><!-- --></A>
- <H3>getEditorId</H3>
- <PRE>string <B>getEditorId</B>(<string> form_element)</PRE>
-
- <UL>Returns the editor instance id of a specific form element.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <UL>
- <B>Parameters:</B>
-
- <UL><CODE>form_element</CODE> - Form element name to get instance id for.
- </UL>
-
- </UL>
-
- <!-- METHOD PARAMETERS END -->
-
-
- <UL>
- <B>Returns:</B>
- <UL>
- TinyMCE editor instance id or null if it wasn't found.
- </UL>
- </UL>
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="getElementByAttributeValue"><!-- --></A>
- <H3>getElementByAttributeValue</H3>
- <PRE>HTMLElement <B>getElementByAttributeValue</B>(<HTMLElement> n, <string> e, <string> a, <string> v)</PRE>
-
- <UL>Returns a element by a specific attribute and it's value.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <UL>
- <B>Parameters:</B>
-
- <UL><CODE>n</CODE> - Element to search in.
- </UL>
-
- <UL><CODE>e</CODE> - Element name to search for.
- </UL>
-
- <UL><CODE>a</CODE> - Attribute name to search for.
- </UL>
-
- <UL><CODE>v</CODE> - Attribute value to search for.
- </UL>
-
- </UL>
-
- <!-- METHOD PARAMETERS END -->
-
-
- <UL>
- <B>Returns:</B>
- <UL>
- HTML element that matched the criterias or null on failure.
- </UL>
- </UL>
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="getElementsByAttributeValue"><!-- --></A>
- <H3>getElementsByAttributeValue</H3>
- <PRE>Array <B>getElementsByAttributeValue</B>(<HTMLElement> n, <string> e, <string> a, <string> v)</PRE>
-
- <UL>Returns a element array by a specific attribute and it's value.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <UL>
- <B>Parameters:</B>
-
- <UL><CODE>n</CODE> - Element to search in.
- </UL>
-
- <UL><CODE>e</CODE> - Element name to search for.
- </UL>
-
- <UL><CODE>a</CODE> - Attribute name to search for.
- </UL>
-
- <UL><CODE>v</CODE> - Attribute value to search for.
- </UL>
-
- </UL>
-
- <!-- METHOD PARAMETERS END -->
-
-
- <UL>
- <B>Returns:</B>
- <UL>
- HTML element array that matched the criterias or null on failure.
- </UL>
- </UL>
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="getInstanceById"><!-- --></A>
- <H3>getInstanceById</H3>
- <PRE><a href="TinyMCE_Control.html">TinyMCE_Control</a> <B>getInstanceById</B>(<string> editor_id)</PRE>
-
- <UL>Returns a TinyMCE editor instance by the specified editor id or null if it wasn't found.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <UL>
- <B>Parameters:</B>
-
- <UL><CODE>editor_id</CODE> - Editor id to get instance for.
- </UL>
-
- </UL>
-
- <!-- METHOD PARAMETERS END -->
-
-
- <UL>
- <B>Returns:</B>
- <UL>
- TinyMCE editor control instance or null if it wasn't found.
- </UL>
- </UL>
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="getLang"><!-- --></A>
- <H3>getLang</H3>
- <PRE>object <B>getLang</B>(<string> name, <string> default_value, <boolean> parse_entities, <Array> va)</PRE>
-
- <UL>Returns a language variable value from the language packs.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <UL>
- <B>Parameters:</B>
-
- <UL><CODE>name</CODE> - Name of the key to retrive.
- </UL>
-
- <UL><CODE>default_value</CODE> - Optional default value to return if it wasn't found.
- </UL>
-
- <UL><CODE>parse_entities</CODE> - Is HTML entities to be resolved or not.
- </UL>
-
- <UL><CODE>va</CODE> - Optional name/value array of variables to replace in language string.
- </UL>
-
- </UL>
-
- <!-- METHOD PARAMETERS END -->
-
-
- <UL>
- <B>Returns:</B>
- <UL>
- Language string value could be a number if it's a relative dimenstion.
- </UL>
- </UL>
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="getNodeTree"><!-- --></A>
- <H3>getNodeTree</H3>
- <PRE>Array <B>getNodeTree</B>(&l<int> t;HTMLNode> n, <Array> na, t, <string> nn)</PRE>
-
- <UL>Returns a array of nodes selected retrived from the child nodes of the specified node.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <UL>
- <B>Parameters:</B>
-
- <UL><CODE>n</CODE> - Node to get children from.
- </UL>
-
- <UL><CODE>na</CODE> - Array to fill with children.
- </UL>
-
- <UL><CODE>t</CODE> - Node type to get.
- </UL>
-
- <UL><CODE>nn</CODE> - Node name of items to retrive.
- </UL>
-
- </UL>
-
- <!-- METHOD PARAMETERS END -->
-
-
- <UL>
- <B>Returns:</B>
- <UL>
- Node array.
- </UL>
- </UL>
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="getOuterHTML"><!-- --></A>
- <H3>getOuterHTML</H3>
- <PRE>string <B>getOuterHTML</B>(<HTMLElement> e)</PRE>
-
- <UL>Returns the outer HTML of a element, this uses the outerHTML
- property in MSIE and Opera and a workaround for Gecko.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <UL>
- <B>Parameters:</B>
-
- <UL><CODE>e</CODE> - HTML element to get outerHTML from.
- </UL>
-
- </UL>
-
- <!-- METHOD PARAMETERS END -->
-
-
- <UL>
- <B>Returns:</B>
- <UL>
- HTML content string.
- </UL>
- </UL>
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="getParam"><!-- --></A>
- <H3>getParam</H3>
- <PRE>object <B>getParam</B>(<string> name, <string> default_value, <boolean> strip_whitespace, <string> split_chr)</PRE>
-
- <UL>Returns a specific configuration setting or the default value if it wasn't found.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <UL>
- <B>Parameters:</B>
-
- <UL><CODE>name</CODE> - Configuration setting to get.
- </UL>
-
- <UL><CODE>default_value</CODE> - Default value to return if it wasn't found.
- </UL>
-
- <UL><CODE>strip_whitespace</CODE> - Optional remove all whitespace.
- </UL>
-
- <UL><CODE>split_chr</CODE> - Split char/regex/string.
- </UL>
-
- </UL>
-
- <!-- METHOD PARAMETERS END -->
-
-
- <UL>
- <B>Returns:</B>
- <UL>
- Number, string or other object based in parameter and default_value.
- </UL>
- </UL>
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="getParentBlockElement"><!-- --></A>
- <H3>getParentBlockElement</H3>
- <PRE>HTMLElement <B>getParentBlockElement</B>(<HTMLNode> n)</PRE>
-
- <UL>Returns the first block element parent of the specified node.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <UL>
- <B>Parameters:</B>
-
- <UL><CODE>n</CODE> - Node get parent block element for.
- </UL>
-
- </UL>
-
- <!-- METHOD PARAMETERS END -->
-
-
- <UL>
- <B>Returns:</B>
- <UL>
- First block element parent of the specified node or null if it wasn't found.
- </UL>
- </UL>
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="getParentElement"><!-- --></A>
- <H3>getParentElement</H3>
- <PRE>HTMLElement <B>getParentElement</B>(<HTMLNode> node, <string> names, <string> attrib_name, <string> attrib_value)</PRE>
-
- <UL>Returns the parent element of the specified node based on the search criteria.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <UL>
- <B>Parameters:</B>
-
- <UL><CODE>node</CODE> - Node to get parent element of.
- </UL>
-
- <UL><CODE>names</CODE> - Comma separated list of element names to get.
- </UL>
-
- <UL><CODE>attrib_name</CODE> - Optional attribute name to match.
- </UL>
-
- <UL><CODE>attrib_value</CODE> - Optional attribute value to match.
- </UL>
-
- </UL>
-
- <!-- METHOD PARAMETERS END -->
-
-
- <UL>
- <B>Returns:</B>
- <UL>
- HTMLElement or null based on search criteras.
- </UL>
- </UL>
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="getParentNode"><!-- --></A>
- <H3>getParentNode</H3>
- <PRE>DOMNode <B>getParentNode</B>(<DOMNode> n, <function> f)</PRE>
-
- <UL>Returns a node by the specified selector function. This function will
- loop through all parent nodes and call the specified function for each node.
- If the function then returns true it will stop the execution and return that node.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <UL>
- <B>Parameters:</B>
-
- <UL><CODE>n</CODE> - HTML node to search parents on.
- </UL>
-
- <UL><CODE>f</CODE> - Selection function to execute on each node.
- </UL>
-
- </UL>
-
- <!-- METHOD PARAMETERS END -->
-
-
- <UL>
- <B>Returns:</B>
- <UL>
- DOMNode or null if it wasn't found.
- </UL>
- </UL>
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="getVisualAidClass"><!-- --></A>
- <H3>getVisualAidClass</H3>
- <PRE>string <B>getVisualAidClass</B>(<string> class_name, <boolean> state)</PRE>
-
- <UL>Returns the visual aid class string, this will add/remove the visual aid class.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <UL>
- <B>Parameters:</B>
-
- <UL><CODE>class_name</CODE> - Class name value to add/remove visual aid classes from.
- </UL>
-
- <UL><CODE>state</CODE> - true/false if the classes should be added or removed.
- </UL>
-
- </UL>
-
- <!-- METHOD PARAMETERS END -->
-
-
- <UL>
- <B>Returns:</B>
- <UL>
- New class value containing the visual aid classes or not.
- </UL>
- </UL>
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="getWindowArg"><!-- --></A>
- <H3>getWindowArg</H3>
- <PRE>Object <B>getWindowArg</B>(<string> n, d)</PRE>
-
- <UL>Returns the window argument to be passed to TinyMCE popup.
- TinyMCE_Engine.prototype.Use = tinyMCEPopup;.getWindowArg instead.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <UL>
- <B>Parameters:</B>
-
- <UL><CODE>n</CODE> - Window argument name.
- </UL>
-
- </UL>
-
- <!-- METHOD PARAMETERS END -->
-
-
- <UL>
- <B>Returns:</B>
- <UL>
- Argument value or default value if it wasn't found.
- </UL>
- </UL>
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <UL>
- <B>Deprecated</B> <I></I><BR/><BR/>
- </UL>
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="handleEvent"><!-- --></A>
- <H3>handleEvent</H3>
- <PRE>boolean <B>handleEvent</B>(<DOMEvent> e)</PRE>
-
- <UL>Event handler function that gets executed each time a event occurs in a TinyMCE editor control instance.
- TinyMCE_Engine.prototype.Todo = Fix;the return statements so they return true or false.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <UL>
- <B>Parameters:</B>
-
- <UL><CODE>e</CODE> - DOM event object reference.
- </UL>
-
- </UL>
-
- <!-- METHOD PARAMETERS END -->
-
-
- <UL>
- <B>Returns:</B>
- <UL>
- true - if the event is to be chained, false - if the event chain is to be canceled.
- </UL>
- </UL>
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="handleVisualAid"><!-- --></A>
- <H3>handleVisualAid</H3>
- <PRE>void <B>handleVisualAid</B>(<HTMLElement> el, <boolean> deep, <boolean> state, <<a href="TinyMCE_Control.html">TinyMCE_Control</a>> inst, skip_dispatch)</PRE>
-
- <UL>Adds visual aid classes to all elements that need them recursive in the DOM tree.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <UL>
- <B>Parameters:</B>
-
- <UL><CODE>el</CODE> - HTML element to add visual aid classes to.
- </UL>
-
- <UL><CODE>deep</CODE> - Should they be added to all children aswell.
- </UL>
-
- <UL><CODE>state</CODE> - Should they be added or removed.
- </UL>
-
- <UL><CODE>inst</CODE> - TinyMCE editor control instance to add/remove them to/from.
- </UL>
-
- </UL>
-
- <!-- METHOD PARAMETERS END -->
-
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="hasMenu"><!-- --></A>
- <H3>hasMenu</H3>
- <PRE>boolean <B>hasMenu</B>(<string> n)</PRE>
-
- <UL>Checks if the specified menu by name is added to TinyMCE.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <UL>
- <B>Parameters:</B>
-
- <UL><CODE>n</CODE> - TinyMCE menu id.
- </UL>
-
- </UL>
-
- <!-- METHOD PARAMETERS END -->
-
-
- <UL>
- <B>Returns:</B>
- <UL>
- true/false if it exists or not.
- </UL>
- </UL>
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="hasPlugin"><!-- --></A>
- <H3>hasPlugin</H3>
- <PRE>boolean <B>hasPlugin</B>(<string> n)</PRE>
-
- <UL>Returns true/false if the specified plugin is loaded or not.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <UL>
- <B>Parameters:</B>
-
- <UL><CODE>n</CODE> - Plugin name to look for.
- </UL>
-
- </UL>
-
- <!-- METHOD PARAMETERS END -->
-
-
- <UL>
- <B>Returns:</B>
- <UL>
- true/false if the specified plugin is loaded or not.
- </UL>
- </UL>
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="hasTheme"><!-- --></A>
- <H3>hasTheme</H3>
- <PRE>boolean <B>hasTheme</B>(<string> n)</PRE>
-
- <UL>Returns true/false if the specified theme is loaded or not.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <UL>
- <B>Parameters:</B>
-
- <UL><CODE>n</CODE> - Theme name/id to check for.
- </UL>
-
- </UL>
-
- <!-- METHOD PARAMETERS END -->
-
-
- <UL>
- <B>Returns:</B>
- <UL>
- true/false if the specified theme is loaded or not.
- </UL>
- </UL>
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="importCSS"><!-- --></A>
- <H3>importCSS</H3>
- <PRE>void <B>importCSS</B>(<DOMDocument> doc, <string> css)</PRE>
-
- <UL>Imports a CSS file into a allready loaded document. This will add a link element
- to the head element of the document.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <UL>
- <B>Parameters:</B>
-
- <UL><CODE>doc</CODE> - DOM Document to load CSS into.
- </UL>
-
- <UL><CODE>css</CODE> - CSS File URL to load or comma separated list of files.
- </UL>
-
- </UL>
-
- <!-- METHOD PARAMETERS END -->
-
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="importPluginLanguagePack"><!-- --></A>
- <H3>importPluginLanguagePack</H3>
- <PRE>void <B>importPluginLanguagePack</B>(<string> name, <string> valid_languages)</PRE>
-
- <UL>Loads a plugin specific language pack.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <UL>
- <B>Parameters:</B>
-
- <UL><CODE>name</CODE> - Plugin name/id to load language pack for.
- </UL>
-
- <UL><CODE>valid_languages</CODE> - Comma separated list of valid languages for the plugin.
- </UL>
-
- </UL>
-
- <!-- METHOD PARAMETERS END -->
-
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="importThemeLanguagePack"><!-- --></A>
- <H3>importThemeLanguagePack</H3>
- <PRE>void <B>importThemeLanguagePack</B>(<string> name)</PRE>
-
- <UL>Loads a theme specific language pack.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <UL>
- <B>Parameters:</B>
-
- <UL><CODE>name</CODE> - Optional name of the theme to load language pack from.
- </UL>
-
- </UL>
-
- <!-- METHOD PARAMETERS END -->
-
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="init"><!-- --></A>
- <H3>init</H3>
- <PRE>void <B>init</B>(settings)</PRE>
-
- <UL>Initializes TinyMCE with the specific configuration settings. This method
- may be called multiple times when multiple instances with diffrent settings is to be created.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <UL>
- <B>Parameters:</B>
-
- <UL><CODE>Name</CODE> - /Value array of initialization settings.
- </UL>
-
- </UL>
-
- <!-- METHOD PARAMETERS END -->
-
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="insertAfter"><!-- --></A>
- <H3>insertAfter</H3>
- <PRE>void <B>insertAfter</B>(<HTMLNode> n, <HTMLNode> r)</PRE>
-
- <UL>Inserts a node after the specific node.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <UL>
- <B>Parameters:</B>
-
- <UL><CODE>n</CODE> - New node to insert.
- </UL>
-
- <UL><CODE>r</CODE> - Reference node to insert after.
- </UL>
-
- </UL>
-
- <!-- METHOD PARAMETERS END -->
-
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="isBlockElement"><!-- --></A>
- <H3>isBlockElement</H3>
- <PRE>boolean <B>isBlockElement</B>(<HTMLNode> n)</PRE>
-
- <UL>Returns true/false if the specified node is a block element or not.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <UL>
- <B>Parameters:</B>
-
- <UL><CODE>n</CODE> - Node to verify.
- </UL>
-
- </UL>
-
- <!-- METHOD PARAMETERS END -->
-
-
- <UL>
- <B>Returns:</B>
- <UL>
- true/false if the specified node is a block element or not.
- </UL>
- </UL>
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="isInstance"><!-- --></A>
- <H3>isInstance</H3>
- <PRE>boolean <B>isInstance</B>(<object> o)</PRE>
-
- <UL>Returns true/false if a specific object is a TinyMCE_Control instance or not.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <UL>
- <B>Parameters:</B>
-
- <UL><CODE>o</CODE> - Object to check.
- </UL>
-
- </UL>
-
- <!-- METHOD PARAMETERS END -->
-
-
- <UL>
- <B>Returns:</B>
- <UL>
- true/false if it's a control or not.
- </UL>
- </UL>
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="loadCSS"><!-- --></A>
- <H3>loadCSS</H3>
- <PRE>void <B>loadCSS</B>(<string> url)</PRE>
-
- <UL>Loads the specified CSS by writing the a link tag to the current page.
- This will also check if the file has been loaded before. This function should only be used
- when the page is loading.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <UL>
- <B>Parameters:</B>
-
- <UL><CODE>url</CODE> - CSS file URL to load or comma separated list of files.
- </UL>
-
- </UL>
-
- <!-- METHOD PARAMETERS END -->
-
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="loadPlugin"><!-- --></A>
- <H3>loadPlugin</H3>
- <PRE>void <B>loadPlugin</B>(<string> n, <string> u)</PRE>
-
- <UL>Load plugin from external URL.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <UL>
- <B>Parameters:</B>
-
- <UL><CODE>n</CODE> - Plugin name for example \"emotions\".
- </UL>
-
- <UL><CODE>u</CODE> - URL of plugin directory to load.
- </UL>
-
- </UL>
-
- <!-- METHOD PARAMETERS END -->
-
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="loadScript"><!-- --></A>
- <H3>loadScript</H3>
- <PRE>void <B>loadScript</B>(<string> url)</PRE>
-
- <UL>Loads the specified script by writing the a script tag to the current page.
- This will also check if the file has been loaded before. This function should only be used
- when the page is loading.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <UL>
- <B>Parameters:</B>
-
- <UL><CODE>url</CODE> - Script URL to load.
- </UL>
-
- </UL>
-
- <!-- METHOD PARAMETERS END -->
-
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="nextNode"><!-- --></A>
- <H3>nextNode</H3>
- <PRE>HTMLElement <B>nextNode</B>(<HTMLNode> e, <string> n)</PRE>
-
- <UL>Finds any element after the current one by name. This will loop through the siblings
- inorder to find the specified element by name. If the element wasn't found
- it will return a null value.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <UL>
- <B>Parameters:</B>
-
- <UL><CODE>e</CODE> - HTML node to search from.
- </UL>
-
- <UL><CODE>n</CODE> - Comma separated list of element names to search for.
- </UL>
-
- </UL>
-
- <!-- METHOD PARAMETERS END -->
-
-
- <UL>
- <B>Returns:</B>
- <UL>
- HTML Element or null if it wasn't found.
- </UL>
- </UL>
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="onLoad"><!-- --></A>
- <H3>onLoad</H3>
- <PRE>boolean <B>onLoad</B>()</PRE>
-
- <UL>Gets executed when the page loads or get intitialized. This function will then convert all textareas/divs that
- is to be converted into TinyMCE editor controls.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <!-- METHOD PARAMETERS END -->
-
-
- <UL>
- <B>Returns:</B>
- <UL>
- true - if the event is to be chained, false - if the event chain is to be canceled.
- </UL>
- </UL>
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="onMouseMove"><!-- --></A>
- <H3>onMouseMove</H3>
- <PRE>void <B>onMouseMove</B>()</PRE>
-
- <UL>Mouse move handler function, this will be executed each time
- the mouse is moved within a editor instance. This function stores away the current selection in MSIE
- this will then be used when a undo/redo level is added.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <!-- METHOD PARAMETERS END -->
-
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="openWindow"><!-- --></A>
- <H3>openWindow</H3>
- <PRE>void <B>openWindow</B>(<Array> template, <Array> args)</PRE>
-
- <UL>Opens a popup window based in the specified input data. This function
- is used for all popup windows in TinyMCE.
-
- These are the current template TinyMCE_Engine.prototype.keys = file; width, height, close_previous.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <UL>
- <B>Parameters:</B>
-
- <UL><CODE>template</CODE> - Popup template data such as with, height etc.
- </UL>
-
- <UL><CODE>args</CODE> - Popup arguments that is to be passed to the popup such as custom data.
- </UL>
-
- </UL>
-
- <!-- METHOD PARAMETERS END -->
-
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="parseStyle"><!-- --></A>
- <H3>parseStyle</H3>
- <PRE>Array <B>parseStyle</B>(<string> str)</PRE>
-
- <UL>Parses the specified HTML style data. This will parse for example
- "border-left: 1px; background-color: red" into an key/value array.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <UL>
- <B>Parameters:</B>
-
- <UL><CODE>str</CODE> - Style data to parse.
- </UL>
-
- </UL>
-
- <!-- METHOD PARAMETERS END -->
-
-
- <UL>
- <B>Returns:</B>
- <UL>
- Name/Value array of style items.
- </UL>
- </UL>
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="parseURL"><!-- --></A>
- <H3>parseURL</H3>
- <PRE>TinyMCE_URL_Item <B>parseURL</B>(<string> url_str)</PRE>
-
- <UL>Parses a URL in to its diffrent components.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <UL>
- <B>Parameters:</B>
-
- <UL><CODE>url_str</CODE> - URL string to parse into a URL object.
- </UL>
-
- </UL>
-
- <!-- METHOD PARAMETERS END -->
-
-
- <UL>
- <B>Returns:</B>
- <UL>
- URL object based on input string.
- </UL>
- </UL>
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="prevNode"><!-- --></A>
- <H3>prevNode</H3>
- <PRE>HTMLElement <B>prevNode</B>(<HTMLNode> e, <string> n)</PRE>
-
- <UL>Finds any previous element by name. This will loop through the siblings
- inorder to find the specified element by name. If the element wasn't found
- it will return a null value.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <UL>
- <B>Parameters:</B>
-
- <UL><CODE>e</CODE> - HTML node to search from.
- </UL>
-
- <UL><CODE>n</CODE> - Comma separated list of element names to search for.
- </UL>
-
- </UL>
-
- <!-- METHOD PARAMETERS END -->
-
-
- <UL>
- <B>Returns:</B>
- <UL>
- HTML Element or null if it wasn't found.
- </UL>
- </UL>
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="queryInstanceCommandState"><!-- --></A>
- <H3>queryInstanceCommandState</H3>
- <PRE>boolean <B>queryInstanceCommandState</B>(<string> editor_id, <string> command)</PRE>
-
- <UL>Queries a command state for a specific command on a specific editor instance.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <UL>
- <B>Parameters:</B>
-
- <UL><CODE>editor_id</CODE> - Editor id to query command state on.
- </UL>
-
- <UL><CODE>command</CODE> - Command to query for.
- </UL>
-
- </UL>
-
- <!-- METHOD PARAMETERS END -->
-
-
- <UL>
- <B>Returns:</B>
- <UL>
- Command state passed from browser.
- </UL>
- </UL>
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="queryInstanceCommandValue"><!-- --></A>
- <H3>queryInstanceCommandValue</H3>
- <PRE>object <B>queryInstanceCommandValue</B>(<string> editor_id, <string> command)</PRE>
-
- <UL>Queries a command value for a specific command on a specific editor instance.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <UL>
- <B>Parameters:</B>
-
- <UL><CODE>editor_id</CODE> - Editor id to query command value on.
- </UL>
-
- <UL><CODE>command</CODE> - Command to query for.
- </UL>
-
- </UL>
-
- <!-- METHOD PARAMETERS END -->
-
-
- <UL>
- <B>Returns:</B>
- <UL>
- Command value passed from browser.
- </UL>
- </UL>
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="regexpReplace"><!-- --></A>
- <H3>regexpReplace</H3>
- <PRE>string <B>regexpReplace</B>(<string> in_str, <string> reg_exp, <string> replace_str, opts)</PRE>
-
- <UL>Regexp replaces the contents of a string. Use normal replace instead.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <UL>
- <B>Parameters:</B>
-
- <UL><CODE>in_str</CODE> - String to replace in.
- </UL>
-
- <UL><CODE>in_str</CODE> - Optional regexp options like "gi".
- </UL>
-
- <UL><CODE>reg_exp</CODE> - Regexp to replace.
- </UL>
-
- <UL><CODE>replace_str</CODE> - String to replace with.
- </UL>
-
- </UL>
-
- <!-- METHOD PARAMETERS END -->
-
-
- <UL>
- <B>Returns:</B>
- <UL>
- Replaced string value.
- </UL>
- </UL>
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <UL>
- <B>Deprecated</B> <I></I><BR/><BR/>
- </UL>
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="removeCSSClass"><!-- --></A>
- <H3>removeCSSClass</H3>
- <PRE>string <B>removeCSSClass</B>(<HTMLElement> e, c)</PRE>
-
- <UL>Removes the specified CSS class from the element.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <UL>
- <B>Parameters:</B>
-
- <UL><CODE>e</CODE> - HTML element to remove CSS class to.
- </UL>
-
- <UL><CODE>string</CODE> - ] c CSS class to remove to HTML element.
- </UL>
-
- </UL>
-
- <!-- METHOD PARAMETERS END -->
-
-
- <UL>
- <B>Returns:</B>
- <UL>
- Returns the new class attribute value.
- </UL>
- </UL>
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="removeMCEControl"><!-- --></A>
- <H3>removeMCEControl</H3>
- <PRE>void <B>removeMCEControl</B>(<string> editor_id)</PRE>
-
- <UL>Removes a TinyMCE editor control instance by id.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <UL>
- <B>Parameters:</B>
-
- <UL><CODE>editor_id</CODE> - Id of editor instance to remove.
- </UL>
-
- </UL>
-
- <!-- METHOD PARAMETERS END -->
-
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="removeTinyMCEFormElements"><!-- --></A>
- <H3>removeTinyMCEFormElements</H3>
- <PRE>void <B>removeTinyMCEFormElements</B>(<HTMLElement> form_obj)</PRE>
-
- <UL>Removes/disables TinyMCE built in form elements such as select boxes for font sizes etc.
- These are disabled when the user submits a form so they don't get picked up by the backend script
- that intercepts the contents.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <UL>
- <B>Parameters:</B>
-
- <UL><CODE>form_obj</CODE> - Form object to loop through for TinyMCE specific form elements.
- </UL>
-
- </UL>
-
- <!-- METHOD PARAMETERS END -->
-
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="renameElement"><!-- --></A>
- <H3>renameElement</H3>
- <PRE>void <B>renameElement</B>(<HTMLElement> e, <string> n, <DOMDocument> d)</PRE>
-
- <UL>Renames the specified element to the specified name.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <UL>
- <B>Parameters:</B>
-
- <UL><CODE>e</CODE> - Element to rename.
- </UL>
-
- <UL><CODE>n</CODE> - New name of the element.
- </UL>
-
- <UL><CODE>d</CODE> - Optional document reference.
- </UL>
-
- </UL>
-
- <!-- METHOD PARAMETERS END -->
-
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="replaceVar"><!-- --></A>
- <H3>replaceVar</H3>
- <PRE>string <B>replaceVar</B>(<string> h, <string> r, <string> v)</PRE>
-
- <UL>Replaces a specific variable in the string with a nother string.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <UL>
- <B>Parameters:</B>
-
- <UL><CODE>h</CODE> - String to search in for the variable.
- </UL>
-
- <UL><CODE>r</CODE> - Variable name to search for.
- </UL>
-
- <UL><CODE>v</CODE> - Value to insert where a variable is found.
- </UL>
-
- </UL>
-
- <!-- METHOD PARAMETERS END -->
-
-
- <UL>
- <B>Returns:</B>
- <UL>
- String with replaced variable.
- </UL>
- </UL>
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="resetForm"><!-- --></A>
- <H3>resetForm</H3>
- <PRE>void <B>resetForm</B>(<int> form_index)</PRE>
-
- <UL>Resets a forms TinyMCE instances based on form index.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <UL>
- <B>Parameters:</B>
-
- <UL><CODE>form_index</CODE> - Form index to reset.
- </UL>
-
- </UL>
-
- <!-- METHOD PARAMETERS END -->
-
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="selectNodes"><!-- --></A>
- <H3>selectNodes</H3>
- <PRE>Array <B>selectNodes</B>(<DOMNode> n, <function> f, <Array> a)</PRE>
-
- <UL>Returns a array of nodes when the specified function matches a node.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <UL>
- <B>Parameters:</B>
-
- <UL><CODE>n</CODE> - Node to select children from.
- </UL>
-
- <UL><CODE>f</CODE> - Function that returns true/false if the node is to be added or not.
- </UL>
-
- <UL><CODE>a</CODE> - Optional array to fill with nodes.
- </UL>
-
- </UL>
-
- <!-- METHOD PARAMETERS END -->
-
-
- <UL>
- <B>Returns:</B>
- <UL>
- Array with selected nodes.
- </UL>
- </UL>
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="serializeStyle"><!-- --></A>
- <H3>serializeStyle</H3>
- <PRE>string <B>serializeStyle</B>(<Array> ar)</PRE>
-
- <UL>Serializes the specified style item name/value array into a HTML string. This function
- will force HEX colors in Firefox and convert the URL items of a style correctly.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <UL>
- <B>Parameters:</B>
-
- <UL><CODE>ar</CODE> - Name/Value array of items to serialize.
- </UL>
-
- </UL>
-
- <!-- METHOD PARAMETERS END -->
-
-
- <UL>
- <B>Returns:</B>
- <UL>
- Serialized HTML string containing the items.
- </UL>
- </UL>
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="serializeURL"><!-- --></A>
- <H3>serializeURL</H3>
- <PRE>string <B>serializeURL</B>(<TinyMCE_URL_Item> up)</PRE>
-
- <UL>Serializes the specified URL object into a string.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <UL>
- <B>Parameters:</B>
-
- <UL><CODE>up</CODE> - URL object to serialize.
- </UL>
-
- </UL>
-
- <!-- METHOD PARAMETERS END -->
-
-
- <UL>
- <B>Returns:</B>
- <UL>
- Serialized URL object.
- </UL>
- </UL>
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="setAttrib"><!-- --></A>
- <H3>setAttrib</H3>
- <PRE>void <B>setAttrib</B>(<HTMLElement> element, <string> name, <string> value, <boolean> fix_value)</PRE>
-
- <UL>Sets the attribute value for a specific attribute.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <UL>
- <B>Parameters:</B>
-
- <UL><CODE>element</CODE> - HTML element to set attribute on.
- </UL>
-
- <UL><CODE>name</CODE> - Attribute name to set.
- </UL>
-
- <UL><CODE>value</CODE> - Attribute value to set.
- </UL>
-
- <UL><CODE>fix_value</CODE> - Optional fix value state, if true only number data will be accepted.
- </UL>
-
- </UL>
-
- <!-- METHOD PARAMETERS END -->
-
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="setContent"><!-- --></A>
- <H3>setContent</H3>
- <PRE>void <B>setContent</B>(<string> h)</PRE>
-
- <UL>Sets the HTML contents of the selected editor instance.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <UL>
- <B>Parameters:</B>
-
- <UL><CODE>h</CODE> - HTML contents to set in the selected instance.
- </UL>
-
- </UL>
-
- <!-- METHOD PARAMETERS END -->
-
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <UL>
- <B>Deprecated</B> <I></I><BR/><BR/>
- </UL>
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="setInnerHTML"><!-- --></A>
- <H3>setInnerHTML</H3>
- <PRE>void <B>setInnerHTML</B>(<HTMLElement> e, <string> h)</PRE>
-
- <UL>Sets the innerHTML property of a element, this function also
- fixes a MSIE bug where the first comment is removed.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <UL>
- <B>Parameters:</B>
-
- <UL><CODE>e</CODE> - Element to insert HTML in.
- </UL>
-
- <UL><CODE>h</CODE> - HTML code to insert into innerHTML.
- </UL>
-
- </UL>
-
- <!-- METHOD PARAMETERS END -->
-
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="setOuterHTML"><!-- --></A>
- <H3>setOuterHTML</H3>
- <PRE>void <B>setOuterHTML</B>(<HTMLElement> e, <string> h)</PRE>
-
- <UL>Sets the outer HTML of a element, this uses the outerHTML
- property in MSIE and Opera and a workaround for Gecko.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <UL>
- <B>Parameters:</B>
-
- <UL><CODE>e</CODE> - HTML element to set outerHTML on.
- </UL>
-
- <UL><CODE>h</CODE> - HTML string to set in property.
- </UL>
-
- </UL>
-
- <!-- METHOD PARAMETERS END -->
-
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="setPluginBaseURL"><!-- --></A>
- <H3>setPluginBaseURL</H3>
- <PRE>void <B>setPluginBaseURL</B>(<string> n, <string> u)</PRE>
-
- <UL>Sets the baseURL of the specified plugin, this is useful if the plugin is loaded from
- a external location.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <UL>
- <B>Parameters:</B>
-
- <UL><CODE>n</CODE> - Plugin name/id to set base URL on. This have to be added before.
- </UL>
-
- <UL><CODE>u</CODE> - Base URL of plugin, this string should be the URL prefix for the plugin without a trailing slash.
- </UL>
-
- </UL>
-
- <!-- METHOD PARAMETERS END -->
-
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="setStyleAttrib"><!-- --></A>
- <H3>setStyleAttrib</H3>
- <PRE>void <B>setStyleAttrib</B>(<HTMLElement> elm, <string> name, <string> value)</PRE>
-
- <UL>Sets a style attribute item value.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <UL>
- <B>Parameters:</B>
-
- <UL><CODE>elm</CODE> - HTML element to set style attribute item on.
- </UL>
-
- <UL><CODE>name</CODE> - Style item name to set.
- </UL>
-
- <UL><CODE>value</CODE> - Style item value to set.
- </UL>
-
- </UL>
-
- <!-- METHOD PARAMETERS END -->
-
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="setupContent"><!-- --></A>
- <H3>setupContent</H3>
- <PRE>void <B>setupContent</B>(<string> editor_id)</PRE>
-
- <UL>Setups the contents of TinyMCE editor instance and fills it with contents.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <UL>
- <B>Parameters:</B>
-
- <UL><CODE>editor_id</CODE> - TinyMCE editor instance control id to fill.
- </UL>
-
- </UL>
-
- <!-- METHOD PARAMETERS END -->
-
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="setWindowArg"><!-- --></A>
- <H3>setWindowArg</H3>
- <PRE>void <B>setWindowArg</B>(<string> n, <string> v)</PRE>
-
- <UL>Sets the window argument to be passed to TinyMCE popup.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <UL>
- <B>Parameters:</B>
-
- <UL><CODE>n</CODE> - Window argument name.
- </UL>
-
- <UL><CODE>v</CODE> - Window argument value.
- </UL>
-
- </UL>
-
- <!-- METHOD PARAMETERS END -->
-
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="storeAwayURLs"><!-- --></A>
- <H3>storeAwayURLs</H3>
- <PRE>string <B>storeAwayURLs</B>(<string> s)</PRE>
-
- <UL>Stores away the src and href attribute values in separate mce_src and mce_href attributes.
- This is needed since both MSIE and Gecko messes with these attributes. The old
- src and href will be intact, this simply adds them to a separate attribute.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <UL>
- <B>Parameters:</B>
-
- <UL><CODE>s</CODE> - HTML string to replace src and href attributes in.
- </UL>
-
- </UL>
-
- <!-- METHOD PARAMETERS END -->
-
-
- <UL>
- <B>Returns:</B>
- <UL>
- HTML string with replaced src and href attributes.
- </UL>
- </UL>
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="submitPatch"><!-- --></A>
- <H3>submitPatch</H3>
- <PRE>void <B>submitPatch</B>()</PRE>
-
- <UL>Piggyback onsubmit event handler function, this will remove/hide the TinyMCE specific form elements
- call triggerSave to fill the textarea with the correct contents then call the old piggy backed event handler.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <!-- METHOD PARAMETERS END -->
-
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="switchClass"><!-- --></A>
- <H3>switchClass</H3>
- <PRE>void <B>switchClass</B>(<HTMLElement> ei, <string> c)</PRE>
-
- <UL>Switches the CSS class of the specified element. This method also caches the
- elements in a lookup table for performance. This should only be used for TinyMCE main UI controls
- like buttons or select elements.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <UL>
- <B>Parameters:</B>
-
- <UL><CODE>ei</CODE> - Element to set CSS class on.
- </UL>
-
- <UL><CODE>c</CODE> - CSS class to set.
- </UL>
-
- </UL>
-
- <!-- METHOD PARAMETERS END -->
-
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="triggerNodeChange"><!-- --></A>
- <H3>triggerNodeChange</H3>
- <PRE>void <B>triggerNodeChange</B>(<boolean> focus, <boolean> setup_content)</PRE>
-
- <UL>Triggers a nodeChange event to every theme and plugin. This will be executed when the cursor moves or
- when a command that modifies the editor contents is executed.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <UL>
- <B>Parameters:</B>
-
- <UL><CODE>focus</CODE> - Optional state if the last selected editor instance is to be focused or not.
- </UL>
-
- <UL><CODE>setup_content</CODE> - Optional state if it's called from setup content function or not.
- </UL>
-
- </UL>
-
- <!-- METHOD PARAMETERS END -->
-
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="triggerSave"><!-- --></A>
- <H3>triggerSave</H3>
- <PRE>void <B>triggerSave</B>(<boolean> skip_cleanup, <boolean> skip_callback)</PRE>
-
- <UL>Moves the contents from a TinyMCE editor control instance to the hidden textarea
- that got replaced with TinyMCE. This is executed automaticly on for example form submit.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <UL>
- <B>Parameters:</B>
-
- <UL><CODE>skip_cleanup</CODE> - Optional Skip cleanup, simply move the contents as fast as possible.
- </UL>
-
- <UL><CODE>skip_callback</CODE> - Optional Skip callback, don't call the save_callback function.
- </UL>
-
- </UL>
-
- <!-- METHOD PARAMETERS END -->
-
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="trim"><!-- --></A>
- <H3>trim</H3>
- <PRE>string <B>trim</B>(<string> s)</PRE>
-
- <UL>Removes all prefix, suffix whitespace of a string.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <UL>
- <B>Parameters:</B>
-
- <UL><CODE>s</CODE> - String to replace whitespace in.
- </UL>
-
- </UL>
-
- <!-- METHOD PARAMETERS END -->
-
-
- <UL>
- <B>Returns:</B>
- <UL>
- Replaced string value.
- </UL>
- </UL>
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="unloadHandler"><!-- --></A>
- <H3>unloadHandler</H3>
- <PRE>void <B>unloadHandler</B>()</PRE>
-
- <UL>Unload document event handler function. This function will be executed when the
- page is unloaded, this will automaticly move the current editor contents to the textarea element this enables
- the editor to restore it's state when the user presses the back button in the browser.
- This will execute the triggerSave function.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <!-- METHOD PARAMETERS END -->
-
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="updateContent"><!-- --></A>
- <H3>updateContent</H3>
- <PRE>void <B>updateContent</B>(<string> form_element_name)</PRE>
-
- <UL>Moves the contents from the hidden textarea to the editor that gets inserted.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <UL>
- <B>Parameters:</B>
-
- <UL><CODE>form_element_name</CODE> - Form element name to move contents from.
- </UL>
-
- </UL>
-
- <!-- METHOD PARAMETERS END -->
-
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <UL>
- <B>Deprecated</B> <I></I><BR/><BR/>
- </UL>
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="xmlEncode"><!-- --></A>
- <H3>xmlEncode</H3>
- <PRE>string <B>xmlEncode</B>(<string> s)</PRE>
-
- <UL>Encodes the string to raw XML entities. This will only convert the most common ones.
- For real entity encoding use the xmlEncode method of the Cleanup class.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <UL>
- <B>Parameters:</B>
-
- <UL><CODE>s</CODE> - String to encode.
- </UL>
-
- </UL>
-
- <!-- METHOD PARAMETERS END -->
-
-
- <UL>
- <B>Returns:</B>
- <UL>
- XML Encoded string.
- </UL>
- </UL>
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
-
-
-<!-- ============ METHOD DETAIL END ========== -->
-
-<!-- ========= END OF CLASS DATA ========= -->
-
-<!-- ========== START OF NAVBAR ========== -->
-<A NAME="navbar_bottom"><!-- --></A>
-<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0">
-<TR>
-<TD COLSPAN=3 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
-<A NAME="navbar_bottom_firstrow"><!-- --></A>
-<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3">
- <TR ALIGN="center" VALIGN="top">
- <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="overview-summary.html"><FONT CLASS="NavBarFont1"><B>Overview</B></FONT></A> </TD>
- <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="overview-summary-TinyMCE_Engine.class.js.html"><FONT CLASS="NavBarFont1"><B>File</B></FONT></A> </TD>
- <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> <FONT CLASS="NavBarFont1Rev"><B>Class</B></FONT> </TD>
- <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="overview-tree.html"><FONT CLASS="NavBarFont1"><b>Tree</b></FONT></A> </TD>
- <!--TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"--> <!--A HREF="deprecated-list.html"--><!--FONT CLASS="NavBarFont1">Deprecated</FONT--><!--/A--><!-- </TD-->
- <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
- <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
- </TR>
-</TABLE>
-</TD>
-<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
-<B></B>
-</EM>
-</TD
-</TR>
-
-<TR>
-<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
- <A HREF="TinyMCE_Control.html"><B>PREV CLASS</B></A><!--
- NEXT CLASS
--->
- <A HREF="TinyMCE_Layer.html"><B>NEXT CLASS</B></A></FONT></TD>
-<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
- <A HREF="index.html" TARGET="_top"><B>FRAMES</B></A>
- <A HREF="TinyMCE_Engine.html" TARGET="_top"><B>NO FRAMES</B></A>
-
-<SCRIPT>
- <!--
- if(window==top) {
- document.writeln('<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>');
- }
- //-->
-</SCRIPT>
-<NOSCRIPT>
-<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>
-</NOSCRIPT>
-</FONT></TD>
-</TR>
-<TR>
-<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
- SUMMARY: <A HREF="#field_summary">FIELD</A> | <A HREF="#constructor_summary">CONSTR</A> | <A HREF="#method_summary">METHOD</A></FONT></TD>
-<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
-DETAIL: <A HREF="#field_detail">FIELD</A> | <A HREF="#constructor_detail">CONSTR</A> | <A HREF="#method_detail">METHOD</A></FONT></TD>
-</TR>
-</TABLE>
-
-<!-- =========== END OF NAVBAR =========== -->
-
-<HR>
-<FONT SIZE="-1">
-
-</FONT>
-<div class="jsdoc_ctime">Documentation generated by <a href="http://jsdoc.sourceforge.net/" target="_parent">JSDoc</a> on Fri Apr 14 21:59:23 2006</div>
-</BODY>
-</HTML>
Copied: trunk/htdocs/js/tinymce/docs/tinymce_api/TinyMCE_Engine.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/tinymce_api/TinyMCE_Engine.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/tinymce_api/TinyMCE_Engine.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/tinymce_api/TinyMCE_Engine.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,6390 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN""http://www.w3.org/TR/REC-html40/loose.dtd">
+<!--NewPage-->
+<HTML>
+<HEAD>
+<TITLE>
+TinyMCE_Engine
+</TITLE>
+<LINK REL ="stylesheet" TYPE="text/css" HREF="stylesheet.css" TITLE="Style">
+</HEAD>
+<SCRIPT>
+function asd()
+{
+parent.document.title="TinyMCE_Engine";
+}
+</SCRIPT>
+<BODY BGCOLOR="white" onload="asd();">
+
+<!-- ========== START OF NAVBAR ========== -->
+<A NAME="navbar_bottom"><!-- --></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0">
+<TR>
+<TD COLSPAN=3 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_bottom_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3">
+ <TR ALIGN="center" VALIGN="top">
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="overview-summary.html"><FONT CLASS="NavBarFont1"><B>Overview</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="overview-summary-TinyMCE_Engine.class.js.html"><FONT CLASS="NavBarFont1"><B>File</B></FONT></A> </TD>
+ <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> <FONT CLASS="NavBarFont1Rev"><B>Class</B></FONT> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="overview-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A> </TD>
+ <!--TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"--> <!--A HREF="deprecated-list.html"--><!--FONT CLASS="NavBarFont1">Deprecated</FONT--><!--/A--><!-- </TD-->
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="index-all.html"--><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
+ </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+<B></B>
+</EM>
+</TD
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="TinyMCE_Control.html"><B>PREV CLASS</B></A><!--
+ NEXT CLASS
+-->
+ <A HREF="TinyMCE_Layer.html"><B>NEXT CLASS</B></A></FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="index.html" TARGET="_top"><B>FRAMES</B></A>
+ <A HREF="TinyMCE_Engine.html" TARGET="_top"><B>NO FRAMES</B></A>
+
+<SCRIPT>
+ <!--
+ if(window==top) {
+ document.writeln('<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>');
+ }
+ //-->
+</SCRIPT>
+<NOSCRIPT>
+<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>
+</NOSCRIPT>
+</FONT></TD>
+</TR>
+<TR>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+ SUMMARY: <A HREF="#field_summary">FIELD</A> | <A HREF="#constructor_summary">CONSTR</A> | <A HREF="#method_summary">METHOD</A></FONT></TD>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+DETAIL: <A HREF="#field_detail">FIELD</A> | <A HREF="#constructor_detail">CONSTR</A> | <A HREF="#method_detail">METHOD</A></FONT></TD>
+</TR>
+</TABLE>
+<!-- =========== END OF NAVBAR =========== -->
+<HR>
+
+<!-- ======== START OF CLASS DATA ======== -->
+<H2>Class TinyMCE_Engine</H2>
+<PRE>Object
+ |
+ +--<b>TinyMCE_Engine</b>
+</PRE>
+
+
+<HR>
+<DL>
+ <!-- Class definition -->
+ <DT>class
+ <B>TinyMCE_Engine</B>
+
+
+</DL>
+
+ <P>
+ <I>Defined in <a href='overview-summary-TinyMCE_Engine.class.js.html'>TinyMCE_Engine.class.js</a></I><BR/><BR/>
+ </P>
+
+ <HR>
+
+<!-- ======== NESTED CLASS SUMMARY ======== -->
+
+<!-- ======== END NESTED CLASS SUMMARY ======== -->
+
+
+<!-- =========== FIELD SUMMARY =========== -->
+
+ <A NAME="field_summary"><!-- --></A>
+ <TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" WIDTH="100%">
+ <TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+ <TD COLSPAN=2><FONT SIZE="+2">
+ <B>Field Summary</B></FONT></TD>
+ </TR>
+
+ <!-- This is one instance field summary -->
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+ <CODE> Object</CODE></FONT></TD>
+ <TD><CODE><B><A HREF="#buttonMap">buttonMap</A></B></CODE>
+ <BR>
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+ <CODE> Object</CODE></FONT></TD>
+ <TD><CODE><B><A HREF="#configs">configs</A></B></CODE>
+ <BR>
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+ <CODE> Object</CODE></FONT></TD>
+ <TD><CODE><B><A HREF="#currentConfig">currentConfig</A></B></CODE>
+ <BR>
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+ <CODE> Object</CODE></FONT></TD>
+ <TD><CODE><B><A HREF="#dialogCounter">dialogCounter</A></B></CODE>
+ <BR>
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+ <CODE> Object</CODE></FONT></TD>
+ <TD><CODE><B><A HREF="#eventHandlers">eventHandlers</A></B></CODE>
+ <BR>
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+ <CODE> Object</CODE></FONT></TD>
+ <TD><CODE><B><A HREF="#idCounter">idCounter</A></B></CODE>
+ <BR>
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+ <CODE> Object</CODE></FONT></TD>
+ <TD><CODE><B><A HREF="#instances">instances</A></B></CODE>
+ <BR>
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+ <CODE> Object</CODE></FONT></TD>
+ <TD><CODE><B><A HREF="#isGecko">isGecko</A></B></CODE>
+ <BR>
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+ <CODE> Object</CODE></FONT></TD>
+ <TD><CODE><B><A HREF="#isLoaded">isLoaded</A></B></CODE>
+ <BR>
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+ <CODE> Object</CODE></FONT></TD>
+ <TD><CODE><B><A HREF="#isMac">isMac</A></B></CODE>
+ <BR>
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+ <CODE> Object</CODE></FONT></TD>
+ <TD><CODE><B><A HREF="#isMSIE">isMSIE</A></B></CODE>
+ <BR>
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+ <CODE> Object</CODE></FONT></TD>
+ <TD><CODE><B><A HREF="#isMSIE5">isMSIE5</A></B></CODE>
+ <BR>
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+ <CODE> Object</CODE></FONT></TD>
+ <TD><CODE><B><A HREF="#isMSIE5_0">isMSIE5_0</A></B></CODE>
+ <BR>
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+ <CODE> Object</CODE></FONT></TD>
+ <TD><CODE><B><A HREF="#isNS7">isNS7</A></B></CODE>
+ <BR>
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+ <CODE> Object</CODE></FONT></TD>
+ <TD><CODE><B><A HREF="#isNS71">isNS71</A></B></CODE>
+ <BR>
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+ <CODE> Object</CODE></FONT></TD>
+ <TD><CODE><B><A HREF="#isOpera">isOpera</A></B></CODE>
+ <BR>
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+ <CODE> Object</CODE></FONT></TD>
+ <TD><CODE><B><A HREF="#isSafari">isSafari</A></B></CODE>
+ <BR>
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+ <CODE> Object</CODE></FONT></TD>
+ <TD><CODE><B><A HREF="#loadedFiles">loadedFiles</A></B></CODE>
+ <BR>
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+ <CODE> Object</CODE></FONT></TD>
+ <TD><CODE><B><A HREF="#loadedPlugins">loadedPlugins</A></B></CODE>
+ <BR>
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+ <CODE> Object</CODE></FONT></TD>
+ <TD><CODE><B><A HREF="#majorVersion">majorVersion</A></B></CODE>
+ <BR>
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+ <CODE> Object</CODE></FONT></TD>
+ <TD><CODE><B><A HREF="#menus">menus</A></B></CODE>
+ <BR>
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+ <CODE> Object</CODE></FONT></TD>
+ <TD><CODE><B><A HREF="#minorVersion">minorVersion</A></B></CODE>
+ <BR>
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+ <CODE> Object</CODE></FONT></TD>
+ <TD><CODE><B><A HREF="#plugins">plugins</A></B></CODE>
+ <BR>
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+ <CODE> Object</CODE></FONT></TD>
+ <TD><CODE><B><A HREF="#releaseDate">releaseDate</A></B></CODE>
+ <BR>
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+ <CODE> Object</CODE></FONT></TD>
+ <TD><CODE><B><A HREF="#switchClassCache">switchClassCache</A></B></CODE>
+ <BR>
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+ <CODE> Object</CODE></FONT></TD>
+ <TD><CODE><B><A HREF="#themes">themes</A></B></CODE>
+ <BR>
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+ <CODE> Object</CODE></FONT></TD>
+ <TD><CODE><B><A HREF="#windowArgs">windowArgs</A></B></CODE>
+ <BR>
+ </TD>
+ </TR>
+
+
+ </TABLE>
+
+
+
+
+
+<!-- =========== END FIELD SUMMARY =========== -->
+
+
+<!-- ======== CONSTRUCTOR SUMMARY ======== -->
+
+<A NAME="constructor_summary"><!-- --></A>
+<TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" WIDTH="100%">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TD COLSPAN=2><FONT SIZE="+2">
+<B>Constructor Summary</B></FONT></TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="TinyMCE_Engine.html#TinyMCE_Engine()">TinyMCE_Engine</A>
+ </B>
+ ()
+ </CODE>
+ <BR>
+
+ Core engine class for TinyMCE, a instance of this class is available as a global called tinyMCE.
+ </TD>
+</TR>
+</TABLE>
+
+<!-- ======== END CONSTRUCTOR SUMMARY ======== -->
+
+
+
+<!-- ========== METHOD SUMMARY =========== -->
+
+<A NAME="method_summary"><!-- --></A>
+<TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" WIDTH="100%">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TD COLSPAN=2><FONT SIZE="+2">
+<B>Method Summary</B></FONT></TD>
+</TR>
+
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> HTMLElement</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#_getElementById">_getElementById</A></B>(<string> i<DOMDocument> d, d)
+ </CODE>
+ <BR>
+
+ Returns a element by id, this will also search the form names to match the id.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> void</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#_removeInternal">_removeInternal</A></B>(<DOMNode> n)
+ </CODE>
+ <BR>
+
+ Removes any internal content inserted by regexps.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> Object</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#accessibleEventHandler">accessibleEventHandler</A></B>(<DOMEvent> e)
+ </CODE>
+ <BR>
+
+ Accessibility handler that gets executed when the user hits a key in a select element.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> void</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#addButtonMap">addButtonMap</A></B>(<string> m)
+ </CODE>
+ <BR>
+
+ Adds a list of buttons available in the tiled button image used by the button_tile_map option.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> string</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#addCSSClass">addCSSClass</A></B>(<HTMLElement> e, c, b)
+ </CODE>
+ <BR>
+
+ Adds a CSS class to the specified element.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> void</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#addEvent">addEvent</A></B>(<HTMLElement> o, <string> n, <function> h)
+ </CODE>
+ <BR>
+
+ Adds a event handler function to the specified object.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> void</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#addEventHandlers">addEventHandlers</A></B>(<inst> inst)
+ </CODE>
+ <BR>
+
+ Adds the handleEvent function to the specified editor instance.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> void</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#addMCEControl">addMCEControl</A></B>(<HTMLElement> replace_element, <string> form_element_name, <DOMDocument> target_document)
+ </CODE>
+ <BR>
+
+ Adds a TinyMCE editor control instance to a specific form element.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> void</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#addMenu">addMenu</A></B>(<string> n, <TinyMCE_Menu> m)
+ </CODE>
+ <BR>
+
+ Adds a floating menu instance to TinyMCE.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> void</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#addPlugin">addPlugin</A></B>(n, <TinyMCE_Plugin> p)
+ </CODE>
+ <BR>
+
+ Adds the specified plugin to the list of loaded plugins, this will also setup the baseURL
+ property of the plugin.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> Object</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#addSelectAccessibility">addSelectAccessibility</A></B>(<DOMEvent> e, <HTMLElement> s, <DOMWindow> w)
+ </CODE>
+ <BR>
+
+ Adds accessibility keydown handler to the specified select element.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> void</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#addTheme">addTheme</A></B>(&l<TinyMCE_Theme> t;string> n, t)
+ </CODE>
+ <BR>
+
+ Adds the specified theme in to the list of loaded themes.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> void</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#addToLang">addToLang</A></B>(<string> prefix, <Array> ar)
+ </CODE>
+ <BR>
+
+ Adds language items to the global language array.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> string</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#applyTemplate">applyTemplate</A></B>(<string> h, <Array> as)
+ </CODE>
+ <BR>
+
+ Replaces language, args and settings variables in a HTML string.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> boolean</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#callFunc">callFunc</A></B>(<<<Array> a href="TinyMCE_Control.html">TinyMCE_Control</a>> ins, <string> p, <string> n, <int> m, a)
+ </CODE>
+ <BR>
+
+ Executes callback chain.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> void</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#cancelEvent">cancelEvent</A></B>(<DOMEvent> e)
+ </CODE>
+ <BR>
+
+ Cancels the specified event, this will disable the event from be passed to other listeners in event chain.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> void</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#cleanupAnchors">cleanupAnchors</A></B>(<DOMDocument> doc)
+ </CODE>
+ <BR>
+
+ Moves the contents of a anchor outside and after the anchor.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> string</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#cleanupEventStr">cleanupEventStr</A></B>(<string> s)
+ </CODE>
+ <BR>
+
+ Removes MSIE 5.5 specific event wrapper function form a event string.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> string</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#cleanupHTMLCode">cleanupHTMLCode</A></B>(<string> s)
+ </CODE>
+ <BR>
+
+ Makes some preprocessing cleanup routines on the specified HTML string.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> Array</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#clearArray">clearArray</A></B>(a)
+ </CODE>
+ <BR>
+
+ Returns a cleared array, since some external libraries tend to extend the Array core object
+ arrays needs to be cleaned from these extended functions.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> void</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#closeWindow">closeWindow</A></B>(<DOMWindow> win)
+ </CODE>
+ <BR>
+
+ Closes the specified window.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> void</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#compressStyle">compressStyle</A></B>(<Array> ar, <string> pr, <string> sf, <string> res)
+ </CODE>
+ <BR>
+
+ Compresses larger styles into a smaller.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> void</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#confirmAdd">confirmAdd</A></B>(<DOMEvent> e, <Array> settings)
+ </CODE>
+ <BR>
+
+ Displays a confirm dialog when a user clicks/focus a textarea that is to be converted into
+ a TinyMCE instance.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> string</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#convertAbsoluteURLToRelativeURL">convertAbsoluteURLToRelativeURL</A></B>(<string> base_url, <string> url_to_relative)
+ </CODE>
+ <BR>
+
+ Converts an absolute path to relative path.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> void</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#convertAllRelativeURLs">convertAllRelativeURLs</A></B>(<HTMLElement> body)
+ </CODE>
+ <BR>
+
+ Converts all img and a element URLs to absolute URLs.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> void</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#convertFontsToSpans">convertFontsToSpans</A></B>(<DOMDocument> doc)
+ </CODE>
+ <BR>
+
+ Convers fonts to spans in the specified document.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> string</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#convertHexToRGB">convertHexToRGB</A></B>(<string> s)
+ </CODE>
+ <BR>
+
+ Returns a rgb(n,n,n) string from a hexadecimal value.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> string</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#convertRelativeToAbsoluteURL">convertRelativeToAbsoluteURL</A></B>(<string> base_url, <string> relative_url)
+ </CODE>
+ <BR>
+
+ Converts an relative path to absolute path.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> string</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#convertRGBToHex">convertRGBToHex</A></B>(<string> s, <boolean> k)
+ </CODE>
+ <BR>
+
+ Returns a hexadecimal version of the specified rgb(1,2,3) string.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> void</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#convertSpansToFonts">convertSpansToFonts</A></B>(<DOMDocument> doc)
+ </CODE>
+ <BR>
+
+ Converts span elements to font elements in the specified document instance.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> string</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#convertURL">convertURL</A></B>(<string> url, <HTMLElement> node, <boolean> on_save)
+ </CODE>
+ <BR>
+
+ Converts the specified URL based in TinyMCE configuration settings.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> void</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#debug">debug</A></B>()
+ </CODE>
+ <BR>
+
+ Debugs the specified message to a screen.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> Object</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#dispatchCallback">dispatchCallback</A></B>(<<a href="TinyMCE_Control.html">TinyMCE_Control</a>> i, <string> p, <string> n)
+ </CODE>
+ <BR>
+
+ Dispatches the specified callback on all options, plugins and themes.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> string</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#entityDecode">entityDecode</A></B>(<string> s)
+ </CODE>
+ <BR>
+
+ HTML entity decode a string, replaces < with <.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> object</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#evalFunc">evalFunc</A></B>(<string> f, <int> idx, <Array> a)
+ </CODE>
+ <BR>
+
+ Evaluates the specified function and uses the array of arguments.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> void</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#execCommand">execCommand</A></B>(<string> command, <boolean> user_interface, <object> value)
+ </CODE>
+ <BR>
+
+ Executes a command on the selected or last selected TinyMCE editor control instance.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> Object</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#execCommandCallback">execCommandCallback</A></B>(<<a href="TinyMCE_Control.html">TinyMCE_Control</a>> i, <string> p, <string> n)
+ </CODE>
+ <BR>
+
+ Executes the specified execcommand callback on all options, plugins and themes.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> void</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#execInstanceCommand">execInstanceCommand</A></B>(<string> editor_id, <string> command, <boolean> user_interface, <object> value, <boolean> focus)
+ </CODE>
+ <BR>
+
+ Executes a command on a specific editor instance by id.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> Object</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#executeCallback">executeCallback</A></B>(<<a href="TinyMCE_Control.html">TinyMCE_Control</a>> i, <string> p, <string> n)
+ </CODE>
+ <BR>
+
+ Executes the specified callback on all options, plugins and themes.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> Array</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#explode">explode</A></B>(<string> d, <string> s)
+ </CODE>
+ <BR>
+
+ Splits a string by the specified delimiter and skips any empty items.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> Object</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#extend">extend</A></B>(<Object> p, <Object> np)
+ </CODE>
+ <BR>
+
+ Extends the specified prototype with new methods.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> string</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#fixGeckoBaseHREFBug">fixGeckoBaseHREFBug</A></B>(<boolean> m, <HTMLElement> e, <string> h)
+ </CODE>
+ <BR>
+
+ Fixes a Gecko specific bug where href, src attribute values gets converted incorrectly
+ when inserted into editor.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> TinyMCE_ElementPosition</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#getAbsPosition">getAbsPosition</A></B>(<HTMLNode> n)
+ </CODE>
+ <BR>
+
+ Returns the absolute x, y position of a node.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> string</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#getAttrib">getAttrib</A></B>(<HTMLElement> elm, <string> name, <string> default_value)
+ </CODE>
+ <BR>
+
+ Returns the attribute value of a element or the default value if it wasn't found.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> string</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#getButtonHTML">getButtonHTML</A></B>(<string> id, <string> lang, <string> img, <string> cmd, <string> ui, <string> val)
+ </CODE>
+ <BR>
+
+ Returns the HTML code for a normal button control.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> string</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#getContent">getContent</A></B>(<string> editor_id)
+ </CODE>
+ <BR>
+
+ Returns the HTML contents of the specified editor instance id.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> string</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#getControlHTML">getControlHTML</A></B>(<string> c)
+ </CODE>
+ <BR>
+
+ Returns the HTML for the specified control this will loop through
+ the theme and all plugins inorder to find the control.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> Array</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#getCSSClasses">getCSSClasses</A></B>(<string> editor_id, <DOMDocument> doc)
+ </CODE>
+ <BR>
+
+ Returns a array of CSS classes that is available in a document.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> string</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#getEditorId">getEditorId</A></B>(<string> form_element)
+ </CODE>
+ <BR>
+
+ Returns the editor instance id of a specific form element.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> HTMLElement</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#getElementByAttributeValue">getElementByAttributeValue</A></B>(<HTMLElement> n, <string> e, <string> a, <string> v)
+ </CODE>
+ <BR>
+
+ Returns a element by a specific attribute and it's value.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> Array</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#getElementsByAttributeValue">getElementsByAttributeValue</A></B>(<HTMLElement> n, <string> e, <string> a, <string> v)
+ </CODE>
+ <BR>
+
+ Returns a element array by a specific attribute and it's value.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> <a href="TinyMCE_Control.html">TinyMCE_Control</a></CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#getInstanceById">getInstanceById</A></B>(<string> editor_id)
+ </CODE>
+ <BR>
+
+ Returns a TinyMCE editor instance by the specified editor id or null if it wasn't found.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> object</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#getLang">getLang</A></B>(<string> name, <string> default_value, <boolean> parse_entities, <Array> va)
+ </CODE>
+ <BR>
+
+ Returns a language variable value from the language packs.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> Array</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#getNodeTree">getNodeTree</A></B>(&l<int> t;HTMLNode> n, <Array> na, t, <string> nn)
+ </CODE>
+ <BR>
+
+ Returns a array of nodes selected retrived from the child nodes of the specified node.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> string</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#getOuterHTML">getOuterHTML</A></B>(<HTMLElement> e)
+ </CODE>
+ <BR>
+
+ Returns the outer HTML of a element, this uses the outerHTML
+ property in MSIE and Opera and a workaround for Gecko.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> object</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#getParam">getParam</A></B>(<string> name, <string> default_value, <boolean> strip_whitespace, <string> split_chr)
+ </CODE>
+ <BR>
+
+ Returns a specific configuration setting or the default value if it wasn't found.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> HTMLElement</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#getParentBlockElement">getParentBlockElement</A></B>(<HTMLNode> n)
+ </CODE>
+ <BR>
+
+ Returns the first block element parent of the specified node.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> HTMLElement</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#getParentElement">getParentElement</A></B>(<HTMLNode> node, <string> names, <string> attrib_name, <string> attrib_value)
+ </CODE>
+ <BR>
+
+ Returns the parent element of the specified node based on the search criteria.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> DOMNode</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#getParentNode">getParentNode</A></B>(<DOMNode> n, <function> f)
+ </CODE>
+ <BR>
+
+ Returns a node by the specified selector function.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> string</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#getVisualAidClass">getVisualAidClass</A></B>(<string> class_name, <boolean> state)
+ </CODE>
+ <BR>
+
+ Returns the visual aid class string, this will add/remove the visual aid class.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> Object</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#getWindowArg">getWindowArg</A></B>(<string> n, d)
+ </CODE>
+ <BR>
+
+ Returns the window argument to be passed to TinyMCE popup.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> boolean</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#handleEvent">handleEvent</A></B>(<DOMEvent> e)
+ </CODE>
+ <BR>
+
+ Event handler function that gets executed each time a event occurs in a TinyMCE editor control instance.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> void</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#handleVisualAid">handleVisualAid</A></B>(<HTMLElement> el, <boolean> deep, <boolean> state, <<a href="TinyMCE_Control.html">TinyMCE_Control</a>> inst, skip_dispatch)
+ </CODE>
+ <BR>
+
+ Adds visual aid classes to all elements that need them recursive in the DOM tree.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> boolean</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#hasMenu">hasMenu</A></B>(<string> n)
+ </CODE>
+ <BR>
+
+ Checks if the specified menu by name is added to TinyMCE.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> boolean</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#hasPlugin">hasPlugin</A></B>(<string> n)
+ </CODE>
+ <BR>
+
+ Returns true/false if the specified plugin is loaded or not.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> boolean</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#hasTheme">hasTheme</A></B>(<string> n)
+ </CODE>
+ <BR>
+
+ Returns true/false if the specified theme is loaded or not.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> void</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#importCSS">importCSS</A></B>(<DOMDocument> doc, <string> css)
+ </CODE>
+ <BR>
+
+ Imports a CSS file into a allready loaded document.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> void</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#importPluginLanguagePack">importPluginLanguagePack</A></B>(<string> name, <string> valid_languages)
+ </CODE>
+ <BR>
+
+ Loads a plugin specific language pack.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> void</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#importThemeLanguagePack">importThemeLanguagePack</A></B>(<string> name)
+ </CODE>
+ <BR>
+
+ Loads a theme specific language pack.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> void</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#init">init</A></B>(settings)
+ </CODE>
+ <BR>
+
+ Initializes TinyMCE with the specific configuration settings.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> void</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#insertAfter">insertAfter</A></B>(<HTMLNode> n, <HTMLNode> r)
+ </CODE>
+ <BR>
+
+ Inserts a node after the specific node.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> boolean</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#isBlockElement">isBlockElement</A></B>(<HTMLNode> n)
+ </CODE>
+ <BR>
+
+ Returns true/false if the specified node is a block element or not.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> boolean</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#isInstance">isInstance</A></B>(<object> o)
+ </CODE>
+ <BR>
+
+ Returns true/false if a specific object is a TinyMCE_Control instance or not.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> void</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#loadCSS">loadCSS</A></B>(<string> url)
+ </CODE>
+ <BR>
+
+ Loads the specified CSS by writing the a link tag to the current page.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> void</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#loadPlugin">loadPlugin</A></B>(<string> n, <string> u)
+ </CODE>
+ <BR>
+
+ Load plugin from external URL.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> void</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#loadScript">loadScript</A></B>(<string> url)
+ </CODE>
+ <BR>
+
+ Loads the specified script by writing the a script tag to the current page.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> HTMLElement</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#nextNode">nextNode</A></B>(<HTMLNode> e, <string> n)
+ </CODE>
+ <BR>
+
+ Finds any element after the current one by name.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> boolean</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#onLoad">onLoad</A></B>()
+ </CODE>
+ <BR>
+
+ Gets executed when the page loads or get intitialized.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> void</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#onMouseMove">onMouseMove</A></B>()
+ </CODE>
+ <BR>
+
+ Mouse move handler function, this will be executed each time
+ the mouse is moved within a editor instance.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> void</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#openWindow">openWindow</A></B>(<Array> template, <Array> args)
+ </CODE>
+ <BR>
+
+ Opens a popup window based in the specified input data.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> Array</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#parseStyle">parseStyle</A></B>(<string> str)
+ </CODE>
+ <BR>
+
+ Parses the specified HTML style data.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> TinyMCE_URL_Item</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#parseURL">parseURL</A></B>(<string> url_str)
+ </CODE>
+ <BR>
+
+ Parses a URL in to its diffrent components.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> HTMLElement</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#prevNode">prevNode</A></B>(<HTMLNode> e, <string> n)
+ </CODE>
+ <BR>
+
+ Finds any previous element by name.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> boolean</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#queryInstanceCommandState">queryInstanceCommandState</A></B>(<string> editor_id, <string> command)
+ </CODE>
+ <BR>
+
+ Queries a command state for a specific command on a specific editor instance.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> object</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#queryInstanceCommandValue">queryInstanceCommandValue</A></B>(<string> editor_id, <string> command)
+ </CODE>
+ <BR>
+
+ Queries a command value for a specific command on a specific editor instance.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> string</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#regexpReplace">regexpReplace</A></B>(<string> in_str, <string> reg_exp, <string> replace_str, opts)
+ </CODE>
+ <BR>
+
+ Regexp replaces the contents of a string.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> string</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#removeCSSClass">removeCSSClass</A></B>(<HTMLElement> e, c)
+ </CODE>
+ <BR>
+
+ Removes the specified CSS class from the element.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> void</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#removeMCEControl">removeMCEControl</A></B>(<string> editor_id)
+ </CODE>
+ <BR>
+
+ Removes a TinyMCE editor control instance by id.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> void</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#removeTinyMCEFormElements">removeTinyMCEFormElements</A></B>(<HTMLElement> form_obj)
+ </CODE>
+ <BR>
+
+ Removes/disables TinyMCE built in form elements such as select boxes for font sizes etc.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> void</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#renameElement">renameElement</A></B>(<HTMLElement> e, <string> n, <DOMDocument> d)
+ </CODE>
+ <BR>
+
+ Renames the specified element to the specified name.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> string</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#replaceVar">replaceVar</A></B>(<string> h, <string> r, <string> v)
+ </CODE>
+ <BR>
+
+ Replaces a specific variable in the string with a nother string.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> void</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#resetForm">resetForm</A></B>(<int> form_index)
+ </CODE>
+ <BR>
+
+ Resets a forms TinyMCE instances based on form index.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> Array</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#selectNodes">selectNodes</A></B>(<DOMNode> n, <function> f, <Array> a)
+ </CODE>
+ <BR>
+
+ Returns a array of nodes when the specified function matches a node.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> string</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#serializeStyle">serializeStyle</A></B>(<Array> ar)
+ </CODE>
+ <BR>
+
+ Serializes the specified style item name/value array into a HTML string.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> string</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#serializeURL">serializeURL</A></B>(<TinyMCE_URL_Item> up)
+ </CODE>
+ <BR>
+
+ Serializes the specified URL object into a string.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> void</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#setAttrib">setAttrib</A></B>(<HTMLElement> element, <string> name, <string> value, <boolean> fix_value)
+ </CODE>
+ <BR>
+
+ Sets the attribute value for a specific attribute.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> void</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#setContent">setContent</A></B>(<string> h)
+ </CODE>
+ <BR>
+
+ Sets the HTML contents of the selected editor instance.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> void</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#setInnerHTML">setInnerHTML</A></B>(<HTMLElement> e, <string> h)
+ </CODE>
+ <BR>
+
+ Sets the innerHTML property of a element, this function also
+ fixes a MSIE bug where the first comment is removed.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> void</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#setOuterHTML">setOuterHTML</A></B>(<HTMLElement> e, <string> h)
+ </CODE>
+ <BR>
+
+ Sets the outer HTML of a element, this uses the outerHTML
+ property in MSIE and Opera and a workaround for Gecko.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> void</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#setPluginBaseURL">setPluginBaseURL</A></B>(<string> n, <string> u)
+ </CODE>
+ <BR>
+
+ Sets the baseURL of the specified plugin, this is useful if the plugin is loaded from
+ a external location.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> void</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#setStyleAttrib">setStyleAttrib</A></B>(<HTMLElement> elm, <string> name, <string> value)
+ </CODE>
+ <BR>
+
+ Sets a style attribute item value.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> void</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#setupContent">setupContent</A></B>(<string> editor_id)
+ </CODE>
+ <BR>
+
+ Setups the contents of TinyMCE editor instance and fills it with contents.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> void</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#setWindowArg">setWindowArg</A></B>(<string> n, <string> v)
+ </CODE>
+ <BR>
+
+ Sets the window argument to be passed to TinyMCE popup.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> string</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#storeAwayURLs">storeAwayURLs</A></B>(<string> s)
+ </CODE>
+ <BR>
+
+ Stores away the src and href attribute values in separate mce_src and mce_href attributes.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> void</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#submitPatch">submitPatch</A></B>()
+ </CODE>
+ <BR>
+
+ Piggyback onsubmit event handler function, this will remove/hide the TinyMCE specific form elements
+ call triggerSave to fill the textarea with the correct contents then call the old piggy backed event handler.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> void</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#switchClass">switchClass</A></B>(<HTMLElement> ei, <string> c)
+ </CODE>
+ <BR>
+
+ Switches the CSS class of the specified element.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> void</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#triggerNodeChange">triggerNodeChange</A></B>(<boolean> focus, <boolean> setup_content)
+ </CODE>
+ <BR>
+
+ Triggers a nodeChange event to every theme and plugin.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> void</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#triggerSave">triggerSave</A></B>(<boolean> skip_cleanup, <boolean> skip_callback)
+ </CODE>
+ <BR>
+
+ Moves the contents from a TinyMCE editor control instance to the hidden textarea
+ that got replaced with TinyMCE.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> string</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#trim">trim</A></B>(<string> s)
+ </CODE>
+ <BR>
+
+ Removes all prefix, suffix whitespace of a string.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> void</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#unloadHandler">unloadHandler</A></B>()
+ </CODE>
+ <BR>
+
+ Unload document event handler function.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> void</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#updateContent">updateContent</A></B>(<string> form_element_name)
+ </CODE>
+ <BR>
+
+ Moves the contents from the hidden textarea to the editor that gets inserted.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> string</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#xmlEncode">xmlEncode</A></B>(<string> s)
+ </CODE>
+ <BR>
+
+ Encodes the string to raw XML entities.
+ </TD>
+ </TR>
+
+
+</TABLE>
+
+
+
+<P>
+<!-- ========== END METHOD SUMMARY =========== -->
+
+
+<!-- ============ FIELD DETAIL START =========== -->
+
+ <A NAME="field_detail"><!-- --></A>
+ <TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" WIDTH="100%">
+ <TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+ <TD COLSPAN=1><FONT SIZE="+2"><B>Field Detail</B></FONT></TD>
+ </TR>
+ </TABLE>
+
+
+ <A NAME="buttonMap"><!-- --></A>
+ <H3>buttonMap</H3>
+ <PRE>Object <B>buttonMap</B></PRE>
+ <UL>
+
+
+ </UL>
+ <HR>
+
+ <A NAME="configs"><!-- --></A>
+ <H3>configs</H3>
+ <PRE>Object <B>configs</B></PRE>
+ <UL>
+
+
+ </UL>
+ <HR>
+
+ <A NAME="currentConfig"><!-- --></A>
+ <H3>currentConfig</H3>
+ <PRE>Object <B>currentConfig</B></PRE>
+ <UL>
+
+
+ </UL>
+ <HR>
+
+ <A NAME="dialogCounter"><!-- --></A>
+ <H3>dialogCounter</H3>
+ <PRE>Object <B>dialogCounter</B></PRE>
+ <UL>
+
+
+ </UL>
+ <HR>
+
+ <A NAME="eventHandlers"><!-- --></A>
+ <H3>eventHandlers</H3>
+ <PRE>Object <B>eventHandlers</B></PRE>
+ <UL>
+
+
+ </UL>
+ <HR>
+
+ <A NAME="idCounter"><!-- --></A>
+ <H3>idCounter</H3>
+ <PRE>Object <B>idCounter</B></PRE>
+ <UL>
+
+
+ </UL>
+ <HR>
+
+ <A NAME="instances"><!-- --></A>
+ <H3>instances</H3>
+ <PRE>Object <B>instances</B></PRE>
+ <UL>
+
+
+ </UL>
+ <HR>
+
+ <A NAME="isGecko"><!-- --></A>
+ <H3>isGecko</H3>
+ <PRE>Object <B>isGecko</B></PRE>
+ <UL>
+
+
+ </UL>
+ <HR>
+
+ <A NAME="isLoaded"><!-- --></A>
+ <H3>isLoaded</H3>
+ <PRE>Object <B>isLoaded</B></PRE>
+ <UL>
+
+
+ </UL>
+ <HR>
+
+ <A NAME="isMac"><!-- --></A>
+ <H3>isMac</H3>
+ <PRE>Object <B>isMac</B></PRE>
+ <UL>
+
+
+ </UL>
+ <HR>
+
+ <A NAME="isMSIE"><!-- --></A>
+ <H3>isMSIE</H3>
+ <PRE>Object <B>isMSIE</B></PRE>
+ <UL>
+
+
+ </UL>
+ <HR>
+
+ <A NAME="isMSIE5"><!-- --></A>
+ <H3>isMSIE5</H3>
+ <PRE>Object <B>isMSIE5</B></PRE>
+ <UL>
+
+
+ </UL>
+ <HR>
+
+ <A NAME="isMSIE5_0"><!-- --></A>
+ <H3>isMSIE5_0</H3>
+ <PRE>Object <B>isMSIE5_0</B></PRE>
+ <UL>
+
+
+ </UL>
+ <HR>
+
+ <A NAME="isNS7"><!-- --></A>
+ <H3>isNS7</H3>
+ <PRE>Object <B>isNS7</B></PRE>
+ <UL>
+
+
+ </UL>
+ <HR>
+
+ <A NAME="isNS71"><!-- --></A>
+ <H3>isNS71</H3>
+ <PRE>Object <B>isNS71</B></PRE>
+ <UL>
+
+
+ </UL>
+ <HR>
+
+ <A NAME="isOpera"><!-- --></A>
+ <H3>isOpera</H3>
+ <PRE>Object <B>isOpera</B></PRE>
+ <UL>
+
+
+ </UL>
+ <HR>
+
+ <A NAME="isSafari"><!-- --></A>
+ <H3>isSafari</H3>
+ <PRE>Object <B>isSafari</B></PRE>
+ <UL>
+
+
+ </UL>
+ <HR>
+
+ <A NAME="loadedFiles"><!-- --></A>
+ <H3>loadedFiles</H3>
+ <PRE>Object <B>loadedFiles</B></PRE>
+ <UL>
+
+
+ </UL>
+ <HR>
+
+ <A NAME="loadedPlugins"><!-- --></A>
+ <H3>loadedPlugins</H3>
+ <PRE>Object <B>loadedPlugins</B></PRE>
+ <UL>
+
+
+ </UL>
+ <HR>
+
+ <A NAME="majorVersion"><!-- --></A>
+ <H3>majorVersion</H3>
+ <PRE>Object <B>majorVersion</B></PRE>
+ <UL>
+
+
+ </UL>
+ <HR>
+
+ <A NAME="menus"><!-- --></A>
+ <H3>menus</H3>
+ <PRE>Object <B>menus</B></PRE>
+ <UL>
+
+
+ </UL>
+ <HR>
+
+ <A NAME="minorVersion"><!-- --></A>
+ <H3>minorVersion</H3>
+ <PRE>Object <B>minorVersion</B></PRE>
+ <UL>
+
+
+ </UL>
+ <HR>
+
+ <A NAME="plugins"><!-- --></A>
+ <H3>plugins</H3>
+ <PRE>Object <B>plugins</B></PRE>
+ <UL>
+
+
+ </UL>
+ <HR>
+
+ <A NAME="releaseDate"><!-- --></A>
+ <H3>releaseDate</H3>
+ <PRE>Object <B>releaseDate</B></PRE>
+ <UL>
+
+
+ </UL>
+ <HR>
+
+ <A NAME="switchClassCache"><!-- --></A>
+ <H3>switchClassCache</H3>
+ <PRE>Object <B>switchClassCache</B></PRE>
+ <UL>
+
+
+ </UL>
+ <HR>
+
+ <A NAME="themes"><!-- --></A>
+ <H3>themes</H3>
+ <PRE>Object <B>themes</B></PRE>
+ <UL>
+
+
+ </UL>
+ <HR>
+
+ <A NAME="windowArgs"><!-- --></A>
+ <H3>windowArgs</H3>
+ <PRE>Object <B>windowArgs</B></PRE>
+ <UL>
+
+
+ </UL>
+ <HR>
+
+
+
+<!-- ============ FIELD DETAIL END =========== -->
+
+ <!-- ========= CONSTRUCTOR DETAIL START ======== -->
+
+<A NAME="constructor_detail"><!-- --></A>
+<TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" WIDTH="100%">
+ <TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+ <TD COLSPAN=1>
+ <FONT SIZE="+2"><B>Constructor Detail</B></FONT>
+ </TD>
+ </TR>
+</TABLE>
+
+<A NAME="TinyMCE_Engine()"><!-- --></A><H3>
+TinyMCE_Engine</H3>
+<PRE><B>TinyMCE_Engine</B>()</PRE>
+
+
+<UL>
+ Core engine class for TinyMCE, a instance of this class is available as a global called tinyMCE.
+</UL>
+
+
+
+ </UL>
+
+
+<!-- Constructor return value(s) -->
+
+<!-- End constructor return value(s) -->
+
+<!-- ADDITIONAL ATTRIBUTES -->
+
+<HR/>
+<!-- END ADDITIONAL ATTRIBUTES -->
+
+<!-- ========= CONSTRUCTOR DETAIL END ======== -->
+
+
+<!-- ============ METHOD DETAIL START ========== -->
+
+<A NAME="method_detail"><!-- --></A>
+<TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" WIDTH="100%">
+ <TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+ <TD COLSPAN=1><FONT SIZE="+2">
+ <B>Method Detail</B></FONT>
+ </TD>
+ </TR>
+</TABLE>
+
+<!-- One single method detail entry -->
+
+ <A NAME="_getElementById"><!-- --></A>
+ <H3>_getElementById</H3>
+ <PRE>HTMLElement <B>_getElementById</B>(<string> i<DOMDocument> d, d)</PRE>
+
+ <UL>Returns a element by id, this will also search the form names to match the id.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <UL>
+ <B>Parameters:</B>
+
+ <UL><CODE>id</CODE> - Id of element.
+ </UL>
+
+ <UL><CODE>d</CODE> - Optional document.
+ </UL>
+
+ </UL>
+
+ <!-- METHOD PARAMETERS END -->
+
+
+ <UL>
+ <B>Returns:</B>
+ <UL>
+ HTML element that matches the id.
+ </UL>
+ </UL>
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="_removeInternal"><!-- --></A>
+ <H3>_removeInternal</H3>
+ <PRE>void <B>_removeInternal</B>(<DOMNode> n)</PRE>
+
+ <UL>Removes any internal content inserted by regexps.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <UL>
+ <B>Parameters:</B>
+
+ <UL><CODE>n</CODE> - Node to remove internal content from.
+ </UL>
+
+ </UL>
+
+ <!-- METHOD PARAMETERS END -->
+
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="accessibleEventHandler"><!-- --></A>
+ <H3>accessibleEventHandler</H3>
+ <PRE>Object <B>accessibleEventHandler</B>(<DOMEvent> e)</PRE>
+
+ <UL>Accessibility handler that gets executed when the user hits a key in a select element.
+ This handler trams the enter/return or space key and then executes the onchange event handler.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <UL>
+ <B>Parameters:</B>
+
+ <UL><CODE>e</CODE> - DOM event object instance.
+ </UL>
+
+ </UL>
+
+ <!-- METHOD PARAMETERS END -->
+
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="addButtonMap"><!-- --></A>
+ <H3>addButtonMap</H3>
+ <PRE>void <B>addButtonMap</B>(<string> m)</PRE>
+
+ <UL>Adds a list of buttons available in the tiled button image used by the button_tile_map option.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <UL>
+ <B>Parameters:</B>
+
+ <UL><CODE>m</CODE> - Comma separated list of buttons that are available in tiled image.
+ </UL>
+
+ </UL>
+
+ <!-- METHOD PARAMETERS END -->
+
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="addCSSClass"><!-- --></A>
+ <H3>addCSSClass</H3>
+ <PRE>string <B>addCSSClass</B>(<HTMLElement> e, c, b)</PRE>
+
+ <UL>Adds a CSS class to the specified element. It will remove any previous item with the same name
+ so adding a class that already exists will move it to the end.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <UL>
+ <B>Parameters:</B>
+
+ <UL><CODE>e</CODE> - HTML element to add CSS class to.
+ </UL>
+
+ <UL><CODE>string</CODE> - ] c CSS class to add to HTML element.
+ </UL>
+
+ <UL><CODE>boolean</CODE> - ] b Optional parameter, if set to true, class will be added to the beginning.
+ </UL>
+
+ </UL>
+
+ <!-- METHOD PARAMETERS END -->
+
+
+ <UL>
+ <B>Returns:</B>
+ <UL>
+ Returns the new class attribute value.
+ </UL>
+ </UL>
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="addEvent"><!-- --></A>
+ <H3>addEvent</H3>
+ <PRE>void <B>addEvent</B>(<HTMLElement> o, <string> n, <function> h)</PRE>
+
+ <UL>Adds a event handler function to the specified object.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <UL>
+ <B>Parameters:</B>
+
+ <UL><CODE>o</CODE> - Object to add event handler to.
+ </UL>
+
+ <UL><CODE>n</CODE> - Event name to listen to for example "click".
+ </UL>
+
+ <UL><CODE>h</CODE> - Function handler to execute when event occurs.
+ </UL>
+
+ </UL>
+
+ <!-- METHOD PARAMETERS END -->
+
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="addEventHandlers"><!-- --></A>
+ <H3>addEventHandlers</H3>
+ <PRE>void <B>addEventHandlers</B>(<inst> inst)</PRE>
+
+ <UL>Adds the handleEvent function to the specified editor instance.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <UL>
+ <B>Parameters:</B>
+
+ <UL><CODE>inst</CODE> - Editor control instance to add event handler to.
+ </UL>
+
+ </UL>
+
+ <!-- METHOD PARAMETERS END -->
+
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="addMCEControl"><!-- --></A>
+ <H3>addMCEControl</H3>
+ <PRE>void <B>addMCEControl</B>(<HTMLElement> replace_element, <string> form_element_name, <DOMDocument> target_document)</PRE>
+
+ <UL>Adds a TinyMCE editor control instance to a specific form element.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <UL>
+ <B>Parameters:</B>
+
+ <UL><CODE>replace_element</CODE> - HTML element object to replace.
+ </UL>
+
+ <UL><CODE>form_element_name</CODE> - HTML form element name,
+ </UL>
+
+ <UL><CODE>target_document</CODE> - Target document that holds the element.
+ </UL>
+
+ </UL>
+
+ <!-- METHOD PARAMETERS END -->
+
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="addMenu"><!-- --></A>
+ <H3>addMenu</H3>
+ <PRE>void <B>addMenu</B>(<string> n, <TinyMCE_Menu> m)</PRE>
+
+ <UL>Adds a floating menu instance to TinyMCE.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <UL>
+ <B>Parameters:</B>
+
+ <UL><CODE>n</CODE> - TinyMCE menu id.
+ </UL>
+
+ <UL><CODE>m</CODE> - TinyMCE menu instance.
+ </UL>
+
+ </UL>
+
+ <!-- METHOD PARAMETERS END -->
+
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="addPlugin"><!-- --></A>
+ <H3>addPlugin</H3>
+ <PRE>void <B>addPlugin</B>(n, <TinyMCE_Plugin> p)</PRE>
+
+ <UL>Adds the specified plugin to the list of loaded plugins, this will also setup the baseURL
+ property of the plugin.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <UL>
+ <B>Parameters:</B>
+
+ <UL><CODE>p</CODE> - Plugin instance to add.
+ </UL>
+
+ <UL><CODE>Plugin</CODE> - name/id.
+ </UL>
+
+ </UL>
+
+ <!-- METHOD PARAMETERS END -->
+
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="addSelectAccessibility"><!-- --></A>
+ <H3>addSelectAccessibility</H3>
+ <PRE>Object <B>addSelectAccessibility</B>(<DOMEvent> e, <HTMLElement> s, <DOMWindow> w)</PRE>
+
+ <UL>Adds accessibility keydown handler to the specified select element.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <UL>
+ <B>Parameters:</B>
+
+ <UL><CODE>e</CODE> - Event that gets passed when the element is focused.
+ </UL>
+
+ <UL><CODE>s</CODE> - Select element that the keydown handler gets added to.
+ </UL>
+
+ <UL><CODE>w</CODE> - DOM window reference to add.
+ </UL>
+
+ </UL>
+
+ <!-- METHOD PARAMETERS END -->
+
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="addTheme"><!-- --></A>
+ <H3>addTheme</H3>
+ <PRE>void <B>addTheme</B>(&l<TinyMCE_Theme> t;string> n, t)</PRE>
+
+ <UL>Adds the specified theme in to the list of loaded themes.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <UL>
+ <B>Parameters:</B>
+
+ <UL><CODE>n</CODE> - Theme name/id to add the object reference to.
+ </UL>
+
+ <UL><CODE>t</CODE> - Theme instance to add to the loaded list.
+ </UL>
+
+ </UL>
+
+ <!-- METHOD PARAMETERS END -->
+
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="addToLang"><!-- --></A>
+ <H3>addToLang</H3>
+ <PRE>void <B>addToLang</B>(<string> prefix, <Array> ar)</PRE>
+
+ <UL>Adds language items to the global language array.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <UL>
+ <B>Parameters:</B>
+
+ <UL><CODE>prefix</CODE> - Prefix string to add infront of every array item before adding it.
+ </UL>
+
+ <UL><CODE>ar</CODE> - Language item array to add to global language array.
+ </UL>
+
+ </UL>
+
+ <!-- METHOD PARAMETERS END -->
+
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="applyTemplate"><!-- --></A>
+ <H3>applyTemplate</H3>
+ <PRE>string <B>applyTemplate</B>(<string> h, <Array> as)</PRE>
+
+ <UL>Replaces language, args and settings variables in a HTML string.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <UL>
+ <B>Parameters:</B>
+
+ <UL><CODE>h</CODE> - HTML string to replace language variables in.
+ </UL>
+
+ <UL><CODE>as</CODE> - Optional arguments array to take variables from.
+ </UL>
+
+ </UL>
+
+ <!-- METHOD PARAMETERS END -->
+
+
+ <UL>
+ <B>Returns:</B>
+ <UL>
+ HTML string with replaced varliables.
+ </UL>
+ </UL>
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="callFunc"><!-- --></A>
+ <H3>callFunc</H3>
+ <PRE>boolean <B>callFunc</B>(<<<Array> a href="TinyMCE_Control.html">TinyMCE_Control</a>> ins, <string> p, <string> n, <int> m, a)</PRE>
+
+ <UL>Executes callback chain. Callback TinyMCE_Engine.prototype.order = Option; Plugins, Themes.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <UL>
+ <B>Parameters:</B>
+
+ <UL><CODE>ins</CODE> - TinyMCE editor control instance to execute callback on.
+ </UL>
+
+ <UL><CODE>p</CODE> - TinyMCE callback parameter name.
+ </UL>
+
+ <UL><CODE>n</CODE> - Function name to execute.
+ </UL>
+
+ <UL><CODE>m</CODE> - Execution mode value, 0 = no chain, 1 = event chain, 2 = execcommand chain.
+ </UL>
+
+ <UL><CODE>a</CODE> - Array with function arguments.
+ </UL>
+
+ </UL>
+
+ <!-- METHOD PARAMETERS END -->
+
+
+ <UL>
+ <B>Returns:</B>
+ <UL>
+ true - if the callback was executed, false if it wasn't.
+ </UL>
+ </UL>
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="cancelEvent"><!-- --></A>
+ <H3>cancelEvent</H3>
+ <PRE>void <B>cancelEvent</B>(<DOMEvent> e)</PRE>
+
+ <UL>Cancels the specified event, this will disable the event from be passed to other listeners in event chain.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <UL>
+ <B>Parameters:</B>
+
+ <UL><CODE>e</CODE> - Event to cancel.
+ </UL>
+
+ </UL>
+
+ <!-- METHOD PARAMETERS END -->
+
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="cleanupAnchors"><!-- --></A>
+ <H3>cleanupAnchors</H3>
+ <PRE>void <B>cleanupAnchors</B>(<DOMDocument> doc)</PRE>
+
+ <UL>Moves the contents of a anchor outside and after the anchor. Only if the anchor doesn't
+ have a href.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <UL>
+ <B>Parameters:</B>
+
+ <UL><CODE>doc</CODE> - DOM document instance to fix anchors in.
+ </UL>
+
+ </UL>
+
+ <!-- METHOD PARAMETERS END -->
+
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="cleanupEventStr"><!-- --></A>
+ <H3>cleanupEventStr</H3>
+ <PRE>string <B>cleanupEventStr</B>(<string> s)</PRE>
+
+ <UL>Removes MSIE 5.5 specific event wrapper function form a event string.
+ This will also remove the event blocker if it's added in front of the event.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <UL>
+ <B>Parameters:</B>
+
+ <UL><CODE>s</CODE> - String to replace event data in.
+ </UL>
+
+ </UL>
+
+ <!-- METHOD PARAMETERS END -->
+
+
+ <UL>
+ <B>Returns:</B>
+ <UL>
+ Replaced string value.
+ </UL>
+ </UL>
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="cleanupHTMLCode"><!-- --></A>
+ <H3>cleanupHTMLCode</H3>
+ <PRE>string <B>cleanupHTMLCode</B>(<string> s)</PRE>
+
+ <UL>Makes some preprocessing cleanup routines on the specified HTML string.
+ This includes forcing some tags to be open so MSIE doesn't fail. Forcing other to close and
+ padding paragraphs with non breaking spaces. This function is used when the editor gets
+ initialized with content.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <UL>
+ <B>Parameters:</B>
+
+ <UL><CODE>s</CODE> - HTML string to cleanup.
+ </UL>
+
+ </UL>
+
+ <!-- METHOD PARAMETERS END -->
+
+
+ <UL>
+ <B>Returns:</B>
+ <UL>
+ Cleaned HTML string.
+ </UL>
+ </UL>
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="clearArray"><!-- --></A>
+ <H3>clearArray</H3>
+ <PRE>Array <B>clearArray</B>(a)</PRE>
+
+ <UL>Returns a cleared array, since some external libraries tend to extend the Array core object
+ arrays needs to be cleaned from these extended functions. So this function simply sets any
+ named properties back to null.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <UL>
+ <B>Parameters:</B>
+
+ <UL><CODE>Name</CODE> - /Value array to clear.
+ </UL>
+
+ </UL>
+
+ <!-- METHOD PARAMETERS END -->
+
+
+ <UL>
+ <B>Returns:</B>
+ <UL>
+ Cleared name/value array.
+ </UL>
+ </UL>
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="closeWindow"><!-- --></A>
+ <H3>closeWindow</H3>
+ <PRE>void <B>closeWindow</B>(<DOMWindow> win)</PRE>
+
+ <UL>Closes the specified window. This function is deprecated and should be replaced with
+ tinyMCEPopup.close();.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <UL>
+ <B>Parameters:</B>
+
+ <UL><CODE>win</CODE> - Window reference to close.
+ </UL>
+
+ </UL>
+
+ <!-- METHOD PARAMETERS END -->
+
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <UL>
+ <B>Deprecated</B> <I></I><BR/><BR/>
+ </UL>
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="compressStyle"><!-- --></A>
+ <H3>compressStyle</H3>
+ <PRE>void <B>compressStyle</B>(<Array> ar, <string> pr, <string> sf, <string> res)</PRE>
+
+ <UL>Compresses larger styles into a smaller. Since MSIE automaticly converts
+ border: 1px solid red to border-left: 1px solid red, border-righ: 1px solid red and so forth.'
+ This will bundle them together again if the information is the same in each item.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <UL>
+ <B>Parameters:</B>
+
+ <UL><CODE>ar</CODE> - Style name/value array with items.
+ </UL>
+
+ <UL><CODE>pr</CODE> - Style item prefix to bundle for example border.
+ </UL>
+
+ <UL><CODE>sf</CODE> - Style item suffix to bunlde for example -width or -width.
+ </UL>
+
+ <UL><CODE>res</CODE> - Result name, for example border-width.
+ </UL>
+
+ </UL>
+
+ <!-- METHOD PARAMETERS END -->
+
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="confirmAdd"><!-- --></A>
+ <H3>confirmAdd</H3>
+ <PRE>void <B>confirmAdd</B>(<DOMEvent> e, <Array> settings)</PRE>
+
+ <UL>Displays a confirm dialog when a user clicks/focus a textarea that is to be converted into
+ a TinyMCE instance.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <UL>
+ <B>Parameters:</B>
+
+ <UL><CODE>e</CODE> - DOM event instance.
+ </UL>
+
+ <UL><CODE>settings</CODE> - Name/Value array of initialization settings.
+ </UL>
+
+ </UL>
+
+ <!-- METHOD PARAMETERS END -->
+
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="convertAbsoluteURLToRelativeURL"><!-- --></A>
+ <H3>convertAbsoluteURLToRelativeURL</H3>
+ <PRE>string <B>convertAbsoluteURLToRelativeURL</B>(<string> base_url, <string> url_to_relative)</PRE>
+
+ <UL>Converts an absolute path to relative path.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <UL>
+ <B>Parameters:</B>
+
+ <UL><CODE>base_url</CODE> - URL to make as a base path, URLs will be converted relative from this point.
+ </UL>
+
+ <UL><CODE>url_to_relative</CODE> - URL to convert into a relative URL.
+ </UL>
+
+ </UL>
+
+ <!-- METHOD PARAMETERS END -->
+
+
+ <UL>
+ <B>Returns:</B>
+ <UL>
+ Relative URL based in input.
+ </UL>
+ </UL>
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="convertAllRelativeURLs"><!-- --></A>
+ <H3>convertAllRelativeURLs</H3>
+ <PRE>void <B>convertAllRelativeURLs</B>(<HTMLElement> body)</PRE>
+
+ <UL>Converts all img and a element URLs to absolute URLs. This will use the mce_src or mce_href attribute values
+ if they are provided. This function is used when the editor is initialized.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <UL>
+ <B>Parameters:</B>
+
+ <UL><CODE>body</CODE> - HTML element to convert all URLs in.
+ </UL>
+
+ </UL>
+
+ <!-- METHOD PARAMETERS END -->
+
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="convertFontsToSpans"><!-- --></A>
+ <H3>convertFontsToSpans</H3>
+ <PRE>void <B>convertFontsToSpans</B>(<DOMDocument> doc)</PRE>
+
+ <UL>Convers fonts to spans in the specified document.
+ Todo: Move this function into a XHTML plugin or simmilar.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <UL>
+ <B>Parameters:</B>
+
+ <UL><CODE>doc</CODE> - Document instance to convert fonts in.
+ </UL>
+
+ </UL>
+
+ <!-- METHOD PARAMETERS END -->
+
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="convertHexToRGB"><!-- --></A>
+ <H3>convertHexToRGB</H3>
+ <PRE>string <B>convertHexToRGB</B>(<string> s)</PRE>
+
+ <UL>Returns a rgb(n,n,n) string from a hexadecimal value.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <UL>
+ <B>Parameters:</B>
+
+ <UL><CODE>s</CODE> - Hexadecimal string to parse.
+ </UL>
+
+ </UL>
+
+ <!-- METHOD PARAMETERS END -->
+
+
+ <UL>
+ <B>Returns:</B>
+ <UL>
+ rgb(n,n,n) string from a hexadecimal value.
+ </UL>
+ </UL>
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="convertRelativeToAbsoluteURL"><!-- --></A>
+ <H3>convertRelativeToAbsoluteURL</H3>
+ <PRE>string <B>convertRelativeToAbsoluteURL</B>(<string> base_url, <string> relative_url)</PRE>
+
+ <UL>Converts an relative path to absolute path.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <UL>
+ <B>Parameters:</B>
+
+ <UL><CODE>base_url</CODE> - URL to make as a base path, URLs will be converted absolute from this point.
+ </UL>
+
+ <UL><CODE>relative_url</CODE> - URL to convert into a absolute URL.
+ </UL>
+
+ </UL>
+
+ <!-- METHOD PARAMETERS END -->
+
+
+ <UL>
+ <B>Returns:</B>
+ <UL>
+ Absolute URL based in input.
+ </UL>
+ </UL>
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="convertRGBToHex"><!-- --></A>
+ <H3>convertRGBToHex</H3>
+ <PRE>string <B>convertRGBToHex</B>(<string> s, <boolean> k)</PRE>
+
+ <UL>Returns a hexadecimal version of the specified rgb(1,2,3) string.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <UL>
+ <B>Parameters:</B>
+
+ <UL><CODE>s</CODE> - RGB string to parse, if this doesn't isn't a rgb(n,n,n) it will passthrough the string.
+ </UL>
+
+ <UL><CODE>k</CODE> - Keep before/after contents. If enabled contents before after the rgb(n,n,n) will be intact.
+ </UL>
+
+ </UL>
+
+ <!-- METHOD PARAMETERS END -->
+
+
+ <UL>
+ <B>Returns:</B>
+ <UL>
+ Hexadecimal version of the specified rgb(1,2,3) string.
+ </UL>
+ </UL>
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="convertSpansToFonts"><!-- --></A>
+ <H3>convertSpansToFonts</H3>
+ <PRE>void <B>convertSpansToFonts</B>(<DOMDocument> doc)</PRE>
+
+ <UL>Converts span elements to font elements in the specified document instance.
+ Todo: Move this function into a XHTML plugin or simmilar.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <UL>
+ <B>Parameters:</B>
+
+ <UL><CODE>doc</CODE> - Document instance to convert spans in.
+ </UL>
+
+ </UL>
+
+ <!-- METHOD PARAMETERS END -->
+
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="convertURL"><!-- --></A>
+ <H3>convertURL</H3>
+ <PRE>string <B>convertURL</B>(<string> url, <HTMLElement> node, <boolean> on_save)</PRE>
+
+ <UL>Converts the specified URL based in TinyMCE configuration settings.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <UL>
+ <B>Parameters:</B>
+
+ <UL><CODE>url</CODE> - URL to convert based on config.
+ </UL>
+
+ <UL><CODE>node</CODE> - HTML element that holds the URL.
+ </UL>
+
+ <UL><CODE>on_save</CODE> - Is this convertion the final output URL.
+ </UL>
+
+ </UL>
+
+ <!-- METHOD PARAMETERS END -->
+
+
+ <UL>
+ <B>Returns:</B>
+ <UL>
+ Converted URL string.
+ </UL>
+ </UL>
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="debug"><!-- --></A>
+ <H3>debug</H3>
+ <PRE>void <B>debug</B>()</PRE>
+
+ <UL>Debugs the specified message to a screen.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <UL>
+ <B>Parameters:</B>
+
+ <UL><CODE>Numerous</CODE> - arguments that will be outputed.
+ </UL>
+
+ </UL>
+
+ <!-- METHOD PARAMETERS END -->
+
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="dispatchCallback"><!-- --></A>
+ <H3>dispatchCallback</H3>
+ <PRE>Object <B>dispatchCallback</B>(<<a href="TinyMCE_Control.html">TinyMCE_Control</a>> i, <string> p, <string> n)</PRE>
+
+ <UL>Dispatches the specified callback on all options, plugins and themes. This will not
+ chain them, so all functions callbacks will be executed regardless if the return true/false.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <UL>
+ <B>Parameters:</B>
+
+ <UL><CODE>i</CODE> - TinyMCE editor control instance to execute callback on.
+ </UL>
+
+ <UL><CODE>p</CODE> - TinyMCE callback parameter to execute.
+ </UL>
+
+ <UL><CODE>n</CODE> - Function name to execute.
+ </UL>
+
+ </UL>
+
+ <!-- METHOD PARAMETERS END -->
+
+
+ <UL>
+ <B>Returns:</B>
+ <UL>
+ true/false if they where dispatched.
+ </UL>
+ </UL>
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="entityDecode"><!-- --></A>
+ <H3>entityDecode</H3>
+ <PRE>string <B>entityDecode</B>(<string> s)</PRE>
+
+ <UL>HTML entity decode a string, replaces < with <.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <UL>
+ <B>Parameters:</B>
+
+ <UL><CODE>s</CODE> - Entity string to decode into normal string.
+ </UL>
+
+ </UL>
+
+ <!-- METHOD PARAMETERS END -->
+
+
+ <UL>
+ <B>Returns:</B>
+ <UL>
+ Entity decoded string.
+ </UL>
+ </UL>
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="evalFunc"><!-- --></A>
+ <H3>evalFunc</H3>
+ <PRE>object <B>evalFunc</B>(<string> f, <int> idx, <Array> a)</PRE>
+
+ <UL>Evaluates the specified function and uses the array of arguments.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <UL>
+ <B>Parameters:</B>
+
+ <UL><CODE>f</CODE> - Function reference to execute.
+ </UL>
+
+ <UL><CODE>idx</CODE> - Index in array to start grabbing arguments from.
+ </UL>
+
+ <UL><CODE>a</CODE> - Array of function arguments.
+ </UL>
+
+ </UL>
+
+ <!-- METHOD PARAMETERS END -->
+
+
+ <UL>
+ <B>Returns:</B>
+ <UL>
+ Value returned from the evaluated function.
+ </UL>
+ </UL>
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="execCommand"><!-- --></A>
+ <H3>execCommand</H3>
+ <PRE>void <B>execCommand</B>(<string> command, <boolean> user_interface, <object> value)</PRE>
+
+ <UL>Executes a command on the selected or last selected TinyMCE editor control instance. This function also handles
+ some non instance specific commands like mceAddControl, mceRemoveControl, mceHelp or mceFocus.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <UL>
+ <B>Parameters:</B>
+
+ <UL><CODE>command</CODE> - Command name to execute, for example mceLink or Bold.
+ </UL>
+
+ <UL><CODE>user_interface</CODE> - True/false state if a UI (dialog) should be presented or not.
+ </UL>
+
+ <UL><CODE>value</CODE> - Optional command value, this can be anything.
+ </UL>
+
+ </UL>
+
+ <!-- METHOD PARAMETERS END -->
+
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="execCommandCallback"><!-- --></A>
+ <H3>execCommandCallback</H3>
+ <PRE>Object <B>execCommandCallback</B>(<<a href="TinyMCE_Control.html">TinyMCE_Control</a>> i, <string> p, <string> n)</PRE>
+
+ <UL>Executes the specified execcommand callback on all options, plugins and themes. This will
+ chain them, so callback chain will be broken if one function returns true.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <UL>
+ <B>Parameters:</B>
+
+ <UL><CODE>i</CODE> - TinyMCE editor control instance to execute callback on.
+ </UL>
+
+ <UL><CODE>p</CODE> - TinyMCE callback parameter to execute.
+ </UL>
+
+ <UL><CODE>n</CODE> - Function name to execute.
+ </UL>
+
+ </UL>
+
+ <!-- METHOD PARAMETERS END -->
+
+
+ <UL>
+ <B>Returns:</B>
+ <UL>
+ true/false if a callback was executed.
+ </UL>
+ </UL>
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="execInstanceCommand"><!-- --></A>
+ <H3>execInstanceCommand</H3>
+ <PRE>void <B>execInstanceCommand</B>(<string> editor_id, <string> command, <boolean> user_interface, <object> value, <boolean> focus)</PRE>
+
+ <UL>Executes a command on a specific editor instance by id.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <UL>
+ <B>Parameters:</B>
+
+ <UL><CODE>editor_id</CODE> - TinyMCE editor control instance id to perform comman on.
+ </UL>
+
+ <UL><CODE>command</CODE> - Command name to execute, for example mceLink or Bold.
+ </UL>
+
+ <UL><CODE>user_interface</CODE> - True/false state if a UI (dialog) should be presented or not.
+ </UL>
+
+ <UL><CODE>value</CODE> - Optional command value, this can be anything.
+ </UL>
+
+ <UL><CODE>focus</CODE> - True/false if the editor instance should be focused first.
+ </UL>
+
+ </UL>
+
+ <!-- METHOD PARAMETERS END -->
+
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="executeCallback"><!-- --></A>
+ <H3>executeCallback</H3>
+ <PRE>Object <B>executeCallback</B>(<<a href="TinyMCE_Control.html">TinyMCE_Control</a>> i, <string> p, <string> n)</PRE>
+
+ <UL>Executes the specified callback on all options, plugins and themes. This will
+ chain them, so callback chain will be broken if one function returns false.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <UL>
+ <B>Parameters:</B>
+
+ <UL><CODE>i</CODE> - TinyMCE editor control instance to execute callback on.
+ </UL>
+
+ <UL><CODE>p</CODE> - TinyMCE callback parameter to execute.
+ </UL>
+
+ <UL><CODE>n</CODE> - Function name to execute.
+ </UL>
+
+ </UL>
+
+ <!-- METHOD PARAMETERS END -->
+
+
+ <UL>
+ <B>Returns:</B>
+ <UL>
+ true/false if a callback was executed.
+ </UL>
+ </UL>
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="explode"><!-- --></A>
+ <H3>explode</H3>
+ <PRE>Array <B>explode</B>(<string> d, <string> s)</PRE>
+
+ <UL>Splits a string by the specified delimiter and skips any empty items.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <UL>
+ <B>Parameters:</B>
+
+ <UL><CODE>d</CODE> - Delimiter to split by.
+ </UL>
+
+ <UL><CODE>s</CODE> - String to split.
+ </UL>
+
+ </UL>
+
+ <!-- METHOD PARAMETERS END -->
+
+
+ <UL>
+ <B>Returns:</B>
+ <UL>
+ Array with chunks from string.
+ </UL>
+ </UL>
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="extend"><!-- --></A>
+ <H3>extend</H3>
+ <PRE>Object <B>extend</B>(<Object> p, <Object> np)</PRE>
+
+ <UL>Extends the specified prototype with new methods.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <UL>
+ <B>Parameters:</B>
+
+ <UL><CODE>p</CODE> - Prototype to extend with new methods.
+ </UL>
+
+ <UL><CODE>np</CODE> - New prototype to extend the other one with.
+ </UL>
+
+ </UL>
+
+ <!-- METHOD PARAMETERS END -->
+
+
+ <UL>
+ <B>Returns:</B>
+ <UL>
+ Extended prototype array.
+ </UL>
+ </UL>
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="fixGeckoBaseHREFBug"><!-- --></A>
+ <H3>fixGeckoBaseHREFBug</H3>
+ <PRE>string <B>fixGeckoBaseHREFBug</B>(<boolean> m, <HTMLElement> e, <string> h)</PRE>
+
+ <UL>Fixes a Gecko specific bug where href, src attribute values gets converted incorrectly
+ when inserted into editor. This function will replace all src, href with mce_tsrc and mce_thref
+ to keep the values from chaging when they get inserted.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <UL>
+ <B>Parameters:</B>
+
+ <UL><CODE>m</CODE> - Mode state, true is to replace the src, href attributes to mce_tsrc and mce_thref.
+ </UL>
+
+ <UL><CODE>e</CODE> - HTML element to replace them in. (Will be used if m is 0)
+ </UL>
+
+ <UL><CODE>h</CODE> - HTML code to replace them in. (Will be used if m is 1)
+ </UL>
+
+ </UL>
+
+ <!-- METHOD PARAMETERS END -->
+
+
+ <UL>
+ <B>Returns:</B>
+ <UL>
+ Converted string or the specified HTML value depending on mode.
+ </UL>
+ </UL>
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="getAbsPosition"><!-- --></A>
+ <H3>getAbsPosition</H3>
+ <PRE>TinyMCE_ElementPosition <B>getAbsPosition</B>(<HTMLNode> n)</PRE>
+
+ <UL>Returns the absolute x, y position of a node. The position will be returned in a object with
+ two properties absLeft and absTop.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <UL>
+ <B>Parameters:</B>
+
+ <UL><CODE>n</CODE> - HTML element to get x, y position from.
+ </UL>
+
+ </UL>
+
+ <!-- METHOD PARAMETERS END -->
+
+
+ <UL>
+ <B>Returns:</B>
+ <UL>
+ Absolute position of the specified element.
+ </UL>
+ </UL>
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="getAttrib"><!-- --></A>
+ <H3>getAttrib</H3>
+ <PRE>string <B>getAttrib</B>(<HTMLElement> elm, <string> name, <string> default_value)</PRE>
+
+ <UL>Returns the attribute value of a element or the default value if it wasn't found.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <UL>
+ <B>Parameters:</B>
+
+ <UL><CODE>elm</CODE> - HTML element to get attribute from.
+ </UL>
+
+ <UL><CODE>name</CODE> - Attribute name to retrive.
+ </UL>
+
+ <UL><CODE>default_value</CODE> - Optional default value to return, this value defaults to a empty string.
+ </UL>
+
+ </UL>
+
+ <!-- METHOD PARAMETERS END -->
+
+
+ <UL>
+ <B>Returns:</B>
+ <UL>
+ Attribute value or default value if it wasn't found in element.
+ </UL>
+ </UL>
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="getButtonHTML"><!-- --></A>
+ <H3>getButtonHTML</H3>
+ <PRE>string <B>getButtonHTML</B>(<string> id, <string> lang, <string> img, <string> cmd, <string> ui, <string> val)</PRE>
+
+ <UL>Returns the HTML code for a normal button control.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <UL>
+ <B>Parameters:</B>
+
+ <UL><CODE>id</CODE> - Button control id, this will be the suffix for the element id, the prefix is the editor id.
+ </UL>
+
+ <UL><CODE>lang</CODE> - Language variable key name to insert as the title/alt of the button image.
+ </UL>
+
+ <UL><CODE>img</CODE> - Image URL to insert, {$themeurl} and {$pluginurl} will be replaced.
+ </UL>
+
+ <UL><CODE>cmd</CODE> - Command to execute when the user clicks the button.
+ </UL>
+
+ <UL><CODE>ui</CODE> - Optional user interface boolean for command.
+ </UL>
+
+ <UL><CODE>val</CODE> - Optional value for command.
+ </UL>
+
+ </UL>
+
+ <!-- METHOD PARAMETERS END -->
+
+
+ <UL>
+ <B>Returns:</B>
+ <UL>
+ HTML code for a normal button based in input information.
+ </UL>
+ </UL>
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="getContent"><!-- --></A>
+ <H3>getContent</H3>
+ <PRE>string <B>getContent</B>(<string> editor_id)</PRE>
+
+ <UL>Returns the HTML contents of the specified editor instance id.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <UL>
+ <B>Parameters:</B>
+
+ <UL><CODE>editor_id</CODE> - Editor instance id to retrive HTML code from.
+ </UL>
+
+ </UL>
+
+ <!-- METHOD PARAMETERS END -->
+
+
+ <UL>
+ <B>Returns:</B>
+ <UL>
+ HTML contents of editor id or null if it wasn't found.
+ </UL>
+ </UL>
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="getControlHTML"><!-- --></A>
+ <H3>getControlHTML</H3>
+ <PRE>string <B>getControlHTML</B>(<string> c)</PRE>
+
+ <UL>Returns the HTML for the specified control this will loop through
+ the theme and all plugins inorder to find the control. The callback for each
+ theme and plugin is called getControlHTML.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <UL>
+ <B>Parameters:</B>
+
+ <UL><CODE>c</CODE> - Control name/id to get HTML code for.
+ </UL>
+
+ </UL>
+
+ <!-- METHOD PARAMETERS END -->
+
+
+ <UL>
+ <B>Returns:</B>
+ <UL>
+ HTML code for the specified control or empty string if it wasn't found.
+ </UL>
+ </UL>
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="getCSSClasses"><!-- --></A>
+ <H3>getCSSClasses</H3>
+ <PRE>Array <B>getCSSClasses</B>(<string> editor_id, <DOMDocument> doc)</PRE>
+
+ <UL>Returns a array of CSS classes that is available in a document.
+ TinyMCE_Engine.prototype.Todo = Fix;this one, it's so ugly. :)</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <UL>
+ <B>Parameters:</B>
+
+ <UL><CODE>editor_id</CODE> - Editor id to get CSS classes from.
+ </UL>
+
+ <UL><CODE>doc</CODE> - DOM document to get the CSS classes from.
+ </UL>
+
+ </UL>
+
+ <!-- METHOD PARAMETERS END -->
+
+
+ <UL>
+ <B>Returns:</B>
+ <UL>
+ Array of CSS classes that is available in a document.
+ </UL>
+ </UL>
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="getEditorId"><!-- --></A>
+ <H3>getEditorId</H3>
+ <PRE>string <B>getEditorId</B>(<string> form_element)</PRE>
+
+ <UL>Returns the editor instance id of a specific form element.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <UL>
+ <B>Parameters:</B>
+
+ <UL><CODE>form_element</CODE> - Form element name to get instance id for.
+ </UL>
+
+ </UL>
+
+ <!-- METHOD PARAMETERS END -->
+
+
+ <UL>
+ <B>Returns:</B>
+ <UL>
+ TinyMCE editor instance id or null if it wasn't found.
+ </UL>
+ </UL>
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="getElementByAttributeValue"><!-- --></A>
+ <H3>getElementByAttributeValue</H3>
+ <PRE>HTMLElement <B>getElementByAttributeValue</B>(<HTMLElement> n, <string> e, <string> a, <string> v)</PRE>
+
+ <UL>Returns a element by a specific attribute and it's value.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <UL>
+ <B>Parameters:</B>
+
+ <UL><CODE>n</CODE> - Element to search in.
+ </UL>
+
+ <UL><CODE>e</CODE> - Element name to search for.
+ </UL>
+
+ <UL><CODE>a</CODE> - Attribute name to search for.
+ </UL>
+
+ <UL><CODE>v</CODE> - Attribute value to search for.
+ </UL>
+
+ </UL>
+
+ <!-- METHOD PARAMETERS END -->
+
+
+ <UL>
+ <B>Returns:</B>
+ <UL>
+ HTML element that matched the criterias or null on failure.
+ </UL>
+ </UL>
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="getElementsByAttributeValue"><!-- --></A>
+ <H3>getElementsByAttributeValue</H3>
+ <PRE>Array <B>getElementsByAttributeValue</B>(<HTMLElement> n, <string> e, <string> a, <string> v)</PRE>
+
+ <UL>Returns a element array by a specific attribute and it's value.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <UL>
+ <B>Parameters:</B>
+
+ <UL><CODE>n</CODE> - Element to search in.
+ </UL>
+
+ <UL><CODE>e</CODE> - Element name to search for.
+ </UL>
+
+ <UL><CODE>a</CODE> - Attribute name to search for.
+ </UL>
+
+ <UL><CODE>v</CODE> - Attribute value to search for.
+ </UL>
+
+ </UL>
+
+ <!-- METHOD PARAMETERS END -->
+
+
+ <UL>
+ <B>Returns:</B>
+ <UL>
+ HTML element array that matched the criterias or null on failure.
+ </UL>
+ </UL>
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="getInstanceById"><!-- --></A>
+ <H3>getInstanceById</H3>
+ <PRE><a href="TinyMCE_Control.html">TinyMCE_Control</a> <B>getInstanceById</B>(<string> editor_id)</PRE>
+
+ <UL>Returns a TinyMCE editor instance by the specified editor id or null if it wasn't found.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <UL>
+ <B>Parameters:</B>
+
+ <UL><CODE>editor_id</CODE> - Editor id to get instance for.
+ </UL>
+
+ </UL>
+
+ <!-- METHOD PARAMETERS END -->
+
+
+ <UL>
+ <B>Returns:</B>
+ <UL>
+ TinyMCE editor control instance or null if it wasn't found.
+ </UL>
+ </UL>
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="getLang"><!-- --></A>
+ <H3>getLang</H3>
+ <PRE>object <B>getLang</B>(<string> name, <string> default_value, <boolean> parse_entities, <Array> va)</PRE>
+
+ <UL>Returns a language variable value from the language packs.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <UL>
+ <B>Parameters:</B>
+
+ <UL><CODE>name</CODE> - Name of the key to retrive.
+ </UL>
+
+ <UL><CODE>default_value</CODE> - Optional default value to return if it wasn't found.
+ </UL>
+
+ <UL><CODE>parse_entities</CODE> - Is HTML entities to be resolved or not.
+ </UL>
+
+ <UL><CODE>va</CODE> - Optional name/value array of variables to replace in language string.
+ </UL>
+
+ </UL>
+
+ <!-- METHOD PARAMETERS END -->
+
+
+ <UL>
+ <B>Returns:</B>
+ <UL>
+ Language string value could be a number if it's a relative dimenstion.
+ </UL>
+ </UL>
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="getNodeTree"><!-- --></A>
+ <H3>getNodeTree</H3>
+ <PRE>Array <B>getNodeTree</B>(&l<int> t;HTMLNode> n, <Array> na, t, <string> nn)</PRE>
+
+ <UL>Returns a array of nodes selected retrived from the child nodes of the specified node.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <UL>
+ <B>Parameters:</B>
+
+ <UL><CODE>n</CODE> - Node to get children from.
+ </UL>
+
+ <UL><CODE>na</CODE> - Array to fill with children.
+ </UL>
+
+ <UL><CODE>t</CODE> - Node type to get.
+ </UL>
+
+ <UL><CODE>nn</CODE> - Node name of items to retrive.
+ </UL>
+
+ </UL>
+
+ <!-- METHOD PARAMETERS END -->
+
+
+ <UL>
+ <B>Returns:</B>
+ <UL>
+ Node array.
+ </UL>
+ </UL>
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="getOuterHTML"><!-- --></A>
+ <H3>getOuterHTML</H3>
+ <PRE>string <B>getOuterHTML</B>(<HTMLElement> e)</PRE>
+
+ <UL>Returns the outer HTML of a element, this uses the outerHTML
+ property in MSIE and Opera and a workaround for Gecko.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <UL>
+ <B>Parameters:</B>
+
+ <UL><CODE>e</CODE> - HTML element to get outerHTML from.
+ </UL>
+
+ </UL>
+
+ <!-- METHOD PARAMETERS END -->
+
+
+ <UL>
+ <B>Returns:</B>
+ <UL>
+ HTML content string.
+ </UL>
+ </UL>
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="getParam"><!-- --></A>
+ <H3>getParam</H3>
+ <PRE>object <B>getParam</B>(<string> name, <string> default_value, <boolean> strip_whitespace, <string> split_chr)</PRE>
+
+ <UL>Returns a specific configuration setting or the default value if it wasn't found.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <UL>
+ <B>Parameters:</B>
+
+ <UL><CODE>name</CODE> - Configuration setting to get.
+ </UL>
+
+ <UL><CODE>default_value</CODE> - Default value to return if it wasn't found.
+ </UL>
+
+ <UL><CODE>strip_whitespace</CODE> - Optional remove all whitespace.
+ </UL>
+
+ <UL><CODE>split_chr</CODE> - Split char/regex/string.
+ </UL>
+
+ </UL>
+
+ <!-- METHOD PARAMETERS END -->
+
+
+ <UL>
+ <B>Returns:</B>
+ <UL>
+ Number, string or other object based in parameter and default_value.
+ </UL>
+ </UL>
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="getParentBlockElement"><!-- --></A>
+ <H3>getParentBlockElement</H3>
+ <PRE>HTMLElement <B>getParentBlockElement</B>(<HTMLNode> n)</PRE>
+
+ <UL>Returns the first block element parent of the specified node.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <UL>
+ <B>Parameters:</B>
+
+ <UL><CODE>n</CODE> - Node get parent block element for.
+ </UL>
+
+ </UL>
+
+ <!-- METHOD PARAMETERS END -->
+
+
+ <UL>
+ <B>Returns:</B>
+ <UL>
+ First block element parent of the specified node or null if it wasn't found.
+ </UL>
+ </UL>
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="getParentElement"><!-- --></A>
+ <H3>getParentElement</H3>
+ <PRE>HTMLElement <B>getParentElement</B>(<HTMLNode> node, <string> names, <string> attrib_name, <string> attrib_value)</PRE>
+
+ <UL>Returns the parent element of the specified node based on the search criteria.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <UL>
+ <B>Parameters:</B>
+
+ <UL><CODE>node</CODE> - Node to get parent element of.
+ </UL>
+
+ <UL><CODE>names</CODE> - Comma separated list of element names to get.
+ </UL>
+
+ <UL><CODE>attrib_name</CODE> - Optional attribute name to match.
+ </UL>
+
+ <UL><CODE>attrib_value</CODE> - Optional attribute value to match.
+ </UL>
+
+ </UL>
+
+ <!-- METHOD PARAMETERS END -->
+
+
+ <UL>
+ <B>Returns:</B>
+ <UL>
+ HTMLElement or null based on search criteras.
+ </UL>
+ </UL>
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="getParentNode"><!-- --></A>
+ <H3>getParentNode</H3>
+ <PRE>DOMNode <B>getParentNode</B>(<DOMNode> n, <function> f)</PRE>
+
+ <UL>Returns a node by the specified selector function. This function will
+ loop through all parent nodes and call the specified function for each node.
+ If the function then returns true it will stop the execution and return that node.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <UL>
+ <B>Parameters:</B>
+
+ <UL><CODE>n</CODE> - HTML node to search parents on.
+ </UL>
+
+ <UL><CODE>f</CODE> - Selection function to execute on each node.
+ </UL>
+
+ </UL>
+
+ <!-- METHOD PARAMETERS END -->
+
+
+ <UL>
+ <B>Returns:</B>
+ <UL>
+ DOMNode or null if it wasn't found.
+ </UL>
+ </UL>
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="getVisualAidClass"><!-- --></A>
+ <H3>getVisualAidClass</H3>
+ <PRE>string <B>getVisualAidClass</B>(<string> class_name, <boolean> state)</PRE>
+
+ <UL>Returns the visual aid class string, this will add/remove the visual aid class.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <UL>
+ <B>Parameters:</B>
+
+ <UL><CODE>class_name</CODE> - Class name value to add/remove visual aid classes from.
+ </UL>
+
+ <UL><CODE>state</CODE> - true/false if the classes should be added or removed.
+ </UL>
+
+ </UL>
+
+ <!-- METHOD PARAMETERS END -->
+
+
+ <UL>
+ <B>Returns:</B>
+ <UL>
+ New class value containing the visual aid classes or not.
+ </UL>
+ </UL>
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="getWindowArg"><!-- --></A>
+ <H3>getWindowArg</H3>
+ <PRE>Object <B>getWindowArg</B>(<string> n, d)</PRE>
+
+ <UL>Returns the window argument to be passed to TinyMCE popup.
+ TinyMCE_Engine.prototype.Use = tinyMCEPopup;.getWindowArg instead.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <UL>
+ <B>Parameters:</B>
+
+ <UL><CODE>n</CODE> - Window argument name.
+ </UL>
+
+ </UL>
+
+ <!-- METHOD PARAMETERS END -->
+
+
+ <UL>
+ <B>Returns:</B>
+ <UL>
+ Argument value or default value if it wasn't found.
+ </UL>
+ </UL>
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <UL>
+ <B>Deprecated</B> <I></I><BR/><BR/>
+ </UL>
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="handleEvent"><!-- --></A>
+ <H3>handleEvent</H3>
+ <PRE>boolean <B>handleEvent</B>(<DOMEvent> e)</PRE>
+
+ <UL>Event handler function that gets executed each time a event occurs in a TinyMCE editor control instance.
+ TinyMCE_Engine.prototype.Todo = Fix;the return statements so they return true or false.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <UL>
+ <B>Parameters:</B>
+
+ <UL><CODE>e</CODE> - DOM event object reference.
+ </UL>
+
+ </UL>
+
+ <!-- METHOD PARAMETERS END -->
+
+
+ <UL>
+ <B>Returns:</B>
+ <UL>
+ true - if the event is to be chained, false - if the event chain is to be canceled.
+ </UL>
+ </UL>
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="handleVisualAid"><!-- --></A>
+ <H3>handleVisualAid</H3>
+ <PRE>void <B>handleVisualAid</B>(<HTMLElement> el, <boolean> deep, <boolean> state, <<a href="TinyMCE_Control.html">TinyMCE_Control</a>> inst, skip_dispatch)</PRE>
+
+ <UL>Adds visual aid classes to all elements that need them recursive in the DOM tree.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <UL>
+ <B>Parameters:</B>
+
+ <UL><CODE>el</CODE> - HTML element to add visual aid classes to.
+ </UL>
+
+ <UL><CODE>deep</CODE> - Should they be added to all children aswell.
+ </UL>
+
+ <UL><CODE>state</CODE> - Should they be added or removed.
+ </UL>
+
+ <UL><CODE>inst</CODE> - TinyMCE editor control instance to add/remove them to/from.
+ </UL>
+
+ </UL>
+
+ <!-- METHOD PARAMETERS END -->
+
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="hasMenu"><!-- --></A>
+ <H3>hasMenu</H3>
+ <PRE>boolean <B>hasMenu</B>(<string> n)</PRE>
+
+ <UL>Checks if the specified menu by name is added to TinyMCE.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <UL>
+ <B>Parameters:</B>
+
+ <UL><CODE>n</CODE> - TinyMCE menu id.
+ </UL>
+
+ </UL>
+
+ <!-- METHOD PARAMETERS END -->
+
+
+ <UL>
+ <B>Returns:</B>
+ <UL>
+ true/false if it exists or not.
+ </UL>
+ </UL>
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="hasPlugin"><!-- --></A>
+ <H3>hasPlugin</H3>
+ <PRE>boolean <B>hasPlugin</B>(<string> n)</PRE>
+
+ <UL>Returns true/false if the specified plugin is loaded or not.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <UL>
+ <B>Parameters:</B>
+
+ <UL><CODE>n</CODE> - Plugin name to look for.
+ </UL>
+
+ </UL>
+
+ <!-- METHOD PARAMETERS END -->
+
+
+ <UL>
+ <B>Returns:</B>
+ <UL>
+ true/false if the specified plugin is loaded or not.
+ </UL>
+ </UL>
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="hasTheme"><!-- --></A>
+ <H3>hasTheme</H3>
+ <PRE>boolean <B>hasTheme</B>(<string> n)</PRE>
+
+ <UL>Returns true/false if the specified theme is loaded or not.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <UL>
+ <B>Parameters:</B>
+
+ <UL><CODE>n</CODE> - Theme name/id to check for.
+ </UL>
+
+ </UL>
+
+ <!-- METHOD PARAMETERS END -->
+
+
+ <UL>
+ <B>Returns:</B>
+ <UL>
+ true/false if the specified theme is loaded or not.
+ </UL>
+ </UL>
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="importCSS"><!-- --></A>
+ <H3>importCSS</H3>
+ <PRE>void <B>importCSS</B>(<DOMDocument> doc, <string> css)</PRE>
+
+ <UL>Imports a CSS file into a allready loaded document. This will add a link element
+ to the head element of the document.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <UL>
+ <B>Parameters:</B>
+
+ <UL><CODE>doc</CODE> - DOM Document to load CSS into.
+ </UL>
+
+ <UL><CODE>css</CODE> - CSS File URL to load or comma separated list of files.
+ </UL>
+
+ </UL>
+
+ <!-- METHOD PARAMETERS END -->
+
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="importPluginLanguagePack"><!-- --></A>
+ <H3>importPluginLanguagePack</H3>
+ <PRE>void <B>importPluginLanguagePack</B>(<string> name, <string> valid_languages)</PRE>
+
+ <UL>Loads a plugin specific language pack.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <UL>
+ <B>Parameters:</B>
+
+ <UL><CODE>name</CODE> - Plugin name/id to load language pack for.
+ </UL>
+
+ <UL><CODE>valid_languages</CODE> - Comma separated list of valid languages for the plugin.
+ </UL>
+
+ </UL>
+
+ <!-- METHOD PARAMETERS END -->
+
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="importThemeLanguagePack"><!-- --></A>
+ <H3>importThemeLanguagePack</H3>
+ <PRE>void <B>importThemeLanguagePack</B>(<string> name)</PRE>
+
+ <UL>Loads a theme specific language pack.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <UL>
+ <B>Parameters:</B>
+
+ <UL><CODE>name</CODE> - Optional name of the theme to load language pack from.
+ </UL>
+
+ </UL>
+
+ <!-- METHOD PARAMETERS END -->
+
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="init"><!-- --></A>
+ <H3>init</H3>
+ <PRE>void <B>init</B>(settings)</PRE>
+
+ <UL>Initializes TinyMCE with the specific configuration settings. This method
+ may be called multiple times when multiple instances with diffrent settings is to be created.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <UL>
+ <B>Parameters:</B>
+
+ <UL><CODE>Name</CODE> - /Value array of initialization settings.
+ </UL>
+
+ </UL>
+
+ <!-- METHOD PARAMETERS END -->
+
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="insertAfter"><!-- --></A>
+ <H3>insertAfter</H3>
+ <PRE>void <B>insertAfter</B>(<HTMLNode> n, <HTMLNode> r)</PRE>
+
+ <UL>Inserts a node after the specific node.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <UL>
+ <B>Parameters:</B>
+
+ <UL><CODE>n</CODE> - New node to insert.
+ </UL>
+
+ <UL><CODE>r</CODE> - Reference node to insert after.
+ </UL>
+
+ </UL>
+
+ <!-- METHOD PARAMETERS END -->
+
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="isBlockElement"><!-- --></A>
+ <H3>isBlockElement</H3>
+ <PRE>boolean <B>isBlockElement</B>(<HTMLNode> n)</PRE>
+
+ <UL>Returns true/false if the specified node is a block element or not.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <UL>
+ <B>Parameters:</B>
+
+ <UL><CODE>n</CODE> - Node to verify.
+ </UL>
+
+ </UL>
+
+ <!-- METHOD PARAMETERS END -->
+
+
+ <UL>
+ <B>Returns:</B>
+ <UL>
+ true/false if the specified node is a block element or not.
+ </UL>
+ </UL>
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="isInstance"><!-- --></A>
+ <H3>isInstance</H3>
+ <PRE>boolean <B>isInstance</B>(<object> o)</PRE>
+
+ <UL>Returns true/false if a specific object is a TinyMCE_Control instance or not.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <UL>
+ <B>Parameters:</B>
+
+ <UL><CODE>o</CODE> - Object to check.
+ </UL>
+
+ </UL>
+
+ <!-- METHOD PARAMETERS END -->
+
+
+ <UL>
+ <B>Returns:</B>
+ <UL>
+ true/false if it's a control or not.
+ </UL>
+ </UL>
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="loadCSS"><!-- --></A>
+ <H3>loadCSS</H3>
+ <PRE>void <B>loadCSS</B>(<string> url)</PRE>
+
+ <UL>Loads the specified CSS by writing the a link tag to the current page.
+ This will also check if the file has been loaded before. This function should only be used
+ when the page is loading.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <UL>
+ <B>Parameters:</B>
+
+ <UL><CODE>url</CODE> - CSS file URL to load or comma separated list of files.
+ </UL>
+
+ </UL>
+
+ <!-- METHOD PARAMETERS END -->
+
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="loadPlugin"><!-- --></A>
+ <H3>loadPlugin</H3>
+ <PRE>void <B>loadPlugin</B>(<string> n, <string> u)</PRE>
+
+ <UL>Load plugin from external URL.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <UL>
+ <B>Parameters:</B>
+
+ <UL><CODE>n</CODE> - Plugin name for example \"emotions\".
+ </UL>
+
+ <UL><CODE>u</CODE> - URL of plugin directory to load.
+ </UL>
+
+ </UL>
+
+ <!-- METHOD PARAMETERS END -->
+
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="loadScript"><!-- --></A>
+ <H3>loadScript</H3>
+ <PRE>void <B>loadScript</B>(<string> url)</PRE>
+
+ <UL>Loads the specified script by writing the a script tag to the current page.
+ This will also check if the file has been loaded before. This function should only be used
+ when the page is loading.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <UL>
+ <B>Parameters:</B>
+
+ <UL><CODE>url</CODE> - Script URL to load.
+ </UL>
+
+ </UL>
+
+ <!-- METHOD PARAMETERS END -->
+
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="nextNode"><!-- --></A>
+ <H3>nextNode</H3>
+ <PRE>HTMLElement <B>nextNode</B>(<HTMLNode> e, <string> n)</PRE>
+
+ <UL>Finds any element after the current one by name. This will loop through the siblings
+ inorder to find the specified element by name. If the element wasn't found
+ it will return a null value.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <UL>
+ <B>Parameters:</B>
+
+ <UL><CODE>e</CODE> - HTML node to search from.
+ </UL>
+
+ <UL><CODE>n</CODE> - Comma separated list of element names to search for.
+ </UL>
+
+ </UL>
+
+ <!-- METHOD PARAMETERS END -->
+
+
+ <UL>
+ <B>Returns:</B>
+ <UL>
+ HTML Element or null if it wasn't found.
+ </UL>
+ </UL>
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="onLoad"><!-- --></A>
+ <H3>onLoad</H3>
+ <PRE>boolean <B>onLoad</B>()</PRE>
+
+ <UL>Gets executed when the page loads or get intitialized. This function will then convert all textareas/divs that
+ is to be converted into TinyMCE editor controls.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <!-- METHOD PARAMETERS END -->
+
+
+ <UL>
+ <B>Returns:</B>
+ <UL>
+ true - if the event is to be chained, false - if the event chain is to be canceled.
+ </UL>
+ </UL>
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="onMouseMove"><!-- --></A>
+ <H3>onMouseMove</H3>
+ <PRE>void <B>onMouseMove</B>()</PRE>
+
+ <UL>Mouse move handler function, this will be executed each time
+ the mouse is moved within a editor instance. This function stores away the current selection in MSIE
+ this will then be used when a undo/redo level is added.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <!-- METHOD PARAMETERS END -->
+
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="openWindow"><!-- --></A>
+ <H3>openWindow</H3>
+ <PRE>void <B>openWindow</B>(<Array> template, <Array> args)</PRE>
+
+ <UL>Opens a popup window based in the specified input data. This function
+ is used for all popup windows in TinyMCE.
+
+ These are the current template TinyMCE_Engine.prototype.keys = file; width, height, close_previous.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <UL>
+ <B>Parameters:</B>
+
+ <UL><CODE>template</CODE> - Popup template data such as with, height etc.
+ </UL>
+
+ <UL><CODE>args</CODE> - Popup arguments that is to be passed to the popup such as custom data.
+ </UL>
+
+ </UL>
+
+ <!-- METHOD PARAMETERS END -->
+
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="parseStyle"><!-- --></A>
+ <H3>parseStyle</H3>
+ <PRE>Array <B>parseStyle</B>(<string> str)</PRE>
+
+ <UL>Parses the specified HTML style data. This will parse for example
+ "border-left: 1px; background-color: red" into an key/value array.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <UL>
+ <B>Parameters:</B>
+
+ <UL><CODE>str</CODE> - Style data to parse.
+ </UL>
+
+ </UL>
+
+ <!-- METHOD PARAMETERS END -->
+
+
+ <UL>
+ <B>Returns:</B>
+ <UL>
+ Name/Value array of style items.
+ </UL>
+ </UL>
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="parseURL"><!-- --></A>
+ <H3>parseURL</H3>
+ <PRE>TinyMCE_URL_Item <B>parseURL</B>(<string> url_str)</PRE>
+
+ <UL>Parses a URL in to its diffrent components.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <UL>
+ <B>Parameters:</B>
+
+ <UL><CODE>url_str</CODE> - URL string to parse into a URL object.
+ </UL>
+
+ </UL>
+
+ <!-- METHOD PARAMETERS END -->
+
+
+ <UL>
+ <B>Returns:</B>
+ <UL>
+ URL object based on input string.
+ </UL>
+ </UL>
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="prevNode"><!-- --></A>
+ <H3>prevNode</H3>
+ <PRE>HTMLElement <B>prevNode</B>(<HTMLNode> e, <string> n)</PRE>
+
+ <UL>Finds any previous element by name. This will loop through the siblings
+ inorder to find the specified element by name. If the element wasn't found
+ it will return a null value.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <UL>
+ <B>Parameters:</B>
+
+ <UL><CODE>e</CODE> - HTML node to search from.
+ </UL>
+
+ <UL><CODE>n</CODE> - Comma separated list of element names to search for.
+ </UL>
+
+ </UL>
+
+ <!-- METHOD PARAMETERS END -->
+
+
+ <UL>
+ <B>Returns:</B>
+ <UL>
+ HTML Element or null if it wasn't found.
+ </UL>
+ </UL>
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="queryInstanceCommandState"><!-- --></A>
+ <H3>queryInstanceCommandState</H3>
+ <PRE>boolean <B>queryInstanceCommandState</B>(<string> editor_id, <string> command)</PRE>
+
+ <UL>Queries a command state for a specific command on a specific editor instance.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <UL>
+ <B>Parameters:</B>
+
+ <UL><CODE>editor_id</CODE> - Editor id to query command state on.
+ </UL>
+
+ <UL><CODE>command</CODE> - Command to query for.
+ </UL>
+
+ </UL>
+
+ <!-- METHOD PARAMETERS END -->
+
+
+ <UL>
+ <B>Returns:</B>
+ <UL>
+ Command state passed from browser.
+ </UL>
+ </UL>
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="queryInstanceCommandValue"><!-- --></A>
+ <H3>queryInstanceCommandValue</H3>
+ <PRE>object <B>queryInstanceCommandValue</B>(<string> editor_id, <string> command)</PRE>
+
+ <UL>Queries a command value for a specific command on a specific editor instance.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <UL>
+ <B>Parameters:</B>
+
+ <UL><CODE>editor_id</CODE> - Editor id to query command value on.
+ </UL>
+
+ <UL><CODE>command</CODE> - Command to query for.
+ </UL>
+
+ </UL>
+
+ <!-- METHOD PARAMETERS END -->
+
+
+ <UL>
+ <B>Returns:</B>
+ <UL>
+ Command value passed from browser.
+ </UL>
+ </UL>
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="regexpReplace"><!-- --></A>
+ <H3>regexpReplace</H3>
+ <PRE>string <B>regexpReplace</B>(<string> in_str, <string> reg_exp, <string> replace_str, opts)</PRE>
+
+ <UL>Regexp replaces the contents of a string. Use normal replace instead.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <UL>
+ <B>Parameters:</B>
+
+ <UL><CODE>in_str</CODE> - String to replace in.
+ </UL>
+
+ <UL><CODE>in_str</CODE> - Optional regexp options like "gi".
+ </UL>
+
+ <UL><CODE>reg_exp</CODE> - Regexp to replace.
+ </UL>
+
+ <UL><CODE>replace_str</CODE> - String to replace with.
+ </UL>
+
+ </UL>
+
+ <!-- METHOD PARAMETERS END -->
+
+
+ <UL>
+ <B>Returns:</B>
+ <UL>
+ Replaced string value.
+ </UL>
+ </UL>
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <UL>
+ <B>Deprecated</B> <I></I><BR/><BR/>
+ </UL>
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="removeCSSClass"><!-- --></A>
+ <H3>removeCSSClass</H3>
+ <PRE>string <B>removeCSSClass</B>(<HTMLElement> e, c)</PRE>
+
+ <UL>Removes the specified CSS class from the element.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <UL>
+ <B>Parameters:</B>
+
+ <UL><CODE>e</CODE> - HTML element to remove CSS class to.
+ </UL>
+
+ <UL><CODE>string</CODE> - ] c CSS class to remove to HTML element.
+ </UL>
+
+ </UL>
+
+ <!-- METHOD PARAMETERS END -->
+
+
+ <UL>
+ <B>Returns:</B>
+ <UL>
+ Returns the new class attribute value.
+ </UL>
+ </UL>
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="removeMCEControl"><!-- --></A>
+ <H3>removeMCEControl</H3>
+ <PRE>void <B>removeMCEControl</B>(<string> editor_id)</PRE>
+
+ <UL>Removes a TinyMCE editor control instance by id.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <UL>
+ <B>Parameters:</B>
+
+ <UL><CODE>editor_id</CODE> - Id of editor instance to remove.
+ </UL>
+
+ </UL>
+
+ <!-- METHOD PARAMETERS END -->
+
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="removeTinyMCEFormElements"><!-- --></A>
+ <H3>removeTinyMCEFormElements</H3>
+ <PRE>void <B>removeTinyMCEFormElements</B>(<HTMLElement> form_obj)</PRE>
+
+ <UL>Removes/disables TinyMCE built in form elements such as select boxes for font sizes etc.
+ These are disabled when the user submits a form so they don't get picked up by the backend script
+ that intercepts the contents.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <UL>
+ <B>Parameters:</B>
+
+ <UL><CODE>form_obj</CODE> - Form object to loop through for TinyMCE specific form elements.
+ </UL>
+
+ </UL>
+
+ <!-- METHOD PARAMETERS END -->
+
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="renameElement"><!-- --></A>
+ <H3>renameElement</H3>
+ <PRE>void <B>renameElement</B>(<HTMLElement> e, <string> n, <DOMDocument> d)</PRE>
+
+ <UL>Renames the specified element to the specified name.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <UL>
+ <B>Parameters:</B>
+
+ <UL><CODE>e</CODE> - Element to rename.
+ </UL>
+
+ <UL><CODE>n</CODE> - New name of the element.
+ </UL>
+
+ <UL><CODE>d</CODE> - Optional document reference.
+ </UL>
+
+ </UL>
+
+ <!-- METHOD PARAMETERS END -->
+
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="replaceVar"><!-- --></A>
+ <H3>replaceVar</H3>
+ <PRE>string <B>replaceVar</B>(<string> h, <string> r, <string> v)</PRE>
+
+ <UL>Replaces a specific variable in the string with a nother string.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <UL>
+ <B>Parameters:</B>
+
+ <UL><CODE>h</CODE> - String to search in for the variable.
+ </UL>
+
+ <UL><CODE>r</CODE> - Variable name to search for.
+ </UL>
+
+ <UL><CODE>v</CODE> - Value to insert where a variable is found.
+ </UL>
+
+ </UL>
+
+ <!-- METHOD PARAMETERS END -->
+
+
+ <UL>
+ <B>Returns:</B>
+ <UL>
+ String with replaced variable.
+ </UL>
+ </UL>
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="resetForm"><!-- --></A>
+ <H3>resetForm</H3>
+ <PRE>void <B>resetForm</B>(<int> form_index)</PRE>
+
+ <UL>Resets a forms TinyMCE instances based on form index.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <UL>
+ <B>Parameters:</B>
+
+ <UL><CODE>form_index</CODE> - Form index to reset.
+ </UL>
+
+ </UL>
+
+ <!-- METHOD PARAMETERS END -->
+
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="selectNodes"><!-- --></A>
+ <H3>selectNodes</H3>
+ <PRE>Array <B>selectNodes</B>(<DOMNode> n, <function> f, <Array> a)</PRE>
+
+ <UL>Returns a array of nodes when the specified function matches a node.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <UL>
+ <B>Parameters:</B>
+
+ <UL><CODE>n</CODE> - Node to select children from.
+ </UL>
+
+ <UL><CODE>f</CODE> - Function that returns true/false if the node is to be added or not.
+ </UL>
+
+ <UL><CODE>a</CODE> - Optional array to fill with nodes.
+ </UL>
+
+ </UL>
+
+ <!-- METHOD PARAMETERS END -->
+
+
+ <UL>
+ <B>Returns:</B>
+ <UL>
+ Array with selected nodes.
+ </UL>
+ </UL>
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="serializeStyle"><!-- --></A>
+ <H3>serializeStyle</H3>
+ <PRE>string <B>serializeStyle</B>(<Array> ar)</PRE>
+
+ <UL>Serializes the specified style item name/value array into a HTML string. This function
+ will force HEX colors in Firefox and convert the URL items of a style correctly.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <UL>
+ <B>Parameters:</B>
+
+ <UL><CODE>ar</CODE> - Name/Value array of items to serialize.
+ </UL>
+
+ </UL>
+
+ <!-- METHOD PARAMETERS END -->
+
+
+ <UL>
+ <B>Returns:</B>
+ <UL>
+ Serialized HTML string containing the items.
+ </UL>
+ </UL>
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="serializeURL"><!-- --></A>
+ <H3>serializeURL</H3>
+ <PRE>string <B>serializeURL</B>(<TinyMCE_URL_Item> up)</PRE>
+
+ <UL>Serializes the specified URL object into a string.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <UL>
+ <B>Parameters:</B>
+
+ <UL><CODE>up</CODE> - URL object to serialize.
+ </UL>
+
+ </UL>
+
+ <!-- METHOD PARAMETERS END -->
+
+
+ <UL>
+ <B>Returns:</B>
+ <UL>
+ Serialized URL object.
+ </UL>
+ </UL>
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="setAttrib"><!-- --></A>
+ <H3>setAttrib</H3>
+ <PRE>void <B>setAttrib</B>(<HTMLElement> element, <string> name, <string> value, <boolean> fix_value)</PRE>
+
+ <UL>Sets the attribute value for a specific attribute.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <UL>
+ <B>Parameters:</B>
+
+ <UL><CODE>element</CODE> - HTML element to set attribute on.
+ </UL>
+
+ <UL><CODE>name</CODE> - Attribute name to set.
+ </UL>
+
+ <UL><CODE>value</CODE> - Attribute value to set.
+ </UL>
+
+ <UL><CODE>fix_value</CODE> - Optional fix value state, if true only number data will be accepted.
+ </UL>
+
+ </UL>
+
+ <!-- METHOD PARAMETERS END -->
+
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="setContent"><!-- --></A>
+ <H3>setContent</H3>
+ <PRE>void <B>setContent</B>(<string> h)</PRE>
+
+ <UL>Sets the HTML contents of the selected editor instance.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <UL>
+ <B>Parameters:</B>
+
+ <UL><CODE>h</CODE> - HTML contents to set in the selected instance.
+ </UL>
+
+ </UL>
+
+ <!-- METHOD PARAMETERS END -->
+
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <UL>
+ <B>Deprecated</B> <I></I><BR/><BR/>
+ </UL>
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="setInnerHTML"><!-- --></A>
+ <H3>setInnerHTML</H3>
+ <PRE>void <B>setInnerHTML</B>(<HTMLElement> e, <string> h)</PRE>
+
+ <UL>Sets the innerHTML property of a element, this function also
+ fixes a MSIE bug where the first comment is removed.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <UL>
+ <B>Parameters:</B>
+
+ <UL><CODE>e</CODE> - Element to insert HTML in.
+ </UL>
+
+ <UL><CODE>h</CODE> - HTML code to insert into innerHTML.
+ </UL>
+
+ </UL>
+
+ <!-- METHOD PARAMETERS END -->
+
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="setOuterHTML"><!-- --></A>
+ <H3>setOuterHTML</H3>
+ <PRE>void <B>setOuterHTML</B>(<HTMLElement> e, <string> h)</PRE>
+
+ <UL>Sets the outer HTML of a element, this uses the outerHTML
+ property in MSIE and Opera and a workaround for Gecko.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <UL>
+ <B>Parameters:</B>
+
+ <UL><CODE>e</CODE> - HTML element to set outerHTML on.
+ </UL>
+
+ <UL><CODE>h</CODE> - HTML string to set in property.
+ </UL>
+
+ </UL>
+
+ <!-- METHOD PARAMETERS END -->
+
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="setPluginBaseURL"><!-- --></A>
+ <H3>setPluginBaseURL</H3>
+ <PRE>void <B>setPluginBaseURL</B>(<string> n, <string> u)</PRE>
+
+ <UL>Sets the baseURL of the specified plugin, this is useful if the plugin is loaded from
+ a external location.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <UL>
+ <B>Parameters:</B>
+
+ <UL><CODE>n</CODE> - Plugin name/id to set base URL on. This have to be added before.
+ </UL>
+
+ <UL><CODE>u</CODE> - Base URL of plugin, this string should be the URL prefix for the plugin without a trailing slash.
+ </UL>
+
+ </UL>
+
+ <!-- METHOD PARAMETERS END -->
+
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="setStyleAttrib"><!-- --></A>
+ <H3>setStyleAttrib</H3>
+ <PRE>void <B>setStyleAttrib</B>(<HTMLElement> elm, <string> name, <string> value)</PRE>
+
+ <UL>Sets a style attribute item value.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <UL>
+ <B>Parameters:</B>
+
+ <UL><CODE>elm</CODE> - HTML element to set style attribute item on.
+ </UL>
+
+ <UL><CODE>name</CODE> - Style item name to set.
+ </UL>
+
+ <UL><CODE>value</CODE> - Style item value to set.
+ </UL>
+
+ </UL>
+
+ <!-- METHOD PARAMETERS END -->
+
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="setupContent"><!-- --></A>
+ <H3>setupContent</H3>
+ <PRE>void <B>setupContent</B>(<string> editor_id)</PRE>
+
+ <UL>Setups the contents of TinyMCE editor instance and fills it with contents.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <UL>
+ <B>Parameters:</B>
+
+ <UL><CODE>editor_id</CODE> - TinyMCE editor instance control id to fill.
+ </UL>
+
+ </UL>
+
+ <!-- METHOD PARAMETERS END -->
+
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="setWindowArg"><!-- --></A>
+ <H3>setWindowArg</H3>
+ <PRE>void <B>setWindowArg</B>(<string> n, <string> v)</PRE>
+
+ <UL>Sets the window argument to be passed to TinyMCE popup.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <UL>
+ <B>Parameters:</B>
+
+ <UL><CODE>n</CODE> - Window argument name.
+ </UL>
+
+ <UL><CODE>v</CODE> - Window argument value.
+ </UL>
+
+ </UL>
+
+ <!-- METHOD PARAMETERS END -->
+
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="storeAwayURLs"><!-- --></A>
+ <H3>storeAwayURLs</H3>
+ <PRE>string <B>storeAwayURLs</B>(<string> s)</PRE>
+
+ <UL>Stores away the src and href attribute values in separate mce_src and mce_href attributes.
+ This is needed since both MSIE and Gecko messes with these attributes. The old
+ src and href will be intact, this simply adds them to a separate attribute.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <UL>
+ <B>Parameters:</B>
+
+ <UL><CODE>s</CODE> - HTML string to replace src and href attributes in.
+ </UL>
+
+ </UL>
+
+ <!-- METHOD PARAMETERS END -->
+
+
+ <UL>
+ <B>Returns:</B>
+ <UL>
+ HTML string with replaced src and href attributes.
+ </UL>
+ </UL>
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="submitPatch"><!-- --></A>
+ <H3>submitPatch</H3>
+ <PRE>void <B>submitPatch</B>()</PRE>
+
+ <UL>Piggyback onsubmit event handler function, this will remove/hide the TinyMCE specific form elements
+ call triggerSave to fill the textarea with the correct contents then call the old piggy backed event handler.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <!-- METHOD PARAMETERS END -->
+
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="switchClass"><!-- --></A>
+ <H3>switchClass</H3>
+ <PRE>void <B>switchClass</B>(<HTMLElement> ei, <string> c)</PRE>
+
+ <UL>Switches the CSS class of the specified element. This method also caches the
+ elements in a lookup table for performance. This should only be used for TinyMCE main UI controls
+ like buttons or select elements.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <UL>
+ <B>Parameters:</B>
+
+ <UL><CODE>ei</CODE> - Element to set CSS class on.
+ </UL>
+
+ <UL><CODE>c</CODE> - CSS class to set.
+ </UL>
+
+ </UL>
+
+ <!-- METHOD PARAMETERS END -->
+
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="triggerNodeChange"><!-- --></A>
+ <H3>triggerNodeChange</H3>
+ <PRE>void <B>triggerNodeChange</B>(<boolean> focus, <boolean> setup_content)</PRE>
+
+ <UL>Triggers a nodeChange event to every theme and plugin. This will be executed when the cursor moves or
+ when a command that modifies the editor contents is executed.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <UL>
+ <B>Parameters:</B>
+
+ <UL><CODE>focus</CODE> - Optional state if the last selected editor instance is to be focused or not.
+ </UL>
+
+ <UL><CODE>setup_content</CODE> - Optional state if it's called from setup content function or not.
+ </UL>
+
+ </UL>
+
+ <!-- METHOD PARAMETERS END -->
+
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="triggerSave"><!-- --></A>
+ <H3>triggerSave</H3>
+ <PRE>void <B>triggerSave</B>(<boolean> skip_cleanup, <boolean> skip_callback)</PRE>
+
+ <UL>Moves the contents from a TinyMCE editor control instance to the hidden textarea
+ that got replaced with TinyMCE. This is executed automaticly on for example form submit.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <UL>
+ <B>Parameters:</B>
+
+ <UL><CODE>skip_cleanup</CODE> - Optional Skip cleanup, simply move the contents as fast as possible.
+ </UL>
+
+ <UL><CODE>skip_callback</CODE> - Optional Skip callback, don't call the save_callback function.
+ </UL>
+
+ </UL>
+
+ <!-- METHOD PARAMETERS END -->
+
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="trim"><!-- --></A>
+ <H3>trim</H3>
+ <PRE>string <B>trim</B>(<string> s)</PRE>
+
+ <UL>Removes all prefix, suffix whitespace of a string.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <UL>
+ <B>Parameters:</B>
+
+ <UL><CODE>s</CODE> - String to replace whitespace in.
+ </UL>
+
+ </UL>
+
+ <!-- METHOD PARAMETERS END -->
+
+
+ <UL>
+ <B>Returns:</B>
+ <UL>
+ Replaced string value.
+ </UL>
+ </UL>
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="unloadHandler"><!-- --></A>
+ <H3>unloadHandler</H3>
+ <PRE>void <B>unloadHandler</B>()</PRE>
+
+ <UL>Unload document event handler function. This function will be executed when the
+ page is unloaded, this will automaticly move the current editor contents to the textarea element this enables
+ the editor to restore it's state when the user presses the back button in the browser.
+ This will execute the triggerSave function.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <!-- METHOD PARAMETERS END -->
+
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="updateContent"><!-- --></A>
+ <H3>updateContent</H3>
+ <PRE>void <B>updateContent</B>(<string> form_element_name)</PRE>
+
+ <UL>Moves the contents from the hidden textarea to the editor that gets inserted.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <UL>
+ <B>Parameters:</B>
+
+ <UL><CODE>form_element_name</CODE> - Form element name to move contents from.
+ </UL>
+
+ </UL>
+
+ <!-- METHOD PARAMETERS END -->
+
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <UL>
+ <B>Deprecated</B> <I></I><BR/><BR/>
+ </UL>
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="xmlEncode"><!-- --></A>
+ <H3>xmlEncode</H3>
+ <PRE>string <B>xmlEncode</B>(<string> s)</PRE>
+
+ <UL>Encodes the string to raw XML entities. This will only convert the most common ones.
+ For real entity encoding use the xmlEncode method of the Cleanup class.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <UL>
+ <B>Parameters:</B>
+
+ <UL><CODE>s</CODE> - String to encode.
+ </UL>
+
+ </UL>
+
+ <!-- METHOD PARAMETERS END -->
+
+
+ <UL>
+ <B>Returns:</B>
+ <UL>
+ XML Encoded string.
+ </UL>
+ </UL>
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+
+
+<!-- ============ METHOD DETAIL END ========== -->
+
+<!-- ========= END OF CLASS DATA ========= -->
+
+<!-- ========== START OF NAVBAR ========== -->
+<A NAME="navbar_bottom"><!-- --></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0">
+<TR>
+<TD COLSPAN=3 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_bottom_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3">
+ <TR ALIGN="center" VALIGN="top">
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="overview-summary.html"><FONT CLASS="NavBarFont1"><B>Overview</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="overview-summary-TinyMCE_Engine.class.js.html"><FONT CLASS="NavBarFont1"><B>File</B></FONT></A> </TD>
+ <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> <FONT CLASS="NavBarFont1Rev"><B>Class</B></FONT> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="overview-tree.html"><FONT CLASS="NavBarFont1"><b>Tree</b></FONT></A> </TD>
+ <!--TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"--> <!--A HREF="deprecated-list.html"--><!--FONT CLASS="NavBarFont1">Deprecated</FONT--><!--/A--><!-- </TD-->
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
+ </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+<B></B>
+</EM>
+</TD
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="TinyMCE_Control.html"><B>PREV CLASS</B></A><!--
+ NEXT CLASS
+-->
+ <A HREF="TinyMCE_Layer.html"><B>NEXT CLASS</B></A></FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="index.html" TARGET="_top"><B>FRAMES</B></A>
+ <A HREF="TinyMCE_Engine.html" TARGET="_top"><B>NO FRAMES</B></A>
+
+<SCRIPT>
+ <!--
+ if(window==top) {
+ document.writeln('<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>');
+ }
+ //-->
+</SCRIPT>
+<NOSCRIPT>
+<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>
+</NOSCRIPT>
+</FONT></TD>
+</TR>
+<TR>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+ SUMMARY: <A HREF="#field_summary">FIELD</A> | <A HREF="#constructor_summary">CONSTR</A> | <A HREF="#method_summary">METHOD</A></FONT></TD>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+DETAIL: <A HREF="#field_detail">FIELD</A> | <A HREF="#constructor_detail">CONSTR</A> | <A HREF="#method_detail">METHOD</A></FONT></TD>
+</TR>
+</TABLE>
+
+<!-- =========== END OF NAVBAR =========== -->
+
+<HR>
+<FONT SIZE="-1">
+
+</FONT>
+<div class="jsdoc_ctime">Documentation generated by <a href="http://jsdoc.sourceforge.net/" target="_parent">JSDoc</a> on Fri Apr 14 21:59:23 2006</div>
+</BODY>
+</HTML>
Deleted: trunk/htdocs/js/tinymce/docs/tinymce_api/TinyMCE_Layer.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/tinymce_api/TinyMCE_Layer.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/tinymce_api/TinyMCE_Layer.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,952 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN""http://www.w3.org/TR/REC-html40/loose.dtd">
-<!--NewPage-->
-<HTML>
-<HEAD>
-<TITLE>
-TinyMCE_Layer
-</TITLE>
-<LINK REL ="stylesheet" TYPE="text/css" HREF="stylesheet.css" TITLE="Style">
-</HEAD>
-<SCRIPT>
-function asd()
-{
-parent.document.title="TinyMCE_Layer";
-}
-</SCRIPT>
-<BODY BGCOLOR="white" onload="asd();">
-
-<!-- ========== START OF NAVBAR ========== -->
-<A NAME="navbar_bottom"><!-- --></A>
-<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0">
-<TR>
-<TD COLSPAN=3 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
-<A NAME="navbar_bottom_firstrow"><!-- --></A>
-<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3">
- <TR ALIGN="center" VALIGN="top">
- <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="overview-summary.html"><FONT CLASS="NavBarFont1"><B>Overview</B></FONT></A> </TD>
- <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="overview-summary-TinyMCE_Layer.class.js.html"><FONT CLASS="NavBarFont1"><B>File</B></FONT></A> </TD>
- <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> <FONT CLASS="NavBarFont1Rev"><B>Class</B></FONT> </TD>
- <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="overview-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A> </TD>
- <!--TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"--> <!--A HREF="deprecated-list.html"--><!--FONT CLASS="NavBarFont1">Deprecated</FONT--><!--/A--><!-- </TD-->
- <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="index-all.html"--><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
- <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
- </TR>
-</TABLE>
-</TD>
-<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
-<B></B>
-</EM>
-</TD
-</TR>
-
-<TR>
-<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
- <A HREF="TinyMCE_Engine.html"><B>PREV CLASS</B></A><!--
- NEXT CLASS
--->
- <A HREF="TinyMCE_Popup.html"><B>NEXT CLASS</B></A></FONT></TD>
-<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
- <A HREF="index.html" TARGET="_top"><B>FRAMES</B></A>
- <A HREF="TinyMCE_Layer.html" TARGET="_top"><B>NO FRAMES</B></A>
-
-<SCRIPT>
- <!--
- if(window==top) {
- document.writeln('<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>');
- }
- //-->
-</SCRIPT>
-<NOSCRIPT>
-<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>
-</NOSCRIPT>
-</FONT></TD>
-</TR>
-<TR>
-<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
- SUMMARY: <A HREF="#field_summary">FIELD</A> | <A HREF="#constructor_summary">CONSTR</A> | <A HREF="#method_summary">METHOD</A></FONT></TD>
-<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
-DETAIL: <A HREF="#field_detail">FIELD</A> | <A HREF="#constructor_detail">CONSTR</A> | <A HREF="#method_detail">METHOD</A></FONT></TD>
-</TR>
-</TABLE>
-<!-- =========== END OF NAVBAR =========== -->
-<HR>
-
-<!-- ======== START OF CLASS DATA ======== -->
-<H2>Class TinyMCE_Layer</H2>
-<PRE>Object
- |
- +--<b>TinyMCE_Layer</b>
-</PRE>
-
-
-<HR>
-<DL>
- <!-- Class definition -->
- <DT>class
- <B>TinyMCE_Layer</B>
-
-
-</DL>
-
- <P>
- <I>Defined in <a href='overview-summary-TinyMCE_Layer.class.js.html'>TinyMCE_Layer.class.js</a></I><BR/><BR/>
- </P>
-
- <HR>
-
-<!-- ======== NESTED CLASS SUMMARY ======== -->
-
-<!-- ======== END NESTED CLASS SUMMARY ======== -->
-
-
-<!-- =========== FIELD SUMMARY =========== -->
-
-
-
-
-<!-- =========== END FIELD SUMMARY =========== -->
-
-
-<!-- ======== CONSTRUCTOR SUMMARY ======== -->
-
-<A NAME="constructor_summary"><!-- --></A>
-<TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" WIDTH="100%">
-<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
-<TD COLSPAN=2><FONT SIZE="+2">
-<B>Constructor Summary</B></FONT></TD>
-</TR>
-<TR BGCOLOR="white" CLASS="TableRowColor">
- <TD>
- <CODE>
- <B>
- <A HREF="TinyMCE_Layer.html#TinyMCE_Layer()">TinyMCE_Layer</A>
- </B>
- (<string> id, <boolean> bm)
- </CODE>
- <BR>
-
- Constructor for the TinyMCE Layer.
- </TD>
-</TR>
-</TABLE>
-
-<!-- ======== END CONSTRUCTOR SUMMARY ======== -->
-
-
-
-<!-- ========== METHOD SUMMARY =========== -->
-
-<A NAME="method_summary"><!-- --></A>
-<TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" WIDTH="100%">
-<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
-<TD COLSPAN=2><FONT SIZE="+2">
-<B>Method Summary</B></FONT></TD>
-</TR>
-
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> HTMLElement</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#create">create</A></B>(<string> n, <string> c, <HTMLElement> p)
- </CODE>
- <BR>
-
- Creates a element for the layer based on the id and specified name.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> Object</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#getAbsPosition">getAbsPosition</A></B>(<DOMElement> n)
- </CODE>
- <BR>
-
- Returns the absolute x, y cordinate of the specified node.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> HTMLElement</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#getBlocker">getBlocker</A></B>()
- </CODE>
- <BR>
-
- Returns the blocker DOM element, this is a invisible iframe.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> HTMLElement</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#getElement">getElement</A></B>()
- </CODE>
- <BR>
-
- Returns the DOM element that the layer is binded to.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> void</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#hide">hide</A></B>()
- </CODE>
- <BR>
-
- Hides the layer.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> boolean</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#isVisible">isVisible</A></B>()
- </CODE>
- <BR>
-
- Returns true/false if the layer is visible or not.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> void</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#moveBy">moveBy</A></B>(<int> x, <int> y)
- </CODE>
- <BR>
-
- Moves the layer relative in pixels.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> void</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#moveRelativeTo">moveRelativeTo</A></B>(<HTMLElement> re, <string> p)
- </CODE>
- <BR>
-
- Moves the layer relative to the specified HTML element.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> void</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#moveTo">moveTo</A></B>(<int> x, <int> y)
- </CODE>
- <BR>
-
- Moves the layer absolute in pixels.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> int</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#parseInt">parseInt</A></B>(<string> s)
- </CODE>
- <BR>
-
- Parses a int value this method will return 0 if the string is empty.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> void</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#resizeBy">resizeBy</A></B>(<int> w, <int> h)
- </CODE>
- <BR>
-
- Resizes the layer by the specified relative width and height.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> void</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#resizeTo">resizeTo</A></B>(<int> w, <int> h)
- </CODE>
- <BR>
-
- Resizes the layer to the specified width and height.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> void</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#setBlockMode">setBlockMode</A></B>(<boolean> s)
- </CODE>
- <BR>
-
- Sets the block mode.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> void</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#show">show</A></B>()
- </CODE>
- <BR>
-
- Shows the layer.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> void</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#updateBlocker">updateBlocker</A></B>()
- </CODE>
- <BR>
-
- Updates the select/iframe/flash blocker this will also block the caret in Firefox.
- </TD>
- </TR>
-
-
-</TABLE>
-
-
-
-<P>
-<!-- ========== END METHOD SUMMARY =========== -->
-
-
-<!-- ============ FIELD DETAIL START =========== -->
-
-
-<!-- ============ FIELD DETAIL END =========== -->
-
- <!-- ========= CONSTRUCTOR DETAIL START ======== -->
-
-<A NAME="constructor_detail"><!-- --></A>
-<TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" WIDTH="100%">
- <TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
- <TD COLSPAN=1>
- <FONT SIZE="+2"><B>Constructor Detail</B></FONT>
- </TD>
- </TR>
-</TABLE>
-
-<A NAME="TinyMCE_Layer()"><!-- --></A><H3>
-TinyMCE_Layer</H3>
-<PRE><B>TinyMCE_Layer</B>(<string> id, <boolean> bm)</PRE>
-
-
-<UL>
- Constructor for the TinyMCE Layer. This class enables you to construct
- floating layers that is visible on top of select input fields, flashes and iframes.
-</UL>
-
-
-
- <UL>
- <B>Parameters:</B>
-
- <UL><CODE>id</CODE> - Unique ID name for the layer.
- </UL>
-
- <UL><CODE>bm</CODE> - Block mode, defaults to true.
- </UL>
-
-
- </UL>
-
-
-<!-- Constructor return value(s) -->
-
-<!-- End constructor return value(s) -->
-
-<!-- ADDITIONAL ATTRIBUTES -->
-
-<HR/>
-<!-- END ADDITIONAL ATTRIBUTES -->
-
-<!-- ========= CONSTRUCTOR DETAIL END ======== -->
-
-
-<!-- ============ METHOD DETAIL START ========== -->
-
-<A NAME="method_detail"><!-- --></A>
-<TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" WIDTH="100%">
- <TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
- <TD COLSPAN=1><FONT SIZE="+2">
- <B>Method Detail</B></FONT>
- </TD>
- </TR>
-</TABLE>
-
-<!-- One single method detail entry -->
-
- <A NAME="create"><!-- --></A>
- <H3>create</H3>
- <PRE>HTMLElement <B>create</B>(<string> n, <string> c, <HTMLElement> p)</PRE>
-
- <UL>Creates a element for the layer based on the id and specified name.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <UL>
- <B>Parameters:</B>
-
- <UL><CODE>n</CODE> - Element tag name, like div.
- </UL>
-
- <UL><CODE>c</CODE> - Optional class name to set as class attribute value.
- </UL>
-
- <UL><CODE>p</CODE> - Optional parent element reference, defaults to body.
- </UL>
-
- </UL>
-
- <!-- METHOD PARAMETERS END -->
-
-
- <UL>
- <B>Returns:</B>
- <UL>
- HTML DOM element that got created.
- </UL>
- </UL>
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="getAbsPosition"><!-- --></A>
- <H3>getAbsPosition</H3>
- <PRE>Object <B>getAbsPosition</B>(<DOMElement> n)</PRE>
-
- <UL>Returns the absolute x, y cordinate of the specified node.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <UL>
- <B>Parameters:</B>
-
- <UL><CODE>n</CODE> - DOM node to retrive x, y of.
- </UL>
-
- </UL>
-
- <!-- METHOD PARAMETERS END -->
-
-
- <UL>
- <B>Returns:</B>
- <UL>
- Object containing absLeft and absTop properties.
- </UL>
- </UL>
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="getBlocker"><!-- --></A>
- <H3>getBlocker</H3>
- <PRE>HTMLElement <B>getBlocker</B>()</PRE>
-
- <UL>Returns the blocker DOM element, this is a invisible iframe.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <!-- METHOD PARAMETERS END -->
-
-
- <UL>
- <B>Returns:</B>
- <UL>
- DOM HTML element.
- </UL>
- </UL>
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="getElement"><!-- --></A>
- <H3>getElement</H3>
- <PRE>HTMLElement <B>getElement</B>()</PRE>
-
- <UL>Returns the DOM element that the layer is binded to.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <!-- METHOD PARAMETERS END -->
-
-
- <UL>
- <B>Returns:</B>
- <UL>
- DOM HTML element.
- </UL>
- </UL>
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="hide"><!-- --></A>
- <H3>hide</H3>
- <PRE>void <B>hide</B>()</PRE>
-
- <UL>Hides the layer.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <!-- METHOD PARAMETERS END -->
-
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="isVisible"><!-- --></A>
- <H3>isVisible</H3>
- <PRE>boolean <B>isVisible</B>()</PRE>
-
- <UL>Returns true/false if the layer is visible or not.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <!-- METHOD PARAMETERS END -->
-
-
- <UL>
- <B>Returns:</B>
- <UL>
- true/false if it's visible or not.
- </UL>
- </UL>
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="moveBy"><!-- --></A>
- <H3>moveBy</H3>
- <PRE>void <B>moveBy</B>(<int> x, <int> y)</PRE>
-
- <UL>Moves the layer relative in pixels.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <UL>
- <B>Parameters:</B>
-
- <UL><CODE>x</CODE> - Horizontal relative position in pixels.
- </UL>
-
- <UL><CODE>y</CODE> - Vertical relative position in pixels.
- </UL>
-
- </UL>
-
- <!-- METHOD PARAMETERS END -->
-
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="moveRelativeTo"><!-- --></A>
- <H3>moveRelativeTo</H3>
- <PRE>void <B>moveRelativeTo</B>(<HTMLElement> re, <string> p)</PRE>
-
- <UL>Moves the layer relative to the specified HTML element.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <UL>
- <B>Parameters:</B>
-
- <UL><CODE>re</CODE> - Element to move the layer relative to.
- </UL>
-
- <UL><CODE>p</CODE> - Position of the layer tl = top left, tr = top right, bl = bottom left, br = bottom right.
- </UL>
-
- </UL>
-
- <!-- METHOD PARAMETERS END -->
-
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="moveTo"><!-- --></A>
- <H3>moveTo</H3>
- <PRE>void <B>moveTo</B>(<int> x, <int> y)</PRE>
-
- <UL>Moves the layer absolute in pixels.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <UL>
- <B>Parameters:</B>
-
- <UL><CODE>x</CODE> - Horizontal absolute position in pixels.
- </UL>
-
- <UL><CODE>y</CODE> - Vertical absolute position in pixels.
- </UL>
-
- </UL>
-
- <!-- METHOD PARAMETERS END -->
-
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="parseInt"><!-- --></A>
- <H3>parseInt</H3>
- <PRE>int <B>parseInt</B>(<string> s)</PRE>
-
- <UL>Parses a int value this method will return 0 if the string is empty.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <UL>
- <B>Parameters:</B>
-
- <UL><CODE>s</CODE> - String to parse value of.
- </UL>
-
- </UL>
-
- <!-- METHOD PARAMETERS END -->
-
-
- <UL>
- <B>Returns:</B>
- <UL>
- Parsed number.
- </UL>
- </UL>
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="resizeBy"><!-- --></A>
- <H3>resizeBy</H3>
- <PRE>void <B>resizeBy</B>(<int> w, <int> h)</PRE>
-
- <UL>Resizes the layer by the specified relative width and height.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <UL>
- <B>Parameters:</B>
-
- <UL><CODE>w</CODE> - Relative width value.
- </UL>
-
- <UL><CODE>h</CODE> - Relative height value.
- </UL>
-
- </UL>
-
- <!-- METHOD PARAMETERS END -->
-
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="resizeTo"><!-- --></A>
- <H3>resizeTo</H3>
- <PRE>void <B>resizeTo</B>(<int> w, <int> h)</PRE>
-
- <UL>Resizes the layer to the specified width and height.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <UL>
- <B>Parameters:</B>
-
- <UL><CODE>w</CODE> - Width value.
- </UL>
-
- <UL><CODE>h</CODE> - Height value.
- </UL>
-
- </UL>
-
- <!-- METHOD PARAMETERS END -->
-
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="setBlockMode"><!-- --></A>
- <H3>setBlockMode</H3>
- <PRE>void <B>setBlockMode</B>(<boolean> s)</PRE>
-
- <UL>Sets the block mode. If you set this property to true a control box blocker iframe
- will be added to the document since MSIE has a issue where select boxes are visible
- through layers.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <UL>
- <B>Parameters:</B>
-
- <UL><CODE>s</CODE> - Block mode state, true is the default value.
- </UL>
-
- </UL>
-
- <!-- METHOD PARAMETERS END -->
-
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="show"><!-- --></A>
- <H3>show</H3>
- <PRE>void <B>show</B>()</PRE>
-
- <UL>Shows the layer.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <!-- METHOD PARAMETERS END -->
-
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="updateBlocker"><!-- --></A>
- <H3>updateBlocker</H3>
- <PRE>void <B>updateBlocker</B>()</PRE>
-
- <UL>Updates the select/iframe/flash blocker this will also block the caret in Firefox.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <!-- METHOD PARAMETERS END -->
-
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
-
-
-<!-- ============ METHOD DETAIL END ========== -->
-
-<!-- ========= END OF CLASS DATA ========= -->
-
-<!-- ========== START OF NAVBAR ========== -->
-<A NAME="navbar_bottom"><!-- --></A>
-<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0">
-<TR>
-<TD COLSPAN=3 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
-<A NAME="navbar_bottom_firstrow"><!-- --></A>
-<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3">
- <TR ALIGN="center" VALIGN="top">
- <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="overview-summary.html"><FONT CLASS="NavBarFont1"><B>Overview</B></FONT></A> </TD>
- <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="overview-summary-TinyMCE_Layer.class.js.html"><FONT CLASS="NavBarFont1"><B>File</B></FONT></A> </TD>
- <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> <FONT CLASS="NavBarFont1Rev"><B>Class</B></FONT> </TD>
- <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="overview-tree.html"><FONT CLASS="NavBarFont1"><b>Tree</b></FONT></A> </TD>
- <!--TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"--> <!--A HREF="deprecated-list.html"--><!--FONT CLASS="NavBarFont1">Deprecated</FONT--><!--/A--><!-- </TD-->
- <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
- <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
- </TR>
-</TABLE>
-</TD>
-<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
-<B></B>
-</EM>
-</TD
-</TR>
-
-<TR>
-<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
- <A HREF="TinyMCE_Engine.html"><B>PREV CLASS</B></A><!--
- NEXT CLASS
--->
- <A HREF="TinyMCE_Popup.html"><B>NEXT CLASS</B></A></FONT></TD>
-<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
- <A HREF="index.html" TARGET="_top"><B>FRAMES</B></A>
- <A HREF="TinyMCE_Layer.html" TARGET="_top"><B>NO FRAMES</B></A>
-
-<SCRIPT>
- <!--
- if(window==top) {
- document.writeln('<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>');
- }
- //-->
-</SCRIPT>
-<NOSCRIPT>
-<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>
-</NOSCRIPT>
-</FONT></TD>
-</TR>
-<TR>
-<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
- SUMMARY: <A HREF="#field_summary">FIELD</A> | <A HREF="#constructor_summary">CONSTR</A> | <A HREF="#method_summary">METHOD</A></FONT></TD>
-<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
-DETAIL: <A HREF="#field_detail">FIELD</A> | <A HREF="#constructor_detail">CONSTR</A> | <A HREF="#method_detail">METHOD</A></FONT></TD>
-</TR>
-</TABLE>
-
-<!-- =========== END OF NAVBAR =========== -->
-
-<HR>
-<FONT SIZE="-1">
-
-</FONT>
-<div class="jsdoc_ctime">Documentation generated by <a href="http://jsdoc.sourceforge.net/" target="_parent">JSDoc</a> on Fri Apr 14 21:59:23 2006</div>
-</BODY>
-</HTML>
Copied: trunk/htdocs/js/tinymce/docs/tinymce_api/TinyMCE_Layer.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/tinymce_api/TinyMCE_Layer.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/tinymce_api/TinyMCE_Layer.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/tinymce_api/TinyMCE_Layer.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,952 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN""http://www.w3.org/TR/REC-html40/loose.dtd">
+<!--NewPage-->
+<HTML>
+<HEAD>
+<TITLE>
+TinyMCE_Layer
+</TITLE>
+<LINK REL ="stylesheet" TYPE="text/css" HREF="stylesheet.css" TITLE="Style">
+</HEAD>
+<SCRIPT>
+function asd()
+{
+parent.document.title="TinyMCE_Layer";
+}
+</SCRIPT>
+<BODY BGCOLOR="white" onload="asd();">
+
+<!-- ========== START OF NAVBAR ========== -->
+<A NAME="navbar_bottom"><!-- --></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0">
+<TR>
+<TD COLSPAN=3 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_bottom_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3">
+ <TR ALIGN="center" VALIGN="top">
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="overview-summary.html"><FONT CLASS="NavBarFont1"><B>Overview</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="overview-summary-TinyMCE_Layer.class.js.html"><FONT CLASS="NavBarFont1"><B>File</B></FONT></A> </TD>
+ <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> <FONT CLASS="NavBarFont1Rev"><B>Class</B></FONT> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="overview-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A> </TD>
+ <!--TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"--> <!--A HREF="deprecated-list.html"--><!--FONT CLASS="NavBarFont1">Deprecated</FONT--><!--/A--><!-- </TD-->
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="index-all.html"--><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
+ </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+<B></B>
+</EM>
+</TD
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="TinyMCE_Engine.html"><B>PREV CLASS</B></A><!--
+ NEXT CLASS
+-->
+ <A HREF="TinyMCE_Popup.html"><B>NEXT CLASS</B></A></FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="index.html" TARGET="_top"><B>FRAMES</B></A>
+ <A HREF="TinyMCE_Layer.html" TARGET="_top"><B>NO FRAMES</B></A>
+
+<SCRIPT>
+ <!--
+ if(window==top) {
+ document.writeln('<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>');
+ }
+ //-->
+</SCRIPT>
+<NOSCRIPT>
+<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>
+</NOSCRIPT>
+</FONT></TD>
+</TR>
+<TR>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+ SUMMARY: <A HREF="#field_summary">FIELD</A> | <A HREF="#constructor_summary">CONSTR</A> | <A HREF="#method_summary">METHOD</A></FONT></TD>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+DETAIL: <A HREF="#field_detail">FIELD</A> | <A HREF="#constructor_detail">CONSTR</A> | <A HREF="#method_detail">METHOD</A></FONT></TD>
+</TR>
+</TABLE>
+<!-- =========== END OF NAVBAR =========== -->
+<HR>
+
+<!-- ======== START OF CLASS DATA ======== -->
+<H2>Class TinyMCE_Layer</H2>
+<PRE>Object
+ |
+ +--<b>TinyMCE_Layer</b>
+</PRE>
+
+
+<HR>
+<DL>
+ <!-- Class definition -->
+ <DT>class
+ <B>TinyMCE_Layer</B>
+
+
+</DL>
+
+ <P>
+ <I>Defined in <a href='overview-summary-TinyMCE_Layer.class.js.html'>TinyMCE_Layer.class.js</a></I><BR/><BR/>
+ </P>
+
+ <HR>
+
+<!-- ======== NESTED CLASS SUMMARY ======== -->
+
+<!-- ======== END NESTED CLASS SUMMARY ======== -->
+
+
+<!-- =========== FIELD SUMMARY =========== -->
+
+
+
+
+<!-- =========== END FIELD SUMMARY =========== -->
+
+
+<!-- ======== CONSTRUCTOR SUMMARY ======== -->
+
+<A NAME="constructor_summary"><!-- --></A>
+<TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" WIDTH="100%">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TD COLSPAN=2><FONT SIZE="+2">
+<B>Constructor Summary</B></FONT></TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="TinyMCE_Layer.html#TinyMCE_Layer()">TinyMCE_Layer</A>
+ </B>
+ (<string> id, <boolean> bm)
+ </CODE>
+ <BR>
+
+ Constructor for the TinyMCE Layer.
+ </TD>
+</TR>
+</TABLE>
+
+<!-- ======== END CONSTRUCTOR SUMMARY ======== -->
+
+
+
+<!-- ========== METHOD SUMMARY =========== -->
+
+<A NAME="method_summary"><!-- --></A>
+<TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" WIDTH="100%">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TD COLSPAN=2><FONT SIZE="+2">
+<B>Method Summary</B></FONT></TD>
+</TR>
+
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> HTMLElement</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#create">create</A></B>(<string> n, <string> c, <HTMLElement> p)
+ </CODE>
+ <BR>
+
+ Creates a element for the layer based on the id and specified name.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> Object</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#getAbsPosition">getAbsPosition</A></B>(<DOMElement> n)
+ </CODE>
+ <BR>
+
+ Returns the absolute x, y cordinate of the specified node.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> HTMLElement</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#getBlocker">getBlocker</A></B>()
+ </CODE>
+ <BR>
+
+ Returns the blocker DOM element, this is a invisible iframe.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> HTMLElement</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#getElement">getElement</A></B>()
+ </CODE>
+ <BR>
+
+ Returns the DOM element that the layer is binded to.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> void</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#hide">hide</A></B>()
+ </CODE>
+ <BR>
+
+ Hides the layer.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> boolean</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#isVisible">isVisible</A></B>()
+ </CODE>
+ <BR>
+
+ Returns true/false if the layer is visible or not.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> void</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#moveBy">moveBy</A></B>(<int> x, <int> y)
+ </CODE>
+ <BR>
+
+ Moves the layer relative in pixels.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> void</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#moveRelativeTo">moveRelativeTo</A></B>(<HTMLElement> re, <string> p)
+ </CODE>
+ <BR>
+
+ Moves the layer relative to the specified HTML element.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> void</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#moveTo">moveTo</A></B>(<int> x, <int> y)
+ </CODE>
+ <BR>
+
+ Moves the layer absolute in pixels.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> int</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#parseInt">parseInt</A></B>(<string> s)
+ </CODE>
+ <BR>
+
+ Parses a int value this method will return 0 if the string is empty.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> void</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#resizeBy">resizeBy</A></B>(<int> w, <int> h)
+ </CODE>
+ <BR>
+
+ Resizes the layer by the specified relative width and height.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> void</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#resizeTo">resizeTo</A></B>(<int> w, <int> h)
+ </CODE>
+ <BR>
+
+ Resizes the layer to the specified width and height.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> void</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#setBlockMode">setBlockMode</A></B>(<boolean> s)
+ </CODE>
+ <BR>
+
+ Sets the block mode.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> void</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#show">show</A></B>()
+ </CODE>
+ <BR>
+
+ Shows the layer.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> void</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#updateBlocker">updateBlocker</A></B>()
+ </CODE>
+ <BR>
+
+ Updates the select/iframe/flash blocker this will also block the caret in Firefox.
+ </TD>
+ </TR>
+
+
+</TABLE>
+
+
+
+<P>
+<!-- ========== END METHOD SUMMARY =========== -->
+
+
+<!-- ============ FIELD DETAIL START =========== -->
+
+
+<!-- ============ FIELD DETAIL END =========== -->
+
+ <!-- ========= CONSTRUCTOR DETAIL START ======== -->
+
+<A NAME="constructor_detail"><!-- --></A>
+<TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" WIDTH="100%">
+ <TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+ <TD COLSPAN=1>
+ <FONT SIZE="+2"><B>Constructor Detail</B></FONT>
+ </TD>
+ </TR>
+</TABLE>
+
+<A NAME="TinyMCE_Layer()"><!-- --></A><H3>
+TinyMCE_Layer</H3>
+<PRE><B>TinyMCE_Layer</B>(<string> id, <boolean> bm)</PRE>
+
+
+<UL>
+ Constructor for the TinyMCE Layer. This class enables you to construct
+ floating layers that is visible on top of select input fields, flashes and iframes.
+</UL>
+
+
+
+ <UL>
+ <B>Parameters:</B>
+
+ <UL><CODE>id</CODE> - Unique ID name for the layer.
+ </UL>
+
+ <UL><CODE>bm</CODE> - Block mode, defaults to true.
+ </UL>
+
+
+ </UL>
+
+
+<!-- Constructor return value(s) -->
+
+<!-- End constructor return value(s) -->
+
+<!-- ADDITIONAL ATTRIBUTES -->
+
+<HR/>
+<!-- END ADDITIONAL ATTRIBUTES -->
+
+<!-- ========= CONSTRUCTOR DETAIL END ======== -->
+
+
+<!-- ============ METHOD DETAIL START ========== -->
+
+<A NAME="method_detail"><!-- --></A>
+<TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" WIDTH="100%">
+ <TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+ <TD COLSPAN=1><FONT SIZE="+2">
+ <B>Method Detail</B></FONT>
+ </TD>
+ </TR>
+</TABLE>
+
+<!-- One single method detail entry -->
+
+ <A NAME="create"><!-- --></A>
+ <H3>create</H3>
+ <PRE>HTMLElement <B>create</B>(<string> n, <string> c, <HTMLElement> p)</PRE>
+
+ <UL>Creates a element for the layer based on the id and specified name.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <UL>
+ <B>Parameters:</B>
+
+ <UL><CODE>n</CODE> - Element tag name, like div.
+ </UL>
+
+ <UL><CODE>c</CODE> - Optional class name to set as class attribute value.
+ </UL>
+
+ <UL><CODE>p</CODE> - Optional parent element reference, defaults to body.
+ </UL>
+
+ </UL>
+
+ <!-- METHOD PARAMETERS END -->
+
+
+ <UL>
+ <B>Returns:</B>
+ <UL>
+ HTML DOM element that got created.
+ </UL>
+ </UL>
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="getAbsPosition"><!-- --></A>
+ <H3>getAbsPosition</H3>
+ <PRE>Object <B>getAbsPosition</B>(<DOMElement> n)</PRE>
+
+ <UL>Returns the absolute x, y cordinate of the specified node.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <UL>
+ <B>Parameters:</B>
+
+ <UL><CODE>n</CODE> - DOM node to retrive x, y of.
+ </UL>
+
+ </UL>
+
+ <!-- METHOD PARAMETERS END -->
+
+
+ <UL>
+ <B>Returns:</B>
+ <UL>
+ Object containing absLeft and absTop properties.
+ </UL>
+ </UL>
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="getBlocker"><!-- --></A>
+ <H3>getBlocker</H3>
+ <PRE>HTMLElement <B>getBlocker</B>()</PRE>
+
+ <UL>Returns the blocker DOM element, this is a invisible iframe.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <!-- METHOD PARAMETERS END -->
+
+
+ <UL>
+ <B>Returns:</B>
+ <UL>
+ DOM HTML element.
+ </UL>
+ </UL>
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="getElement"><!-- --></A>
+ <H3>getElement</H3>
+ <PRE>HTMLElement <B>getElement</B>()</PRE>
+
+ <UL>Returns the DOM element that the layer is binded to.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <!-- METHOD PARAMETERS END -->
+
+
+ <UL>
+ <B>Returns:</B>
+ <UL>
+ DOM HTML element.
+ </UL>
+ </UL>
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="hide"><!-- --></A>
+ <H3>hide</H3>
+ <PRE>void <B>hide</B>()</PRE>
+
+ <UL>Hides the layer.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <!-- METHOD PARAMETERS END -->
+
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="isVisible"><!-- --></A>
+ <H3>isVisible</H3>
+ <PRE>boolean <B>isVisible</B>()</PRE>
+
+ <UL>Returns true/false if the layer is visible or not.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <!-- METHOD PARAMETERS END -->
+
+
+ <UL>
+ <B>Returns:</B>
+ <UL>
+ true/false if it's visible or not.
+ </UL>
+ </UL>
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="moveBy"><!-- --></A>
+ <H3>moveBy</H3>
+ <PRE>void <B>moveBy</B>(<int> x, <int> y)</PRE>
+
+ <UL>Moves the layer relative in pixels.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <UL>
+ <B>Parameters:</B>
+
+ <UL><CODE>x</CODE> - Horizontal relative position in pixels.
+ </UL>
+
+ <UL><CODE>y</CODE> - Vertical relative position in pixels.
+ </UL>
+
+ </UL>
+
+ <!-- METHOD PARAMETERS END -->
+
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="moveRelativeTo"><!-- --></A>
+ <H3>moveRelativeTo</H3>
+ <PRE>void <B>moveRelativeTo</B>(<HTMLElement> re, <string> p)</PRE>
+
+ <UL>Moves the layer relative to the specified HTML element.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <UL>
+ <B>Parameters:</B>
+
+ <UL><CODE>re</CODE> - Element to move the layer relative to.
+ </UL>
+
+ <UL><CODE>p</CODE> - Position of the layer tl = top left, tr = top right, bl = bottom left, br = bottom right.
+ </UL>
+
+ </UL>
+
+ <!-- METHOD PARAMETERS END -->
+
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="moveTo"><!-- --></A>
+ <H3>moveTo</H3>
+ <PRE>void <B>moveTo</B>(<int> x, <int> y)</PRE>
+
+ <UL>Moves the layer absolute in pixels.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <UL>
+ <B>Parameters:</B>
+
+ <UL><CODE>x</CODE> - Horizontal absolute position in pixels.
+ </UL>
+
+ <UL><CODE>y</CODE> - Vertical absolute position in pixels.
+ </UL>
+
+ </UL>
+
+ <!-- METHOD PARAMETERS END -->
+
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="parseInt"><!-- --></A>
+ <H3>parseInt</H3>
+ <PRE>int <B>parseInt</B>(<string> s)</PRE>
+
+ <UL>Parses a int value this method will return 0 if the string is empty.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <UL>
+ <B>Parameters:</B>
+
+ <UL><CODE>s</CODE> - String to parse value of.
+ </UL>
+
+ </UL>
+
+ <!-- METHOD PARAMETERS END -->
+
+
+ <UL>
+ <B>Returns:</B>
+ <UL>
+ Parsed number.
+ </UL>
+ </UL>
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="resizeBy"><!-- --></A>
+ <H3>resizeBy</H3>
+ <PRE>void <B>resizeBy</B>(<int> w, <int> h)</PRE>
+
+ <UL>Resizes the layer by the specified relative width and height.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <UL>
+ <B>Parameters:</B>
+
+ <UL><CODE>w</CODE> - Relative width value.
+ </UL>
+
+ <UL><CODE>h</CODE> - Relative height value.
+ </UL>
+
+ </UL>
+
+ <!-- METHOD PARAMETERS END -->
+
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="resizeTo"><!-- --></A>
+ <H3>resizeTo</H3>
+ <PRE>void <B>resizeTo</B>(<int> w, <int> h)</PRE>
+
+ <UL>Resizes the layer to the specified width and height.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <UL>
+ <B>Parameters:</B>
+
+ <UL><CODE>w</CODE> - Width value.
+ </UL>
+
+ <UL><CODE>h</CODE> - Height value.
+ </UL>
+
+ </UL>
+
+ <!-- METHOD PARAMETERS END -->
+
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="setBlockMode"><!-- --></A>
+ <H3>setBlockMode</H3>
+ <PRE>void <B>setBlockMode</B>(<boolean> s)</PRE>
+
+ <UL>Sets the block mode. If you set this property to true a control box blocker iframe
+ will be added to the document since MSIE has a issue where select boxes are visible
+ through layers.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <UL>
+ <B>Parameters:</B>
+
+ <UL><CODE>s</CODE> - Block mode state, true is the default value.
+ </UL>
+
+ </UL>
+
+ <!-- METHOD PARAMETERS END -->
+
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="show"><!-- --></A>
+ <H3>show</H3>
+ <PRE>void <B>show</B>()</PRE>
+
+ <UL>Shows the layer.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <!-- METHOD PARAMETERS END -->
+
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="updateBlocker"><!-- --></A>
+ <H3>updateBlocker</H3>
+ <PRE>void <B>updateBlocker</B>()</PRE>
+
+ <UL>Updates the select/iframe/flash blocker this will also block the caret in Firefox.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <!-- METHOD PARAMETERS END -->
+
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+
+
+<!-- ============ METHOD DETAIL END ========== -->
+
+<!-- ========= END OF CLASS DATA ========= -->
+
+<!-- ========== START OF NAVBAR ========== -->
+<A NAME="navbar_bottom"><!-- --></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0">
+<TR>
+<TD COLSPAN=3 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_bottom_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3">
+ <TR ALIGN="center" VALIGN="top">
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="overview-summary.html"><FONT CLASS="NavBarFont1"><B>Overview</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="overview-summary-TinyMCE_Layer.class.js.html"><FONT CLASS="NavBarFont1"><B>File</B></FONT></A> </TD>
+ <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> <FONT CLASS="NavBarFont1Rev"><B>Class</B></FONT> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="overview-tree.html"><FONT CLASS="NavBarFont1"><b>Tree</b></FONT></A> </TD>
+ <!--TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"--> <!--A HREF="deprecated-list.html"--><!--FONT CLASS="NavBarFont1">Deprecated</FONT--><!--/A--><!-- </TD-->
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
+ </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+<B></B>
+</EM>
+</TD
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="TinyMCE_Engine.html"><B>PREV CLASS</B></A><!--
+ NEXT CLASS
+-->
+ <A HREF="TinyMCE_Popup.html"><B>NEXT CLASS</B></A></FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="index.html" TARGET="_top"><B>FRAMES</B></A>
+ <A HREF="TinyMCE_Layer.html" TARGET="_top"><B>NO FRAMES</B></A>
+
+<SCRIPT>
+ <!--
+ if(window==top) {
+ document.writeln('<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>');
+ }
+ //-->
+</SCRIPT>
+<NOSCRIPT>
+<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>
+</NOSCRIPT>
+</FONT></TD>
+</TR>
+<TR>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+ SUMMARY: <A HREF="#field_summary">FIELD</A> | <A HREF="#constructor_summary">CONSTR</A> | <A HREF="#method_summary">METHOD</A></FONT></TD>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+DETAIL: <A HREF="#field_detail">FIELD</A> | <A HREF="#constructor_detail">CONSTR</A> | <A HREF="#method_detail">METHOD</A></FONT></TD>
+</TR>
+</TABLE>
+
+<!-- =========== END OF NAVBAR =========== -->
+
+<HR>
+<FONT SIZE="-1">
+
+</FONT>
+<div class="jsdoc_ctime">Documentation generated by <a href="http://jsdoc.sourceforge.net/" target="_parent">JSDoc</a> on Fri Apr 14 21:59:23 2006</div>
+</BODY>
+</HTML>
Deleted: trunk/htdocs/js/tinymce/docs/tinymce_api/TinyMCE_Popup.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/tinymce_api/TinyMCE_Popup.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/tinymce_api/TinyMCE_Popup.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,789 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN""http://www.w3.org/TR/REC-html40/loose.dtd">
-<!--NewPage-->
-<HTML>
-<HEAD>
-<TITLE>
-TinyMCE_Popup
-</TITLE>
-<LINK REL ="stylesheet" TYPE="text/css" HREF="stylesheet.css" TITLE="Style">
-</HEAD>
-<SCRIPT>
-function asd()
-{
-parent.document.title="TinyMCE_Popup";
-}
-</SCRIPT>
-<BODY BGCOLOR="white" onload="asd();">
-
-<!-- ========== START OF NAVBAR ========== -->
-<A NAME="navbar_bottom"><!-- --></A>
-<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0">
-<TR>
-<TD COLSPAN=3 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
-<A NAME="navbar_bottom_firstrow"><!-- --></A>
-<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3">
- <TR ALIGN="center" VALIGN="top">
- <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="overview-summary.html"><FONT CLASS="NavBarFont1"><B>Overview</B></FONT></A> </TD>
- <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="overview-summary-TinyMCE_Popup.class.js.html"><FONT CLASS="NavBarFont1"><B>File</B></FONT></A> </TD>
- <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> <FONT CLASS="NavBarFont1Rev"><B>Class</B></FONT> </TD>
- <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="overview-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A> </TD>
- <!--TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"--> <!--A HREF="deprecated-list.html"--><!--FONT CLASS="NavBarFont1">Deprecated</FONT--><!--/A--><!-- </TD-->
- <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="index-all.html"--><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
- <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
- </TR>
-</TABLE>
-</TD>
-<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
-<B></B>
-</EM>
-</TD
-</TR>
-
-<TR>
-<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
- <A HREF="TinyMCE_Layer.html"><B>PREV CLASS</B></A><!--
- NEXT CLASS
--->
- <A HREF="TinyMCE_Selection.html"><B>NEXT CLASS</B></A></FONT></TD>
-<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
- <A HREF="index.html" TARGET="_top"><B>FRAMES</B></A>
- <A HREF="TinyMCE_Popup.html" TARGET="_top"><B>NO FRAMES</B></A>
-
-<SCRIPT>
- <!--
- if(window==top) {
- document.writeln('<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>');
- }
- //-->
-</SCRIPT>
-<NOSCRIPT>
-<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>
-</NOSCRIPT>
-</FONT></TD>
-</TR>
-<TR>
-<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
- SUMMARY: <A HREF="#field_summary">FIELD</A> | <A HREF="#constructor_summary">CONSTR</A> | <A HREF="#method_summary">METHOD</A></FONT></TD>
-<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
-DETAIL: <A HREF="#field_detail">FIELD</A> | <A HREF="#constructor_detail">CONSTR</A> | <A HREF="#method_detail">METHOD</A></FONT></TD>
-</TR>
-</TABLE>
-<!-- =========== END OF NAVBAR =========== -->
-<HR>
-
-<!-- ======== START OF CLASS DATA ======== -->
-<H2>Class TinyMCE_Popup</H2>
-<PRE>Object
- |
- +--<b>TinyMCE_Popup</b>
-</PRE>
-
-
-<HR>
-<DL>
- <!-- Class definition -->
- <DT>class
- <B>TinyMCE_Popup</B>
-
-
-</DL>
-
- <P>
- <I>Defined in <a href='overview-summary-TinyMCE_Popup.class.js.html'>TinyMCE_Popup.class.js</a></I><BR/><BR/>
- </P>
-
- <HR>
-
-<!-- ======== NESTED CLASS SUMMARY ======== -->
-
-<!-- ======== END NESTED CLASS SUMMARY ======== -->
-
-
-<!-- =========== FIELD SUMMARY =========== -->
-
-
-
-
-<!-- =========== END FIELD SUMMARY =========== -->
-
-
-<!-- ======== CONSTRUCTOR SUMMARY ======== -->
-
-<A NAME="constructor_summary"><!-- --></A>
-<TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" WIDTH="100%">
-<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
-<TD COLSPAN=2><FONT SIZE="+2">
-<B>Constructor Summary</B></FONT></TD>
-</TR>
-<TR BGCOLOR="white" CLASS="TableRowColor">
- <TD>
- <CODE>
- <B>
- <A HREF="TinyMCE_Popup.html#TinyMCE_Popup()">TinyMCE_Popup</A>
- </B>
- ()
- </CODE>
- <BR>
-
- Constructor for the popup class.
- </TD>
-</TR>
-</TABLE>
-
-<!-- ======== END CONSTRUCTOR SUMMARY ======== -->
-
-
-
-<!-- ========== METHOD SUMMARY =========== -->
-
-<A NAME="method_summary"><!-- --></A>
-<TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" WIDTH="100%">
-<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
-<TD COLSPAN=2><FONT SIZE="+2">
-<B>Method Summary</B></FONT></TD>
-</TR>
-
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> void</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#close">close</A></B>()
- </CODE>
- <BR>
-
- Closes the current window.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> void</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#execCommand">execCommand</A></B>(<string> command, <boolean> user_interface, <mixed> value)
- </CODE>
- <BR>
-
- Executes the specific command on the parent instance that opened the window.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> void</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#executeOnLoad">executeOnLoad</A></B>(<string> str)
- </CODE>
- <BR>
-
- Executes the specified string onload.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> Object</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#getWindowArg">getWindowArg</A></B>(<string> name, <string> default_value)
- </CODE>
- <BR>
-
- Returns a window argument, window arguments can be passed from a plugin to a window
- by using the tinyMCE.openWindow function.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> void</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#importClass">importClass</A></B>(<string> c)
- </CODE>
- <BR>
-
- Imports the specified class into the current popup.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> void</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#init">init</A></B>()
- </CODE>
- <BR>
-
- Initializes the TinyMCE Popup class.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> void</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#onLoad">onLoad</A></B>()
- </CODE>
- <BR>
-
- Gets executed when the window has finished loading it's contents.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> void</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#openBrowser">openBrowser</A></B>(<string> element_id, <string> type, <string> option)
- </CODE>
- <BR>
-
- Opens a filebrowser/imagebrowser this will set the output value from
- the browser as a value on the specified element.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> void</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#pickColor">pickColor</A></B>(<DOMEvent> e, <string> element_id)
- </CODE>
- <BR>
-
- Executes a color picker on the specified element id.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> void</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#resizeToContent">resizeToContent</A></B>()
- </CODE>
- <BR>
-
- Resizes the current window to the dimensions of the body.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> void</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#resizeToInnerSize">resizeToInnerSize</A></B>()
- </CODE>
- <BR>
-
- Resizes the current window to it's inner body size.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> void</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#restoreSelection">restoreSelection</A></B>()
- </CODE>
- <BR>
-
- Restores the selection back to the one stored after executing a command.
- </TD>
- </TR>
-
-
-</TABLE>
-
-
-
-<P>
-<!-- ========== END METHOD SUMMARY =========== -->
-
-
-<!-- ============ FIELD DETAIL START =========== -->
-
-
-<!-- ============ FIELD DETAIL END =========== -->
-
- <!-- ========= CONSTRUCTOR DETAIL START ======== -->
-
-<A NAME="constructor_detail"><!-- --></A>
-<TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" WIDTH="100%">
- <TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
- <TD COLSPAN=1>
- <FONT SIZE="+2"><B>Constructor Detail</B></FONT>
- </TD>
- </TR>
-</TABLE>
-
-<A NAME="TinyMCE_Popup()"><!-- --></A><H3>
-TinyMCE_Popup</H3>
-<PRE><B>TinyMCE_Popup</B>()</PRE>
-
-
-<UL>
- Constructor for the popup class. This class contains base logic for popup/dialogs and sets up
- object references to the TinyMCE core.
-</UL>
-
-
-
- </UL>
-
-
-<!-- Constructor return value(s) -->
-
-<!-- End constructor return value(s) -->
-
-<!-- ADDITIONAL ATTRIBUTES -->
-
-<HR/>
-<!-- END ADDITIONAL ATTRIBUTES -->
-
-<!-- ========= CONSTRUCTOR DETAIL END ======== -->
-
-
-<!-- ============ METHOD DETAIL START ========== -->
-
-<A NAME="method_detail"><!-- --></A>
-<TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" WIDTH="100%">
- <TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
- <TD COLSPAN=1><FONT SIZE="+2">
- <B>Method Detail</B></FONT>
- </TD>
- </TR>
-</TABLE>
-
-<!-- One single method detail entry -->
-
- <A NAME="close"><!-- --></A>
- <H3>close</H3>
- <PRE>void <B>close</B>()</PRE>
-
- <UL>Closes the current window. This should be used instead of window.close. Since this will
- also handle inlinepopups closing.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <!-- METHOD PARAMETERS END -->
-
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="execCommand"><!-- --></A>
- <H3>execCommand</H3>
- <PRE>void <B>execCommand</B>(<string> command, <boolean> user_interface, <mixed> value)</PRE>
-
- <UL>Executes the specific command on the parent instance that opened the window. This method
- will also take care of the storage and restorage of the current selection in MSIE when
- using inlinepopups. So we suggest using this method instead of tinyMCE.execCommand when using
- popup windows.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <UL>
- <B>Parameters:</B>
-
- <UL><CODE>command</CODE> - Command name to execute, for example mceLink or Bold.
- </UL>
-
- <UL><CODE>user_interface</CODE> - True/false state if a UI (dialog) should be presented or not.
- </UL>
-
- <UL><CODE>value</CODE> - Optional command value, this can be anything.
- </UL>
-
- </UL>
-
- <!-- METHOD PARAMETERS END -->
-
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="executeOnLoad"><!-- --></A>
- <H3>executeOnLoad</H3>
- <PRE>void <B>executeOnLoad</B>(<string> str)</PRE>
-
- <UL>Executes the specified string onload. This is a workaround for Opera since it
- doesn't execute the events in the same order than MSIE and Firefox.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <UL>
- <B>Parameters:</B>
-
- <UL><CODE>str</CODE> - String to evaluate on load.
- </UL>
-
- </UL>
-
- <!-- METHOD PARAMETERS END -->
-
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="getWindowArg"><!-- --></A>
- <H3>getWindowArg</H3>
- <PRE>Object <B>getWindowArg</B>(<string> name, <string> default_value)</PRE>
-
- <UL>Returns a window argument, window arguments can be passed from a plugin to a window
- by using the tinyMCE.openWindow function.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <UL>
- <B>Parameters:</B>
-
- <UL><CODE>name</CODE> - Argument name to retrive.
- </UL>
-
- <UL><CODE>default_value</CODE> - Optional default value to assign if the argument wasn't set.
- </UL>
-
- </UL>
-
- <!-- METHOD PARAMETERS END -->
-
-
- <UL>
- <B>Returns:</B>
- <UL>
- Argument value object.
- </UL>
- </UL>
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="importClass"><!-- --></A>
- <H3>importClass</H3>
- <PRE>void <B>importClass</B>(<string> c)</PRE>
-
- <UL>Imports the specified class into the current popup. This will setup a local class definition
- by importing from the parent window.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <UL>
- <B>Parameters:</B>
-
- <UL><CODE>c</CODE> - Class name to import to current page.
- </UL>
-
- </UL>
-
- <!-- METHOD PARAMETERS END -->
-
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="init"><!-- --></A>
- <H3>init</H3>
- <PRE>void <B>init</B>()</PRE>
-
- <UL>Initializes the TinyMCE Popup class. This will setup the TinyMCE core references and other popup/dialog related functions.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <!-- METHOD PARAMETERS END -->
-
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="onLoad"><!-- --></A>
- <H3>onLoad</H3>
- <PRE>void <B>onLoad</B>()</PRE>
-
- <UL>Gets executed when the window has finished loading it's contents. This function will then
- replace language variables with their real values.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <!-- METHOD PARAMETERS END -->
-
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="openBrowser"><!-- --></A>
- <H3>openBrowser</H3>
- <PRE>void <B>openBrowser</B>(<string> element_id, <string> type, <string> option)</PRE>
-
- <UL>Opens a filebrowser/imagebrowser this will set the output value from
- the browser as a value on the specified element.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <UL>
- <B>Parameters:</B>
-
- <UL><CODE>element_id</CODE> - Id of the element to set value in.
- </UL>
-
- <UL><CODE>type</CODE> - Type of browser to open image/file/flash.
- </UL>
-
- <UL><CODE>option</CODE> - Option name to get the file_broswer_callback function name from.
- </UL>
-
- </UL>
-
- <!-- METHOD PARAMETERS END -->
-
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="pickColor"><!-- --></A>
- <H3>pickColor</H3>
- <PRE>void <B>pickColor</B>(<DOMEvent> e, <string> element_id)</PRE>
-
- <UL>Executes a color picker on the specified element id. When the user
- then selects a color it will be set as the value of the specified element.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <UL>
- <B>Parameters:</B>
-
- <UL><CODE>e</CODE> - DOM event object.
- </UL>
-
- <UL><CODE>element_id</CODE> - Element id to be filled with the color value from the picker.
- </UL>
-
- </UL>
-
- <!-- METHOD PARAMETERS END -->
-
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="resizeToContent"><!-- --></A>
- <H3>resizeToContent</H3>
- <PRE>void <B>resizeToContent</B>()</PRE>
-
- <UL>Resizes the current window to the dimensions of the body.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <!-- METHOD PARAMETERS END -->
-
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="resizeToInnerSize"><!-- --></A>
- <H3>resizeToInnerSize</H3>
- <PRE>void <B>resizeToInnerSize</B>()</PRE>
-
- <UL>Resizes the current window to it's inner body size. This function
- was needed since MSIE makes the visible dialog area diffrent depending
- on what Theme/Skin you use.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <!-- METHOD PARAMETERS END -->
-
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="restoreSelection"><!-- --></A>
- <H3>restoreSelection</H3>
- <PRE>void <B>restoreSelection</B>()</PRE>
-
- <UL>Restores the selection back to the one stored after executing a command.
- This function was needed in MSIE when using inlinepopups, the selection
- would otherwice get lost if the user focused another field.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <!-- METHOD PARAMETERS END -->
-
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
-
-
-<!-- ============ METHOD DETAIL END ========== -->
-
-<!-- ========= END OF CLASS DATA ========= -->
-
-<!-- ========== START OF NAVBAR ========== -->
-<A NAME="navbar_bottom"><!-- --></A>
-<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0">
-<TR>
-<TD COLSPAN=3 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
-<A NAME="navbar_bottom_firstrow"><!-- --></A>
-<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3">
- <TR ALIGN="center" VALIGN="top">
- <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="overview-summary.html"><FONT CLASS="NavBarFont1"><B>Overview</B></FONT></A> </TD>
- <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="overview-summary-TinyMCE_Popup.class.js.html"><FONT CLASS="NavBarFont1"><B>File</B></FONT></A> </TD>
- <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> <FONT CLASS="NavBarFont1Rev"><B>Class</B></FONT> </TD>
- <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="overview-tree.html"><FONT CLASS="NavBarFont1"><b>Tree</b></FONT></A> </TD>
- <!--TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"--> <!--A HREF="deprecated-list.html"--><!--FONT CLASS="NavBarFont1">Deprecated</FONT--><!--/A--><!-- </TD-->
- <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
- <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
- </TR>
-</TABLE>
-</TD>
-<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
-<B></B>
-</EM>
-</TD
-</TR>
-
-<TR>
-<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
- <A HREF="TinyMCE_Layer.html"><B>PREV CLASS</B></A><!--
- NEXT CLASS
--->
- <A HREF="TinyMCE_Selection.html"><B>NEXT CLASS</B></A></FONT></TD>
-<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
- <A HREF="index.html" TARGET="_top"><B>FRAMES</B></A>
- <A HREF="TinyMCE_Popup.html" TARGET="_top"><B>NO FRAMES</B></A>
-
-<SCRIPT>
- <!--
- if(window==top) {
- document.writeln('<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>');
- }
- //-->
-</SCRIPT>
-<NOSCRIPT>
-<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>
-</NOSCRIPT>
-</FONT></TD>
-</TR>
-<TR>
-<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
- SUMMARY: <A HREF="#field_summary">FIELD</A> | <A HREF="#constructor_summary">CONSTR</A> | <A HREF="#method_summary">METHOD</A></FONT></TD>
-<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
-DETAIL: <A HREF="#field_detail">FIELD</A> | <A HREF="#constructor_detail">CONSTR</A> | <A HREF="#method_detail">METHOD</A></FONT></TD>
-</TR>
-</TABLE>
-
-<!-- =========== END OF NAVBAR =========== -->
-
-<HR>
-<FONT SIZE="-1">
-
-</FONT>
-<div class="jsdoc_ctime">Documentation generated by <a href="http://jsdoc.sourceforge.net/" target="_parent">JSDoc</a> on Fri Apr 14 21:59:23 2006</div>
-</BODY>
-</HTML>
Copied: trunk/htdocs/js/tinymce/docs/tinymce_api/TinyMCE_Popup.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/tinymce_api/TinyMCE_Popup.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/tinymce_api/TinyMCE_Popup.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/tinymce_api/TinyMCE_Popup.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,789 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN""http://www.w3.org/TR/REC-html40/loose.dtd">
+<!--NewPage-->
+<HTML>
+<HEAD>
+<TITLE>
+TinyMCE_Popup
+</TITLE>
+<LINK REL ="stylesheet" TYPE="text/css" HREF="stylesheet.css" TITLE="Style">
+</HEAD>
+<SCRIPT>
+function asd()
+{
+parent.document.title="TinyMCE_Popup";
+}
+</SCRIPT>
+<BODY BGCOLOR="white" onload="asd();">
+
+<!-- ========== START OF NAVBAR ========== -->
+<A NAME="navbar_bottom"><!-- --></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0">
+<TR>
+<TD COLSPAN=3 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_bottom_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3">
+ <TR ALIGN="center" VALIGN="top">
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="overview-summary.html"><FONT CLASS="NavBarFont1"><B>Overview</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="overview-summary-TinyMCE_Popup.class.js.html"><FONT CLASS="NavBarFont1"><B>File</B></FONT></A> </TD>
+ <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> <FONT CLASS="NavBarFont1Rev"><B>Class</B></FONT> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="overview-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A> </TD>
+ <!--TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"--> <!--A HREF="deprecated-list.html"--><!--FONT CLASS="NavBarFont1">Deprecated</FONT--><!--/A--><!-- </TD-->
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="index-all.html"--><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
+ </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+<B></B>
+</EM>
+</TD
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="TinyMCE_Layer.html"><B>PREV CLASS</B></A><!--
+ NEXT CLASS
+-->
+ <A HREF="TinyMCE_Selection.html"><B>NEXT CLASS</B></A></FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="index.html" TARGET="_top"><B>FRAMES</B></A>
+ <A HREF="TinyMCE_Popup.html" TARGET="_top"><B>NO FRAMES</B></A>
+
+<SCRIPT>
+ <!--
+ if(window==top) {
+ document.writeln('<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>');
+ }
+ //-->
+</SCRIPT>
+<NOSCRIPT>
+<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>
+</NOSCRIPT>
+</FONT></TD>
+</TR>
+<TR>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+ SUMMARY: <A HREF="#field_summary">FIELD</A> | <A HREF="#constructor_summary">CONSTR</A> | <A HREF="#method_summary">METHOD</A></FONT></TD>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+DETAIL: <A HREF="#field_detail">FIELD</A> | <A HREF="#constructor_detail">CONSTR</A> | <A HREF="#method_detail">METHOD</A></FONT></TD>
+</TR>
+</TABLE>
+<!-- =========== END OF NAVBAR =========== -->
+<HR>
+
+<!-- ======== START OF CLASS DATA ======== -->
+<H2>Class TinyMCE_Popup</H2>
+<PRE>Object
+ |
+ +--<b>TinyMCE_Popup</b>
+</PRE>
+
+
+<HR>
+<DL>
+ <!-- Class definition -->
+ <DT>class
+ <B>TinyMCE_Popup</B>
+
+
+</DL>
+
+ <P>
+ <I>Defined in <a href='overview-summary-TinyMCE_Popup.class.js.html'>TinyMCE_Popup.class.js</a></I><BR/><BR/>
+ </P>
+
+ <HR>
+
+<!-- ======== NESTED CLASS SUMMARY ======== -->
+
+<!-- ======== END NESTED CLASS SUMMARY ======== -->
+
+
+<!-- =========== FIELD SUMMARY =========== -->
+
+
+
+
+<!-- =========== END FIELD SUMMARY =========== -->
+
+
+<!-- ======== CONSTRUCTOR SUMMARY ======== -->
+
+<A NAME="constructor_summary"><!-- --></A>
+<TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" WIDTH="100%">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TD COLSPAN=2><FONT SIZE="+2">
+<B>Constructor Summary</B></FONT></TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="TinyMCE_Popup.html#TinyMCE_Popup()">TinyMCE_Popup</A>
+ </B>
+ ()
+ </CODE>
+ <BR>
+
+ Constructor for the popup class.
+ </TD>
+</TR>
+</TABLE>
+
+<!-- ======== END CONSTRUCTOR SUMMARY ======== -->
+
+
+
+<!-- ========== METHOD SUMMARY =========== -->
+
+<A NAME="method_summary"><!-- --></A>
+<TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" WIDTH="100%">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TD COLSPAN=2><FONT SIZE="+2">
+<B>Method Summary</B></FONT></TD>
+</TR>
+
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> void</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#close">close</A></B>()
+ </CODE>
+ <BR>
+
+ Closes the current window.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> void</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#execCommand">execCommand</A></B>(<string> command, <boolean> user_interface, <mixed> value)
+ </CODE>
+ <BR>
+
+ Executes the specific command on the parent instance that opened the window.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> void</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#executeOnLoad">executeOnLoad</A></B>(<string> str)
+ </CODE>
+ <BR>
+
+ Executes the specified string onload.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> Object</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#getWindowArg">getWindowArg</A></B>(<string> name, <string> default_value)
+ </CODE>
+ <BR>
+
+ Returns a window argument, window arguments can be passed from a plugin to a window
+ by using the tinyMCE.openWindow function.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> void</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#importClass">importClass</A></B>(<string> c)
+ </CODE>
+ <BR>
+
+ Imports the specified class into the current popup.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> void</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#init">init</A></B>()
+ </CODE>
+ <BR>
+
+ Initializes the TinyMCE Popup class.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> void</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#onLoad">onLoad</A></B>()
+ </CODE>
+ <BR>
+
+ Gets executed when the window has finished loading it's contents.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> void</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#openBrowser">openBrowser</A></B>(<string> element_id, <string> type, <string> option)
+ </CODE>
+ <BR>
+
+ Opens a filebrowser/imagebrowser this will set the output value from
+ the browser as a value on the specified element.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> void</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#pickColor">pickColor</A></B>(<DOMEvent> e, <string> element_id)
+ </CODE>
+ <BR>
+
+ Executes a color picker on the specified element id.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> void</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#resizeToContent">resizeToContent</A></B>()
+ </CODE>
+ <BR>
+
+ Resizes the current window to the dimensions of the body.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> void</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#resizeToInnerSize">resizeToInnerSize</A></B>()
+ </CODE>
+ <BR>
+
+ Resizes the current window to it's inner body size.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> void</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#restoreSelection">restoreSelection</A></B>()
+ </CODE>
+ <BR>
+
+ Restores the selection back to the one stored after executing a command.
+ </TD>
+ </TR>
+
+
+</TABLE>
+
+
+
+<P>
+<!-- ========== END METHOD SUMMARY =========== -->
+
+
+<!-- ============ FIELD DETAIL START =========== -->
+
+
+<!-- ============ FIELD DETAIL END =========== -->
+
+ <!-- ========= CONSTRUCTOR DETAIL START ======== -->
+
+<A NAME="constructor_detail"><!-- --></A>
+<TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" WIDTH="100%">
+ <TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+ <TD COLSPAN=1>
+ <FONT SIZE="+2"><B>Constructor Detail</B></FONT>
+ </TD>
+ </TR>
+</TABLE>
+
+<A NAME="TinyMCE_Popup()"><!-- --></A><H3>
+TinyMCE_Popup</H3>
+<PRE><B>TinyMCE_Popup</B>()</PRE>
+
+
+<UL>
+ Constructor for the popup class. This class contains base logic for popup/dialogs and sets up
+ object references to the TinyMCE core.
+</UL>
+
+
+
+ </UL>
+
+
+<!-- Constructor return value(s) -->
+
+<!-- End constructor return value(s) -->
+
+<!-- ADDITIONAL ATTRIBUTES -->
+
+<HR/>
+<!-- END ADDITIONAL ATTRIBUTES -->
+
+<!-- ========= CONSTRUCTOR DETAIL END ======== -->
+
+
+<!-- ============ METHOD DETAIL START ========== -->
+
+<A NAME="method_detail"><!-- --></A>
+<TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" WIDTH="100%">
+ <TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+ <TD COLSPAN=1><FONT SIZE="+2">
+ <B>Method Detail</B></FONT>
+ </TD>
+ </TR>
+</TABLE>
+
+<!-- One single method detail entry -->
+
+ <A NAME="close"><!-- --></A>
+ <H3>close</H3>
+ <PRE>void <B>close</B>()</PRE>
+
+ <UL>Closes the current window. This should be used instead of window.close. Since this will
+ also handle inlinepopups closing.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <!-- METHOD PARAMETERS END -->
+
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="execCommand"><!-- --></A>
+ <H3>execCommand</H3>
+ <PRE>void <B>execCommand</B>(<string> command, <boolean> user_interface, <mixed> value)</PRE>
+
+ <UL>Executes the specific command on the parent instance that opened the window. This method
+ will also take care of the storage and restorage of the current selection in MSIE when
+ using inlinepopups. So we suggest using this method instead of tinyMCE.execCommand when using
+ popup windows.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <UL>
+ <B>Parameters:</B>
+
+ <UL><CODE>command</CODE> - Command name to execute, for example mceLink or Bold.
+ </UL>
+
+ <UL><CODE>user_interface</CODE> - True/false state if a UI (dialog) should be presented or not.
+ </UL>
+
+ <UL><CODE>value</CODE> - Optional command value, this can be anything.
+ </UL>
+
+ </UL>
+
+ <!-- METHOD PARAMETERS END -->
+
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="executeOnLoad"><!-- --></A>
+ <H3>executeOnLoad</H3>
+ <PRE>void <B>executeOnLoad</B>(<string> str)</PRE>
+
+ <UL>Executes the specified string onload. This is a workaround for Opera since it
+ doesn't execute the events in the same order than MSIE and Firefox.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <UL>
+ <B>Parameters:</B>
+
+ <UL><CODE>str</CODE> - String to evaluate on load.
+ </UL>
+
+ </UL>
+
+ <!-- METHOD PARAMETERS END -->
+
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="getWindowArg"><!-- --></A>
+ <H3>getWindowArg</H3>
+ <PRE>Object <B>getWindowArg</B>(<string> name, <string> default_value)</PRE>
+
+ <UL>Returns a window argument, window arguments can be passed from a plugin to a window
+ by using the tinyMCE.openWindow function.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <UL>
+ <B>Parameters:</B>
+
+ <UL><CODE>name</CODE> - Argument name to retrive.
+ </UL>
+
+ <UL><CODE>default_value</CODE> - Optional default value to assign if the argument wasn't set.
+ </UL>
+
+ </UL>
+
+ <!-- METHOD PARAMETERS END -->
+
+
+ <UL>
+ <B>Returns:</B>
+ <UL>
+ Argument value object.
+ </UL>
+ </UL>
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="importClass"><!-- --></A>
+ <H3>importClass</H3>
+ <PRE>void <B>importClass</B>(<string> c)</PRE>
+
+ <UL>Imports the specified class into the current popup. This will setup a local class definition
+ by importing from the parent window.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <UL>
+ <B>Parameters:</B>
+
+ <UL><CODE>c</CODE> - Class name to import to current page.
+ </UL>
+
+ </UL>
+
+ <!-- METHOD PARAMETERS END -->
+
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="init"><!-- --></A>
+ <H3>init</H3>
+ <PRE>void <B>init</B>()</PRE>
+
+ <UL>Initializes the TinyMCE Popup class. This will setup the TinyMCE core references and other popup/dialog related functions.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <!-- METHOD PARAMETERS END -->
+
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="onLoad"><!-- --></A>
+ <H3>onLoad</H3>
+ <PRE>void <B>onLoad</B>()</PRE>
+
+ <UL>Gets executed when the window has finished loading it's contents. This function will then
+ replace language variables with their real values.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <!-- METHOD PARAMETERS END -->
+
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="openBrowser"><!-- --></A>
+ <H3>openBrowser</H3>
+ <PRE>void <B>openBrowser</B>(<string> element_id, <string> type, <string> option)</PRE>
+
+ <UL>Opens a filebrowser/imagebrowser this will set the output value from
+ the browser as a value on the specified element.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <UL>
+ <B>Parameters:</B>
+
+ <UL><CODE>element_id</CODE> - Id of the element to set value in.
+ </UL>
+
+ <UL><CODE>type</CODE> - Type of browser to open image/file/flash.
+ </UL>
+
+ <UL><CODE>option</CODE> - Option name to get the file_broswer_callback function name from.
+ </UL>
+
+ </UL>
+
+ <!-- METHOD PARAMETERS END -->
+
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="pickColor"><!-- --></A>
+ <H3>pickColor</H3>
+ <PRE>void <B>pickColor</B>(<DOMEvent> e, <string> element_id)</PRE>
+
+ <UL>Executes a color picker on the specified element id. When the user
+ then selects a color it will be set as the value of the specified element.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <UL>
+ <B>Parameters:</B>
+
+ <UL><CODE>e</CODE> - DOM event object.
+ </UL>
+
+ <UL><CODE>element_id</CODE> - Element id to be filled with the color value from the picker.
+ </UL>
+
+ </UL>
+
+ <!-- METHOD PARAMETERS END -->
+
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="resizeToContent"><!-- --></A>
+ <H3>resizeToContent</H3>
+ <PRE>void <B>resizeToContent</B>()</PRE>
+
+ <UL>Resizes the current window to the dimensions of the body.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <!-- METHOD PARAMETERS END -->
+
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="resizeToInnerSize"><!-- --></A>
+ <H3>resizeToInnerSize</H3>
+ <PRE>void <B>resizeToInnerSize</B>()</PRE>
+
+ <UL>Resizes the current window to it's inner body size. This function
+ was needed since MSIE makes the visible dialog area diffrent depending
+ on what Theme/Skin you use.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <!-- METHOD PARAMETERS END -->
+
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="restoreSelection"><!-- --></A>
+ <H3>restoreSelection</H3>
+ <PRE>void <B>restoreSelection</B>()</PRE>
+
+ <UL>Restores the selection back to the one stored after executing a command.
+ This function was needed in MSIE when using inlinepopups, the selection
+ would otherwice get lost if the user focused another field.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <!-- METHOD PARAMETERS END -->
+
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+
+
+<!-- ============ METHOD DETAIL END ========== -->
+
+<!-- ========= END OF CLASS DATA ========= -->
+
+<!-- ========== START OF NAVBAR ========== -->
+<A NAME="navbar_bottom"><!-- --></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0">
+<TR>
+<TD COLSPAN=3 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_bottom_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3">
+ <TR ALIGN="center" VALIGN="top">
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="overview-summary.html"><FONT CLASS="NavBarFont1"><B>Overview</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="overview-summary-TinyMCE_Popup.class.js.html"><FONT CLASS="NavBarFont1"><B>File</B></FONT></A> </TD>
+ <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> <FONT CLASS="NavBarFont1Rev"><B>Class</B></FONT> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="overview-tree.html"><FONT CLASS="NavBarFont1"><b>Tree</b></FONT></A> </TD>
+ <!--TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"--> <!--A HREF="deprecated-list.html"--><!--FONT CLASS="NavBarFont1">Deprecated</FONT--><!--/A--><!-- </TD-->
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
+ </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+<B></B>
+</EM>
+</TD
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="TinyMCE_Layer.html"><B>PREV CLASS</B></A><!--
+ NEXT CLASS
+-->
+ <A HREF="TinyMCE_Selection.html"><B>NEXT CLASS</B></A></FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="index.html" TARGET="_top"><B>FRAMES</B></A>
+ <A HREF="TinyMCE_Popup.html" TARGET="_top"><B>NO FRAMES</B></A>
+
+<SCRIPT>
+ <!--
+ if(window==top) {
+ document.writeln('<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>');
+ }
+ //-->
+</SCRIPT>
+<NOSCRIPT>
+<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>
+</NOSCRIPT>
+</FONT></TD>
+</TR>
+<TR>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+ SUMMARY: <A HREF="#field_summary">FIELD</A> | <A HREF="#constructor_summary">CONSTR</A> | <A HREF="#method_summary">METHOD</A></FONT></TD>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+DETAIL: <A HREF="#field_detail">FIELD</A> | <A HREF="#constructor_detail">CONSTR</A> | <A HREF="#method_detail">METHOD</A></FONT></TD>
+</TR>
+</TABLE>
+
+<!-- =========== END OF NAVBAR =========== -->
+
+<HR>
+<FONT SIZE="-1">
+
+</FONT>
+<div class="jsdoc_ctime">Documentation generated by <a href="http://jsdoc.sourceforge.net/" target="_parent">JSDoc</a> on Fri Apr 14 21:59:23 2006</div>
+</BODY>
+</HTML>
Deleted: trunk/htdocs/js/tinymce/docs/tinymce_api/TinyMCE_Selection.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/tinymce_api/TinyMCE_Selection.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/tinymce_api/TinyMCE_Selection.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,732 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN""http://www.w3.org/TR/REC-html40/loose.dtd">
-<!--NewPage-->
-<HTML>
-<HEAD>
-<TITLE>
-TinyMCE_Selection
-</TITLE>
-<LINK REL ="stylesheet" TYPE="text/css" HREF="stylesheet.css" TITLE="Style">
-</HEAD>
-<SCRIPT>
-function asd()
-{
-parent.document.title="TinyMCE_Selection";
-}
-</SCRIPT>
-<BODY BGCOLOR="white" onload="asd();">
-
-<!-- ========== START OF NAVBAR ========== -->
-<A NAME="navbar_bottom"><!-- --></A>
-<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0">
-<TR>
-<TD COLSPAN=3 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
-<A NAME="navbar_bottom_firstrow"><!-- --></A>
-<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3">
- <TR ALIGN="center" VALIGN="top">
- <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="overview-summary.html"><FONT CLASS="NavBarFont1"><B>Overview</B></FONT></A> </TD>
- <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="overview-summary-TinyMCE_Selection.class.js.html"><FONT CLASS="NavBarFont1"><B>File</B></FONT></A> </TD>
- <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> <FONT CLASS="NavBarFont1Rev"><B>Class</B></FONT> </TD>
- <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="overview-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A> </TD>
- <!--TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"--> <!--A HREF="deprecated-list.html"--><!--FONT CLASS="NavBarFont1">Deprecated</FONT--><!--/A--><!-- </TD-->
- <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="index-all.html"--><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
- <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
- </TR>
-</TABLE>
-</TD>
-<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
-<B></B>
-</EM>
-</TD
-</TR>
-
-<TR>
-<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
- <A HREF="TinyMCE_Popup.html"><B>PREV CLASS</B></A><!--
- NEXT CLASS
--->
- <A HREF="TinyMCE_UndoRedo.html"><B>NEXT CLASS</B></A></FONT></TD>
-<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
- <A HREF="index.html" TARGET="_top"><B>FRAMES</B></A>
- <A HREF="TinyMCE_Selection.html" TARGET="_top"><B>NO FRAMES</B></A>
-
-<SCRIPT>
- <!--
- if(window==top) {
- document.writeln('<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>');
- }
- //-->
-</SCRIPT>
-<NOSCRIPT>
-<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>
-</NOSCRIPT>
-</FONT></TD>
-</TR>
-<TR>
-<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
- SUMMARY: <A HREF="#field_summary">FIELD</A> | <A HREF="#constructor_summary">CONSTR</A> | <A HREF="#method_summary">METHOD</A></FONT></TD>
-<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
-DETAIL: <A HREF="#field_detail">FIELD</A> | <A HREF="#constructor_detail">CONSTR</A> | <A HREF="#method_detail">METHOD</A></FONT></TD>
-</TR>
-</TABLE>
-<!-- =========== END OF NAVBAR =========== -->
-<HR>
-
-<!-- ======== START OF CLASS DATA ======== -->
-<H2>Class TinyMCE_Selection</H2>
-<PRE>Object
- |
- +--<b>TinyMCE_Selection</b>
-</PRE>
-
-
-<HR>
-<DL>
- <!-- Class definition -->
- <DT>class
- <B>TinyMCE_Selection</B>
-
-
-</DL>
-
- <P>
- <I>Defined in <a href='overview-summary-TinyMCE_Selection.class.js.html'>TinyMCE_Selection.class.js</a></I><BR/><BR/>
- </P>
-
- <HR>
-
-<!-- ======== NESTED CLASS SUMMARY ======== -->
-
-<!-- ======== END NESTED CLASS SUMMARY ======== -->
-
-
-<!-- =========== FIELD SUMMARY =========== -->
-
- <A NAME="field_summary"><!-- --></A>
- <TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" WIDTH="100%">
- <TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
- <TD COLSPAN=2><FONT SIZE="+2">
- <B>Field Summary</B></FONT></TD>
- </TR>
-
- <!-- This is one instance field summary -->
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
- <CODE> Object</CODE></FONT></TD>
- <TD><CODE><B><A HREF="#instance">instance</A></B></CODE>
- <BR>
- </TD>
- </TR>
-
-
- </TABLE>
-
-
-
-
-
-<!-- =========== END FIELD SUMMARY =========== -->
-
-
-<!-- ======== CONSTRUCTOR SUMMARY ======== -->
-
-<A NAME="constructor_summary"><!-- --></A>
-<TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" WIDTH="100%">
-<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
-<TD COLSPAN=2><FONT SIZE="+2">
-<B>Constructor Summary</B></FONT></TD>
-</TR>
-<TR BGCOLOR="white" CLASS="TableRowColor">
- <TD>
- <CODE>
- <B>
- <A HREF="TinyMCE_Selection.html#TinyMCE_Selection()">TinyMCE_Selection</A>
- </B>
- (<<a href="TinyMCE_Control.html">TinyMCE_Control</a>> inst)
- </CODE>
- <BR>
-
- Constructs a Selection instance and binds it to the specificed TinyMCE editor control.
- </TD>
-</TR>
-</TABLE>
-
-<!-- ======== END CONSTRUCTOR SUMMARY ======== -->
-
-
-
-<!-- ========== METHOD SUMMARY =========== -->
-
-<A NAME="method_summary"><!-- --></A>
-<TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" WIDTH="100%">
-<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
-<TD COLSPAN=2><FONT SIZE="+2">
-<B>Method Summary</B></FONT></TD>
-</TR>
-
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> TinyMCE_Bookmark</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#getBookmark">getBookmark</A></B>(<boolean> simple)
- </CODE>
- <BR>
-
- Returns a selection bookmark that can be restored later with moveToBookmark.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> HTMLElement</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#getFocusElement">getFocusElement</A></B>()
- </CODE>
- <BR>
-
- Returns the currently selected/focused element.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> DOMRange</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#getRng">getRng</A></B>()
- </CODE>
- <BR>
-
- Returns the browsers selections first range instance.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> DOMSelection</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#getSel">getSel</A></B>()
- </CODE>
- <BR>
-
- Returns the browsers selection instance.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> string</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#getSelectedHTML">getSelectedHTML</A></B>()
- </CODE>
- <BR>
-
- Returns the selected HTML code.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> string</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#getSelectedText">getSelectedText</A></B>()
- </CODE>
- <BR>
-
- Returns the selected text.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> boolean</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#moveToBookmark">moveToBookmark</A></B>(<TinyMCE_Bookmark> bookmark)
- </CODE>
- <BR>
-
- Restores the selection to the specified bookmark.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> void</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#scrollToNode">scrollToNode</A></B>(<HTMLNode> node)
- </CODE>
- <BR>
-
- Scrolls to the specified node location.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> void</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#selectNode">selectNode</A></B>(<HTMLNode> node, <boolean> collapse, <boolean> select_text_node, <boolean> to_start)
- </CODE>
- <BR>
-
- Selects the specified node.
- </TD>
- </TR>
-
-
-</TABLE>
-
-
-
-<P>
-<!-- ========== END METHOD SUMMARY =========== -->
-
-
-<!-- ============ FIELD DETAIL START =========== -->
-
- <A NAME="field_detail"><!-- --></A>
- <TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" WIDTH="100%">
- <TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
- <TD COLSPAN=1><FONT SIZE="+2"><B>Field Detail</B></FONT></TD>
- </TR>
- </TABLE>
-
-
- <A NAME="instance"><!-- --></A>
- <H3>instance</H3>
- <PRE>Object <B>instance</B></PRE>
- <UL>
-
-
- </UL>
- <HR>
-
-
-
-<!-- ============ FIELD DETAIL END =========== -->
-
- <!-- ========= CONSTRUCTOR DETAIL START ======== -->
-
-<A NAME="constructor_detail"><!-- --></A>
-<TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" WIDTH="100%">
- <TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
- <TD COLSPAN=1>
- <FONT SIZE="+2"><B>Constructor Detail</B></FONT>
- </TD>
- </TR>
-</TABLE>
-
-<A NAME="TinyMCE_Selection()"><!-- --></A><H3>
-TinyMCE_Selection</H3>
-<PRE><B>TinyMCE_Selection</B>(<<a href="TinyMCE_Control.html">TinyMCE_Control</a>> inst)</PRE>
-
-
-<UL>
- Constructs a Selection instance and binds it to the specificed TinyMCE editor control.
-</UL>
-
-
-
- <UL>
- <B>Parameters:</B>
-
- <UL><CODE>inst</CODE> - TinyMCE editor control instance.
- </UL>
-
-
- </UL>
-
-
-<!-- Constructor return value(s) -->
-
-<!-- End constructor return value(s) -->
-
-<!-- ADDITIONAL ATTRIBUTES -->
-
-<HR/>
-<!-- END ADDITIONAL ATTRIBUTES -->
-
-<!-- ========= CONSTRUCTOR DETAIL END ======== -->
-
-
-<!-- ============ METHOD DETAIL START ========== -->
-
-<A NAME="method_detail"><!-- --></A>
-<TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" WIDTH="100%">
- <TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
- <TD COLSPAN=1><FONT SIZE="+2">
- <B>Method Detail</B></FONT>
- </TD>
- </TR>
-</TABLE>
-
-<!-- One single method detail entry -->
-
- <A NAME="getBookmark"><!-- --></A>
- <H3>getBookmark</H3>
- <PRE>TinyMCE_Bookmark <B>getBookmark</B>(<boolean> simple)</PRE>
-
- <UL>Returns a selection bookmark that can be restored later with moveToBookmark.
- This acts much like the one MSIE has built in but this one is persistent if between DOM
- tree rewritings. The simple mode enables a quicker and non persistent bookmark.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <UL>
- <B>Parameters:</B>
-
- <UL><CODE>simple</CODE> - If this is set to true, the selection bookmark will not me dom persistent.
- </UL>
-
- </UL>
-
- <!-- METHOD PARAMETERS END -->
-
-
- <UL>
- <B>Returns:</B>
- <UL>
- Selection bookmark that can be restored later with moveToBookmark.
- </UL>
- </UL>
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="getFocusElement"><!-- --></A>
- <H3>getFocusElement</H3>
- <PRE>HTMLElement <B>getFocusElement</B>()</PRE>
-
- <UL>Returns the currently selected/focused element.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <!-- METHOD PARAMETERS END -->
-
-
- <UL>
- <B>Returns:</B>
- <UL>
- Currently selected element.
- </UL>
- </UL>
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="getRng"><!-- --></A>
- <H3>getRng</H3>
- <PRE>DOMRange <B>getRng</B>()</PRE>
-
- <UL>Returns the browsers selections first range instance.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <!-- METHOD PARAMETERS END -->
-
-
- <UL>
- <B>Returns:</B>
- <UL>
- Browsers selections first range instance.
- </UL>
- </UL>
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="getSel"><!-- --></A>
- <H3>getSel</H3>
- <PRE>DOMSelection <B>getSel</B>()</PRE>
-
- <UL>Returns the browsers selection instance.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <!-- METHOD PARAMETERS END -->
-
-
- <UL>
- <B>Returns:</B>
- <UL>
- Browser selection instance.
- </UL>
- </UL>
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="getSelectedHTML"><!-- --></A>
- <H3>getSelectedHTML</H3>
- <PRE>string <B>getSelectedHTML</B>()</PRE>
-
- <UL>Returns the selected HTML code.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <!-- METHOD PARAMETERS END -->
-
-
- <UL>
- <B>Returns:</B>
- <UL>
- Selected HTML contents.
- </UL>
- </UL>
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="getSelectedText"><!-- --></A>
- <H3>getSelectedText</H3>
- <PRE>string <B>getSelectedText</B>()</PRE>
-
- <UL>Returns the selected text.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <!-- METHOD PARAMETERS END -->
-
-
- <UL>
- <B>Returns:</B>
- <UL>
- Selected text contents.
- </UL>
- </UL>
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="moveToBookmark"><!-- --></A>
- <H3>moveToBookmark</H3>
- <PRE>boolean <B>moveToBookmark</B>(<TinyMCE_Bookmark> bookmark)</PRE>
-
- <UL>Restores the selection to the specified bookmark.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <UL>
- <B>Parameters:</B>
-
- <UL><CODE>bookmark</CODE> - Bookmark to restore selection from.
- </UL>
-
- </UL>
-
- <!-- METHOD PARAMETERS END -->
-
-
- <UL>
- <B>Returns:</B>
- <UL>
- true/false if it was successful or not.
- </UL>
- </UL>
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="scrollToNode"><!-- --></A>
- <H3>scrollToNode</H3>
- <PRE>void <B>scrollToNode</B>(<HTMLNode> node)</PRE>
-
- <UL>Scrolls to the specified node location.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <UL>
- <B>Parameters:</B>
-
- <UL><CODE>node</CODE> - Node to scroll to.
- </UL>
-
- </UL>
-
- <!-- METHOD PARAMETERS END -->
-
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="selectNode"><!-- --></A>
- <H3>selectNode</H3>
- <PRE>void <B>selectNode</B>(<HTMLNode> node, <boolean> collapse, <boolean> select_text_node, <boolean> to_start)</PRE>
-
- <UL>Selects the specified node.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <UL>
- <B>Parameters:</B>
-
- <UL><CODE>node</CODE> - Node object to move selection to.
- </UL>
-
- <UL><CODE>collapse</CODE> - True/false if it will be collasped.
- </UL>
-
- <UL><CODE>select_text_node</CODE> - True/false if the text contents should be selected or not.
- </UL>
-
- <UL><CODE>to_start</CODE> - True/false if the collapse should be to start or end of range.
- </UL>
-
- </UL>
-
- <!-- METHOD PARAMETERS END -->
-
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
-
-
-<!-- ============ METHOD DETAIL END ========== -->
-
-<!-- ========= END OF CLASS DATA ========= -->
-
-<!-- ========== START OF NAVBAR ========== -->
-<A NAME="navbar_bottom"><!-- --></A>
-<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0">
-<TR>
-<TD COLSPAN=3 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
-<A NAME="navbar_bottom_firstrow"><!-- --></A>
-<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3">
- <TR ALIGN="center" VALIGN="top">
- <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="overview-summary.html"><FONT CLASS="NavBarFont1"><B>Overview</B></FONT></A> </TD>
- <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="overview-summary-TinyMCE_Selection.class.js.html"><FONT CLASS="NavBarFont1"><B>File</B></FONT></A> </TD>
- <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> <FONT CLASS="NavBarFont1Rev"><B>Class</B></FONT> </TD>
- <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="overview-tree.html"><FONT CLASS="NavBarFont1"><b>Tree</b></FONT></A> </TD>
- <!--TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"--> <!--A HREF="deprecated-list.html"--><!--FONT CLASS="NavBarFont1">Deprecated</FONT--><!--/A--><!-- </TD-->
- <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
- <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
- </TR>
-</TABLE>
-</TD>
-<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
-<B></B>
-</EM>
-</TD
-</TR>
-
-<TR>
-<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
- <A HREF="TinyMCE_Popup.html"><B>PREV CLASS</B></A><!--
- NEXT CLASS
--->
- <A HREF="TinyMCE_UndoRedo.html"><B>NEXT CLASS</B></A></FONT></TD>
-<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
- <A HREF="index.html" TARGET="_top"><B>FRAMES</B></A>
- <A HREF="TinyMCE_Selection.html" TARGET="_top"><B>NO FRAMES</B></A>
-
-<SCRIPT>
- <!--
- if(window==top) {
- document.writeln('<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>');
- }
- //-->
-</SCRIPT>
-<NOSCRIPT>
-<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>
-</NOSCRIPT>
-</FONT></TD>
-</TR>
-<TR>
-<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
- SUMMARY: <A HREF="#field_summary">FIELD</A> | <A HREF="#constructor_summary">CONSTR</A> | <A HREF="#method_summary">METHOD</A></FONT></TD>
-<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
-DETAIL: <A HREF="#field_detail">FIELD</A> | <A HREF="#constructor_detail">CONSTR</A> | <A HREF="#method_detail">METHOD</A></FONT></TD>
-</TR>
-</TABLE>
-
-<!-- =========== END OF NAVBAR =========== -->
-
-<HR>
-<FONT SIZE="-1">
-
-</FONT>
-<div class="jsdoc_ctime">Documentation generated by <a href="http://jsdoc.sourceforge.net/" target="_parent">JSDoc</a> on Fri Apr 14 21:59:23 2006</div>
-</BODY>
-</HTML>
Copied: trunk/htdocs/js/tinymce/docs/tinymce_api/TinyMCE_Selection.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/tinymce_api/TinyMCE_Selection.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/tinymce_api/TinyMCE_Selection.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/tinymce_api/TinyMCE_Selection.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,732 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN""http://www.w3.org/TR/REC-html40/loose.dtd">
+<!--NewPage-->
+<HTML>
+<HEAD>
+<TITLE>
+TinyMCE_Selection
+</TITLE>
+<LINK REL ="stylesheet" TYPE="text/css" HREF="stylesheet.css" TITLE="Style">
+</HEAD>
+<SCRIPT>
+function asd()
+{
+parent.document.title="TinyMCE_Selection";
+}
+</SCRIPT>
+<BODY BGCOLOR="white" onload="asd();">
+
+<!-- ========== START OF NAVBAR ========== -->
+<A NAME="navbar_bottom"><!-- --></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0">
+<TR>
+<TD COLSPAN=3 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_bottom_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3">
+ <TR ALIGN="center" VALIGN="top">
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="overview-summary.html"><FONT CLASS="NavBarFont1"><B>Overview</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="overview-summary-TinyMCE_Selection.class.js.html"><FONT CLASS="NavBarFont1"><B>File</B></FONT></A> </TD>
+ <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> <FONT CLASS="NavBarFont1Rev"><B>Class</B></FONT> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="overview-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A> </TD>
+ <!--TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"--> <!--A HREF="deprecated-list.html"--><!--FONT CLASS="NavBarFont1">Deprecated</FONT--><!--/A--><!-- </TD-->
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="index-all.html"--><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
+ </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+<B></B>
+</EM>
+</TD
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="TinyMCE_Popup.html"><B>PREV CLASS</B></A><!--
+ NEXT CLASS
+-->
+ <A HREF="TinyMCE_UndoRedo.html"><B>NEXT CLASS</B></A></FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="index.html" TARGET="_top"><B>FRAMES</B></A>
+ <A HREF="TinyMCE_Selection.html" TARGET="_top"><B>NO FRAMES</B></A>
+
+<SCRIPT>
+ <!--
+ if(window==top) {
+ document.writeln('<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>');
+ }
+ //-->
+</SCRIPT>
+<NOSCRIPT>
+<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>
+</NOSCRIPT>
+</FONT></TD>
+</TR>
+<TR>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+ SUMMARY: <A HREF="#field_summary">FIELD</A> | <A HREF="#constructor_summary">CONSTR</A> | <A HREF="#method_summary">METHOD</A></FONT></TD>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+DETAIL: <A HREF="#field_detail">FIELD</A> | <A HREF="#constructor_detail">CONSTR</A> | <A HREF="#method_detail">METHOD</A></FONT></TD>
+</TR>
+</TABLE>
+<!-- =========== END OF NAVBAR =========== -->
+<HR>
+
+<!-- ======== START OF CLASS DATA ======== -->
+<H2>Class TinyMCE_Selection</H2>
+<PRE>Object
+ |
+ +--<b>TinyMCE_Selection</b>
+</PRE>
+
+
+<HR>
+<DL>
+ <!-- Class definition -->
+ <DT>class
+ <B>TinyMCE_Selection</B>
+
+
+</DL>
+
+ <P>
+ <I>Defined in <a href='overview-summary-TinyMCE_Selection.class.js.html'>TinyMCE_Selection.class.js</a></I><BR/><BR/>
+ </P>
+
+ <HR>
+
+<!-- ======== NESTED CLASS SUMMARY ======== -->
+
+<!-- ======== END NESTED CLASS SUMMARY ======== -->
+
+
+<!-- =========== FIELD SUMMARY =========== -->
+
+ <A NAME="field_summary"><!-- --></A>
+ <TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" WIDTH="100%">
+ <TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+ <TD COLSPAN=2><FONT SIZE="+2">
+ <B>Field Summary</B></FONT></TD>
+ </TR>
+
+ <!-- This is one instance field summary -->
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+ <CODE> Object</CODE></FONT></TD>
+ <TD><CODE><B><A HREF="#instance">instance</A></B></CODE>
+ <BR>
+ </TD>
+ </TR>
+
+
+ </TABLE>
+
+
+
+
+
+<!-- =========== END FIELD SUMMARY =========== -->
+
+
+<!-- ======== CONSTRUCTOR SUMMARY ======== -->
+
+<A NAME="constructor_summary"><!-- --></A>
+<TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" WIDTH="100%">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TD COLSPAN=2><FONT SIZE="+2">
+<B>Constructor Summary</B></FONT></TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="TinyMCE_Selection.html#TinyMCE_Selection()">TinyMCE_Selection</A>
+ </B>
+ (<<a href="TinyMCE_Control.html">TinyMCE_Control</a>> inst)
+ </CODE>
+ <BR>
+
+ Constructs a Selection instance and binds it to the specificed TinyMCE editor control.
+ </TD>
+</TR>
+</TABLE>
+
+<!-- ======== END CONSTRUCTOR SUMMARY ======== -->
+
+
+
+<!-- ========== METHOD SUMMARY =========== -->
+
+<A NAME="method_summary"><!-- --></A>
+<TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" WIDTH="100%">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TD COLSPAN=2><FONT SIZE="+2">
+<B>Method Summary</B></FONT></TD>
+</TR>
+
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> TinyMCE_Bookmark</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#getBookmark">getBookmark</A></B>(<boolean> simple)
+ </CODE>
+ <BR>
+
+ Returns a selection bookmark that can be restored later with moveToBookmark.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> HTMLElement</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#getFocusElement">getFocusElement</A></B>()
+ </CODE>
+ <BR>
+
+ Returns the currently selected/focused element.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> DOMRange</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#getRng">getRng</A></B>()
+ </CODE>
+ <BR>
+
+ Returns the browsers selections first range instance.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> DOMSelection</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#getSel">getSel</A></B>()
+ </CODE>
+ <BR>
+
+ Returns the browsers selection instance.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> string</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#getSelectedHTML">getSelectedHTML</A></B>()
+ </CODE>
+ <BR>
+
+ Returns the selected HTML code.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> string</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#getSelectedText">getSelectedText</A></B>()
+ </CODE>
+ <BR>
+
+ Returns the selected text.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> boolean</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#moveToBookmark">moveToBookmark</A></B>(<TinyMCE_Bookmark> bookmark)
+ </CODE>
+ <BR>
+
+ Restores the selection to the specified bookmark.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> void</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#scrollToNode">scrollToNode</A></B>(<HTMLNode> node)
+ </CODE>
+ <BR>
+
+ Scrolls to the specified node location.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> void</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#selectNode">selectNode</A></B>(<HTMLNode> node, <boolean> collapse, <boolean> select_text_node, <boolean> to_start)
+ </CODE>
+ <BR>
+
+ Selects the specified node.
+ </TD>
+ </TR>
+
+
+</TABLE>
+
+
+
+<P>
+<!-- ========== END METHOD SUMMARY =========== -->
+
+
+<!-- ============ FIELD DETAIL START =========== -->
+
+ <A NAME="field_detail"><!-- --></A>
+ <TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" WIDTH="100%">
+ <TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+ <TD COLSPAN=1><FONT SIZE="+2"><B>Field Detail</B></FONT></TD>
+ </TR>
+ </TABLE>
+
+
+ <A NAME="instance"><!-- --></A>
+ <H3>instance</H3>
+ <PRE>Object <B>instance</B></PRE>
+ <UL>
+
+
+ </UL>
+ <HR>
+
+
+
+<!-- ============ FIELD DETAIL END =========== -->
+
+ <!-- ========= CONSTRUCTOR DETAIL START ======== -->
+
+<A NAME="constructor_detail"><!-- --></A>
+<TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" WIDTH="100%">
+ <TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+ <TD COLSPAN=1>
+ <FONT SIZE="+2"><B>Constructor Detail</B></FONT>
+ </TD>
+ </TR>
+</TABLE>
+
+<A NAME="TinyMCE_Selection()"><!-- --></A><H3>
+TinyMCE_Selection</H3>
+<PRE><B>TinyMCE_Selection</B>(<<a href="TinyMCE_Control.html">TinyMCE_Control</a>> inst)</PRE>
+
+
+<UL>
+ Constructs a Selection instance and binds it to the specificed TinyMCE editor control.
+</UL>
+
+
+
+ <UL>
+ <B>Parameters:</B>
+
+ <UL><CODE>inst</CODE> - TinyMCE editor control instance.
+ </UL>
+
+
+ </UL>
+
+
+<!-- Constructor return value(s) -->
+
+<!-- End constructor return value(s) -->
+
+<!-- ADDITIONAL ATTRIBUTES -->
+
+<HR/>
+<!-- END ADDITIONAL ATTRIBUTES -->
+
+<!-- ========= CONSTRUCTOR DETAIL END ======== -->
+
+
+<!-- ============ METHOD DETAIL START ========== -->
+
+<A NAME="method_detail"><!-- --></A>
+<TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" WIDTH="100%">
+ <TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+ <TD COLSPAN=1><FONT SIZE="+2">
+ <B>Method Detail</B></FONT>
+ </TD>
+ </TR>
+</TABLE>
+
+<!-- One single method detail entry -->
+
+ <A NAME="getBookmark"><!-- --></A>
+ <H3>getBookmark</H3>
+ <PRE>TinyMCE_Bookmark <B>getBookmark</B>(<boolean> simple)</PRE>
+
+ <UL>Returns a selection bookmark that can be restored later with moveToBookmark.
+ This acts much like the one MSIE has built in but this one is persistent if between DOM
+ tree rewritings. The simple mode enables a quicker and non persistent bookmark.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <UL>
+ <B>Parameters:</B>
+
+ <UL><CODE>simple</CODE> - If this is set to true, the selection bookmark will not me dom persistent.
+ </UL>
+
+ </UL>
+
+ <!-- METHOD PARAMETERS END -->
+
+
+ <UL>
+ <B>Returns:</B>
+ <UL>
+ Selection bookmark that can be restored later with moveToBookmark.
+ </UL>
+ </UL>
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="getFocusElement"><!-- --></A>
+ <H3>getFocusElement</H3>
+ <PRE>HTMLElement <B>getFocusElement</B>()</PRE>
+
+ <UL>Returns the currently selected/focused element.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <!-- METHOD PARAMETERS END -->
+
+
+ <UL>
+ <B>Returns:</B>
+ <UL>
+ Currently selected element.
+ </UL>
+ </UL>
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="getRng"><!-- --></A>
+ <H3>getRng</H3>
+ <PRE>DOMRange <B>getRng</B>()</PRE>
+
+ <UL>Returns the browsers selections first range instance.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <!-- METHOD PARAMETERS END -->
+
+
+ <UL>
+ <B>Returns:</B>
+ <UL>
+ Browsers selections first range instance.
+ </UL>
+ </UL>
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="getSel"><!-- --></A>
+ <H3>getSel</H3>
+ <PRE>DOMSelection <B>getSel</B>()</PRE>
+
+ <UL>Returns the browsers selection instance.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <!-- METHOD PARAMETERS END -->
+
+
+ <UL>
+ <B>Returns:</B>
+ <UL>
+ Browser selection instance.
+ </UL>
+ </UL>
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="getSelectedHTML"><!-- --></A>
+ <H3>getSelectedHTML</H3>
+ <PRE>string <B>getSelectedHTML</B>()</PRE>
+
+ <UL>Returns the selected HTML code.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <!-- METHOD PARAMETERS END -->
+
+
+ <UL>
+ <B>Returns:</B>
+ <UL>
+ Selected HTML contents.
+ </UL>
+ </UL>
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="getSelectedText"><!-- --></A>
+ <H3>getSelectedText</H3>
+ <PRE>string <B>getSelectedText</B>()</PRE>
+
+ <UL>Returns the selected text.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <!-- METHOD PARAMETERS END -->
+
+
+ <UL>
+ <B>Returns:</B>
+ <UL>
+ Selected text contents.
+ </UL>
+ </UL>
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="moveToBookmark"><!-- --></A>
+ <H3>moveToBookmark</H3>
+ <PRE>boolean <B>moveToBookmark</B>(<TinyMCE_Bookmark> bookmark)</PRE>
+
+ <UL>Restores the selection to the specified bookmark.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <UL>
+ <B>Parameters:</B>
+
+ <UL><CODE>bookmark</CODE> - Bookmark to restore selection from.
+ </UL>
+
+ </UL>
+
+ <!-- METHOD PARAMETERS END -->
+
+
+ <UL>
+ <B>Returns:</B>
+ <UL>
+ true/false if it was successful or not.
+ </UL>
+ </UL>
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="scrollToNode"><!-- --></A>
+ <H3>scrollToNode</H3>
+ <PRE>void <B>scrollToNode</B>(<HTMLNode> node)</PRE>
+
+ <UL>Scrolls to the specified node location.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <UL>
+ <B>Parameters:</B>
+
+ <UL><CODE>node</CODE> - Node to scroll to.
+ </UL>
+
+ </UL>
+
+ <!-- METHOD PARAMETERS END -->
+
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="selectNode"><!-- --></A>
+ <H3>selectNode</H3>
+ <PRE>void <B>selectNode</B>(<HTMLNode> node, <boolean> collapse, <boolean> select_text_node, <boolean> to_start)</PRE>
+
+ <UL>Selects the specified node.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <UL>
+ <B>Parameters:</B>
+
+ <UL><CODE>node</CODE> - Node object to move selection to.
+ </UL>
+
+ <UL><CODE>collapse</CODE> - True/false if it will be collasped.
+ </UL>
+
+ <UL><CODE>select_text_node</CODE> - True/false if the text contents should be selected or not.
+ </UL>
+
+ <UL><CODE>to_start</CODE> - True/false if the collapse should be to start or end of range.
+ </UL>
+
+ </UL>
+
+ <!-- METHOD PARAMETERS END -->
+
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+
+
+<!-- ============ METHOD DETAIL END ========== -->
+
+<!-- ========= END OF CLASS DATA ========= -->
+
+<!-- ========== START OF NAVBAR ========== -->
+<A NAME="navbar_bottom"><!-- --></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0">
+<TR>
+<TD COLSPAN=3 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_bottom_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3">
+ <TR ALIGN="center" VALIGN="top">
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="overview-summary.html"><FONT CLASS="NavBarFont1"><B>Overview</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="overview-summary-TinyMCE_Selection.class.js.html"><FONT CLASS="NavBarFont1"><B>File</B></FONT></A> </TD>
+ <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> <FONT CLASS="NavBarFont1Rev"><B>Class</B></FONT> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="overview-tree.html"><FONT CLASS="NavBarFont1"><b>Tree</b></FONT></A> </TD>
+ <!--TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"--> <!--A HREF="deprecated-list.html"--><!--FONT CLASS="NavBarFont1">Deprecated</FONT--><!--/A--><!-- </TD-->
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
+ </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+<B></B>
+</EM>
+</TD
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="TinyMCE_Popup.html"><B>PREV CLASS</B></A><!--
+ NEXT CLASS
+-->
+ <A HREF="TinyMCE_UndoRedo.html"><B>NEXT CLASS</B></A></FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="index.html" TARGET="_top"><B>FRAMES</B></A>
+ <A HREF="TinyMCE_Selection.html" TARGET="_top"><B>NO FRAMES</B></A>
+
+<SCRIPT>
+ <!--
+ if(window==top) {
+ document.writeln('<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>');
+ }
+ //-->
+</SCRIPT>
+<NOSCRIPT>
+<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>
+</NOSCRIPT>
+</FONT></TD>
+</TR>
+<TR>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+ SUMMARY: <A HREF="#field_summary">FIELD</A> | <A HREF="#constructor_summary">CONSTR</A> | <A HREF="#method_summary">METHOD</A></FONT></TD>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+DETAIL: <A HREF="#field_detail">FIELD</A> | <A HREF="#constructor_detail">CONSTR</A> | <A HREF="#method_detail">METHOD</A></FONT></TD>
+</TR>
+</TABLE>
+
+<!-- =========== END OF NAVBAR =========== -->
+
+<HR>
+<FONT SIZE="-1">
+
+</FONT>
+<div class="jsdoc_ctime">Documentation generated by <a href="http://jsdoc.sourceforge.net/" target="_parent">JSDoc</a> on Fri Apr 14 21:59:23 2006</div>
+</BODY>
+</HTML>
Deleted: trunk/htdocs/js/tinymce/docs/tinymce_api/TinyMCE_UndoRedo.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/tinymce_api/TinyMCE_UndoRedo.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/tinymce_api/TinyMCE_UndoRedo.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,513 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN""http://www.w3.org/TR/REC-html40/loose.dtd">
-<!--NewPage-->
-<HTML>
-<HEAD>
-<TITLE>
-TinyMCE_UndoRedo
-</TITLE>
-<LINK REL ="stylesheet" TYPE="text/css" HREF="stylesheet.css" TITLE="Style">
-</HEAD>
-<SCRIPT>
-function asd()
-{
-parent.document.title="TinyMCE_UndoRedo";
-}
-</SCRIPT>
-<BODY BGCOLOR="white" onload="asd();">
-
-<!-- ========== START OF NAVBAR ========== -->
-<A NAME="navbar_bottom"><!-- --></A>
-<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0">
-<TR>
-<TD COLSPAN=3 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
-<A NAME="navbar_bottom_firstrow"><!-- --></A>
-<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3">
- <TR ALIGN="center" VALIGN="top">
- <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="overview-summary.html"><FONT CLASS="NavBarFont1"><B>Overview</B></FONT></A> </TD>
- <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="overview-summary-TinyMCE_UndoRedo.class.js.html"><FONT CLASS="NavBarFont1"><B>File</B></FONT></A> </TD>
- <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> <FONT CLASS="NavBarFont1Rev"><B>Class</B></FONT> </TD>
- <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="overview-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A> </TD>
- <!--TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"--> <!--A HREF="deprecated-list.html"--><!--FONT CLASS="NavBarFont1">Deprecated</FONT--><!--/A--><!-- </TD-->
- <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="index-all.html"--><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
- <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
- </TR>
-</TABLE>
-</TD>
-<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
-<B></B>
-</EM>
-</TD
-</TR>
-
-<TR>
-<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
- <A HREF="TinyMCE_Selection.html"><B>PREV CLASS</B></A><!--
- NEXT CLASS
--->
- <B>NEXT CLASS</B></FONT></TD>
-<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
- <A HREF="index.html" TARGET="_top"><B>FRAMES</B></A>
- <A HREF="TinyMCE_UndoRedo.html" TARGET="_top"><B>NO FRAMES</B></A>
-
-<SCRIPT>
- <!--
- if(window==top) {
- document.writeln('<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>');
- }
- //-->
-</SCRIPT>
-<NOSCRIPT>
-<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>
-</NOSCRIPT>
-</FONT></TD>
-</TR>
-<TR>
-<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
- SUMMARY: <A HREF="#field_summary">FIELD</A> | <A HREF="#constructor_summary">CONSTR</A> | <A HREF="#method_summary">METHOD</A></FONT></TD>
-<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
-DETAIL: <A HREF="#field_detail">FIELD</A> | <A HREF="#constructor_detail">CONSTR</A> | <A HREF="#method_detail">METHOD</A></FONT></TD>
-</TR>
-</TABLE>
-<!-- =========== END OF NAVBAR =========== -->
-<HR>
-
-<!-- ======== START OF CLASS DATA ======== -->
-<H2>Class TinyMCE_UndoRedo</H2>
-<PRE>Object
- |
- +--<b>TinyMCE_UndoRedo</b>
-</PRE>
-
-
-<HR>
-<DL>
- <!-- Class definition -->
- <DT>class
- <B>TinyMCE_UndoRedo</B>
-
-
-</DL>
-
- <P>
- <I>Defined in <a href='overview-summary-TinyMCE_UndoRedo.class.js.html'>TinyMCE_UndoRedo.class.js</a></I><BR/><BR/>
- </P>
-
- <HR>
-
-<!-- ======== NESTED CLASS SUMMARY ======== -->
-
-<!-- ======== END NESTED CLASS SUMMARY ======== -->
-
-
-<!-- =========== FIELD SUMMARY =========== -->
-
- <A NAME="field_summary"><!-- --></A>
- <TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" WIDTH="100%">
- <TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
- <TD COLSPAN=2><FONT SIZE="+2">
- <B>Field Summary</B></FONT></TD>
- </TR>
-
- <!-- This is one instance field summary -->
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
- <CODE> Object</CODE></FONT></TD>
- <TD><CODE><B><A HREF="#instance">instance</A></B></CODE>
- <BR>
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
- <CODE> Object</CODE></FONT></TD>
- <TD><CODE><B><A HREF="#typingUndoIndex">typingUndoIndex</A></B></CODE>
- <BR>
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
- <CODE> Object</CODE></FONT></TD>
- <TD><CODE><B><A HREF="#undoIndex">undoIndex</A></B></CODE>
- <BR>
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
- <CODE> Object</CODE></FONT></TD>
- <TD><CODE><B><A HREF="#undoLevels">undoLevels</A></B></CODE>
- <BR>
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
- <CODE> Object</CODE></FONT></TD>
- <TD><CODE><B><A HREF="#undoRedo">undoRedo</A></B></CODE>
- <BR>
- </TD>
- </TR>
-
-
- </TABLE>
-
-
-
-
-
-<!-- =========== END FIELD SUMMARY =========== -->
-
-
-<!-- ======== CONSTRUCTOR SUMMARY ======== -->
-
-<A NAME="constructor_summary"><!-- --></A>
-<TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" WIDTH="100%">
-<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
-<TD COLSPAN=2><FONT SIZE="+2">
-<B>Constructor Summary</B></FONT></TD>
-</TR>
-<TR BGCOLOR="white" CLASS="TableRowColor">
- <TD>
- <CODE>
- <B>
- <A HREF="TinyMCE_UndoRedo.html#TinyMCE_UndoRedo()">TinyMCE_UndoRedo</A>
- </B>
- (<<a href="TinyMCE_Control.html">TinyMCE_Control</a>> inst)
- </CODE>
- <BR>
-
- Constructs a undo redo instance, this instance handles the custom undo/redo handeling in TinyMCE.
- </TD>
-</TR>
-</TABLE>
-
-<!-- ======== END CONSTRUCTOR SUMMARY ======== -->
-
-
-
-<!-- ========== METHOD SUMMARY =========== -->
-
-<A NAME="method_summary"><!-- --></A>
-<TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" WIDTH="100%">
-<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
-<TD COLSPAN=2><FONT SIZE="+2">
-<B>Method Summary</B></FONT></TD>
-</TR>
-
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> boolean</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#add">add</A></B>(<TinyMCE_UndoRedoLevel> l)
- </CODE>
- <BR>
-
- Adds a new undo level, this will take a snapshot of the current instance HTML or use the specified level.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> void</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#redo">redo</A></B>()
- </CODE>
- <BR>
-
- Performes a undo action, this will restore the HTML contents of the editor to a former undoed state.
- </TD>
- </TR>
-
- <TR BGCOLOR="white" CLASS="TableRowColor">
- <TD ALIGN="right" VALIGN="top" WIDTH="1%">
- <FONT SIZE="-1">
- <CODE> void</CODE>
- </FONT>
- </TD>
- <TD>
- <CODE>
- <B>
- <A HREF="#undo">undo</A></B>()
- </CODE>
- <BR>
-
- Performes a undo action, this will restore the HTML contents of the editor to a former state.
- </TD>
- </TR>
-
-
-</TABLE>
-
-
-
-<P>
-<!-- ========== END METHOD SUMMARY =========== -->
-
-
-<!-- ============ FIELD DETAIL START =========== -->
-
- <A NAME="field_detail"><!-- --></A>
- <TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" WIDTH="100%">
- <TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
- <TD COLSPAN=1><FONT SIZE="+2"><B>Field Detail</B></FONT></TD>
- </TR>
- </TABLE>
-
-
- <A NAME="instance"><!-- --></A>
- <H3>instance</H3>
- <PRE>Object <B>instance</B></PRE>
- <UL>
-
-
- </UL>
- <HR>
-
- <A NAME="typingUndoIndex"><!-- --></A>
- <H3>typingUndoIndex</H3>
- <PRE>Object <B>typingUndoIndex</B></PRE>
- <UL>
-
-
- </UL>
- <HR>
-
- <A NAME="undoIndex"><!-- --></A>
- <H3>undoIndex</H3>
- <PRE>Object <B>undoIndex</B></PRE>
- <UL>
-
-
- </UL>
- <HR>
-
- <A NAME="undoLevels"><!-- --></A>
- <H3>undoLevels</H3>
- <PRE>Object <B>undoLevels</B></PRE>
- <UL>
-
-
- </UL>
- <HR>
-
- <A NAME="undoRedo"><!-- --></A>
- <H3>undoRedo</H3>
- <PRE>Object <B>undoRedo</B></PRE>
- <UL>
-
-
- </UL>
- <HR>
-
-
-
-<!-- ============ FIELD DETAIL END =========== -->
-
- <!-- ========= CONSTRUCTOR DETAIL START ======== -->
-
-<A NAME="constructor_detail"><!-- --></A>
-<TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" WIDTH="100%">
- <TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
- <TD COLSPAN=1>
- <FONT SIZE="+2"><B>Constructor Detail</B></FONT>
- </TD>
- </TR>
-</TABLE>
-
-<A NAME="TinyMCE_UndoRedo()"><!-- --></A><H3>
-TinyMCE_UndoRedo</H3>
-<PRE><B>TinyMCE_UndoRedo</B>(<<a href="TinyMCE_Control.html">TinyMCE_Control</a>> inst)</PRE>
-
-
-<UL>
- Constructs a undo redo instance, this instance handles the custom undo/redo handeling in TinyMCE.
-</UL>
-
-
-
- <UL>
- <B>Parameters:</B>
-
- <UL><CODE>inst</CODE> - TinyMCE editor control instance.
- </UL>
-
-
- </UL>
-
-
-<!-- Constructor return value(s) -->
-
-<!-- End constructor return value(s) -->
-
-<!-- ADDITIONAL ATTRIBUTES -->
-
-<HR/>
-<!-- END ADDITIONAL ATTRIBUTES -->
-
-<!-- ========= CONSTRUCTOR DETAIL END ======== -->
-
-
-<!-- ============ METHOD DETAIL START ========== -->
-
-<A NAME="method_detail"><!-- --></A>
-<TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" WIDTH="100%">
- <TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
- <TD COLSPAN=1><FONT SIZE="+2">
- <B>Method Detail</B></FONT>
- </TD>
- </TR>
-</TABLE>
-
-<!-- One single method detail entry -->
-
- <A NAME="add"><!-- --></A>
- <H3>add</H3>
- <PRE>boolean <B>add</B>(<TinyMCE_UndoRedoLevel> l)</PRE>
-
- <UL>Adds a new undo level, this will take a snapshot of the current instance HTML or use the specified level.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <UL>
- <B>Parameters:</B>
-
- <UL><CODE>l</CODE> - Optional undo/redo level to add.
- </UL>
-
- </UL>
-
- <!-- METHOD PARAMETERS END -->
-
-
- <UL>
- <B>Returns:</B>
- <UL>
- true/false on success or failure.
- </UL>
- </UL>
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="redo"><!-- --></A>
- <H3>redo</H3>
- <PRE>void <B>redo</B>()</PRE>
-
- <UL>Performes a undo action, this will restore the HTML contents of the editor to a former undoed state.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <!-- METHOD PARAMETERS END -->
-
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
- <A NAME="undo"><!-- --></A>
- <H3>undo</H3>
- <PRE>void <B>undo</B>()</PRE>
-
- <UL>Performes a undo action, this will restore the HTML contents of the editor to a former state.</UL>
-
-
- <!-- METHOD PARAMETERS START -->
-
- <!-- METHOD PARAMETERS END -->
-
-
-
- <!-- ADDITIONAL ATTRIBUTES START -->
-
- <!-- ADDITIONAL ATTRIBUTES END -->
-<HR>
-
-
-
-<!-- ============ METHOD DETAIL END ========== -->
-
-<!-- ========= END OF CLASS DATA ========= -->
-
-<!-- ========== START OF NAVBAR ========== -->
-<A NAME="navbar_bottom"><!-- --></A>
-<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0">
-<TR>
-<TD COLSPAN=3 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
-<A NAME="navbar_bottom_firstrow"><!-- --></A>
-<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3">
- <TR ALIGN="center" VALIGN="top">
- <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="overview-summary.html"><FONT CLASS="NavBarFont1"><B>Overview</B></FONT></A> </TD>
- <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="overview-summary-TinyMCE_UndoRedo.class.js.html"><FONT CLASS="NavBarFont1"><B>File</B></FONT></A> </TD>
- <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> <FONT CLASS="NavBarFont1Rev"><B>Class</B></FONT> </TD>
- <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="overview-tree.html"><FONT CLASS="NavBarFont1"><b>Tree</b></FONT></A> </TD>
- <!--TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"--> <!--A HREF="deprecated-list.html"--><!--FONT CLASS="NavBarFont1">Deprecated</FONT--><!--/A--><!-- </TD-->
- <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
- <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
- </TR>
-</TABLE>
-</TD>
-<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
-<B></B>
-</EM>
-</TD
-</TR>
-
-<TR>
-<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
- <A HREF="TinyMCE_Selection.html"><B>PREV CLASS</B></A><!--
- NEXT CLASS
--->
- <B>NEXT CLASS</B></FONT></TD>
-<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
- <A HREF="index.html" TARGET="_top"><B>FRAMES</B></A>
- <A HREF="TinyMCE_UndoRedo.html" TARGET="_top"><B>NO FRAMES</B></A>
-
-<SCRIPT>
- <!--
- if(window==top) {
- document.writeln('<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>');
- }
- //-->
-</SCRIPT>
-<NOSCRIPT>
-<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>
-</NOSCRIPT>
-</FONT></TD>
-</TR>
-<TR>
-<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
- SUMMARY: <A HREF="#field_summary">FIELD</A> | <A HREF="#constructor_summary">CONSTR</A> | <A HREF="#method_summary">METHOD</A></FONT></TD>
-<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
-DETAIL: <A HREF="#field_detail">FIELD</A> | <A HREF="#constructor_detail">CONSTR</A> | <A HREF="#method_detail">METHOD</A></FONT></TD>
-</TR>
-</TABLE>
-
-<!-- =========== END OF NAVBAR =========== -->
-
-<HR>
-<FONT SIZE="-1">
-
-</FONT>
-<div class="jsdoc_ctime">Documentation generated by <a href="http://jsdoc.sourceforge.net/" target="_parent">JSDoc</a> on Fri Apr 14 21:59:23 2006</div>
-</BODY>
-</HTML>
Copied: trunk/htdocs/js/tinymce/docs/tinymce_api/TinyMCE_UndoRedo.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/tinymce_api/TinyMCE_UndoRedo.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/tinymce_api/TinyMCE_UndoRedo.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/tinymce_api/TinyMCE_UndoRedo.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,513 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN""http://www.w3.org/TR/REC-html40/loose.dtd">
+<!--NewPage-->
+<HTML>
+<HEAD>
+<TITLE>
+TinyMCE_UndoRedo
+</TITLE>
+<LINK REL ="stylesheet" TYPE="text/css" HREF="stylesheet.css" TITLE="Style">
+</HEAD>
+<SCRIPT>
+function asd()
+{
+parent.document.title="TinyMCE_UndoRedo";
+}
+</SCRIPT>
+<BODY BGCOLOR="white" onload="asd();">
+
+<!-- ========== START OF NAVBAR ========== -->
+<A NAME="navbar_bottom"><!-- --></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0">
+<TR>
+<TD COLSPAN=3 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_bottom_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3">
+ <TR ALIGN="center" VALIGN="top">
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="overview-summary.html"><FONT CLASS="NavBarFont1"><B>Overview</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="overview-summary-TinyMCE_UndoRedo.class.js.html"><FONT CLASS="NavBarFont1"><B>File</B></FONT></A> </TD>
+ <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> <FONT CLASS="NavBarFont1Rev"><B>Class</B></FONT> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="overview-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A> </TD>
+ <!--TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"--> <!--A HREF="deprecated-list.html"--><!--FONT CLASS="NavBarFont1">Deprecated</FONT--><!--/A--><!-- </TD-->
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="index-all.html"--><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
+ </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+<B></B>
+</EM>
+</TD
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="TinyMCE_Selection.html"><B>PREV CLASS</B></A><!--
+ NEXT CLASS
+-->
+ <B>NEXT CLASS</B></FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="index.html" TARGET="_top"><B>FRAMES</B></A>
+ <A HREF="TinyMCE_UndoRedo.html" TARGET="_top"><B>NO FRAMES</B></A>
+
+<SCRIPT>
+ <!--
+ if(window==top) {
+ document.writeln('<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>');
+ }
+ //-->
+</SCRIPT>
+<NOSCRIPT>
+<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>
+</NOSCRIPT>
+</FONT></TD>
+</TR>
+<TR>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+ SUMMARY: <A HREF="#field_summary">FIELD</A> | <A HREF="#constructor_summary">CONSTR</A> | <A HREF="#method_summary">METHOD</A></FONT></TD>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+DETAIL: <A HREF="#field_detail">FIELD</A> | <A HREF="#constructor_detail">CONSTR</A> | <A HREF="#method_detail">METHOD</A></FONT></TD>
+</TR>
+</TABLE>
+<!-- =========== END OF NAVBAR =========== -->
+<HR>
+
+<!-- ======== START OF CLASS DATA ======== -->
+<H2>Class TinyMCE_UndoRedo</H2>
+<PRE>Object
+ |
+ +--<b>TinyMCE_UndoRedo</b>
+</PRE>
+
+
+<HR>
+<DL>
+ <!-- Class definition -->
+ <DT>class
+ <B>TinyMCE_UndoRedo</B>
+
+
+</DL>
+
+ <P>
+ <I>Defined in <a href='overview-summary-TinyMCE_UndoRedo.class.js.html'>TinyMCE_UndoRedo.class.js</a></I><BR/><BR/>
+ </P>
+
+ <HR>
+
+<!-- ======== NESTED CLASS SUMMARY ======== -->
+
+<!-- ======== END NESTED CLASS SUMMARY ======== -->
+
+
+<!-- =========== FIELD SUMMARY =========== -->
+
+ <A NAME="field_summary"><!-- --></A>
+ <TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" WIDTH="100%">
+ <TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+ <TD COLSPAN=2><FONT SIZE="+2">
+ <B>Field Summary</B></FONT></TD>
+ </TR>
+
+ <!-- This is one instance field summary -->
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+ <CODE> Object</CODE></FONT></TD>
+ <TD><CODE><B><A HREF="#instance">instance</A></B></CODE>
+ <BR>
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+ <CODE> Object</CODE></FONT></TD>
+ <TD><CODE><B><A HREF="#typingUndoIndex">typingUndoIndex</A></B></CODE>
+ <BR>
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+ <CODE> Object</CODE></FONT></TD>
+ <TD><CODE><B><A HREF="#undoIndex">undoIndex</A></B></CODE>
+ <BR>
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+ <CODE> Object</CODE></FONT></TD>
+ <TD><CODE><B><A HREF="#undoLevels">undoLevels</A></B></CODE>
+ <BR>
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+ <CODE> Object</CODE></FONT></TD>
+ <TD><CODE><B><A HREF="#undoRedo">undoRedo</A></B></CODE>
+ <BR>
+ </TD>
+ </TR>
+
+
+ </TABLE>
+
+
+
+
+
+<!-- =========== END FIELD SUMMARY =========== -->
+
+
+<!-- ======== CONSTRUCTOR SUMMARY ======== -->
+
+<A NAME="constructor_summary"><!-- --></A>
+<TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" WIDTH="100%">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TD COLSPAN=2><FONT SIZE="+2">
+<B>Constructor Summary</B></FONT></TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="TinyMCE_UndoRedo.html#TinyMCE_UndoRedo()">TinyMCE_UndoRedo</A>
+ </B>
+ (<<a href="TinyMCE_Control.html">TinyMCE_Control</a>> inst)
+ </CODE>
+ <BR>
+
+ Constructs a undo redo instance, this instance handles the custom undo/redo handeling in TinyMCE.
+ </TD>
+</TR>
+</TABLE>
+
+<!-- ======== END CONSTRUCTOR SUMMARY ======== -->
+
+
+
+<!-- ========== METHOD SUMMARY =========== -->
+
+<A NAME="method_summary"><!-- --></A>
+<TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" WIDTH="100%">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TD COLSPAN=2><FONT SIZE="+2">
+<B>Method Summary</B></FONT></TD>
+</TR>
+
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> boolean</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#add">add</A></B>(<TinyMCE_UndoRedoLevel> l)
+ </CODE>
+ <BR>
+
+ Adds a new undo level, this will take a snapshot of the current instance HTML or use the specified level.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> void</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#redo">redo</A></B>()
+ </CODE>
+ <BR>
+
+ Performes a undo action, this will restore the HTML contents of the editor to a former undoed state.
+ </TD>
+ </TR>
+
+ <TR BGCOLOR="white" CLASS="TableRowColor">
+ <TD ALIGN="right" VALIGN="top" WIDTH="1%">
+ <FONT SIZE="-1">
+ <CODE> void</CODE>
+ </FONT>
+ </TD>
+ <TD>
+ <CODE>
+ <B>
+ <A HREF="#undo">undo</A></B>()
+ </CODE>
+ <BR>
+
+ Performes a undo action, this will restore the HTML contents of the editor to a former state.
+ </TD>
+ </TR>
+
+
+</TABLE>
+
+
+
+<P>
+<!-- ========== END METHOD SUMMARY =========== -->
+
+
+<!-- ============ FIELD DETAIL START =========== -->
+
+ <A NAME="field_detail"><!-- --></A>
+ <TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" WIDTH="100%">
+ <TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+ <TD COLSPAN=1><FONT SIZE="+2"><B>Field Detail</B></FONT></TD>
+ </TR>
+ </TABLE>
+
+
+ <A NAME="instance"><!-- --></A>
+ <H3>instance</H3>
+ <PRE>Object <B>instance</B></PRE>
+ <UL>
+
+
+ </UL>
+ <HR>
+
+ <A NAME="typingUndoIndex"><!-- --></A>
+ <H3>typingUndoIndex</H3>
+ <PRE>Object <B>typingUndoIndex</B></PRE>
+ <UL>
+
+
+ </UL>
+ <HR>
+
+ <A NAME="undoIndex"><!-- --></A>
+ <H3>undoIndex</H3>
+ <PRE>Object <B>undoIndex</B></PRE>
+ <UL>
+
+
+ </UL>
+ <HR>
+
+ <A NAME="undoLevels"><!-- --></A>
+ <H3>undoLevels</H3>
+ <PRE>Object <B>undoLevels</B></PRE>
+ <UL>
+
+
+ </UL>
+ <HR>
+
+ <A NAME="undoRedo"><!-- --></A>
+ <H3>undoRedo</H3>
+ <PRE>Object <B>undoRedo</B></PRE>
+ <UL>
+
+
+ </UL>
+ <HR>
+
+
+
+<!-- ============ FIELD DETAIL END =========== -->
+
+ <!-- ========= CONSTRUCTOR DETAIL START ======== -->
+
+<A NAME="constructor_detail"><!-- --></A>
+<TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" WIDTH="100%">
+ <TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+ <TD COLSPAN=1>
+ <FONT SIZE="+2"><B>Constructor Detail</B></FONT>
+ </TD>
+ </TR>
+</TABLE>
+
+<A NAME="TinyMCE_UndoRedo()"><!-- --></A><H3>
+TinyMCE_UndoRedo</H3>
+<PRE><B>TinyMCE_UndoRedo</B>(<<a href="TinyMCE_Control.html">TinyMCE_Control</a>> inst)</PRE>
+
+
+<UL>
+ Constructs a undo redo instance, this instance handles the custom undo/redo handeling in TinyMCE.
+</UL>
+
+
+
+ <UL>
+ <B>Parameters:</B>
+
+ <UL><CODE>inst</CODE> - TinyMCE editor control instance.
+ </UL>
+
+
+ </UL>
+
+
+<!-- Constructor return value(s) -->
+
+<!-- End constructor return value(s) -->
+
+<!-- ADDITIONAL ATTRIBUTES -->
+
+<HR/>
+<!-- END ADDITIONAL ATTRIBUTES -->
+
+<!-- ========= CONSTRUCTOR DETAIL END ======== -->
+
+
+<!-- ============ METHOD DETAIL START ========== -->
+
+<A NAME="method_detail"><!-- --></A>
+<TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" WIDTH="100%">
+ <TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+ <TD COLSPAN=1><FONT SIZE="+2">
+ <B>Method Detail</B></FONT>
+ </TD>
+ </TR>
+</TABLE>
+
+<!-- One single method detail entry -->
+
+ <A NAME="add"><!-- --></A>
+ <H3>add</H3>
+ <PRE>boolean <B>add</B>(<TinyMCE_UndoRedoLevel> l)</PRE>
+
+ <UL>Adds a new undo level, this will take a snapshot of the current instance HTML or use the specified level.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <UL>
+ <B>Parameters:</B>
+
+ <UL><CODE>l</CODE> - Optional undo/redo level to add.
+ </UL>
+
+ </UL>
+
+ <!-- METHOD PARAMETERS END -->
+
+
+ <UL>
+ <B>Returns:</B>
+ <UL>
+ true/false on success or failure.
+ </UL>
+ </UL>
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="redo"><!-- --></A>
+ <H3>redo</H3>
+ <PRE>void <B>redo</B>()</PRE>
+
+ <UL>Performes a undo action, this will restore the HTML contents of the editor to a former undoed state.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <!-- METHOD PARAMETERS END -->
+
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+ <A NAME="undo"><!-- --></A>
+ <H3>undo</H3>
+ <PRE>void <B>undo</B>()</PRE>
+
+ <UL>Performes a undo action, this will restore the HTML contents of the editor to a former state.</UL>
+
+
+ <!-- METHOD PARAMETERS START -->
+
+ <!-- METHOD PARAMETERS END -->
+
+
+
+ <!-- ADDITIONAL ATTRIBUTES START -->
+
+ <!-- ADDITIONAL ATTRIBUTES END -->
+<HR>
+
+
+
+<!-- ============ METHOD DETAIL END ========== -->
+
+<!-- ========= END OF CLASS DATA ========= -->
+
+<!-- ========== START OF NAVBAR ========== -->
+<A NAME="navbar_bottom"><!-- --></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0">
+<TR>
+<TD COLSPAN=3 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_bottom_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3">
+ <TR ALIGN="center" VALIGN="top">
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="overview-summary.html"><FONT CLASS="NavBarFont1"><B>Overview</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="overview-summary-TinyMCE_UndoRedo.class.js.html"><FONT CLASS="NavBarFont1"><B>File</B></FONT></A> </TD>
+ <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> <FONT CLASS="NavBarFont1Rev"><B>Class</B></FONT> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="overview-tree.html"><FONT CLASS="NavBarFont1"><b>Tree</b></FONT></A> </TD>
+ <!--TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"--> <!--A HREF="deprecated-list.html"--><!--FONT CLASS="NavBarFont1">Deprecated</FONT--><!--/A--><!-- </TD-->
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
+ </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+<B></B>
+</EM>
+</TD
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="TinyMCE_Selection.html"><B>PREV CLASS</B></A><!--
+ NEXT CLASS
+-->
+ <B>NEXT CLASS</B></FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="index.html" TARGET="_top"><B>FRAMES</B></A>
+ <A HREF="TinyMCE_UndoRedo.html" TARGET="_top"><B>NO FRAMES</B></A>
+
+<SCRIPT>
+ <!--
+ if(window==top) {
+ document.writeln('<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>');
+ }
+ //-->
+</SCRIPT>
+<NOSCRIPT>
+<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>
+</NOSCRIPT>
+</FONT></TD>
+</TR>
+<TR>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+ SUMMARY: <A HREF="#field_summary">FIELD</A> | <A HREF="#constructor_summary">CONSTR</A> | <A HREF="#method_summary">METHOD</A></FONT></TD>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+DETAIL: <A HREF="#field_detail">FIELD</A> | <A HREF="#constructor_detail">CONSTR</A> | <A HREF="#method_detail">METHOD</A></FONT></TD>
+</TR>
+</TABLE>
+
+<!-- =========== END OF NAVBAR =========== -->
+
+<HR>
+<FONT SIZE="-1">
+
+</FONT>
+<div class="jsdoc_ctime">Documentation generated by <a href="http://jsdoc.sourceforge.net/" target="_parent">JSDoc</a> on Fri Apr 14 21:59:23 2006</div>
+</BODY>
+</HTML>
Deleted: trunk/htdocs/js/tinymce/docs/tinymce_api/allclasses-frame.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/tinymce_api/allclasses-frame.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/tinymce_api/allclasses-frame.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,77 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN""http://www.w3.org/TR/REC-html40/loose.dtd">
-<!--NewPage-->
-<HTML>
-<HEAD>
-<TITLE>
- All Classes
-</TITLE>
-<LINK REL ="stylesheet" TYPE="text/css" HREF="stylesheet.css" TITLE="Style">
-</HEAD>
-<SCRIPT>
-function asd()
-{
-parent.document.title=" All Classes";
-}
-</SCRIPT>
-<BODY BGCOLOR="white" onload="asd();">
-
-<H3 class="FrameHeadingFont"><B></B></H3>
-<FONT size="+1" CLASS="FrameHeadingFont">
-<B><a href="overview-summary.html" target="classFrame">All Classes</a></B></FONT>
-<BR>
-
-<TABLE BORDER="0" WIDTH="100%">
-
-
-<TR>
-<TD NOWRAP><FONT CLASS="FrameItemFont"><A HREF="GLOBALS.html" TARGET="classFrame">GLOBALS</A>
-<BR>
-</FONT></TD>
-</TR>
-
-<TR>
-<TD NOWRAP><FONT CLASS="FrameItemFont"><A HREF="TinyMCE_Cleanup.html" TARGET="classFrame">TinyMCE_Cleanup</A>
-<BR>
-</FONT></TD>
-</TR>
-
-<TR>
-<TD NOWRAP><FONT CLASS="FrameItemFont"><A HREF="TinyMCE_Control.html" TARGET="classFrame">TinyMCE_Control</A>
-<BR>
-</FONT></TD>
-</TR>
-
-<TR>
-<TD NOWRAP><FONT CLASS="FrameItemFont"><A HREF="TinyMCE_Engine.html" TARGET="classFrame">TinyMCE_Engine</A>
-<BR>
-</FONT></TD>
-</TR>
-
-<TR>
-<TD NOWRAP><FONT CLASS="FrameItemFont"><A HREF="TinyMCE_Layer.html" TARGET="classFrame">TinyMCE_Layer</A>
-<BR>
-</FONT></TD>
-</TR>
-
-<TR>
-<TD NOWRAP><FONT CLASS="FrameItemFont"><A HREF="TinyMCE_Popup.html" TARGET="classFrame">TinyMCE_Popup</A>
-<BR>
-</FONT></TD>
-</TR>
-
-<TR>
-<TD NOWRAP><FONT CLASS="FrameItemFont"><A HREF="TinyMCE_Selection.html" TARGET="classFrame">TinyMCE_Selection</A>
-<BR>
-</FONT></TD>
-</TR>
-
-<TR>
-<TD NOWRAP><FONT CLASS="FrameItemFont"><A HREF="TinyMCE_UndoRedo.html" TARGET="classFrame">TinyMCE_UndoRedo</A>
-<BR>
-</FONT></TD>
-</TR>
-
-</TABLE>
-
-</BODY>
-</HTML>
Copied: trunk/htdocs/js/tinymce/docs/tinymce_api/allclasses-frame.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/tinymce_api/allclasses-frame.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/tinymce_api/allclasses-frame.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/tinymce_api/allclasses-frame.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,77 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN""http://www.w3.org/TR/REC-html40/loose.dtd">
+<!--NewPage-->
+<HTML>
+<HEAD>
+<TITLE>
+ All Classes
+</TITLE>
+<LINK REL ="stylesheet" TYPE="text/css" HREF="stylesheet.css" TITLE="Style">
+</HEAD>
+<SCRIPT>
+function asd()
+{
+parent.document.title=" All Classes";
+}
+</SCRIPT>
+<BODY BGCOLOR="white" onload="asd();">
+
+<H3 class="FrameHeadingFont"><B></B></H3>
+<FONT size="+1" CLASS="FrameHeadingFont">
+<B><a href="overview-summary.html" target="classFrame">All Classes</a></B></FONT>
+<BR>
+
+<TABLE BORDER="0" WIDTH="100%">
+
+
+<TR>
+<TD NOWRAP><FONT CLASS="FrameItemFont"><A HREF="GLOBALS.html" TARGET="classFrame">GLOBALS</A>
+<BR>
+</FONT></TD>
+</TR>
+
+<TR>
+<TD NOWRAP><FONT CLASS="FrameItemFont"><A HREF="TinyMCE_Cleanup.html" TARGET="classFrame">TinyMCE_Cleanup</A>
+<BR>
+</FONT></TD>
+</TR>
+
+<TR>
+<TD NOWRAP><FONT CLASS="FrameItemFont"><A HREF="TinyMCE_Control.html" TARGET="classFrame">TinyMCE_Control</A>
+<BR>
+</FONT></TD>
+</TR>
+
+<TR>
+<TD NOWRAP><FONT CLASS="FrameItemFont"><A HREF="TinyMCE_Engine.html" TARGET="classFrame">TinyMCE_Engine</A>
+<BR>
+</FONT></TD>
+</TR>
+
+<TR>
+<TD NOWRAP><FONT CLASS="FrameItemFont"><A HREF="TinyMCE_Layer.html" TARGET="classFrame">TinyMCE_Layer</A>
+<BR>
+</FONT></TD>
+</TR>
+
+<TR>
+<TD NOWRAP><FONT CLASS="FrameItemFont"><A HREF="TinyMCE_Popup.html" TARGET="classFrame">TinyMCE_Popup</A>
+<BR>
+</FONT></TD>
+</TR>
+
+<TR>
+<TD NOWRAP><FONT CLASS="FrameItemFont"><A HREF="TinyMCE_Selection.html" TARGET="classFrame">TinyMCE_Selection</A>
+<BR>
+</FONT></TD>
+</TR>
+
+<TR>
+<TD NOWRAP><FONT CLASS="FrameItemFont"><A HREF="TinyMCE_UndoRedo.html" TARGET="classFrame">TinyMCE_UndoRedo</A>
+<BR>
+</FONT></TD>
+</TR>
+
+</TABLE>
+
+</BODY>
+</HTML>
Deleted: trunk/htdocs/js/tinymce/docs/tinymce_api/allclasses-noframe.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/tinymce_api/allclasses-noframe.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/tinymce_api/allclasses-noframe.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,76 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN""http://www.w3.org/TR/REC-html40/loose.dtd">
-<HTML>
-<HEAD>
-<TITLE>
- All Classes
-</TITLE>
-<LINK REL ="stylesheet" TYPE="text/css" HREF="stylesheet.css" TITLE="Style">
-</HEAD>
-<SCRIPT>
-function asd()
-{
-parent.document.title=" All Classes";
-}
-</SCRIPT>
-<BODY BGCOLOR="white" onload="asd();">
-
-<H3 CLASS="FrameHeadingFont"></H3>
-<FONT size="+1" CLASS="FrameHeadingFont">
-<B><a href="overview-summary.html">All Classes</a></B></FONT>
-<BR>
-
-<TABLE BORDER="0" WIDTH="100%">
-
-
-<TR>
-<TD NOWRAP><FONT CLASS="FrameItemFont"><A HREF="GLOBALS.html" >GLOBALS</A>
-<BR>
-</FONT></TD>
-</TR>
-
-<TR>
-<TD NOWRAP><FONT CLASS="FrameItemFont"><A HREF="TinyMCE_Cleanup.html" >TinyMCE_Cleanup</A>
-<BR>
-</FONT></TD>
-</TR>
-
-<TR>
-<TD NOWRAP><FONT CLASS="FrameItemFont"><A HREF="TinyMCE_Control.html" >TinyMCE_Control</A>
-<BR>
-</FONT></TD>
-</TR>
-
-<TR>
-<TD NOWRAP><FONT CLASS="FrameItemFont"><A HREF="TinyMCE_Engine.html" >TinyMCE_Engine</A>
-<BR>
-</FONT></TD>
-</TR>
-
-<TR>
-<TD NOWRAP><FONT CLASS="FrameItemFont"><A HREF="TinyMCE_Layer.html" >TinyMCE_Layer</A>
-<BR>
-</FONT></TD>
-</TR>
-
-<TR>
-<TD NOWRAP><FONT CLASS="FrameItemFont"><A HREF="TinyMCE_Popup.html" >TinyMCE_Popup</A>
-<BR>
-</FONT></TD>
-</TR>
-
-<TR>
-<TD NOWRAP><FONT CLASS="FrameItemFont"><A HREF="TinyMCE_Selection.html" >TinyMCE_Selection</A>
-<BR>
-</FONT></TD>
-</TR>
-
-<TR>
-<TD NOWRAP><FONT CLASS="FrameItemFont"><A HREF="TinyMCE_UndoRedo.html" >TinyMCE_UndoRedo</A>
-<BR>
-</FONT></TD>
-</TR>
-
-</TABLE>
-
-</BODY>
-</HTML>
Copied: trunk/htdocs/js/tinymce/docs/tinymce_api/allclasses-noframe.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/tinymce_api/allclasses-noframe.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/tinymce_api/allclasses-noframe.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/tinymce_api/allclasses-noframe.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,76 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN""http://www.w3.org/TR/REC-html40/loose.dtd">
+<HTML>
+<HEAD>
+<TITLE>
+ All Classes
+</TITLE>
+<LINK REL ="stylesheet" TYPE="text/css" HREF="stylesheet.css" TITLE="Style">
+</HEAD>
+<SCRIPT>
+function asd()
+{
+parent.document.title=" All Classes";
+}
+</SCRIPT>
+<BODY BGCOLOR="white" onload="asd();">
+
+<H3 CLASS="FrameHeadingFont"></H3>
+<FONT size="+1" CLASS="FrameHeadingFont">
+<B><a href="overview-summary.html">All Classes</a></B></FONT>
+<BR>
+
+<TABLE BORDER="0" WIDTH="100%">
+
+
+<TR>
+<TD NOWRAP><FONT CLASS="FrameItemFont"><A HREF="GLOBALS.html" >GLOBALS</A>
+<BR>
+</FONT></TD>
+</TR>
+
+<TR>
+<TD NOWRAP><FONT CLASS="FrameItemFont"><A HREF="TinyMCE_Cleanup.html" >TinyMCE_Cleanup</A>
+<BR>
+</FONT></TD>
+</TR>
+
+<TR>
+<TD NOWRAP><FONT CLASS="FrameItemFont"><A HREF="TinyMCE_Control.html" >TinyMCE_Control</A>
+<BR>
+</FONT></TD>
+</TR>
+
+<TR>
+<TD NOWRAP><FONT CLASS="FrameItemFont"><A HREF="TinyMCE_Engine.html" >TinyMCE_Engine</A>
+<BR>
+</FONT></TD>
+</TR>
+
+<TR>
+<TD NOWRAP><FONT CLASS="FrameItemFont"><A HREF="TinyMCE_Layer.html" >TinyMCE_Layer</A>
+<BR>
+</FONT></TD>
+</TR>
+
+<TR>
+<TD NOWRAP><FONT CLASS="FrameItemFont"><A HREF="TinyMCE_Popup.html" >TinyMCE_Popup</A>
+<BR>
+</FONT></TD>
+</TR>
+
+<TR>
+<TD NOWRAP><FONT CLASS="FrameItemFont"><A HREF="TinyMCE_Selection.html" >TinyMCE_Selection</A>
+<BR>
+</FONT></TD>
+</TR>
+
+<TR>
+<TD NOWRAP><FONT CLASS="FrameItemFont"><A HREF="TinyMCE_UndoRedo.html" >TinyMCE_UndoRedo</A>
+<BR>
+</FONT></TD>
+</TR>
+
+</TABLE>
+
+</BODY>
+</HTML>
Deleted: trunk/htdocs/js/tinymce/docs/tinymce_api/help-doc.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/tinymce_api/help-doc.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/tinymce_api/help-doc.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,160 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN""http://www.w3.org/TR/REC-html40/loose.dtd">
-<HTML>
-<HEAD>
-<TITLE>
- API Help
-</TITLE>
-<LINK REL ="stylesheet" TYPE="text/css" HREF="stylesheet.css" TITLE="Style">
-</HEAD>
-<SCRIPT>
-function asd()
-{
-parent.document.title=" API Help";
-}
-</SCRIPT>
-<BODY BGCOLOR="white" onload="asd();">
-
-<!-- ========== START OF NAVBAR ========== -->
-<A NAME="navbar_top"><!-- --></A>
-<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0">
-<TR>
-<TD COLSPAN=3 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
-<A NAME="navbar_top_firstrow"><!-- --></A>
-<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3">
- <TR ALIGN="center" VALIGN="top">
- <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="overview-summary.html"><FONT CLASS="NavBarFont1"><B>Overview</B></FONT></A> </TD>
- <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <FONT CLASS="NavBarFont1">File</FONT> </TD>
- <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <FONT CLASS="NavBarFont1">Class</FONT> </TD>
- <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="overview-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A> </TD>
- <!--TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A> </TD-->
- <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
- <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> <FONT CLASS="NavBarFont1Rev"><B>Help</B></FONT> </TD>
- </TR>
-</TABLE>
-</TD>
-<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
-<B></B>
-</EM>
-</TD>
-</TR>
-
-<TR>
-<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
- PREV
- NEXT</FONT></TD>
-<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
- <A HREF="index.html" TARGET="_top"><B>FRAMES</B></A>
- <A HREF="help-doc.html" TARGET="_top"><B>NO FRAMES</B></A>
-
-<SCRIPT>
- <!--
- if(window==top) {
- document.writeln('<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>');
- }
- //-->
-</SCRIPT>
-<NOSCRIPT>
-<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>
-</NOSCRIPT>
-</FONT></TD>
-</TR>
-</TABLE>
-<!-- =========== END OF NAVBAR =========== -->
-
-<HR>
-<CENTER>
-<H1>
-How This API Document Is Organized</H1>
-</CENTER>
-This API (Application Programming Interface) document has pages corresponding to the items in the navigation bar, described as follows.<H3>
-Class</H3>
-<BLOCKQUOTE>
-
-<P>
-Each class has its own separate page. Each of these pages has three sections consisting of a class description, summary tables, and detailed member descriptions:<UL>
-<LI>Class inheritance diagram<LI>Direct Subclasses<LI>Class declaration<LI>Class description
-<P>
-<LI>Field Summary<LI>Constructor Summary<LI>Method Summary
-<P>
-<LI>Field Detail<LI>Constructor Detail<LI>Method Detail</UL>
-Each summary entry contains the first sentence from the detailed description for that item. </BLOCKQUOTE>
-<!--H3>
-Tree (Class Hierarchy)</H3>
-<BLOCKQUOTE>
-There is a <A HREF="overview-tree.html">Class Hierarchy</A> page for all classes. The hierarchy page contains a list of classes. The classes are organized by inheritance structure starting with <code>Object</code>.<UL>
-</BLOCKQUOTE-->
-<!-- H3>
-Deprecated API</H3>
-<BLOCKQUOTE>
-The <A HREF="deprecated-list.html">Deprecated API</A> page lists all of the API that have been deprecated. A deprecated API is not recommended for use, generally due to improvements, and a replacement API is usually given. Deprecated APIs may be removed in future implementations.</BLOCKQUOTE-->
-<H3>
-Index</H3>
-<BLOCKQUOTE>
-The <A HREF="index-all.html">Index</A> contains an alphabetic list of all classes, constructors, methods, and fields.</BLOCKQUOTE>
-<H3>
-Prev/Next</H3>
-These links take you to the next or previous class, interface, package, or related page.<H3>
-Frames/No Frames</H3>
-These links show and hide the HTML frames. All pages are available with or without frames.
-<P>
-<FONT SIZE="-1">
-<EM>
-This help file applies to API documentation generated using the standard doclet.</EM>
-</FONT>
-<BR>
-<HR>
-
-<!-- ========== START OF NAVBAR ========== -->
-<A NAME="navbar_bottom"><!-- --></A>
-<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0">
-<TR>
-<TD COLSPAN=3 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
-<A NAME="navbar_bottom_firstrow"><!-- --></A>
-<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3">
- <TR ALIGN="center" VALIGN="top">
- <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="overview-summary.html"><FONT CLASS="NavBarFont1"><B>Overview</B></FONT></A> </TD>
- <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <FONT CLASS="NavBarFont1">File</FONT> </TD>
- <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <FONT CLASS="NavBarFont1">Class</FONT> </TD>
- <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="overview-tree.html"><FONT CLASS="NavBarFont1"><b>Tree</b></FONT></A> </TD>
- <!--TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A> </TD-->
- <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
- <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> <FONT CLASS="NavBarFont1Rev"><B>Help</B></FONT> </TD>
- </TR>
-</TABLE>
-</TD>
-<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
-<B></B>
-</EM>
-</TD>
-</TR>
-
-<TR>
-<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
- PREV
- NEXT</FONT></TD>
-<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
- <A HREF="index.html" TARGET="_top"><B>FRAMES</B></A>
- <A HREF="help-doc.html" TARGET="_top"><B>NO FRAMES</B></A>
-
-<SCRIPT>
- <!--
- if(window==top) {
- document.writeln('<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>');
- }
- //-->
-</SCRIPT>
-<NOSCRIPT>
-<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>
-</NOSCRIPT>
-</FONT></TD>
-</TR>
-</TABLE>
-<!-- =========== END OF NAVBAR =========== -->
-
-<HR>
-<FONT SIZE="-1">
-
-</FONT>
-<div class="jsdoc_ctime">Documentation generated by <a href="http://jsdoc.sourceforge.net/" target="_parent">JSDoc</a> on Fri Apr 14 21:59:23 2006</div>
-</BODY>
-</HTML>
Copied: trunk/htdocs/js/tinymce/docs/tinymce_api/help-doc.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/tinymce_api/help-doc.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/tinymce_api/help-doc.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/tinymce_api/help-doc.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,160 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN""http://www.w3.org/TR/REC-html40/loose.dtd">
+<HTML>
+<HEAD>
+<TITLE>
+ API Help
+</TITLE>
+<LINK REL ="stylesheet" TYPE="text/css" HREF="stylesheet.css" TITLE="Style">
+</HEAD>
+<SCRIPT>
+function asd()
+{
+parent.document.title=" API Help";
+}
+</SCRIPT>
+<BODY BGCOLOR="white" onload="asd();">
+
+<!-- ========== START OF NAVBAR ========== -->
+<A NAME="navbar_top"><!-- --></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0">
+<TR>
+<TD COLSPAN=3 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_top_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3">
+ <TR ALIGN="center" VALIGN="top">
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="overview-summary.html"><FONT CLASS="NavBarFont1"><B>Overview</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <FONT CLASS="NavBarFont1">File</FONT> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <FONT CLASS="NavBarFont1">Class</FONT> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="overview-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A> </TD>
+ <!--TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A> </TD-->
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
+ <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> <FONT CLASS="NavBarFont1Rev"><B>Help</B></FONT> </TD>
+ </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+<B></B>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ PREV
+ NEXT</FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="index.html" TARGET="_top"><B>FRAMES</B></A>
+ <A HREF="help-doc.html" TARGET="_top"><B>NO FRAMES</B></A>
+
+<SCRIPT>
+ <!--
+ if(window==top) {
+ document.writeln('<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>');
+ }
+ //-->
+</SCRIPT>
+<NOSCRIPT>
+<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>
+</NOSCRIPT>
+</FONT></TD>
+</TR>
+</TABLE>
+<!-- =========== END OF NAVBAR =========== -->
+
+<HR>
+<CENTER>
+<H1>
+How This API Document Is Organized</H1>
+</CENTER>
+This API (Application Programming Interface) document has pages corresponding to the items in the navigation bar, described as follows.<H3>
+Class</H3>
+<BLOCKQUOTE>
+
+<P>
+Each class has its own separate page. Each of these pages has three sections consisting of a class description, summary tables, and detailed member descriptions:<UL>
+<LI>Class inheritance diagram<LI>Direct Subclasses<LI>Class declaration<LI>Class description
+<P>
+<LI>Field Summary<LI>Constructor Summary<LI>Method Summary
+<P>
+<LI>Field Detail<LI>Constructor Detail<LI>Method Detail</UL>
+Each summary entry contains the first sentence from the detailed description for that item. </BLOCKQUOTE>
+<!--H3>
+Tree (Class Hierarchy)</H3>
+<BLOCKQUOTE>
+There is a <A HREF="overview-tree.html">Class Hierarchy</A> page for all classes. The hierarchy page contains a list of classes. The classes are organized by inheritance structure starting with <code>Object</code>.<UL>
+</BLOCKQUOTE-->
+<!-- H3>
+Deprecated API</H3>
+<BLOCKQUOTE>
+The <A HREF="deprecated-list.html">Deprecated API</A> page lists all of the API that have been deprecated. A deprecated API is not recommended for use, generally due to improvements, and a replacement API is usually given. Deprecated APIs may be removed in future implementations.</BLOCKQUOTE-->
+<H3>
+Index</H3>
+<BLOCKQUOTE>
+The <A HREF="index-all.html">Index</A> contains an alphabetic list of all classes, constructors, methods, and fields.</BLOCKQUOTE>
+<H3>
+Prev/Next</H3>
+These links take you to the next or previous class, interface, package, or related page.<H3>
+Frames/No Frames</H3>
+These links show and hide the HTML frames. All pages are available with or without frames.
+<P>
+<FONT SIZE="-1">
+<EM>
+This help file applies to API documentation generated using the standard doclet.</EM>
+</FONT>
+<BR>
+<HR>
+
+<!-- ========== START OF NAVBAR ========== -->
+<A NAME="navbar_bottom"><!-- --></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0">
+<TR>
+<TD COLSPAN=3 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_bottom_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3">
+ <TR ALIGN="center" VALIGN="top">
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="overview-summary.html"><FONT CLASS="NavBarFont1"><B>Overview</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <FONT CLASS="NavBarFont1">File</FONT> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <FONT CLASS="NavBarFont1">Class</FONT> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="overview-tree.html"><FONT CLASS="NavBarFont1"><b>Tree</b></FONT></A> </TD>
+ <!--TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A> </TD-->
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
+ <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> <FONT CLASS="NavBarFont1Rev"><B>Help</B></FONT> </TD>
+ </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+<B></B>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ PREV
+ NEXT</FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="index.html" TARGET="_top"><B>FRAMES</B></A>
+ <A HREF="help-doc.html" TARGET="_top"><B>NO FRAMES</B></A>
+
+<SCRIPT>
+ <!--
+ if(window==top) {
+ document.writeln('<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>');
+ }
+ //-->
+</SCRIPT>
+<NOSCRIPT>
+<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>
+</NOSCRIPT>
+</FONT></TD>
+</TR>
+</TABLE>
+<!-- =========== END OF NAVBAR =========== -->
+
+<HR>
+<FONT SIZE="-1">
+
+</FONT>
+<div class="jsdoc_ctime">Documentation generated by <a href="http://jsdoc.sourceforge.net/" target="_parent">JSDoc</a> on Fri Apr 14 21:59:23 2006</div>
+</BODY>
+</HTML>
Deleted: trunk/htdocs/js/tinymce/docs/tinymce_api/index-all.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/tinymce_api/index-all.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/tinymce_api/index-all.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,1663 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN""http://www.w3.org/TR/REC-html40/loose.dtd">
-<!--NewPage-->
-<HTML>
-<HEAD>
-<TITLE>
-Index ()
-</TITLE>
-<LINK REL ="stylesheet" TYPE="text/css" HREF="stylesheet.css" TITLE="Style">
-</HEAD>
-<SCRIPT>
-function asd()
-{
-parent.document.title="Index ()";
-}
-</SCRIPT>
-<BODY BGCOLOR="white" onload="asd();">
-
-<!-- ========== START OF NAVBAR ========== -->
-<A NAME="navbar_top"><!-- --></A>
-<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0">
-<TR>
-<TD COLSPAN=3 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
-<A NAME="navbar_top_firstrow"><!-- --></A>
-<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3">
- <TR ALIGN="center" VALIGN="top">
- <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="overview-summary.html"><FONT CLASS="NavBarFont1"><B>Overview</B></FONT></A> </TD>
- <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <FONT CLASS="NavBarFont1">File</FONT> </TD>
- <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <FONT CLASS="NavBarFont1">Class</FONT> </TD>
- <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="overview-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A> </TD>
- <!--TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A> </TD-->
- <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> <FONT CLASS="NavBarFont1Rev"><B>Index</B></FONT> </TD>
- <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
- </TR>
-</TABLE>
-</TD>
-<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
-<B></B>
-</EM>
-</TD>
-</TR>
-
-<TR>
-<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
- PREV
- NEXT</FONT></TD>
-<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
- <A HREF="index.html" TARGET="_top"><B>FRAMES</B></A>
- <A HREF="index-all.html" TARGET="_top"><B>NO FRAMES</B></A>
-
-<SCRIPT>
- <!--
- if(window==top) {
- document.writeln('<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>');
- }
- //-->
-</SCRIPT>
-<NOSCRIPT>
-<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>
-</NOSCRIPT>
-</FONT></TD>
-</TR>
-</TABLE>
-<!-- =========== END OF NAVBAR =========== -->
-
-<!--
- Listing of letters
--->
- <A HREF="index-all.html#_____">_</A> <A HREF="index-all.html#__A__">A</A> <A HREF="index-all.html#__B__">B</A> <A HREF="index-all.html#__C__">C</A> <A HREF="index-all.html#__D__">D</A> <A HREF="index-all.html#__E__">E</A> <A HREF="index-all.html#__F__">F</A> <A HREF="index-all.html#__G__">G</A> <A HREF="index-all.html#__H__">H</A> <A HREF="index-all.html#__I__">I</A> <A HREF="index-all.html#__L__">L</A> <A HREF="index-all.html#__M__">M</A> <A HREF="index-all.html#__N__">N</A> <A HREF="index-all.html#__O__">O</A> <A HREF="index-all.html#__P__">P</A> <A HREF="index-all.html#__Q__">Q</A> <A HREF="index-all.html#__R__">R</A> <A HREF="index-all.html#__S__">S</A> <A HREF="index-all.html#__T__">T</A> <A HREF="index-all.html#__U__">U</A> <A HREF="index-all.html#__W__">W</A> <A HREF="index-all.html#__X__">X</A>
-<HR>
-<!-- End letter listing -->
-
-<A NAME="_____"><!-- --></A><H2>
-<B>_</B></H2>
-
-<DL>
-<DT><A HREF="TinyMCE_Engine.html#_getElementById"><B>_getElementById(id, d)</B></A> -
-Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Engine.html#_removeInternal"><B>_removeInternal(n)</B></A> -
-Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
-<DD>
-</DL>
-
-<HR>
-
-<A NAME="__A__"><!-- --></A><H2>
-<B>A</B></H2>
-
-<DL>
-<DT><A HREF="TinyMCE_Engine.html#accessibleEventHandler"><B>accessibleEventHandler(e)</B></A> -
-Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_UndoRedo.html#add"><B>add(l)</B></A> -
-Instance method in class <A HREF="TinyMCE_UndoRedo.html">TinyMCE_UndoRedo</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Engine.html#addButtonMap"><B>addButtonMap(m)</B></A> -
-Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Engine.html#addCSSClass"><B>addCSSClass(e, c, b)</B></A> -
-Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Engine.html#addEvent"><B>addEvent(o, n, h)</B></A> -
-Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Engine.html#addEventHandlers"><B>addEventHandlers(inst)</B></A> -
-Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Engine.html#addMCEControl"><B>addMCEControl(replace_element, form_element_name, target_document)</B></A> -
-Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Engine.html#addMenu"><B>addMenu(n, m)</B></A> -
-Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Engine.html#addPlugin"><B>addPlugin(n, p)</B></A> -
-Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Control.html#addPlugin"><B>addPlugin(n, p)</B></A> -
-Instance method in class <A HREF="TinyMCE_Control.html">TinyMCE_Control</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Cleanup.html#addRuleStr"><B>addRuleStr(s)</B></A> -
-Instance method in class <A HREF="TinyMCE_Cleanup.html">TinyMCE_Cleanup</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Engine.html#addSelectAccessibility"><B>addSelectAccessibility(e, s, w)</B></A> -
-Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Control.html#addShortcut"><B>addShortcut(m, k, d, cmd, ui, va)</B></A> -
-Instance method in class <A HREF="TinyMCE_Control.html">TinyMCE_Control</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Engine.html#addTheme"><B>addTheme(n, t)</B></A> -
-Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Engine.html#addToLang"><B>addToLang(prefix, ar)</B></A> -
-Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Engine.html#applyTemplate"><B>applyTemplate(h, as)</B></A> -
-Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Control.html#autoResetDesignMode"><B>autoResetDesignMode()</B></A> -
-Instance method in class <A HREF="TinyMCE_Control.html">TinyMCE_Control</A>
-<DD>
-</DL>
-
-<HR>
-
-<A NAME="__B__"><!-- --></A><H2>
-<B>B</B></H2>
-
-<DL>
-<DT><A HREF="TinyMCE_Engine.html#buttonMap"><B>buttonMap</B></A> -
-Instance field in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
-<DD>
-</DL>
-
-<HR>
-
-<A NAME="__C__"><!-- --></A><H2>
-<B>C</B></H2>
-
-<DL>
-<DT><A HREF="TinyMCE_Engine.html#callFunc"><B>callFunc(ins, p, n, m, a)</B></A> -
-Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Engine.html#cancelEvent"><B>cancelEvent(e)</B></A> -
-Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Control.html#cleanup"><B>cleanup</B></A> -
-Instance field in class <A HREF="TinyMCE_Control.html">TinyMCE_Control</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Engine.html#cleanupAnchors"><B>cleanupAnchors(doc)</B></A> -
-Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Engine.html#cleanupEventStr"><B>cleanupEventStr(s)</B></A> -
-Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Engine.html#cleanupHTMLCode"><B>cleanupHTMLCode(s)</B></A> -
-Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Engine.html#clearArray"><B>clearArray(a)</B></A> -
-Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Popup.html#close"><B>close()</B></A> -
-Instance method in class <A HREF="TinyMCE_Popup.html">TinyMCE_Popup</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Engine.html#closeWindow"><B>closeWindow(win)</B></A> -
-Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Engine.html#compressStyle"><B>compressStyle(ar, pr, sf, res)</B></A> -
-Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Engine.html#configs"><B>configs</B></A> -
-Instance field in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Engine.html#confirmAdd"><B>confirmAdd(e, settings)</B></A> -
-Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Engine.html#convertAbsoluteURLToRelativeURL"><B>convertAbsoluteURLToRelativeURL(base_url, url_to_relative)</B></A> -
-Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Engine.html#convertAllRelativeURLs"><B>convertAllRelativeURLs(body)</B></A> -
-Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Engine.html#convertFontsToSpans"><B>convertFontsToSpans(doc)</B></A> -
-Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Engine.html#convertHexToRGB"><B>convertHexToRGB(s)</B></A> -
-Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Engine.html#convertRelativeToAbsoluteURL"><B>convertRelativeToAbsoluteURL(base_url, relative_url)</B></A> -
-Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Engine.html#convertRGBToHex"><B>convertRGBToHex(s, k)</B></A> -
-Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Engine.html#convertSpansToFonts"><B>convertSpansToFonts(doc)</B></A> -
-Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Engine.html#convertURL"><B>convertURL(url, node, on_save)</B></A> -
-Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Layer.html#create"><B>create(n, c, p)</B></A> -
-Instance method in class <A HREF="TinyMCE_Layer.html">TinyMCE_Layer</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Engine.html#currentConfig"><B>currentConfig</B></A> -
-Instance field in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
-<DD>
-</DL>
-
-<HR>
-
-<A NAME="__D__"><!-- --></A><H2>
-<B>D</B></H2>
-
-<DL>
-<DT><A HREF="TinyMCE_Engine.html#debug"><B>debug()</B></A> -
-Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Engine.html#dialogCounter"><B>dialogCounter</B></A> -
-Instance field in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Engine.html#dispatchCallback"><B>dispatchCallback(i, p, n)</B></A> -
-Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
-<DD>
-</DL>
-
-<HR>
-
-<A NAME="__E__"><!-- --></A><H2>
-<B>E</B></H2>
-
-<DL>
-<DT><A HREF="TinyMCE_Engine.html#entityDecode"><B>entityDecode(s)</B></A> -
-Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Engine.html#evalFunc"><B>evalFunc(f, idx, a)</B></A> -
-Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Engine.html#eventHandlers"><B>eventHandlers</B></A> -
-Instance field in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Control.html#execCommand"><B>execCommand(command, user_interface, value)</B></A> -
-Instance method in class <A HREF="TinyMCE_Control.html">TinyMCE_Control</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Popup.html#execCommand"><B>execCommand(command, user_interface, value)</B></A> -
-Instance method in class <A HREF="TinyMCE_Popup.html">TinyMCE_Popup</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Engine.html#execCommand"><B>execCommand(command, user_interface, value)</B></A> -
-Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Engine.html#execCommandCallback"><B>execCommandCallback(i, p, n)</B></A> -
-Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Engine.html#execInstanceCommand"><B>execInstanceCommand(editor_id, command, user_interface, value, focus)</B></A> -
-Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Engine.html#executeCallback"><B>executeCallback(i, p, n)</B></A> -
-Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Popup.html#executeOnLoad"><B>executeOnLoad(str)</B></A> -
-Instance method in class <A HREF="TinyMCE_Popup.html">TinyMCE_Popup</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Engine.html#explode"><B>explode(d, s)</B></A> -
-Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Engine.html#extend"><B>extend(p, np)</B></A> -
-Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
-<DD>
-</DL>
-
-<HR>
-
-<A NAME="__F__"><!-- --></A><H2>
-<B>F</B></H2>
-
-<DL>
-<DT><A HREF="TinyMCE_Engine.html#fixGeckoBaseHREFBug"><B>fixGeckoBaseHREFBug(m, e, h)</B></A> -
-Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Cleanup.html#formatHTML"><B>formatHTML(h)</B></A> -
-Instance method in class <A HREF="TinyMCE_Cleanup.html">TinyMCE_Cleanup</A>
-<DD>
-</DL>
-
-<HR>
-
-<A NAME="__G__"><!-- --></A><H2>
-<B>G</B></H2>
-
-<DL>
-<DT><A HREF="TinyMCE_Layer.html#getAbsPosition"><B>getAbsPosition(n)</B></A> -
-Instance method in class <A HREF="TinyMCE_Layer.html">TinyMCE_Layer</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Engine.html#getAbsPosition"><B>getAbsPosition(n)</B></A> -
-Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Engine.html#getAttrib"><B>getAttrib(elm, name, default_value)</B></A> -
-Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Layer.html#getBlocker"><B>getBlocker()</B></A> -
-Instance method in class <A HREF="TinyMCE_Layer.html">TinyMCE_Layer</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Control.html#getBody"><B>getBody()</B></A> -
-Instance method in class <A HREF="TinyMCE_Control.html">TinyMCE_Control</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Selection.html#getBookmark"><B>getBookmark(simple)</B></A> -
-Instance method in class <A HREF="TinyMCE_Selection.html">TinyMCE_Selection</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Engine.html#getButtonHTML"><B>getButtonHTML(id, lang, img, cmd, ui, val)</B></A> -
-Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Engine.html#getContent"><B>getContent(editor_id)</B></A> -
-Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Engine.html#getControlHTML"><B>getControlHTML(c)</B></A> -
-Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Engine.html#getCSSClasses"><B>getCSSClasses(editor_id, doc)</B></A> -
-Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Control.html#getDoc"><B>getDoc()</B></A> -
-Instance method in class <A HREF="TinyMCE_Control.html">TinyMCE_Control</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Engine.html#getEditorId"><B>getEditorId(form_element)</B></A> -
-Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Layer.html#getElement"><B>getElement()</B></A> -
-Instance method in class <A HREF="TinyMCE_Layer.html">TinyMCE_Layer</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Engine.html#getElementByAttributeValue"><B>getElementByAttributeValue(n, e, a, v)</B></A> -
-Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Engine.html#getElementsByAttributeValue"><B>getElementsByAttributeValue(n, e, a, v)</B></A> -
-Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Control.html#getFocusElement"><B>getFocusElement()</B></A> -
-Instance method in class <A HREF="TinyMCE_Control.html">TinyMCE_Control</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Selection.html#getFocusElement"><B>getFocusElement()</B></A> -
-Instance method in class <A HREF="TinyMCE_Selection.html">TinyMCE_Selection</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Engine.html#getInstanceById"><B>getInstanceById(editor_id)</B></A> -
-Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Engine.html#getLang"><B>getLang(name, default_value, parse_entities, va)</B></A> -
-Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Engine.html#getNodeTree"><B>getNodeTree(n, na, t, nn)</B></A> -
-Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Engine.html#getOuterHTML"><B>getOuterHTML(e)</B></A> -
-Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Engine.html#getParam"><B>getParam(name, default_value, strip_whitespace, split_chr)</B></A> -
-Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Engine.html#getParentBlockElement"><B>getParentBlockElement(n)</B></A> -
-Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Engine.html#getParentElement"><B>getParentElement(node, names, attrib_name, attrib_value)</B></A> -
-Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Engine.html#getParentNode"><B>getParentNode(n, f)</B></A> -
-Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Control.html#getRng"><B>getRng()</B></A> -
-Instance method in class <A HREF="TinyMCE_Control.html">TinyMCE_Control</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Selection.html#getRng"><B>getRng()</B></A> -
-Instance method in class <A HREF="TinyMCE_Selection.html">TinyMCE_Selection</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Selection.html#getSel"><B>getSel()</B></A> -
-Instance method in class <A HREF="TinyMCE_Selection.html">TinyMCE_Selection</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Control.html#getSel"><B>getSel()</B></A> -
-Instance method in class <A HREF="TinyMCE_Control.html">TinyMCE_Control</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Selection.html#getSelectedHTML"><B>getSelectedHTML()</B></A> -
-Instance method in class <A HREF="TinyMCE_Selection.html">TinyMCE_Selection</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Selection.html#getSelectedText"><B>getSelectedText()</B></A> -
-Instance method in class <A HREF="TinyMCE_Selection.html">TinyMCE_Selection</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Engine.html#getVisualAidClass"><B>getVisualAidClass(class_name, state)</B></A> -
-Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Control.html#getWin"><B>getWin()</B></A> -
-Instance method in class <A HREF="TinyMCE_Control.html">TinyMCE_Control</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Engine.html#getWindowArg"><B>getWindowArg(n, d)</B></A> -
-Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Popup.html#getWindowArg"><B>getWindowArg(name, default_value)</B></A> -
-Instance method in class <A HREF="TinyMCE_Popup.html">TinyMCE_Popup</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="GLOBALS.html#"><B>GLOBALS</B></A> -
- class <A HREF="GLOBALS.html">GLOBALS</A>
-<DD>
-</DL>
-
-<HR>
-
-<A NAME="__H__"><!-- --></A><H2>
-<B>H</B></H2>
-
-<DL>
-<DT><A HREF="TinyMCE_Engine.html#handleEvent"><B>handleEvent(e)</B></A> -
-Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Control.html#handleShortcut"><B>handleShortcut(e)</B></A> -
-Instance method in class <A HREF="TinyMCE_Control.html">TinyMCE_Control</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Engine.html#handleVisualAid"><B>handleVisualAid(el, deep, state, inst, skip_dispatch)</B></A> -
-Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Engine.html#hasMenu"><B>hasMenu(n)</B></A> -
-Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Control.html#hasMouseMoved"><B>hasMouseMoved</B></A> -
-Instance field in class <A HREF="TinyMCE_Control.html">TinyMCE_Control</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Engine.html#hasPlugin"><B>hasPlugin(n)</B></A> -
-Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Control.html#hasPlugin"><B>hasPlugin(n)</B></A> -
-Instance method in class <A HREF="TinyMCE_Control.html">TinyMCE_Control</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Engine.html#hasTheme"><B>hasTheme(n)</B></A> -
-Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Layer.html#hide"><B>hide()</B></A> -
-Instance method in class <A HREF="TinyMCE_Layer.html">TinyMCE_Layer</A>
-<DD>
-</DL>
-
-<HR>
-
-<A NAME="__I__"><!-- --></A><H2>
-<B>I</B></H2>
-
-<DL>
-<DT><A HREF="TinyMCE_Engine.html#idCounter"><B>idCounter</B></A> -
-Instance field in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Popup.html#importClass"><B>importClass(c)</B></A> -
-Instance method in class <A HREF="TinyMCE_Popup.html">TinyMCE_Popup</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Engine.html#importCSS"><B>importCSS(doc, css)</B></A> -
-Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Engine.html#importPluginLanguagePack"><B>importPluginLanguagePack(name, valid_languages)</B></A> -
-Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Engine.html#importThemeLanguagePack"><B>importThemeLanguagePack(name)</B></A> -
-Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Popup.html#init"><B>init()</B></A> -
-Instance method in class <A HREF="TinyMCE_Popup.html">TinyMCE_Popup</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Cleanup.html#init"><B>init(s)</B></A> -
-Instance method in class <A HREF="TinyMCE_Cleanup.html">TinyMCE_Cleanup</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Engine.html#init"><B>init(settings)</B></A> -
-Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Engine.html#insertAfter"><B>insertAfter(n, r)</B></A> -
-Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Selection.html#instance"><B>instance</B></A> -
-Instance field in class <A HREF="TinyMCE_Selection.html">TinyMCE_Selection</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_UndoRedo.html#instance"><B>instance</B></A> -
-Instance field in class <A HREF="TinyMCE_UndoRedo.html">TinyMCE_UndoRedo</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Engine.html#instances"><B>instances</B></A> -
-Instance field in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Engine.html#isBlockElement"><B>isBlockElement(n)</B></A> -
-Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Control.html#isDirty"><B>isDirty()</B></A> -
-Instance method in class <A HREF="TinyMCE_Control.html">TinyMCE_Control</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Engine.html#isGecko"><B>isGecko</B></A> -
-Instance field in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Control.html#isHidden"><B>isHidden()</B></A> -
-Instance method in class <A HREF="TinyMCE_Control.html">TinyMCE_Control</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Engine.html#isInstance"><B>isInstance(o)</B></A> -
-Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Engine.html#isLoaded"><B>isLoaded</B></A> -
-Instance field in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Engine.html#isMac"><B>isMac</B></A> -
-Instance field in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Engine.html#isMSIE"><B>isMSIE</B></A> -
-Instance field in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Engine.html#isMSIE5"><B>isMSIE5</B></A> -
-Instance field in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Engine.html#isMSIE5_0"><B>isMSIE5_0</B></A> -
-Instance field in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Engine.html#isNS7"><B>isNS7</B></A> -
-Instance field in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Engine.html#isNS71"><B>isNS71</B></A> -
-Instance field in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Engine.html#isOpera"><B>isOpera</B></A> -
-Instance field in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Engine.html#isSafari"><B>isSafari</B></A> -
-Instance field in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Control.html#isTinyMCE_Control"><B>isTinyMCE_Control</B></A> -
-Instance field in class <A HREF="TinyMCE_Control.html">TinyMCE_Control</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Layer.html#isVisible"><B>isVisible()</B></A> -
-Instance method in class <A HREF="TinyMCE_Layer.html">TinyMCE_Layer</A>
-<DD>
-</DL>
-
-<HR>
-
-<A NAME="__L__"><!-- --></A><H2>
-<B>L</B></H2>
-
-<DL>
-<DT><A HREF="TinyMCE_Engine.html#loadCSS"><B>loadCSS(url)</B></A> -
-Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Engine.html#loadedFiles"><B>loadedFiles</B></A> -
-Instance field in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Engine.html#loadedPlugins"><B>loadedPlugins</B></A> -
-Instance field in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Engine.html#loadPlugin"><B>loadPlugin(n, u)</B></A> -
-Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Engine.html#loadScript"><B>loadScript(url)</B></A> -
-Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
-<DD>
-</DL>
-
-<HR>
-
-<A NAME="__M__"><!-- --></A><H2>
-<B>M</B></H2>
-
-<DL>
-<DT><A HREF="TinyMCE_Engine.html#majorVersion"><B>majorVersion</B></A> -
-Instance field in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Engine.html#menus"><B>menus</B></A> -
-Instance field in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Engine.html#minorVersion"><B>minorVersion</B></A> -
-Instance field in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Layer.html#moveBy"><B>moveBy(x, y)</B></A> -
-Instance method in class <A HREF="TinyMCE_Layer.html">TinyMCE_Layer</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Layer.html#moveRelativeTo"><B>moveRelativeTo(re, p)</B></A> -
-Instance method in class <A HREF="TinyMCE_Layer.html">TinyMCE_Layer</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Layer.html#moveTo"><B>moveTo(x, y)</B></A> -
-Instance method in class <A HREF="TinyMCE_Layer.html">TinyMCE_Layer</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Selection.html#moveToBookmark"><B>moveToBookmark(bookmark)</B></A> -
-Instance method in class <A HREF="TinyMCE_Selection.html">TinyMCE_Selection</A>
-<DD>
-</DL>
-
-<HR>
-
-<A NAME="__N__"><!-- --></A><H2>
-<B>N</B></H2>
-
-<DL>
-<DT><A HREF="TinyMCE_Engine.html#nextNode"><B>nextNode(e, n)</B></A> -
-Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
-<DD>
-</DL>
-
-<HR>
-
-<A NAME="__O__"><!-- --></A><H2>
-<B>O</B></H2>
-
-<DL>
-<DT><A HREF="TinyMCE_Popup.html#onLoad"><B>onLoad()</B></A> -
-Instance method in class <A HREF="TinyMCE_Popup.html">TinyMCE_Popup</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Engine.html#onLoad"><B>onLoad()</B></A> -
-Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Engine.html#onMouseMove"><B>onMouseMove()</B></A> -
-Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Popup.html#openBrowser"><B>openBrowser(element_id, type, option)</B></A> -
-Instance method in class <A HREF="TinyMCE_Popup.html">TinyMCE_Popup</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Engine.html#openWindow"><B>openWindow(template, args)</B></A> -
-Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
-<DD>
-</DL>
-
-<HR>
-
-<A NAME="__P__"><!-- --></A><H2>
-<B>P</B></H2>
-
-<DL>
-<DT><A HREF="TinyMCE_Layer.html#parseInt"><B>parseInt(s)</B></A> -
-Instance method in class <A HREF="TinyMCE_Layer.html">TinyMCE_Layer</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Cleanup.html#parseRuleStr"><B>parseRuleStr(s)</B></A> -
-Instance method in class <A HREF="TinyMCE_Cleanup.html">TinyMCE_Cleanup</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Engine.html#parseStyle"><B>parseStyle(str)</B></A> -
-Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Engine.html#parseURL"><B>parseURL(url_str)</B></A> -
-Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Popup.html#pickColor"><B>pickColor(e, element_id)</B></A> -
-Instance method in class <A HREF="TinyMCE_Popup.html">TinyMCE_Popup</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Engine.html#plugins"><B>plugins</B></A> -
-Instance field in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Control.html#plugins"><B>plugins</B></A> -
-Instance field in class <A HREF="TinyMCE_Control.html">TinyMCE_Control</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Engine.html#prevNode"><B>prevNode(e, n)</B></A> -
-Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
-<DD>
-</DL>
-
-<HR>
-
-<A NAME="__Q__"><!-- --></A><H2>
-<B>Q</B></H2>
-
-<DL>
-<DT><A HREF="TinyMCE_Control.html#queryCommandState"><B>queryCommandState(c)</B></A> -
-Instance method in class <A HREF="TinyMCE_Control.html">TinyMCE_Control</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Control.html#queryCommandValue"><B>queryCommandValue(c)</B></A> -
-Instance method in class <A HREF="TinyMCE_Control.html">TinyMCE_Control</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Engine.html#queryInstanceCommandState"><B>queryInstanceCommandState(editor_id, command)</B></A> -
-Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Engine.html#queryInstanceCommandValue"><B>queryInstanceCommandValue(editor_id, command)</B></A> -
-Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
-<DD>
-</DL>
-
-<HR>
-
-<A NAME="__R__"><!-- --></A><H2>
-<B>R</B></H2>
-
-<DL>
-<DT><A HREF="TinyMCE_UndoRedo.html#redo"><B>redo()</B></A> -
-Instance method in class <A HREF="TinyMCE_UndoRedo.html">TinyMCE_UndoRedo</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Engine.html#regexpReplace"><B>regexpReplace(in_str, reg_exp, replace_str, opts)</B></A> -
-Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Engine.html#releaseDate"><B>releaseDate</B></A> -
-Instance field in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Engine.html#removeCSSClass"><B>removeCSSClass(e, c)</B></A> -
-Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Engine.html#removeMCEControl"><B>removeMCEControl(editor_id)</B></A> -
-Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Engine.html#removeTinyMCEFormElements"><B>removeTinyMCEFormElements(form_obj)</B></A> -
-Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Engine.html#renameElement"><B>renameElement(e, n, d)</B></A> -
-Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Control.html#repaint"><B>repaint()</B></A> -
-Instance method in class <A HREF="TinyMCE_Control.html">TinyMCE_Control</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Engine.html#replaceVar"><B>replaceVar(h, r, v)</B></A> -
-Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Engine.html#resetForm"><B>resetForm(form_index)</B></A> -
-Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Layer.html#resizeBy"><B>resizeBy(w, h)</B></A> -
-Instance method in class <A HREF="TinyMCE_Layer.html">TinyMCE_Layer</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Layer.html#resizeTo"><B>resizeTo(w, h)</B></A> -
-Instance method in class <A HREF="TinyMCE_Layer.html">TinyMCE_Layer</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Popup.html#resizeToContent"><B>resizeToContent()</B></A> -
-Instance method in class <A HREF="TinyMCE_Popup.html">TinyMCE_Popup</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Popup.html#resizeToInnerSize"><B>resizeToInnerSize()</B></A> -
-Instance method in class <A HREF="TinyMCE_Popup.html">TinyMCE_Popup</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Popup.html#restoreSelection"><B>restoreSelection()</B></A> -
-Instance method in class <A HREF="TinyMCE_Popup.html">TinyMCE_Popup</A>
-<DD>
-</DL>
-
-<HR>
-
-<A NAME="__S__"><!-- --></A><H2>
-<B>S</B></H2>
-
-<DL>
-<DT><A HREF="TinyMCE_Selection.html#scrollToNode"><B>scrollToNode(node)</B></A> -
-Instance method in class <A HREF="TinyMCE_Selection.html">TinyMCE_Selection</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Control.html#selection"><B>selection</B></A> -
-Instance field in class <A HREF="TinyMCE_Control.html">TinyMCE_Control</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Selection.html#selectNode"><B>selectNode(node, collapse, select_text_node, to_start)</B></A> -
-Instance method in class <A HREF="TinyMCE_Selection.html">TinyMCE_Selection</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Engine.html#selectNodes"><B>selectNodes(n, f, a)</B></A> -
-Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Cleanup.html#serializeNodeAsHTML"><B>serializeNodeAsHTML(n)</B></A> -
-Instance method in class <A HREF="TinyMCE_Cleanup.html">TinyMCE_Cleanup</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Cleanup.html#serializeNodeAsXML"><B>serializeNodeAsXML(n)</B></A> -
-Instance method in class <A HREF="TinyMCE_Cleanup.html">TinyMCE_Cleanup</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Engine.html#serializeStyle"><B>serializeStyle(ar)</B></A> -
-Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Engine.html#serializeURL"><B>serializeURL(up)</B></A> -
-Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Engine.html#setAttrib"><B>setAttrib(element, name, value, fix_value)</B></A> -
-Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Control.html#setBaseHREF"><B>setBaseHREF(u)</B></A> -
-Instance method in class <A HREF="TinyMCE_Control.html">TinyMCE_Control</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Layer.html#setBlockMode"><B>setBlockMode(s)</B></A> -
-Instance method in class <A HREF="TinyMCE_Layer.html">TinyMCE_Layer</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Engine.html#setContent"><B>setContent(h)</B></A> -
-Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Engine.html#setInnerHTML"><B>setInnerHTML(e, h)</B></A> -
-Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Engine.html#setOuterHTML"><B>setOuterHTML(e, h)</B></A> -
-Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Engine.html#setPluginBaseURL"><B>setPluginBaseURL(n, u)</B></A> -
-Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Engine.html#setStyleAttrib"><B>setStyleAttrib(elm, name, value)</B></A> -
-Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Control.html#settings"><B>settings</B></A> -
-Instance field in class <A HREF="TinyMCE_Control.html">TinyMCE_Control</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Engine.html#setupContent"><B>setupContent(editor_id)</B></A> -
-Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Engine.html#setWindowArg"><B>setWindowArg(n, v)</B></A> -
-Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Control.html#shortcuts"><B>shortcuts</B></A> -
-Instance field in class <A HREF="TinyMCE_Control.html">TinyMCE_Control</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Layer.html#show"><B>show()</B></A> -
-Instance method in class <A HREF="TinyMCE_Layer.html">TinyMCE_Layer</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Cleanup.html#split"><B>split(re, s)</B></A> -
-Instance method in class <A HREF="TinyMCE_Cleanup.html">TinyMCE_Cleanup</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Engine.html#storeAwayURLs"><B>storeAwayURLs(s)</B></A> -
-Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Engine.html#submitPatch"><B>submitPatch()</B></A> -
-Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Engine.html#switchClass"><B>switchClass(ei, c)</B></A> -
-Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Engine.html#switchClassCache"><B>switchClassCache</B></A> -
-Instance field in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Control.html#switchSettings"><B>switchSettings()</B></A> -
-Instance method in class <A HREF="TinyMCE_Control.html">TinyMCE_Control</A>
-<DD>
-</DL>
-
-<HR>
-
-<A NAME="__T__"><!-- --></A><H2>
-<B>T</B></H2>
-
-<DL>
-<DT><A HREF="TinyMCE_Engine.html#themes"><B>themes</B></A> -
-Instance field in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Cleanup.html#"><B>TinyMCE_Cleanup</B></A> -
- class <A HREF="TinyMCE_Cleanup.html">TinyMCE_Cleanup</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Cleanup.html#constructor_detail"><B>TinyMCE_Cleanup()</B></A> -
-Constructor in class <A HREF="TinyMCE_Cleanup.html">TinyMCE_Cleanup</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Control.html#"><B>TinyMCE_Control</B></A> -
- class <A HREF="TinyMCE_Control.html">TinyMCE_Control</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Control.html#constructor_detail"><B>TinyMCE_Control(settings)</B></A> -
-Constructor in class <A HREF="TinyMCE_Control.html">TinyMCE_Control</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Engine.html#"><B>TinyMCE_Engine</B></A> -
- class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Engine.html#constructor_detail"><B>TinyMCE_Engine()</B></A> -
-Constructor in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Layer.html#"><B>TinyMCE_Layer</B></A> -
- class <A HREF="TinyMCE_Layer.html">TinyMCE_Layer</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Layer.html#constructor_detail"><B>TinyMCE_Layer(id, bm)</B></A> -
-Constructor in class <A HREF="TinyMCE_Layer.html">TinyMCE_Layer</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="GLOBALS.html#TinyMCE_Menu"><B>TinyMCE_Menu()</B></A> -
-Class method in class <A HREF="GLOBALS.html">GLOBALS</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Popup.html#"><B>TinyMCE_Popup</B></A> -
- class <A HREF="TinyMCE_Popup.html">TinyMCE_Popup</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Popup.html#constructor_detail"><B>TinyMCE_Popup()</B></A> -
-Constructor in class <A HREF="TinyMCE_Popup.html">TinyMCE_Popup</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Selection.html#"><B>TinyMCE_Selection</B></A> -
- class <A HREF="TinyMCE_Selection.html">TinyMCE_Selection</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Selection.html#constructor_detail"><B>TinyMCE_Selection(inst)</B></A> -
-Constructor in class <A HREF="TinyMCE_Selection.html">TinyMCE_Selection</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_UndoRedo.html#"><B>TinyMCE_UndoRedo</B></A> -
- class <A HREF="TinyMCE_UndoRedo.html">TinyMCE_UndoRedo</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_UndoRedo.html#constructor_detail"><B>TinyMCE_UndoRedo(inst)</B></A> -
-Constructor in class <A HREF="TinyMCE_UndoRedo.html">TinyMCE_UndoRedo</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Engine.html#triggerNodeChange"><B>triggerNodeChange(focus, setup_content)</B></A> -
-Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Engine.html#triggerSave"><B>triggerSave(skip_cleanup, skip_callback)</B></A> -
-Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Control.html#triggerSave"><B>triggerSave(skip_cleanup, skip_callback)</B></A> -
-Instance method in class <A HREF="TinyMCE_Control.html">TinyMCE_Control</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Engine.html#trim"><B>trim(s)</B></A> -
-Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_UndoRedo.html#typingUndoIndex"><B>typingUndoIndex</B></A> -
-Instance field in class <A HREF="TinyMCE_UndoRedo.html">TinyMCE_UndoRedo</A>
-<DD>
-</DL>
-
-<HR>
-
-<A NAME="__U__"><!-- --></A><H2>
-<B>U</B></H2>
-
-<DL>
-<DT><A HREF="TinyMCE_UndoRedo.html#undo"><B>undo()</B></A> -
-Instance method in class <A HREF="TinyMCE_UndoRedo.html">TinyMCE_UndoRedo</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_UndoRedo.html#undoIndex"><B>undoIndex</B></A> -
-Instance field in class <A HREF="TinyMCE_UndoRedo.html">TinyMCE_UndoRedo</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_UndoRedo.html#undoLevels"><B>undoLevels</B></A> -
-Instance field in class <A HREF="TinyMCE_UndoRedo.html">TinyMCE_UndoRedo</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Control.html#undoRedo"><B>undoRedo</B></A> -
-Instance field in class <A HREF="TinyMCE_Control.html">TinyMCE_Control</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_UndoRedo.html#undoRedo"><B>undoRedo</B></A> -
-Instance field in class <A HREF="TinyMCE_UndoRedo.html">TinyMCE_UndoRedo</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Control.html#undoRedoLevel"><B>undoRedoLevel</B></A> -
-Instance field in class <A HREF="TinyMCE_Control.html">TinyMCE_Control</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Engine.html#unloadHandler"><B>unloadHandler()</B></A> -
-Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Layer.html#updateBlocker"><B>updateBlocker()</B></A> -
-Instance method in class <A HREF="TinyMCE_Layer.html">TinyMCE_Layer</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Engine.html#updateContent"><B>updateContent(form_element_name)</B></A> -
-Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
-<DD>
-</DL>
-
-<HR>
-
-<A NAME="__W__"><!-- --></A><H2>
-<B>W</B></H2>
-
-<DL>
-<DT><A HREF="TinyMCE_Engine.html#windowArgs"><B>windowArgs</B></A> -
-Instance field in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
-<DD>
-</DL>
-
-<HR>
-
-<A NAME="__X__"><!-- --></A><H2>
-<B>X</B></H2>
-
-<DL>
-<DT><A HREF="TinyMCE_Engine.html#xmlEncode"><B>xmlEncode(s)</B></A> -
-Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
-<DD>
-</DL>
-
-<DL>
-<DT><A HREF="TinyMCE_Cleanup.html#xmlEncode"><B>xmlEncode(s)</B></A> -
-Instance method in class <A HREF="TinyMCE_Cleanup.html">TinyMCE_Cleanup</A>
-<DD>
-</DL>
-
-<HR>
-
-<!--
- Listing of letters
--->
- <A HREF="index-all.html#_____">_</A> <A HREF="index-all.html#__A__">A</A> <A HREF="index-all.html#__B__">B</A> <A HREF="index-all.html#__C__">C</A> <A HREF="index-all.html#__D__">D</A> <A HREF="index-all.html#__E__">E</A> <A HREF="index-all.html#__F__">F</A> <A HREF="index-all.html#__G__">G</A> <A HREF="index-all.html#__H__">H</A> <A HREF="index-all.html#__I__">I</A> <A HREF="index-all.html#__L__">L</A> <A HREF="index-all.html#__M__">M</A> <A HREF="index-all.html#__N__">N</A> <A HREF="index-all.html#__O__">O</A> <A HREF="index-all.html#__P__">P</A> <A HREF="index-all.html#__Q__">Q</A> <A HREF="index-all.html#__R__">R</A> <A HREF="index-all.html#__S__">S</A> <A HREF="index-all.html#__T__">T</A> <A HREF="index-all.html#__U__">U</A> <A HREF="index-all.html#__W__">W</A> <A HREF="index-all.html#__X__">X</A>
-
-
-<!-- ========== START OF NAVBAR ========== -->
-<A NAME="navbar_top"><!-- --></A>
-<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0">
-<TR>
-<TD COLSPAN=3 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
-<A NAME="navbar_top_firstrow"><!-- --></A>
-<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3">
- <TR ALIGN="center" VALIGN="top">
- <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="overview-summary.html"><FONT CLASS="NavBarFont1"><B>Overview</B></FONT></A> </TD>
- <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <FONT CLASS="NavBarFont1">File</FONT> </TD>
- <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <FONT CLASS="NavBarFont1">Class</FONT> </TD>
- <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="overview-tree.html"><FONT CLASS="NavBarFont1"><b>Tree</b></FONT></A> </TD>
- <!--TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A> </TD-->
- <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> <FONT CLASS="NavBarFont1Rev"><B>Index</B></FONT> </TD>
- <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
- </TR>
-</TABLE>
-</TD>
-<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
-<B></B>
-</EM>
-</TD>
-</TR>
-
-<TR>
-<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
- PREV
- NEXT</FONT></TD>
-<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
- <A HREF="index.html" TARGET="_top"><B>FRAMES</B></A>
- <A HREF="index-all.html" TARGET="_top"><B>NO FRAMES</B></A>
-
-<SCRIPT>
- <!--
- if(window==top) {
- document.writeln('<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>');
- }
- //-->
-</SCRIPT>
-<NOSCRIPT>
-<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>
-</NOSCRIPT>
-</FONT></TD>
-</TR>
-</TABLE>
-<!-- =========== END OF NAVBAR =========== -->
-
-<HR>
-<FONT SIZE="-1">
-
-</FONT>
-<div class="jsdoc_ctime">Documentation generated by <a href="http://jsdoc.sourceforge.net/">JSDoc</a> on Fri Apr 14 21:59:23 2006</div>
-</BODY>
-</HTML>
Copied: trunk/htdocs/js/tinymce/docs/tinymce_api/index-all.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/tinymce_api/index-all.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/tinymce_api/index-all.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/tinymce_api/index-all.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,1663 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN""http://www.w3.org/TR/REC-html40/loose.dtd">
+<!--NewPage-->
+<HTML>
+<HEAD>
+<TITLE>
+Index ()
+</TITLE>
+<LINK REL ="stylesheet" TYPE="text/css" HREF="stylesheet.css" TITLE="Style">
+</HEAD>
+<SCRIPT>
+function asd()
+{
+parent.document.title="Index ()";
+}
+</SCRIPT>
+<BODY BGCOLOR="white" onload="asd();">
+
+<!-- ========== START OF NAVBAR ========== -->
+<A NAME="navbar_top"><!-- --></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0">
+<TR>
+<TD COLSPAN=3 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_top_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3">
+ <TR ALIGN="center" VALIGN="top">
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="overview-summary.html"><FONT CLASS="NavBarFont1"><B>Overview</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <FONT CLASS="NavBarFont1">File</FONT> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <FONT CLASS="NavBarFont1">Class</FONT> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="overview-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A> </TD>
+ <!--TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A> </TD-->
+ <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> <FONT CLASS="NavBarFont1Rev"><B>Index</B></FONT> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
+ </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+<B></B>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ PREV
+ NEXT</FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="index.html" TARGET="_top"><B>FRAMES</B></A>
+ <A HREF="index-all.html" TARGET="_top"><B>NO FRAMES</B></A>
+
+<SCRIPT>
+ <!--
+ if(window==top) {
+ document.writeln('<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>');
+ }
+ //-->
+</SCRIPT>
+<NOSCRIPT>
+<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>
+</NOSCRIPT>
+</FONT></TD>
+</TR>
+</TABLE>
+<!-- =========== END OF NAVBAR =========== -->
+
+<!--
+ Listing of letters
+-->
+ <A HREF="index-all.html#_____">_</A> <A HREF="index-all.html#__A__">A</A> <A HREF="index-all.html#__B__">B</A> <A HREF="index-all.html#__C__">C</A> <A HREF="index-all.html#__D__">D</A> <A HREF="index-all.html#__E__">E</A> <A HREF="index-all.html#__F__">F</A> <A HREF="index-all.html#__G__">G</A> <A HREF="index-all.html#__H__">H</A> <A HREF="index-all.html#__I__">I</A> <A HREF="index-all.html#__L__">L</A> <A HREF="index-all.html#__M__">M</A> <A HREF="index-all.html#__N__">N</A> <A HREF="index-all.html#__O__">O</A> <A HREF="index-all.html#__P__">P</A> <A HREF="index-all.html#__Q__">Q</A> <A HREF="index-all.html#__R__">R</A> <A HREF="index-all.html#__S__">S</A> <A HREF="index-all.html#__T__">T</A> <A HREF="index-all.html#__U__">U</A> <A HREF="index-all.html#__W__">W</A> <A HREF="index-all.html#__X__">X</A>
+<HR>
+<!-- End letter listing -->
+
+<A NAME="_____"><!-- --></A><H2>
+<B>_</B></H2>
+
+<DL>
+<DT><A HREF="TinyMCE_Engine.html#_getElementById"><B>_getElementById(id, d)</B></A> -
+Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Engine.html#_removeInternal"><B>_removeInternal(n)</B></A> -
+Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
+<DD>
+</DL>
+
+<HR>
+
+<A NAME="__A__"><!-- --></A><H2>
+<B>A</B></H2>
+
+<DL>
+<DT><A HREF="TinyMCE_Engine.html#accessibleEventHandler"><B>accessibleEventHandler(e)</B></A> -
+Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_UndoRedo.html#add"><B>add(l)</B></A> -
+Instance method in class <A HREF="TinyMCE_UndoRedo.html">TinyMCE_UndoRedo</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Engine.html#addButtonMap"><B>addButtonMap(m)</B></A> -
+Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Engine.html#addCSSClass"><B>addCSSClass(e, c, b)</B></A> -
+Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Engine.html#addEvent"><B>addEvent(o, n, h)</B></A> -
+Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Engine.html#addEventHandlers"><B>addEventHandlers(inst)</B></A> -
+Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Engine.html#addMCEControl"><B>addMCEControl(replace_element, form_element_name, target_document)</B></A> -
+Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Engine.html#addMenu"><B>addMenu(n, m)</B></A> -
+Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Engine.html#addPlugin"><B>addPlugin(n, p)</B></A> -
+Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Control.html#addPlugin"><B>addPlugin(n, p)</B></A> -
+Instance method in class <A HREF="TinyMCE_Control.html">TinyMCE_Control</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Cleanup.html#addRuleStr"><B>addRuleStr(s)</B></A> -
+Instance method in class <A HREF="TinyMCE_Cleanup.html">TinyMCE_Cleanup</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Engine.html#addSelectAccessibility"><B>addSelectAccessibility(e, s, w)</B></A> -
+Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Control.html#addShortcut"><B>addShortcut(m, k, d, cmd, ui, va)</B></A> -
+Instance method in class <A HREF="TinyMCE_Control.html">TinyMCE_Control</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Engine.html#addTheme"><B>addTheme(n, t)</B></A> -
+Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Engine.html#addToLang"><B>addToLang(prefix, ar)</B></A> -
+Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Engine.html#applyTemplate"><B>applyTemplate(h, as)</B></A> -
+Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Control.html#autoResetDesignMode"><B>autoResetDesignMode()</B></A> -
+Instance method in class <A HREF="TinyMCE_Control.html">TinyMCE_Control</A>
+<DD>
+</DL>
+
+<HR>
+
+<A NAME="__B__"><!-- --></A><H2>
+<B>B</B></H2>
+
+<DL>
+<DT><A HREF="TinyMCE_Engine.html#buttonMap"><B>buttonMap</B></A> -
+Instance field in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
+<DD>
+</DL>
+
+<HR>
+
+<A NAME="__C__"><!-- --></A><H2>
+<B>C</B></H2>
+
+<DL>
+<DT><A HREF="TinyMCE_Engine.html#callFunc"><B>callFunc(ins, p, n, m, a)</B></A> -
+Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Engine.html#cancelEvent"><B>cancelEvent(e)</B></A> -
+Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Control.html#cleanup"><B>cleanup</B></A> -
+Instance field in class <A HREF="TinyMCE_Control.html">TinyMCE_Control</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Engine.html#cleanupAnchors"><B>cleanupAnchors(doc)</B></A> -
+Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Engine.html#cleanupEventStr"><B>cleanupEventStr(s)</B></A> -
+Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Engine.html#cleanupHTMLCode"><B>cleanupHTMLCode(s)</B></A> -
+Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Engine.html#clearArray"><B>clearArray(a)</B></A> -
+Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Popup.html#close"><B>close()</B></A> -
+Instance method in class <A HREF="TinyMCE_Popup.html">TinyMCE_Popup</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Engine.html#closeWindow"><B>closeWindow(win)</B></A> -
+Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Engine.html#compressStyle"><B>compressStyle(ar, pr, sf, res)</B></A> -
+Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Engine.html#configs"><B>configs</B></A> -
+Instance field in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Engine.html#confirmAdd"><B>confirmAdd(e, settings)</B></A> -
+Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Engine.html#convertAbsoluteURLToRelativeURL"><B>convertAbsoluteURLToRelativeURL(base_url, url_to_relative)</B></A> -
+Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Engine.html#convertAllRelativeURLs"><B>convertAllRelativeURLs(body)</B></A> -
+Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Engine.html#convertFontsToSpans"><B>convertFontsToSpans(doc)</B></A> -
+Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Engine.html#convertHexToRGB"><B>convertHexToRGB(s)</B></A> -
+Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Engine.html#convertRelativeToAbsoluteURL"><B>convertRelativeToAbsoluteURL(base_url, relative_url)</B></A> -
+Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Engine.html#convertRGBToHex"><B>convertRGBToHex(s, k)</B></A> -
+Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Engine.html#convertSpansToFonts"><B>convertSpansToFonts(doc)</B></A> -
+Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Engine.html#convertURL"><B>convertURL(url, node, on_save)</B></A> -
+Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Layer.html#create"><B>create(n, c, p)</B></A> -
+Instance method in class <A HREF="TinyMCE_Layer.html">TinyMCE_Layer</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Engine.html#currentConfig"><B>currentConfig</B></A> -
+Instance field in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
+<DD>
+</DL>
+
+<HR>
+
+<A NAME="__D__"><!-- --></A><H2>
+<B>D</B></H2>
+
+<DL>
+<DT><A HREF="TinyMCE_Engine.html#debug"><B>debug()</B></A> -
+Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Engine.html#dialogCounter"><B>dialogCounter</B></A> -
+Instance field in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Engine.html#dispatchCallback"><B>dispatchCallback(i, p, n)</B></A> -
+Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
+<DD>
+</DL>
+
+<HR>
+
+<A NAME="__E__"><!-- --></A><H2>
+<B>E</B></H2>
+
+<DL>
+<DT><A HREF="TinyMCE_Engine.html#entityDecode"><B>entityDecode(s)</B></A> -
+Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Engine.html#evalFunc"><B>evalFunc(f, idx, a)</B></A> -
+Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Engine.html#eventHandlers"><B>eventHandlers</B></A> -
+Instance field in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Control.html#execCommand"><B>execCommand(command, user_interface, value)</B></A> -
+Instance method in class <A HREF="TinyMCE_Control.html">TinyMCE_Control</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Popup.html#execCommand"><B>execCommand(command, user_interface, value)</B></A> -
+Instance method in class <A HREF="TinyMCE_Popup.html">TinyMCE_Popup</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Engine.html#execCommand"><B>execCommand(command, user_interface, value)</B></A> -
+Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Engine.html#execCommandCallback"><B>execCommandCallback(i, p, n)</B></A> -
+Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Engine.html#execInstanceCommand"><B>execInstanceCommand(editor_id, command, user_interface, value, focus)</B></A> -
+Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Engine.html#executeCallback"><B>executeCallback(i, p, n)</B></A> -
+Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Popup.html#executeOnLoad"><B>executeOnLoad(str)</B></A> -
+Instance method in class <A HREF="TinyMCE_Popup.html">TinyMCE_Popup</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Engine.html#explode"><B>explode(d, s)</B></A> -
+Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Engine.html#extend"><B>extend(p, np)</B></A> -
+Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
+<DD>
+</DL>
+
+<HR>
+
+<A NAME="__F__"><!-- --></A><H2>
+<B>F</B></H2>
+
+<DL>
+<DT><A HREF="TinyMCE_Engine.html#fixGeckoBaseHREFBug"><B>fixGeckoBaseHREFBug(m, e, h)</B></A> -
+Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Cleanup.html#formatHTML"><B>formatHTML(h)</B></A> -
+Instance method in class <A HREF="TinyMCE_Cleanup.html">TinyMCE_Cleanup</A>
+<DD>
+</DL>
+
+<HR>
+
+<A NAME="__G__"><!-- --></A><H2>
+<B>G</B></H2>
+
+<DL>
+<DT><A HREF="TinyMCE_Layer.html#getAbsPosition"><B>getAbsPosition(n)</B></A> -
+Instance method in class <A HREF="TinyMCE_Layer.html">TinyMCE_Layer</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Engine.html#getAbsPosition"><B>getAbsPosition(n)</B></A> -
+Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Engine.html#getAttrib"><B>getAttrib(elm, name, default_value)</B></A> -
+Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Layer.html#getBlocker"><B>getBlocker()</B></A> -
+Instance method in class <A HREF="TinyMCE_Layer.html">TinyMCE_Layer</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Control.html#getBody"><B>getBody()</B></A> -
+Instance method in class <A HREF="TinyMCE_Control.html">TinyMCE_Control</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Selection.html#getBookmark"><B>getBookmark(simple)</B></A> -
+Instance method in class <A HREF="TinyMCE_Selection.html">TinyMCE_Selection</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Engine.html#getButtonHTML"><B>getButtonHTML(id, lang, img, cmd, ui, val)</B></A> -
+Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Engine.html#getContent"><B>getContent(editor_id)</B></A> -
+Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Engine.html#getControlHTML"><B>getControlHTML(c)</B></A> -
+Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Engine.html#getCSSClasses"><B>getCSSClasses(editor_id, doc)</B></A> -
+Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Control.html#getDoc"><B>getDoc()</B></A> -
+Instance method in class <A HREF="TinyMCE_Control.html">TinyMCE_Control</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Engine.html#getEditorId"><B>getEditorId(form_element)</B></A> -
+Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Layer.html#getElement"><B>getElement()</B></A> -
+Instance method in class <A HREF="TinyMCE_Layer.html">TinyMCE_Layer</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Engine.html#getElementByAttributeValue"><B>getElementByAttributeValue(n, e, a, v)</B></A> -
+Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Engine.html#getElementsByAttributeValue"><B>getElementsByAttributeValue(n, e, a, v)</B></A> -
+Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Control.html#getFocusElement"><B>getFocusElement()</B></A> -
+Instance method in class <A HREF="TinyMCE_Control.html">TinyMCE_Control</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Selection.html#getFocusElement"><B>getFocusElement()</B></A> -
+Instance method in class <A HREF="TinyMCE_Selection.html">TinyMCE_Selection</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Engine.html#getInstanceById"><B>getInstanceById(editor_id)</B></A> -
+Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Engine.html#getLang"><B>getLang(name, default_value, parse_entities, va)</B></A> -
+Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Engine.html#getNodeTree"><B>getNodeTree(n, na, t, nn)</B></A> -
+Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Engine.html#getOuterHTML"><B>getOuterHTML(e)</B></A> -
+Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Engine.html#getParam"><B>getParam(name, default_value, strip_whitespace, split_chr)</B></A> -
+Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Engine.html#getParentBlockElement"><B>getParentBlockElement(n)</B></A> -
+Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Engine.html#getParentElement"><B>getParentElement(node, names, attrib_name, attrib_value)</B></A> -
+Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Engine.html#getParentNode"><B>getParentNode(n, f)</B></A> -
+Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Control.html#getRng"><B>getRng()</B></A> -
+Instance method in class <A HREF="TinyMCE_Control.html">TinyMCE_Control</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Selection.html#getRng"><B>getRng()</B></A> -
+Instance method in class <A HREF="TinyMCE_Selection.html">TinyMCE_Selection</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Selection.html#getSel"><B>getSel()</B></A> -
+Instance method in class <A HREF="TinyMCE_Selection.html">TinyMCE_Selection</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Control.html#getSel"><B>getSel()</B></A> -
+Instance method in class <A HREF="TinyMCE_Control.html">TinyMCE_Control</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Selection.html#getSelectedHTML"><B>getSelectedHTML()</B></A> -
+Instance method in class <A HREF="TinyMCE_Selection.html">TinyMCE_Selection</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Selection.html#getSelectedText"><B>getSelectedText()</B></A> -
+Instance method in class <A HREF="TinyMCE_Selection.html">TinyMCE_Selection</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Engine.html#getVisualAidClass"><B>getVisualAidClass(class_name, state)</B></A> -
+Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Control.html#getWin"><B>getWin()</B></A> -
+Instance method in class <A HREF="TinyMCE_Control.html">TinyMCE_Control</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Engine.html#getWindowArg"><B>getWindowArg(n, d)</B></A> -
+Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Popup.html#getWindowArg"><B>getWindowArg(name, default_value)</B></A> -
+Instance method in class <A HREF="TinyMCE_Popup.html">TinyMCE_Popup</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="GLOBALS.html#"><B>GLOBALS</B></A> -
+ class <A HREF="GLOBALS.html">GLOBALS</A>
+<DD>
+</DL>
+
+<HR>
+
+<A NAME="__H__"><!-- --></A><H2>
+<B>H</B></H2>
+
+<DL>
+<DT><A HREF="TinyMCE_Engine.html#handleEvent"><B>handleEvent(e)</B></A> -
+Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Control.html#handleShortcut"><B>handleShortcut(e)</B></A> -
+Instance method in class <A HREF="TinyMCE_Control.html">TinyMCE_Control</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Engine.html#handleVisualAid"><B>handleVisualAid(el, deep, state, inst, skip_dispatch)</B></A> -
+Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Engine.html#hasMenu"><B>hasMenu(n)</B></A> -
+Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Control.html#hasMouseMoved"><B>hasMouseMoved</B></A> -
+Instance field in class <A HREF="TinyMCE_Control.html">TinyMCE_Control</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Engine.html#hasPlugin"><B>hasPlugin(n)</B></A> -
+Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Control.html#hasPlugin"><B>hasPlugin(n)</B></A> -
+Instance method in class <A HREF="TinyMCE_Control.html">TinyMCE_Control</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Engine.html#hasTheme"><B>hasTheme(n)</B></A> -
+Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Layer.html#hide"><B>hide()</B></A> -
+Instance method in class <A HREF="TinyMCE_Layer.html">TinyMCE_Layer</A>
+<DD>
+</DL>
+
+<HR>
+
+<A NAME="__I__"><!-- --></A><H2>
+<B>I</B></H2>
+
+<DL>
+<DT><A HREF="TinyMCE_Engine.html#idCounter"><B>idCounter</B></A> -
+Instance field in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Popup.html#importClass"><B>importClass(c)</B></A> -
+Instance method in class <A HREF="TinyMCE_Popup.html">TinyMCE_Popup</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Engine.html#importCSS"><B>importCSS(doc, css)</B></A> -
+Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Engine.html#importPluginLanguagePack"><B>importPluginLanguagePack(name, valid_languages)</B></A> -
+Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Engine.html#importThemeLanguagePack"><B>importThemeLanguagePack(name)</B></A> -
+Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Popup.html#init"><B>init()</B></A> -
+Instance method in class <A HREF="TinyMCE_Popup.html">TinyMCE_Popup</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Cleanup.html#init"><B>init(s)</B></A> -
+Instance method in class <A HREF="TinyMCE_Cleanup.html">TinyMCE_Cleanup</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Engine.html#init"><B>init(settings)</B></A> -
+Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Engine.html#insertAfter"><B>insertAfter(n, r)</B></A> -
+Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Selection.html#instance"><B>instance</B></A> -
+Instance field in class <A HREF="TinyMCE_Selection.html">TinyMCE_Selection</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_UndoRedo.html#instance"><B>instance</B></A> -
+Instance field in class <A HREF="TinyMCE_UndoRedo.html">TinyMCE_UndoRedo</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Engine.html#instances"><B>instances</B></A> -
+Instance field in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Engine.html#isBlockElement"><B>isBlockElement(n)</B></A> -
+Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Control.html#isDirty"><B>isDirty()</B></A> -
+Instance method in class <A HREF="TinyMCE_Control.html">TinyMCE_Control</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Engine.html#isGecko"><B>isGecko</B></A> -
+Instance field in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Control.html#isHidden"><B>isHidden()</B></A> -
+Instance method in class <A HREF="TinyMCE_Control.html">TinyMCE_Control</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Engine.html#isInstance"><B>isInstance(o)</B></A> -
+Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Engine.html#isLoaded"><B>isLoaded</B></A> -
+Instance field in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Engine.html#isMac"><B>isMac</B></A> -
+Instance field in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Engine.html#isMSIE"><B>isMSIE</B></A> -
+Instance field in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Engine.html#isMSIE5"><B>isMSIE5</B></A> -
+Instance field in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Engine.html#isMSIE5_0"><B>isMSIE5_0</B></A> -
+Instance field in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Engine.html#isNS7"><B>isNS7</B></A> -
+Instance field in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Engine.html#isNS71"><B>isNS71</B></A> -
+Instance field in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Engine.html#isOpera"><B>isOpera</B></A> -
+Instance field in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Engine.html#isSafari"><B>isSafari</B></A> -
+Instance field in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Control.html#isTinyMCE_Control"><B>isTinyMCE_Control</B></A> -
+Instance field in class <A HREF="TinyMCE_Control.html">TinyMCE_Control</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Layer.html#isVisible"><B>isVisible()</B></A> -
+Instance method in class <A HREF="TinyMCE_Layer.html">TinyMCE_Layer</A>
+<DD>
+</DL>
+
+<HR>
+
+<A NAME="__L__"><!-- --></A><H2>
+<B>L</B></H2>
+
+<DL>
+<DT><A HREF="TinyMCE_Engine.html#loadCSS"><B>loadCSS(url)</B></A> -
+Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Engine.html#loadedFiles"><B>loadedFiles</B></A> -
+Instance field in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Engine.html#loadedPlugins"><B>loadedPlugins</B></A> -
+Instance field in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Engine.html#loadPlugin"><B>loadPlugin(n, u)</B></A> -
+Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Engine.html#loadScript"><B>loadScript(url)</B></A> -
+Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
+<DD>
+</DL>
+
+<HR>
+
+<A NAME="__M__"><!-- --></A><H2>
+<B>M</B></H2>
+
+<DL>
+<DT><A HREF="TinyMCE_Engine.html#majorVersion"><B>majorVersion</B></A> -
+Instance field in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Engine.html#menus"><B>menus</B></A> -
+Instance field in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Engine.html#minorVersion"><B>minorVersion</B></A> -
+Instance field in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Layer.html#moveBy"><B>moveBy(x, y)</B></A> -
+Instance method in class <A HREF="TinyMCE_Layer.html">TinyMCE_Layer</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Layer.html#moveRelativeTo"><B>moveRelativeTo(re, p)</B></A> -
+Instance method in class <A HREF="TinyMCE_Layer.html">TinyMCE_Layer</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Layer.html#moveTo"><B>moveTo(x, y)</B></A> -
+Instance method in class <A HREF="TinyMCE_Layer.html">TinyMCE_Layer</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Selection.html#moveToBookmark"><B>moveToBookmark(bookmark)</B></A> -
+Instance method in class <A HREF="TinyMCE_Selection.html">TinyMCE_Selection</A>
+<DD>
+</DL>
+
+<HR>
+
+<A NAME="__N__"><!-- --></A><H2>
+<B>N</B></H2>
+
+<DL>
+<DT><A HREF="TinyMCE_Engine.html#nextNode"><B>nextNode(e, n)</B></A> -
+Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
+<DD>
+</DL>
+
+<HR>
+
+<A NAME="__O__"><!-- --></A><H2>
+<B>O</B></H2>
+
+<DL>
+<DT><A HREF="TinyMCE_Popup.html#onLoad"><B>onLoad()</B></A> -
+Instance method in class <A HREF="TinyMCE_Popup.html">TinyMCE_Popup</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Engine.html#onLoad"><B>onLoad()</B></A> -
+Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Engine.html#onMouseMove"><B>onMouseMove()</B></A> -
+Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Popup.html#openBrowser"><B>openBrowser(element_id, type, option)</B></A> -
+Instance method in class <A HREF="TinyMCE_Popup.html">TinyMCE_Popup</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Engine.html#openWindow"><B>openWindow(template, args)</B></A> -
+Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
+<DD>
+</DL>
+
+<HR>
+
+<A NAME="__P__"><!-- --></A><H2>
+<B>P</B></H2>
+
+<DL>
+<DT><A HREF="TinyMCE_Layer.html#parseInt"><B>parseInt(s)</B></A> -
+Instance method in class <A HREF="TinyMCE_Layer.html">TinyMCE_Layer</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Cleanup.html#parseRuleStr"><B>parseRuleStr(s)</B></A> -
+Instance method in class <A HREF="TinyMCE_Cleanup.html">TinyMCE_Cleanup</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Engine.html#parseStyle"><B>parseStyle(str)</B></A> -
+Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Engine.html#parseURL"><B>parseURL(url_str)</B></A> -
+Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Popup.html#pickColor"><B>pickColor(e, element_id)</B></A> -
+Instance method in class <A HREF="TinyMCE_Popup.html">TinyMCE_Popup</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Engine.html#plugins"><B>plugins</B></A> -
+Instance field in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Control.html#plugins"><B>plugins</B></A> -
+Instance field in class <A HREF="TinyMCE_Control.html">TinyMCE_Control</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Engine.html#prevNode"><B>prevNode(e, n)</B></A> -
+Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
+<DD>
+</DL>
+
+<HR>
+
+<A NAME="__Q__"><!-- --></A><H2>
+<B>Q</B></H2>
+
+<DL>
+<DT><A HREF="TinyMCE_Control.html#queryCommandState"><B>queryCommandState(c)</B></A> -
+Instance method in class <A HREF="TinyMCE_Control.html">TinyMCE_Control</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Control.html#queryCommandValue"><B>queryCommandValue(c)</B></A> -
+Instance method in class <A HREF="TinyMCE_Control.html">TinyMCE_Control</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Engine.html#queryInstanceCommandState"><B>queryInstanceCommandState(editor_id, command)</B></A> -
+Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Engine.html#queryInstanceCommandValue"><B>queryInstanceCommandValue(editor_id, command)</B></A> -
+Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
+<DD>
+</DL>
+
+<HR>
+
+<A NAME="__R__"><!-- --></A><H2>
+<B>R</B></H2>
+
+<DL>
+<DT><A HREF="TinyMCE_UndoRedo.html#redo"><B>redo()</B></A> -
+Instance method in class <A HREF="TinyMCE_UndoRedo.html">TinyMCE_UndoRedo</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Engine.html#regexpReplace"><B>regexpReplace(in_str, reg_exp, replace_str, opts)</B></A> -
+Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Engine.html#releaseDate"><B>releaseDate</B></A> -
+Instance field in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Engine.html#removeCSSClass"><B>removeCSSClass(e, c)</B></A> -
+Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Engine.html#removeMCEControl"><B>removeMCEControl(editor_id)</B></A> -
+Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Engine.html#removeTinyMCEFormElements"><B>removeTinyMCEFormElements(form_obj)</B></A> -
+Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Engine.html#renameElement"><B>renameElement(e, n, d)</B></A> -
+Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Control.html#repaint"><B>repaint()</B></A> -
+Instance method in class <A HREF="TinyMCE_Control.html">TinyMCE_Control</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Engine.html#replaceVar"><B>replaceVar(h, r, v)</B></A> -
+Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Engine.html#resetForm"><B>resetForm(form_index)</B></A> -
+Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Layer.html#resizeBy"><B>resizeBy(w, h)</B></A> -
+Instance method in class <A HREF="TinyMCE_Layer.html">TinyMCE_Layer</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Layer.html#resizeTo"><B>resizeTo(w, h)</B></A> -
+Instance method in class <A HREF="TinyMCE_Layer.html">TinyMCE_Layer</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Popup.html#resizeToContent"><B>resizeToContent()</B></A> -
+Instance method in class <A HREF="TinyMCE_Popup.html">TinyMCE_Popup</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Popup.html#resizeToInnerSize"><B>resizeToInnerSize()</B></A> -
+Instance method in class <A HREF="TinyMCE_Popup.html">TinyMCE_Popup</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Popup.html#restoreSelection"><B>restoreSelection()</B></A> -
+Instance method in class <A HREF="TinyMCE_Popup.html">TinyMCE_Popup</A>
+<DD>
+</DL>
+
+<HR>
+
+<A NAME="__S__"><!-- --></A><H2>
+<B>S</B></H2>
+
+<DL>
+<DT><A HREF="TinyMCE_Selection.html#scrollToNode"><B>scrollToNode(node)</B></A> -
+Instance method in class <A HREF="TinyMCE_Selection.html">TinyMCE_Selection</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Control.html#selection"><B>selection</B></A> -
+Instance field in class <A HREF="TinyMCE_Control.html">TinyMCE_Control</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Selection.html#selectNode"><B>selectNode(node, collapse, select_text_node, to_start)</B></A> -
+Instance method in class <A HREF="TinyMCE_Selection.html">TinyMCE_Selection</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Engine.html#selectNodes"><B>selectNodes(n, f, a)</B></A> -
+Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Cleanup.html#serializeNodeAsHTML"><B>serializeNodeAsHTML(n)</B></A> -
+Instance method in class <A HREF="TinyMCE_Cleanup.html">TinyMCE_Cleanup</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Cleanup.html#serializeNodeAsXML"><B>serializeNodeAsXML(n)</B></A> -
+Instance method in class <A HREF="TinyMCE_Cleanup.html">TinyMCE_Cleanup</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Engine.html#serializeStyle"><B>serializeStyle(ar)</B></A> -
+Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Engine.html#serializeURL"><B>serializeURL(up)</B></A> -
+Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Engine.html#setAttrib"><B>setAttrib(element, name, value, fix_value)</B></A> -
+Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Control.html#setBaseHREF"><B>setBaseHREF(u)</B></A> -
+Instance method in class <A HREF="TinyMCE_Control.html">TinyMCE_Control</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Layer.html#setBlockMode"><B>setBlockMode(s)</B></A> -
+Instance method in class <A HREF="TinyMCE_Layer.html">TinyMCE_Layer</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Engine.html#setContent"><B>setContent(h)</B></A> -
+Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Engine.html#setInnerHTML"><B>setInnerHTML(e, h)</B></A> -
+Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Engine.html#setOuterHTML"><B>setOuterHTML(e, h)</B></A> -
+Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Engine.html#setPluginBaseURL"><B>setPluginBaseURL(n, u)</B></A> -
+Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Engine.html#setStyleAttrib"><B>setStyleAttrib(elm, name, value)</B></A> -
+Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Control.html#settings"><B>settings</B></A> -
+Instance field in class <A HREF="TinyMCE_Control.html">TinyMCE_Control</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Engine.html#setupContent"><B>setupContent(editor_id)</B></A> -
+Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Engine.html#setWindowArg"><B>setWindowArg(n, v)</B></A> -
+Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Control.html#shortcuts"><B>shortcuts</B></A> -
+Instance field in class <A HREF="TinyMCE_Control.html">TinyMCE_Control</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Layer.html#show"><B>show()</B></A> -
+Instance method in class <A HREF="TinyMCE_Layer.html">TinyMCE_Layer</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Cleanup.html#split"><B>split(re, s)</B></A> -
+Instance method in class <A HREF="TinyMCE_Cleanup.html">TinyMCE_Cleanup</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Engine.html#storeAwayURLs"><B>storeAwayURLs(s)</B></A> -
+Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Engine.html#submitPatch"><B>submitPatch()</B></A> -
+Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Engine.html#switchClass"><B>switchClass(ei, c)</B></A> -
+Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Engine.html#switchClassCache"><B>switchClassCache</B></A> -
+Instance field in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Control.html#switchSettings"><B>switchSettings()</B></A> -
+Instance method in class <A HREF="TinyMCE_Control.html">TinyMCE_Control</A>
+<DD>
+</DL>
+
+<HR>
+
+<A NAME="__T__"><!-- --></A><H2>
+<B>T</B></H2>
+
+<DL>
+<DT><A HREF="TinyMCE_Engine.html#themes"><B>themes</B></A> -
+Instance field in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Cleanup.html#"><B>TinyMCE_Cleanup</B></A> -
+ class <A HREF="TinyMCE_Cleanup.html">TinyMCE_Cleanup</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Cleanup.html#constructor_detail"><B>TinyMCE_Cleanup()</B></A> -
+Constructor in class <A HREF="TinyMCE_Cleanup.html">TinyMCE_Cleanup</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Control.html#"><B>TinyMCE_Control</B></A> -
+ class <A HREF="TinyMCE_Control.html">TinyMCE_Control</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Control.html#constructor_detail"><B>TinyMCE_Control(settings)</B></A> -
+Constructor in class <A HREF="TinyMCE_Control.html">TinyMCE_Control</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Engine.html#"><B>TinyMCE_Engine</B></A> -
+ class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Engine.html#constructor_detail"><B>TinyMCE_Engine()</B></A> -
+Constructor in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Layer.html#"><B>TinyMCE_Layer</B></A> -
+ class <A HREF="TinyMCE_Layer.html">TinyMCE_Layer</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Layer.html#constructor_detail"><B>TinyMCE_Layer(id, bm)</B></A> -
+Constructor in class <A HREF="TinyMCE_Layer.html">TinyMCE_Layer</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="GLOBALS.html#TinyMCE_Menu"><B>TinyMCE_Menu()</B></A> -
+Class method in class <A HREF="GLOBALS.html">GLOBALS</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Popup.html#"><B>TinyMCE_Popup</B></A> -
+ class <A HREF="TinyMCE_Popup.html">TinyMCE_Popup</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Popup.html#constructor_detail"><B>TinyMCE_Popup()</B></A> -
+Constructor in class <A HREF="TinyMCE_Popup.html">TinyMCE_Popup</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Selection.html#"><B>TinyMCE_Selection</B></A> -
+ class <A HREF="TinyMCE_Selection.html">TinyMCE_Selection</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Selection.html#constructor_detail"><B>TinyMCE_Selection(inst)</B></A> -
+Constructor in class <A HREF="TinyMCE_Selection.html">TinyMCE_Selection</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_UndoRedo.html#"><B>TinyMCE_UndoRedo</B></A> -
+ class <A HREF="TinyMCE_UndoRedo.html">TinyMCE_UndoRedo</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_UndoRedo.html#constructor_detail"><B>TinyMCE_UndoRedo(inst)</B></A> -
+Constructor in class <A HREF="TinyMCE_UndoRedo.html">TinyMCE_UndoRedo</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Engine.html#triggerNodeChange"><B>triggerNodeChange(focus, setup_content)</B></A> -
+Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Engine.html#triggerSave"><B>triggerSave(skip_cleanup, skip_callback)</B></A> -
+Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Control.html#triggerSave"><B>triggerSave(skip_cleanup, skip_callback)</B></A> -
+Instance method in class <A HREF="TinyMCE_Control.html">TinyMCE_Control</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Engine.html#trim"><B>trim(s)</B></A> -
+Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_UndoRedo.html#typingUndoIndex"><B>typingUndoIndex</B></A> -
+Instance field in class <A HREF="TinyMCE_UndoRedo.html">TinyMCE_UndoRedo</A>
+<DD>
+</DL>
+
+<HR>
+
+<A NAME="__U__"><!-- --></A><H2>
+<B>U</B></H2>
+
+<DL>
+<DT><A HREF="TinyMCE_UndoRedo.html#undo"><B>undo()</B></A> -
+Instance method in class <A HREF="TinyMCE_UndoRedo.html">TinyMCE_UndoRedo</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_UndoRedo.html#undoIndex"><B>undoIndex</B></A> -
+Instance field in class <A HREF="TinyMCE_UndoRedo.html">TinyMCE_UndoRedo</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_UndoRedo.html#undoLevels"><B>undoLevels</B></A> -
+Instance field in class <A HREF="TinyMCE_UndoRedo.html">TinyMCE_UndoRedo</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Control.html#undoRedo"><B>undoRedo</B></A> -
+Instance field in class <A HREF="TinyMCE_Control.html">TinyMCE_Control</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_UndoRedo.html#undoRedo"><B>undoRedo</B></A> -
+Instance field in class <A HREF="TinyMCE_UndoRedo.html">TinyMCE_UndoRedo</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Control.html#undoRedoLevel"><B>undoRedoLevel</B></A> -
+Instance field in class <A HREF="TinyMCE_Control.html">TinyMCE_Control</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Engine.html#unloadHandler"><B>unloadHandler()</B></A> -
+Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Layer.html#updateBlocker"><B>updateBlocker()</B></A> -
+Instance method in class <A HREF="TinyMCE_Layer.html">TinyMCE_Layer</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Engine.html#updateContent"><B>updateContent(form_element_name)</B></A> -
+Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
+<DD>
+</DL>
+
+<HR>
+
+<A NAME="__W__"><!-- --></A><H2>
+<B>W</B></H2>
+
+<DL>
+<DT><A HREF="TinyMCE_Engine.html#windowArgs"><B>windowArgs</B></A> -
+Instance field in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
+<DD>
+</DL>
+
+<HR>
+
+<A NAME="__X__"><!-- --></A><H2>
+<B>X</B></H2>
+
+<DL>
+<DT><A HREF="TinyMCE_Engine.html#xmlEncode"><B>xmlEncode(s)</B></A> -
+Instance method in class <A HREF="TinyMCE_Engine.html">TinyMCE_Engine</A>
+<DD>
+</DL>
+
+<DL>
+<DT><A HREF="TinyMCE_Cleanup.html#xmlEncode"><B>xmlEncode(s)</B></A> -
+Instance method in class <A HREF="TinyMCE_Cleanup.html">TinyMCE_Cleanup</A>
+<DD>
+</DL>
+
+<HR>
+
+<!--
+ Listing of letters
+-->
+ <A HREF="index-all.html#_____">_</A> <A HREF="index-all.html#__A__">A</A> <A HREF="index-all.html#__B__">B</A> <A HREF="index-all.html#__C__">C</A> <A HREF="index-all.html#__D__">D</A> <A HREF="index-all.html#__E__">E</A> <A HREF="index-all.html#__F__">F</A> <A HREF="index-all.html#__G__">G</A> <A HREF="index-all.html#__H__">H</A> <A HREF="index-all.html#__I__">I</A> <A HREF="index-all.html#__L__">L</A> <A HREF="index-all.html#__M__">M</A> <A HREF="index-all.html#__N__">N</A> <A HREF="index-all.html#__O__">O</A> <A HREF="index-all.html#__P__">P</A> <A HREF="index-all.html#__Q__">Q</A> <A HREF="index-all.html#__R__">R</A> <A HREF="index-all.html#__S__">S</A> <A HREF="index-all.html#__T__">T</A> <A HREF="index-all.html#__U__">U</A> <A HREF="index-all.html#__W__">W</A> <A HREF="index-all.html#__X__">X</A>
+
+
+<!-- ========== START OF NAVBAR ========== -->
+<A NAME="navbar_top"><!-- --></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0">
+<TR>
+<TD COLSPAN=3 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_top_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3">
+ <TR ALIGN="center" VALIGN="top">
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="overview-summary.html"><FONT CLASS="NavBarFont1"><B>Overview</B></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <FONT CLASS="NavBarFont1">File</FONT> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <FONT CLASS="NavBarFont1">Class</FONT> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="overview-tree.html"><FONT CLASS="NavBarFont1"><b>Tree</b></FONT></A> </TD>
+ <!--TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A> </TD-->
+ <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> <FONT CLASS="NavBarFont1Rev"><B>Index</B></FONT> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
+ </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+<B></B>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ PREV
+ NEXT</FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="index.html" TARGET="_top"><B>FRAMES</B></A>
+ <A HREF="index-all.html" TARGET="_top"><B>NO FRAMES</B></A>
+
+<SCRIPT>
+ <!--
+ if(window==top) {
+ document.writeln('<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>');
+ }
+ //-->
+</SCRIPT>
+<NOSCRIPT>
+<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>
+</NOSCRIPT>
+</FONT></TD>
+</TR>
+</TABLE>
+<!-- =========== END OF NAVBAR =========== -->
+
+<HR>
+<FONT SIZE="-1">
+
+</FONT>
+<div class="jsdoc_ctime">Documentation generated by <a href="http://jsdoc.sourceforge.net/">JSDoc</a> on Fri Apr 14 21:59:23 2006</div>
+</BODY>
+</HTML>
Deleted: trunk/htdocs/js/tinymce/docs/tinymce_api/index.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/tinymce_api/index.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/tinymce_api/index.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,27 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN""http://www.w3.org/TR/REC-html40/loose.dtd">
-<HTML>
-<HEAD>
-<TITLE>
-Generated Javascript Documentation
-</TITLE>
-</HEAD>
-<FRAMESET cols="20%,80%">
-
-<FRAMESET rows="40%,50%">
-<FRAME src="overview-frame.html" name="overviewFrame">
-
-<FRAME src="allclasses-frame.html" name="packageFrame">
-
-</FRAMESET>
-
-<FRAME src="overview-summary.html" name="classFrame">
-</FRAMESET>
-<NOFRAMES>
-<H2>
-Frame Alert</H2>
-
-<P>
-This document is designed to be viewed using the frames feature. If you see this message, you are using a non-frame-capable web client.
-<BR>
-Link to <A HREF="allclasses-frame.html">Non-frame version.</A></NOFRAMES>
-</HTML>
Copied: trunk/htdocs/js/tinymce/docs/tinymce_api/index.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/tinymce_api/index.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/tinymce_api/index.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/tinymce_api/index.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,27 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN""http://www.w3.org/TR/REC-html40/loose.dtd">
+<HTML>
+<HEAD>
+<TITLE>
+Generated Javascript Documentation
+</TITLE>
+</HEAD>
+<FRAMESET cols="20%,80%">
+
+<FRAMESET rows="40%,50%">
+<FRAME src="overview-frame.html" name="overviewFrame">
+
+<FRAME src="allclasses-frame.html" name="packageFrame">
+
+</FRAMESET>
+
+<FRAME src="overview-summary.html" name="classFrame">
+</FRAMESET>
+<NOFRAMES>
+<H2>
+Frame Alert</H2>
+
+<P>
+This document is designed to be viewed using the frames feature. If you see this message, you are using a non-frame-capable web client.
+<BR>
+Link to <A HREF="allclasses-frame.html">Non-frame version.</A></NOFRAMES>
+</HTML>
Deleted: trunk/htdocs/js/tinymce/docs/tinymce_api/overview-TinyMCE_Array.class.js.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/tinymce_api/overview-TinyMCE_Array.class.js.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/tinymce_api/overview-TinyMCE_Array.class.js.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,30 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN""http://www.w3.org/TR/REC-html40/loose.dtd">
-<!--NewPage-->
-<HTML>
-<HEAD>
-<TITLE>
- TinyMCE_Array.class.js
-</TITLE>
-<LINK REL ="stylesheet" TYPE="text/css" HREF="stylesheet.css" TITLE="Style">
-</HEAD>
-<SCRIPT>
-function asd()
-{
-parent.document.title=" TinyMCE_Array.class.js";
-}
-</SCRIPT>
-<BODY BGCOLOR="white" onload="asd();">
-
-<H3 class="FrameHeadingFont"><B></B></H3>
-<FONT size="+1" CLASS="FrameHeadingFont">
-<B><a href="overview-summary-TinyMCE_Array.class.js.html"
- target="classFrame">TinyMCE_Array.class.js</a></B></FONT>
-<BR>
-
-<TABLE BORDER="0" WIDTH="100%">
-
-
-</TABLE>
-
-</BODY>
-</HTML>
Copied: trunk/htdocs/js/tinymce/docs/tinymce_api/overview-TinyMCE_Array.class.js.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/tinymce_api/overview-TinyMCE_Array.class.js.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/tinymce_api/overview-TinyMCE_Array.class.js.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/tinymce_api/overview-TinyMCE_Array.class.js.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,30 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN""http://www.w3.org/TR/REC-html40/loose.dtd">
+<!--NewPage-->
+<HTML>
+<HEAD>
+<TITLE>
+ TinyMCE_Array.class.js
+</TITLE>
+<LINK REL ="stylesheet" TYPE="text/css" HREF="stylesheet.css" TITLE="Style">
+</HEAD>
+<SCRIPT>
+function asd()
+{
+parent.document.title=" TinyMCE_Array.class.js";
+}
+</SCRIPT>
+<BODY BGCOLOR="white" onload="asd();">
+
+<H3 class="FrameHeadingFont"><B></B></H3>
+<FONT size="+1" CLASS="FrameHeadingFont">
+<B><a href="overview-summary-TinyMCE_Array.class.js.html"
+ target="classFrame">TinyMCE_Array.class.js</a></B></FONT>
+<BR>
+
+<TABLE BORDER="0" WIDTH="100%">
+
+
+</TABLE>
+
+</BODY>
+</HTML>
Deleted: trunk/htdocs/js/tinymce/docs/tinymce_api/overview-TinyMCE_Cleanup.class.js.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/tinymce_api/overview-TinyMCE_Cleanup.class.js.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/tinymce_api/overview-TinyMCE_Cleanup.class.js.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,36 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN""http://www.w3.org/TR/REC-html40/loose.dtd">
-<!--NewPage-->
-<HTML>
-<HEAD>
-<TITLE>
- TinyMCE_Cleanup.class.js
-</TITLE>
-<LINK REL ="stylesheet" TYPE="text/css" HREF="stylesheet.css" TITLE="Style">
-</HEAD>
-<SCRIPT>
-function asd()
-{
-parent.document.title=" TinyMCE_Cleanup.class.js";
-}
-</SCRIPT>
-<BODY BGCOLOR="white" onload="asd();">
-
-<H3 class="FrameHeadingFont"><B></B></H3>
-<FONT size="+1" CLASS="FrameHeadingFont">
-<B><a href="overview-summary-TinyMCE_Cleanup.class.js.html"
- target="classFrame">TinyMCE_Cleanup.class.js</a></B></FONT>
-<BR>
-
-<TABLE BORDER="0" WIDTH="100%">
-
-
-<TR>
-<TD NOWRAP><FONT CLASS="FrameItemFont"><A HREF="TinyMCE_Cleanup.html" TARGET="classFrame">TinyMCE_Cleanup</A>
-<BR>
-</FONT></TD>
-</TR>
-
-</TABLE>
-
-</BODY>
-</HTML>
Copied: trunk/htdocs/js/tinymce/docs/tinymce_api/overview-TinyMCE_Cleanup.class.js.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/tinymce_api/overview-TinyMCE_Cleanup.class.js.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/tinymce_api/overview-TinyMCE_Cleanup.class.js.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/tinymce_api/overview-TinyMCE_Cleanup.class.js.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,36 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN""http://www.w3.org/TR/REC-html40/loose.dtd">
+<!--NewPage-->
+<HTML>
+<HEAD>
+<TITLE>
+ TinyMCE_Cleanup.class.js
+</TITLE>
+<LINK REL ="stylesheet" TYPE="text/css" HREF="stylesheet.css" TITLE="Style">
+</HEAD>
+<SCRIPT>
+function asd()
+{
+parent.document.title=" TinyMCE_Cleanup.class.js";
+}
+</SCRIPT>
+<BODY BGCOLOR="white" onload="asd();">
+
+<H3 class="FrameHeadingFont"><B></B></H3>
+<FONT size="+1" CLASS="FrameHeadingFont">
+<B><a href="overview-summary-TinyMCE_Cleanup.class.js.html"
+ target="classFrame">TinyMCE_Cleanup.class.js</a></B></FONT>
+<BR>
+
+<TABLE BORDER="0" WIDTH="100%">
+
+
+<TR>
+<TD NOWRAP><FONT CLASS="FrameItemFont"><A HREF="TinyMCE_Cleanup.html" TARGET="classFrame">TinyMCE_Cleanup</A>
+<BR>
+</FONT></TD>
+</TR>
+
+</TABLE>
+
+</BODY>
+</HTML>
Deleted: trunk/htdocs/js/tinymce/docs/tinymce_api/overview-TinyMCE_Control.class.js.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/tinymce_api/overview-TinyMCE_Control.class.js.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/tinymce_api/overview-TinyMCE_Control.class.js.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,36 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN""http://www.w3.org/TR/REC-html40/loose.dtd">
-<!--NewPage-->
-<HTML>
-<HEAD>
-<TITLE>
- TinyMCE_Control.class.js
-</TITLE>
-<LINK REL ="stylesheet" TYPE="text/css" HREF="stylesheet.css" TITLE="Style">
-</HEAD>
-<SCRIPT>
-function asd()
-{
-parent.document.title=" TinyMCE_Control.class.js";
-}
-</SCRIPT>
-<BODY BGCOLOR="white" onload="asd();">
-
-<H3 class="FrameHeadingFont"><B></B></H3>
-<FONT size="+1" CLASS="FrameHeadingFont">
-<B><a href="overview-summary-TinyMCE_Control.class.js.html"
- target="classFrame">TinyMCE_Control.class.js</a></B></FONT>
-<BR>
-
-<TABLE BORDER="0" WIDTH="100%">
-
-
-<TR>
-<TD NOWRAP><FONT CLASS="FrameItemFont"><A HREF="TinyMCE_Control.html" TARGET="classFrame">TinyMCE_Control</A>
-<BR>
-</FONT></TD>
-</TR>
-
-</TABLE>
-
-</BODY>
-</HTML>
Copied: trunk/htdocs/js/tinymce/docs/tinymce_api/overview-TinyMCE_Control.class.js.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/tinymce_api/overview-TinyMCE_Control.class.js.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/tinymce_api/overview-TinyMCE_Control.class.js.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/tinymce_api/overview-TinyMCE_Control.class.js.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,36 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN""http://www.w3.org/TR/REC-html40/loose.dtd">
+<!--NewPage-->
+<HTML>
+<HEAD>
+<TITLE>
+ TinyMCE_Control.class.js
+</TITLE>
+<LINK REL ="stylesheet" TYPE="text/css" HREF="stylesheet.css" TITLE="Style">
+</HEAD>
+<SCRIPT>
+function asd()
+{
+parent.document.title=" TinyMCE_Control.class.js";
+}
+</SCRIPT>
+<BODY BGCOLOR="white" onload="asd();">
+
+<H3 class="FrameHeadingFont"><B></B></H3>
+<FONT size="+1" CLASS="FrameHeadingFont">
+<B><a href="overview-summary-TinyMCE_Control.class.js.html"
+ target="classFrame">TinyMCE_Control.class.js</a></B></FONT>
+<BR>
+
+<TABLE BORDER="0" WIDTH="100%">
+
+
+<TR>
+<TD NOWRAP><FONT CLASS="FrameItemFont"><A HREF="TinyMCE_Control.html" TARGET="classFrame">TinyMCE_Control</A>
+<BR>
+</FONT></TD>
+</TR>
+
+</TABLE>
+
+</BODY>
+</HTML>
Deleted: trunk/htdocs/js/tinymce/docs/tinymce_api/overview-TinyMCE_DOMUtils.class.js.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/tinymce_api/overview-TinyMCE_DOMUtils.class.js.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/tinymce_api/overview-TinyMCE_DOMUtils.class.js.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,30 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN""http://www.w3.org/TR/REC-html40/loose.dtd">
-<!--NewPage-->
-<HTML>
-<HEAD>
-<TITLE>
- TinyMCE_DOMUtils.class.js
-</TITLE>
-<LINK REL ="stylesheet" TYPE="text/css" HREF="stylesheet.css" TITLE="Style">
-</HEAD>
-<SCRIPT>
-function asd()
-{
-parent.document.title=" TinyMCE_DOMUtils.class.js";
-}
-</SCRIPT>
-<BODY BGCOLOR="white" onload="asd();">
-
-<H3 class="FrameHeadingFont"><B></B></H3>
-<FONT size="+1" CLASS="FrameHeadingFont">
-<B><a href="overview-summary-TinyMCE_DOMUtils.class.js.html"
- target="classFrame">TinyMCE_DOMUtils.class.js</a></B></FONT>
-<BR>
-
-<TABLE BORDER="0" WIDTH="100%">
-
-
-</TABLE>
-
-</BODY>
-</HTML>
Copied: trunk/htdocs/js/tinymce/docs/tinymce_api/overview-TinyMCE_DOMUtils.class.js.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/tinymce_api/overview-TinyMCE_DOMUtils.class.js.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/tinymce_api/overview-TinyMCE_DOMUtils.class.js.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/tinymce_api/overview-TinyMCE_DOMUtils.class.js.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,30 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN""http://www.w3.org/TR/REC-html40/loose.dtd">
+<!--NewPage-->
+<HTML>
+<HEAD>
+<TITLE>
+ TinyMCE_DOMUtils.class.js
+</TITLE>
+<LINK REL ="stylesheet" TYPE="text/css" HREF="stylesheet.css" TITLE="Style">
+</HEAD>
+<SCRIPT>
+function asd()
+{
+parent.document.title=" TinyMCE_DOMUtils.class.js";
+}
+</SCRIPT>
+<BODY BGCOLOR="white" onload="asd();">
+
+<H3 class="FrameHeadingFont"><B></B></H3>
+<FONT size="+1" CLASS="FrameHeadingFont">
+<B><a href="overview-summary-TinyMCE_DOMUtils.class.js.html"
+ target="classFrame">TinyMCE_DOMUtils.class.js</a></B></FONT>
+<BR>
+
+<TABLE BORDER="0" WIDTH="100%">
+
+
+</TABLE>
+
+</BODY>
+</HTML>
Deleted: trunk/htdocs/js/tinymce/docs/tinymce_api/overview-TinyMCE_Debug.class.js.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/tinymce_api/overview-TinyMCE_Debug.class.js.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/tinymce_api/overview-TinyMCE_Debug.class.js.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,30 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN""http://www.w3.org/TR/REC-html40/loose.dtd">
-<!--NewPage-->
-<HTML>
-<HEAD>
-<TITLE>
- TinyMCE_Debug.class.js
-</TITLE>
-<LINK REL ="stylesheet" TYPE="text/css" HREF="stylesheet.css" TITLE="Style">
-</HEAD>
-<SCRIPT>
-function asd()
-{
-parent.document.title=" TinyMCE_Debug.class.js";
-}
-</SCRIPT>
-<BODY BGCOLOR="white" onload="asd();">
-
-<H3 class="FrameHeadingFont"><B></B></H3>
-<FONT size="+1" CLASS="FrameHeadingFont">
-<B><a href="overview-summary-TinyMCE_Debug.class.js.html"
- target="classFrame">TinyMCE_Debug.class.js</a></B></FONT>
-<BR>
-
-<TABLE BORDER="0" WIDTH="100%">
-
-
-</TABLE>
-
-</BODY>
-</HTML>
Copied: trunk/htdocs/js/tinymce/docs/tinymce_api/overview-TinyMCE_Debug.class.js.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/tinymce_api/overview-TinyMCE_Debug.class.js.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/tinymce_api/overview-TinyMCE_Debug.class.js.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/tinymce_api/overview-TinyMCE_Debug.class.js.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,30 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN""http://www.w3.org/TR/REC-html40/loose.dtd">
+<!--NewPage-->
+<HTML>
+<HEAD>
+<TITLE>
+ TinyMCE_Debug.class.js
+</TITLE>
+<LINK REL ="stylesheet" TYPE="text/css" HREF="stylesheet.css" TITLE="Style">
+</HEAD>
+<SCRIPT>
+function asd()
+{
+parent.document.title=" TinyMCE_Debug.class.js";
+}
+</SCRIPT>
+<BODY BGCOLOR="white" onload="asd();">
+
+<H3 class="FrameHeadingFont"><B></B></H3>
+<FONT size="+1" CLASS="FrameHeadingFont">
+<B><a href="overview-summary-TinyMCE_Debug.class.js.html"
+ target="classFrame">TinyMCE_Debug.class.js</a></B></FONT>
+<BR>
+
+<TABLE BORDER="0" WIDTH="100%">
+
+
+</TABLE>
+
+</BODY>
+</HTML>
Deleted: trunk/htdocs/js/tinymce/docs/tinymce_api/overview-TinyMCE_Engine.class.js.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/tinymce_api/overview-TinyMCE_Engine.class.js.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/tinymce_api/overview-TinyMCE_Engine.class.js.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,36 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN""http://www.w3.org/TR/REC-html40/loose.dtd">
-<!--NewPage-->
-<HTML>
-<HEAD>
-<TITLE>
- TinyMCE_Engine.class.js
-</TITLE>
-<LINK REL ="stylesheet" TYPE="text/css" HREF="stylesheet.css" TITLE="Style">
-</HEAD>
-<SCRIPT>
-function asd()
-{
-parent.document.title=" TinyMCE_Engine.class.js";
-}
-</SCRIPT>
-<BODY BGCOLOR="white" onload="asd();">
-
-<H3 class="FrameHeadingFont"><B></B></H3>
-<FONT size="+1" CLASS="FrameHeadingFont">
-<B><a href="overview-summary-TinyMCE_Engine.class.js.html"
- target="classFrame">TinyMCE_Engine.class.js</a></B></FONT>
-<BR>
-
-<TABLE BORDER="0" WIDTH="100%">
-
-
-<TR>
-<TD NOWRAP><FONT CLASS="FrameItemFont"><A HREF="TinyMCE_Engine.html" TARGET="classFrame">TinyMCE_Engine</A>
-<BR>
-</FONT></TD>
-</TR>
-
-</TABLE>
-
-</BODY>
-</HTML>
Copied: trunk/htdocs/js/tinymce/docs/tinymce_api/overview-TinyMCE_Engine.class.js.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/tinymce_api/overview-TinyMCE_Engine.class.js.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/tinymce_api/overview-TinyMCE_Engine.class.js.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/tinymce_api/overview-TinyMCE_Engine.class.js.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,36 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN""http://www.w3.org/TR/REC-html40/loose.dtd">
+<!--NewPage-->
+<HTML>
+<HEAD>
+<TITLE>
+ TinyMCE_Engine.class.js
+</TITLE>
+<LINK REL ="stylesheet" TYPE="text/css" HREF="stylesheet.css" TITLE="Style">
+</HEAD>
+<SCRIPT>
+function asd()
+{
+parent.document.title=" TinyMCE_Engine.class.js";
+}
+</SCRIPT>
+<BODY BGCOLOR="white" onload="asd();">
+
+<H3 class="FrameHeadingFont"><B></B></H3>
+<FONT size="+1" CLASS="FrameHeadingFont">
+<B><a href="overview-summary-TinyMCE_Engine.class.js.html"
+ target="classFrame">TinyMCE_Engine.class.js</a></B></FONT>
+<BR>
+
+<TABLE BORDER="0" WIDTH="100%">
+
+
+<TR>
+<TD NOWRAP><FONT CLASS="FrameItemFont"><A HREF="TinyMCE_Engine.html" TARGET="classFrame">TinyMCE_Engine</A>
+<BR>
+</FONT></TD>
+</TR>
+
+</TABLE>
+
+</BODY>
+</HTML>
Deleted: trunk/htdocs/js/tinymce/docs/tinymce_api/overview-TinyMCE_Event.class.js.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/tinymce_api/overview-TinyMCE_Event.class.js.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/tinymce_api/overview-TinyMCE_Event.class.js.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,30 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN""http://www.w3.org/TR/REC-html40/loose.dtd">
-<!--NewPage-->
-<HTML>
-<HEAD>
-<TITLE>
- TinyMCE_Event.class.js
-</TITLE>
-<LINK REL ="stylesheet" TYPE="text/css" HREF="stylesheet.css" TITLE="Style">
-</HEAD>
-<SCRIPT>
-function asd()
-{
-parent.document.title=" TinyMCE_Event.class.js";
-}
-</SCRIPT>
-<BODY BGCOLOR="white" onload="asd();">
-
-<H3 class="FrameHeadingFont"><B></B></H3>
-<FONT size="+1" CLASS="FrameHeadingFont">
-<B><a href="overview-summary-TinyMCE_Event.class.js.html"
- target="classFrame">TinyMCE_Event.class.js</a></B></FONT>
-<BR>
-
-<TABLE BORDER="0" WIDTH="100%">
-
-
-</TABLE>
-
-</BODY>
-</HTML>
Copied: trunk/htdocs/js/tinymce/docs/tinymce_api/overview-TinyMCE_Event.class.js.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/tinymce_api/overview-TinyMCE_Event.class.js.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/tinymce_api/overview-TinyMCE_Event.class.js.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/tinymce_api/overview-TinyMCE_Event.class.js.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,30 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN""http://www.w3.org/TR/REC-html40/loose.dtd">
+<!--NewPage-->
+<HTML>
+<HEAD>
+<TITLE>
+ TinyMCE_Event.class.js
+</TITLE>
+<LINK REL ="stylesheet" TYPE="text/css" HREF="stylesheet.css" TITLE="Style">
+</HEAD>
+<SCRIPT>
+function asd()
+{
+parent.document.title=" TinyMCE_Event.class.js";
+}
+</SCRIPT>
+<BODY BGCOLOR="white" onload="asd();">
+
+<H3 class="FrameHeadingFont"><B></B></H3>
+<FONT size="+1" CLASS="FrameHeadingFont">
+<B><a href="overview-summary-TinyMCE_Event.class.js.html"
+ target="classFrame">TinyMCE_Event.class.js</a></B></FONT>
+<BR>
+
+<TABLE BORDER="0" WIDTH="100%">
+
+
+</TABLE>
+
+</BODY>
+</HTML>
Deleted: trunk/htdocs/js/tinymce/docs/tinymce_api/overview-TinyMCE_ForceParagraphs.class.js.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/tinymce_api/overview-TinyMCE_ForceParagraphs.class.js.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/tinymce_api/overview-TinyMCE_ForceParagraphs.class.js.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,30 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN""http://www.w3.org/TR/REC-html40/loose.dtd">
-<!--NewPage-->
-<HTML>
-<HEAD>
-<TITLE>
- TinyMCE_ForceParagraphs.class.js
-</TITLE>
-<LINK REL ="stylesheet" TYPE="text/css" HREF="stylesheet.css" TITLE="Style">
-</HEAD>
-<SCRIPT>
-function asd()
-{
-parent.document.title=" TinyMCE_ForceParagraphs.class.js";
-}
-</SCRIPT>
-<BODY BGCOLOR="white" onload="asd();">
-
-<H3 class="FrameHeadingFont"><B></B></H3>
-<FONT size="+1" CLASS="FrameHeadingFont">
-<B><a href="overview-summary-TinyMCE_ForceParagraphs.class.js.html"
- target="classFrame">TinyMCE_ForceParagraphs.class.js</a></B></FONT>
-<BR>
-
-<TABLE BORDER="0" WIDTH="100%">
-
-
-</TABLE>
-
-</BODY>
-</HTML>
Copied: trunk/htdocs/js/tinymce/docs/tinymce_api/overview-TinyMCE_ForceParagraphs.class.js.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/tinymce_api/overview-TinyMCE_ForceParagraphs.class.js.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/tinymce_api/overview-TinyMCE_ForceParagraphs.class.js.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/tinymce_api/overview-TinyMCE_ForceParagraphs.class.js.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,30 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN""http://www.w3.org/TR/REC-html40/loose.dtd">
+<!--NewPage-->
+<HTML>
+<HEAD>
+<TITLE>
+ TinyMCE_ForceParagraphs.class.js
+</TITLE>
+<LINK REL ="stylesheet" TYPE="text/css" HREF="stylesheet.css" TITLE="Style">
+</HEAD>
+<SCRIPT>
+function asd()
+{
+parent.document.title=" TinyMCE_ForceParagraphs.class.js";
+}
+</SCRIPT>
+<BODY BGCOLOR="white" onload="asd();">
+
+<H3 class="FrameHeadingFont"><B></B></H3>
+<FONT size="+1" CLASS="FrameHeadingFont">
+<B><a href="overview-summary-TinyMCE_ForceParagraphs.class.js.html"
+ target="classFrame">TinyMCE_ForceParagraphs.class.js</a></B></FONT>
+<BR>
+
+<TABLE BORDER="0" WIDTH="100%">
+
+
+</TABLE>
+
+</BODY>
+</HTML>
Deleted: trunk/htdocs/js/tinymce/docs/tinymce_api/overview-TinyMCE_Layer.class.js.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/tinymce_api/overview-TinyMCE_Layer.class.js.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/tinymce_api/overview-TinyMCE_Layer.class.js.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,36 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN""http://www.w3.org/TR/REC-html40/loose.dtd">
-<!--NewPage-->
-<HTML>
-<HEAD>
-<TITLE>
- TinyMCE_Layer.class.js
-</TITLE>
-<LINK REL ="stylesheet" TYPE="text/css" HREF="stylesheet.css" TITLE="Style">
-</HEAD>
-<SCRIPT>
-function asd()
-{
-parent.document.title=" TinyMCE_Layer.class.js";
-}
-</SCRIPT>
-<BODY BGCOLOR="white" onload="asd();">
-
-<H3 class="FrameHeadingFont"><B></B></H3>
-<FONT size="+1" CLASS="FrameHeadingFont">
-<B><a href="overview-summary-TinyMCE_Layer.class.js.html"
- target="classFrame">TinyMCE_Layer.class.js</a></B></FONT>
-<BR>
-
-<TABLE BORDER="0" WIDTH="100%">
-
-
-<TR>
-<TD NOWRAP><FONT CLASS="FrameItemFont"><A HREF="TinyMCE_Layer.html" TARGET="classFrame">TinyMCE_Layer</A>
-<BR>
-</FONT></TD>
-</TR>
-
-</TABLE>
-
-</BODY>
-</HTML>
Copied: trunk/htdocs/js/tinymce/docs/tinymce_api/overview-TinyMCE_Layer.class.js.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/tinymce_api/overview-TinyMCE_Layer.class.js.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/tinymce_api/overview-TinyMCE_Layer.class.js.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/tinymce_api/overview-TinyMCE_Layer.class.js.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,36 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN""http://www.w3.org/TR/REC-html40/loose.dtd">
+<!--NewPage-->
+<HTML>
+<HEAD>
+<TITLE>
+ TinyMCE_Layer.class.js
+</TITLE>
+<LINK REL ="stylesheet" TYPE="text/css" HREF="stylesheet.css" TITLE="Style">
+</HEAD>
+<SCRIPT>
+function asd()
+{
+parent.document.title=" TinyMCE_Layer.class.js";
+}
+</SCRIPT>
+<BODY BGCOLOR="white" onload="asd();">
+
+<H3 class="FrameHeadingFont"><B></B></H3>
+<FONT size="+1" CLASS="FrameHeadingFont">
+<B><a href="overview-summary-TinyMCE_Layer.class.js.html"
+ target="classFrame">TinyMCE_Layer.class.js</a></B></FONT>
+<BR>
+
+<TABLE BORDER="0" WIDTH="100%">
+
+
+<TR>
+<TD NOWRAP><FONT CLASS="FrameItemFont"><A HREF="TinyMCE_Layer.html" TARGET="classFrame">TinyMCE_Layer</A>
+<BR>
+</FONT></TD>
+</TR>
+
+</TABLE>
+
+</BODY>
+</HTML>
Deleted: trunk/htdocs/js/tinymce/docs/tinymce_api/overview-TinyMCE_Menu.class.js.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/tinymce_api/overview-TinyMCE_Menu.class.js.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/tinymce_api/overview-TinyMCE_Menu.class.js.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,30 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN""http://www.w3.org/TR/REC-html40/loose.dtd">
-<!--NewPage-->
-<HTML>
-<HEAD>
-<TITLE>
- TinyMCE_Menu.class.js
-</TITLE>
-<LINK REL ="stylesheet" TYPE="text/css" HREF="stylesheet.css" TITLE="Style">
-</HEAD>
-<SCRIPT>
-function asd()
-{
-parent.document.title=" TinyMCE_Menu.class.js";
-}
-</SCRIPT>
-<BODY BGCOLOR="white" onload="asd();">
-
-<H3 class="FrameHeadingFont"><B></B></H3>
-<FONT size="+1" CLASS="FrameHeadingFont">
-<B><a href="overview-summary-TinyMCE_Menu.class.js.html"
- target="classFrame">TinyMCE_Menu.class.js</a></B></FONT>
-<BR>
-
-<TABLE BORDER="0" WIDTH="100%">
-
-
-</TABLE>
-
-</BODY>
-</HTML>
Copied: trunk/htdocs/js/tinymce/docs/tinymce_api/overview-TinyMCE_Menu.class.js.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/tinymce_api/overview-TinyMCE_Menu.class.js.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/tinymce_api/overview-TinyMCE_Menu.class.js.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/tinymce_api/overview-TinyMCE_Menu.class.js.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,30 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN""http://www.w3.org/TR/REC-html40/loose.dtd">
+<!--NewPage-->
+<HTML>
+<HEAD>
+<TITLE>
+ TinyMCE_Menu.class.js
+</TITLE>
+<LINK REL ="stylesheet" TYPE="text/css" HREF="stylesheet.css" TITLE="Style">
+</HEAD>
+<SCRIPT>
+function asd()
+{
+parent.document.title=" TinyMCE_Menu.class.js";
+}
+</SCRIPT>
+<BODY BGCOLOR="white" onload="asd();">
+
+<H3 class="FrameHeadingFont"><B></B></H3>
+<FONT size="+1" CLASS="FrameHeadingFont">
+<B><a href="overview-summary-TinyMCE_Menu.class.js.html"
+ target="classFrame">TinyMCE_Menu.class.js</a></B></FONT>
+<BR>
+
+<TABLE BORDER="0" WIDTH="100%">
+
+
+</TABLE>
+
+</BODY>
+</HTML>
Deleted: trunk/htdocs/js/tinymce/docs/tinymce_api/overview-TinyMCE_Popup.class.js.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/tinymce_api/overview-TinyMCE_Popup.class.js.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/tinymce_api/overview-TinyMCE_Popup.class.js.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,36 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN""http://www.w3.org/TR/REC-html40/loose.dtd">
-<!--NewPage-->
-<HTML>
-<HEAD>
-<TITLE>
- TinyMCE_Popup.class.js
-</TITLE>
-<LINK REL ="stylesheet" TYPE="text/css" HREF="stylesheet.css" TITLE="Style">
-</HEAD>
-<SCRIPT>
-function asd()
-{
-parent.document.title=" TinyMCE_Popup.class.js";
-}
-</SCRIPT>
-<BODY BGCOLOR="white" onload="asd();">
-
-<H3 class="FrameHeadingFont"><B></B></H3>
-<FONT size="+1" CLASS="FrameHeadingFont">
-<B><a href="overview-summary-TinyMCE_Popup.class.js.html"
- target="classFrame">TinyMCE_Popup.class.js</a></B></FONT>
-<BR>
-
-<TABLE BORDER="0" WIDTH="100%">
-
-
-<TR>
-<TD NOWRAP><FONT CLASS="FrameItemFont"><A HREF="TinyMCE_Popup.html" TARGET="classFrame">TinyMCE_Popup</A>
-<BR>
-</FONT></TD>
-</TR>
-
-</TABLE>
-
-</BODY>
-</HTML>
Copied: trunk/htdocs/js/tinymce/docs/tinymce_api/overview-TinyMCE_Popup.class.js.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/tinymce_api/overview-TinyMCE_Popup.class.js.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/tinymce_api/overview-TinyMCE_Popup.class.js.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/tinymce_api/overview-TinyMCE_Popup.class.js.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,36 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN""http://www.w3.org/TR/REC-html40/loose.dtd">
+<!--NewPage-->
+<HTML>
+<HEAD>
+<TITLE>
+ TinyMCE_Popup.class.js
+</TITLE>
+<LINK REL ="stylesheet" TYPE="text/css" HREF="stylesheet.css" TITLE="Style">
+</HEAD>
+<SCRIPT>
+function asd()
+{
+parent.document.title=" TinyMCE_Popup.class.js";
+}
+</SCRIPT>
+<BODY BGCOLOR="white" onload="asd();">
+
+<H3 class="FrameHeadingFont"><B></B></H3>
+<FONT size="+1" CLASS="FrameHeadingFont">
+<B><a href="overview-summary-TinyMCE_Popup.class.js.html"
+ target="classFrame">TinyMCE_Popup.class.js</a></B></FONT>
+<BR>
+
+<TABLE BORDER="0" WIDTH="100%">
+
+
+<TR>
+<TD NOWRAP><FONT CLASS="FrameItemFont"><A HREF="TinyMCE_Popup.html" TARGET="classFrame">TinyMCE_Popup</A>
+<BR>
+</FONT></TD>
+</TR>
+
+</TABLE>
+
+</BODY>
+</HTML>
Deleted: trunk/htdocs/js/tinymce/docs/tinymce_api/overview-TinyMCE_Selection.class.js.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/tinymce_api/overview-TinyMCE_Selection.class.js.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/tinymce_api/overview-TinyMCE_Selection.class.js.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,36 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN""http://www.w3.org/TR/REC-html40/loose.dtd">
-<!--NewPage-->
-<HTML>
-<HEAD>
-<TITLE>
- TinyMCE_Selection.class.js
-</TITLE>
-<LINK REL ="stylesheet" TYPE="text/css" HREF="stylesheet.css" TITLE="Style">
-</HEAD>
-<SCRIPT>
-function asd()
-{
-parent.document.title=" TinyMCE_Selection.class.js";
-}
-</SCRIPT>
-<BODY BGCOLOR="white" onload="asd();">
-
-<H3 class="FrameHeadingFont"><B></B></H3>
-<FONT size="+1" CLASS="FrameHeadingFont">
-<B><a href="overview-summary-TinyMCE_Selection.class.js.html"
- target="classFrame">TinyMCE_Selection.class.js</a></B></FONT>
-<BR>
-
-<TABLE BORDER="0" WIDTH="100%">
-
-
-<TR>
-<TD NOWRAP><FONT CLASS="FrameItemFont"><A HREF="TinyMCE_Selection.html" TARGET="classFrame">TinyMCE_Selection</A>
-<BR>
-</FONT></TD>
-</TR>
-
-</TABLE>
-
-</BODY>
-</HTML>
Copied: trunk/htdocs/js/tinymce/docs/tinymce_api/overview-TinyMCE_Selection.class.js.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/tinymce_api/overview-TinyMCE_Selection.class.js.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/tinymce_api/overview-TinyMCE_Selection.class.js.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/tinymce_api/overview-TinyMCE_Selection.class.js.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,36 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN""http://www.w3.org/TR/REC-html40/loose.dtd">
+<!--NewPage-->
+<HTML>
+<HEAD>
+<TITLE>
+ TinyMCE_Selection.class.js
+</TITLE>
+<LINK REL ="stylesheet" TYPE="text/css" HREF="stylesheet.css" TITLE="Style">
+</HEAD>
+<SCRIPT>
+function asd()
+{
+parent.document.title=" TinyMCE_Selection.class.js";
+}
+</SCRIPT>
+<BODY BGCOLOR="white" onload="asd();">
+
+<H3 class="FrameHeadingFont"><B></B></H3>
+<FONT size="+1" CLASS="FrameHeadingFont">
+<B><a href="overview-summary-TinyMCE_Selection.class.js.html"
+ target="classFrame">TinyMCE_Selection.class.js</a></B></FONT>
+<BR>
+
+<TABLE BORDER="0" WIDTH="100%">
+
+
+<TR>
+<TD NOWRAP><FONT CLASS="FrameItemFont"><A HREF="TinyMCE_Selection.html" TARGET="classFrame">TinyMCE_Selection</A>
+<BR>
+</FONT></TD>
+</TR>
+
+</TABLE>
+
+</BODY>
+</HTML>
Deleted: trunk/htdocs/js/tinymce/docs/tinymce_api/overview-TinyMCE_URL.class.js.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/tinymce_api/overview-TinyMCE_URL.class.js.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/tinymce_api/overview-TinyMCE_URL.class.js.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,30 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN""http://www.w3.org/TR/REC-html40/loose.dtd">
-<!--NewPage-->
-<HTML>
-<HEAD>
-<TITLE>
- TinyMCE_URL.class.js
-</TITLE>
-<LINK REL ="stylesheet" TYPE="text/css" HREF="stylesheet.css" TITLE="Style">
-</HEAD>
-<SCRIPT>
-function asd()
-{
-parent.document.title=" TinyMCE_URL.class.js";
-}
-</SCRIPT>
-<BODY BGCOLOR="white" onload="asd();">
-
-<H3 class="FrameHeadingFont"><B></B></H3>
-<FONT size="+1" CLASS="FrameHeadingFont">
-<B><a href="overview-summary-TinyMCE_URL.class.js.html"
- target="classFrame">TinyMCE_URL.class.js</a></B></FONT>
-<BR>
-
-<TABLE BORDER="0" WIDTH="100%">
-
-
-</TABLE>
-
-</BODY>
-</HTML>
Copied: trunk/htdocs/js/tinymce/docs/tinymce_api/overview-TinyMCE_URL.class.js.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/tinymce_api/overview-TinyMCE_URL.class.js.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/tinymce_api/overview-TinyMCE_URL.class.js.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/tinymce_api/overview-TinyMCE_URL.class.js.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,30 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN""http://www.w3.org/TR/REC-html40/loose.dtd">
+<!--NewPage-->
+<HTML>
+<HEAD>
+<TITLE>
+ TinyMCE_URL.class.js
+</TITLE>
+<LINK REL ="stylesheet" TYPE="text/css" HREF="stylesheet.css" TITLE="Style">
+</HEAD>
+<SCRIPT>
+function asd()
+{
+parent.document.title=" TinyMCE_URL.class.js";
+}
+</SCRIPT>
+<BODY BGCOLOR="white" onload="asd();">
+
+<H3 class="FrameHeadingFont"><B></B></H3>
+<FONT size="+1" CLASS="FrameHeadingFont">
+<B><a href="overview-summary-TinyMCE_URL.class.js.html"
+ target="classFrame">TinyMCE_URL.class.js</a></B></FONT>
+<BR>
+
+<TABLE BORDER="0" WIDTH="100%">
+
+
+</TABLE>
+
+</BODY>
+</HTML>
Deleted: trunk/htdocs/js/tinymce/docs/tinymce_api/overview-TinyMCE_UndoRedo.class.js.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/tinymce_api/overview-TinyMCE_UndoRedo.class.js.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/tinymce_api/overview-TinyMCE_UndoRedo.class.js.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,36 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN""http://www.w3.org/TR/REC-html40/loose.dtd">
-<!--NewPage-->
-<HTML>
-<HEAD>
-<TITLE>
- TinyMCE_UndoRedo.class.js
-</TITLE>
-<LINK REL ="stylesheet" TYPE="text/css" HREF="stylesheet.css" TITLE="Style">
-</HEAD>
-<SCRIPT>
-function asd()
-{
-parent.document.title=" TinyMCE_UndoRedo.class.js";
-}
-</SCRIPT>
-<BODY BGCOLOR="white" onload="asd();">
-
-<H3 class="FrameHeadingFont"><B></B></H3>
-<FONT size="+1" CLASS="FrameHeadingFont">
-<B><a href="overview-summary-TinyMCE_UndoRedo.class.js.html"
- target="classFrame">TinyMCE_UndoRedo.class.js</a></B></FONT>
-<BR>
-
-<TABLE BORDER="0" WIDTH="100%">
-
-
-<TR>
-<TD NOWRAP><FONT CLASS="FrameItemFont"><A HREF="TinyMCE_UndoRedo.html" TARGET="classFrame">TinyMCE_UndoRedo</A>
-<BR>
-</FONT></TD>
-</TR>
-
-</TABLE>
-
-</BODY>
-</HTML>
Copied: trunk/htdocs/js/tinymce/docs/tinymce_api/overview-TinyMCE_UndoRedo.class.js.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/tinymce_api/overview-TinyMCE_UndoRedo.class.js.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/tinymce_api/overview-TinyMCE_UndoRedo.class.js.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/tinymce_api/overview-TinyMCE_UndoRedo.class.js.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,36 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN""http://www.w3.org/TR/REC-html40/loose.dtd">
+<!--NewPage-->
+<HTML>
+<HEAD>
+<TITLE>
+ TinyMCE_UndoRedo.class.js
+</TITLE>
+<LINK REL ="stylesheet" TYPE="text/css" HREF="stylesheet.css" TITLE="Style">
+</HEAD>
+<SCRIPT>
+function asd()
+{
+parent.document.title=" TinyMCE_UndoRedo.class.js";
+}
+</SCRIPT>
+<BODY BGCOLOR="white" onload="asd();">
+
+<H3 class="FrameHeadingFont"><B></B></H3>
+<FONT size="+1" CLASS="FrameHeadingFont">
+<B><a href="overview-summary-TinyMCE_UndoRedo.class.js.html"
+ target="classFrame">TinyMCE_UndoRedo.class.js</a></B></FONT>
+<BR>
+
+<TABLE BORDER="0" WIDTH="100%">
+
+
+<TR>
+<TD NOWRAP><FONT CLASS="FrameItemFont"><A HREF="TinyMCE_UndoRedo.html" TARGET="classFrame">TinyMCE_UndoRedo</A>
+<BR>
+</FONT></TD>
+</TR>
+
+</TABLE>
+
+</BODY>
+</HTML>
Deleted: trunk/htdocs/js/tinymce/docs/tinymce_api/overview-frame.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/tinymce_api/overview-frame.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/tinymce_api/overview-frame.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,67 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN""http://www.w3.org/TR/REC-html40/loose.dtd">
-<HTML>
-<HEAD>
-<TITLE>
-Overview ()
-</TITLE>
-<LINK REL ="stylesheet" TYPE="text/css" HREF="stylesheet.css" TITLE="Style">
-</HEAD>
-<SCRIPT>
-function asd()
-{
-parent.document.title="Overview ()";
-}
-</SCRIPT>
-<BODY BGCOLOR="white" onload="asd();">
-
-<H3 class="FrameHeadingFont"><B></B></H3>
-<TABLE BORDER="0" WIDTH="100%">
-<TR>
-<B></B></FONT></TD>
-</TR>
-</TABLE>
-
-<TABLE BORDER="0" WIDTH="100%">
-<TR>
-<TD NOWRAP><FONT CLASS="FrameItemFont"><A HREF="allclasses-frame.html" TARGET="packageFrame">All Classes</A></FONT>
-<P>
-<FONT size="+1" CLASS="FrameHeadingFont">
-Files</FONT>
-<BR>
-
-<FONT CLASS="FrameItemFont"><A HREF="overview-TinyMCE_Array.class.js.html" TARGET="packageFrame">TinyMCE_Array.class.js</A></FONT><BR>
-
-<FONT CLASS="FrameItemFont"><A HREF="overview-TinyMCE_Cleanup.class.js.html" TARGET="packageFrame">TinyMCE_Cleanup.class.js</A></FONT><BR>
-
-<FONT CLASS="FrameItemFont"><A HREF="overview-TinyMCE_Control.class.js.html" TARGET="packageFrame">TinyMCE_Control.class.js</A></FONT><BR>
-
-<FONT CLASS="FrameItemFont"><A HREF="overview-TinyMCE_Debug.class.js.html" TARGET="packageFrame">TinyMCE_Debug.class.js</A></FONT><BR>
-
-<FONT CLASS="FrameItemFont"><A HREF="overview-TinyMCE_DOMUtils.class.js.html" TARGET="packageFrame">TinyMCE_DOMUtils.class.js</A></FONT><BR>
-
-<FONT CLASS="FrameItemFont"><A HREF="overview-TinyMCE_Engine.class.js.html" TARGET="packageFrame">TinyMCE_Engine.class.js</A></FONT><BR>
-
-<FONT CLASS="FrameItemFont"><A HREF="overview-TinyMCE_Event.class.js.html" TARGET="packageFrame">TinyMCE_Event.class.js</A></FONT><BR>
-
-<FONT CLASS="FrameItemFont"><A HREF="overview-TinyMCE_ForceParagraphs.class.js.html" TARGET="packageFrame">TinyMCE_ForceParagraphs.class.js</A></FONT><BR>
-
-<FONT CLASS="FrameItemFont"><A HREF="overview-TinyMCE_Layer.class.js.html" TARGET="packageFrame">TinyMCE_Layer.class.js</A></FONT><BR>
-
-<FONT CLASS="FrameItemFont"><A HREF="overview-TinyMCE_Menu.class.js.html" TARGET="packageFrame">TinyMCE_Menu.class.js</A></FONT><BR>
-
-<FONT CLASS="FrameItemFont"><A HREF="overview-TinyMCE_Popup.class.js.html" TARGET="packageFrame">TinyMCE_Popup.class.js</A></FONT><BR>
-
-<FONT CLASS="FrameItemFont"><A HREF="overview-TinyMCE_Selection.class.js.html" TARGET="packageFrame">TinyMCE_Selection.class.js</A></FONT><BR>
-
-<FONT CLASS="FrameItemFont"><A HREF="overview-TinyMCE_UndoRedo.class.js.html" TARGET="packageFrame">TinyMCE_UndoRedo.class.js</A></FONT><BR>
-
-<FONT CLASS="FrameItemFont"><A HREF="overview-TinyMCE_URL.class.js.html" TARGET="packageFrame">TinyMCE_URL.class.js</A></FONT><BR>
-
-</TD>
-</TR>
-</TABLE>
-
-<P>
-
-</BODY>
-</HTML>
Copied: trunk/htdocs/js/tinymce/docs/tinymce_api/overview-frame.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/tinymce_api/overview-frame.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/tinymce_api/overview-frame.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/tinymce_api/overview-frame.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,67 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN""http://www.w3.org/TR/REC-html40/loose.dtd">
+<HTML>
+<HEAD>
+<TITLE>
+Overview ()
+</TITLE>
+<LINK REL ="stylesheet" TYPE="text/css" HREF="stylesheet.css" TITLE="Style">
+</HEAD>
+<SCRIPT>
+function asd()
+{
+parent.document.title="Overview ()";
+}
+</SCRIPT>
+<BODY BGCOLOR="white" onload="asd();">
+
+<H3 class="FrameHeadingFont"><B></B></H3>
+<TABLE BORDER="0" WIDTH="100%">
+<TR>
+<B></B></FONT></TD>
+</TR>
+</TABLE>
+
+<TABLE BORDER="0" WIDTH="100%">
+<TR>
+<TD NOWRAP><FONT CLASS="FrameItemFont"><A HREF="allclasses-frame.html" TARGET="packageFrame">All Classes</A></FONT>
+<P>
+<FONT size="+1" CLASS="FrameHeadingFont">
+Files</FONT>
+<BR>
+
+<FONT CLASS="FrameItemFont"><A HREF="overview-TinyMCE_Array.class.js.html" TARGET="packageFrame">TinyMCE_Array.class.js</A></FONT><BR>
+
+<FONT CLASS="FrameItemFont"><A HREF="overview-TinyMCE_Cleanup.class.js.html" TARGET="packageFrame">TinyMCE_Cleanup.class.js</A></FONT><BR>
+
+<FONT CLASS="FrameItemFont"><A HREF="overview-TinyMCE_Control.class.js.html" TARGET="packageFrame">TinyMCE_Control.class.js</A></FONT><BR>
+
+<FONT CLASS="FrameItemFont"><A HREF="overview-TinyMCE_Debug.class.js.html" TARGET="packageFrame">TinyMCE_Debug.class.js</A></FONT><BR>
+
+<FONT CLASS="FrameItemFont"><A HREF="overview-TinyMCE_DOMUtils.class.js.html" TARGET="packageFrame">TinyMCE_DOMUtils.class.js</A></FONT><BR>
+
+<FONT CLASS="FrameItemFont"><A HREF="overview-TinyMCE_Engine.class.js.html" TARGET="packageFrame">TinyMCE_Engine.class.js</A></FONT><BR>
+
+<FONT CLASS="FrameItemFont"><A HREF="overview-TinyMCE_Event.class.js.html" TARGET="packageFrame">TinyMCE_Event.class.js</A></FONT><BR>
+
+<FONT CLASS="FrameItemFont"><A HREF="overview-TinyMCE_ForceParagraphs.class.js.html" TARGET="packageFrame">TinyMCE_ForceParagraphs.class.js</A></FONT><BR>
+
+<FONT CLASS="FrameItemFont"><A HREF="overview-TinyMCE_Layer.class.js.html" TARGET="packageFrame">TinyMCE_Layer.class.js</A></FONT><BR>
+
+<FONT CLASS="FrameItemFont"><A HREF="overview-TinyMCE_Menu.class.js.html" TARGET="packageFrame">TinyMCE_Menu.class.js</A></FONT><BR>
+
+<FONT CLASS="FrameItemFont"><A HREF="overview-TinyMCE_Popup.class.js.html" TARGET="packageFrame">TinyMCE_Popup.class.js</A></FONT><BR>
+
+<FONT CLASS="FrameItemFont"><A HREF="overview-TinyMCE_Selection.class.js.html" TARGET="packageFrame">TinyMCE_Selection.class.js</A></FONT><BR>
+
+<FONT CLASS="FrameItemFont"><A HREF="overview-TinyMCE_UndoRedo.class.js.html" TARGET="packageFrame">TinyMCE_UndoRedo.class.js</A></FONT><BR>
+
+<FONT CLASS="FrameItemFont"><A HREF="overview-TinyMCE_URL.class.js.html" TARGET="packageFrame">TinyMCE_URL.class.js</A></FONT><BR>
+
+</TD>
+</TR>
+</TABLE>
+
+<P>
+
+</BODY>
+</HTML>
Deleted: trunk/htdocs/js/tinymce/docs/tinymce_api/overview-summary-TinyMCE_Array.class.js.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/tinymce_api/overview-summary-TinyMCE_Array.class.js.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/tinymce_api/overview-summary-TinyMCE_Array.class.js.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,180 +0,0 @@
-<!doctype html public "-//W3C//DTD HTML 4.0 Frameset//EN""http://www.w3.org/TR/REC-html40/frameset.dtd">
-<html>
-<head>
-<title>
- Overview
-</title>
-<link rel ="stylesheet" type="text/css" href="stylesheet.css" title="Style">
-<script>
-function asd() {
-
- parent.document.title="TinyMCE_Array.class.js Overview";
-
-}
-</script>
-</head>
-<body bgcolor="white" onload="asd();">
-
-<!-- ========== START OF NAVBAR ========== -->
-<a name="navbar_top"><!-- --></a>
-<table border="0" width="100%" cellpadding="1" cellspacing="0">
-<tr>
-<td colspan=2 bgcolor="#EEEEFF" class="NavBarCell1">
-<a name="navbar_top_firstrow"><!-- --></a>
-<table border="0" cellpadding="0" cellspacing="3">
- <tr align="center" valign="top">
-
-
- <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="overview-summary.html"><font class="NavBarFont1"><b>Overview</b></font></a> </td>
- <td bgcolor="#FFFFFF" class="NavBarCell1Rev"> <font class="NavBarFont1Rev"><b>File</b></font> </td>
-
-
- <td bgcolor="#FFFFFF" class="NavBarCell1"> <font class="NavBarFont1">Class</font> </td>
- <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="overview-tree.html"><font class="NavBarFont1"><b>Tree</b></font></a> </td>
- <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="index-all.html"--><font class="NavBarFont1"><b>Index</b></font></a> </td>
- <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="help-doc.html"><font class="NavBarFont1"><b>Help</b></font></a> </td>
- </tr>
-</table>
-</td>
-<td bgcolor="#EEEEFF" align="right" valign="top">
-<em>
-<b></b></em>
-</td>
-</tr>
-
-<tr>
-<td bgcolor="white" class="NavBarCell2"><font size="-2">
- PREV
- NEXT</font></td>
-<td bgcolor="white" class="NavBarCell2"><font size="-2">
- <a href="index.html" target="_top"><b>FRAMES</b></a>
- <a href="overview-summary.html" target="_top"><b>NO FRAMES</b></a>
-
-<script>
- <!--
- if(window==top) {
- document.writeln('<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>');
- }
- //-->
-</script>
-<noscript>
-<a href="allclasses-noframe.html" target=""><b>All Classes</b></a>
-</noscript>
-</font></td>
-</tr>
-</table>
-<!-- =========== END OF NAVBAR =========== -->
-
-<hr>
-<center>
-
- <h2>TinyMCE_Array.class.js</h2>
-
-</center>
-
-
-
-
-<h4>Summary</h4>
-<p>
-
- No overview generated for 'TinyMCE_Array.class.js'<BR/><BR/>
-
-</p>
-
-<hr>
-
-
-
-<!-- ========== METHOD SUMMARY =========== -->
-
-<!-- ========== END METHOD SUMMARY =========== -->
-
-
- <pre class="sourceview"><span class="comment">/**
- * $RCSfile: overview-summary-TinyMCE_Array.class.js.html,v $
- * $Revision: 1.42 $
- * $Date: 2006/04/14 20:00:28 $
- *
- * <span class="attrib">@author</span> Moxiecode
- * <span class="attrib">@copyright</span> Copyright © 2004-2006, Moxiecode Systems AB, All rights reserved.
- *
- * The contents of this file will be wrapped in a class later on.
- */</span>
-
-<span class="comment">/**
- * Returns a cleared array, since some external libraries tend to extend the Array core object
- * arrays needs to be cleaned from these extended functions. So this function simply sets any
- * named properties back to null.
- *
- * <span class="attrib">@param</span> {Array} Name/Value array to clear.
- * <span class="attrib">@return</span> Cleared name/value array.
- * <span class="attrib">@type</span> Array
- */</span>
-TinyMCE_Engine.<span class="reserved">prototype</span>.clearArray = <span class="reserved">function</span>(a) {
- <span class="reserved">for</span> (var k in a)
- a[k] = null;
-
- <span class="reserved">return</span> a;
-};
-</pre>
- <hr>
-
-
-
-<!-- ========== START OF NAVBAR ========== -->
-<a name="navbar_top"><!-- --></a>
-<table border="0" width="100%" cellpadding="1" cellspacing="0">
-<tr>
-<td colspan=2 bgcolor="#EEEEFF" class="NavBarCell1">
-<a name="navbar_top_firstrow"><!-- --></a>
-<table border="0" cellpadding="0" cellspacing="3">
- <tr align="center" valign="top">
-
-
- <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="overview-summary.html"><font class="NavBarFont1"><b>Overview</b></font></a> </td>
- <td bgcolor="#FFFFFF" class="NavBarCell1Rev"> <font class="NavBarFont1Rev"><b>File</b></font> </td>
-
-
- <td bgcolor="#FFFFFF" class="NavBarCell1"> <font class="NavBarFont1">Class</font> </td>
- <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="overview-tree.html"><font class="NavBarFont1"><b>Tree</b></font></a> </td>
- <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="index-all.html"--><font class="NavBarFont1"><b>Index</b></font></a> </td>
- <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="help-doc.html"><font class="NavBarFont1"><b>Help</b></font></a> </td>
- </tr>
-</table>
-</td>
-<td bgcolor="#EEEEFF" align="right" valign="top"><em>
-<b></b></em>
-</td>
-</tr>
-
-<tr>
-<td bgcolor="white" class="NavBarCell2"><font size="-2">
- PREV
- NEXT</font></td>
-<td bgcolor="white" class="NavBarCell2"><font size="-2">
- <a href="index.html" target="_top"><b>FRAMES</b></a>
- <a href="overview-summary.html" target="_top"><b>NO FRAMES</b></a>
-
-<script>
- <!--
- if(window==top) {
- document.writeln('<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>');
- }
- //-->
-</script>
-<noscript>
-<a href="allclasses-noframe.html" target=""><b>All Classes</b></a>
-</noscript>
-</font></td>
-</tr>
-</table>
-<!-- =========== END OF NAVBAR =========== -->
-
-<hr>
-<font size="-1">
-
-</font>
-<div class="jsdoc_ctime">Documentation generated by <a href="http://jsdoc.sourceforge.net/" target="_parent">JSDoc</a> on Fri Apr 14 21:59:23 2006</div>
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/tinymce_api/overview-summary-TinyMCE_Array.class.js.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/tinymce_api/overview-summary-TinyMCE_Array.class.js.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/tinymce_api/overview-summary-TinyMCE_Array.class.js.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/tinymce_api/overview-summary-TinyMCE_Array.class.js.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,180 @@
+<!doctype html public "-//W3C//DTD HTML 4.0 Frameset//EN""http://www.w3.org/TR/REC-html40/frameset.dtd">
+<html>
+<head>
+<title>
+ Overview
+</title>
+<link rel ="stylesheet" type="text/css" href="stylesheet.css" title="Style">
+<script>
+function asd() {
+
+ parent.document.title="TinyMCE_Array.class.js Overview";
+
+}
+</script>
+</head>
+<body bgcolor="white" onload="asd();">
+
+<!-- ========== START OF NAVBAR ========== -->
+<a name="navbar_top"><!-- --></a>
+<table border="0" width="100%" cellpadding="1" cellspacing="0">
+<tr>
+<td colspan=2 bgcolor="#EEEEFF" class="NavBarCell1">
+<a name="navbar_top_firstrow"><!-- --></a>
+<table border="0" cellpadding="0" cellspacing="3">
+ <tr align="center" valign="top">
+
+
+ <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="overview-summary.html"><font class="NavBarFont1"><b>Overview</b></font></a> </td>
+ <td bgcolor="#FFFFFF" class="NavBarCell1Rev"> <font class="NavBarFont1Rev"><b>File</b></font> </td>
+
+
+ <td bgcolor="#FFFFFF" class="NavBarCell1"> <font class="NavBarFont1">Class</font> </td>
+ <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="overview-tree.html"><font class="NavBarFont1"><b>Tree</b></font></a> </td>
+ <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="index-all.html"--><font class="NavBarFont1"><b>Index</b></font></a> </td>
+ <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="help-doc.html"><font class="NavBarFont1"><b>Help</b></font></a> </td>
+ </tr>
+</table>
+</td>
+<td bgcolor="#EEEEFF" align="right" valign="top">
+<em>
+<b></b></em>
+</td>
+</tr>
+
+<tr>
+<td bgcolor="white" class="NavBarCell2"><font size="-2">
+ PREV
+ NEXT</font></td>
+<td bgcolor="white" class="NavBarCell2"><font size="-2">
+ <a href="index.html" target="_top"><b>FRAMES</b></a>
+ <a href="overview-summary.html" target="_top"><b>NO FRAMES</b></a>
+
+<script>
+ <!--
+ if(window==top) {
+ document.writeln('<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>');
+ }
+ //-->
+</script>
+<noscript>
+<a href="allclasses-noframe.html" target=""><b>All Classes</b></a>
+</noscript>
+</font></td>
+</tr>
+</table>
+<!-- =========== END OF NAVBAR =========== -->
+
+<hr>
+<center>
+
+ <h2>TinyMCE_Array.class.js</h2>
+
+</center>
+
+
+
+
+<h4>Summary</h4>
+<p>
+
+ No overview generated for 'TinyMCE_Array.class.js'<BR/><BR/>
+
+</p>
+
+<hr>
+
+
+
+<!-- ========== METHOD SUMMARY =========== -->
+
+<!-- ========== END METHOD SUMMARY =========== -->
+
+
+ <pre class="sourceview"><span class="comment">/**
+ * $RCSfile: overview-summary-TinyMCE_Array.class.js.html,v $
+ * $Revision: 1.42 $
+ * $Date: 2006/04/14 20:00:28 $
+ *
+ * <span class="attrib">@author</span> Moxiecode
+ * <span class="attrib">@copyright</span> Copyright © 2004-2006, Moxiecode Systems AB, All rights reserved.
+ *
+ * The contents of this file will be wrapped in a class later on.
+ */</span>
+
+<span class="comment">/**
+ * Returns a cleared array, since some external libraries tend to extend the Array core object
+ * arrays needs to be cleaned from these extended functions. So this function simply sets any
+ * named properties back to null.
+ *
+ * <span class="attrib">@param</span> {Array} Name/Value array to clear.
+ * <span class="attrib">@return</span> Cleared name/value array.
+ * <span class="attrib">@type</span> Array
+ */</span>
+TinyMCE_Engine.<span class="reserved">prototype</span>.clearArray = <span class="reserved">function</span>(a) {
+ <span class="reserved">for</span> (var k in a)
+ a[k] = null;
+
+ <span class="reserved">return</span> a;
+};
+</pre>
+ <hr>
+
+
+
+<!-- ========== START OF NAVBAR ========== -->
+<a name="navbar_top"><!-- --></a>
+<table border="0" width="100%" cellpadding="1" cellspacing="0">
+<tr>
+<td colspan=2 bgcolor="#EEEEFF" class="NavBarCell1">
+<a name="navbar_top_firstrow"><!-- --></a>
+<table border="0" cellpadding="0" cellspacing="3">
+ <tr align="center" valign="top">
+
+
+ <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="overview-summary.html"><font class="NavBarFont1"><b>Overview</b></font></a> </td>
+ <td bgcolor="#FFFFFF" class="NavBarCell1Rev"> <font class="NavBarFont1Rev"><b>File</b></font> </td>
+
+
+ <td bgcolor="#FFFFFF" class="NavBarCell1"> <font class="NavBarFont1">Class</font> </td>
+ <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="overview-tree.html"><font class="NavBarFont1"><b>Tree</b></font></a> </td>
+ <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="index-all.html"--><font class="NavBarFont1"><b>Index</b></font></a> </td>
+ <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="help-doc.html"><font class="NavBarFont1"><b>Help</b></font></a> </td>
+ </tr>
+</table>
+</td>
+<td bgcolor="#EEEEFF" align="right" valign="top"><em>
+<b></b></em>
+</td>
+</tr>
+
+<tr>
+<td bgcolor="white" class="NavBarCell2"><font size="-2">
+ PREV
+ NEXT</font></td>
+<td bgcolor="white" class="NavBarCell2"><font size="-2">
+ <a href="index.html" target="_top"><b>FRAMES</b></a>
+ <a href="overview-summary.html" target="_top"><b>NO FRAMES</b></a>
+
+<script>
+ <!--
+ if(window==top) {
+ document.writeln('<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>');
+ }
+ //-->
+</script>
+<noscript>
+<a href="allclasses-noframe.html" target=""><b>All Classes</b></a>
+</noscript>
+</font></td>
+</tr>
+</table>
+<!-- =========== END OF NAVBAR =========== -->
+
+<hr>
+<font size="-1">
+
+</font>
+<div class="jsdoc_ctime">Documentation generated by <a href="http://jsdoc.sourceforge.net/" target="_parent">JSDoc</a> on Fri Apr 14 21:59:23 2006</div>
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/tinymce_api/overview-summary-TinyMCE_Cleanup.class.js.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/tinymce_api/overview-summary-TinyMCE_Cleanup.class.js.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/tinymce_api/overview-summary-TinyMCE_Cleanup.class.js.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,1480 +0,0 @@
-<!doctype html public "-//W3C//DTD HTML 4.0 Frameset//EN""http://www.w3.org/TR/REC-html40/frameset.dtd">
-<html>
-<head>
-<title>
- Overview
-</title>
-<link rel ="stylesheet" type="text/css" href="stylesheet.css" title="Style">
-<script>
-function asd() {
-
- parent.document.title="TinyMCE_Cleanup.class.js Overview";
-
-}
-</script>
-</head>
-<body bgcolor="white" onload="asd();">
-
-<!-- ========== START OF NAVBAR ========== -->
-<a name="navbar_top"><!-- --></a>
-<table border="0" width="100%" cellpadding="1" cellspacing="0">
-<tr>
-<td colspan=2 bgcolor="#EEEEFF" class="NavBarCell1">
-<a name="navbar_top_firstrow"><!-- --></a>
-<table border="0" cellpadding="0" cellspacing="3">
- <tr align="center" valign="top">
-
-
- <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="overview-summary.html"><font class="NavBarFont1"><b>Overview</b></font></a> </td>
- <td bgcolor="#FFFFFF" class="NavBarCell1Rev"> <font class="NavBarFont1Rev"><b>File</b></font> </td>
-
-
- <td bgcolor="#FFFFFF" class="NavBarCell1"> <font class="NavBarFont1">Class</font> </td>
- <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="overview-tree.html"><font class="NavBarFont1"><b>Tree</b></font></a> </td>
- <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="index-all.html"--><font class="NavBarFont1"><b>Index</b></font></a> </td>
- <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="help-doc.html"><font class="NavBarFont1"><b>Help</b></font></a> </td>
- </tr>
-</table>
-</td>
-<td bgcolor="#EEEEFF" align="right" valign="top">
-<em>
-<b></b></em>
-</td>
-</tr>
-
-<tr>
-<td bgcolor="white" class="NavBarCell2"><font size="-2">
- PREV
- NEXT</font></td>
-<td bgcolor="white" class="NavBarCell2"><font size="-2">
- <a href="index.html" target="_top"><b>FRAMES</b></a>
- <a href="overview-summary.html" target="_top"><b>NO FRAMES</b></a>
-
-<script>
- <!--
- if(window==top) {
- document.writeln('<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>');
- }
- //-->
-</script>
-<noscript>
-<a href="allclasses-noframe.html" target=""><b>All Classes</b></a>
-</noscript>
-</font></td>
-</tr>
-</table>
-<!-- =========== END OF NAVBAR =========== -->
-
-<hr>
-<center>
-
- <h2>TinyMCE_Cleanup.class.js</h2>
-
-</center>
-
-
-
-
-<h4>Summary</h4>
-<p>
-
- No overview generated for 'TinyMCE_Cleanup.class.js'<BR/><BR/>
-
-</p>
-
-<hr>
-
-
- <table border="1" cellpadding="3" cellspacing="0" width="100%">
- <tr bgcolor="#CCCCFF" class="TableHeadingColor">
- <td colspan=2><font size="+2">
-
- <b>Class Summary</b>
-
- </font></td>
- </tr>
-
- <tr bgcolor="white" class="TableRowColor">
- <td width="15%"><b><a href="TinyMCE_Cleanup.html">TinyMCE_Cleanup</a></b></td>
- <td> </td>
- </tr>
-
- </table>
- <hr/>
-
-
-<!-- ========== METHOD SUMMARY =========== -->
-
-<!-- ========== END METHOD SUMMARY =========== -->
-
-
- <pre class="sourceview"><span class="comment">/**
- * $RCSfile: overview-summary-TinyMCE_Cleanup.class.js.html,v $
- * $Revision: 1.42 $
- * $Date: 2006/04/14 20:00:28 $
- *
- * <span class="attrib">@author</span> Moxiecode
- * <span class="attrib">@copyright</span> Copyright © 2004-2006, Moxiecode Systems AB, All rights reserved.
- *
- * Some of the contents of this file will be wrapped in a class later on it will also be replaced with the new cleanup logic.
- */</span>
-
-<span class="comment">/**
- * Makes some preprocessing cleanup routines on the specified HTML string.
- * This includes forcing some tags to be open so MSIE doesn't fail. Forcing other to close and
- * padding paragraphs with non breaking spaces. This function is used when the editor gets
- * initialized with content.
- *
- * <span class="attrib">@param</span> {string} s HTML string to cleanup.
- * <span class="attrib">@return</span> Cleaned HTML string.
- * <span class="attrib">@type</span> string
- */</span>
-TinyMCE_Engine.<span class="reserved">prototype</span>.cleanupHTMLCode = <span class="reserved">function</span>(s) {
- s = s.replace(new RegExp(<span class="literal">'<p \\/>'</span>, <span class="literal">'gi'</span>), <span class="literal">'<p> </p>'</span>);
- s = s.replace(new RegExp(<span class="literal">'<p>\\s*<\\/p>'</span>, <span class="literal">'gi'</span>), <span class="literal">'<p> </p>'</span>);
-
- <span class="comment">// Fix close BR elements</span>
- s = s.replace(new RegExp(<span class="literal">'<br>\\s*<\\/br>'</span>, <span class="literal">'gi'</span>), <span class="literal">'<br />'</span>);
-
- <span class="comment">// Open closed tags like <b/> to <b></b></span>
- s = s.replace(new RegExp(<span class="literal">'<(h[1-6]|p|div|address|pre|form|table|li|ol|ul|td|b|font|em|strong|i|strike|u|span|a|ul|ol|li|blockquote)([a-z]*)([^\\\\|>]*)\\/>'</span>, <span class="literal">'gi'</span>), <span class="literal">'<$1$2$3></$1$2>'</span>);
-
- <span class="comment">// Remove trailing space <b > to <b></span>
- s = s.replace(new RegExp(<span class="literal">'\\s+></'</span>, <span class="literal">'gi'</span>), <span class="literal">'></'</span>);
-
- <span class="comment">// Close tags <img></img> to <img/></span>
- s = s.replace(new RegExp(<span class="literal">'<(img|br|hr)([^>]*)><\\/(img|br|hr)>'</span>, <span class="literal">'gi'</span>), <span class="literal">'<$1$2 />'</span>);
-
- <span class="comment">// Weird MSIE bug, <p><hr /></p> breaks runtime?</span>
- <span class="reserved">if</span> (tinyMCE.isMSIE)
- s = s.replace(new RegExp(<span class="literal">'<p><hr \\/><\\/p>'</span>, <span class="literal">'gi'</span>), <span class="literal">"<hr>"</span>);
-
- <span class="comment">// Convert relative anchors to absolute URLs ex: #something to file.htm#something</span>
- <span class="reserved">if</span> (tinyMCE.getParam(<span class="literal">'convert_urls'</span>))
- s = s.replace(new RegExp(<span class="literal">'(href=\"{0,1})(\\s*#)'</span>, <span class="literal">'gi'</span>), <span class="literal">'$1'</span> + tinyMCE.settings[<span class="literal">'document_base_url'</span>] + <span class="literal">"#"</span>);
-
- <span class="reserved">return</span> s;
-};
-
-<span class="comment">/**
- * Parses the specified HTML style data. This will parse for example
- * "border-left: 1px; background-color: red" into an key/value array.
- *
- * <span class="attrib">@param</span> {string} str Style data to parse.
- * <span class="attrib">@return</span> Name/Value array of style items.
- * <span class="attrib">@type</span> Array
- */</span>
-TinyMCE_Engine.<span class="reserved">prototype</span>.parseStyle = <span class="reserved">function</span>(str) {
- var ar = new Array();
-
- <span class="reserved">if</span> (str == null)
- <span class="reserved">return</span> ar;
-
- var st = str.split(<span class="literal">';'</span>);
-
- tinyMCE.clearArray(ar);
-
- <span class="reserved">for</span> (var i=0; i<st.length; i++) {
- <span class="reserved">if</span> (st[i] == <span class="literal">''</span>)
- continue;
-
- var re = new RegExp(<span class="literal">'^\\s*([^:]*):\\s*(.*)\\s*$'</span>);
- var pa = st[i].replace(re, <span class="literal">'$1||$2'</span>).split(<span class="literal">'||'</span>);
-<span class="comment">//tinyMCE.debug(str, pa[0] + "=" + pa[1], st[i].replace(re, '$1||$2'));</span>
- <span class="reserved">if</span> (pa.length == 2)
- ar[pa[0].toLowerCase()] = pa[1];
- }
-
- <span class="reserved">return</span> ar;
-};
-
-<span class="comment">/**
- * Compresses larger styles into a smaller. Since MSIE automaticly converts
- * border: 1px solid red to border-left: 1px solid red, border-righ: 1px solid red and so forth.'
- * This will bundle them together again if the information is the same in each item.
- *
- * <span class="attrib">@param</span> {Array} ar Style name/value array with items.
- * <span class="attrib">@param</span> {string} pr Style item prefix to bundle for example border.
- * <span class="attrib">@param</span> {string} sf Style item suffix to bunlde for example -width or -width.
- * <span class="attrib">@param</span> {string} res Result name, for example border-width.
- */</span>
-TinyMCE_Engine.<span class="reserved">prototype</span>.compressStyle = <span class="reserved">function</span>(ar, pr, sf, res) {
- var box = new Array();
-
- box[0] = ar[pr + <span class="literal">'-top'</span> + sf];
- box[1] = ar[pr + <span class="literal">'-left'</span> + sf];
- box[2] = ar[pr + <span class="literal">'-right'</span> + sf];
- box[3] = ar[pr + <span class="literal">'-bottom'</span> + sf];
-
- <span class="reserved">for</span> (var i=0; i<box.length; i++) {
- <span class="reserved">if</span> (box[i] == null)
- <span class="reserved">return</span>;
-
- <span class="reserved">for</span> (var a=0; a<box.length; a++) {
- <span class="reserved">if</span> (box[a] != box[i])
- <span class="reserved">return</span>;
- }
- }
-
- <span class="comment">// They are all the same</span>
- ar[res] = box[0];
- ar[pr + <span class="literal">'-top'</span> + sf] = null;
- ar[pr + <span class="literal">'-left'</span> + sf] = null;
- ar[pr + <span class="literal">'-right'</span> + sf] = null;
- ar[pr + <span class="literal">'-bottom'</span> + sf] = null;
-};
-
-<span class="comment">/**
- * Serializes the specified style item name/value array into a HTML string. This function
- * will force HEX colors in Firefox and convert the URL items of a style correctly.
- *
- * <span class="attrib">@param</span> {Array} ar Name/Value array of items to serialize.
- * <span class="attrib">@return</span> Serialized HTML string containing the items.
- * <span class="attrib">@type</span> string
- */</span>
-TinyMCE_Engine.<span class="reserved">prototype</span>.serializeStyle = <span class="reserved">function</span>(ar) {
- var str = <span class="literal">""</span>;
-
- <span class="comment">// Compress box</span>
- tinyMCE.compressStyle(ar, <span class="literal">"border"</span>, <span class="literal">""</span>, <span class="literal">"border"</span>);
- tinyMCE.compressStyle(ar, <span class="literal">"border"</span>, <span class="literal">"-width"</span>, <span class="literal">"border-width"</span>);
- tinyMCE.compressStyle(ar, <span class="literal">"border"</span>, <span class="literal">"-color"</span>, <span class="literal">"border-color"</span>);
- tinyMCE.compressStyle(ar, <span class="literal">"border"</span>, <span class="literal">"-style"</span>, <span class="literal">"border-style"</span>);
- tinyMCE.compressStyle(ar, <span class="literal">"padding"</span>, <span class="literal">""</span>, <span class="literal">"padding"</span>);
- tinyMCE.compressStyle(ar, <span class="literal">"margin"</span>, <span class="literal">""</span>, <span class="literal">"margin"</span>);
-
- <span class="reserved">for</span> (var key in ar) {
- var val = ar[key];
-
- <span class="reserved">if</span> (typeof(val) == <span class="literal">'function'</span>)
- continue;
-
- <span class="reserved">if</span> (key.indexOf(<span class="literal">'mso-'</span>) == 0)
- continue;
-
- <span class="reserved">if</span> (val != null && val != <span class="literal">''</span>) {
- val = <span class="literal">''</span> + val; <span class="comment">// Force string</span>
-
- <span class="comment">// Fix style URL</span>
- val = val.replace(new RegExp(<span class="literal">"url\\(\\'?([^\\']*)\\'?\\)"</span>, <span class="literal">'gi'</span>), <span class="literal">"url('$1')"</span>);
-
- <span class="comment">// Convert URL</span>
- <span class="reserved">if</span> (val.indexOf(<span class="literal">'url('</span>) != -1 && tinyMCE.getParam(<span class="literal">'convert_urls'</span>)) {
- var m = new RegExp(<span class="literal">"url\\('(.*?)'\\)"</span>).exec(val);
-
- <span class="reserved">if</span> (m.length > 1)
- val = <span class="literal">"url('"</span> + eval(tinyMCE.getParam(<span class="literal">'urlconverter_callback'</span>) + <span class="literal">"(m[1], null, true);"</span>) + <span class="literal">"')"</span>;
- }
-
- <span class="comment">// Force HEX colors</span>
- <span class="reserved">if</span> (tinyMCE.getParam(<span class="literal">"force_hex_style_colors"</span>))
- val = tinyMCE.convertRGBToHex(val, true);
-
- <span class="reserved">if</span> (val != <span class="literal">"url('')"</span>)
- str += key.toLowerCase() + <span class="literal">": "</span> + val + <span class="literal">"; "</span>;
- }
- }
-
- <span class="reserved">if</span> (new RegExp(<span class="literal">'; $'</span>).test(str))
- str = str.substring(0, str.length - 2);
-
- <span class="reserved">return</span> str;
-};
-
-<span class="comment">/**
- * Returns a hexadecimal version of the specified rgb(1,2,3) string.
- *
- * <span class="attrib">@param</span> {string} s RGB string to parse, if this doesn't isn't a rgb(n,n,n) it will passthrough the string.
- * <span class="attrib">@param</span> {boolean} k Keep before/after contents. If enabled contents before after the rgb(n,n,n) will be intact.
- * <span class="attrib">@return</span> Hexadecimal version of the specified rgb(1,2,3) string.
- * <span class="attrib">@type</span> string
- */</span>
-TinyMCE_Engine.<span class="reserved">prototype</span>.convertRGBToHex = <span class="reserved">function</span>(s, k) {
- <span class="reserved">if</span> (s.toLowerCase().indexOf(<span class="literal">'rgb'</span>) != -1) {
- var re = new RegExp(<span class="literal">"(.*?)rgb\\s*?\\(\\s*?([0-9]+).*?,\\s*?([0-9]+).*?,\\s*?([0-9]+).*?\\)(.*?)"</span>, <span class="literal">"gi"</span>);
- var rgb = s.replace(re, <span class="literal">"$1,$2,$3,$4,$5"</span>).split(<span class="literal">','</span>);
- <span class="reserved">if</span> (rgb.length == 5) {
- r = parseInt(rgb[1]).toString(16);
- g = parseInt(rgb[2]).toString(16);
- b = parseInt(rgb[3]).toString(16);
-
- r = r.length == 1 ? <span class="literal">'0'</span> + r : r;
- g = g.length == 1 ? <span class="literal">'0'</span> + g : g;
- b = b.length == 1 ? <span class="literal">'0'</span> + b : b;
-
- s = <span class="literal">"#"</span> + r + g + b;
-
- <span class="reserved">if</span> (k)
- s = rgb[0] + s + rgb[4];
- }
- }
-
- <span class="reserved">return</span> s;
-};
-
-<span class="comment">/**
- * Returns a rgb(n,n,n) string from a hexadecimal value.
- *
- * <span class="attrib">@param</span> {string} s Hexadecimal string to parse.
- * <span class="attrib">@return</span> rgb(n,n,n) string from a hexadecimal value.
- * <span class="attrib">@type</span> string
- */</span>
-TinyMCE_Engine.<span class="reserved">prototype</span>.convertHexToRGB = <span class="reserved">function</span>(s) {
- <span class="reserved">if</span> (s.indexOf(<span class="literal">'#'</span>) != -1) {
- s = s.replace(new RegExp(<span class="literal">'[^0-9A-F]'</span>, <span class="literal">'gi'</span>), <span class="literal">''</span>);
- <span class="reserved">return</span> <span class="literal">"rgb("</span> + parseInt(s.substring(0, 2), 16) + <span class="literal">","</span> + parseInt(s.substring(2, 4), 16) + <span class="literal">","</span> + parseInt(s.substring(4, 6), 16) + <span class="literal">")"</span>;
- }
-
- <span class="reserved">return</span> s;
-};
-
-<span class="comment">/**
- * Converts span elements to font elements in the specified document instance.
- * Todo: Move this function into a XHTML plugin or simmilar.
- *
- * <span class="attrib">@param</span> {DOMDocument} doc Document instance to convert spans in.
- */</span>
-TinyMCE_Engine.<span class="reserved">prototype</span>.convertSpansToFonts = <span class="reserved">function</span>(doc) {
- var sizes = tinyMCE.getParam(<span class="literal">'font_size_style_values'</span>).replace(/\s+/, <span class="literal">''</span>).split(<span class="literal">','</span>);
-
- var h = doc.body.innerHTML;
- h = h.replace(/<span/gi, <span class="literal">'<font'</span>);
- h = h.replace(/<\/span/gi, <span class="literal">'</font'</span>);
- doc.body.innerHTML = h;
-
- var s = doc.getElementsByTagName(<span class="literal">"font"</span>);
- <span class="reserved">for</span> (var i=0; i<s.length; i++) {
- var size = tinyMCE.trim(s[i].style.fontSize).toLowerCase();
- var fSize = 0;
-
- <span class="reserved">for</span> (var x=0; x<sizes.length; x++) {
- <span class="reserved">if</span> (sizes[x] == size) {
- fSize = x + 1;
- break;
- }
- }
-
- <span class="reserved">if</span> (fSize > 0) {
- tinyMCE.setAttrib(s[i], <span class="literal">'size'</span>, fSize);
- s[i].style.fontSize = <span class="literal">''</span>;
- }
-
- var fFace = s[i].style.fontFamily;
- <span class="reserved">if</span> (fFace != null && fFace != <span class="literal">""</span>) {
- tinyMCE.setAttrib(s[i], <span class="literal">'face'</span>, fFace);
- s[i].style.fontFamily = <span class="literal">''</span>;
- }
-
- var fColor = s[i].style.color;
- <span class="reserved">if</span> (fColor != null && fColor != <span class="literal">""</span>) {
- tinyMCE.setAttrib(s[i], <span class="literal">'color'</span>, tinyMCE.convertRGBToHex(fColor));
- s[i].style.color = <span class="literal">''</span>;
- }
- }
-};
-
-<span class="comment">/**
- * Convers fonts to spans in the specified document.
- * Todo: Move this function into a XHTML plugin or simmilar.
- *
- * <span class="attrib">@param</span> {DOMDocument} doc Document instance to convert fonts in.
- */</span>
-TinyMCE_Engine.<span class="reserved">prototype</span>.convertFontsToSpans = <span class="reserved">function</span>(doc) {
- var sizes = tinyMCE.getParam(<span class="literal">'font_size_style_values'</span>).replace(/\s+/, <span class="literal">''</span>).split(<span class="literal">','</span>);
-
- var h = doc.body.innerHTML;
- h = h.replace(/<font/gi, <span class="literal">'<span'</span>);
- h = h.replace(/<\/font/gi, <span class="literal">'</span'</span>);
- doc.body.innerHTML = h;
-
- var fsClasses = tinyMCE.getParam(<span class="literal">'font_size_classes'</span>);
- <span class="reserved">if</span> (fsClasses != <span class="literal">''</span>)
- fsClasses = fsClasses.replace(/\s+/, <span class="literal">''</span>).split(<span class="literal">','</span>);
- <span class="reserved">else</span>
- fsClasses = null;
-
- var s = doc.getElementsByTagName(<span class="literal">"span"</span>);
- <span class="reserved">for</span> (var i=0; i<s.length; i++) {
- var fSize, fFace, fColor;
-
- fSize = tinyMCE.getAttrib(s[i], <span class="literal">'size'</span>);
- fFace = tinyMCE.getAttrib(s[i], <span class="literal">'face'</span>);
- fColor = tinyMCE.getAttrib(s[i], <span class="literal">'color'</span>);
-
- <span class="reserved">if</span> (fSize != <span class="literal">""</span>) {
- fSize = parseInt(fSize);
-
- <span class="reserved">if</span> (fSize > 0 && fSize < 8) {
- <span class="reserved">if</span> (fsClasses != null)
- tinyMCE.setAttrib(s[i], <span class="literal">'class'</span>, fsClasses[fSize-1]);
- <span class="reserved">else</span>
- s[i].style.fontSize = sizes[fSize-1];
- }
-
- s[i].removeAttribute(<span class="literal">'size'</span>);
- }
-
- <span class="reserved">if</span> (fFace != <span class="literal">""</span>) {
- s[i].style.fontFamily = fFace;
- s[i].removeAttribute(<span class="literal">'face'</span>);
- }
-
- <span class="reserved">if</span> (fColor != <span class="literal">""</span>) {
- s[i].style.color = fColor;
- s[i].removeAttribute(<span class="literal">'color'</span>);
- }
- }
-};
-
-<span class="comment">/**
- * Moves the contents of a anchor outside and after the anchor. Only if the anchor doesn't
- * have a href.
- *
- * <span class="attrib">@param</span> {DOMDocument} doc DOM document instance to fix anchors in.
- */</span>
-TinyMCE_Engine.<span class="reserved">prototype</span>.cleanupAnchors = <span class="reserved">function</span>(doc) {
- var i, cn, x, an = doc.getElementsByTagName(<span class="literal">"a"</span>);
-
- <span class="comment">// Loops backwards due to bug #1467987</span>
- <span class="reserved">for</span> (i=an.length-1; i>=0; i--) {
- <span class="reserved">if</span> (tinyMCE.getAttrib(an[i], <span class="literal">"name"</span>) != <span class="literal">""</span> && tinyMCE.getAttrib(an[i], <span class="literal">"href"</span>) == <span class="literal">""</span>) {
- cn = an[i].childNodes;
-
- <span class="reserved">for</span> (x=cn.length-1; x>=0; x--)
- tinyMCE.insertAfter(cn[x], an[i]);
- }
- }
-};
-
-<span class="comment">/**
- * Returns the HTML contents of the specified editor instance id.
- *
- * <span class="attrib">@param</span> {string} editor_id Editor instance id to retrive HTML code from.
- * <span class="attrib">@return</span> HTML contents of editor id or null if it wasn't found.
- * <span class="attrib">@type</span> string
- */</span>
-TinyMCE_Engine.<span class="reserved">prototype</span>.getContent = <span class="reserved">function</span>(editor_id) {
- var h;
-
- <span class="reserved">if</span> (typeof(editor_id) != <span class="literal">"undefined"</span>)
- tinyMCE.selectedInstance = tinyMCE.getInstanceById(editor_id);
-
- <span class="reserved">if</span> (tinyMCE.selectedInstance) {
- h = tinyMCE._cleanupHTML(<span class="reserved">this</span>.selectedInstance, <span class="reserved">this</span>.selectedInstance.getDoc(), tinyMCE.settings, <span class="reserved">this</span>.selectedInstance.getBody(), false, true);
-
- <span class="comment">// When editing always use fonts internaly</span>
- <span class="reserved">if</span> (tinyMCE.getParam(<span class="literal">"convert_fonts_to_spans"</span>))
- tinyMCE.convertSpansToFonts(<span class="reserved">this</span>.selectedInstance.getDoc());
-
- <span class="reserved">return</span> h;
- }
-
- <span class="reserved">return</span> null;
-};
-
-<span class="comment">/**
- * Fixes invalid ul/ol elements so the document is more XHTML valid.
- *
- * <span class="attrib">@param</span> {DOMDocument} d HTML DOM document to fix list elements in.
- * <span class="attrib">@private</span>
- */</span>
-TinyMCE_Engine.<span class="reserved">prototype</span>._fixListElements = <span class="reserved">function</span>(d) {
- var nl, x, a = [<span class="literal">'ol'</span>, <span class="literal">'ul'</span>], i, n, p, r = new RegExp(<span class="literal">'^(OL|UL)$'</span>), np;
-
- <span class="reserved">for</span> (x=0; x<a.length; x++) {
- nl = d.getElementsByTagName(a[x]);
-
- <span class="reserved">for</span> (i=0; i<nl.length; i++) {
- n = nl[i];
- p = n.parentNode;
-
- <span class="reserved">if</span> (r.test(p.nodeName)) {
- np = tinyMCE.prevNode(n, <span class="literal">'LI'</span>);
-
- <span class="reserved">if</span> (!np) {
- np = d.createElement(<span class="literal">'li'</span>);
- np.innerHTML = <span class="literal">' '</span>;
- np.appendChild(n);
- p.insertBefore(np, p.firstChild);
- } <span class="reserved">else</span>
- np.appendChild(n);
- }
- }
- }
-};
-
-<span class="comment">/**
- * Moves table elements out of block elements to produce more valid XHTML.
- *
- * <span class="attrib">@param</span> {DOMDocument} d HTML DOM document to fix list elements in.
- * <span class="attrib">@private</span>
- */</span>
-TinyMCE_Engine.<span class="reserved">prototype</span>._fixTables = <span class="reserved">function</span>(d) {
- var nl, i, n, p, np, x, t;
-
- nl = d.getElementsByTagName(<span class="literal">'table'</span>);
- <span class="reserved">for</span> (i=0; i<nl.length; i++) {
- n = nl[i];
-
- <span class="reserved">if</span> ((p = tinyMCE.getParentElement(n, <span class="literal">'p,div,h1,h2,h3,h4,h5,h6'</span>)) != null) {
- np = p.cloneNode(false);
- np.removeAttribute(<span class="literal">'id'</span>);
-
- t = n;
-
- <span class="reserved">while</span> ((n = n.nextSibling))
- np.appendChild(n);
-
- tinyMCE.insertAfter(np, p);
- tinyMCE.insertAfter(t, p);
- }
- }
-};
-
-<span class="comment">/**
- * Performces cleanup of the contents of the specified instance.
- * Todo: Finish documentation, and remove useless parameters.
- *
- * <span class="attrib">@param</span> {TinyMCE_Control} inst Editor instance.
- * <span class="attrib">@param</span> {DOMDocument} doc ...
- * <span class="attrib">@param</span> {Array} config ...
- * <span class="attrib">@param</span> {HTMLElement} elm ...
- * <span class="attrib">@param</span> {boolean} visual ...
- * <span class="attrib">@param</span> {boolean} on_save ...
- * <span class="attrib">@param</span> {boolean} on_submit ...
- * <span class="attrib">@return</span> Cleaned HTML contents of editor instance.
- * <span class="attrib">@type</span> string
- * <span class="attrib">@private</span>
- */</span>
-TinyMCE_Engine.<span class="reserved">prototype</span>._cleanupHTML = <span class="reserved">function</span>(inst, doc, config, elm, visual, on_save, on_submit) {
- var h, d, t1, t2, t3, t4, t5, c, s;
-
- <span class="reserved">if</span> (!tinyMCE.getParam(<span class="literal">'cleanup'</span>))
- <span class="reserved">return</span> elm.innerHTML;
-
- on_save = typeof(on_save) == <span class="literal">'undefined'</span> ? false : on_save;
-
- c = inst.cleanup;
- s = inst.settings;
- d = c.settings.debug;
-
- <span class="reserved">if</span> (d)
- t1 = new Date().getTime();
-
- <span class="reserved">if</span> (tinyMCE.getParam(<span class="literal">"convert_fonts_to_spans"</span>))
- tinyMCE.convertFontsToSpans(doc);
-
- <span class="reserved">if</span> (tinyMCE.getParam(<span class="literal">"fix_list_elements"</span>))
- tinyMCE._fixListElements(doc);
-
- <span class="reserved">if</span> (tinyMCE.getParam(<span class="literal">"fix_table_elements"</span>))
- tinyMCE._fixTables(doc);
-
- <span class="comment">// Call custom cleanup code</span>
- tinyMCE._customCleanup(inst, on_save ? <span class="literal">"get_from_editor_dom"</span> : <span class="literal">"insert_to_editor_dom"</span>, doc.body);
-
- <span class="reserved">if</span> (d)
- t2 = new Date().getTime();
-
- c.settings.on_save = on_save;
- <span class="comment">//for (var i=0; i<100; i++)</span>
-
- c.idCount = 0;
- c.serializationId++;
- c.serializedNodes = new Array();
- c.sourceIndex = -1;
-
- <span class="reserved">if</span> (s.cleanup_serializer == <span class="literal">"xml"</span>)
- h = c.serializeNodeAsXML(elm);
- <span class="reserved">else</span>
- h = c.serializeNodeAsHTML(elm);
-
- <span class="reserved">if</span> (d)
- t3 = new Date().getTime();
-
- <span class="comment">// Post processing</span>
- h = h.replace(/<\/?(body|head|html)[^>]*>/gi, <span class="literal">''</span>);
- h = h.replace(new RegExp(<span class="literal">' (rowspan="1"|colspan="1")'</span>, <span class="literal">'g'</span>), <span class="literal">''</span>);
- h = h.replace(/<p><hr \/><\/p>/g, <span class="literal">'<hr />'</span>);
- h = h.replace(/<p>( | )<\/p><hr \/><p>( | )<\/p>/g, <span class="literal">'<hr />'</span>);
- h = h.replace(/<td>\s*<br \/>\s*<\/td>/g, <span class="literal">'<td> </td>'</span>);
- h = h.replace(/<p>\s*<br \/>\s*<\/p>/g, <span class="literal">'<p> </p>'</span>);
- h = h.replace(/<p>\s*( | )\s*<br \/>\s*( | )\s*<\/p>/g, <span class="literal">'<p> </p>'</span>);
- h = h.replace(/<p>\s*( | )\s*<br \/>\s*<\/p>/g, <span class="literal">'<p> </p>'</span>);
- h = h.replace(/<p>\s*<br \/>\s* \s*<\/p>/g, <span class="literal">'<p> </p>'</span>);
- h = h.replace(new RegExp(<span class="literal">'<a>(.*?)<\\/a>'</span>, <span class="literal">'g'</span>), <span class="literal">'$1'</span>);
- h = h.replace(/<p([^>]*)>\s*<\/p>/g, <span class="literal">'<p$1> </p>'</span>);
-
- <span class="comment">// Clean body</span>
- <span class="reserved">if</span> (/^\s*(<br \/>|<p> <\/p>|<p> <\/p>|<p><\/p>)\s*$/.test(h))
- h = <span class="literal">''</span>;
-
- <span class="comment">// If preformatted</span>
- <span class="reserved">if</span> (s.preformatted) {
- h = h.replace(/^<pre>/, <span class="literal">''</span>);
- h = h.replace(/<\/pre>$/, <span class="literal">''</span>);
- h = <span class="literal">'<pre>'</span> + h + <span class="literal">'</pre>'</span>;
- }
-
- <span class="comment">// Gecko specific processing</span>
- <span class="reserved">if</span> (tinyMCE.isGecko) {
- h = h.replace(/<o:p _moz-userdefined=<span class="literal">""</span> \/>/g, <span class="literal">''</span>);
- h = h.replace(/<td([^>]*)>\s*<br \/>\s*<\/td>/g, <span class="literal">'<td$1> </td>'</span>);
- }
-
- <span class="reserved">if</span> (s.force_br_newlines)
- h = h.replace(/<p>( | )<\/p>/g, <span class="literal">'<br />'</span>);
-
- <span class="comment">// Call custom cleanup code</span>
- h = tinyMCE._customCleanup(inst, on_save ? <span class="literal">"get_from_editor"</span> : <span class="literal">"insert_to_editor"</span>, h);
-
- <span class="comment">// Remove internal classes</span>
- <span class="reserved">if</span> (on_save) {
- h = h.replace(new RegExp(<span class="literal">' ?(mceItem[a-zA-Z0-9]*|'</span> + s.visual_table_class + <span class="literal">')'</span>, <span class="literal">'g'</span>), <span class="literal">''</span>);
- h = h.replace(new RegExp(<span class="literal">' ?class=""'</span>, <span class="literal">'g'</span>), <span class="literal">''</span>);
- }
-
- <span class="reserved">if</span> (s.remove_linebreaks && !c.settings.indent)
- h = h.replace(/\n|\r/g, <span class="literal">' '</span>);
-
- <span class="reserved">if</span> (d)
- t4 = new Date().getTime();
-
- <span class="reserved">if</span> (on_save && c.settings.indent)
- h = c.formatHTML(h);
-
- <span class="comment">// If encoding (not recommended option)</span>
- <span class="reserved">if</span> (on_submit && (s.encoding == <span class="literal">"xml"</span> || s.encoding == <span class="literal">"html"</span>))
- h = c.xmlEncode(h);
-
- <span class="reserved">if</span> (d)
- t5 = new Date().getTime();
-
- <span class="reserved">if</span> (c.settings.debug)
- tinyMCE.debug(<span class="literal">"Cleanup in ms: Pre="</span> + (t2-t1) + <span class="literal">", Serialize: "</span> + (t3-t2) + <span class="literal">", Post: "</span> + (t4-t3) + <span class="literal">", Format: "</span> + (t5-t4) + <span class="literal">", Sum: "</span> + (t5-t1) + <span class="literal">"."</span>);
-
- <span class="reserved">return</span> h;
-};
-
-<span class="comment">/**
- * TinyMCE_Cleanup class.
- */</span>
-<span class="reserved">function</span> TinyMCE_Cleanup() {
- <span class="reserved">this</span>.isMSIE = (navigator.appName == <span class="literal">"Microsoft Internet Explorer"</span>);
- <span class="reserved">this</span>.rules = tinyMCE.clearArray(new Array());
-
- <span class="comment">// Default config</span>
- <span class="reserved">this</span>.settings = {
- indent_elements : <span class="literal">'head,table,tbody,thead,tfoot,form,tr,ul,ol,blockquote,object'</span>,
- newline_before_elements : <span class="literal">'h1,h2,h3,h4,h5,h6,pre,address,div,ul,ol,li,meta,option,area,title,link,base,script,td'</span>,
- newline_after_elements : <span class="literal">'br,hr,p,pre,address,div,ul,ol,meta,option,area,link,base,script'</span>,
- newline_before_after_elements : <span class="literal">'html,head,body,table,thead,tbody,tfoot,tr,form,ul,ol,blockquote,p,object,param,hr,div'</span>,
- indent_char : <span class="literal">'\t'</span>,
- indent_levels : 1,
- entity_encoding : <span class="literal">'raw'</span>,
- valid_elements : <span class="literal">'*[*]'</span>,
- entities : <span class="literal">''</span>,
- url_converter : <span class="literal">''</span>,
- invalid_elements : <span class="literal">''</span>,
- verify_html : false
- };
-
- <span class="reserved">this</span>.vElements = tinyMCE.clearArray(new Array());
- <span class="reserved">this</span>.vElementsRe = <span class="literal">''</span>;
- <span class="reserved">this</span>.closeElementsRe = /^(IMG|BR|HR|LINK|META|BASE|INPUT|BUTTON|AREA)$/;
- <span class="reserved">this</span>.codeElementsRe = /^(SCRIPT|STYLE)$/;
- <span class="reserved">this</span>.serializationId = 0;
- <span class="reserved">this</span>.mceAttribs = {
- href : <span class="literal">'mce_href'</span>,
- src : <span class="literal">'mce_src'</span>,
- type : <span class="literal">'mce_type'</span>
- };
-}
-
-TinyMCE_Cleanup.<span class="reserved">prototype</span> = {
- <span class="comment">/**
- * Initializes the cleanup engine with the specified config.
- *
- * <span class="attrib">@param</span> {Array} s Name/Value array with config settings.
- */</span>
- init : <span class="reserved">function</span>(s) {
- var n, a, i, ir, or, st;
-
- <span class="reserved">for</span> (n in s)
- <span class="reserved">this</span>.settings[n] = s[n];
-
- <span class="comment">// Setup code formating</span>
- s = <span class="reserved">this</span>.settings;
-
- <span class="comment">// Setup regexps</span>
- <span class="reserved">this</span>.inRe = <span class="reserved">this</span>._arrayToRe(s.indent_elements.split(<span class="literal">','</span>), <span class="literal">''</span>, <span class="literal">'^<('</span>, <span class="literal">')[^>]*'</span>);
- <span class="reserved">this</span>.ouRe = <span class="reserved">this</span>._arrayToRe(s.indent_elements.split(<span class="literal">','</span>), <span class="literal">''</span>, <span class="literal">'^<\\/('</span>, <span class="literal">')[^>]*'</span>);
- <span class="reserved">this</span>.nlBeforeRe = <span class="reserved">this</span>._arrayToRe(s.newline_before_elements.split(<span class="literal">','</span>), <span class="literal">'gi'</span>, <span class="literal">'<('</span>, <span class="literal">')([^>]*)>'</span>);
- <span class="reserved">this</span>.nlAfterRe = <span class="reserved">this</span>._arrayToRe(s.newline_after_elements.split(<span class="literal">','</span>), <span class="literal">'gi'</span>, <span class="literal">'<('</span>, <span class="literal">')([^>]*)>'</span>);
- <span class="reserved">this</span>.nlBeforeAfterRe = <span class="reserved">this</span>._arrayToRe(s.newline_before_after_elements.split(<span class="literal">','</span>), <span class="literal">'gi'</span>, <span class="literal">'<(\\/?)('</span>, <span class="literal">')([^>]*)>'</span>);
-
- <span class="reserved">if</span> (s.invalid_elements != <span class="literal">''</span>)
- <span class="reserved">this</span>.iveRe = <span class="reserved">this</span>._arrayToRe(s.invalid_elements.toUpperCase().split(<span class="literal">','</span>), <span class="literal">'g'</span>, <span class="literal">'^('</span>, <span class="literal">')$'</span>);
- <span class="reserved">else</span>
- <span class="reserved">this</span>.iveRe = null;
-
- <span class="comment">// Setup separator</span>
- st = <span class="literal">''</span>;
- <span class="reserved">for</span> (i=0; i<s.indent_levels; i++)
- st += s.indent_char;
-
- <span class="reserved">this</span>.inStr = st;
-
- <span class="comment">// If verify_html if false force *[*]</span>
- <span class="reserved">if</span> (!s.verify_html) {
- s.valid_elements = <span class="literal">'*[*]'</span>;
- s.extended_valid_elements = <span class="literal">''</span>;
- }
-
- <span class="reserved">this</span>.fillStr = s.entity_encoding == <span class="literal">"named"</span> ? <span class="literal">" "</span> : <span class="literal">" "</span>;
- <span class="reserved">this</span>.idCount = 0;
- },
-
- <span class="comment">/**
- * Adds a cleanup rule string, for example: a[href|name|title=title|class=class1?class2?class3].
- * These rules are then used when serializing the DOM tree as a HTML string, it gives the possibility
- * to control the valid elements and attributes and force attribute values or default them.
- *
- * <span class="attrib">@param</span> {string} s Rule string to parse and add to the cleanup rules array.
- */</span>
- addRuleStr : <span class="reserved">function</span>(s) {
- var r = <span class="reserved">this</span>.parseRuleStr(s);
- var n;
-
- <span class="reserved">for</span> (n in r) {
- <span class="reserved">if</span> (r[n])
- <span class="reserved">this</span>.rules[n] = r[n];
- }
-
- <span class="reserved">this</span>.vElements = tinyMCE.clearArray(new Array());
-
- <span class="reserved">for</span> (n in <span class="reserved">this</span>.rules) {
- <span class="reserved">if</span> (<span class="reserved">this</span>.rules[n])
- <span class="reserved">this</span>.vElements[<span class="reserved">this</span>.vElements.length] = <span class="reserved">this</span>.rules[n].tag;
- }
-
- <span class="reserved">this</span>.vElementsRe = <span class="reserved">this</span>._arrayToRe(<span class="reserved">this</span>.vElements, <span class="literal">''</span>);
- },
-
- <span class="comment">/**
- * Parses a cleanup rule string, for example: a[href|name|title=title|class=class1?class2?class3].
- * These rules are then used when serializing the DOM tree as a HTML string, it gives the possibility
- * to control the valid elements and attributes and force attribute values or default them.
- *
- * <span class="attrib">@param</span> {string} s Rule string to parse as a name/value rule array.
- * <span class="attrib">@return</span> Parsed name/value rule array.
- * <span class="attrib">@type</span> Array
- */</span>
- parseRuleStr : <span class="reserved">function</span>(s) {
- var ta, p, r, a, i, x, px, t, tn, y, av, or = tinyMCE.clearArray(new Array()), dv;
-
- <span class="reserved">if</span> (s == null || s.length == 0)
- <span class="reserved">return</span> or;
-
- ta = s.split(<span class="literal">','</span>);
- <span class="reserved">for</span> (x=0; x<ta.length; x++) {
- s = ta[x];
- <span class="reserved">if</span> (s.length == 0)
- continue;
-
- <span class="comment">// Split tag/attrs</span>
- p = <span class="reserved">this</span>.split(/\[|\]/, s);
- <span class="reserved">if</span> (p == null || p.length < 1)
- t = s.toUpperCase();
- <span class="reserved">else</span>
- t = p[0].toUpperCase();
-
- <span class="comment">// Handle all tag names</span>
- tn = <span class="reserved">this</span>.split(<span class="literal">'/'</span>, t);
- <span class="reserved">for</span> (y=0; y<tn.length; y++) {
- r = {};
-
- r.tag = tn[y];
- r.forceAttribs = null;
- r.defaultAttribs = null;
- r.validAttribValues = null;
-
- <span class="comment">// Handle prefixes</span>
- px = r.tag.charAt(0);
- r.forceOpen = px == <span class="literal">'+'</span>;
- r.removeEmpty = px == <span class="literal">'-'</span>;
- r.fill = px == <span class="literal">'#'</span>;
- r.tag = r.tag.replace(/\+|-|#/g, <span class="literal">''</span>);
- r.oTagName = tn[0].replace(/\+|-|#/g, <span class="literal">''</span>).toLowerCase();
- r.isWild = new RegExp(<span class="literal">'\\*|\\?|\\+'</span>, <span class="literal">'g'</span>).test(r.tag);
- r.validRe = new RegExp(<span class="reserved">this</span>._wildcardToRe(<span class="literal">'^'</span> + r.tag + <span class="literal">'$'</span>));
-
- <span class="comment">// Setup valid attributes</span>
- <span class="reserved">if</span> (p.length > 1) {
- r.vAttribsRe = <span class="literal">'^('</span>;
- a = <span class="reserved">this</span>.split(/\|/, p[1]);
-
- <span class="reserved">for</span> (i=0; i<a.length; i++) {
- t = a[i];
-
- av = new RegExp(<span class="literal">'(=|:|<)(.*?)$'</span>).exec(t);
- t = t.replace(new RegExp(<span class="literal">'(=|:|<).*?$'</span>), <span class="literal">''</span>);
- <span class="reserved">if</span> (av && av.length > 0) {
- <span class="reserved">if</span> (av[0].charAt(0) == <span class="literal">':'</span>) {
- <span class="reserved">if</span> (!r.forceAttribs)
- r.forceAttribs = tinyMCE.clearArray(new Array());
-
- r.forceAttribs[t.toLowerCase()] = av[0].substring(1);
- } <span class="reserved">else</span> <span class="reserved">if</span> (av[0].charAt(0) == <span class="literal">'='</span>) {
- <span class="reserved">if</span> (!r.defaultAttribs)
- r.defaultAttribs = tinyMCE.clearArray(new Array());
-
- dv = av[0].substring(1);
-
- r.defaultAttribs[t.toLowerCase()] = dv == <span class="literal">""</span> ? <span class="literal">"mce_empty"</span> : dv;
- } <span class="reserved">else</span> <span class="reserved">if</span> (av[0].charAt(0) == <span class="literal">'<'</span>) {
- <span class="reserved">if</span> (!r.validAttribValues)
- r.validAttribValues = tinyMCE.clearArray(new Array());
-
- r.validAttribValues[t.toLowerCase()] = <span class="reserved">this</span>._arrayToRe(<span class="reserved">this</span>.split(<span class="literal">'?'</span>, av[0].substring(1)), <span class="literal">''</span>);
- }
- }
-
- r.vAttribsRe += <span class="literal">''</span> + t.toLowerCase() + (i != a.length - 1 ? <span class="literal">'|'</span> : <span class="literal">''</span>);
-
- a[i] = t.toLowerCase();
- }
-
- r.vAttribsRe += <span class="literal">')$'</span>;
- r.vAttribsRe = <span class="reserved">this</span>._wildcardToRe(r.vAttribsRe);
- r.vAttribsReIsWild = new RegExp(<span class="literal">'\\*|\\?|\\+'</span>, <span class="literal">'g'</span>).test(r.vAttribsRe);
- r.vAttribsRe = new RegExp(r.vAttribsRe);
- r.vAttribs = a.reverse();
-
- <span class="comment">//tinyMCE.debug(r.tag, r.oTagName, r.vAttribsRe, r.vAttribsReWC);</span>
- } <span class="reserved">else</span> {
- r.vAttribsRe = <span class="literal">''</span>;
- r.vAttribs = tinyMCE.clearArray(new Array());
- r.vAttribsReIsWild = false;
- }
-
- or[r.tag] = r;
- }
- }
-
- <span class="reserved">return</span> or;
- },
-
- <span class="comment">/**
- * Serializes the specified node as a HTML string. This uses the XML parser and serializer
- * to generate a XHTML string.
- *
- * <span class="attrib">@param</span> {HTMLNode} n Node to serialize as a XHTML string.
- * <span class="attrib">@return</span> Serialized XHTML string based on specified node.
- * <span class="attrib">@type</span> string
- */</span>
- serializeNodeAsXML : <span class="reserved">function</span>(n) {
- var s, b;
-
- <span class="reserved">if</span> (!<span class="reserved">this</span>.xmlDoc) {
- <span class="reserved">if</span> (<span class="reserved">this</span>.isMSIE) {
- try {<span class="reserved">this</span>.xmlDoc = new ActiveXObject(<span class="literal">'MSXML2.DOMDocument'</span>);} catch (e) {}
-
- <span class="reserved">if</span> (!<span class="reserved">this</span>.xmlDoc)
- try {<span class="reserved">this</span>.xmlDoc = new ActiveXObject(<span class="literal">'Microsoft.XmlDom'</span>);} catch (e) {}
- } <span class="reserved">else</span>
- <span class="reserved">this</span>.xmlDoc = document.implementation.createDocument(<span class="literal">''</span>, <span class="literal">''</span>, null);
-
- <span class="reserved">if</span> (!<span class="reserved">this</span>.xmlDoc)
- alert(<span class="literal">"Error XML Parser could not be found."</span>);
- }
-
- <span class="reserved">if</span> (<span class="reserved">this</span>.xmlDoc.firstChild)
- <span class="reserved">this</span>.xmlDoc.removeChild(<span class="reserved">this</span>.xmlDoc.firstChild);
-
- b = <span class="reserved">this</span>.xmlDoc.createElement(<span class="literal">"html"</span>);
- b = <span class="reserved">this</span>.xmlDoc.appendChild(b);
-
- <span class="reserved">this</span>._convertToXML(n, b);
-
- <span class="reserved">if</span> (<span class="reserved">this</span>.isMSIE)
- <span class="reserved">return</span> <span class="reserved">this</span>.xmlDoc.xml;
- <span class="reserved">else</span>
- <span class="reserved">return</span> new XMLSerializer().serializeToString(<span class="reserved">this</span>.xmlDoc);
- },
-
- <span class="comment">/**
- * Converts and adds the specified HTML DOM node to a XML DOM node.
- *
- * <span class="attrib">@param</span> {HTMLNode} n HTML Node to add as a XML node.
- * <span class="attrib">@param</span> {XMLNode} xn XML Node to add the HTML node to.
- * <span class="attrib">@private</span>
- */</span>
- _convertToXML : <span class="reserved">function</span>(n, xn) {
- var xd, el, i, l, cn, at, no, hc = false;
-
- <span class="reserved">if</span> (<span class="reserved">this</span>._isDuplicate(n))
- <span class="reserved">return</span>;
-
- xd = <span class="reserved">this</span>.xmlDoc;
-
- switch (n.nodeType) {
- case 1: <span class="comment">// Element</span>
- hc = n.hasChildNodes();
-
- el = xd.createElement(n.nodeName.toLowerCase());
-
- at = n.attributes;
- <span class="reserved">for</span> (i=at.length-1; i>-1; i--) {
- no = at[i];
-
- <span class="reserved">if</span> (no.specified && no.nodeValue)
- el.setAttribute(no.nodeName.toLowerCase(), no.nodeValue);
- }
-
- <span class="reserved">if</span> (!hc && !<span class="reserved">this</span>.closeElementsRe.test(n.nodeName))
- el.appendChild(xd.createTextNode(<span class="literal">""</span>));
-
- xn = xn.appendChild(el);
- break;
-
- case 3: <span class="comment">// Text</span>
- xn.appendChild(xd.createTextNode(n.nodeValue));
- <span class="reserved">return</span>;
-
- case 8: <span class="comment">// Comment</span>
- xn.appendChild(xd.createComment(n.nodeValue));
- <span class="reserved">return</span>;
- }
-
- <span class="reserved">if</span> (hc) {
- cn = n.childNodes;
-
- <span class="reserved">for</span> (i=0, l=cn.length; i<l; i++)
- <span class="reserved">this</span>._convertToXML(cn[i], xn);
- }
- },
-
- <span class="comment">/**
- * Serializes the specified node as a XHTML string. This uses the TinyMCE serializer logic since it gives more
- * control over the output than the build in browser XML serializer.
- *
- * <span class="attrib">@param</span> {HTMLNode} n Node to serialize as a XHTML string.
- * <span class="attrib">@return</span> Serialized XHTML string based on specified node.
- * <span class="attrib">@type</span> string
- */</span>
- serializeNodeAsHTML : <span class="reserved">function</span>(n) {
- var en, no, h = <span class="literal">''</span>, i, l, r, cn, va = false, f = false, at, hc;
-
- <span class="reserved">this</span>._setupRules(); <span class="comment">// Will initialize cleanup rules</span>
-
- <span class="reserved">if</span> (<span class="reserved">this</span>._isDuplicate(n))
- <span class="reserved">return</span> <span class="literal">''</span>;
-
- switch (n.nodeType) {
- case 1: <span class="comment">// Element</span>
- hc = n.hasChildNodes();
-
- <span class="comment">// MSIE sometimes produces <//tag></span>
- <span class="reserved">if</span> ((tinyMCE.isMSIE && !tinyMCE.isOpera) && n.nodeName.indexOf(<span class="literal">'/'</span>) != -1)
- break;
-
- <span class="reserved">if</span> (<span class="reserved">this</span>.vElementsRe.test(n.nodeName) && (!<span class="reserved">this</span>.iveRe || !<span class="reserved">this</span>.iveRe.test(n.nodeName))) {
- va = true;
-
- r = <span class="reserved">this</span>.rules[n.nodeName];
- <span class="reserved">if</span> (!r) {
- at = <span class="reserved">this</span>.rules;
- <span class="reserved">for</span> (no in at) {
- <span class="reserved">if</span> (at[no] && at[no].validRe.test(n.nodeName)) {
- r = at[no];
- break;
- }
- }
- }
-
- en = r.isWild ? n.nodeName.toLowerCase() : r.oTagName;
- f = r.fill;
-
- <span class="reserved">if</span> (r.removeEmpty && !hc)
- <span class="reserved">return</span> <span class="literal">""</span>;
-
- h += <span class="literal">'<'</span> + en;
-
- <span class="reserved">if</span> (r.vAttribsReIsWild) {
- <span class="comment">// Serialize wildcard attributes</span>
- at = n.attributes;
- <span class="reserved">for</span> (i=at.length-1; i>-1; i--) {
- no = at[i];
- <span class="reserved">if</span> (no.specified && r.vAttribsRe.test(no.nodeName))
- h += <span class="reserved">this</span>._serializeAttribute(n, r, no.nodeName);
- }
- } <span class="reserved">else</span> {
- <span class="comment">// Serialize specific attributes</span>
- <span class="reserved">for</span> (i=r.vAttribs.length-1; i>-1; i--)
- h += <span class="reserved">this</span>._serializeAttribute(n, r, r.vAttribs[i]);
- }
-
- <span class="comment">// Serialize mce_ atts</span>
- <span class="reserved">if</span> (!<span class="reserved">this</span>.settings.on_save) {
- at = <span class="reserved">this</span>.mceAttribs;
-
- <span class="reserved">for</span> (no in at) {
- <span class="reserved">if</span> (at[no])
- h += <span class="reserved">this</span>._serializeAttribute(n, r, at[no]);
- }
- }
-
- <span class="comment">// Close these</span>
- <span class="reserved">if</span> (<span class="reserved">this</span>.closeElementsRe.test(n.nodeName))
- <span class="reserved">return</span> h + <span class="literal">' />'</span>;
-
- h += <span class="literal">'>'</span>;
-
- <span class="reserved">if</span> (<span class="reserved">this</span>.isMSIE && <span class="reserved">this</span>.codeElementsRe.test(n.nodeName))
- h += n.innerHTML;
- }
- break;
-
- case 3: <span class="comment">// Text</span>
- <span class="reserved">if</span> (n.parentNode && <span class="reserved">this</span>.codeElementsRe.test(n.parentNode.nodeName))
- <span class="reserved">return</span> <span class="reserved">this</span>.isMSIE ? <span class="literal">''</span> : n.nodeValue;
-
- <span class="reserved">return</span> <span class="reserved">this</span>.xmlEncode(n.nodeValue);
-
- case 8: <span class="comment">// Comment</span>
- <span class="reserved">return</span> <span class="literal">"<!--"</span> + <span class="reserved">this</span>._trimComment(n.nodeValue) + <span class="literal">"-->"</span>;
- }
-
- <span class="reserved">if</span> (hc) {
- cn = n.childNodes;
-
- <span class="reserved">for</span> (i=0, l=cn.length; i<l; i++)
- h += <span class="reserved">this</span>.serializeNodeAsHTML(cn[i]);
- }
-
- <span class="comment">// Fill empty nodes</span>
- <span class="reserved">if</span> (f && !hc)
- h += <span class="reserved">this</span>.fillStr;
-
- <span class="comment">// End element</span>
- <span class="reserved">if</span> (va)
- h += <span class="literal">'</'</span> + en + <span class="literal">'>'</span>;
-
- <span class="reserved">return</span> h;
- },
-
- <span class="comment">/**
- * Serializes the specified attribute as a XHTML string chunk.
- *
- * <span class="attrib">@param</span> {HTMLNode} n HTML node to get attribute from.
- * <span class="attrib">@param</span> {TinyMCE_CleanupRule} r Cleanup rule to use in serialization.
- * <span class="attrib">@param</span> {string} an Attribute name to lookfor and serialize.
- * <span class="attrib">@return</span> XHTML chunk containing attribute data if it was found.
- * <span class="attrib">@type</span> string
- * <span class="attrib">@private</span>
- */</span>
- _serializeAttribute : <span class="reserved">function</span>(n, r, an) {
- var av = <span class="literal">''</span>, t, os = <span class="reserved">this</span>.settings.on_save;
-
- <span class="reserved">if</span> (os && (an.indexOf(<span class="literal">'mce_'</span>) == 0 || an.indexOf(<span class="literal">'_moz'</span>) == 0))
- <span class="reserved">return</span> <span class="literal">''</span>;
-
- <span class="reserved">if</span> (os && <span class="reserved">this</span>.mceAttribs[an])
- av = <span class="reserved">this</span>._getAttrib(n, <span class="reserved">this</span>.mceAttribs[an]);
-
- <span class="reserved">if</span> (av.length == 0)
- av = <span class="reserved">this</span>._getAttrib(n, an);
-
- <span class="reserved">if</span> (av.length == 0 && r.defaultAttribs && (t = r.defaultAttribs[an])) {
- av = t;
-
- <span class="reserved">if</span> (av == <span class="literal">"mce_empty"</span>)
- <span class="reserved">return</span> <span class="literal">" "</span> + an + <span class="literal">'=""'</span>;
- }
-
- <span class="reserved">if</span> (r.forceAttribs && (t = r.forceAttribs[an]))
- av = t;
-
- <span class="reserved">if</span> (os && av.length != 0 && <span class="reserved">this</span>.settings.url_converter.length != 0 && /^(src|href|longdesc)$/.test(an))
- av = eval(<span class="reserved">this</span>.settings.url_converter + <span class="literal">'(this, n, av)'</span>);
-
- <span class="reserved">if</span> (av.length != 0 && r.validAttribValues && r.validAttribValues[an] && !r.validAttribValues[an].test(av))
- <span class="reserved">return</span> <span class="literal">""</span>;
-
- <span class="reserved">if</span> (av.length != 0 && av == <span class="literal">"{$uid}"</span>)
- av = <span class="literal">"uid_"</span> + (<span class="reserved">this</span>.idCount++);
-
- <span class="reserved">if</span> (av.length != 0)
- <span class="reserved">return</span> <span class="literal">" "</span> + an + <span class="literal">"="</span> + <span class="literal">'"'</span> + <span class="reserved">this</span>.xmlEncode(av) + <span class="literal">'"'</span>;
-
- <span class="reserved">return</span> <span class="literal">""</span>;
- },
-
- <span class="comment">/**
- * Applies source formatting/indentation on the specified HTML string.
- *
- * <span class="attrib">@param</span> {string} h HTML string to apply formatting to.
- * <span class="attrib">@return</span> Formatted HTML string.
- * <span class="attrib">@type</span> string
- */</span>
- formatHTML : <span class="reserved">function</span>(h) {
- var s = <span class="reserved">this</span>.settings, p = <span class="literal">''</span>, i = 0, li = 0, o = <span class="literal">''</span>, l;
-
- h = h.replace(/\r/g, <span class="literal">''</span>); <span class="comment">// Windows sux, isn't carriage return a thing of the past :)</span>
- h = <span class="literal">'\n'</span> + h;
- h = h.replace(new RegExp(<span class="literal">'\\n\\s+'</span>, <span class="literal">'gi'</span>), <span class="literal">'\n'</span>); <span class="comment">// Remove previous formatting</span>
- h = h.replace(<span class="reserved">this</span>.nlBeforeRe, <span class="literal">'\n<$1$2>'</span>);
- h = h.replace(<span class="reserved">this</span>.nlAfterRe, <span class="literal">'<$1$2>\n'</span>);
- h = h.replace(<span class="reserved">this</span>.nlBeforeAfterRe, <span class="literal">'\n<$1$2$3>\n'</span>);
- h += <span class="literal">'\n'</span>;
-
- <span class="comment">//tinyMCE.debug(h);</span>
-
- <span class="reserved">while</span> ((i = h.indexOf(<span class="literal">'\n'</span>, i + 1)) != -1) {
- <span class="reserved">if</span> ((l = h.substring(li + 1, i)).length != 0) {
- <span class="reserved">if</span> (<span class="reserved">this</span>.ouRe.test(l) && p.length >= s.indent_levels)
- p = p.substring(s.indent_levels);
-
- o += p + l + <span class="literal">'\n'</span>;
-
- <span class="reserved">if</span> (<span class="reserved">this</span>.inRe.test(l))
- p += <span class="reserved">this</span>.inStr;
- }
-
- li = i;
- }
-
- <span class="comment">//tinyMCE.debug(h);</span>
-
- <span class="reserved">return</span> o;
- },
-
- <span class="comment">/**
- * XML Encodes the specified string based on configured entity encoding. The entity encoding modes
- * are raw, numeric and named. Where raw is the fastest and named is default.
- *
- * <span class="attrib">@param</span> {string} s String to convert to XML.
- * <span class="attrib">@return</span> Encoded XML string based on configured entity encoding.
- * <span class="attrib">@type</span> string
- */</span>
- xmlEncode : <span class="reserved">function</span>(s) {
- var i, l, e, o = <span class="literal">''</span>, c;
-
- <span class="reserved">this</span>._setupEntities(); <span class="comment">// Will intialize lookup table</span>
-
- switch (<span class="reserved">this</span>.settings.entity_encoding) {
- case <span class="literal">"raw"</span>:
- <span class="reserved">return</span> tinyMCE.xmlEncode(s);
-
- case <span class="literal">"named"</span>:
- <span class="reserved">for</span> (i=0, l=s.length; i<l; i++) {
- c = s.charCodeAt(i);
- e = <span class="reserved">this</span>.entities[c];
-
- <span class="reserved">if</span> (e && e != <span class="literal">''</span>)
- o += <span class="literal">'&'</span> + e + <span class="literal">';'</span>;
- <span class="reserved">else</span>
- o += String.fromCharCode(c);
- }
-
- <span class="reserved">return</span> o;
-
- case <span class="literal">"numeric"</span>:
- <span class="reserved">for</span> (i=0, l=s.length; i<l; i++) {
- c = s.charCodeAt(i);
-
- <span class="reserved">if</span> (c > 127 || c == 60 || c == 62 || c == 38 || c == 39 || c == 34)
- o += <span class="literal">'&#'</span> + c + <span class="literal">";"</span>;
- <span class="reserved">else</span>
- o += String.fromCharCode(c);
- }
-
- <span class="reserved">return</span> o;
- }
-
- <span class="reserved">return</span> s;
- },
-
- <span class="comment">/**
- * Splits the specified string and removed empty chunks.
- *
- * <span class="attrib">@param</span> {RegEx} re RegEx to split string by.
- * <span class="attrib">@param</span> {string} s String value to split.
- * <span class="attrib">@return</span> Array with parts from specified string.
- * <span class="attrib">@type</span> string
- */</span>
- split : <span class="reserved">function</span>(re, s) {
- var c = s.split(re);
- var i, l, o = new Array();
-
- <span class="reserved">for</span> (i=0, l=c.length; i<l; i++) {
- <span class="reserved">if</span> (c[i] != <span class="literal">''</span>)
- o[i] = c[i];
- }
-
- <span class="reserved">return</span> o;
- },
-
- <span class="comment">/**
- * Removes contents that got added by TinyMCE to comments.
- *
- * <span class="attrib">@param</span> {string} s Comment string data to trim.
- * <span class="attrib">@return</span> Cleaned string from TinyMCE specific content.
- * <span class="attrib">@type</span> string
- * <span class="attrib">@private</span>
- */</span>
- _trimComment : <span class="reserved">function</span>(s) {
- <span class="comment">// Remove mce_src, mce_href</span>
- s = s.replace(new RegExp(<span class="literal">'\\smce_src=\"[^\"]*\"'</span>, <span class="literal">'gi'</span>), <span class="literal">""</span>);
- s = s.replace(new RegExp(<span class="literal">'\\smce_href=\"[^\"]*\"'</span>, <span class="literal">'gi'</span>), <span class="literal">""</span>);
-
- <span class="reserved">return</span> s;
- },
-
- <span class="comment">/**
- * Returns the value of the specified attribute name or default value if it wasn't found.
- *
- * <span class="attrib">@param</span> {HTMLElement} e HTML element to get attribute from.
- * <span class="attrib">@param</span> {string} n Attribute name to get from element.
- * <span class="attrib">@param</span> {string} d Default value to return if attribute wasn't found.
- * <span class="attrib">@return</span> Attribute value based on specified attribute name.
- * <span class="attrib">@type</span> string
- * <span class="attrib">@private</span>
- */</span>
- _getAttrib : <span class="reserved">function</span>(e, n, d) {
- <span class="reserved">if</span> (typeof(d) == <span class="literal">"undefined"</span>)
- d = <span class="literal">""</span>;
-
- <span class="reserved">if</span> (!e || e.nodeType != 1)
- <span class="reserved">return</span> d;
-
- var v = e.getAttribute(n, 0);
-
- <span class="reserved">if</span> (n == <span class="literal">"class"</span> && !v)
- v = e.className;
-
- <span class="reserved">if</span> (<span class="reserved">this</span>.isMSIE && n == <span class="literal">"http-equiv"</span>)
- v = e.httpEquiv;
-
- <span class="reserved">if</span> (<span class="reserved">this</span>.isMSIE && e.nodeName == <span class="literal">"FORM"</span> && n == <span class="literal">"enctype"</span> && v == <span class="literal">"application/x-www-form-urlencoded"</span>)
- v = <span class="literal">""</span>;
-
- <span class="reserved">if</span> (<span class="reserved">this</span>.isMSIE && e.nodeName == <span class="literal">"INPUT"</span> && n == <span class="literal">"size"</span> && v == <span class="literal">"20"</span>)
- v = <span class="literal">""</span>;
-
- <span class="reserved">if</span> (<span class="reserved">this</span>.isMSIE && e.nodeName == <span class="literal">"INPUT"</span> && n == <span class="literal">"maxlength"</span> && v == <span class="literal">"2147483647"</span>)
- v = <span class="literal">""</span>;
-
- <span class="reserved">if</span> (n == <span class="literal">"style"</span> && !tinyMCE.isOpera)
- v = e.style.cssText;
-
- <span class="reserved">if</span> (n == <span class="literal">'style'</span>)
- v = tinyMCE.serializeStyle(tinyMCE.parseStyle(v));
-
- <span class="reserved">if</span> (<span class="reserved">this</span>.settings.on_save && n.indexOf(<span class="literal">'on'</span>) != -1 && <span class="reserved">this</span>.settings.on_save && v && v != <span class="literal">""</span>)
- v = tinyMCE.cleanupEventStr(v);
-
- <span class="reserved">return</span> (v && v != <span class="literal">""</span>) ? <span class="literal">''</span> + v : d;
- },
-
- <span class="comment">/**
- * Internal URL converter callback function. This simply converts URLs based
- * on some settings.
- *
- * <span class="attrib">@param</span> {TinyMCE_Cleanup} c Cleanup instance.
- * <span class="attrib">@param</span> {HTMLNode} n HTML node that holds the URL.
- * <span class="attrib">@param</span> {string} v URL value to convert.
- * <span class="attrib">@return</span> Converted URL value.
- * <span class="attrib">@type</span> string
- * <span class="attrib">@private</span>
- */</span>
- _urlConverter : <span class="reserved">function</span>(c, n, v) {
- <span class="reserved">if</span> (!c.settings.on_save)
- <span class="reserved">return</span> tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings.base_href, v);
- <span class="reserved">else</span> <span class="reserved">if</span> (tinyMCE.getParam(<span class="literal">'convert_urls'</span>))
- <span class="reserved">return</span> eval(tinyMCE.settings.urlconverter_callback + <span class="literal">"(v, n, true);"</span>);
-
- <span class="reserved">return</span> v;
- },
-
- <span class="comment">/**
- * Converts a array into a regex.
- *
- * <span class="attrib">@param</span> {Array} a Array to convert into a regex.
- * <span class="attrib">@param</span> {string} op RegEx options like, gi.
- * <span class="attrib">@param</span> {string} be Before chunk, beginning of expression.
- * <span class="attrib">@param</span> {string} af After chunk, end of expression.
- * <span class="attrib">@return</span> RegEx instance based in input information.
- * <span class="attrib">@type</span> string
- * <span class="attrib">@private</span>
- */</span>
- _arrayToRe : <span class="reserved">function</span>(a, op, be, af) {
- var i, r;
-
- op = typeof(op) == <span class="literal">"undefined"</span> ? <span class="literal">"gi"</span> : op;
- be = typeof(be) == <span class="literal">"undefined"</span> ? <span class="literal">"^("</span> : be;
- af = typeof(af) == <span class="literal">"undefined"</span> ? <span class="literal">")$"</span> : af;
-
- r = be;
-
- <span class="reserved">for</span> (i=0; i<a.length; i++)
- r += <span class="reserved">this</span>._wildcardToRe(a[i]) + (i != a.length-1 ? <span class="literal">"|"</span> : <span class="literal">""</span>);
-
- r += af;
-
- <span class="reserved">return</span> new RegExp(r, op);
- },
-
- <span class="comment">/**
- * Converts a wildcard string into a regex.
- *
- * <span class="attrib">@param</span> {string} s Wildcard string to convert into RegEx.
- * <span class="attrib">@return</span> RegEx string based on input.
- * <span class="attrib">@type</span> string
- * <span class="attrib">@private</span>
- */</span>
- _wildcardToRe : <span class="reserved">function</span>(s) {
- s = s.replace(/\?/g, <span class="literal">'(\\S?)'</span>);
- s = s.replace(/\+/g, <span class="literal">'(\\S+)'</span>);
- s = s.replace(/\*/g, <span class="literal">'(\\S*)'</span>);
-
- <span class="reserved">return</span> s;
- },
-
- <span class="comment">/**
- * Sets up the entity name lookup table ones. This moves the entity lookup pasing time
- * from init to first xmlEncode call.
- *
- * <span class="attrib">@private</span>
- */</span>
- _setupEntities : <span class="reserved">function</span>() {
- var n, a, i, s = <span class="reserved">this</span>.settings;
-
- <span class="comment">// Setup entities</span>
- <span class="reserved">if</span> (!<span class="reserved">this</span>.entitiesDone) {
- <span class="reserved">if</span> (s.entity_encoding == <span class="literal">"named"</span>) {
- n = tinyMCE.clearArray(new Array());
- a = <span class="reserved">this</span>.split(<span class="literal">','</span>, s.entities);
- <span class="reserved">for</span> (i=0; i<a.length; i+=2)
- n[a[i]] = a[i+1];
-
- <span class="reserved">this</span>.entities = n;
- }
-
- <span class="reserved">this</span>.entitiesDone = true;
- }
- },
-
- <span class="comment">/**
- * Sets up the cleanup rules ones. This moves the cleanup rule pasing time
- * from init to first cleanup call.
- *
- * <span class="attrib">@private</span>
- */</span>
- _setupRules : <span class="reserved">function</span>() {
- var s = <span class="reserved">this</span>.settings;
-
- <span class="comment">// Setup default rule</span>
- <span class="reserved">if</span> (!<span class="reserved">this</span>.rulesDone) {
- <span class="reserved">this</span>.addRuleStr(s.valid_elements);
- <span class="reserved">this</span>.addRuleStr(s.extended_valid_elements);
-
- <span class="reserved">this</span>.rulesDone = true;
- }
- },
-
- <span class="comment">/**
- * Checks if the specified node is a duplicate in other words has it been processed/serialized before.
- *
- * <span class="attrib">@param</span> {DOMNode} n DOM Node that is to be checked.
- * <span class="attrib">@return</span> true/false if the node is a duplicate or not.
- * <span class="attrib">@type</span> boolean
- * <span class="attrib">@private</span>
- */</span>
- _isDuplicate : <span class="reserved">function</span>(n) {
- var i;
-
- <span class="reserved">if</span> (!<span class="reserved">this</span>.settings.fix_content_duplication)
- <span class="reserved">return</span> false;
-
- <span class="reserved">if</span> (tinyMCE.isMSIE && !tinyMCE.isOpera && n.nodeType == 1) {
- <span class="comment">// Mark elements</span>
- <span class="reserved">if</span> (n.mce_serialized == <span class="reserved">this</span>.serializationId)
- <span class="reserved">return</span> true;
-
- n.setAttribute(<span class="literal">'mce_serialized'</span>, <span class="reserved">this</span>.serializationId);
- } <span class="reserved">else</span> {
- <span class="comment">// Search lookup table for text nodes and comments</span>
- <span class="reserved">for</span> (i=0; i<<span class="reserved">this</span>.serializedNodes.length; i++) {
- <span class="reserved">if</span> (<span class="reserved">this</span>.serializedNodes[i] == n)
- <span class="reserved">return</span> true;
- }
-
- <span class="reserved">this</span>.serializedNodes[<span class="reserved">this</span>.serializedNodes.length] = n;
- }
-
- <span class="reserved">return</span> false;
- }
-};
-</pre>
- <hr>
-
-
-
-<!-- ========== START OF NAVBAR ========== -->
-<a name="navbar_top"><!-- --></a>
-<table border="0" width="100%" cellpadding="1" cellspacing="0">
-<tr>
-<td colspan=2 bgcolor="#EEEEFF" class="NavBarCell1">
-<a name="navbar_top_firstrow"><!-- --></a>
-<table border="0" cellpadding="0" cellspacing="3">
- <tr align="center" valign="top">
-
-
- <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="overview-summary.html"><font class="NavBarFont1"><b>Overview</b></font></a> </td>
- <td bgcolor="#FFFFFF" class="NavBarCell1Rev"> <font class="NavBarFont1Rev"><b>File</b></font> </td>
-
-
- <td bgcolor="#FFFFFF" class="NavBarCell1"> <font class="NavBarFont1">Class</font> </td>
- <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="overview-tree.html"><font class="NavBarFont1"><b>Tree</b></font></a> </td>
- <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="index-all.html"--><font class="NavBarFont1"><b>Index</b></font></a> </td>
- <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="help-doc.html"><font class="NavBarFont1"><b>Help</b></font></a> </td>
- </tr>
-</table>
-</td>
-<td bgcolor="#EEEEFF" align="right" valign="top"><em>
-<b></b></em>
-</td>
-</tr>
-
-<tr>
-<td bgcolor="white" class="NavBarCell2"><font size="-2">
- PREV
- NEXT</font></td>
-<td bgcolor="white" class="NavBarCell2"><font size="-2">
- <a href="index.html" target="_top"><b>FRAMES</b></a>
- <a href="overview-summary.html" target="_top"><b>NO FRAMES</b></a>
-
-<script>
- <!--
- if(window==top) {
- document.writeln('<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>');
- }
- //-->
-</script>
-<noscript>
-<a href="allclasses-noframe.html" target=""><b>All Classes</b></a>
-</noscript>
-</font></td>
-</tr>
-</table>
-<!-- =========== END OF NAVBAR =========== -->
-
-<hr>
-<font size="-1">
-
-</font>
-<div class="jsdoc_ctime">Documentation generated by <a href="http://jsdoc.sourceforge.net/" target="_parent">JSDoc</a> on Fri Apr 14 21:59:23 2006</div>
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/tinymce_api/overview-summary-TinyMCE_Cleanup.class.js.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/tinymce_api/overview-summary-TinyMCE_Cleanup.class.js.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/tinymce_api/overview-summary-TinyMCE_Cleanup.class.js.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/tinymce_api/overview-summary-TinyMCE_Cleanup.class.js.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,1480 @@
+<!doctype html public "-//W3C//DTD HTML 4.0 Frameset//EN""http://www.w3.org/TR/REC-html40/frameset.dtd">
+<html>
+<head>
+<title>
+ Overview
+</title>
+<link rel ="stylesheet" type="text/css" href="stylesheet.css" title="Style">
+<script>
+function asd() {
+
+ parent.document.title="TinyMCE_Cleanup.class.js Overview";
+
+}
+</script>
+</head>
+<body bgcolor="white" onload="asd();">
+
+<!-- ========== START OF NAVBAR ========== -->
+<a name="navbar_top"><!-- --></a>
+<table border="0" width="100%" cellpadding="1" cellspacing="0">
+<tr>
+<td colspan=2 bgcolor="#EEEEFF" class="NavBarCell1">
+<a name="navbar_top_firstrow"><!-- --></a>
+<table border="0" cellpadding="0" cellspacing="3">
+ <tr align="center" valign="top">
+
+
+ <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="overview-summary.html"><font class="NavBarFont1"><b>Overview</b></font></a> </td>
+ <td bgcolor="#FFFFFF" class="NavBarCell1Rev"> <font class="NavBarFont1Rev"><b>File</b></font> </td>
+
+
+ <td bgcolor="#FFFFFF" class="NavBarCell1"> <font class="NavBarFont1">Class</font> </td>
+ <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="overview-tree.html"><font class="NavBarFont1"><b>Tree</b></font></a> </td>
+ <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="index-all.html"--><font class="NavBarFont1"><b>Index</b></font></a> </td>
+ <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="help-doc.html"><font class="NavBarFont1"><b>Help</b></font></a> </td>
+ </tr>
+</table>
+</td>
+<td bgcolor="#EEEEFF" align="right" valign="top">
+<em>
+<b></b></em>
+</td>
+</tr>
+
+<tr>
+<td bgcolor="white" class="NavBarCell2"><font size="-2">
+ PREV
+ NEXT</font></td>
+<td bgcolor="white" class="NavBarCell2"><font size="-2">
+ <a href="index.html" target="_top"><b>FRAMES</b></a>
+ <a href="overview-summary.html" target="_top"><b>NO FRAMES</b></a>
+
+<script>
+ <!--
+ if(window==top) {
+ document.writeln('<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>');
+ }
+ //-->
+</script>
+<noscript>
+<a href="allclasses-noframe.html" target=""><b>All Classes</b></a>
+</noscript>
+</font></td>
+</tr>
+</table>
+<!-- =========== END OF NAVBAR =========== -->
+
+<hr>
+<center>
+
+ <h2>TinyMCE_Cleanup.class.js</h2>
+
+</center>
+
+
+
+
+<h4>Summary</h4>
+<p>
+
+ No overview generated for 'TinyMCE_Cleanup.class.js'<BR/><BR/>
+
+</p>
+
+<hr>
+
+
+ <table border="1" cellpadding="3" cellspacing="0" width="100%">
+ <tr bgcolor="#CCCCFF" class="TableHeadingColor">
+ <td colspan=2><font size="+2">
+
+ <b>Class Summary</b>
+
+ </font></td>
+ </tr>
+
+ <tr bgcolor="white" class="TableRowColor">
+ <td width="15%"><b><a href="TinyMCE_Cleanup.html">TinyMCE_Cleanup</a></b></td>
+ <td> </td>
+ </tr>
+
+ </table>
+ <hr/>
+
+
+<!-- ========== METHOD SUMMARY =========== -->
+
+<!-- ========== END METHOD SUMMARY =========== -->
+
+
+ <pre class="sourceview"><span class="comment">/**
+ * $RCSfile: overview-summary-TinyMCE_Cleanup.class.js.html,v $
+ * $Revision: 1.42 $
+ * $Date: 2006/04/14 20:00:28 $
+ *
+ * <span class="attrib">@author</span> Moxiecode
+ * <span class="attrib">@copyright</span> Copyright © 2004-2006, Moxiecode Systems AB, All rights reserved.
+ *
+ * Some of the contents of this file will be wrapped in a class later on it will also be replaced with the new cleanup logic.
+ */</span>
+
+<span class="comment">/**
+ * Makes some preprocessing cleanup routines on the specified HTML string.
+ * This includes forcing some tags to be open so MSIE doesn't fail. Forcing other to close and
+ * padding paragraphs with non breaking spaces. This function is used when the editor gets
+ * initialized with content.
+ *
+ * <span class="attrib">@param</span> {string} s HTML string to cleanup.
+ * <span class="attrib">@return</span> Cleaned HTML string.
+ * <span class="attrib">@type</span> string
+ */</span>
+TinyMCE_Engine.<span class="reserved">prototype</span>.cleanupHTMLCode = <span class="reserved">function</span>(s) {
+ s = s.replace(new RegExp(<span class="literal">'<p \\/>'</span>, <span class="literal">'gi'</span>), <span class="literal">'<p> </p>'</span>);
+ s = s.replace(new RegExp(<span class="literal">'<p>\\s*<\\/p>'</span>, <span class="literal">'gi'</span>), <span class="literal">'<p> </p>'</span>);
+
+ <span class="comment">// Fix close BR elements</span>
+ s = s.replace(new RegExp(<span class="literal">'<br>\\s*<\\/br>'</span>, <span class="literal">'gi'</span>), <span class="literal">'<br />'</span>);
+
+ <span class="comment">// Open closed tags like <b/> to <b></b></span>
+ s = s.replace(new RegExp(<span class="literal">'<(h[1-6]|p|div|address|pre|form|table|li|ol|ul|td|b|font|em|strong|i|strike|u|span|a|ul|ol|li|blockquote)([a-z]*)([^\\\\|>]*)\\/>'</span>, <span class="literal">'gi'</span>), <span class="literal">'<$1$2$3></$1$2>'</span>);
+
+ <span class="comment">// Remove trailing space <b > to <b></span>
+ s = s.replace(new RegExp(<span class="literal">'\\s+></'</span>, <span class="literal">'gi'</span>), <span class="literal">'></'</span>);
+
+ <span class="comment">// Close tags <img></img> to <img/></span>
+ s = s.replace(new RegExp(<span class="literal">'<(img|br|hr)([^>]*)><\\/(img|br|hr)>'</span>, <span class="literal">'gi'</span>), <span class="literal">'<$1$2 />'</span>);
+
+ <span class="comment">// Weird MSIE bug, <p><hr /></p> breaks runtime?</span>
+ <span class="reserved">if</span> (tinyMCE.isMSIE)
+ s = s.replace(new RegExp(<span class="literal">'<p><hr \\/><\\/p>'</span>, <span class="literal">'gi'</span>), <span class="literal">"<hr>"</span>);
+
+ <span class="comment">// Convert relative anchors to absolute URLs ex: #something to file.htm#something</span>
+ <span class="reserved">if</span> (tinyMCE.getParam(<span class="literal">'convert_urls'</span>))
+ s = s.replace(new RegExp(<span class="literal">'(href=\"{0,1})(\\s*#)'</span>, <span class="literal">'gi'</span>), <span class="literal">'$1'</span> + tinyMCE.settings[<span class="literal">'document_base_url'</span>] + <span class="literal">"#"</span>);
+
+ <span class="reserved">return</span> s;
+};
+
+<span class="comment">/**
+ * Parses the specified HTML style data. This will parse for example
+ * "border-left: 1px; background-color: red" into an key/value array.
+ *
+ * <span class="attrib">@param</span> {string} str Style data to parse.
+ * <span class="attrib">@return</span> Name/Value array of style items.
+ * <span class="attrib">@type</span> Array
+ */</span>
+TinyMCE_Engine.<span class="reserved">prototype</span>.parseStyle = <span class="reserved">function</span>(str) {
+ var ar = new Array();
+
+ <span class="reserved">if</span> (str == null)
+ <span class="reserved">return</span> ar;
+
+ var st = str.split(<span class="literal">';'</span>);
+
+ tinyMCE.clearArray(ar);
+
+ <span class="reserved">for</span> (var i=0; i<st.length; i++) {
+ <span class="reserved">if</span> (st[i] == <span class="literal">''</span>)
+ continue;
+
+ var re = new RegExp(<span class="literal">'^\\s*([^:]*):\\s*(.*)\\s*$'</span>);
+ var pa = st[i].replace(re, <span class="literal">'$1||$2'</span>).split(<span class="literal">'||'</span>);
+<span class="comment">//tinyMCE.debug(str, pa[0] + "=" + pa[1], st[i].replace(re, '$1||$2'));</span>
+ <span class="reserved">if</span> (pa.length == 2)
+ ar[pa[0].toLowerCase()] = pa[1];
+ }
+
+ <span class="reserved">return</span> ar;
+};
+
+<span class="comment">/**
+ * Compresses larger styles into a smaller. Since MSIE automaticly converts
+ * border: 1px solid red to border-left: 1px solid red, border-righ: 1px solid red and so forth.'
+ * This will bundle them together again if the information is the same in each item.
+ *
+ * <span class="attrib">@param</span> {Array} ar Style name/value array with items.
+ * <span class="attrib">@param</span> {string} pr Style item prefix to bundle for example border.
+ * <span class="attrib">@param</span> {string} sf Style item suffix to bunlde for example -width or -width.
+ * <span class="attrib">@param</span> {string} res Result name, for example border-width.
+ */</span>
+TinyMCE_Engine.<span class="reserved">prototype</span>.compressStyle = <span class="reserved">function</span>(ar, pr, sf, res) {
+ var box = new Array();
+
+ box[0] = ar[pr + <span class="literal">'-top'</span> + sf];
+ box[1] = ar[pr + <span class="literal">'-left'</span> + sf];
+ box[2] = ar[pr + <span class="literal">'-right'</span> + sf];
+ box[3] = ar[pr + <span class="literal">'-bottom'</span> + sf];
+
+ <span class="reserved">for</span> (var i=0; i<box.length; i++) {
+ <span class="reserved">if</span> (box[i] == null)
+ <span class="reserved">return</span>;
+
+ <span class="reserved">for</span> (var a=0; a<box.length; a++) {
+ <span class="reserved">if</span> (box[a] != box[i])
+ <span class="reserved">return</span>;
+ }
+ }
+
+ <span class="comment">// They are all the same</span>
+ ar[res] = box[0];
+ ar[pr + <span class="literal">'-top'</span> + sf] = null;
+ ar[pr + <span class="literal">'-left'</span> + sf] = null;
+ ar[pr + <span class="literal">'-right'</span> + sf] = null;
+ ar[pr + <span class="literal">'-bottom'</span> + sf] = null;
+};
+
+<span class="comment">/**
+ * Serializes the specified style item name/value array into a HTML string. This function
+ * will force HEX colors in Firefox and convert the URL items of a style correctly.
+ *
+ * <span class="attrib">@param</span> {Array} ar Name/Value array of items to serialize.
+ * <span class="attrib">@return</span> Serialized HTML string containing the items.
+ * <span class="attrib">@type</span> string
+ */</span>
+TinyMCE_Engine.<span class="reserved">prototype</span>.serializeStyle = <span class="reserved">function</span>(ar) {
+ var str = <span class="literal">""</span>;
+
+ <span class="comment">// Compress box</span>
+ tinyMCE.compressStyle(ar, <span class="literal">"border"</span>, <span class="literal">""</span>, <span class="literal">"border"</span>);
+ tinyMCE.compressStyle(ar, <span class="literal">"border"</span>, <span class="literal">"-width"</span>, <span class="literal">"border-width"</span>);
+ tinyMCE.compressStyle(ar, <span class="literal">"border"</span>, <span class="literal">"-color"</span>, <span class="literal">"border-color"</span>);
+ tinyMCE.compressStyle(ar, <span class="literal">"border"</span>, <span class="literal">"-style"</span>, <span class="literal">"border-style"</span>);
+ tinyMCE.compressStyle(ar, <span class="literal">"padding"</span>, <span class="literal">""</span>, <span class="literal">"padding"</span>);
+ tinyMCE.compressStyle(ar, <span class="literal">"margin"</span>, <span class="literal">""</span>, <span class="literal">"margin"</span>);
+
+ <span class="reserved">for</span> (var key in ar) {
+ var val = ar[key];
+
+ <span class="reserved">if</span> (typeof(val) == <span class="literal">'function'</span>)
+ continue;
+
+ <span class="reserved">if</span> (key.indexOf(<span class="literal">'mso-'</span>) == 0)
+ continue;
+
+ <span class="reserved">if</span> (val != null && val != <span class="literal">''</span>) {
+ val = <span class="literal">''</span> + val; <span class="comment">// Force string</span>
+
+ <span class="comment">// Fix style URL</span>
+ val = val.replace(new RegExp(<span class="literal">"url\\(\\'?([^\\']*)\\'?\\)"</span>, <span class="literal">'gi'</span>), <span class="literal">"url('$1')"</span>);
+
+ <span class="comment">// Convert URL</span>
+ <span class="reserved">if</span> (val.indexOf(<span class="literal">'url('</span>) != -1 && tinyMCE.getParam(<span class="literal">'convert_urls'</span>)) {
+ var m = new RegExp(<span class="literal">"url\\('(.*?)'\\)"</span>).exec(val);
+
+ <span class="reserved">if</span> (m.length > 1)
+ val = <span class="literal">"url('"</span> + eval(tinyMCE.getParam(<span class="literal">'urlconverter_callback'</span>) + <span class="literal">"(m[1], null, true);"</span>) + <span class="literal">"')"</span>;
+ }
+
+ <span class="comment">// Force HEX colors</span>
+ <span class="reserved">if</span> (tinyMCE.getParam(<span class="literal">"force_hex_style_colors"</span>))
+ val = tinyMCE.convertRGBToHex(val, true);
+
+ <span class="reserved">if</span> (val != <span class="literal">"url('')"</span>)
+ str += key.toLowerCase() + <span class="literal">": "</span> + val + <span class="literal">"; "</span>;
+ }
+ }
+
+ <span class="reserved">if</span> (new RegExp(<span class="literal">'; $'</span>).test(str))
+ str = str.substring(0, str.length - 2);
+
+ <span class="reserved">return</span> str;
+};
+
+<span class="comment">/**
+ * Returns a hexadecimal version of the specified rgb(1,2,3) string.
+ *
+ * <span class="attrib">@param</span> {string} s RGB string to parse, if this doesn't isn't a rgb(n,n,n) it will passthrough the string.
+ * <span class="attrib">@param</span> {boolean} k Keep before/after contents. If enabled contents before after the rgb(n,n,n) will be intact.
+ * <span class="attrib">@return</span> Hexadecimal version of the specified rgb(1,2,3) string.
+ * <span class="attrib">@type</span> string
+ */</span>
+TinyMCE_Engine.<span class="reserved">prototype</span>.convertRGBToHex = <span class="reserved">function</span>(s, k) {
+ <span class="reserved">if</span> (s.toLowerCase().indexOf(<span class="literal">'rgb'</span>) != -1) {
+ var re = new RegExp(<span class="literal">"(.*?)rgb\\s*?\\(\\s*?([0-9]+).*?,\\s*?([0-9]+).*?,\\s*?([0-9]+).*?\\)(.*?)"</span>, <span class="literal">"gi"</span>);
+ var rgb = s.replace(re, <span class="literal">"$1,$2,$3,$4,$5"</span>).split(<span class="literal">','</span>);
+ <span class="reserved">if</span> (rgb.length == 5) {
+ r = parseInt(rgb[1]).toString(16);
+ g = parseInt(rgb[2]).toString(16);
+ b = parseInt(rgb[3]).toString(16);
+
+ r = r.length == 1 ? <span class="literal">'0'</span> + r : r;
+ g = g.length == 1 ? <span class="literal">'0'</span> + g : g;
+ b = b.length == 1 ? <span class="literal">'0'</span> + b : b;
+
+ s = <span class="literal">"#"</span> + r + g + b;
+
+ <span class="reserved">if</span> (k)
+ s = rgb[0] + s + rgb[4];
+ }
+ }
+
+ <span class="reserved">return</span> s;
+};
+
+<span class="comment">/**
+ * Returns a rgb(n,n,n) string from a hexadecimal value.
+ *
+ * <span class="attrib">@param</span> {string} s Hexadecimal string to parse.
+ * <span class="attrib">@return</span> rgb(n,n,n) string from a hexadecimal value.
+ * <span class="attrib">@type</span> string
+ */</span>
+TinyMCE_Engine.<span class="reserved">prototype</span>.convertHexToRGB = <span class="reserved">function</span>(s) {
+ <span class="reserved">if</span> (s.indexOf(<span class="literal">'#'</span>) != -1) {
+ s = s.replace(new RegExp(<span class="literal">'[^0-9A-F]'</span>, <span class="literal">'gi'</span>), <span class="literal">''</span>);
+ <span class="reserved">return</span> <span class="literal">"rgb("</span> + parseInt(s.substring(0, 2), 16) + <span class="literal">","</span> + parseInt(s.substring(2, 4), 16) + <span class="literal">","</span> + parseInt(s.substring(4, 6), 16) + <span class="literal">")"</span>;
+ }
+
+ <span class="reserved">return</span> s;
+};
+
+<span class="comment">/**
+ * Converts span elements to font elements in the specified document instance.
+ * Todo: Move this function into a XHTML plugin or simmilar.
+ *
+ * <span class="attrib">@param</span> {DOMDocument} doc Document instance to convert spans in.
+ */</span>
+TinyMCE_Engine.<span class="reserved">prototype</span>.convertSpansToFonts = <span class="reserved">function</span>(doc) {
+ var sizes = tinyMCE.getParam(<span class="literal">'font_size_style_values'</span>).replace(/\s+/, <span class="literal">''</span>).split(<span class="literal">','</span>);
+
+ var h = doc.body.innerHTML;
+ h = h.replace(/<span/gi, <span class="literal">'<font'</span>);
+ h = h.replace(/<\/span/gi, <span class="literal">'</font'</span>);
+ doc.body.innerHTML = h;
+
+ var s = doc.getElementsByTagName(<span class="literal">"font"</span>);
+ <span class="reserved">for</span> (var i=0; i<s.length; i++) {
+ var size = tinyMCE.trim(s[i].style.fontSize).toLowerCase();
+ var fSize = 0;
+
+ <span class="reserved">for</span> (var x=0; x<sizes.length; x++) {
+ <span class="reserved">if</span> (sizes[x] == size) {
+ fSize = x + 1;
+ break;
+ }
+ }
+
+ <span class="reserved">if</span> (fSize > 0) {
+ tinyMCE.setAttrib(s[i], <span class="literal">'size'</span>, fSize);
+ s[i].style.fontSize = <span class="literal">''</span>;
+ }
+
+ var fFace = s[i].style.fontFamily;
+ <span class="reserved">if</span> (fFace != null && fFace != <span class="literal">""</span>) {
+ tinyMCE.setAttrib(s[i], <span class="literal">'face'</span>, fFace);
+ s[i].style.fontFamily = <span class="literal">''</span>;
+ }
+
+ var fColor = s[i].style.color;
+ <span class="reserved">if</span> (fColor != null && fColor != <span class="literal">""</span>) {
+ tinyMCE.setAttrib(s[i], <span class="literal">'color'</span>, tinyMCE.convertRGBToHex(fColor));
+ s[i].style.color = <span class="literal">''</span>;
+ }
+ }
+};
+
+<span class="comment">/**
+ * Convers fonts to spans in the specified document.
+ * Todo: Move this function into a XHTML plugin or simmilar.
+ *
+ * <span class="attrib">@param</span> {DOMDocument} doc Document instance to convert fonts in.
+ */</span>
+TinyMCE_Engine.<span class="reserved">prototype</span>.convertFontsToSpans = <span class="reserved">function</span>(doc) {
+ var sizes = tinyMCE.getParam(<span class="literal">'font_size_style_values'</span>).replace(/\s+/, <span class="literal">''</span>).split(<span class="literal">','</span>);
+
+ var h = doc.body.innerHTML;
+ h = h.replace(/<font/gi, <span class="literal">'<span'</span>);
+ h = h.replace(/<\/font/gi, <span class="literal">'</span'</span>);
+ doc.body.innerHTML = h;
+
+ var fsClasses = tinyMCE.getParam(<span class="literal">'font_size_classes'</span>);
+ <span class="reserved">if</span> (fsClasses != <span class="literal">''</span>)
+ fsClasses = fsClasses.replace(/\s+/, <span class="literal">''</span>).split(<span class="literal">','</span>);
+ <span class="reserved">else</span>
+ fsClasses = null;
+
+ var s = doc.getElementsByTagName(<span class="literal">"span"</span>);
+ <span class="reserved">for</span> (var i=0; i<s.length; i++) {
+ var fSize, fFace, fColor;
+
+ fSize = tinyMCE.getAttrib(s[i], <span class="literal">'size'</span>);
+ fFace = tinyMCE.getAttrib(s[i], <span class="literal">'face'</span>);
+ fColor = tinyMCE.getAttrib(s[i], <span class="literal">'color'</span>);
+
+ <span class="reserved">if</span> (fSize != <span class="literal">""</span>) {
+ fSize = parseInt(fSize);
+
+ <span class="reserved">if</span> (fSize > 0 && fSize < 8) {
+ <span class="reserved">if</span> (fsClasses != null)
+ tinyMCE.setAttrib(s[i], <span class="literal">'class'</span>, fsClasses[fSize-1]);
+ <span class="reserved">else</span>
+ s[i].style.fontSize = sizes[fSize-1];
+ }
+
+ s[i].removeAttribute(<span class="literal">'size'</span>);
+ }
+
+ <span class="reserved">if</span> (fFace != <span class="literal">""</span>) {
+ s[i].style.fontFamily = fFace;
+ s[i].removeAttribute(<span class="literal">'face'</span>);
+ }
+
+ <span class="reserved">if</span> (fColor != <span class="literal">""</span>) {
+ s[i].style.color = fColor;
+ s[i].removeAttribute(<span class="literal">'color'</span>);
+ }
+ }
+};
+
+<span class="comment">/**
+ * Moves the contents of a anchor outside and after the anchor. Only if the anchor doesn't
+ * have a href.
+ *
+ * <span class="attrib">@param</span> {DOMDocument} doc DOM document instance to fix anchors in.
+ */</span>
+TinyMCE_Engine.<span class="reserved">prototype</span>.cleanupAnchors = <span class="reserved">function</span>(doc) {
+ var i, cn, x, an = doc.getElementsByTagName(<span class="literal">"a"</span>);
+
+ <span class="comment">// Loops backwards due to bug #1467987</span>
+ <span class="reserved">for</span> (i=an.length-1; i>=0; i--) {
+ <span class="reserved">if</span> (tinyMCE.getAttrib(an[i], <span class="literal">"name"</span>) != <span class="literal">""</span> && tinyMCE.getAttrib(an[i], <span class="literal">"href"</span>) == <span class="literal">""</span>) {
+ cn = an[i].childNodes;
+
+ <span class="reserved">for</span> (x=cn.length-1; x>=0; x--)
+ tinyMCE.insertAfter(cn[x], an[i]);
+ }
+ }
+};
+
+<span class="comment">/**
+ * Returns the HTML contents of the specified editor instance id.
+ *
+ * <span class="attrib">@param</span> {string} editor_id Editor instance id to retrive HTML code from.
+ * <span class="attrib">@return</span> HTML contents of editor id or null if it wasn't found.
+ * <span class="attrib">@type</span> string
+ */</span>
+TinyMCE_Engine.<span class="reserved">prototype</span>.getContent = <span class="reserved">function</span>(editor_id) {
+ var h;
+
+ <span class="reserved">if</span> (typeof(editor_id) != <span class="literal">"undefined"</span>)
+ tinyMCE.selectedInstance = tinyMCE.getInstanceById(editor_id);
+
+ <span class="reserved">if</span> (tinyMCE.selectedInstance) {
+ h = tinyMCE._cleanupHTML(<span class="reserved">this</span>.selectedInstance, <span class="reserved">this</span>.selectedInstance.getDoc(), tinyMCE.settings, <span class="reserved">this</span>.selectedInstance.getBody(), false, true);
+
+ <span class="comment">// When editing always use fonts internaly</span>
+ <span class="reserved">if</span> (tinyMCE.getParam(<span class="literal">"convert_fonts_to_spans"</span>))
+ tinyMCE.convertSpansToFonts(<span class="reserved">this</span>.selectedInstance.getDoc());
+
+ <span class="reserved">return</span> h;
+ }
+
+ <span class="reserved">return</span> null;
+};
+
+<span class="comment">/**
+ * Fixes invalid ul/ol elements so the document is more XHTML valid.
+ *
+ * <span class="attrib">@param</span> {DOMDocument} d HTML DOM document to fix list elements in.
+ * <span class="attrib">@private</span>
+ */</span>
+TinyMCE_Engine.<span class="reserved">prototype</span>._fixListElements = <span class="reserved">function</span>(d) {
+ var nl, x, a = [<span class="literal">'ol'</span>, <span class="literal">'ul'</span>], i, n, p, r = new RegExp(<span class="literal">'^(OL|UL)$'</span>), np;
+
+ <span class="reserved">for</span> (x=0; x<a.length; x++) {
+ nl = d.getElementsByTagName(a[x]);
+
+ <span class="reserved">for</span> (i=0; i<nl.length; i++) {
+ n = nl[i];
+ p = n.parentNode;
+
+ <span class="reserved">if</span> (r.test(p.nodeName)) {
+ np = tinyMCE.prevNode(n, <span class="literal">'LI'</span>);
+
+ <span class="reserved">if</span> (!np) {
+ np = d.createElement(<span class="literal">'li'</span>);
+ np.innerHTML = <span class="literal">' '</span>;
+ np.appendChild(n);
+ p.insertBefore(np, p.firstChild);
+ } <span class="reserved">else</span>
+ np.appendChild(n);
+ }
+ }
+ }
+};
+
+<span class="comment">/**
+ * Moves table elements out of block elements to produce more valid XHTML.
+ *
+ * <span class="attrib">@param</span> {DOMDocument} d HTML DOM document to fix list elements in.
+ * <span class="attrib">@private</span>
+ */</span>
+TinyMCE_Engine.<span class="reserved">prototype</span>._fixTables = <span class="reserved">function</span>(d) {
+ var nl, i, n, p, np, x, t;
+
+ nl = d.getElementsByTagName(<span class="literal">'table'</span>);
+ <span class="reserved">for</span> (i=0; i<nl.length; i++) {
+ n = nl[i];
+
+ <span class="reserved">if</span> ((p = tinyMCE.getParentElement(n, <span class="literal">'p,div,h1,h2,h3,h4,h5,h6'</span>)) != null) {
+ np = p.cloneNode(false);
+ np.removeAttribute(<span class="literal">'id'</span>);
+
+ t = n;
+
+ <span class="reserved">while</span> ((n = n.nextSibling))
+ np.appendChild(n);
+
+ tinyMCE.insertAfter(np, p);
+ tinyMCE.insertAfter(t, p);
+ }
+ }
+};
+
+<span class="comment">/**
+ * Performces cleanup of the contents of the specified instance.
+ * Todo: Finish documentation, and remove useless parameters.
+ *
+ * <span class="attrib">@param</span> {TinyMCE_Control} inst Editor instance.
+ * <span class="attrib">@param</span> {DOMDocument} doc ...
+ * <span class="attrib">@param</span> {Array} config ...
+ * <span class="attrib">@param</span> {HTMLElement} elm ...
+ * <span class="attrib">@param</span> {boolean} visual ...
+ * <span class="attrib">@param</span> {boolean} on_save ...
+ * <span class="attrib">@param</span> {boolean} on_submit ...
+ * <span class="attrib">@return</span> Cleaned HTML contents of editor instance.
+ * <span class="attrib">@type</span> string
+ * <span class="attrib">@private</span>
+ */</span>
+TinyMCE_Engine.<span class="reserved">prototype</span>._cleanupHTML = <span class="reserved">function</span>(inst, doc, config, elm, visual, on_save, on_submit) {
+ var h, d, t1, t2, t3, t4, t5, c, s;
+
+ <span class="reserved">if</span> (!tinyMCE.getParam(<span class="literal">'cleanup'</span>))
+ <span class="reserved">return</span> elm.innerHTML;
+
+ on_save = typeof(on_save) == <span class="literal">'undefined'</span> ? false : on_save;
+
+ c = inst.cleanup;
+ s = inst.settings;
+ d = c.settings.debug;
+
+ <span class="reserved">if</span> (d)
+ t1 = new Date().getTime();
+
+ <span class="reserved">if</span> (tinyMCE.getParam(<span class="literal">"convert_fonts_to_spans"</span>))
+ tinyMCE.convertFontsToSpans(doc);
+
+ <span class="reserved">if</span> (tinyMCE.getParam(<span class="literal">"fix_list_elements"</span>))
+ tinyMCE._fixListElements(doc);
+
+ <span class="reserved">if</span> (tinyMCE.getParam(<span class="literal">"fix_table_elements"</span>))
+ tinyMCE._fixTables(doc);
+
+ <span class="comment">// Call custom cleanup code</span>
+ tinyMCE._customCleanup(inst, on_save ? <span class="literal">"get_from_editor_dom"</span> : <span class="literal">"insert_to_editor_dom"</span>, doc.body);
+
+ <span class="reserved">if</span> (d)
+ t2 = new Date().getTime();
+
+ c.settings.on_save = on_save;
+ <span class="comment">//for (var i=0; i<100; i++)</span>
+
+ c.idCount = 0;
+ c.serializationId++;
+ c.serializedNodes = new Array();
+ c.sourceIndex = -1;
+
+ <span class="reserved">if</span> (s.cleanup_serializer == <span class="literal">"xml"</span>)
+ h = c.serializeNodeAsXML(elm);
+ <span class="reserved">else</span>
+ h = c.serializeNodeAsHTML(elm);
+
+ <span class="reserved">if</span> (d)
+ t3 = new Date().getTime();
+
+ <span class="comment">// Post processing</span>
+ h = h.replace(/<\/?(body|head|html)[^>]*>/gi, <span class="literal">''</span>);
+ h = h.replace(new RegExp(<span class="literal">' (rowspan="1"|colspan="1")'</span>, <span class="literal">'g'</span>), <span class="literal">''</span>);
+ h = h.replace(/<p><hr \/><\/p>/g, <span class="literal">'<hr />'</span>);
+ h = h.replace(/<p>( | )<\/p><hr \/><p>( | )<\/p>/g, <span class="literal">'<hr />'</span>);
+ h = h.replace(/<td>\s*<br \/>\s*<\/td>/g, <span class="literal">'<td> </td>'</span>);
+ h = h.replace(/<p>\s*<br \/>\s*<\/p>/g, <span class="literal">'<p> </p>'</span>);
+ h = h.replace(/<p>\s*( | )\s*<br \/>\s*( | )\s*<\/p>/g, <span class="literal">'<p> </p>'</span>);
+ h = h.replace(/<p>\s*( | )\s*<br \/>\s*<\/p>/g, <span class="literal">'<p> </p>'</span>);
+ h = h.replace(/<p>\s*<br \/>\s* \s*<\/p>/g, <span class="literal">'<p> </p>'</span>);
+ h = h.replace(new RegExp(<span class="literal">'<a>(.*?)<\\/a>'</span>, <span class="literal">'g'</span>), <span class="literal">'$1'</span>);
+ h = h.replace(/<p([^>]*)>\s*<\/p>/g, <span class="literal">'<p$1> </p>'</span>);
+
+ <span class="comment">// Clean body</span>
+ <span class="reserved">if</span> (/^\s*(<br \/>|<p> <\/p>|<p> <\/p>|<p><\/p>)\s*$/.test(h))
+ h = <span class="literal">''</span>;
+
+ <span class="comment">// If preformatted</span>
+ <span class="reserved">if</span> (s.preformatted) {
+ h = h.replace(/^<pre>/, <span class="literal">''</span>);
+ h = h.replace(/<\/pre>$/, <span class="literal">''</span>);
+ h = <span class="literal">'<pre>'</span> + h + <span class="literal">'</pre>'</span>;
+ }
+
+ <span class="comment">// Gecko specific processing</span>
+ <span class="reserved">if</span> (tinyMCE.isGecko) {
+ h = h.replace(/<o:p _moz-userdefined=<span class="literal">""</span> \/>/g, <span class="literal">''</span>);
+ h = h.replace(/<td([^>]*)>\s*<br \/>\s*<\/td>/g, <span class="literal">'<td$1> </td>'</span>);
+ }
+
+ <span class="reserved">if</span> (s.force_br_newlines)
+ h = h.replace(/<p>( | )<\/p>/g, <span class="literal">'<br />'</span>);
+
+ <span class="comment">// Call custom cleanup code</span>
+ h = tinyMCE._customCleanup(inst, on_save ? <span class="literal">"get_from_editor"</span> : <span class="literal">"insert_to_editor"</span>, h);
+
+ <span class="comment">// Remove internal classes</span>
+ <span class="reserved">if</span> (on_save) {
+ h = h.replace(new RegExp(<span class="literal">' ?(mceItem[a-zA-Z0-9]*|'</span> + s.visual_table_class + <span class="literal">')'</span>, <span class="literal">'g'</span>), <span class="literal">''</span>);
+ h = h.replace(new RegExp(<span class="literal">' ?class=""'</span>, <span class="literal">'g'</span>), <span class="literal">''</span>);
+ }
+
+ <span class="reserved">if</span> (s.remove_linebreaks && !c.settings.indent)
+ h = h.replace(/\n|\r/g, <span class="literal">' '</span>);
+
+ <span class="reserved">if</span> (d)
+ t4 = new Date().getTime();
+
+ <span class="reserved">if</span> (on_save && c.settings.indent)
+ h = c.formatHTML(h);
+
+ <span class="comment">// If encoding (not recommended option)</span>
+ <span class="reserved">if</span> (on_submit && (s.encoding == <span class="literal">"xml"</span> || s.encoding == <span class="literal">"html"</span>))
+ h = c.xmlEncode(h);
+
+ <span class="reserved">if</span> (d)
+ t5 = new Date().getTime();
+
+ <span class="reserved">if</span> (c.settings.debug)
+ tinyMCE.debug(<span class="literal">"Cleanup in ms: Pre="</span> + (t2-t1) + <span class="literal">", Serialize: "</span> + (t3-t2) + <span class="literal">", Post: "</span> + (t4-t3) + <span class="literal">", Format: "</span> + (t5-t4) + <span class="literal">", Sum: "</span> + (t5-t1) + <span class="literal">"."</span>);
+
+ <span class="reserved">return</span> h;
+};
+
+<span class="comment">/**
+ * TinyMCE_Cleanup class.
+ */</span>
+<span class="reserved">function</span> TinyMCE_Cleanup() {
+ <span class="reserved">this</span>.isMSIE = (navigator.appName == <span class="literal">"Microsoft Internet Explorer"</span>);
+ <span class="reserved">this</span>.rules = tinyMCE.clearArray(new Array());
+
+ <span class="comment">// Default config</span>
+ <span class="reserved">this</span>.settings = {
+ indent_elements : <span class="literal">'head,table,tbody,thead,tfoot,form,tr,ul,ol,blockquote,object'</span>,
+ newline_before_elements : <span class="literal">'h1,h2,h3,h4,h5,h6,pre,address,div,ul,ol,li,meta,option,area,title,link,base,script,td'</span>,
+ newline_after_elements : <span class="literal">'br,hr,p,pre,address,div,ul,ol,meta,option,area,link,base,script'</span>,
+ newline_before_after_elements : <span class="literal">'html,head,body,table,thead,tbody,tfoot,tr,form,ul,ol,blockquote,p,object,param,hr,div'</span>,
+ indent_char : <span class="literal">'\t'</span>,
+ indent_levels : 1,
+ entity_encoding : <span class="literal">'raw'</span>,
+ valid_elements : <span class="literal">'*[*]'</span>,
+ entities : <span class="literal">''</span>,
+ url_converter : <span class="literal">''</span>,
+ invalid_elements : <span class="literal">''</span>,
+ verify_html : false
+ };
+
+ <span class="reserved">this</span>.vElements = tinyMCE.clearArray(new Array());
+ <span class="reserved">this</span>.vElementsRe = <span class="literal">''</span>;
+ <span class="reserved">this</span>.closeElementsRe = /^(IMG|BR|HR|LINK|META|BASE|INPUT|BUTTON|AREA)$/;
+ <span class="reserved">this</span>.codeElementsRe = /^(SCRIPT|STYLE)$/;
+ <span class="reserved">this</span>.serializationId = 0;
+ <span class="reserved">this</span>.mceAttribs = {
+ href : <span class="literal">'mce_href'</span>,
+ src : <span class="literal">'mce_src'</span>,
+ type : <span class="literal">'mce_type'</span>
+ };
+}
+
+TinyMCE_Cleanup.<span class="reserved">prototype</span> = {
+ <span class="comment">/**
+ * Initializes the cleanup engine with the specified config.
+ *
+ * <span class="attrib">@param</span> {Array} s Name/Value array with config settings.
+ */</span>
+ init : <span class="reserved">function</span>(s) {
+ var n, a, i, ir, or, st;
+
+ <span class="reserved">for</span> (n in s)
+ <span class="reserved">this</span>.settings[n] = s[n];
+
+ <span class="comment">// Setup code formating</span>
+ s = <span class="reserved">this</span>.settings;
+
+ <span class="comment">// Setup regexps</span>
+ <span class="reserved">this</span>.inRe = <span class="reserved">this</span>._arrayToRe(s.indent_elements.split(<span class="literal">','</span>), <span class="literal">''</span>, <span class="literal">'^<('</span>, <span class="literal">')[^>]*'</span>);
+ <span class="reserved">this</span>.ouRe = <span class="reserved">this</span>._arrayToRe(s.indent_elements.split(<span class="literal">','</span>), <span class="literal">''</span>, <span class="literal">'^<\\/('</span>, <span class="literal">')[^>]*'</span>);
+ <span class="reserved">this</span>.nlBeforeRe = <span class="reserved">this</span>._arrayToRe(s.newline_before_elements.split(<span class="literal">','</span>), <span class="literal">'gi'</span>, <span class="literal">'<('</span>, <span class="literal">')([^>]*)>'</span>);
+ <span class="reserved">this</span>.nlAfterRe = <span class="reserved">this</span>._arrayToRe(s.newline_after_elements.split(<span class="literal">','</span>), <span class="literal">'gi'</span>, <span class="literal">'<('</span>, <span class="literal">')([^>]*)>'</span>);
+ <span class="reserved">this</span>.nlBeforeAfterRe = <span class="reserved">this</span>._arrayToRe(s.newline_before_after_elements.split(<span class="literal">','</span>), <span class="literal">'gi'</span>, <span class="literal">'<(\\/?)('</span>, <span class="literal">')([^>]*)>'</span>);
+
+ <span class="reserved">if</span> (s.invalid_elements != <span class="literal">''</span>)
+ <span class="reserved">this</span>.iveRe = <span class="reserved">this</span>._arrayToRe(s.invalid_elements.toUpperCase().split(<span class="literal">','</span>), <span class="literal">'g'</span>, <span class="literal">'^('</span>, <span class="literal">')$'</span>);
+ <span class="reserved">else</span>
+ <span class="reserved">this</span>.iveRe = null;
+
+ <span class="comment">// Setup separator</span>
+ st = <span class="literal">''</span>;
+ <span class="reserved">for</span> (i=0; i<s.indent_levels; i++)
+ st += s.indent_char;
+
+ <span class="reserved">this</span>.inStr = st;
+
+ <span class="comment">// If verify_html if false force *[*]</span>
+ <span class="reserved">if</span> (!s.verify_html) {
+ s.valid_elements = <span class="literal">'*[*]'</span>;
+ s.extended_valid_elements = <span class="literal">''</span>;
+ }
+
+ <span class="reserved">this</span>.fillStr = s.entity_encoding == <span class="literal">"named"</span> ? <span class="literal">" "</span> : <span class="literal">" "</span>;
+ <span class="reserved">this</span>.idCount = 0;
+ },
+
+ <span class="comment">/**
+ * Adds a cleanup rule string, for example: a[href|name|title=title|class=class1?class2?class3].
+ * These rules are then used when serializing the DOM tree as a HTML string, it gives the possibility
+ * to control the valid elements and attributes and force attribute values or default them.
+ *
+ * <span class="attrib">@param</span> {string} s Rule string to parse and add to the cleanup rules array.
+ */</span>
+ addRuleStr : <span class="reserved">function</span>(s) {
+ var r = <span class="reserved">this</span>.parseRuleStr(s);
+ var n;
+
+ <span class="reserved">for</span> (n in r) {
+ <span class="reserved">if</span> (r[n])
+ <span class="reserved">this</span>.rules[n] = r[n];
+ }
+
+ <span class="reserved">this</span>.vElements = tinyMCE.clearArray(new Array());
+
+ <span class="reserved">for</span> (n in <span class="reserved">this</span>.rules) {
+ <span class="reserved">if</span> (<span class="reserved">this</span>.rules[n])
+ <span class="reserved">this</span>.vElements[<span class="reserved">this</span>.vElements.length] = <span class="reserved">this</span>.rules[n].tag;
+ }
+
+ <span class="reserved">this</span>.vElementsRe = <span class="reserved">this</span>._arrayToRe(<span class="reserved">this</span>.vElements, <span class="literal">''</span>);
+ },
+
+ <span class="comment">/**
+ * Parses a cleanup rule string, for example: a[href|name|title=title|class=class1?class2?class3].
+ * These rules are then used when serializing the DOM tree as a HTML string, it gives the possibility
+ * to control the valid elements and attributes and force attribute values or default them.
+ *
+ * <span class="attrib">@param</span> {string} s Rule string to parse as a name/value rule array.
+ * <span class="attrib">@return</span> Parsed name/value rule array.
+ * <span class="attrib">@type</span> Array
+ */</span>
+ parseRuleStr : <span class="reserved">function</span>(s) {
+ var ta, p, r, a, i, x, px, t, tn, y, av, or = tinyMCE.clearArray(new Array()), dv;
+
+ <span class="reserved">if</span> (s == null || s.length == 0)
+ <span class="reserved">return</span> or;
+
+ ta = s.split(<span class="literal">','</span>);
+ <span class="reserved">for</span> (x=0; x<ta.length; x++) {
+ s = ta[x];
+ <span class="reserved">if</span> (s.length == 0)
+ continue;
+
+ <span class="comment">// Split tag/attrs</span>
+ p = <span class="reserved">this</span>.split(/\[|\]/, s);
+ <span class="reserved">if</span> (p == null || p.length < 1)
+ t = s.toUpperCase();
+ <span class="reserved">else</span>
+ t = p[0].toUpperCase();
+
+ <span class="comment">// Handle all tag names</span>
+ tn = <span class="reserved">this</span>.split(<span class="literal">'/'</span>, t);
+ <span class="reserved">for</span> (y=0; y<tn.length; y++) {
+ r = {};
+
+ r.tag = tn[y];
+ r.forceAttribs = null;
+ r.defaultAttribs = null;
+ r.validAttribValues = null;
+
+ <span class="comment">// Handle prefixes</span>
+ px = r.tag.charAt(0);
+ r.forceOpen = px == <span class="literal">'+'</span>;
+ r.removeEmpty = px == <span class="literal">'-'</span>;
+ r.fill = px == <span class="literal">'#'</span>;
+ r.tag = r.tag.replace(/\+|-|#/g, <span class="literal">''</span>);
+ r.oTagName = tn[0].replace(/\+|-|#/g, <span class="literal">''</span>).toLowerCase();
+ r.isWild = new RegExp(<span class="literal">'\\*|\\?|\\+'</span>, <span class="literal">'g'</span>).test(r.tag);
+ r.validRe = new RegExp(<span class="reserved">this</span>._wildcardToRe(<span class="literal">'^'</span> + r.tag + <span class="literal">'$'</span>));
+
+ <span class="comment">// Setup valid attributes</span>
+ <span class="reserved">if</span> (p.length > 1) {
+ r.vAttribsRe = <span class="literal">'^('</span>;
+ a = <span class="reserved">this</span>.split(/\|/, p[1]);
+
+ <span class="reserved">for</span> (i=0; i<a.length; i++) {
+ t = a[i];
+
+ av = new RegExp(<span class="literal">'(=|:|<)(.*?)$'</span>).exec(t);
+ t = t.replace(new RegExp(<span class="literal">'(=|:|<).*?$'</span>), <span class="literal">''</span>);
+ <span class="reserved">if</span> (av && av.length > 0) {
+ <span class="reserved">if</span> (av[0].charAt(0) == <span class="literal">':'</span>) {
+ <span class="reserved">if</span> (!r.forceAttribs)
+ r.forceAttribs = tinyMCE.clearArray(new Array());
+
+ r.forceAttribs[t.toLowerCase()] = av[0].substring(1);
+ } <span class="reserved">else</span> <span class="reserved">if</span> (av[0].charAt(0) == <span class="literal">'='</span>) {
+ <span class="reserved">if</span> (!r.defaultAttribs)
+ r.defaultAttribs = tinyMCE.clearArray(new Array());
+
+ dv = av[0].substring(1);
+
+ r.defaultAttribs[t.toLowerCase()] = dv == <span class="literal">""</span> ? <span class="literal">"mce_empty"</span> : dv;
+ } <span class="reserved">else</span> <span class="reserved">if</span> (av[0].charAt(0) == <span class="literal">'<'</span>) {
+ <span class="reserved">if</span> (!r.validAttribValues)
+ r.validAttribValues = tinyMCE.clearArray(new Array());
+
+ r.validAttribValues[t.toLowerCase()] = <span class="reserved">this</span>._arrayToRe(<span class="reserved">this</span>.split(<span class="literal">'?'</span>, av[0].substring(1)), <span class="literal">''</span>);
+ }
+ }
+
+ r.vAttribsRe += <span class="literal">''</span> + t.toLowerCase() + (i != a.length - 1 ? <span class="literal">'|'</span> : <span class="literal">''</span>);
+
+ a[i] = t.toLowerCase();
+ }
+
+ r.vAttribsRe += <span class="literal">')$'</span>;
+ r.vAttribsRe = <span class="reserved">this</span>._wildcardToRe(r.vAttribsRe);
+ r.vAttribsReIsWild = new RegExp(<span class="literal">'\\*|\\?|\\+'</span>, <span class="literal">'g'</span>).test(r.vAttribsRe);
+ r.vAttribsRe = new RegExp(r.vAttribsRe);
+ r.vAttribs = a.reverse();
+
+ <span class="comment">//tinyMCE.debug(r.tag, r.oTagName, r.vAttribsRe, r.vAttribsReWC);</span>
+ } <span class="reserved">else</span> {
+ r.vAttribsRe = <span class="literal">''</span>;
+ r.vAttribs = tinyMCE.clearArray(new Array());
+ r.vAttribsReIsWild = false;
+ }
+
+ or[r.tag] = r;
+ }
+ }
+
+ <span class="reserved">return</span> or;
+ },
+
+ <span class="comment">/**
+ * Serializes the specified node as a HTML string. This uses the XML parser and serializer
+ * to generate a XHTML string.
+ *
+ * <span class="attrib">@param</span> {HTMLNode} n Node to serialize as a XHTML string.
+ * <span class="attrib">@return</span> Serialized XHTML string based on specified node.
+ * <span class="attrib">@type</span> string
+ */</span>
+ serializeNodeAsXML : <span class="reserved">function</span>(n) {
+ var s, b;
+
+ <span class="reserved">if</span> (!<span class="reserved">this</span>.xmlDoc) {
+ <span class="reserved">if</span> (<span class="reserved">this</span>.isMSIE) {
+ try {<span class="reserved">this</span>.xmlDoc = new ActiveXObject(<span class="literal">'MSXML2.DOMDocument'</span>);} catch (e) {}
+
+ <span class="reserved">if</span> (!<span class="reserved">this</span>.xmlDoc)
+ try {<span class="reserved">this</span>.xmlDoc = new ActiveXObject(<span class="literal">'Microsoft.XmlDom'</span>);} catch (e) {}
+ } <span class="reserved">else</span>
+ <span class="reserved">this</span>.xmlDoc = document.implementation.createDocument(<span class="literal">''</span>, <span class="literal">''</span>, null);
+
+ <span class="reserved">if</span> (!<span class="reserved">this</span>.xmlDoc)
+ alert(<span class="literal">"Error XML Parser could not be found."</span>);
+ }
+
+ <span class="reserved">if</span> (<span class="reserved">this</span>.xmlDoc.firstChild)
+ <span class="reserved">this</span>.xmlDoc.removeChild(<span class="reserved">this</span>.xmlDoc.firstChild);
+
+ b = <span class="reserved">this</span>.xmlDoc.createElement(<span class="literal">"html"</span>);
+ b = <span class="reserved">this</span>.xmlDoc.appendChild(b);
+
+ <span class="reserved">this</span>._convertToXML(n, b);
+
+ <span class="reserved">if</span> (<span class="reserved">this</span>.isMSIE)
+ <span class="reserved">return</span> <span class="reserved">this</span>.xmlDoc.xml;
+ <span class="reserved">else</span>
+ <span class="reserved">return</span> new XMLSerializer().serializeToString(<span class="reserved">this</span>.xmlDoc);
+ },
+
+ <span class="comment">/**
+ * Converts and adds the specified HTML DOM node to a XML DOM node.
+ *
+ * <span class="attrib">@param</span> {HTMLNode} n HTML Node to add as a XML node.
+ * <span class="attrib">@param</span> {XMLNode} xn XML Node to add the HTML node to.
+ * <span class="attrib">@private</span>
+ */</span>
+ _convertToXML : <span class="reserved">function</span>(n, xn) {
+ var xd, el, i, l, cn, at, no, hc = false;
+
+ <span class="reserved">if</span> (<span class="reserved">this</span>._isDuplicate(n))
+ <span class="reserved">return</span>;
+
+ xd = <span class="reserved">this</span>.xmlDoc;
+
+ switch (n.nodeType) {
+ case 1: <span class="comment">// Element</span>
+ hc = n.hasChildNodes();
+
+ el = xd.createElement(n.nodeName.toLowerCase());
+
+ at = n.attributes;
+ <span class="reserved">for</span> (i=at.length-1; i>-1; i--) {
+ no = at[i];
+
+ <span class="reserved">if</span> (no.specified && no.nodeValue)
+ el.setAttribute(no.nodeName.toLowerCase(), no.nodeValue);
+ }
+
+ <span class="reserved">if</span> (!hc && !<span class="reserved">this</span>.closeElementsRe.test(n.nodeName))
+ el.appendChild(xd.createTextNode(<span class="literal">""</span>));
+
+ xn = xn.appendChild(el);
+ break;
+
+ case 3: <span class="comment">// Text</span>
+ xn.appendChild(xd.createTextNode(n.nodeValue));
+ <span class="reserved">return</span>;
+
+ case 8: <span class="comment">// Comment</span>
+ xn.appendChild(xd.createComment(n.nodeValue));
+ <span class="reserved">return</span>;
+ }
+
+ <span class="reserved">if</span> (hc) {
+ cn = n.childNodes;
+
+ <span class="reserved">for</span> (i=0, l=cn.length; i<l; i++)
+ <span class="reserved">this</span>._convertToXML(cn[i], xn);
+ }
+ },
+
+ <span class="comment">/**
+ * Serializes the specified node as a XHTML string. This uses the TinyMCE serializer logic since it gives more
+ * control over the output than the build in browser XML serializer.
+ *
+ * <span class="attrib">@param</span> {HTMLNode} n Node to serialize as a XHTML string.
+ * <span class="attrib">@return</span> Serialized XHTML string based on specified node.
+ * <span class="attrib">@type</span> string
+ */</span>
+ serializeNodeAsHTML : <span class="reserved">function</span>(n) {
+ var en, no, h = <span class="literal">''</span>, i, l, r, cn, va = false, f = false, at, hc;
+
+ <span class="reserved">this</span>._setupRules(); <span class="comment">// Will initialize cleanup rules</span>
+
+ <span class="reserved">if</span> (<span class="reserved">this</span>._isDuplicate(n))
+ <span class="reserved">return</span> <span class="literal">''</span>;
+
+ switch (n.nodeType) {
+ case 1: <span class="comment">// Element</span>
+ hc = n.hasChildNodes();
+
+ <span class="comment">// MSIE sometimes produces <//tag></span>
+ <span class="reserved">if</span> ((tinyMCE.isMSIE && !tinyMCE.isOpera) && n.nodeName.indexOf(<span class="literal">'/'</span>) != -1)
+ break;
+
+ <span class="reserved">if</span> (<span class="reserved">this</span>.vElementsRe.test(n.nodeName) && (!<span class="reserved">this</span>.iveRe || !<span class="reserved">this</span>.iveRe.test(n.nodeName))) {
+ va = true;
+
+ r = <span class="reserved">this</span>.rules[n.nodeName];
+ <span class="reserved">if</span> (!r) {
+ at = <span class="reserved">this</span>.rules;
+ <span class="reserved">for</span> (no in at) {
+ <span class="reserved">if</span> (at[no] && at[no].validRe.test(n.nodeName)) {
+ r = at[no];
+ break;
+ }
+ }
+ }
+
+ en = r.isWild ? n.nodeName.toLowerCase() : r.oTagName;
+ f = r.fill;
+
+ <span class="reserved">if</span> (r.removeEmpty && !hc)
+ <span class="reserved">return</span> <span class="literal">""</span>;
+
+ h += <span class="literal">'<'</span> + en;
+
+ <span class="reserved">if</span> (r.vAttribsReIsWild) {
+ <span class="comment">// Serialize wildcard attributes</span>
+ at = n.attributes;
+ <span class="reserved">for</span> (i=at.length-1; i>-1; i--) {
+ no = at[i];
+ <span class="reserved">if</span> (no.specified && r.vAttribsRe.test(no.nodeName))
+ h += <span class="reserved">this</span>._serializeAttribute(n, r, no.nodeName);
+ }
+ } <span class="reserved">else</span> {
+ <span class="comment">// Serialize specific attributes</span>
+ <span class="reserved">for</span> (i=r.vAttribs.length-1; i>-1; i--)
+ h += <span class="reserved">this</span>._serializeAttribute(n, r, r.vAttribs[i]);
+ }
+
+ <span class="comment">// Serialize mce_ atts</span>
+ <span class="reserved">if</span> (!<span class="reserved">this</span>.settings.on_save) {
+ at = <span class="reserved">this</span>.mceAttribs;
+
+ <span class="reserved">for</span> (no in at) {
+ <span class="reserved">if</span> (at[no])
+ h += <span class="reserved">this</span>._serializeAttribute(n, r, at[no]);
+ }
+ }
+
+ <span class="comment">// Close these</span>
+ <span class="reserved">if</span> (<span class="reserved">this</span>.closeElementsRe.test(n.nodeName))
+ <span class="reserved">return</span> h + <span class="literal">' />'</span>;
+
+ h += <span class="literal">'>'</span>;
+
+ <span class="reserved">if</span> (<span class="reserved">this</span>.isMSIE && <span class="reserved">this</span>.codeElementsRe.test(n.nodeName))
+ h += n.innerHTML;
+ }
+ break;
+
+ case 3: <span class="comment">// Text</span>
+ <span class="reserved">if</span> (n.parentNode && <span class="reserved">this</span>.codeElementsRe.test(n.parentNode.nodeName))
+ <span class="reserved">return</span> <span class="reserved">this</span>.isMSIE ? <span class="literal">''</span> : n.nodeValue;
+
+ <span class="reserved">return</span> <span class="reserved">this</span>.xmlEncode(n.nodeValue);
+
+ case 8: <span class="comment">// Comment</span>
+ <span class="reserved">return</span> <span class="literal">"<!--"</span> + <span class="reserved">this</span>._trimComment(n.nodeValue) + <span class="literal">"-->"</span>;
+ }
+
+ <span class="reserved">if</span> (hc) {
+ cn = n.childNodes;
+
+ <span class="reserved">for</span> (i=0, l=cn.length; i<l; i++)
+ h += <span class="reserved">this</span>.serializeNodeAsHTML(cn[i]);
+ }
+
+ <span class="comment">// Fill empty nodes</span>
+ <span class="reserved">if</span> (f && !hc)
+ h += <span class="reserved">this</span>.fillStr;
+
+ <span class="comment">// End element</span>
+ <span class="reserved">if</span> (va)
+ h += <span class="literal">'</'</span> + en + <span class="literal">'>'</span>;
+
+ <span class="reserved">return</span> h;
+ },
+
+ <span class="comment">/**
+ * Serializes the specified attribute as a XHTML string chunk.
+ *
+ * <span class="attrib">@param</span> {HTMLNode} n HTML node to get attribute from.
+ * <span class="attrib">@param</span> {TinyMCE_CleanupRule} r Cleanup rule to use in serialization.
+ * <span class="attrib">@param</span> {string} an Attribute name to lookfor and serialize.
+ * <span class="attrib">@return</span> XHTML chunk containing attribute data if it was found.
+ * <span class="attrib">@type</span> string
+ * <span class="attrib">@private</span>
+ */</span>
+ _serializeAttribute : <span class="reserved">function</span>(n, r, an) {
+ var av = <span class="literal">''</span>, t, os = <span class="reserved">this</span>.settings.on_save;
+
+ <span class="reserved">if</span> (os && (an.indexOf(<span class="literal">'mce_'</span>) == 0 || an.indexOf(<span class="literal">'_moz'</span>) == 0))
+ <span class="reserved">return</span> <span class="literal">''</span>;
+
+ <span class="reserved">if</span> (os && <span class="reserved">this</span>.mceAttribs[an])
+ av = <span class="reserved">this</span>._getAttrib(n, <span class="reserved">this</span>.mceAttribs[an]);
+
+ <span class="reserved">if</span> (av.length == 0)
+ av = <span class="reserved">this</span>._getAttrib(n, an);
+
+ <span class="reserved">if</span> (av.length == 0 && r.defaultAttribs && (t = r.defaultAttribs[an])) {
+ av = t;
+
+ <span class="reserved">if</span> (av == <span class="literal">"mce_empty"</span>)
+ <span class="reserved">return</span> <span class="literal">" "</span> + an + <span class="literal">'=""'</span>;
+ }
+
+ <span class="reserved">if</span> (r.forceAttribs && (t = r.forceAttribs[an]))
+ av = t;
+
+ <span class="reserved">if</span> (os && av.length != 0 && <span class="reserved">this</span>.settings.url_converter.length != 0 && /^(src|href|longdesc)$/.test(an))
+ av = eval(<span class="reserved">this</span>.settings.url_converter + <span class="literal">'(this, n, av)'</span>);
+
+ <span class="reserved">if</span> (av.length != 0 && r.validAttribValues && r.validAttribValues[an] && !r.validAttribValues[an].test(av))
+ <span class="reserved">return</span> <span class="literal">""</span>;
+
+ <span class="reserved">if</span> (av.length != 0 && av == <span class="literal">"{$uid}"</span>)
+ av = <span class="literal">"uid_"</span> + (<span class="reserved">this</span>.idCount++);
+
+ <span class="reserved">if</span> (av.length != 0)
+ <span class="reserved">return</span> <span class="literal">" "</span> + an + <span class="literal">"="</span> + <span class="literal">'"'</span> + <span class="reserved">this</span>.xmlEncode(av) + <span class="literal">'"'</span>;
+
+ <span class="reserved">return</span> <span class="literal">""</span>;
+ },
+
+ <span class="comment">/**
+ * Applies source formatting/indentation on the specified HTML string.
+ *
+ * <span class="attrib">@param</span> {string} h HTML string to apply formatting to.
+ * <span class="attrib">@return</span> Formatted HTML string.
+ * <span class="attrib">@type</span> string
+ */</span>
+ formatHTML : <span class="reserved">function</span>(h) {
+ var s = <span class="reserved">this</span>.settings, p = <span class="literal">''</span>, i = 0, li = 0, o = <span class="literal">''</span>, l;
+
+ h = h.replace(/\r/g, <span class="literal">''</span>); <span class="comment">// Windows sux, isn't carriage return a thing of the past :)</span>
+ h = <span class="literal">'\n'</span> + h;
+ h = h.replace(new RegExp(<span class="literal">'\\n\\s+'</span>, <span class="literal">'gi'</span>), <span class="literal">'\n'</span>); <span class="comment">// Remove previous formatting</span>
+ h = h.replace(<span class="reserved">this</span>.nlBeforeRe, <span class="literal">'\n<$1$2>'</span>);
+ h = h.replace(<span class="reserved">this</span>.nlAfterRe, <span class="literal">'<$1$2>\n'</span>);
+ h = h.replace(<span class="reserved">this</span>.nlBeforeAfterRe, <span class="literal">'\n<$1$2$3>\n'</span>);
+ h += <span class="literal">'\n'</span>;
+
+ <span class="comment">//tinyMCE.debug(h);</span>
+
+ <span class="reserved">while</span> ((i = h.indexOf(<span class="literal">'\n'</span>, i + 1)) != -1) {
+ <span class="reserved">if</span> ((l = h.substring(li + 1, i)).length != 0) {
+ <span class="reserved">if</span> (<span class="reserved">this</span>.ouRe.test(l) && p.length >= s.indent_levels)
+ p = p.substring(s.indent_levels);
+
+ o += p + l + <span class="literal">'\n'</span>;
+
+ <span class="reserved">if</span> (<span class="reserved">this</span>.inRe.test(l))
+ p += <span class="reserved">this</span>.inStr;
+ }
+
+ li = i;
+ }
+
+ <span class="comment">//tinyMCE.debug(h);</span>
+
+ <span class="reserved">return</span> o;
+ },
+
+ <span class="comment">/**
+ * XML Encodes the specified string based on configured entity encoding. The entity encoding modes
+ * are raw, numeric and named. Where raw is the fastest and named is default.
+ *
+ * <span class="attrib">@param</span> {string} s String to convert to XML.
+ * <span class="attrib">@return</span> Encoded XML string based on configured entity encoding.
+ * <span class="attrib">@type</span> string
+ */</span>
+ xmlEncode : <span class="reserved">function</span>(s) {
+ var i, l, e, o = <span class="literal">''</span>, c;
+
+ <span class="reserved">this</span>._setupEntities(); <span class="comment">// Will intialize lookup table</span>
+
+ switch (<span class="reserved">this</span>.settings.entity_encoding) {
+ case <span class="literal">"raw"</span>:
+ <span class="reserved">return</span> tinyMCE.xmlEncode(s);
+
+ case <span class="literal">"named"</span>:
+ <span class="reserved">for</span> (i=0, l=s.length; i<l; i++) {
+ c = s.charCodeAt(i);
+ e = <span class="reserved">this</span>.entities[c];
+
+ <span class="reserved">if</span> (e && e != <span class="literal">''</span>)
+ o += <span class="literal">'&'</span> + e + <span class="literal">';'</span>;
+ <span class="reserved">else</span>
+ o += String.fromCharCode(c);
+ }
+
+ <span class="reserved">return</span> o;
+
+ case <span class="literal">"numeric"</span>:
+ <span class="reserved">for</span> (i=0, l=s.length; i<l; i++) {
+ c = s.charCodeAt(i);
+
+ <span class="reserved">if</span> (c > 127 || c == 60 || c == 62 || c == 38 || c == 39 || c == 34)
+ o += <span class="literal">'&#'</span> + c + <span class="literal">";"</span>;
+ <span class="reserved">else</span>
+ o += String.fromCharCode(c);
+ }
+
+ <span class="reserved">return</span> o;
+ }
+
+ <span class="reserved">return</span> s;
+ },
+
+ <span class="comment">/**
+ * Splits the specified string and removed empty chunks.
+ *
+ * <span class="attrib">@param</span> {RegEx} re RegEx to split string by.
+ * <span class="attrib">@param</span> {string} s String value to split.
+ * <span class="attrib">@return</span> Array with parts from specified string.
+ * <span class="attrib">@type</span> string
+ */</span>
+ split : <span class="reserved">function</span>(re, s) {
+ var c = s.split(re);
+ var i, l, o = new Array();
+
+ <span class="reserved">for</span> (i=0, l=c.length; i<l; i++) {
+ <span class="reserved">if</span> (c[i] != <span class="literal">''</span>)
+ o[i] = c[i];
+ }
+
+ <span class="reserved">return</span> o;
+ },
+
+ <span class="comment">/**
+ * Removes contents that got added by TinyMCE to comments.
+ *
+ * <span class="attrib">@param</span> {string} s Comment string data to trim.
+ * <span class="attrib">@return</span> Cleaned string from TinyMCE specific content.
+ * <span class="attrib">@type</span> string
+ * <span class="attrib">@private</span>
+ */</span>
+ _trimComment : <span class="reserved">function</span>(s) {
+ <span class="comment">// Remove mce_src, mce_href</span>
+ s = s.replace(new RegExp(<span class="literal">'\\smce_src=\"[^\"]*\"'</span>, <span class="literal">'gi'</span>), <span class="literal">""</span>);
+ s = s.replace(new RegExp(<span class="literal">'\\smce_href=\"[^\"]*\"'</span>, <span class="literal">'gi'</span>), <span class="literal">""</span>);
+
+ <span class="reserved">return</span> s;
+ },
+
+ <span class="comment">/**
+ * Returns the value of the specified attribute name or default value if it wasn't found.
+ *
+ * <span class="attrib">@param</span> {HTMLElement} e HTML element to get attribute from.
+ * <span class="attrib">@param</span> {string} n Attribute name to get from element.
+ * <span class="attrib">@param</span> {string} d Default value to return if attribute wasn't found.
+ * <span class="attrib">@return</span> Attribute value based on specified attribute name.
+ * <span class="attrib">@type</span> string
+ * <span class="attrib">@private</span>
+ */</span>
+ _getAttrib : <span class="reserved">function</span>(e, n, d) {
+ <span class="reserved">if</span> (typeof(d) == <span class="literal">"undefined"</span>)
+ d = <span class="literal">""</span>;
+
+ <span class="reserved">if</span> (!e || e.nodeType != 1)
+ <span class="reserved">return</span> d;
+
+ var v = e.getAttribute(n, 0);
+
+ <span class="reserved">if</span> (n == <span class="literal">"class"</span> && !v)
+ v = e.className;
+
+ <span class="reserved">if</span> (<span class="reserved">this</span>.isMSIE && n == <span class="literal">"http-equiv"</span>)
+ v = e.httpEquiv;
+
+ <span class="reserved">if</span> (<span class="reserved">this</span>.isMSIE && e.nodeName == <span class="literal">"FORM"</span> && n == <span class="literal">"enctype"</span> && v == <span class="literal">"application/x-www-form-urlencoded"</span>)
+ v = <span class="literal">""</span>;
+
+ <span class="reserved">if</span> (<span class="reserved">this</span>.isMSIE && e.nodeName == <span class="literal">"INPUT"</span> && n == <span class="literal">"size"</span> && v == <span class="literal">"20"</span>)
+ v = <span class="literal">""</span>;
+
+ <span class="reserved">if</span> (<span class="reserved">this</span>.isMSIE && e.nodeName == <span class="literal">"INPUT"</span> && n == <span class="literal">"maxlength"</span> && v == <span class="literal">"2147483647"</span>)
+ v = <span class="literal">""</span>;
+
+ <span class="reserved">if</span> (n == <span class="literal">"style"</span> && !tinyMCE.isOpera)
+ v = e.style.cssText;
+
+ <span class="reserved">if</span> (n == <span class="literal">'style'</span>)
+ v = tinyMCE.serializeStyle(tinyMCE.parseStyle(v));
+
+ <span class="reserved">if</span> (<span class="reserved">this</span>.settings.on_save && n.indexOf(<span class="literal">'on'</span>) != -1 && <span class="reserved">this</span>.settings.on_save && v && v != <span class="literal">""</span>)
+ v = tinyMCE.cleanupEventStr(v);
+
+ <span class="reserved">return</span> (v && v != <span class="literal">""</span>) ? <span class="literal">''</span> + v : d;
+ },
+
+ <span class="comment">/**
+ * Internal URL converter callback function. This simply converts URLs based
+ * on some settings.
+ *
+ * <span class="attrib">@param</span> {TinyMCE_Cleanup} c Cleanup instance.
+ * <span class="attrib">@param</span> {HTMLNode} n HTML node that holds the URL.
+ * <span class="attrib">@param</span> {string} v URL value to convert.
+ * <span class="attrib">@return</span> Converted URL value.
+ * <span class="attrib">@type</span> string
+ * <span class="attrib">@private</span>
+ */</span>
+ _urlConverter : <span class="reserved">function</span>(c, n, v) {
+ <span class="reserved">if</span> (!c.settings.on_save)
+ <span class="reserved">return</span> tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings.base_href, v);
+ <span class="reserved">else</span> <span class="reserved">if</span> (tinyMCE.getParam(<span class="literal">'convert_urls'</span>))
+ <span class="reserved">return</span> eval(tinyMCE.settings.urlconverter_callback + <span class="literal">"(v, n, true);"</span>);
+
+ <span class="reserved">return</span> v;
+ },
+
+ <span class="comment">/**
+ * Converts a array into a regex.
+ *
+ * <span class="attrib">@param</span> {Array} a Array to convert into a regex.
+ * <span class="attrib">@param</span> {string} op RegEx options like, gi.
+ * <span class="attrib">@param</span> {string} be Before chunk, beginning of expression.
+ * <span class="attrib">@param</span> {string} af After chunk, end of expression.
+ * <span class="attrib">@return</span> RegEx instance based in input information.
+ * <span class="attrib">@type</span> string
+ * <span class="attrib">@private</span>
+ */</span>
+ _arrayToRe : <span class="reserved">function</span>(a, op, be, af) {
+ var i, r;
+
+ op = typeof(op) == <span class="literal">"undefined"</span> ? <span class="literal">"gi"</span> : op;
+ be = typeof(be) == <span class="literal">"undefined"</span> ? <span class="literal">"^("</span> : be;
+ af = typeof(af) == <span class="literal">"undefined"</span> ? <span class="literal">")$"</span> : af;
+
+ r = be;
+
+ <span class="reserved">for</span> (i=0; i<a.length; i++)
+ r += <span class="reserved">this</span>._wildcardToRe(a[i]) + (i != a.length-1 ? <span class="literal">"|"</span> : <span class="literal">""</span>);
+
+ r += af;
+
+ <span class="reserved">return</span> new RegExp(r, op);
+ },
+
+ <span class="comment">/**
+ * Converts a wildcard string into a regex.
+ *
+ * <span class="attrib">@param</span> {string} s Wildcard string to convert into RegEx.
+ * <span class="attrib">@return</span> RegEx string based on input.
+ * <span class="attrib">@type</span> string
+ * <span class="attrib">@private</span>
+ */</span>
+ _wildcardToRe : <span class="reserved">function</span>(s) {
+ s = s.replace(/\?/g, <span class="literal">'(\\S?)'</span>);
+ s = s.replace(/\+/g, <span class="literal">'(\\S+)'</span>);
+ s = s.replace(/\*/g, <span class="literal">'(\\S*)'</span>);
+
+ <span class="reserved">return</span> s;
+ },
+
+ <span class="comment">/**
+ * Sets up the entity name lookup table ones. This moves the entity lookup pasing time
+ * from init to first xmlEncode call.
+ *
+ * <span class="attrib">@private</span>
+ */</span>
+ _setupEntities : <span class="reserved">function</span>() {
+ var n, a, i, s = <span class="reserved">this</span>.settings;
+
+ <span class="comment">// Setup entities</span>
+ <span class="reserved">if</span> (!<span class="reserved">this</span>.entitiesDone) {
+ <span class="reserved">if</span> (s.entity_encoding == <span class="literal">"named"</span>) {
+ n = tinyMCE.clearArray(new Array());
+ a = <span class="reserved">this</span>.split(<span class="literal">','</span>, s.entities);
+ <span class="reserved">for</span> (i=0; i<a.length; i+=2)
+ n[a[i]] = a[i+1];
+
+ <span class="reserved">this</span>.entities = n;
+ }
+
+ <span class="reserved">this</span>.entitiesDone = true;
+ }
+ },
+
+ <span class="comment">/**
+ * Sets up the cleanup rules ones. This moves the cleanup rule pasing time
+ * from init to first cleanup call.
+ *
+ * <span class="attrib">@private</span>
+ */</span>
+ _setupRules : <span class="reserved">function</span>() {
+ var s = <span class="reserved">this</span>.settings;
+
+ <span class="comment">// Setup default rule</span>
+ <span class="reserved">if</span> (!<span class="reserved">this</span>.rulesDone) {
+ <span class="reserved">this</span>.addRuleStr(s.valid_elements);
+ <span class="reserved">this</span>.addRuleStr(s.extended_valid_elements);
+
+ <span class="reserved">this</span>.rulesDone = true;
+ }
+ },
+
+ <span class="comment">/**
+ * Checks if the specified node is a duplicate in other words has it been processed/serialized before.
+ *
+ * <span class="attrib">@param</span> {DOMNode} n DOM Node that is to be checked.
+ * <span class="attrib">@return</span> true/false if the node is a duplicate or not.
+ * <span class="attrib">@type</span> boolean
+ * <span class="attrib">@private</span>
+ */</span>
+ _isDuplicate : <span class="reserved">function</span>(n) {
+ var i;
+
+ <span class="reserved">if</span> (!<span class="reserved">this</span>.settings.fix_content_duplication)
+ <span class="reserved">return</span> false;
+
+ <span class="reserved">if</span> (tinyMCE.isMSIE && !tinyMCE.isOpera && n.nodeType == 1) {
+ <span class="comment">// Mark elements</span>
+ <span class="reserved">if</span> (n.mce_serialized == <span class="reserved">this</span>.serializationId)
+ <span class="reserved">return</span> true;
+
+ n.setAttribute(<span class="literal">'mce_serialized'</span>, <span class="reserved">this</span>.serializationId);
+ } <span class="reserved">else</span> {
+ <span class="comment">// Search lookup table for text nodes and comments</span>
+ <span class="reserved">for</span> (i=0; i<<span class="reserved">this</span>.serializedNodes.length; i++) {
+ <span class="reserved">if</span> (<span class="reserved">this</span>.serializedNodes[i] == n)
+ <span class="reserved">return</span> true;
+ }
+
+ <span class="reserved">this</span>.serializedNodes[<span class="reserved">this</span>.serializedNodes.length] = n;
+ }
+
+ <span class="reserved">return</span> false;
+ }
+};
+</pre>
+ <hr>
+
+
+
+<!-- ========== START OF NAVBAR ========== -->
+<a name="navbar_top"><!-- --></a>
+<table border="0" width="100%" cellpadding="1" cellspacing="0">
+<tr>
+<td colspan=2 bgcolor="#EEEEFF" class="NavBarCell1">
+<a name="navbar_top_firstrow"><!-- --></a>
+<table border="0" cellpadding="0" cellspacing="3">
+ <tr align="center" valign="top">
+
+
+ <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="overview-summary.html"><font class="NavBarFont1"><b>Overview</b></font></a> </td>
+ <td bgcolor="#FFFFFF" class="NavBarCell1Rev"> <font class="NavBarFont1Rev"><b>File</b></font> </td>
+
+
+ <td bgcolor="#FFFFFF" class="NavBarCell1"> <font class="NavBarFont1">Class</font> </td>
+ <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="overview-tree.html"><font class="NavBarFont1"><b>Tree</b></font></a> </td>
+ <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="index-all.html"--><font class="NavBarFont1"><b>Index</b></font></a> </td>
+ <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="help-doc.html"><font class="NavBarFont1"><b>Help</b></font></a> </td>
+ </tr>
+</table>
+</td>
+<td bgcolor="#EEEEFF" align="right" valign="top"><em>
+<b></b></em>
+</td>
+</tr>
+
+<tr>
+<td bgcolor="white" class="NavBarCell2"><font size="-2">
+ PREV
+ NEXT</font></td>
+<td bgcolor="white" class="NavBarCell2"><font size="-2">
+ <a href="index.html" target="_top"><b>FRAMES</b></a>
+ <a href="overview-summary.html" target="_top"><b>NO FRAMES</b></a>
+
+<script>
+ <!--
+ if(window==top) {
+ document.writeln('<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>');
+ }
+ //-->
+</script>
+<noscript>
+<a href="allclasses-noframe.html" target=""><b>All Classes</b></a>
+</noscript>
+</font></td>
+</tr>
+</table>
+<!-- =========== END OF NAVBAR =========== -->
+
+<hr>
+<font size="-1">
+
+</font>
+<div class="jsdoc_ctime">Documentation generated by <a href="http://jsdoc.sourceforge.net/" target="_parent">JSDoc</a> on Fri Apr 14 21:59:23 2006</div>
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/tinymce_api/overview-summary-TinyMCE_Control.class.js.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/tinymce_api/overview-summary-TinyMCE_Control.class.js.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/tinymce_api/overview-summary-TinyMCE_Control.class.js.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,1710 +0,0 @@
-<!doctype html public "-//W3C//DTD HTML 4.0 Frameset//EN""http://www.w3.org/TR/REC-html40/frameset.dtd">
-<html>
-<head>
-<title>
- Overview
-</title>
-<link rel ="stylesheet" type="text/css" href="stylesheet.css" title="Style">
-<script>
-function asd() {
-
- parent.document.title="TinyMCE_Control.class.js Overview";
-
-}
-</script>
-</head>
-<body bgcolor="white" onload="asd();">
-
-<!-- ========== START OF NAVBAR ========== -->
-<a name="navbar_top"><!-- --></a>
-<table border="0" width="100%" cellpadding="1" cellspacing="0">
-<tr>
-<td colspan=2 bgcolor="#EEEEFF" class="NavBarCell1">
-<a name="navbar_top_firstrow"><!-- --></a>
-<table border="0" cellpadding="0" cellspacing="3">
- <tr align="center" valign="top">
-
-
- <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="overview-summary.html"><font class="NavBarFont1"><b>Overview</b></font></a> </td>
- <td bgcolor="#FFFFFF" class="NavBarCell1Rev"> <font class="NavBarFont1Rev"><b>File</b></font> </td>
-
-
- <td bgcolor="#FFFFFF" class="NavBarCell1"> <font class="NavBarFont1">Class</font> </td>
- <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="overview-tree.html"><font class="NavBarFont1"><b>Tree</b></font></a> </td>
- <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="index-all.html"--><font class="NavBarFont1"><b>Index</b></font></a> </td>
- <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="help-doc.html"><font class="NavBarFont1"><b>Help</b></font></a> </td>
- </tr>
-</table>
-</td>
-<td bgcolor="#EEEEFF" align="right" valign="top">
-<em>
-<b></b></em>
-</td>
-</tr>
-
-<tr>
-<td bgcolor="white" class="NavBarCell2"><font size="-2">
- PREV
- NEXT</font></td>
-<td bgcolor="white" class="NavBarCell2"><font size="-2">
- <a href="index.html" target="_top"><b>FRAMES</b></a>
- <a href="overview-summary.html" target="_top"><b>NO FRAMES</b></a>
-
-<script>
- <!--
- if(window==top) {
- document.writeln('<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>');
- }
- //-->
-</script>
-<noscript>
-<a href="allclasses-noframe.html" target=""><b>All Classes</b></a>
-</noscript>
-</font></td>
-</tr>
-</table>
-<!-- =========== END OF NAVBAR =========== -->
-
-<hr>
-<center>
-
- <h2>TinyMCE_Control.class.js</h2>
-
-</center>
-
-
-
-
-<h4>Summary</h4>
-<p>
-
- No overview generated for 'TinyMCE_Control.class.js'<BR/><BR/>
-
-</p>
-
-<hr>
-
-
- <table border="1" cellpadding="3" cellspacing="0" width="100%">
- <tr bgcolor="#CCCCFF" class="TableHeadingColor">
- <td colspan=2><font size="+2">
-
- <b>Class Summary</b>
-
- </font></td>
- </tr>
-
- <tr bgcolor="white" class="TableRowColor">
- <td width="15%"><b><a href="TinyMCE_Control.html">TinyMCE_Control</a></b></td>
- <td> </td>
- </tr>
-
- </table>
- <hr/>
-
-
-<!-- ========== METHOD SUMMARY =========== -->
-
-<!-- ========== END METHOD SUMMARY =========== -->
-
-
- <pre class="sourceview"><span class="comment">/**
- * $RCSfile: overview-summary-TinyMCE_Control.class.js.html,v $
- * $Revision: 1.42 $
- * $Date: 2006/04/14 20:00:28 $
- *
- * <span class="attrib">@author</span> Moxiecode
- * <span class="attrib">@copyright</span> Copyright © 2004-2006, Moxiecode Systems AB, All rights reserved.
- */</span>
-
-<span class="comment">/**
- * This is the TinyMCE editor control instance class. A instance of this class will is made for each
- * converted text area.
- *
- * <span class="attrib">@constructor</span>
- * <span class="attrib">@param</span> {Array} settings Name/Value array of instance specific configuration settings.
- */</span>
-<span class="reserved">function</span> TinyMCE_Control(settings) {
- var t, i, to, fu, p, x, fn, fu, pn, s = settings;
-
- <span class="reserved">this</span>.undoRedoLevel = true;
- <span class="reserved">this</span>.isTinyMCE_Control = true;
-
- <span class="comment">// Default settings</span>
- <span class="reserved">this</span>.settings = s;
- <span class="reserved">this</span>.settings[<span class="literal">'theme'</span>] = tinyMCE.getParam(<span class="literal">"theme"</span>, <span class="literal">"default"</span>);
- <span class="reserved">this</span>.settings[<span class="literal">'width'</span>] = tinyMCE.getParam(<span class="literal">"width"</span>, -1);
- <span class="reserved">this</span>.settings[<span class="literal">'height'</span>] = tinyMCE.getParam(<span class="literal">"height"</span>, -1);
- <span class="reserved">this</span>.selection = new TinyMCE_Selection(<span class="reserved">this</span>);
- <span class="reserved">this</span>.undoRedo = new TinyMCE_UndoRedo(<span class="reserved">this</span>);
- <span class="reserved">this</span>.cleanup = new TinyMCE_Cleanup();
- <span class="reserved">this</span>.shortcuts = new Array();
- <span class="reserved">this</span>.hasMouseMoved = false;
-
- <span class="reserved">this</span>.cleanup.init({
- valid_elements : s.valid_elements,
- extended_valid_elements : s.extended_valid_elements,
- entities : s.entities,
- entity_encoding : s.entity_encoding,
- debug : s.cleanup_debug,
- url_converter : <span class="literal">'TinyMCE_Cleanup.prototype._urlConverter'</span>,
- indent : s.apply_source_formatting,
- invalid_elements : s.invalid_elements,
- verify_html : s.verify_html,
- fix_content_duplication : s.fix_content_duplication
- });
-
- <span class="comment">// Wrap old theme</span>
- t = <span class="reserved">this</span>.settings[<span class="literal">'theme'</span>];
- <span class="reserved">if</span> (!tinyMCE.hasTheme(t)) {
- fn = tinyMCE.callbacks;
- to = {};
-
- <span class="reserved">for</span> (i=0; i<fn.length; i++) {
- <span class="reserved">if</span> ((fu = window[<span class="literal">'TinyMCE_'</span> + t + <span class="literal">"_"</span> + fn[i]]))
- to[fn[i]] = fu;
- }
-
- tinyMCE.addTheme(t, to);
- }
-
- <span class="comment">// Wrap old plugins</span>
- <span class="reserved">this</span>.plugins = new Array();
- p = tinyMCE.getParam(<span class="literal">'plugins'</span>, <span class="literal">''</span>, true, <span class="literal">','</span>);
- <span class="reserved">if</span> (p.length > 0) {
- <span class="reserved">for</span> (i=0; i<p.length; i++) {
- pn = p[i];
-
- <span class="reserved">if</span> (pn.charAt(0) == <span class="literal">'-'</span>)
- pn = pn.substring(1);
-
- <span class="reserved">if</span> (!tinyMCE.hasPlugin(pn)) {
- fn = tinyMCE.callbacks;
- to = {};
-
- <span class="reserved">for</span> (x=0; x<fn.length; x++) {
- <span class="reserved">if</span> ((fu = window[<span class="literal">'TinyMCE_'</span> + pn + <span class="literal">"_"</span> + fn[x]]))
- to[fn[x]] = fu;
- }
-
- tinyMCE.addPlugin(pn, to);
- }
-
- <span class="reserved">this</span>.plugins[<span class="reserved">this</span>.plugins.length] = pn;
- }
- }
-};
-
-TinyMCE_Control.<span class="reserved">prototype</span> = {
- <span class="comment">/**
- * Returns true/false if the instance has the current plugin available.
- *
- * <span class="attrib">@param</span> {string} n Plugin name to check for.
- * <span class="attrib">@return</span> true/false if the instance has the current plugin available.
- * <span class="attrib">@type</span> boolean
- */</span>
- hasPlugin : <span class="reserved">function</span>(n) {
- var i;
-
- <span class="reserved">for</span> (i=0; i<<span class="reserved">this</span>.plugins.length; i++) {
- <span class="reserved">if</span> (<span class="reserved">this</span>.plugins[i] == n)
- <span class="reserved">return</span> true;
- }
-
- <span class="reserved">return</span> false;
- },
-
- <span class="comment">/**
- * Adds a plugin to the editor instance. This will also add it globaly.
- *
- * <span class="attrib">@param</span> {string} n Plugin name to check for.
- * <span class="attrib">@param</span> {TinyMCE_Plugin} n TinyMCE plugin instance.
- */</span>
- addPlugin : <span class="reserved">function</span>(n, p) {
- <span class="reserved">if</span> (!<span class="reserved">this</span>.hasPlugin(n)) {
- tinyMCE.addPlugin(n, p);
- <span class="reserved">this</span>.plugins[<span class="reserved">this</span>.plugins.length] = n;
- }
- },
-
- <span class="comment">/**
- * Repaints the editarea in Gecko browsers. This method removes ghost resize handlers
- * and other trailing graphics.
- */</span>
- repaint : <span class="reserved">function</span>() {
- <span class="reserved">if</span> (tinyMCE.isMSIE && !tinyMCE.isOpera)
- <span class="reserved">return</span>;
-
- try {
- var s = <span class="reserved">this</span>.selection;
- var b = s.getBookmark(true);
- <span class="reserved">this</span>.getBody().style.display = <span class="literal">'none'</span>;
- <span class="reserved">this</span>.getDoc().execCommand(<span class="literal">'selectall'</span>, false, null);
- <span class="reserved">this</span>.getSel().collapseToStart();
- <span class="reserved">this</span>.getBody().style.display = <span class="literal">'block'</span>;
- s.moveToBookmark(b);
- } catch (ex) {
- <span class="comment">// Ignore</span>
- }
- },
-
- <span class="comment">/**
- * Switches the global TinyMCE settings to the current instance settings. This method is
- * used to handle multiple configurations.
- */</span>
- switchSettings : <span class="reserved">function</span>() {
- <span class="reserved">if</span> (tinyMCE.configs.length > 1 && tinyMCE.currentConfig != <span class="reserved">this</span>.settings[<span class="literal">'index'</span>]) {
- tinyMCE.settings = <span class="reserved">this</span>.settings;
- tinyMCE.currentConfig = <span class="reserved">this</span>.settings[<span class="literal">'index'</span>];
- }
- },
-
- <span class="comment">/**
- * Returns the body element of a editor instance.
- *
- * <span class="attrib">@return</span> Body element of a editor instance.
- * <span class="attrib">@type</span> HTMLElement
- */</span>
- getBody : <span class="reserved">function</span>() {
- <span class="reserved">return</span> <span class="reserved">this</span>.getDoc().body;
- },
-
- <span class="comment">/**
- * Returns the DOM document of a editor instance.
- *
- * <span class="attrib">@return</span> DOM document of a editor instance.
- * <span class="attrib">@type</span> DOMDocument
- */</span>
- getDoc : <span class="reserved">function</span>() {
- <span class="reserved">return</span> <span class="reserved">this</span>.contentWindow.document;
- },
-
- <span class="comment">/**
- * Returns the window of a editor instance.
- *
- * <span class="attrib">@return</span> Window of a editor instance.
- * <span class="attrib">@type</span> Window
- */</span>
- getWin : <span class="reserved">function</span>() {
- <span class="reserved">return</span> <span class="reserved">this</span>.contentWindow;
- },
-
- <span class="comment">/**
- * Adds a keyboard shortcut to a specific command. These shortcuts can for example be added
- * at the initInstance callback of a plugin. The shortcut description can be a language variable name
- * or a string describing the function. If you don't specify a command, the shortcut will simply be a blocker
- * shortcut. This enables you to remove built in shortcuts or remove theme specific shortcuts from a plugin.<br />
- * Example shortcut inst.addShortcut('ctrl,alt', 'k', 'mceSomeCommand', false, 'somevalue');
- * Example blocker inst.addShortcut('ctrl,alt', 'k');
- *
- * <span class="attrib">@param</span> {string} m List of shortcut modifiers keys, for example "ctrl,alt".
- * <span class="attrib">@param</span> {Object} k Shortcut key char for example "s" or a keycode value "13".
- * <span class="attrib">@param</span> {string} d Optional Shortcut description, this will be presented in the about dialog.
- * <span class="attrib">@param</span> {string} cmd Optional Command name to execute, for example mceLink or Bold.
- * <span class="attrib">@param</span> {boolean} ui Optional True/false state if a UI (dialog) should be presented or not.
- * <span class="attrib">@param</span> {Object} va Optional command value, this can be anything.
- * <span class="attrib">@return</span> true/false if the shortcut was added or not
- * <span class="attrib">@type</span> boolean
- */</span>
- addShortcut : <span class="reserved">function</span>(m, k, d, cmd, ui, va) {
- var n = typeof(k) == <span class="literal">"number"</span>, ie = tinyMCE.isMSIE, c, sc, i;
- var scl = <span class="reserved">this</span>.shortcuts;
-
- <span class="reserved">if</span> (!tinyMCE.getParam(<span class="literal">'custom_shortcuts'</span>))
- <span class="reserved">return</span> false;
-
- m = m.toLowerCase();
- k = ie && !n ? k.toUpperCase() : k;
- c = n ? null : k.charCodeAt(0);
- d = d && d.indexOf(<span class="literal">'lang_'</span>) == 0 ? tinyMCE.getLang(d) : d;
-
- sc = {
- alt : m.indexOf(<span class="literal">'alt'</span>) != -1,
- ctrl : m.indexOf(<span class="literal">'ctrl'</span>) != -1,
- shift : m.indexOf(<span class="literal">'shift'</span>) != -1,
- charCode : c,
- keyCode : n ? k : (ie ? c : null),
- desc : d,
- cmd : cmd,
- ui : ui,
- val : va
- };
-
- <span class="reserved">for</span> (i=0; i<scl.length; i++) {
- <span class="reserved">if</span> (sc.alt == scl[i].alt && sc.ctrl == scl[i].ctrl && sc.shift == scl[i].shift
- && sc.charCode == scl[i].charCode && sc.keyCode == scl[i].keyCode) {
- <span class="reserved">return</span> false;
- }
- }
-
- scl[scl.length] = sc;
-
- <span class="reserved">return</span> true;
- },
-
- <span class="comment">/**
- * Executes shortcuts based on the event information.
- *
- * <span class="attrib">@param</span> {DOMEvent} e Keyboard event to handle.
- * <span class="attrib">@return</span> true/false if the shortcut was found and executed or not.
- * <span class="attrib">@type</span> boolean
- */</span>
- handleShortcut : <span class="reserved">function</span>(e) {
- var i, s = <span class="reserved">this</span>.shortcuts, o;
-
- <span class="reserved">for</span> (i=0; i<s.length; i++) {
- o = s[i];
- <span class="reserved">if</span> (o.alt == e.altKey && o.ctrl == e.ctrlKey && (o.keyCode == e.keyCode || o.charCode == e.charCode)) {
- <span class="reserved">if</span> (o.cmd && (e.type == <span class="literal">"keydown"</span> || (e.type == <span class="literal">"keypress"</span> && !tinyMCE.isOpera)))
- tinyMCE.execCommand(o.cmd, o.ui, o.val);
-
- tinyMCE.cancelEvent(e);
- <span class="reserved">return</span> true;
- }
- }
-
- <span class="reserved">return</span> false;
- },
-
- <span class="comment">/**
- * Auto resets the design mode of the document if it gets lost.
- * This is a Gecko specific function since it's a workaround for a bug where Gecko browsers
- * loose the designMode state if the editor is hidden and shown in a tab or div.
- */</span>
- autoResetDesignMode : <span class="reserved">function</span>() {
- <span class="comment">// Add fix for tab/style.display none/block problems in Gecko</span>
- <span class="reserved">if</span> (!tinyMCE.isMSIE && <span class="reserved">this</span>.isHidden() && tinyMCE.getParam(<span class="literal">'auto_reset_designmode'</span>))
- eval(<span class="literal">'try { this.getDoc().designMode = "On"; } catch(e) {}'</span>);
- },
-
- <span class="comment">/**
- * Returns if the instance is hidden or not. This is a Gecko specific function
- * other browsers will always return false. This function is used to workaround the lost
- * designMode bug in Gecko browsers.
- *
- * <span class="attrib">@return</span> Returns if the instance is hidden or not.
- * <span class="attrib">@type</span> boolean
- */</span>
- isHidden : <span class="reserved">function</span>() {
- <span class="reserved">if</span> (tinyMCE.isMSIE)
- <span class="reserved">return</span> false;
-
- var s = <span class="reserved">this</span>.getSel();
-
- <span class="comment">// Weird, wheres that cursor selection?</span>
- <span class="reserved">return</span> (!s || !s.rangeCount || s.rangeCount == 0);
- },
-
- <span class="comment">/**
- * Returns true/false if the editor instance is dirty or not. In other words if it has been modified
- * or not.
- *
- * <span class="attrib">@return</span> Editor instance dirty state.
- * <span class="attrib">@type</span> boolean
- */</span>
- isDirty : <span class="reserved">function</span>() {
- <span class="comment">// Is content modified and not in a submit procedure</span>
- <span class="reserved">return</span> <span class="reserved">this</span>.startContent != tinyMCE.trim(<span class="reserved">this</span>.getBody().innerHTML) && !tinyMCE.isNotDirty;
- },
-
- <span class="comment">/**
- * ..
- *
- * <span class="attrib">@private</span>
- */</span>
- _mergeElements : <span class="reserved">function</span>(scmd, pa, ch, override) {
- <span class="reserved">if</span> (scmd == <span class="literal">"removeformat"</span>) {
- pa.className = <span class="literal">""</span>;
- pa.style.cssText = <span class="literal">""</span>;
- ch.className = <span class="literal">""</span>;
- ch.style.cssText = <span class="literal">""</span>;
- <span class="reserved">return</span>;
- }
-
- var st = tinyMCE.parseStyle(tinyMCE.getAttrib(pa, <span class="literal">"style"</span>));
- var stc = tinyMCE.parseStyle(tinyMCE.getAttrib(ch, <span class="literal">"style"</span>));
- var className = tinyMCE.getAttrib(pa, <span class="literal">"class"</span>);
-
- className += <span class="literal">" "</span> + tinyMCE.getAttrib(ch, <span class="literal">"class"</span>);
-
- <span class="reserved">if</span> (override) {
- <span class="reserved">for</span> (var n in st) {
- <span class="reserved">if</span> (typeof(st[n]) == <span class="literal">'function'</span>)
- continue;
-
- stc[n] = st[n];
- }
- } <span class="reserved">else</span> {
- <span class="reserved">for</span> (var n in stc) {
- <span class="reserved">if</span> (typeof(stc[n]) == <span class="literal">'function'</span>)
- continue;
-
- st[n] = stc[n];
- }
- }
-
- tinyMCE.setAttrib(pa, <span class="literal">"style"</span>, tinyMCE.serializeStyle(st));
- tinyMCE.setAttrib(pa, <span class="literal">"class"</span>, tinyMCE.trim(className));
- ch.className = <span class="literal">""</span>;
- ch.style.cssText = <span class="literal">""</span>;
- ch.removeAttribute(<span class="literal">"class"</span>);
- ch.removeAttribute(<span class="literal">"style"</span>);
- },
-
- <span class="comment">/**
- * Sets the useCSS mode in Gecko browsers. This will also remove the build in
- * inline table editing controls since they are buggy when it comes to col/rowspans.
- *
- * <span class="attrib">@param</span> {boolean} b UseCSS state true/false.
- * <span class="attrib">@private</span>
- */</span>
- _setUseCSS : <span class="reserved">function</span>(b) {
- var d = <span class="reserved">this</span>.getDoc();
-
- try {d.execCommand(<span class="literal">"useCSS"</span>, false, !b);} catch (ex) {}
- try {d.execCommand(<span class="literal">"styleWithCSS"</span>, false, b);} catch (ex) {}
-
- <span class="reserved">if</span> (!tinyMCE.getParam(<span class="literal">"table_inline_editing"</span>))
- try {d.execCommand(<span class="literal">'enableInlineTableEditing'</span>, false, <span class="literal">"false"</span>);} catch (ex) {}
-
- <span class="reserved">if</span> (!tinyMCE.getParam(<span class="literal">"object_resizing"</span>))
- try {d.execCommand(<span class="literal">'enableObjectResizing'</span>, false, <span class="literal">"false"</span>);} catch (ex) {}
- },
-
- <span class="comment">/**
- * Executes a command on the current instance. These commands can be TinyMCE internal commands prefixed with "mce" or
- * they can be build in browser commands such as "Bold". A compleate list of browser commands is available on MSDN or Mozilla.org.
- * This function will dispatch the execCommand function on each plugin, theme or the execcommand_callback option if none of these
- * return true it will handle the command as a internal browser command.
- *
- * <span class="attrib">@param</span> {string} command Command name to execute, for example mceLink or Bold.
- * <span class="attrib">@param</span> {boolean} user_interface True/false state if a UI (dialog) should be presented or not.
- * <span class="attrib">@param</span> {mixed} value Optional command value, this can be anything.
- */</span>
- execCommand : <span class="reserved">function</span>(command, user_interface, value) {
- var doc = <span class="reserved">this</span>.getDoc();
- var win = <span class="reserved">this</span>.getWin();
- var focusElm = <span class="reserved">this</span>.getFocusElement();
-
- <span class="comment">// Is non udno specific command</span>
- <span class="reserved">if</span> (!new RegExp(<span class="literal">'mceStartTyping|mceEndTyping|mceBeginUndoLevel|mceEndUndoLevel|mceAddUndoLevel'</span>, <span class="literal">'gi'</span>).test(command))
- <span class="reserved">this</span>.undoBookmark = null;
-
- <span class="reserved">if</span> (<span class="reserved">this</span>.lastSafariSelection && !new RegExp(<span class="literal">'mceStartTyping|mceEndTyping|mceBeginUndoLevel|mceEndUndoLevel|mceAddUndoLevel'</span>, <span class="literal">'gi'</span>).test(command)) {
- <span class="reserved">this</span>.selection.moveToBookmark(<span class="reserved">this</span>.lastSafariSelection);
- tinyMCE.selectedElement = <span class="reserved">this</span>.lastSafariSelectedElement;
- }
-
- <span class="comment">// Mozilla issue</span>
- <span class="reserved">if</span> (!tinyMCE.isMSIE && !<span class="reserved">this</span>.useCSS) {
- <span class="reserved">this</span>._setUseCSS(false);
- <span class="reserved">this</span>.useCSS = true;
- }
-
- <span class="comment">//debug("command: " + command + ", user_interface: " + user_interface + ", value: " + value);</span>
- <span class="reserved">this</span>.contentDocument = doc; <span class="comment">// <-- Strange, unless this is applied Mozilla 1.3 breaks</span>
-
- <span class="reserved">if</span> (tinyMCE.execCommandCallback(<span class="reserved">this</span>, <span class="literal">'execcommand_callback'</span>, <span class="literal">'execCommand'</span>, <span class="reserved">this</span>.editorId, <span class="reserved">this</span>.getBody(), command, user_interface, value))
- <span class="reserved">return</span>;
-
- <span class="comment">// Fix align on images</span>
- <span class="reserved">if</span> (focusElm && focusElm.nodeName == <span class="literal">"IMG"</span>) {
- var align = focusElm.getAttribute(<span class="literal">'align'</span>);
- var img = command == <span class="literal">"JustifyCenter"</span> ? focusElm.cloneNode(false) : focusElm;
-
- switch (command) {
- case <span class="literal">"JustifyLeft"</span>:
- <span class="reserved">if</span> (align == <span class="literal">'left'</span>)
- img.removeAttribute(<span class="literal">'align'</span>);
- <span class="reserved">else</span>
- img.setAttribute(<span class="literal">'align'</span>, <span class="literal">'left'</span>);
-
- <span class="comment">// Remove the div</span>
- var div = focusElm.parentNode;
- <span class="reserved">if</span> (div && div.nodeName == <span class="literal">"DIV"</span> && div.childNodes.length == 1 && div.parentNode)
- div.parentNode.replaceChild(img, div);
-
- <span class="reserved">this</span>.selection.selectNode(img);
- <span class="reserved">this</span>.repaint();
- tinyMCE.triggerNodeChange();
- <span class="reserved">return</span>;
-
- case <span class="literal">"JustifyCenter"</span>:
- img.removeAttribute(<span class="literal">'align'</span>);
-
- <span class="comment">// Is centered</span>
- var div = tinyMCE.getParentElement(focusElm, <span class="literal">"div"</span>);
- <span class="reserved">if</span> (div && div.style.textAlign == <span class="literal">"center"</span>) {
- <span class="comment">// Remove div</span>
- <span class="reserved">if</span> (div.nodeName == <span class="literal">"DIV"</span> && div.childNodes.length == 1 && div.parentNode)
- div.parentNode.replaceChild(img, div);
- } <span class="reserved">else</span> {
- <span class="comment">// Add div</span>
- var div = <span class="reserved">this</span>.getDoc().createElement(<span class="literal">"div"</span>);
- div.style.textAlign = <span class="literal">'center'</span>;
- div.appendChild(img);
- focusElm.parentNode.replaceChild(div, focusElm);
- }
-
- <span class="reserved">this</span>.selection.selectNode(img);
- <span class="reserved">this</span>.repaint();
- tinyMCE.triggerNodeChange();
- <span class="reserved">return</span>;
-
- case <span class="literal">"JustifyRight"</span>:
- <span class="reserved">if</span> (align == <span class="literal">'right'</span>)
- img.removeAttribute(<span class="literal">'align'</span>);
- <span class="reserved">else</span>
- img.setAttribute(<span class="literal">'align'</span>, <span class="literal">'right'</span>);
-
- <span class="comment">// Remove the div</span>
- var div = focusElm.parentNode;
- <span class="reserved">if</span> (div && div.nodeName == <span class="literal">"DIV"</span> && div.childNodes.length == 1 && div.parentNode)
- div.parentNode.replaceChild(img, div);
-
- <span class="reserved">this</span>.selection.selectNode(img);
- <span class="reserved">this</span>.repaint();
- tinyMCE.triggerNodeChange();
- <span class="reserved">return</span>;
- }
- }
-
- <span class="reserved">if</span> (tinyMCE.settings[<span class="literal">'force_br_newlines'</span>]) {
- var alignValue = <span class="literal">""</span>;
-
- <span class="reserved">if</span> (doc.selection.type != <span class="literal">"Control"</span>) {
- switch (command) {
- case <span class="literal">"JustifyLeft"</span>:
- alignValue = <span class="literal">"left"</span>;
- break;
-
- case <span class="literal">"JustifyCenter"</span>:
- alignValue = <span class="literal">"center"</span>;
- break;
-
- case <span class="literal">"JustifyFull"</span>:
- alignValue = <span class="literal">"justify"</span>;
- break;
-
- case <span class="literal">"JustifyRight"</span>:
- alignValue = <span class="literal">"right"</span>;
- break;
- }
-
- <span class="reserved">if</span> (alignValue != <span class="literal">""</span>) {
- var rng = doc.selection.createRange();
-
- <span class="reserved">if</span> ((divElm = tinyMCE.getParentElement(rng.parentElement(), <span class="literal">"div"</span>)) != null)
- divElm.setAttribute(<span class="literal">"align"</span>, alignValue);
- <span class="reserved">else</span> <span class="reserved">if</span> (rng.pasteHTML && rng.htmlText.length > 0)
- rng.pasteHTML(<span class="literal">'<div align="'</span> + alignValue + <span class="literal">'">'</span> + rng.htmlText + <span class="literal">"</div>"</span>);
-
- tinyMCE.triggerNodeChange();
- <span class="reserved">return</span>;
- }
- }
- }
-
- switch (command) {
- case <span class="literal">"mceRepaint"</span>:
- <span class="reserved">this</span>.repaint();
- <span class="reserved">return</span> true;
-
- case <span class="literal">"InsertUnorderedList"</span>:
- case <span class="literal">"InsertOrderedList"</span>:
- var tag = (command == <span class="literal">"InsertUnorderedList"</span>) ? <span class="literal">"ul"</span> : <span class="literal">"ol"</span>;
-
- <span class="reserved">if</span> (tinyMCE.isSafari)
- <span class="reserved">this</span>.execCommand(<span class="literal">"mceInsertContent"</span>, false, <span class="literal">"<"</span> + tag + <span class="literal">"><li> </li><"</span> + tag + <span class="literal">">"</span>);
- <span class="reserved">else</span>
- <span class="reserved">this</span>.getDoc().execCommand(command, user_interface, value);
-
- tinyMCE.triggerNodeChange();
- break;
-
- case <span class="literal">"Strikethrough"</span>:
- <span class="reserved">if</span> (tinyMCE.isSafari)
- <span class="reserved">this</span>.execCommand(<span class="literal">"mceInsertContent"</span>, false, <span class="literal">"<strike>"</span> + <span class="reserved">this</span>.selection.getSelectedHTML() + <span class="literal">"</strike>"</span>);
- <span class="reserved">else</span>
- <span class="reserved">this</span>.getDoc().execCommand(command, user_interface, value);
-
- tinyMCE.triggerNodeChange();
- break;
-
- case <span class="literal">"mceSelectNode"</span>:
- <span class="reserved">this</span>.selection.selectNode(value);
- tinyMCE.triggerNodeChange();
- tinyMCE.selectedNode = value;
- break;
-
- case <span class="literal">"FormatBlock"</span>:
- <span class="reserved">if</span> (value == null || value == <span class="literal">""</span>) {
- var elm = tinyMCE.getParentElement(<span class="reserved">this</span>.getFocusElement(), <span class="literal">"p,div,h1,h2,h3,h4,h5,h6,pre,address,blockquote,dt,dl,dd,samp"</span>);
-
- <span class="reserved">if</span> (elm)
- <span class="reserved">this</span>.execCommand(<span class="literal">"mceRemoveNode"</span>, false, elm);
- } <span class="reserved">else</span> {
- <span class="reserved">if</span> (tinyMCE.isGecko && new RegExp(<span class="literal">'<(div|blockquote|code|dt|dd|dl|samp)>'</span>, <span class="literal">'gi'</span>).test(value))
- value = value.replace(/[^a-z]/gi, <span class="literal">''</span>);
-
- <span class="reserved">if</span> (tinyMCE.isMSIE && new RegExp(<span class="literal">'blockquote|code|samp'</span>, <span class="literal">'gi'</span>).test(value)) {
- var b = <span class="reserved">this</span>.selection.getBookmark();
- <span class="reserved">this</span>.getDoc().execCommand(<span class="literal">"FormatBlock"</span>, false, <span class="literal">'<p>'</span>);
- tinyMCE.renameElement(tinyMCE.getParentBlockElement(<span class="reserved">this</span>.getFocusElement()), value);
- <span class="reserved">this</span>.selection.moveToBookmark(b);
- } <span class="reserved">else</span>
- <span class="reserved">this</span>.getDoc().execCommand(<span class="literal">"FormatBlock"</span>, false, value);
- }
-
- tinyMCE.triggerNodeChange();
-
- break;
-
- case <span class="literal">"mceRemoveNode"</span>:
- <span class="reserved">if</span> (!value)
- value = tinyMCE.getParentElement(<span class="reserved">this</span>.getFocusElement());
-
- <span class="reserved">if</span> (tinyMCE.isMSIE) {
- value.outerHTML = value.innerHTML;
- } <span class="reserved">else</span> {
- var rng = value.ownerDocument.createRange();
- rng.setStartBefore(value);
- rng.setEndAfter(value);
- rng.deleteContents();
- rng.insertNode(rng.createContextualFragment(value.innerHTML));
- }
-
- tinyMCE.triggerNodeChange();
-
- break;
-
- case <span class="literal">"mceSelectNodeDepth"</span>:
- var parentNode = <span class="reserved">this</span>.getFocusElement();
- <span class="reserved">for</span> (var i=0; parentNode; i++) {
- <span class="reserved">if</span> (parentNode.nodeName.toLowerCase() == <span class="literal">"body"</span>)
- break;
-
- <span class="reserved">if</span> (parentNode.nodeName.toLowerCase() == <span class="literal">"#text"</span>) {
- i--;
- parentNode = parentNode.parentNode;
- continue;
- }
-
- <span class="reserved">if</span> (i == value) {
- <span class="reserved">this</span>.selection.selectNode(parentNode, false);
- tinyMCE.triggerNodeChange();
- tinyMCE.selectedNode = parentNode;
- <span class="reserved">return</span>;
- }
-
- parentNode = parentNode.parentNode;
- }
-
- break;
-
- case <span class="literal">"SetStyleInfo"</span>:
- var rng = <span class="reserved">this</span>.getRng();
- var sel = <span class="reserved">this</span>.getSel();
- var scmd = value[<span class="literal">'command'</span>];
- var sname = value[<span class="literal">'name'</span>];
- var svalue = value[<span class="literal">'value'</span>] == null ? <span class="literal">''</span> : value[<span class="literal">'value'</span>];
- <span class="comment">//var svalue = value['value'] == null ? '' : value['value'];</span>
- var wrapper = value[<span class="literal">'wrapper'</span>] ? value[<span class="literal">'wrapper'</span>] : <span class="literal">"span"</span>;
- var parentElm = null;
- var invalidRe = new RegExp(<span class="literal">"^BODY|HTML$"</span>, <span class="literal">"g"</span>);
- var invalidParentsRe = tinyMCE.settings[<span class="literal">'merge_styles_invalid_parents'</span>] != <span class="literal">''</span> ? new RegExp(tinyMCE.settings[<span class="literal">'merge_styles_invalid_parents'</span>], <span class="literal">"gi"</span>) : null;
-
- <span class="comment">// Whole element selected check</span>
- <span class="reserved">if</span> (tinyMCE.isMSIE) {
- <span class="comment">// Control range</span>
- <span class="reserved">if</span> (rng.item)
- parentElm = rng.item(0);
- <span class="reserved">else</span> {
- var pelm = rng.parentElement();
- var prng = doc.selection.createRange();
- prng.moveToElementText(pelm);
-
- <span class="reserved">if</span> (rng.htmlText == prng.htmlText || rng.boundingWidth == 0) {
- <span class="reserved">if</span> (invalidParentsRe == null || !invalidParentsRe.test(pelm.nodeName))
- parentElm = pelm;
- }
- }
- } <span class="reserved">else</span> {
- var felm = <span class="reserved">this</span>.getFocusElement();
- <span class="reserved">if</span> (sel.isCollapsed || (new RegExp(<span class="literal">'td|tr|tbody|table'</span>, <span class="literal">'gi'</span>).test(felm.nodeName) && sel.anchorNode == felm.parentNode))
- parentElm = felm;
- }
-
- <span class="comment">// Whole element selected</span>
- <span class="reserved">if</span> (parentElm && !invalidRe.test(parentElm.nodeName)) {
- <span class="reserved">if</span> (scmd == <span class="literal">"setstyle"</span>)
- tinyMCE.setStyleAttrib(parentElm, sname, svalue);
-
- <span class="reserved">if</span> (scmd == <span class="literal">"setattrib"</span>)
- tinyMCE.setAttrib(parentElm, sname, svalue);
-
- <span class="reserved">if</span> (scmd == <span class="literal">"removeformat"</span>) {
- parentElm.style.cssText = <span class="literal">''</span>;
- tinyMCE.setAttrib(parentElm, <span class="literal">'class'</span>, <span class="literal">''</span>);
- }
-
- <span class="comment">// Remove style/attribs from all children</span>
- var ch = tinyMCE.getNodeTree(parentElm, new Array(), 1);
- <span class="reserved">for</span> (var z=0; z<ch.length; z++) {
- <span class="reserved">if</span> (ch[z] == parentElm)
- continue;
-
- <span class="reserved">if</span> (scmd == <span class="literal">"setstyle"</span>)
- tinyMCE.setStyleAttrib(ch[z], sname, <span class="literal">''</span>);
-
- <span class="reserved">if</span> (scmd == <span class="literal">"setattrib"</span>)
- tinyMCE.setAttrib(ch[z], sname, <span class="literal">''</span>);
-
- <span class="reserved">if</span> (scmd == <span class="literal">"removeformat"</span>) {
- ch[z].style.cssText = <span class="literal">''</span>;
- tinyMCE.setAttrib(ch[z], <span class="literal">'class'</span>, <span class="literal">''</span>);
- }
- }
- } <span class="reserved">else</span> {
- <span class="reserved">this</span>._setUseCSS(false); <span class="comment">// Bug in FF when running in fullscreen</span>
- doc.execCommand(<span class="literal">"FontName"</span>, false, <span class="literal">"#mce_temp_font#"</span>);
- var elementArray = tinyMCE.getElementsByAttributeValue(<span class="reserved">this</span>.getBody(), <span class="literal">"font"</span>, <span class="literal">"face"</span>, <span class="literal">"#mce_temp_font#"</span>);
-
- <span class="comment">// Change them all</span>
- <span class="reserved">for</span> (var x=0; x<elementArray.length; x++) {
- elm = elementArray[x];
- <span class="reserved">if</span> (elm) {
- var spanElm = doc.createElement(wrapper);
-
- <span class="reserved">if</span> (scmd == <span class="literal">"setstyle"</span>)
- tinyMCE.setStyleAttrib(spanElm, sname, svalue);
-
- <span class="reserved">if</span> (scmd == <span class="literal">"setattrib"</span>)
- tinyMCE.setAttrib(spanElm, sname, svalue);
-
- <span class="reserved">if</span> (scmd == <span class="literal">"removeformat"</span>) {
- spanElm.style.cssText = <span class="literal">''</span>;
- tinyMCE.setAttrib(spanElm, <span class="literal">'class'</span>, <span class="literal">''</span>);
- }
-
- <span class="reserved">if</span> (elm.hasChildNodes()) {
- <span class="reserved">for</span> (var i=0; i<elm.childNodes.length; i++)
- spanElm.appendChild(elm.childNodes[i].cloneNode(true));
- }
-
- spanElm.setAttribute(<span class="literal">"mce_new"</span>, <span class="literal">"true"</span>);
- elm.parentNode.replaceChild(spanElm, elm);
-
- <span class="comment">// Remove style/attribs from all children</span>
- var ch = tinyMCE.getNodeTree(spanElm, new Array(), 1);
- <span class="reserved">for</span> (var z=0; z<ch.length; z++) {
- <span class="reserved">if</span> (ch[z] == spanElm)
- continue;
-
- <span class="reserved">if</span> (scmd == <span class="literal">"setstyle"</span>)
- tinyMCE.setStyleAttrib(ch[z], sname, <span class="literal">''</span>);
-
- <span class="reserved">if</span> (scmd == <span class="literal">"setattrib"</span>)
- tinyMCE.setAttrib(ch[z], sname, <span class="literal">''</span>);
-
- <span class="reserved">if</span> (scmd == <span class="literal">"removeformat"</span>) {
- ch[z].style.cssText = <span class="literal">''</span>;
- tinyMCE.setAttrib(ch[z], <span class="literal">'class'</span>, <span class="literal">''</span>);
- }
- }
- }
- }
- }
-
- <span class="comment">// Cleaup wrappers</span>
- var nodes = doc.getElementsByTagName(wrapper);
- <span class="reserved">for</span> (var i=nodes.length-1; i>=0; i--) {
- var elm = nodes[i];
- var isNew = tinyMCE.getAttrib(elm, <span class="literal">"mce_new"</span>) == <span class="literal">"true"</span>;
-
- elm.removeAttribute(<span class="literal">"mce_new"</span>);
-
- <span class="comment">// Is only child a element</span>
- <span class="reserved">if</span> (elm.childNodes && elm.childNodes.length == 1 && elm.childNodes[0].nodeType == 1) {
- <span class="comment">//tinyMCE.debug("merge1" + isNew);</span>
- <span class="reserved">this</span>._mergeElements(scmd, elm, elm.childNodes[0], isNew);
- continue;
- }
-
- <span class="comment">// Is I the only child</span>
- <span class="reserved">if</span> (elm.parentNode.childNodes.length == 1 && !invalidRe.test(elm.nodeName) && !invalidRe.test(elm.parentNode.nodeName)) {
- <span class="comment">//tinyMCE.debug("merge2" + isNew + "," + elm.nodeName + "," + elm.parentNode.nodeName);</span>
- <span class="reserved">if</span> (invalidParentsRe == null || !invalidParentsRe.test(elm.parentNode.nodeName))
- <span class="reserved">this</span>._mergeElements(scmd, elm.parentNode, elm, false);
- }
- }
-
- <span class="comment">// Remove empty wrappers</span>
- var nodes = doc.getElementsByTagName(wrapper);
- <span class="reserved">for</span> (var i=nodes.length-1; i>=0; i--) {
- var elm = nodes[i];
- var isEmpty = true;
-
- <span class="comment">// Check if it has any attribs</span>
- var tmp = doc.createElement(<span class="literal">"body"</span>);
- tmp.appendChild(elm.cloneNode(false));
-
- <span class="comment">// Is empty span, remove it</span>
- tmp.innerHTML = tmp.innerHTML.replace(new RegExp(<span class="literal">'style=""|class=""'</span>, <span class="literal">'gi'</span>), <span class="literal">''</span>);
- <span class="comment">//tinyMCE.debug(tmp.innerHTML);</span>
- <span class="reserved">if</span> (new RegExp(<span class="literal">'<span>'</span>, <span class="literal">'gi'</span>).test(tmp.innerHTML)) {
- <span class="reserved">for</span> (var x=0; x<elm.childNodes.length; x++) {
- <span class="reserved">if</span> (elm.parentNode != null)
- elm.parentNode.insertBefore(elm.childNodes[x].cloneNode(true), elm);
- }
-
- elm.parentNode.removeChild(elm);
- }
- }
-
- <span class="comment">// Re add the visual aids</span>
- <span class="reserved">if</span> (scmd == <span class="literal">"removeformat"</span>)
- tinyMCE.handleVisualAid(<span class="reserved">this</span>.getBody(), true, <span class="reserved">this</span>.visualAid, <span class="reserved">this</span>);
-
- tinyMCE.triggerNodeChange();
-
- break;
-
- case <span class="literal">"FontName"</span>:
- <span class="reserved">if</span> (value == null) {
- var s = <span class="reserved">this</span>.getSel();
-
- <span class="comment">// Find font and select it</span>
- <span class="reserved">if</span> (tinyMCE.isGecko && s.isCollapsed) {
- var f = tinyMCE.getParentElement(<span class="reserved">this</span>.getFocusElement(), <span class="literal">"font"</span>);
-
- <span class="reserved">if</span> (f != null)
- <span class="reserved">this</span>.selection.selectNode(f, false);
- }
-
- <span class="comment">// Remove format</span>
- <span class="reserved">this</span>.getDoc().execCommand(<span class="literal">"RemoveFormat"</span>, false, null);
-
- <span class="comment">// Collapse range if font was found</span>
- <span class="reserved">if</span> (f != null && tinyMCE.isGecko) {
- var r = <span class="reserved">this</span>.getRng().cloneRange();
- r.collapse(true);
- s.removeAllRanges();
- s.addRange(r);
- }
- } <span class="reserved">else</span>
- <span class="reserved">this</span>.getDoc().execCommand(<span class="literal">'FontName'</span>, false, value);
-
- <span class="reserved">if</span> (tinyMCE.isGecko)
- window.setTimeout(<span class="literal">'tinyMCE.triggerNodeChange(false);'</span>, 1);
-
- <span class="reserved">return</span>;
-
- case <span class="literal">"FontSize"</span>:
- <span class="reserved">this</span>.getDoc().execCommand(<span class="literal">'FontSize'</span>, false, value);
-
- <span class="reserved">if</span> (tinyMCE.isGecko)
- window.setTimeout(<span class="literal">'tinyMCE.triggerNodeChange(false);'</span>, 1);
-
- <span class="reserved">return</span>;
-
- case <span class="literal">"forecolor"</span>:
- <span class="reserved">this</span>.getDoc().execCommand(<span class="literal">'forecolor'</span>, false, value);
- break;
-
- case <span class="literal">"HiliteColor"</span>:
- <span class="reserved">if</span> (tinyMCE.isGecko) {
- <span class="reserved">this</span>._setUseCSS(true);
- <span class="reserved">this</span>.getDoc().execCommand(<span class="literal">'hilitecolor'</span>, false, value);
- <span class="reserved">this</span>._setUseCSS(false);
- } <span class="reserved">else</span>
- <span class="reserved">this</span>.getDoc().execCommand(<span class="literal">'BackColor'</span>, false, value);
- break;
-
- case <span class="literal">"Cut"</span>:
- case <span class="literal">"Copy"</span>:
- case <span class="literal">"Paste"</span>:
- var cmdFailed = false;
-
- <span class="comment">// Try executing command</span>
- eval(<span class="literal">'try {this.getDoc().execCommand(command, user_interface, value);} catch (e) {cmdFailed = true;}'</span>);
-
- <span class="reserved">if</span> (tinyMCE.isOpera && cmdFailed)
- alert(<span class="literal">'Currently not supported by your browser, use keyboard shortcuts instead.'</span>);
-
- <span class="comment">// Alert error in gecko if command failed</span>
- <span class="reserved">if</span> (tinyMCE.isGecko && cmdFailed) {
- <span class="comment">// Confirm more info</span>
- <span class="reserved">if</span> (confirm(tinyMCE.entityDecode(tinyMCE.getLang(<span class="literal">'lang_clipboard_msg'</span>))))
- window.open(<span class="literal">'http://www.mozilla.org/editor/midasdemo/securityprefs.html'</span>, <span class="literal">'mceExternal'</span>);
-
- <span class="reserved">return</span>;
- } <span class="reserved">else</span>
- tinyMCE.triggerNodeChange();
- break;
-
- case <span class="literal">"mceSetContent"</span>:
- <span class="reserved">if</span> (!value)
- value = <span class="literal">""</span>;
-
- <span class="comment">// Call custom cleanup code</span>
- value = tinyMCE.storeAwayURLs(value);
- value = tinyMCE._customCleanup(<span class="reserved">this</span>, <span class="literal">"insert_to_editor"</span>, value);
- tinyMCE._setHTML(doc, value);
- tinyMCE.setInnerHTML(doc.body, tinyMCE._cleanupHTML(<span class="reserved">this</span>, doc, tinyMCE.settings, doc.body));
- tinyMCE.convertAllRelativeURLs(doc.body);
-
- <span class="comment">// Cleanup any mess left from storyAwayURLs</span>
- tinyMCE._removeInternal(<span class="reserved">this</span>.getBody());
-
- <span class="comment">// When editing always use fonts internaly</span>
- <span class="reserved">if</span> (tinyMCE.getParam(<span class="literal">"convert_fonts_to_spans"</span>))
- tinyMCE.convertSpansToFonts(doc);
-
- tinyMCE.handleVisualAid(doc.body, true, <span class="reserved">this</span>.visualAid, <span class="reserved">this</span>);
- tinyMCE._setEventsEnabled(doc.body, false);
- <span class="reserved">return</span> true;
-
- case <span class="literal">"mceCleanup"</span>:
- var b = <span class="reserved">this</span>.selection.getBookmark();
- tinyMCE._setHTML(<span class="reserved">this</span>.contentDocument, <span class="reserved">this</span>.getBody().innerHTML);
- tinyMCE.setInnerHTML(<span class="reserved">this</span>.getBody(), tinyMCE._cleanupHTML(<span class="reserved">this</span>, <span class="reserved">this</span>.contentDocument, <span class="reserved">this</span>.settings, <span class="reserved">this</span>.getBody(), <span class="reserved">this</span>.visualAid));
- tinyMCE.convertAllRelativeURLs(doc.body);
-
- <span class="comment">// When editing always use fonts internaly</span>
- <span class="reserved">if</span> (tinyMCE.getParam(<span class="literal">"convert_fonts_to_spans"</span>))
- tinyMCE.convertSpansToFonts(doc);
-
- tinyMCE.handleVisualAid(<span class="reserved">this</span>.getBody(), true, <span class="reserved">this</span>.visualAid, <span class="reserved">this</span>);
- tinyMCE._setEventsEnabled(<span class="reserved">this</span>.getBody(), false);
- <span class="reserved">this</span>.repaint();
- <span class="reserved">this</span>.selection.moveToBookmark(b);
- tinyMCE.triggerNodeChange();
- break;
-
- case <span class="literal">"mceReplaceContent"</span>:
- <span class="comment">// Force empty string</span>
- <span class="reserved">if</span> (!value)
- value = <span class="literal">''</span>;
-
- <span class="reserved">this</span>.getWin().focus();
-
- var selectedText = <span class="literal">""</span>;
-
- <span class="reserved">if</span> (tinyMCE.isMSIE) {
- var rng = doc.selection.createRange();
- selectedText = rng.text;
- } <span class="reserved">else</span>
- selectedText = <span class="reserved">this</span>.getSel().toString();
-
- <span class="reserved">if</span> (selectedText.length > 0) {
- value = tinyMCE.replaceVar(value, <span class="literal">"selection"</span>, selectedText);
- tinyMCE.execCommand(<span class="literal">'mceInsertContent'</span>, false, value);
- }
-
- tinyMCE.triggerNodeChange();
- break;
-
- case <span class="literal">"mceSetAttribute"</span>:
- <span class="reserved">if</span> (typeof(value) == <span class="literal">'object'</span>) {
- var targetElms = (typeof(value[<span class="literal">'targets'</span>]) == <span class="literal">"undefined"</span>) ? <span class="literal">"p,img,span,div,td,h1,h2,h3,h4,h5,h6,pre,address"</span> : value[<span class="literal">'targets'</span>];
- var targetNode = tinyMCE.getParentElement(<span class="reserved">this</span>.getFocusElement(), targetElms);
-
- <span class="reserved">if</span> (targetNode) {
- targetNode.setAttribute(value[<span class="literal">'name'</span>], value[<span class="literal">'value'</span>]);
- tinyMCE.triggerNodeChange();
- }
- }
- break;
-
- case <span class="literal">"mceSetCSSClass"</span>:
- <span class="reserved">this</span>.execCommand(<span class="literal">"SetStyleInfo"</span>, false, {command : <span class="literal">"setattrib"</span>, name : <span class="literal">"class"</span>, value : value});
- break;
-
- case <span class="literal">"mceInsertRawHTML"</span>:
- var key = <span class="literal">'tiny_mce_marker'</span>;
-
- <span class="reserved">this</span>.execCommand(<span class="literal">'mceBeginUndoLevel'</span>);
-
- <span class="comment">// Insert marker key</span>
- <span class="reserved">this</span>.execCommand(<span class="literal">'mceInsertContent'</span>, false, key);
-
- <span class="comment">// Store away scroll pos</span>
- var scrollX = <span class="reserved">this</span>.getDoc().body.scrollLeft + <span class="reserved">this</span>.getDoc().documentElement.scrollLeft;
- var scrollY = <span class="reserved">this</span>.getDoc().body.scrollTop + <span class="reserved">this</span>.getDoc().documentElement.scrollTop;
-
- <span class="comment">// Find marker and replace with RAW HTML</span>
- var html = <span class="reserved">this</span>.getBody().innerHTML;
- <span class="reserved">if</span> ((pos = html.indexOf(key)) != -1)
- tinyMCE.setInnerHTML(<span class="reserved">this</span>.getBody(), html.substring(0, pos) + value + html.substring(pos + key.length));
-
- <span class="comment">// Restore scoll pos</span>
- <span class="reserved">this</span>.contentWindow.scrollTo(scrollX, scrollY);
-
- <span class="reserved">this</span>.execCommand(<span class="literal">'mceEndUndoLevel'</span>);
-
- break;
-
- case <span class="literal">"mceInsertContent"</span>:
- <span class="comment">// Force empty string</span>
- <span class="reserved">if</span> (!value)
- value = <span class="literal">''</span>;
-
- var insertHTMLFailed = false;
- <span class="reserved">this</span>.getWin().focus();
-
- <span class="reserved">if</span> (tinyMCE.isGecko || tinyMCE.isOpera) {
- try {
- <span class="comment">// Is plain text or HTML, &, etc will be encoded wrong in FF</span>
- <span class="reserved">if</span> (value.indexOf(<span class="literal">'<'</span>) == -1 && !value.match(/(&| |<|>)/g)) {
- var r = <span class="reserved">this</span>.getRng();
- var n = <span class="reserved">this</span>.getDoc().createTextNode(tinyMCE.entityDecode(value));
- var s = <span class="reserved">this</span>.getSel();
- var r2 = r.cloneRange();
-
- <span class="comment">// Insert text at cursor position</span>
- s.removeAllRanges();
- r.deleteContents();
- r.insertNode(n);
-
- <span class="comment">// Move the cursor to the end of text</span>
- r2.selectNode(n);
- r2.collapse(false);
- s.removeAllRanges();
- s.addRange(r2);
- } <span class="reserved">else</span> {
- value = tinyMCE.fixGeckoBaseHREFBug(1, <span class="reserved">this</span>.getDoc(), value);
- <span class="reserved">this</span>.getDoc().execCommand(<span class="literal">'inserthtml'</span>, false, value);
- tinyMCE.fixGeckoBaseHREFBug(2, <span class="reserved">this</span>.getDoc(), value);
- }
- } catch (ex) {
- insertHTMLFailed = true;
- }
-
- <span class="reserved">if</span> (!insertHTMLFailed) {
- tinyMCE.triggerNodeChange();
- <span class="reserved">return</span>;
- }
- }
-
- <span class="comment">// Ugly hack in Opera due to non working "inserthtml"</span>
- <span class="reserved">if</span> (tinyMCE.isOpera && insertHTMLFailed) {
- <span class="reserved">this</span>.getDoc().execCommand(<span class="literal">"insertimage"</span>, false, tinyMCE.uniqueURL);
- var ar = tinyMCE.getElementsByAttributeValue(<span class="reserved">this</span>.getBody(), <span class="literal">"img"</span>, <span class="literal">"src"</span>, tinyMCE.uniqueURL);
- ar[0].outerHTML = value;
- <span class="reserved">return</span>;
- }
-
- <span class="reserved">if</span> (!tinyMCE.isMSIE) {
- var isHTML = value.indexOf(<span class="literal">'<'</span>) != -1;
- var sel = <span class="reserved">this</span>.getSel();
- var rng = <span class="reserved">this</span>.getRng();
-
- <span class="reserved">if</span> (isHTML) {
- <span class="reserved">if</span> (tinyMCE.isSafari) {
- var tmpRng = <span class="reserved">this</span>.getDoc().createRange();
-
- tmpRng.setStart(<span class="reserved">this</span>.getBody(), 0);
- tmpRng.setEnd(<span class="reserved">this</span>.getBody(), 0);
-
- value = tmpRng.createContextualFragment(value);
- } <span class="reserved">else</span>
- value = rng.createContextualFragment(value);
- } <span class="reserved">else</span> {
- <span class="comment">// Setup text node</span>
- var el = document.createElement(<span class="literal">"div"</span>);
- el.innerHTML = value;
- value = el.firstChild.nodeValue;
- value = doc.createTextNode(value);
- }
-
- <span class="comment">// Insert plain text in Safari</span>
- <span class="reserved">if</span> (tinyMCE.isSafari && !isHTML) {
- <span class="reserved">this</span>.execCommand(<span class="literal">'InsertText'</span>, false, value.nodeValue);
- tinyMCE.triggerNodeChange();
- <span class="reserved">return</span> true;
- } <span class="reserved">else</span> <span class="reserved">if</span> (tinyMCE.isSafari && isHTML) {
- rng.deleteContents();
- rng.insertNode(value);
- tinyMCE.triggerNodeChange();
- <span class="reserved">return</span> true;
- }
-
- rng.deleteContents();
-
- <span class="comment">// If target node is text do special treatment, (Mozilla 1.3 fix)</span>
- <span class="reserved">if</span> (rng.startContainer.nodeType == 3) {
- var node = rng.startContainer.splitText(rng.startOffset);
- node.parentNode.insertBefore(value, node);
- } <span class="reserved">else</span>
- rng.insertNode(value);
-
- <span class="reserved">if</span> (!isHTML) {
- <span class="comment">// Removes weird selection trails</span>
- sel.selectAllChildren(doc.body);
- sel.removeAllRanges();
-
- <span class="comment">// Move cursor to end of content</span>
- var rng = doc.createRange();
-
- rng.selectNode(value);
- rng.collapse(false);
-
- sel.addRange(rng);
- } <span class="reserved">else</span>
- rng.collapse(false);
-
- tinyMCE.fixGeckoBaseHREFBug(2, <span class="reserved">this</span>.getDoc(), value);
- } <span class="reserved">else</span> {
- var rng = doc.selection.createRange();
- var c = value.indexOf(<span class="literal">'<!--'</span>) != -1;
-
- <span class="comment">// Fix comment bug, add tag before comments</span>
- <span class="reserved">if</span> (c)
- value = tinyMCE.uniqueTag + value;
-
- <span class="reserved">if</span> (rng.item)
- rng.item(0).outerHTML = value;
- <span class="reserved">else</span>
- rng.pasteHTML(value);
-
- <span class="comment">// Remove unique tag</span>
- <span class="reserved">if</span> (c) {
- var e = <span class="reserved">this</span>.getDoc().getElementById(<span class="literal">'mceTMPElement'</span>);
- e.parentNode.removeChild(e);
- }
- }
-
- tinyMCE.triggerNodeChange();
- break;
-
- case <span class="literal">"mceStartTyping"</span>:
- <span class="reserved">if</span> (tinyMCE.settings[<span class="literal">'custom_undo_redo'</span>] && <span class="reserved">this</span>.undoRedo.typingUndoIndex == -1) {
- <span class="reserved">this</span>.undoRedo.typingUndoIndex = <span class="reserved">this</span>.undoRedo.undoIndex;
- <span class="reserved">this</span>.execCommand(<span class="literal">'mceAddUndoLevel'</span>);
- <span class="comment">//tinyMCE.debug("mceStartTyping");</span>
- }
- break;
-
- case <span class="literal">"mceEndTyping"</span>:
- <span class="reserved">if</span> (tinyMCE.settings[<span class="literal">'custom_undo_redo'</span>] && <span class="reserved">this</span>.undoRedo.typingUndoIndex != -1) {
- <span class="reserved">this</span>.execCommand(<span class="literal">'mceAddUndoLevel'</span>);
- <span class="reserved">this</span>.undoRedo.typingUndoIndex = -1;
- <span class="comment">//tinyMCE.debug("mceEndTyping");</span>
- }
- break;
-
- case <span class="literal">"mceBeginUndoLevel"</span>:
- <span class="reserved">this</span>.undoRedoLevel = false;
- break;
-
- case <span class="literal">"mceEndUndoLevel"</span>:
- <span class="reserved">this</span>.undoRedoLevel = true;
- <span class="reserved">this</span>.execCommand(<span class="literal">'mceAddUndoLevel'</span>);
- break;
-
- case <span class="literal">"mceAddUndoLevel"</span>:
- <span class="reserved">if</span> (tinyMCE.settings[<span class="literal">'custom_undo_redo'</span>] && <span class="reserved">this</span>.undoRedoLevel) {
- <span class="reserved">if</span> (<span class="reserved">this</span>.undoRedo.add())
- tinyMCE.triggerNodeChange(false);
- }
- break;
-
- case <span class="literal">"Undo"</span>:
- <span class="reserved">if</span> (tinyMCE.settings[<span class="literal">'custom_undo_redo'</span>]) {
- tinyMCE.execCommand(<span class="literal">"mceEndTyping"</span>);
- <span class="reserved">this</span>.undoRedo.undo();
- tinyMCE.triggerNodeChange();
- } <span class="reserved">else</span>
- <span class="reserved">this</span>.getDoc().execCommand(command, user_interface, value);
- break;
-
- case <span class="literal">"Redo"</span>:
- <span class="reserved">if</span> (tinyMCE.settings[<span class="literal">'custom_undo_redo'</span>]) {
- tinyMCE.execCommand(<span class="literal">"mceEndTyping"</span>);
- <span class="reserved">this</span>.undoRedo.redo();
- tinyMCE.triggerNodeChange();
- } <span class="reserved">else</span>
- <span class="reserved">this</span>.getDoc().execCommand(command, user_interface, value);
- break;
-
- case <span class="literal">"mceToggleVisualAid"</span>:
- <span class="reserved">this</span>.visualAid = !<span class="reserved">this</span>.visualAid;
- tinyMCE.handleVisualAid(<span class="reserved">this</span>.getBody(), true, <span class="reserved">this</span>.visualAid, <span class="reserved">this</span>);
- tinyMCE.triggerNodeChange();
- break;
-
- case <span class="literal">"Indent"</span>:
- <span class="reserved">this</span>.getDoc().execCommand(command, user_interface, value);
- tinyMCE.triggerNodeChange();
- <span class="reserved">if</span> (tinyMCE.isMSIE) {
- var n = tinyMCE.getParentElement(<span class="reserved">this</span>.getFocusElement(), <span class="literal">"blockquote"</span>);
- do {
- <span class="reserved">if</span> (n && n.nodeName == <span class="literal">"BLOCKQUOTE"</span>) {
- n.removeAttribute(<span class="literal">"dir"</span>);
- n.removeAttribute(<span class="literal">"style"</span>);
- }
- } <span class="reserved">while</span> (n != null && (n = n.parentNode) != null);
- }
- break;
-
- case <span class="literal">"removeformat"</span>:
- var text = <span class="reserved">this</span>.selection.getSelectedText();
-
- <span class="reserved">if</span> (tinyMCE.isOpera) {
- <span class="reserved">this</span>.getDoc().execCommand(<span class="literal">"RemoveFormat"</span>, false, null);
- <span class="reserved">return</span>;
- }
-
- <span class="reserved">if</span> (tinyMCE.isMSIE) {
- try {
- var rng = doc.selection.createRange();
- rng.execCommand(<span class="literal">"RemoveFormat"</span>, false, null);
- } catch (e) {
- <span class="comment">// Do nothing</span>
- }
-
- <span class="reserved">this</span>.execCommand(<span class="literal">"SetStyleInfo"</span>, false, {command : <span class="literal">"removeformat"</span>});
- } <span class="reserved">else</span> {
- <span class="reserved">this</span>.getDoc().execCommand(command, user_interface, value);
-
- <span class="reserved">this</span>.execCommand(<span class="literal">"SetStyleInfo"</span>, false, {command : <span class="literal">"removeformat"</span>});
- }
-
- <span class="comment">// Remove class</span>
- <span class="reserved">if</span> (text.length == 0)
- <span class="reserved">this</span>.execCommand(<span class="literal">"mceSetCSSClass"</span>, false, <span class="literal">""</span>);
-
- tinyMCE.triggerNodeChange();
- break;
-
- default:
- <span class="reserved">this</span>.getDoc().execCommand(command, user_interface, value);
-
- <span class="reserved">if</span> (tinyMCE.isGecko)
- window.setTimeout(<span class="literal">'tinyMCE.triggerNodeChange(false);'</span>, 1);
- <span class="reserved">else</span>
- tinyMCE.triggerNodeChange();
- }
-
- <span class="comment">// Add undo level after modification</span>
- <span class="reserved">if</span> (command != <span class="literal">"mceAddUndoLevel"</span> && command != <span class="literal">"Undo"</span> && command != <span class="literal">"Redo"</span> && command != <span class="literal">"mceStartTyping"</span> && command != <span class="literal">"mceEndTyping"</span>)
- tinyMCE.execCommand(<span class="literal">"mceAddUndoLevel"</span>);
- },
-
- <span class="comment">/**
- * Returns a command specific value, for example the current font size.
- *
- * <span class="attrib">@param</span> {string} c Command to query value from.
- * <span class="attrib">@return</span> Command specific value, for example the current font size.
- * <span class="attrib">@type</span> mixed
- */</span>
- queryCommandValue : <span class="reserved">function</span>(c) {
- try {
- <span class="reserved">return</span> <span class="reserved">this</span>.getDoc().queryCommandValue(c);
- } catch (e) {
- <span class="reserved">return</span> null;
- }
- },
-
- <span class="comment">/**
- * Returns a command specific state, for example if bold is enabled or not.
- *
- * <span class="attrib">@param</span> {string} c Command to query state from.
- * <span class="attrib">@return</span> Command specific state, for example if bold is enabled or not.
- * <span class="attrib">@type</span> boolean
- */</span>
- queryCommandState : <span class="reserved">function</span>(c) {
- <span class="reserved">return</span> <span class="reserved">this</span>.getDoc().queryCommandState(c);
- },
-
- <span class="comment">/**
- * Gets executed when the editor control instance is added.
- *
- * <span class="attrib">@param</span> {HTMLElement} replace_element Element to replace with a editor instance.
- * <span class="attrib">@param</span> {string} form_element_name Form element name that gets replaced.
- * <span class="attrib">@param</span> {DOMDocument} target_document Target document reference where the element is located.
- * <span class="attrib">@private</span>
- */</span>
- _onAdd : <span class="reserved">function</span>(replace_element, form_element_name, target_document) {
- var hc, th, to, editorTemplate;
-
- th = <span class="reserved">this</span>.settings[<span class="literal">'theme'</span>];
- to = tinyMCE.themes[th];
-
- var targetDoc = target_document ? target_document : document;
-
- <span class="reserved">this</span>.targetDoc = targetDoc;
-
- tinyMCE.themeURL = tinyMCE.baseURL + <span class="literal">"/themes/"</span> + <span class="reserved">this</span>.settings[<span class="literal">'theme'</span>];
- <span class="reserved">this</span>.settings[<span class="literal">'themeurl'</span>] = tinyMCE.themeURL;
-
- <span class="reserved">if</span> (!replace_element) {
- alert(<span class="literal">"Error: Could not find the target element."</span>);
- <span class="reserved">return</span> false;
- }
-
- <span class="reserved">if</span> (to.getEditorTemplate)
- editorTemplate = to.getEditorTemplate(<span class="reserved">this</span>.settings, <span class="reserved">this</span>.editorId);
-
- var deltaWidth = editorTemplate[<span class="literal">'delta_width'</span>] ? editorTemplate[<span class="literal">'delta_width'</span>] : 0;
- var deltaHeight = editorTemplate[<span class="literal">'delta_height'</span>] ? editorTemplate[<span class="literal">'delta_height'</span>] : 0;
- var html = <span class="literal">'<span id="'</span> + <span class="reserved">this</span>.editorId + <span class="literal">'_parent" class="mceEditorContainer">'</span> + editorTemplate[<span class="literal">'html'</span>];
-
- html = tinyMCE.replaceVar(html, <span class="literal">"editor_id"</span>, <span class="reserved">this</span>.editorId);
- <span class="reserved">this</span>.settings[<span class="literal">'default_document'</span>] = tinyMCE.baseURL + <span class="literal">"/blank.htm"</span>;
-
- <span class="reserved">this</span>.settings[<span class="literal">'old_width'</span>] = <span class="reserved">this</span>.settings[<span class="literal">'width'</span>];
- <span class="reserved">this</span>.settings[<span class="literal">'old_height'</span>] = <span class="reserved">this</span>.settings[<span class="literal">'height'</span>];
-
- <span class="comment">// Set default width, height</span>
- <span class="reserved">if</span> (<span class="reserved">this</span>.settings[<span class="literal">'width'</span>] == -1)
- <span class="reserved">this</span>.settings[<span class="literal">'width'</span>] = replace_element.offsetWidth;
-
- <span class="reserved">if</span> (<span class="reserved">this</span>.settings[<span class="literal">'height'</span>] == -1)
- <span class="reserved">this</span>.settings[<span class="literal">'height'</span>] = replace_element.offsetHeight;
-
- <span class="comment">// Try the style width</span>
- <span class="reserved">if</span> (<span class="reserved">this</span>.settings[<span class="literal">'width'</span>] == 0)
- <span class="reserved">this</span>.settings[<span class="literal">'width'</span>] = replace_element.style.width;
-
- <span class="comment">// Try the style height</span>
- <span class="reserved">if</span> (<span class="reserved">this</span>.settings[<span class="literal">'height'</span>] == 0)
- <span class="reserved">this</span>.settings[<span class="literal">'height'</span>] = replace_element.style.height;
-
- <span class="comment">// If no width/height then default to 320x240, better than nothing</span>
- <span class="reserved">if</span> (<span class="reserved">this</span>.settings[<span class="literal">'width'</span>] == 0)
- <span class="reserved">this</span>.settings[<span class="literal">'width'</span>] = 320;
-
- <span class="reserved">if</span> (<span class="reserved">this</span>.settings[<span class="literal">'height'</span>] == 0)
- <span class="reserved">this</span>.settings[<span class="literal">'height'</span>] = 240;
-
- <span class="reserved">this</span>.settings[<span class="literal">'area_width'</span>] = parseInt(<span class="reserved">this</span>.settings[<span class="literal">'width'</span>]);
- <span class="reserved">this</span>.settings[<span class="literal">'area_height'</span>] = parseInt(<span class="reserved">this</span>.settings[<span class="literal">'height'</span>]);
- <span class="reserved">this</span>.settings[<span class="literal">'area_width'</span>] += deltaWidth;
- <span class="reserved">this</span>.settings[<span class="literal">'area_height'</span>] += deltaHeight;
-
- <span class="comment">// Special % handling</span>
- <span class="reserved">if</span> ((<span class="literal">""</span> + <span class="reserved">this</span>.settings[<span class="literal">'width'</span>]).indexOf(<span class="literal">'%'</span>) != -1)
- <span class="reserved">this</span>.settings[<span class="literal">'area_width'</span>] = <span class="literal">"100%"</span>;
-
- <span class="reserved">if</span> ((<span class="literal">""</span> + <span class="reserved">this</span>.settings[<span class="literal">'height'</span>]).indexOf(<span class="literal">'%'</span>) != -1)
- <span class="reserved">this</span>.settings[<span class="literal">'area_height'</span>] = <span class="literal">"100%"</span>;
-
- <span class="reserved">if</span> ((<span class="literal">""</span> + replace_element.style.width).indexOf(<span class="literal">'%'</span>) != -1) {
- <span class="reserved">this</span>.settings[<span class="literal">'width'</span>] = replace_element.style.width;
- <span class="reserved">this</span>.settings[<span class="literal">'area_width'</span>] = <span class="literal">"100%"</span>;
- }
-
- <span class="reserved">if</span> ((<span class="literal">""</span> + replace_element.style.height).indexOf(<span class="literal">'%'</span>) != -1) {
- <span class="reserved">this</span>.settings[<span class="literal">'height'</span>] = replace_element.style.height;
- <span class="reserved">this</span>.settings[<span class="literal">'area_height'</span>] = <span class="literal">"100%"</span>;
- }
-
- html = tinyMCE.applyTemplate(html);
-
- <span class="reserved">this</span>.settings[<span class="literal">'width'</span>] = <span class="reserved">this</span>.settings[<span class="literal">'old_width'</span>];
- <span class="reserved">this</span>.settings[<span class="literal">'height'</span>] = <span class="reserved">this</span>.settings[<span class="literal">'old_height'</span>];
-
- <span class="reserved">this</span>.visualAid = <span class="reserved">this</span>.settings[<span class="literal">'visual'</span>];
- <span class="reserved">this</span>.formTargetElementId = form_element_name;
-
- <span class="comment">// Get replace_element contents</span>
- <span class="reserved">if</span> (replace_element.nodeName == <span class="literal">"TEXTAREA"</span> || replace_element.nodeName == <span class="literal">"INPUT"</span>)
- <span class="reserved">this</span>.startContent = replace_element.value;
- <span class="reserved">else</span>
- <span class="reserved">this</span>.startContent = replace_element.innerHTML;
-
- <span class="comment">// If not text area or input</span>
- <span class="reserved">if</span> (replace_element.nodeName != <span class="literal">"TEXTAREA"</span> && replace_element.nodeName != <span class="literal">"INPUT"</span>) {
- <span class="reserved">this</span>.oldTargetElement = replace_element;
-
- <span class="comment">// Debug mode</span>
- <span class="reserved">if</span> (tinyMCE.settings[<span class="literal">'debug'</span>]) {
- hc = <span class="literal">'<textarea wrap="off" id="'</span> + form_element_name + <span class="literal">'" name="'</span> + form_element_name + <span class="literal">'" cols="100" rows="15"></textarea>'</span>;
- } <span class="reserved">else</span> {
- hc = <span class="literal">'<input type="hidden" type="text" id="'</span> + form_element_name + <span class="literal">'" name="'</span> + form_element_name + <span class="literal">'" />'</span>;
- <span class="reserved">this</span>.oldTargetElement.style.display = <span class="literal">"none"</span>;
- }
-
- html += <span class="literal">'</span>'</span>;
-
- <span class="reserved">if</span> (tinyMCE.isGecko)
- html = hc + html;
- <span class="reserved">else</span>
- html += hc;
-
- <span class="comment">// Output HTML and set editable</span>
- <span class="reserved">if</span> (tinyMCE.isGecko) {
- var rng = replace_element.ownerDocument.createRange();
- rng.setStartBefore(replace_element);
-
- var fragment = rng.createContextualFragment(html);
- tinyMCE.insertAfter(fragment, replace_element);
- } <span class="reserved">else</span>
- replace_element.insertAdjacentHTML(<span class="literal">"beforeBegin"</span>, html);
- } <span class="reserved">else</span> {
- html += <span class="literal">'</span>'</span>;
-
- <span class="comment">// Just hide the textarea element</span>
- <span class="reserved">this</span>.oldTargetElement = replace_element;
-
- <span class="reserved">if</span> (!tinyMCE.settings[<span class="literal">'debug'</span>])
- <span class="reserved">this</span>.oldTargetElement.style.display = <span class="literal">"none"</span>;
-
- <span class="comment">// Output HTML and set editable</span>
- <span class="reserved">if</span> (tinyMCE.isGecko) {
- var rng = replace_element.ownerDocument.createRange();
- rng.setStartBefore(replace_element);
-
- var fragment = rng.createContextualFragment(html);
- tinyMCE.insertAfter(fragment, replace_element);
- } <span class="reserved">else</span>
- replace_element.insertAdjacentHTML(<span class="literal">"beforeBegin"</span>, html);
- }
-
- <span class="comment">// Setup iframe</span>
- var dynamicIFrame = false;
- var tElm = targetDoc.getElementById(<span class="reserved">this</span>.editorId);
-
- <span class="reserved">if</span> (!tinyMCE.isMSIE) {
- <span class="reserved">if</span> (tElm && tElm.nodeName == <span class="literal">"SPAN"</span>) {
- tElm = tinyMCE._createIFrame(tElm, targetDoc);
- dynamicIFrame = true;
- }
-
- <span class="reserved">this</span>.targetElement = tElm;
- <span class="reserved">this</span>.iframeElement = tElm;
- <span class="reserved">this</span>.contentDocument = tElm.contentDocument;
- <span class="reserved">this</span>.contentWindow = tElm.contentWindow;
-
- <span class="comment">//this.getDoc().designMode = "on";</span>
- } <span class="reserved">else</span> {
- <span class="reserved">if</span> (tElm && tElm.nodeName == <span class="literal">"SPAN"</span>)
- tElm = tinyMCE._createIFrame(tElm, targetDoc, targetDoc.parentWindow);
- <span class="reserved">else</span>
- tElm = targetDoc.frames[<span class="reserved">this</span>.editorId];
-
- <span class="reserved">this</span>.targetElement = tElm;
- <span class="reserved">this</span>.iframeElement = targetDoc.getElementById(<span class="reserved">this</span>.editorId);
-
- <span class="reserved">if</span> (tinyMCE.isOpera) {
- <span class="reserved">this</span>.contentDocument = <span class="reserved">this</span>.iframeElement.contentDocument;
- <span class="reserved">this</span>.contentWindow = <span class="reserved">this</span>.iframeElement.contentWindow;
- dynamicIFrame = true;
- } <span class="reserved">else</span> {
- <span class="reserved">this</span>.contentDocument = tElm.window.document;
- <span class="reserved">this</span>.contentWindow = tElm.window;
- }
-
- <span class="reserved">this</span>.getDoc().designMode = <span class="literal">"on"</span>;
- }
-
- <span class="comment">// Setup base HTML</span>
- var doc = <span class="reserved">this</span>.contentDocument;
- <span class="reserved">if</span> (dynamicIFrame) {
- var html = tinyMCE.getParam(<span class="literal">'doctype'</span>) + <span class="literal">'<html><head xmlns="http://www.w3.org/1999/xhtml"><base href="'</span> + tinyMCE.settings[<span class="literal">'base_href'</span>] + <span class="literal">'" /><title>blank_page</title><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"></head><body class="mceContentBody"></body></html>'</span>;
-
- try {
- <span class="reserved">if</span> (!<span class="reserved">this</span>.isHidden())
- <span class="reserved">this</span>.getDoc().designMode = <span class="literal">"on"</span>;
-
- doc.open();
- doc.write(html);
- doc.close();
- } catch (e) {
- <span class="comment">// Failed Mozilla 1.3</span>
- <span class="reserved">this</span>.getDoc().location.href = tinyMCE.baseURL + <span class="literal">"/blank.htm"</span>;
- }
- }
-
- <span class="comment">// This timeout is needed in MSIE 5.5 for some odd reason</span>
- <span class="comment">// it seems that the document.frames isn't initialized yet?</span>
- <span class="reserved">if</span> (tinyMCE.isMSIE)
- window.setTimeout(<span class="literal">"tinyMCE.addEventHandlers(tinyMCE.instances[\"</span><span class="literal">" + this.editorId + "</span>\<span class="literal">"]);"</span>, 1);
-
- tinyMCE.setupContent(<span class="reserved">this</span>.editorId, true);
-
- <span class="reserved">return</span> true;
- },
-
- <span class="comment">/**
- * Sets the base href url of the current document instance. This method is used
- * to temporarly remove the base url during copy/paste and drag/drop operations
- * of relative links from external sites into TinyMCE. MSIE has a bug and converts
- * relative links from external sites to absolute links incorrectly.
- *
- * <span class="attrib">@param</span> {string} u URL to set as base URL or null to remove it.
- */</span>
- setBaseHREF : <span class="reserved">function</span>(u) {
- var h, b, d, nl;
-
- d = <span class="reserved">this</span>.getDoc();
- nl = d.getElementsByTagName(<span class="literal">"base"</span>);
- b = nl.length > 0 ? nl[0] : null;
-
- <span class="reserved">if</span> (!b) {
- nl = d.getElementsByTagName(<span class="literal">"head"</span>);
- h = nl.length > 0 ? nl[0] : null;
-
- b = d.createElement(<span class="literal">"base"</span>);
- b.setAttribute(<span class="literal">'href'</span>, u);
- h.appendChild(b);
- } <span class="reserved">else</span> {
- <span class="reserved">if</span> (u == <span class="literal">""</span> || u == null)
- b.parentNode.removeChild(b);
- <span class="reserved">else</span>
- b.setAttribute(<span class="literal">'href'</span>, u);
- }
- },
-
- <span class="comment">/**
- * Returns the currently selected element. This is was added for compatiblity and is deprecated.
- * Please use inst.selection.getFocusElement instead.
- *
- * <span class="attrib">@return</span> Currently selected element.
- * <span class="attrib">@type</span> HTMLElement
- * <span class="attrib">@deprecated</span>
- */</span>
- getFocusElement : <span class="reserved">function</span>() {
- <span class="reserved">return</span> <span class="reserved">this</span>.selection.getFocusElement();
- },
-
- <span class="comment">/**
- * Returns the browsers selection instance. This is was added for compatiblity and is deprecated.
- * Please use inst.selection.getSel instead.
- *
- * <span class="attrib">@return</span> Browser selection instance.
- * <span class="attrib">@type</span> DOMSelection
- * <span class="attrib">@deprecated</span>
- */</span>
- getSel : <span class="reserved">function</span>() {
- <span class="reserved">return</span> <span class="reserved">this</span>.selection.getSel();
- },
-
- <span class="comment">/**
- * Returns the browsers selections first range instance. This is was added for compatiblity and is deprecated.
- * Please use inst.selection.getRng instead.
- *
- * <span class="attrib">@return</span> Browsers selections first range instance.
- * <span class="attrib">@type</span> DOMRange
- * <span class="attrib">@deprecated</span>
- */</span>
- getRng : <span class="reserved">function</span>() {
- <span class="reserved">return</span> <span class="reserved">this</span>.selection.getRng();
- },
-
- <span class="comment">/**
- * Moves the contents from the TinyMCE editor control instance to the hidden textarea
- * that got replaced with TinyMCE. This is executed automaticly on for example form submit unless you configure otherwice.
- *
- * <span class="attrib">@param</span> {boolean} skip_cleanup Optional Skip cleanup, simply move the contents as fast as possible.
- * <span class="attrib">@param</span> {boolean} skip_callback Optional Skip callback, don't call the save_callback function.
- */</span>
- triggerSave : <span class="reserved">function</span>(skip_cleanup, skip_callback) {
- <span class="reserved">this</span>.switchSettings();
-
- tinyMCE.settings[<span class="literal">'preformatted'</span>] = false;
-
- <span class="comment">// Default to false</span>
- <span class="reserved">if</span> (typeof(skip_cleanup) == <span class="literal">"undefined"</span>)
- skip_cleanup = false;
-
- <span class="comment">// Default to false</span>
- <span class="reserved">if</span> (typeof(skip_callback) == <span class="literal">"undefined"</span>)
- skip_callback = false;
-
- tinyMCE._setHTML(<span class="reserved">this</span>.getDoc(), <span class="reserved">this</span>.getBody().innerHTML);
-
- <span class="comment">// Remove visual aids when cleanup is disabled</span>
- <span class="reserved">if</span> (<span class="reserved">this</span>.settings[<span class="literal">'cleanup'</span>] == false) {
- tinyMCE.handleVisualAid(<span class="reserved">this</span>.getBody(), true, false, <span class="reserved">this</span>);
- tinyMCE._setEventsEnabled(<span class="reserved">this</span>.getBody(), true);
- }
-
- tinyMCE._customCleanup(<span class="reserved">this</span>, <span class="literal">"submit_content_dom"</span>, <span class="reserved">this</span>.contentWindow.document.body);
- var htm = skip_cleanup ? <span class="reserved">this</span>.getBody().innerHTML : tinyMCE._cleanupHTML(<span class="reserved">this</span>, <span class="reserved">this</span>.getDoc(), <span class="reserved">this</span>.settings, <span class="reserved">this</span>.getBody(), tinyMCE.visualAid, true, true);
- htm = tinyMCE._customCleanup(<span class="reserved">this</span>, <span class="literal">"submit_content"</span>, htm);
-
- <span class="reserved">if</span> (!skip_callback && tinyMCE.settings[<span class="literal">'save_callback'</span>] != <span class="literal">""</span>)
- var content = eval(tinyMCE.settings[<span class="literal">'save_callback'</span>] + <span class="literal">"(this.formTargetElementId,htm,this.getBody());"</span>);
-
- <span class="comment">// Use callback content if available</span>
- <span class="reserved">if</span> ((typeof(content) != <span class="literal">"undefined"</span>) && content != null)
- htm = content;
-
- <span class="comment">// Replace some weird entities (Bug: #1056343)</span>
- htm = tinyMCE.regexpReplace(htm, <span class="literal">"("</span>, <span class="literal">"("</span>, <span class="literal">"gi"</span>);
- htm = tinyMCE.regexpReplace(htm, <span class="literal">")"</span>, <span class="literal">")"</span>, <span class="literal">"gi"</span>);
- htm = tinyMCE.regexpReplace(htm, <span class="literal">";"</span>, <span class="literal">";"</span>, <span class="literal">"gi"</span>);
- htm = tinyMCE.regexpReplace(htm, <span class="literal">"""</span>, <span class="literal">"""</span>, <span class="literal">"gi"</span>);
- htm = tinyMCE.regexpReplace(htm, <span class="literal">"^"</span>, <span class="literal">"^"</span>, <span class="literal">"gi"</span>);
-
- <span class="reserved">if</span> (<span class="reserved">this</span>.formElement)
- <span class="reserved">this</span>.formElement.value = htm;
-
- <span class="reserved">if</span> (tinyMCE.isSafari && <span class="reserved">this</span>.formElement)
- <span class="reserved">this</span>.formElement.innerText = htm;
- }
-};
-</pre>
- <hr>
-
-
-
-<!-- ========== START OF NAVBAR ========== -->
-<a name="navbar_top"><!-- --></a>
-<table border="0" width="100%" cellpadding="1" cellspacing="0">
-<tr>
-<td colspan=2 bgcolor="#EEEEFF" class="NavBarCell1">
-<a name="navbar_top_firstrow"><!-- --></a>
-<table border="0" cellpadding="0" cellspacing="3">
- <tr align="center" valign="top">
-
-
- <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="overview-summary.html"><font class="NavBarFont1"><b>Overview</b></font></a> </td>
- <td bgcolor="#FFFFFF" class="NavBarCell1Rev"> <font class="NavBarFont1Rev"><b>File</b></font> </td>
-
-
- <td bgcolor="#FFFFFF" class="NavBarCell1"> <font class="NavBarFont1">Class</font> </td>
- <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="overview-tree.html"><font class="NavBarFont1"><b>Tree</b></font></a> </td>
- <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="index-all.html"--><font class="NavBarFont1"><b>Index</b></font></a> </td>
- <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="help-doc.html"><font class="NavBarFont1"><b>Help</b></font></a> </td>
- </tr>
-</table>
-</td>
-<td bgcolor="#EEEEFF" align="right" valign="top"><em>
-<b></b></em>
-</td>
-</tr>
-
-<tr>
-<td bgcolor="white" class="NavBarCell2"><font size="-2">
- PREV
- NEXT</font></td>
-<td bgcolor="white" class="NavBarCell2"><font size="-2">
- <a href="index.html" target="_top"><b>FRAMES</b></a>
- <a href="overview-summary.html" target="_top"><b>NO FRAMES</b></a>
-
-<script>
- <!--
- if(window==top) {
- document.writeln('<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>');
- }
- //-->
-</script>
-<noscript>
-<a href="allclasses-noframe.html" target=""><b>All Classes</b></a>
-</noscript>
-</font></td>
-</tr>
-</table>
-<!-- =========== END OF NAVBAR =========== -->
-
-<hr>
-<font size="-1">
-
-</font>
-<div class="jsdoc_ctime">Documentation generated by <a href="http://jsdoc.sourceforge.net/" target="_parent">JSDoc</a> on Fri Apr 14 21:59:23 2006</div>
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/tinymce_api/overview-summary-TinyMCE_Control.class.js.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/tinymce_api/overview-summary-TinyMCE_Control.class.js.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/tinymce_api/overview-summary-TinyMCE_Control.class.js.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/tinymce_api/overview-summary-TinyMCE_Control.class.js.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,1710 @@
+<!doctype html public "-//W3C//DTD HTML 4.0 Frameset//EN""http://www.w3.org/TR/REC-html40/frameset.dtd">
+<html>
+<head>
+<title>
+ Overview
+</title>
+<link rel ="stylesheet" type="text/css" href="stylesheet.css" title="Style">
+<script>
+function asd() {
+
+ parent.document.title="TinyMCE_Control.class.js Overview";
+
+}
+</script>
+</head>
+<body bgcolor="white" onload="asd();">
+
+<!-- ========== START OF NAVBAR ========== -->
+<a name="navbar_top"><!-- --></a>
+<table border="0" width="100%" cellpadding="1" cellspacing="0">
+<tr>
+<td colspan=2 bgcolor="#EEEEFF" class="NavBarCell1">
+<a name="navbar_top_firstrow"><!-- --></a>
+<table border="0" cellpadding="0" cellspacing="3">
+ <tr align="center" valign="top">
+
+
+ <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="overview-summary.html"><font class="NavBarFont1"><b>Overview</b></font></a> </td>
+ <td bgcolor="#FFFFFF" class="NavBarCell1Rev"> <font class="NavBarFont1Rev"><b>File</b></font> </td>
+
+
+ <td bgcolor="#FFFFFF" class="NavBarCell1"> <font class="NavBarFont1">Class</font> </td>
+ <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="overview-tree.html"><font class="NavBarFont1"><b>Tree</b></font></a> </td>
+ <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="index-all.html"--><font class="NavBarFont1"><b>Index</b></font></a> </td>
+ <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="help-doc.html"><font class="NavBarFont1"><b>Help</b></font></a> </td>
+ </tr>
+</table>
+</td>
+<td bgcolor="#EEEEFF" align="right" valign="top">
+<em>
+<b></b></em>
+</td>
+</tr>
+
+<tr>
+<td bgcolor="white" class="NavBarCell2"><font size="-2">
+ PREV
+ NEXT</font></td>
+<td bgcolor="white" class="NavBarCell2"><font size="-2">
+ <a href="index.html" target="_top"><b>FRAMES</b></a>
+ <a href="overview-summary.html" target="_top"><b>NO FRAMES</b></a>
+
+<script>
+ <!--
+ if(window==top) {
+ document.writeln('<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>');
+ }
+ //-->
+</script>
+<noscript>
+<a href="allclasses-noframe.html" target=""><b>All Classes</b></a>
+</noscript>
+</font></td>
+</tr>
+</table>
+<!-- =========== END OF NAVBAR =========== -->
+
+<hr>
+<center>
+
+ <h2>TinyMCE_Control.class.js</h2>
+
+</center>
+
+
+
+
+<h4>Summary</h4>
+<p>
+
+ No overview generated for 'TinyMCE_Control.class.js'<BR/><BR/>
+
+</p>
+
+<hr>
+
+
+ <table border="1" cellpadding="3" cellspacing="0" width="100%">
+ <tr bgcolor="#CCCCFF" class="TableHeadingColor">
+ <td colspan=2><font size="+2">
+
+ <b>Class Summary</b>
+
+ </font></td>
+ </tr>
+
+ <tr bgcolor="white" class="TableRowColor">
+ <td width="15%"><b><a href="TinyMCE_Control.html">TinyMCE_Control</a></b></td>
+ <td> </td>
+ </tr>
+
+ </table>
+ <hr/>
+
+
+<!-- ========== METHOD SUMMARY =========== -->
+
+<!-- ========== END METHOD SUMMARY =========== -->
+
+
+ <pre class="sourceview"><span class="comment">/**
+ * $RCSfile: overview-summary-TinyMCE_Control.class.js.html,v $
+ * $Revision: 1.42 $
+ * $Date: 2006/04/14 20:00:28 $
+ *
+ * <span class="attrib">@author</span> Moxiecode
+ * <span class="attrib">@copyright</span> Copyright © 2004-2006, Moxiecode Systems AB, All rights reserved.
+ */</span>
+
+<span class="comment">/**
+ * This is the TinyMCE editor control instance class. A instance of this class will is made for each
+ * converted text area.
+ *
+ * <span class="attrib">@constructor</span>
+ * <span class="attrib">@param</span> {Array} settings Name/Value array of instance specific configuration settings.
+ */</span>
+<span class="reserved">function</span> TinyMCE_Control(settings) {
+ var t, i, to, fu, p, x, fn, fu, pn, s = settings;
+
+ <span class="reserved">this</span>.undoRedoLevel = true;
+ <span class="reserved">this</span>.isTinyMCE_Control = true;
+
+ <span class="comment">// Default settings</span>
+ <span class="reserved">this</span>.settings = s;
+ <span class="reserved">this</span>.settings[<span class="literal">'theme'</span>] = tinyMCE.getParam(<span class="literal">"theme"</span>, <span class="literal">"default"</span>);
+ <span class="reserved">this</span>.settings[<span class="literal">'width'</span>] = tinyMCE.getParam(<span class="literal">"width"</span>, -1);
+ <span class="reserved">this</span>.settings[<span class="literal">'height'</span>] = tinyMCE.getParam(<span class="literal">"height"</span>, -1);
+ <span class="reserved">this</span>.selection = new TinyMCE_Selection(<span class="reserved">this</span>);
+ <span class="reserved">this</span>.undoRedo = new TinyMCE_UndoRedo(<span class="reserved">this</span>);
+ <span class="reserved">this</span>.cleanup = new TinyMCE_Cleanup();
+ <span class="reserved">this</span>.shortcuts = new Array();
+ <span class="reserved">this</span>.hasMouseMoved = false;
+
+ <span class="reserved">this</span>.cleanup.init({
+ valid_elements : s.valid_elements,
+ extended_valid_elements : s.extended_valid_elements,
+ entities : s.entities,
+ entity_encoding : s.entity_encoding,
+ debug : s.cleanup_debug,
+ url_converter : <span class="literal">'TinyMCE_Cleanup.prototype._urlConverter'</span>,
+ indent : s.apply_source_formatting,
+ invalid_elements : s.invalid_elements,
+ verify_html : s.verify_html,
+ fix_content_duplication : s.fix_content_duplication
+ });
+
+ <span class="comment">// Wrap old theme</span>
+ t = <span class="reserved">this</span>.settings[<span class="literal">'theme'</span>];
+ <span class="reserved">if</span> (!tinyMCE.hasTheme(t)) {
+ fn = tinyMCE.callbacks;
+ to = {};
+
+ <span class="reserved">for</span> (i=0; i<fn.length; i++) {
+ <span class="reserved">if</span> ((fu = window[<span class="literal">'TinyMCE_'</span> + t + <span class="literal">"_"</span> + fn[i]]))
+ to[fn[i]] = fu;
+ }
+
+ tinyMCE.addTheme(t, to);
+ }
+
+ <span class="comment">// Wrap old plugins</span>
+ <span class="reserved">this</span>.plugins = new Array();
+ p = tinyMCE.getParam(<span class="literal">'plugins'</span>, <span class="literal">''</span>, true, <span class="literal">','</span>);
+ <span class="reserved">if</span> (p.length > 0) {
+ <span class="reserved">for</span> (i=0; i<p.length; i++) {
+ pn = p[i];
+
+ <span class="reserved">if</span> (pn.charAt(0) == <span class="literal">'-'</span>)
+ pn = pn.substring(1);
+
+ <span class="reserved">if</span> (!tinyMCE.hasPlugin(pn)) {
+ fn = tinyMCE.callbacks;
+ to = {};
+
+ <span class="reserved">for</span> (x=0; x<fn.length; x++) {
+ <span class="reserved">if</span> ((fu = window[<span class="literal">'TinyMCE_'</span> + pn + <span class="literal">"_"</span> + fn[x]]))
+ to[fn[x]] = fu;
+ }
+
+ tinyMCE.addPlugin(pn, to);
+ }
+
+ <span class="reserved">this</span>.plugins[<span class="reserved">this</span>.plugins.length] = pn;
+ }
+ }
+};
+
+TinyMCE_Control.<span class="reserved">prototype</span> = {
+ <span class="comment">/**
+ * Returns true/false if the instance has the current plugin available.
+ *
+ * <span class="attrib">@param</span> {string} n Plugin name to check for.
+ * <span class="attrib">@return</span> true/false if the instance has the current plugin available.
+ * <span class="attrib">@type</span> boolean
+ */</span>
+ hasPlugin : <span class="reserved">function</span>(n) {
+ var i;
+
+ <span class="reserved">for</span> (i=0; i<<span class="reserved">this</span>.plugins.length; i++) {
+ <span class="reserved">if</span> (<span class="reserved">this</span>.plugins[i] == n)
+ <span class="reserved">return</span> true;
+ }
+
+ <span class="reserved">return</span> false;
+ },
+
+ <span class="comment">/**
+ * Adds a plugin to the editor instance. This will also add it globaly.
+ *
+ * <span class="attrib">@param</span> {string} n Plugin name to check for.
+ * <span class="attrib">@param</span> {TinyMCE_Plugin} n TinyMCE plugin instance.
+ */</span>
+ addPlugin : <span class="reserved">function</span>(n, p) {
+ <span class="reserved">if</span> (!<span class="reserved">this</span>.hasPlugin(n)) {
+ tinyMCE.addPlugin(n, p);
+ <span class="reserved">this</span>.plugins[<span class="reserved">this</span>.plugins.length] = n;
+ }
+ },
+
+ <span class="comment">/**
+ * Repaints the editarea in Gecko browsers. This method removes ghost resize handlers
+ * and other trailing graphics.
+ */</span>
+ repaint : <span class="reserved">function</span>() {
+ <span class="reserved">if</span> (tinyMCE.isMSIE && !tinyMCE.isOpera)
+ <span class="reserved">return</span>;
+
+ try {
+ var s = <span class="reserved">this</span>.selection;
+ var b = s.getBookmark(true);
+ <span class="reserved">this</span>.getBody().style.display = <span class="literal">'none'</span>;
+ <span class="reserved">this</span>.getDoc().execCommand(<span class="literal">'selectall'</span>, false, null);
+ <span class="reserved">this</span>.getSel().collapseToStart();
+ <span class="reserved">this</span>.getBody().style.display = <span class="literal">'block'</span>;
+ s.moveToBookmark(b);
+ } catch (ex) {
+ <span class="comment">// Ignore</span>
+ }
+ },
+
+ <span class="comment">/**
+ * Switches the global TinyMCE settings to the current instance settings. This method is
+ * used to handle multiple configurations.
+ */</span>
+ switchSettings : <span class="reserved">function</span>() {
+ <span class="reserved">if</span> (tinyMCE.configs.length > 1 && tinyMCE.currentConfig != <span class="reserved">this</span>.settings[<span class="literal">'index'</span>]) {
+ tinyMCE.settings = <span class="reserved">this</span>.settings;
+ tinyMCE.currentConfig = <span class="reserved">this</span>.settings[<span class="literal">'index'</span>];
+ }
+ },
+
+ <span class="comment">/**
+ * Returns the body element of a editor instance.
+ *
+ * <span class="attrib">@return</span> Body element of a editor instance.
+ * <span class="attrib">@type</span> HTMLElement
+ */</span>
+ getBody : <span class="reserved">function</span>() {
+ <span class="reserved">return</span> <span class="reserved">this</span>.getDoc().body;
+ },
+
+ <span class="comment">/**
+ * Returns the DOM document of a editor instance.
+ *
+ * <span class="attrib">@return</span> DOM document of a editor instance.
+ * <span class="attrib">@type</span> DOMDocument
+ */</span>
+ getDoc : <span class="reserved">function</span>() {
+ <span class="reserved">return</span> <span class="reserved">this</span>.contentWindow.document;
+ },
+
+ <span class="comment">/**
+ * Returns the window of a editor instance.
+ *
+ * <span class="attrib">@return</span> Window of a editor instance.
+ * <span class="attrib">@type</span> Window
+ */</span>
+ getWin : <span class="reserved">function</span>() {
+ <span class="reserved">return</span> <span class="reserved">this</span>.contentWindow;
+ },
+
+ <span class="comment">/**
+ * Adds a keyboard shortcut to a specific command. These shortcuts can for example be added
+ * at the initInstance callback of a plugin. The shortcut description can be a language variable name
+ * or a string describing the function. If you don't specify a command, the shortcut will simply be a blocker
+ * shortcut. This enables you to remove built in shortcuts or remove theme specific shortcuts from a plugin.<br />
+ * Example shortcut inst.addShortcut('ctrl,alt', 'k', 'mceSomeCommand', false, 'somevalue');
+ * Example blocker inst.addShortcut('ctrl,alt', 'k');
+ *
+ * <span class="attrib">@param</span> {string} m List of shortcut modifiers keys, for example "ctrl,alt".
+ * <span class="attrib">@param</span> {Object} k Shortcut key char for example "s" or a keycode value "13".
+ * <span class="attrib">@param</span> {string} d Optional Shortcut description, this will be presented in the about dialog.
+ * <span class="attrib">@param</span> {string} cmd Optional Command name to execute, for example mceLink or Bold.
+ * <span class="attrib">@param</span> {boolean} ui Optional True/false state if a UI (dialog) should be presented or not.
+ * <span class="attrib">@param</span> {Object} va Optional command value, this can be anything.
+ * <span class="attrib">@return</span> true/false if the shortcut was added or not
+ * <span class="attrib">@type</span> boolean
+ */</span>
+ addShortcut : <span class="reserved">function</span>(m, k, d, cmd, ui, va) {
+ var n = typeof(k) == <span class="literal">"number"</span>, ie = tinyMCE.isMSIE, c, sc, i;
+ var scl = <span class="reserved">this</span>.shortcuts;
+
+ <span class="reserved">if</span> (!tinyMCE.getParam(<span class="literal">'custom_shortcuts'</span>))
+ <span class="reserved">return</span> false;
+
+ m = m.toLowerCase();
+ k = ie && !n ? k.toUpperCase() : k;
+ c = n ? null : k.charCodeAt(0);
+ d = d && d.indexOf(<span class="literal">'lang_'</span>) == 0 ? tinyMCE.getLang(d) : d;
+
+ sc = {
+ alt : m.indexOf(<span class="literal">'alt'</span>) != -1,
+ ctrl : m.indexOf(<span class="literal">'ctrl'</span>) != -1,
+ shift : m.indexOf(<span class="literal">'shift'</span>) != -1,
+ charCode : c,
+ keyCode : n ? k : (ie ? c : null),
+ desc : d,
+ cmd : cmd,
+ ui : ui,
+ val : va
+ };
+
+ <span class="reserved">for</span> (i=0; i<scl.length; i++) {
+ <span class="reserved">if</span> (sc.alt == scl[i].alt && sc.ctrl == scl[i].ctrl && sc.shift == scl[i].shift
+ && sc.charCode == scl[i].charCode && sc.keyCode == scl[i].keyCode) {
+ <span class="reserved">return</span> false;
+ }
+ }
+
+ scl[scl.length] = sc;
+
+ <span class="reserved">return</span> true;
+ },
+
+ <span class="comment">/**
+ * Executes shortcuts based on the event information.
+ *
+ * <span class="attrib">@param</span> {DOMEvent} e Keyboard event to handle.
+ * <span class="attrib">@return</span> true/false if the shortcut was found and executed or not.
+ * <span class="attrib">@type</span> boolean
+ */</span>
+ handleShortcut : <span class="reserved">function</span>(e) {
+ var i, s = <span class="reserved">this</span>.shortcuts, o;
+
+ <span class="reserved">for</span> (i=0; i<s.length; i++) {
+ o = s[i];
+ <span class="reserved">if</span> (o.alt == e.altKey && o.ctrl == e.ctrlKey && (o.keyCode == e.keyCode || o.charCode == e.charCode)) {
+ <span class="reserved">if</span> (o.cmd && (e.type == <span class="literal">"keydown"</span> || (e.type == <span class="literal">"keypress"</span> && !tinyMCE.isOpera)))
+ tinyMCE.execCommand(o.cmd, o.ui, o.val);
+
+ tinyMCE.cancelEvent(e);
+ <span class="reserved">return</span> true;
+ }
+ }
+
+ <span class="reserved">return</span> false;
+ },
+
+ <span class="comment">/**
+ * Auto resets the design mode of the document if it gets lost.
+ * This is a Gecko specific function since it's a workaround for a bug where Gecko browsers
+ * loose the designMode state if the editor is hidden and shown in a tab or div.
+ */</span>
+ autoResetDesignMode : <span class="reserved">function</span>() {
+ <span class="comment">// Add fix for tab/style.display none/block problems in Gecko</span>
+ <span class="reserved">if</span> (!tinyMCE.isMSIE && <span class="reserved">this</span>.isHidden() && tinyMCE.getParam(<span class="literal">'auto_reset_designmode'</span>))
+ eval(<span class="literal">'try { this.getDoc().designMode = "On"; } catch(e) {}'</span>);
+ },
+
+ <span class="comment">/**
+ * Returns if the instance is hidden or not. This is a Gecko specific function
+ * other browsers will always return false. This function is used to workaround the lost
+ * designMode bug in Gecko browsers.
+ *
+ * <span class="attrib">@return</span> Returns if the instance is hidden or not.
+ * <span class="attrib">@type</span> boolean
+ */</span>
+ isHidden : <span class="reserved">function</span>() {
+ <span class="reserved">if</span> (tinyMCE.isMSIE)
+ <span class="reserved">return</span> false;
+
+ var s = <span class="reserved">this</span>.getSel();
+
+ <span class="comment">// Weird, wheres that cursor selection?</span>
+ <span class="reserved">return</span> (!s || !s.rangeCount || s.rangeCount == 0);
+ },
+
+ <span class="comment">/**
+ * Returns true/false if the editor instance is dirty or not. In other words if it has been modified
+ * or not.
+ *
+ * <span class="attrib">@return</span> Editor instance dirty state.
+ * <span class="attrib">@type</span> boolean
+ */</span>
+ isDirty : <span class="reserved">function</span>() {
+ <span class="comment">// Is content modified and not in a submit procedure</span>
+ <span class="reserved">return</span> <span class="reserved">this</span>.startContent != tinyMCE.trim(<span class="reserved">this</span>.getBody().innerHTML) && !tinyMCE.isNotDirty;
+ },
+
+ <span class="comment">/**
+ * ..
+ *
+ * <span class="attrib">@private</span>
+ */</span>
+ _mergeElements : <span class="reserved">function</span>(scmd, pa, ch, override) {
+ <span class="reserved">if</span> (scmd == <span class="literal">"removeformat"</span>) {
+ pa.className = <span class="literal">""</span>;
+ pa.style.cssText = <span class="literal">""</span>;
+ ch.className = <span class="literal">""</span>;
+ ch.style.cssText = <span class="literal">""</span>;
+ <span class="reserved">return</span>;
+ }
+
+ var st = tinyMCE.parseStyle(tinyMCE.getAttrib(pa, <span class="literal">"style"</span>));
+ var stc = tinyMCE.parseStyle(tinyMCE.getAttrib(ch, <span class="literal">"style"</span>));
+ var className = tinyMCE.getAttrib(pa, <span class="literal">"class"</span>);
+
+ className += <span class="literal">" "</span> + tinyMCE.getAttrib(ch, <span class="literal">"class"</span>);
+
+ <span class="reserved">if</span> (override) {
+ <span class="reserved">for</span> (var n in st) {
+ <span class="reserved">if</span> (typeof(st[n]) == <span class="literal">'function'</span>)
+ continue;
+
+ stc[n] = st[n];
+ }
+ } <span class="reserved">else</span> {
+ <span class="reserved">for</span> (var n in stc) {
+ <span class="reserved">if</span> (typeof(stc[n]) == <span class="literal">'function'</span>)
+ continue;
+
+ st[n] = stc[n];
+ }
+ }
+
+ tinyMCE.setAttrib(pa, <span class="literal">"style"</span>, tinyMCE.serializeStyle(st));
+ tinyMCE.setAttrib(pa, <span class="literal">"class"</span>, tinyMCE.trim(className));
+ ch.className = <span class="literal">""</span>;
+ ch.style.cssText = <span class="literal">""</span>;
+ ch.removeAttribute(<span class="literal">"class"</span>);
+ ch.removeAttribute(<span class="literal">"style"</span>);
+ },
+
+ <span class="comment">/**
+ * Sets the useCSS mode in Gecko browsers. This will also remove the build in
+ * inline table editing controls since they are buggy when it comes to col/rowspans.
+ *
+ * <span class="attrib">@param</span> {boolean} b UseCSS state true/false.
+ * <span class="attrib">@private</span>
+ */</span>
+ _setUseCSS : <span class="reserved">function</span>(b) {
+ var d = <span class="reserved">this</span>.getDoc();
+
+ try {d.execCommand(<span class="literal">"useCSS"</span>, false, !b);} catch (ex) {}
+ try {d.execCommand(<span class="literal">"styleWithCSS"</span>, false, b);} catch (ex) {}
+
+ <span class="reserved">if</span> (!tinyMCE.getParam(<span class="literal">"table_inline_editing"</span>))
+ try {d.execCommand(<span class="literal">'enableInlineTableEditing'</span>, false, <span class="literal">"false"</span>);} catch (ex) {}
+
+ <span class="reserved">if</span> (!tinyMCE.getParam(<span class="literal">"object_resizing"</span>))
+ try {d.execCommand(<span class="literal">'enableObjectResizing'</span>, false, <span class="literal">"false"</span>);} catch (ex) {}
+ },
+
+ <span class="comment">/**
+ * Executes a command on the current instance. These commands can be TinyMCE internal commands prefixed with "mce" or
+ * they can be build in browser commands such as "Bold". A compleate list of browser commands is available on MSDN or Mozilla.org.
+ * This function will dispatch the execCommand function on each plugin, theme or the execcommand_callback option if none of these
+ * return true it will handle the command as a internal browser command.
+ *
+ * <span class="attrib">@param</span> {string} command Command name to execute, for example mceLink or Bold.
+ * <span class="attrib">@param</span> {boolean} user_interface True/false state if a UI (dialog) should be presented or not.
+ * <span class="attrib">@param</span> {mixed} value Optional command value, this can be anything.
+ */</span>
+ execCommand : <span class="reserved">function</span>(command, user_interface, value) {
+ var doc = <span class="reserved">this</span>.getDoc();
+ var win = <span class="reserved">this</span>.getWin();
+ var focusElm = <span class="reserved">this</span>.getFocusElement();
+
+ <span class="comment">// Is non udno specific command</span>
+ <span class="reserved">if</span> (!new RegExp(<span class="literal">'mceStartTyping|mceEndTyping|mceBeginUndoLevel|mceEndUndoLevel|mceAddUndoLevel'</span>, <span class="literal">'gi'</span>).test(command))
+ <span class="reserved">this</span>.undoBookmark = null;
+
+ <span class="reserved">if</span> (<span class="reserved">this</span>.lastSafariSelection && !new RegExp(<span class="literal">'mceStartTyping|mceEndTyping|mceBeginUndoLevel|mceEndUndoLevel|mceAddUndoLevel'</span>, <span class="literal">'gi'</span>).test(command)) {
+ <span class="reserved">this</span>.selection.moveToBookmark(<span class="reserved">this</span>.lastSafariSelection);
+ tinyMCE.selectedElement = <span class="reserved">this</span>.lastSafariSelectedElement;
+ }
+
+ <span class="comment">// Mozilla issue</span>
+ <span class="reserved">if</span> (!tinyMCE.isMSIE && !<span class="reserved">this</span>.useCSS) {
+ <span class="reserved">this</span>._setUseCSS(false);
+ <span class="reserved">this</span>.useCSS = true;
+ }
+
+ <span class="comment">//debug("command: " + command + ", user_interface: " + user_interface + ", value: " + value);</span>
+ <span class="reserved">this</span>.contentDocument = doc; <span class="comment">// <-- Strange, unless this is applied Mozilla 1.3 breaks</span>
+
+ <span class="reserved">if</span> (tinyMCE.execCommandCallback(<span class="reserved">this</span>, <span class="literal">'execcommand_callback'</span>, <span class="literal">'execCommand'</span>, <span class="reserved">this</span>.editorId, <span class="reserved">this</span>.getBody(), command, user_interface, value))
+ <span class="reserved">return</span>;
+
+ <span class="comment">// Fix align on images</span>
+ <span class="reserved">if</span> (focusElm && focusElm.nodeName == <span class="literal">"IMG"</span>) {
+ var align = focusElm.getAttribute(<span class="literal">'align'</span>);
+ var img = command == <span class="literal">"JustifyCenter"</span> ? focusElm.cloneNode(false) : focusElm;
+
+ switch (command) {
+ case <span class="literal">"JustifyLeft"</span>:
+ <span class="reserved">if</span> (align == <span class="literal">'left'</span>)
+ img.removeAttribute(<span class="literal">'align'</span>);
+ <span class="reserved">else</span>
+ img.setAttribute(<span class="literal">'align'</span>, <span class="literal">'left'</span>);
+
+ <span class="comment">// Remove the div</span>
+ var div = focusElm.parentNode;
+ <span class="reserved">if</span> (div && div.nodeName == <span class="literal">"DIV"</span> && div.childNodes.length == 1 && div.parentNode)
+ div.parentNode.replaceChild(img, div);
+
+ <span class="reserved">this</span>.selection.selectNode(img);
+ <span class="reserved">this</span>.repaint();
+ tinyMCE.triggerNodeChange();
+ <span class="reserved">return</span>;
+
+ case <span class="literal">"JustifyCenter"</span>:
+ img.removeAttribute(<span class="literal">'align'</span>);
+
+ <span class="comment">// Is centered</span>
+ var div = tinyMCE.getParentElement(focusElm, <span class="literal">"div"</span>);
+ <span class="reserved">if</span> (div && div.style.textAlign == <span class="literal">"center"</span>) {
+ <span class="comment">// Remove div</span>
+ <span class="reserved">if</span> (div.nodeName == <span class="literal">"DIV"</span> && div.childNodes.length == 1 && div.parentNode)
+ div.parentNode.replaceChild(img, div);
+ } <span class="reserved">else</span> {
+ <span class="comment">// Add div</span>
+ var div = <span class="reserved">this</span>.getDoc().createElement(<span class="literal">"div"</span>);
+ div.style.textAlign = <span class="literal">'center'</span>;
+ div.appendChild(img);
+ focusElm.parentNode.replaceChild(div, focusElm);
+ }
+
+ <span class="reserved">this</span>.selection.selectNode(img);
+ <span class="reserved">this</span>.repaint();
+ tinyMCE.triggerNodeChange();
+ <span class="reserved">return</span>;
+
+ case <span class="literal">"JustifyRight"</span>:
+ <span class="reserved">if</span> (align == <span class="literal">'right'</span>)
+ img.removeAttribute(<span class="literal">'align'</span>);
+ <span class="reserved">else</span>
+ img.setAttribute(<span class="literal">'align'</span>, <span class="literal">'right'</span>);
+
+ <span class="comment">// Remove the div</span>
+ var div = focusElm.parentNode;
+ <span class="reserved">if</span> (div && div.nodeName == <span class="literal">"DIV"</span> && div.childNodes.length == 1 && div.parentNode)
+ div.parentNode.replaceChild(img, div);
+
+ <span class="reserved">this</span>.selection.selectNode(img);
+ <span class="reserved">this</span>.repaint();
+ tinyMCE.triggerNodeChange();
+ <span class="reserved">return</span>;
+ }
+ }
+
+ <span class="reserved">if</span> (tinyMCE.settings[<span class="literal">'force_br_newlines'</span>]) {
+ var alignValue = <span class="literal">""</span>;
+
+ <span class="reserved">if</span> (doc.selection.type != <span class="literal">"Control"</span>) {
+ switch (command) {
+ case <span class="literal">"JustifyLeft"</span>:
+ alignValue = <span class="literal">"left"</span>;
+ break;
+
+ case <span class="literal">"JustifyCenter"</span>:
+ alignValue = <span class="literal">"center"</span>;
+ break;
+
+ case <span class="literal">"JustifyFull"</span>:
+ alignValue = <span class="literal">"justify"</span>;
+ break;
+
+ case <span class="literal">"JustifyRight"</span>:
+ alignValue = <span class="literal">"right"</span>;
+ break;
+ }
+
+ <span class="reserved">if</span> (alignValue != <span class="literal">""</span>) {
+ var rng = doc.selection.createRange();
+
+ <span class="reserved">if</span> ((divElm = tinyMCE.getParentElement(rng.parentElement(), <span class="literal">"div"</span>)) != null)
+ divElm.setAttribute(<span class="literal">"align"</span>, alignValue);
+ <span class="reserved">else</span> <span class="reserved">if</span> (rng.pasteHTML && rng.htmlText.length > 0)
+ rng.pasteHTML(<span class="literal">'<div align="'</span> + alignValue + <span class="literal">'">'</span> + rng.htmlText + <span class="literal">"</div>"</span>);
+
+ tinyMCE.triggerNodeChange();
+ <span class="reserved">return</span>;
+ }
+ }
+ }
+
+ switch (command) {
+ case <span class="literal">"mceRepaint"</span>:
+ <span class="reserved">this</span>.repaint();
+ <span class="reserved">return</span> true;
+
+ case <span class="literal">"InsertUnorderedList"</span>:
+ case <span class="literal">"InsertOrderedList"</span>:
+ var tag = (command == <span class="literal">"InsertUnorderedList"</span>) ? <span class="literal">"ul"</span> : <span class="literal">"ol"</span>;
+
+ <span class="reserved">if</span> (tinyMCE.isSafari)
+ <span class="reserved">this</span>.execCommand(<span class="literal">"mceInsertContent"</span>, false, <span class="literal">"<"</span> + tag + <span class="literal">"><li> </li><"</span> + tag + <span class="literal">">"</span>);
+ <span class="reserved">else</span>
+ <span class="reserved">this</span>.getDoc().execCommand(command, user_interface, value);
+
+ tinyMCE.triggerNodeChange();
+ break;
+
+ case <span class="literal">"Strikethrough"</span>:
+ <span class="reserved">if</span> (tinyMCE.isSafari)
+ <span class="reserved">this</span>.execCommand(<span class="literal">"mceInsertContent"</span>, false, <span class="literal">"<strike>"</span> + <span class="reserved">this</span>.selection.getSelectedHTML() + <span class="literal">"</strike>"</span>);
+ <span class="reserved">else</span>
+ <span class="reserved">this</span>.getDoc().execCommand(command, user_interface, value);
+
+ tinyMCE.triggerNodeChange();
+ break;
+
+ case <span class="literal">"mceSelectNode"</span>:
+ <span class="reserved">this</span>.selection.selectNode(value);
+ tinyMCE.triggerNodeChange();
+ tinyMCE.selectedNode = value;
+ break;
+
+ case <span class="literal">"FormatBlock"</span>:
+ <span class="reserved">if</span> (value == null || value == <span class="literal">""</span>) {
+ var elm = tinyMCE.getParentElement(<span class="reserved">this</span>.getFocusElement(), <span class="literal">"p,div,h1,h2,h3,h4,h5,h6,pre,address,blockquote,dt,dl,dd,samp"</span>);
+
+ <span class="reserved">if</span> (elm)
+ <span class="reserved">this</span>.execCommand(<span class="literal">"mceRemoveNode"</span>, false, elm);
+ } <span class="reserved">else</span> {
+ <span class="reserved">if</span> (tinyMCE.isGecko && new RegExp(<span class="literal">'<(div|blockquote|code|dt|dd|dl|samp)>'</span>, <span class="literal">'gi'</span>).test(value))
+ value = value.replace(/[^a-z]/gi, <span class="literal">''</span>);
+
+ <span class="reserved">if</span> (tinyMCE.isMSIE && new RegExp(<span class="literal">'blockquote|code|samp'</span>, <span class="literal">'gi'</span>).test(value)) {
+ var b = <span class="reserved">this</span>.selection.getBookmark();
+ <span class="reserved">this</span>.getDoc().execCommand(<span class="literal">"FormatBlock"</span>, false, <span class="literal">'<p>'</span>);
+ tinyMCE.renameElement(tinyMCE.getParentBlockElement(<span class="reserved">this</span>.getFocusElement()), value);
+ <span class="reserved">this</span>.selection.moveToBookmark(b);
+ } <span class="reserved">else</span>
+ <span class="reserved">this</span>.getDoc().execCommand(<span class="literal">"FormatBlock"</span>, false, value);
+ }
+
+ tinyMCE.triggerNodeChange();
+
+ break;
+
+ case <span class="literal">"mceRemoveNode"</span>:
+ <span class="reserved">if</span> (!value)
+ value = tinyMCE.getParentElement(<span class="reserved">this</span>.getFocusElement());
+
+ <span class="reserved">if</span> (tinyMCE.isMSIE) {
+ value.outerHTML = value.innerHTML;
+ } <span class="reserved">else</span> {
+ var rng = value.ownerDocument.createRange();
+ rng.setStartBefore(value);
+ rng.setEndAfter(value);
+ rng.deleteContents();
+ rng.insertNode(rng.createContextualFragment(value.innerHTML));
+ }
+
+ tinyMCE.triggerNodeChange();
+
+ break;
+
+ case <span class="literal">"mceSelectNodeDepth"</span>:
+ var parentNode = <span class="reserved">this</span>.getFocusElement();
+ <span class="reserved">for</span> (var i=0; parentNode; i++) {
+ <span class="reserved">if</span> (parentNode.nodeName.toLowerCase() == <span class="literal">"body"</span>)
+ break;
+
+ <span class="reserved">if</span> (parentNode.nodeName.toLowerCase() == <span class="literal">"#text"</span>) {
+ i--;
+ parentNode = parentNode.parentNode;
+ continue;
+ }
+
+ <span class="reserved">if</span> (i == value) {
+ <span class="reserved">this</span>.selection.selectNode(parentNode, false);
+ tinyMCE.triggerNodeChange();
+ tinyMCE.selectedNode = parentNode;
+ <span class="reserved">return</span>;
+ }
+
+ parentNode = parentNode.parentNode;
+ }
+
+ break;
+
+ case <span class="literal">"SetStyleInfo"</span>:
+ var rng = <span class="reserved">this</span>.getRng();
+ var sel = <span class="reserved">this</span>.getSel();
+ var scmd = value[<span class="literal">'command'</span>];
+ var sname = value[<span class="literal">'name'</span>];
+ var svalue = value[<span class="literal">'value'</span>] == null ? <span class="literal">''</span> : value[<span class="literal">'value'</span>];
+ <span class="comment">//var svalue = value['value'] == null ? '' : value['value'];</span>
+ var wrapper = value[<span class="literal">'wrapper'</span>] ? value[<span class="literal">'wrapper'</span>] : <span class="literal">"span"</span>;
+ var parentElm = null;
+ var invalidRe = new RegExp(<span class="literal">"^BODY|HTML$"</span>, <span class="literal">"g"</span>);
+ var invalidParentsRe = tinyMCE.settings[<span class="literal">'merge_styles_invalid_parents'</span>] != <span class="literal">''</span> ? new RegExp(tinyMCE.settings[<span class="literal">'merge_styles_invalid_parents'</span>], <span class="literal">"gi"</span>) : null;
+
+ <span class="comment">// Whole element selected check</span>
+ <span class="reserved">if</span> (tinyMCE.isMSIE) {
+ <span class="comment">// Control range</span>
+ <span class="reserved">if</span> (rng.item)
+ parentElm = rng.item(0);
+ <span class="reserved">else</span> {
+ var pelm = rng.parentElement();
+ var prng = doc.selection.createRange();
+ prng.moveToElementText(pelm);
+
+ <span class="reserved">if</span> (rng.htmlText == prng.htmlText || rng.boundingWidth == 0) {
+ <span class="reserved">if</span> (invalidParentsRe == null || !invalidParentsRe.test(pelm.nodeName))
+ parentElm = pelm;
+ }
+ }
+ } <span class="reserved">else</span> {
+ var felm = <span class="reserved">this</span>.getFocusElement();
+ <span class="reserved">if</span> (sel.isCollapsed || (new RegExp(<span class="literal">'td|tr|tbody|table'</span>, <span class="literal">'gi'</span>).test(felm.nodeName) && sel.anchorNode == felm.parentNode))
+ parentElm = felm;
+ }
+
+ <span class="comment">// Whole element selected</span>
+ <span class="reserved">if</span> (parentElm && !invalidRe.test(parentElm.nodeName)) {
+ <span class="reserved">if</span> (scmd == <span class="literal">"setstyle"</span>)
+ tinyMCE.setStyleAttrib(parentElm, sname, svalue);
+
+ <span class="reserved">if</span> (scmd == <span class="literal">"setattrib"</span>)
+ tinyMCE.setAttrib(parentElm, sname, svalue);
+
+ <span class="reserved">if</span> (scmd == <span class="literal">"removeformat"</span>) {
+ parentElm.style.cssText = <span class="literal">''</span>;
+ tinyMCE.setAttrib(parentElm, <span class="literal">'class'</span>, <span class="literal">''</span>);
+ }
+
+ <span class="comment">// Remove style/attribs from all children</span>
+ var ch = tinyMCE.getNodeTree(parentElm, new Array(), 1);
+ <span class="reserved">for</span> (var z=0; z<ch.length; z++) {
+ <span class="reserved">if</span> (ch[z] == parentElm)
+ continue;
+
+ <span class="reserved">if</span> (scmd == <span class="literal">"setstyle"</span>)
+ tinyMCE.setStyleAttrib(ch[z], sname, <span class="literal">''</span>);
+
+ <span class="reserved">if</span> (scmd == <span class="literal">"setattrib"</span>)
+ tinyMCE.setAttrib(ch[z], sname, <span class="literal">''</span>);
+
+ <span class="reserved">if</span> (scmd == <span class="literal">"removeformat"</span>) {
+ ch[z].style.cssText = <span class="literal">''</span>;
+ tinyMCE.setAttrib(ch[z], <span class="literal">'class'</span>, <span class="literal">''</span>);
+ }
+ }
+ } <span class="reserved">else</span> {
+ <span class="reserved">this</span>._setUseCSS(false); <span class="comment">// Bug in FF when running in fullscreen</span>
+ doc.execCommand(<span class="literal">"FontName"</span>, false, <span class="literal">"#mce_temp_font#"</span>);
+ var elementArray = tinyMCE.getElementsByAttributeValue(<span class="reserved">this</span>.getBody(), <span class="literal">"font"</span>, <span class="literal">"face"</span>, <span class="literal">"#mce_temp_font#"</span>);
+
+ <span class="comment">// Change them all</span>
+ <span class="reserved">for</span> (var x=0; x<elementArray.length; x++) {
+ elm = elementArray[x];
+ <span class="reserved">if</span> (elm) {
+ var spanElm = doc.createElement(wrapper);
+
+ <span class="reserved">if</span> (scmd == <span class="literal">"setstyle"</span>)
+ tinyMCE.setStyleAttrib(spanElm, sname, svalue);
+
+ <span class="reserved">if</span> (scmd == <span class="literal">"setattrib"</span>)
+ tinyMCE.setAttrib(spanElm, sname, svalue);
+
+ <span class="reserved">if</span> (scmd == <span class="literal">"removeformat"</span>) {
+ spanElm.style.cssText = <span class="literal">''</span>;
+ tinyMCE.setAttrib(spanElm, <span class="literal">'class'</span>, <span class="literal">''</span>);
+ }
+
+ <span class="reserved">if</span> (elm.hasChildNodes()) {
+ <span class="reserved">for</span> (var i=0; i<elm.childNodes.length; i++)
+ spanElm.appendChild(elm.childNodes[i].cloneNode(true));
+ }
+
+ spanElm.setAttribute(<span class="literal">"mce_new"</span>, <span class="literal">"true"</span>);
+ elm.parentNode.replaceChild(spanElm, elm);
+
+ <span class="comment">// Remove style/attribs from all children</span>
+ var ch = tinyMCE.getNodeTree(spanElm, new Array(), 1);
+ <span class="reserved">for</span> (var z=0; z<ch.length; z++) {
+ <span class="reserved">if</span> (ch[z] == spanElm)
+ continue;
+
+ <span class="reserved">if</span> (scmd == <span class="literal">"setstyle"</span>)
+ tinyMCE.setStyleAttrib(ch[z], sname, <span class="literal">''</span>);
+
+ <span class="reserved">if</span> (scmd == <span class="literal">"setattrib"</span>)
+ tinyMCE.setAttrib(ch[z], sname, <span class="literal">''</span>);
+
+ <span class="reserved">if</span> (scmd == <span class="literal">"removeformat"</span>) {
+ ch[z].style.cssText = <span class="literal">''</span>;
+ tinyMCE.setAttrib(ch[z], <span class="literal">'class'</span>, <span class="literal">''</span>);
+ }
+ }
+ }
+ }
+ }
+
+ <span class="comment">// Cleaup wrappers</span>
+ var nodes = doc.getElementsByTagName(wrapper);
+ <span class="reserved">for</span> (var i=nodes.length-1; i>=0; i--) {
+ var elm = nodes[i];
+ var isNew = tinyMCE.getAttrib(elm, <span class="literal">"mce_new"</span>) == <span class="literal">"true"</span>;
+
+ elm.removeAttribute(<span class="literal">"mce_new"</span>);
+
+ <span class="comment">// Is only child a element</span>
+ <span class="reserved">if</span> (elm.childNodes && elm.childNodes.length == 1 && elm.childNodes[0].nodeType == 1) {
+ <span class="comment">//tinyMCE.debug("merge1" + isNew);</span>
+ <span class="reserved">this</span>._mergeElements(scmd, elm, elm.childNodes[0], isNew);
+ continue;
+ }
+
+ <span class="comment">// Is I the only child</span>
+ <span class="reserved">if</span> (elm.parentNode.childNodes.length == 1 && !invalidRe.test(elm.nodeName) && !invalidRe.test(elm.parentNode.nodeName)) {
+ <span class="comment">//tinyMCE.debug("merge2" + isNew + "," + elm.nodeName + "," + elm.parentNode.nodeName);</span>
+ <span class="reserved">if</span> (invalidParentsRe == null || !invalidParentsRe.test(elm.parentNode.nodeName))
+ <span class="reserved">this</span>._mergeElements(scmd, elm.parentNode, elm, false);
+ }
+ }
+
+ <span class="comment">// Remove empty wrappers</span>
+ var nodes = doc.getElementsByTagName(wrapper);
+ <span class="reserved">for</span> (var i=nodes.length-1; i>=0; i--) {
+ var elm = nodes[i];
+ var isEmpty = true;
+
+ <span class="comment">// Check if it has any attribs</span>
+ var tmp = doc.createElement(<span class="literal">"body"</span>);
+ tmp.appendChild(elm.cloneNode(false));
+
+ <span class="comment">// Is empty span, remove it</span>
+ tmp.innerHTML = tmp.innerHTML.replace(new RegExp(<span class="literal">'style=""|class=""'</span>, <span class="literal">'gi'</span>), <span class="literal">''</span>);
+ <span class="comment">//tinyMCE.debug(tmp.innerHTML);</span>
+ <span class="reserved">if</span> (new RegExp(<span class="literal">'<span>'</span>, <span class="literal">'gi'</span>).test(tmp.innerHTML)) {
+ <span class="reserved">for</span> (var x=0; x<elm.childNodes.length; x++) {
+ <span class="reserved">if</span> (elm.parentNode != null)
+ elm.parentNode.insertBefore(elm.childNodes[x].cloneNode(true), elm);
+ }
+
+ elm.parentNode.removeChild(elm);
+ }
+ }
+
+ <span class="comment">// Re add the visual aids</span>
+ <span class="reserved">if</span> (scmd == <span class="literal">"removeformat"</span>)
+ tinyMCE.handleVisualAid(<span class="reserved">this</span>.getBody(), true, <span class="reserved">this</span>.visualAid, <span class="reserved">this</span>);
+
+ tinyMCE.triggerNodeChange();
+
+ break;
+
+ case <span class="literal">"FontName"</span>:
+ <span class="reserved">if</span> (value == null) {
+ var s = <span class="reserved">this</span>.getSel();
+
+ <span class="comment">// Find font and select it</span>
+ <span class="reserved">if</span> (tinyMCE.isGecko && s.isCollapsed) {
+ var f = tinyMCE.getParentElement(<span class="reserved">this</span>.getFocusElement(), <span class="literal">"font"</span>);
+
+ <span class="reserved">if</span> (f != null)
+ <span class="reserved">this</span>.selection.selectNode(f, false);
+ }
+
+ <span class="comment">// Remove format</span>
+ <span class="reserved">this</span>.getDoc().execCommand(<span class="literal">"RemoveFormat"</span>, false, null);
+
+ <span class="comment">// Collapse range if font was found</span>
+ <span class="reserved">if</span> (f != null && tinyMCE.isGecko) {
+ var r = <span class="reserved">this</span>.getRng().cloneRange();
+ r.collapse(true);
+ s.removeAllRanges();
+ s.addRange(r);
+ }
+ } <span class="reserved">else</span>
+ <span class="reserved">this</span>.getDoc().execCommand(<span class="literal">'FontName'</span>, false, value);
+
+ <span class="reserved">if</span> (tinyMCE.isGecko)
+ window.setTimeout(<span class="literal">'tinyMCE.triggerNodeChange(false);'</span>, 1);
+
+ <span class="reserved">return</span>;
+
+ case <span class="literal">"FontSize"</span>:
+ <span class="reserved">this</span>.getDoc().execCommand(<span class="literal">'FontSize'</span>, false, value);
+
+ <span class="reserved">if</span> (tinyMCE.isGecko)
+ window.setTimeout(<span class="literal">'tinyMCE.triggerNodeChange(false);'</span>, 1);
+
+ <span class="reserved">return</span>;
+
+ case <span class="literal">"forecolor"</span>:
+ <span class="reserved">this</span>.getDoc().execCommand(<span class="literal">'forecolor'</span>, false, value);
+ break;
+
+ case <span class="literal">"HiliteColor"</span>:
+ <span class="reserved">if</span> (tinyMCE.isGecko) {
+ <span class="reserved">this</span>._setUseCSS(true);
+ <span class="reserved">this</span>.getDoc().execCommand(<span class="literal">'hilitecolor'</span>, false, value);
+ <span class="reserved">this</span>._setUseCSS(false);
+ } <span class="reserved">else</span>
+ <span class="reserved">this</span>.getDoc().execCommand(<span class="literal">'BackColor'</span>, false, value);
+ break;
+
+ case <span class="literal">"Cut"</span>:
+ case <span class="literal">"Copy"</span>:
+ case <span class="literal">"Paste"</span>:
+ var cmdFailed = false;
+
+ <span class="comment">// Try executing command</span>
+ eval(<span class="literal">'try {this.getDoc().execCommand(command, user_interface, value);} catch (e) {cmdFailed = true;}'</span>);
+
+ <span class="reserved">if</span> (tinyMCE.isOpera && cmdFailed)
+ alert(<span class="literal">'Currently not supported by your browser, use keyboard shortcuts instead.'</span>);
+
+ <span class="comment">// Alert error in gecko if command failed</span>
+ <span class="reserved">if</span> (tinyMCE.isGecko && cmdFailed) {
+ <span class="comment">// Confirm more info</span>
+ <span class="reserved">if</span> (confirm(tinyMCE.entityDecode(tinyMCE.getLang(<span class="literal">'lang_clipboard_msg'</span>))))
+ window.open(<span class="literal">'http://www.mozilla.org/editor/midasdemo/securityprefs.html'</span>, <span class="literal">'mceExternal'</span>);
+
+ <span class="reserved">return</span>;
+ } <span class="reserved">else</span>
+ tinyMCE.triggerNodeChange();
+ break;
+
+ case <span class="literal">"mceSetContent"</span>:
+ <span class="reserved">if</span> (!value)
+ value = <span class="literal">""</span>;
+
+ <span class="comment">// Call custom cleanup code</span>
+ value = tinyMCE.storeAwayURLs(value);
+ value = tinyMCE._customCleanup(<span class="reserved">this</span>, <span class="literal">"insert_to_editor"</span>, value);
+ tinyMCE._setHTML(doc, value);
+ tinyMCE.setInnerHTML(doc.body, tinyMCE._cleanupHTML(<span class="reserved">this</span>, doc, tinyMCE.settings, doc.body));
+ tinyMCE.convertAllRelativeURLs(doc.body);
+
+ <span class="comment">// Cleanup any mess left from storyAwayURLs</span>
+ tinyMCE._removeInternal(<span class="reserved">this</span>.getBody());
+
+ <span class="comment">// When editing always use fonts internaly</span>
+ <span class="reserved">if</span> (tinyMCE.getParam(<span class="literal">"convert_fonts_to_spans"</span>))
+ tinyMCE.convertSpansToFonts(doc);
+
+ tinyMCE.handleVisualAid(doc.body, true, <span class="reserved">this</span>.visualAid, <span class="reserved">this</span>);
+ tinyMCE._setEventsEnabled(doc.body, false);
+ <span class="reserved">return</span> true;
+
+ case <span class="literal">"mceCleanup"</span>:
+ var b = <span class="reserved">this</span>.selection.getBookmark();
+ tinyMCE._setHTML(<span class="reserved">this</span>.contentDocument, <span class="reserved">this</span>.getBody().innerHTML);
+ tinyMCE.setInnerHTML(<span class="reserved">this</span>.getBody(), tinyMCE._cleanupHTML(<span class="reserved">this</span>, <span class="reserved">this</span>.contentDocument, <span class="reserved">this</span>.settings, <span class="reserved">this</span>.getBody(), <span class="reserved">this</span>.visualAid));
+ tinyMCE.convertAllRelativeURLs(doc.body);
+
+ <span class="comment">// When editing always use fonts internaly</span>
+ <span class="reserved">if</span> (tinyMCE.getParam(<span class="literal">"convert_fonts_to_spans"</span>))
+ tinyMCE.convertSpansToFonts(doc);
+
+ tinyMCE.handleVisualAid(<span class="reserved">this</span>.getBody(), true, <span class="reserved">this</span>.visualAid, <span class="reserved">this</span>);
+ tinyMCE._setEventsEnabled(<span class="reserved">this</span>.getBody(), false);
+ <span class="reserved">this</span>.repaint();
+ <span class="reserved">this</span>.selection.moveToBookmark(b);
+ tinyMCE.triggerNodeChange();
+ break;
+
+ case <span class="literal">"mceReplaceContent"</span>:
+ <span class="comment">// Force empty string</span>
+ <span class="reserved">if</span> (!value)
+ value = <span class="literal">''</span>;
+
+ <span class="reserved">this</span>.getWin().focus();
+
+ var selectedText = <span class="literal">""</span>;
+
+ <span class="reserved">if</span> (tinyMCE.isMSIE) {
+ var rng = doc.selection.createRange();
+ selectedText = rng.text;
+ } <span class="reserved">else</span>
+ selectedText = <span class="reserved">this</span>.getSel().toString();
+
+ <span class="reserved">if</span> (selectedText.length > 0) {
+ value = tinyMCE.replaceVar(value, <span class="literal">"selection"</span>, selectedText);
+ tinyMCE.execCommand(<span class="literal">'mceInsertContent'</span>, false, value);
+ }
+
+ tinyMCE.triggerNodeChange();
+ break;
+
+ case <span class="literal">"mceSetAttribute"</span>:
+ <span class="reserved">if</span> (typeof(value) == <span class="literal">'object'</span>) {
+ var targetElms = (typeof(value[<span class="literal">'targets'</span>]) == <span class="literal">"undefined"</span>) ? <span class="literal">"p,img,span,div,td,h1,h2,h3,h4,h5,h6,pre,address"</span> : value[<span class="literal">'targets'</span>];
+ var targetNode = tinyMCE.getParentElement(<span class="reserved">this</span>.getFocusElement(), targetElms);
+
+ <span class="reserved">if</span> (targetNode) {
+ targetNode.setAttribute(value[<span class="literal">'name'</span>], value[<span class="literal">'value'</span>]);
+ tinyMCE.triggerNodeChange();
+ }
+ }
+ break;
+
+ case <span class="literal">"mceSetCSSClass"</span>:
+ <span class="reserved">this</span>.execCommand(<span class="literal">"SetStyleInfo"</span>, false, {command : <span class="literal">"setattrib"</span>, name : <span class="literal">"class"</span>, value : value});
+ break;
+
+ case <span class="literal">"mceInsertRawHTML"</span>:
+ var key = <span class="literal">'tiny_mce_marker'</span>;
+
+ <span class="reserved">this</span>.execCommand(<span class="literal">'mceBeginUndoLevel'</span>);
+
+ <span class="comment">// Insert marker key</span>
+ <span class="reserved">this</span>.execCommand(<span class="literal">'mceInsertContent'</span>, false, key);
+
+ <span class="comment">// Store away scroll pos</span>
+ var scrollX = <span class="reserved">this</span>.getDoc().body.scrollLeft + <span class="reserved">this</span>.getDoc().documentElement.scrollLeft;
+ var scrollY = <span class="reserved">this</span>.getDoc().body.scrollTop + <span class="reserved">this</span>.getDoc().documentElement.scrollTop;
+
+ <span class="comment">// Find marker and replace with RAW HTML</span>
+ var html = <span class="reserved">this</span>.getBody().innerHTML;
+ <span class="reserved">if</span> ((pos = html.indexOf(key)) != -1)
+ tinyMCE.setInnerHTML(<span class="reserved">this</span>.getBody(), html.substring(0, pos) + value + html.substring(pos + key.length));
+
+ <span class="comment">// Restore scoll pos</span>
+ <span class="reserved">this</span>.contentWindow.scrollTo(scrollX, scrollY);
+
+ <span class="reserved">this</span>.execCommand(<span class="literal">'mceEndUndoLevel'</span>);
+
+ break;
+
+ case <span class="literal">"mceInsertContent"</span>:
+ <span class="comment">// Force empty string</span>
+ <span class="reserved">if</span> (!value)
+ value = <span class="literal">''</span>;
+
+ var insertHTMLFailed = false;
+ <span class="reserved">this</span>.getWin().focus();
+
+ <span class="reserved">if</span> (tinyMCE.isGecko || tinyMCE.isOpera) {
+ try {
+ <span class="comment">// Is plain text or HTML, &, etc will be encoded wrong in FF</span>
+ <span class="reserved">if</span> (value.indexOf(<span class="literal">'<'</span>) == -1 && !value.match(/(&| |<|>)/g)) {
+ var r = <span class="reserved">this</span>.getRng();
+ var n = <span class="reserved">this</span>.getDoc().createTextNode(tinyMCE.entityDecode(value));
+ var s = <span class="reserved">this</span>.getSel();
+ var r2 = r.cloneRange();
+
+ <span class="comment">// Insert text at cursor position</span>
+ s.removeAllRanges();
+ r.deleteContents();
+ r.insertNode(n);
+
+ <span class="comment">// Move the cursor to the end of text</span>
+ r2.selectNode(n);
+ r2.collapse(false);
+ s.removeAllRanges();
+ s.addRange(r2);
+ } <span class="reserved">else</span> {
+ value = tinyMCE.fixGeckoBaseHREFBug(1, <span class="reserved">this</span>.getDoc(), value);
+ <span class="reserved">this</span>.getDoc().execCommand(<span class="literal">'inserthtml'</span>, false, value);
+ tinyMCE.fixGeckoBaseHREFBug(2, <span class="reserved">this</span>.getDoc(), value);
+ }
+ } catch (ex) {
+ insertHTMLFailed = true;
+ }
+
+ <span class="reserved">if</span> (!insertHTMLFailed) {
+ tinyMCE.triggerNodeChange();
+ <span class="reserved">return</span>;
+ }
+ }
+
+ <span class="comment">// Ugly hack in Opera due to non working "inserthtml"</span>
+ <span class="reserved">if</span> (tinyMCE.isOpera && insertHTMLFailed) {
+ <span class="reserved">this</span>.getDoc().execCommand(<span class="literal">"insertimage"</span>, false, tinyMCE.uniqueURL);
+ var ar = tinyMCE.getElementsByAttributeValue(<span class="reserved">this</span>.getBody(), <span class="literal">"img"</span>, <span class="literal">"src"</span>, tinyMCE.uniqueURL);
+ ar[0].outerHTML = value;
+ <span class="reserved">return</span>;
+ }
+
+ <span class="reserved">if</span> (!tinyMCE.isMSIE) {
+ var isHTML = value.indexOf(<span class="literal">'<'</span>) != -1;
+ var sel = <span class="reserved">this</span>.getSel();
+ var rng = <span class="reserved">this</span>.getRng();
+
+ <span class="reserved">if</span> (isHTML) {
+ <span class="reserved">if</span> (tinyMCE.isSafari) {
+ var tmpRng = <span class="reserved">this</span>.getDoc().createRange();
+
+ tmpRng.setStart(<span class="reserved">this</span>.getBody(), 0);
+ tmpRng.setEnd(<span class="reserved">this</span>.getBody(), 0);
+
+ value = tmpRng.createContextualFragment(value);
+ } <span class="reserved">else</span>
+ value = rng.createContextualFragment(value);
+ } <span class="reserved">else</span> {
+ <span class="comment">// Setup text node</span>
+ var el = document.createElement(<span class="literal">"div"</span>);
+ el.innerHTML = value;
+ value = el.firstChild.nodeValue;
+ value = doc.createTextNode(value);
+ }
+
+ <span class="comment">// Insert plain text in Safari</span>
+ <span class="reserved">if</span> (tinyMCE.isSafari && !isHTML) {
+ <span class="reserved">this</span>.execCommand(<span class="literal">'InsertText'</span>, false, value.nodeValue);
+ tinyMCE.triggerNodeChange();
+ <span class="reserved">return</span> true;
+ } <span class="reserved">else</span> <span class="reserved">if</span> (tinyMCE.isSafari && isHTML) {
+ rng.deleteContents();
+ rng.insertNode(value);
+ tinyMCE.triggerNodeChange();
+ <span class="reserved">return</span> true;
+ }
+
+ rng.deleteContents();
+
+ <span class="comment">// If target node is text do special treatment, (Mozilla 1.3 fix)</span>
+ <span class="reserved">if</span> (rng.startContainer.nodeType == 3) {
+ var node = rng.startContainer.splitText(rng.startOffset);
+ node.parentNode.insertBefore(value, node);
+ } <span class="reserved">else</span>
+ rng.insertNode(value);
+
+ <span class="reserved">if</span> (!isHTML) {
+ <span class="comment">// Removes weird selection trails</span>
+ sel.selectAllChildren(doc.body);
+ sel.removeAllRanges();
+
+ <span class="comment">// Move cursor to end of content</span>
+ var rng = doc.createRange();
+
+ rng.selectNode(value);
+ rng.collapse(false);
+
+ sel.addRange(rng);
+ } <span class="reserved">else</span>
+ rng.collapse(false);
+
+ tinyMCE.fixGeckoBaseHREFBug(2, <span class="reserved">this</span>.getDoc(), value);
+ } <span class="reserved">else</span> {
+ var rng = doc.selection.createRange();
+ var c = value.indexOf(<span class="literal">'<!--'</span>) != -1;
+
+ <span class="comment">// Fix comment bug, add tag before comments</span>
+ <span class="reserved">if</span> (c)
+ value = tinyMCE.uniqueTag + value;
+
+ <span class="reserved">if</span> (rng.item)
+ rng.item(0).outerHTML = value;
+ <span class="reserved">else</span>
+ rng.pasteHTML(value);
+
+ <span class="comment">// Remove unique tag</span>
+ <span class="reserved">if</span> (c) {
+ var e = <span class="reserved">this</span>.getDoc().getElementById(<span class="literal">'mceTMPElement'</span>);
+ e.parentNode.removeChild(e);
+ }
+ }
+
+ tinyMCE.triggerNodeChange();
+ break;
+
+ case <span class="literal">"mceStartTyping"</span>:
+ <span class="reserved">if</span> (tinyMCE.settings[<span class="literal">'custom_undo_redo'</span>] && <span class="reserved">this</span>.undoRedo.typingUndoIndex == -1) {
+ <span class="reserved">this</span>.undoRedo.typingUndoIndex = <span class="reserved">this</span>.undoRedo.undoIndex;
+ <span class="reserved">this</span>.execCommand(<span class="literal">'mceAddUndoLevel'</span>);
+ <span class="comment">//tinyMCE.debug("mceStartTyping");</span>
+ }
+ break;
+
+ case <span class="literal">"mceEndTyping"</span>:
+ <span class="reserved">if</span> (tinyMCE.settings[<span class="literal">'custom_undo_redo'</span>] && <span class="reserved">this</span>.undoRedo.typingUndoIndex != -1) {
+ <span class="reserved">this</span>.execCommand(<span class="literal">'mceAddUndoLevel'</span>);
+ <span class="reserved">this</span>.undoRedo.typingUndoIndex = -1;
+ <span class="comment">//tinyMCE.debug("mceEndTyping");</span>
+ }
+ break;
+
+ case <span class="literal">"mceBeginUndoLevel"</span>:
+ <span class="reserved">this</span>.undoRedoLevel = false;
+ break;
+
+ case <span class="literal">"mceEndUndoLevel"</span>:
+ <span class="reserved">this</span>.undoRedoLevel = true;
+ <span class="reserved">this</span>.execCommand(<span class="literal">'mceAddUndoLevel'</span>);
+ break;
+
+ case <span class="literal">"mceAddUndoLevel"</span>:
+ <span class="reserved">if</span> (tinyMCE.settings[<span class="literal">'custom_undo_redo'</span>] && <span class="reserved">this</span>.undoRedoLevel) {
+ <span class="reserved">if</span> (<span class="reserved">this</span>.undoRedo.add())
+ tinyMCE.triggerNodeChange(false);
+ }
+ break;
+
+ case <span class="literal">"Undo"</span>:
+ <span class="reserved">if</span> (tinyMCE.settings[<span class="literal">'custom_undo_redo'</span>]) {
+ tinyMCE.execCommand(<span class="literal">"mceEndTyping"</span>);
+ <span class="reserved">this</span>.undoRedo.undo();
+ tinyMCE.triggerNodeChange();
+ } <span class="reserved">else</span>
+ <span class="reserved">this</span>.getDoc().execCommand(command, user_interface, value);
+ break;
+
+ case <span class="literal">"Redo"</span>:
+ <span class="reserved">if</span> (tinyMCE.settings[<span class="literal">'custom_undo_redo'</span>]) {
+ tinyMCE.execCommand(<span class="literal">"mceEndTyping"</span>);
+ <span class="reserved">this</span>.undoRedo.redo();
+ tinyMCE.triggerNodeChange();
+ } <span class="reserved">else</span>
+ <span class="reserved">this</span>.getDoc().execCommand(command, user_interface, value);
+ break;
+
+ case <span class="literal">"mceToggleVisualAid"</span>:
+ <span class="reserved">this</span>.visualAid = !<span class="reserved">this</span>.visualAid;
+ tinyMCE.handleVisualAid(<span class="reserved">this</span>.getBody(), true, <span class="reserved">this</span>.visualAid, <span class="reserved">this</span>);
+ tinyMCE.triggerNodeChange();
+ break;
+
+ case <span class="literal">"Indent"</span>:
+ <span class="reserved">this</span>.getDoc().execCommand(command, user_interface, value);
+ tinyMCE.triggerNodeChange();
+ <span class="reserved">if</span> (tinyMCE.isMSIE) {
+ var n = tinyMCE.getParentElement(<span class="reserved">this</span>.getFocusElement(), <span class="literal">"blockquote"</span>);
+ do {
+ <span class="reserved">if</span> (n && n.nodeName == <span class="literal">"BLOCKQUOTE"</span>) {
+ n.removeAttribute(<span class="literal">"dir"</span>);
+ n.removeAttribute(<span class="literal">"style"</span>);
+ }
+ } <span class="reserved">while</span> (n != null && (n = n.parentNode) != null);
+ }
+ break;
+
+ case <span class="literal">"removeformat"</span>:
+ var text = <span class="reserved">this</span>.selection.getSelectedText();
+
+ <span class="reserved">if</span> (tinyMCE.isOpera) {
+ <span class="reserved">this</span>.getDoc().execCommand(<span class="literal">"RemoveFormat"</span>, false, null);
+ <span class="reserved">return</span>;
+ }
+
+ <span class="reserved">if</span> (tinyMCE.isMSIE) {
+ try {
+ var rng = doc.selection.createRange();
+ rng.execCommand(<span class="literal">"RemoveFormat"</span>, false, null);
+ } catch (e) {
+ <span class="comment">// Do nothing</span>
+ }
+
+ <span class="reserved">this</span>.execCommand(<span class="literal">"SetStyleInfo"</span>, false, {command : <span class="literal">"removeformat"</span>});
+ } <span class="reserved">else</span> {
+ <span class="reserved">this</span>.getDoc().execCommand(command, user_interface, value);
+
+ <span class="reserved">this</span>.execCommand(<span class="literal">"SetStyleInfo"</span>, false, {command : <span class="literal">"removeformat"</span>});
+ }
+
+ <span class="comment">// Remove class</span>
+ <span class="reserved">if</span> (text.length == 0)
+ <span class="reserved">this</span>.execCommand(<span class="literal">"mceSetCSSClass"</span>, false, <span class="literal">""</span>);
+
+ tinyMCE.triggerNodeChange();
+ break;
+
+ default:
+ <span class="reserved">this</span>.getDoc().execCommand(command, user_interface, value);
+
+ <span class="reserved">if</span> (tinyMCE.isGecko)
+ window.setTimeout(<span class="literal">'tinyMCE.triggerNodeChange(false);'</span>, 1);
+ <span class="reserved">else</span>
+ tinyMCE.triggerNodeChange();
+ }
+
+ <span class="comment">// Add undo level after modification</span>
+ <span class="reserved">if</span> (command != <span class="literal">"mceAddUndoLevel"</span> && command != <span class="literal">"Undo"</span> && command != <span class="literal">"Redo"</span> && command != <span class="literal">"mceStartTyping"</span> && command != <span class="literal">"mceEndTyping"</span>)
+ tinyMCE.execCommand(<span class="literal">"mceAddUndoLevel"</span>);
+ },
+
+ <span class="comment">/**
+ * Returns a command specific value, for example the current font size.
+ *
+ * <span class="attrib">@param</span> {string} c Command to query value from.
+ * <span class="attrib">@return</span> Command specific value, for example the current font size.
+ * <span class="attrib">@type</span> mixed
+ */</span>
+ queryCommandValue : <span class="reserved">function</span>(c) {
+ try {
+ <span class="reserved">return</span> <span class="reserved">this</span>.getDoc().queryCommandValue(c);
+ } catch (e) {
+ <span class="reserved">return</span> null;
+ }
+ },
+
+ <span class="comment">/**
+ * Returns a command specific state, for example if bold is enabled or not.
+ *
+ * <span class="attrib">@param</span> {string} c Command to query state from.
+ * <span class="attrib">@return</span> Command specific state, for example if bold is enabled or not.
+ * <span class="attrib">@type</span> boolean
+ */</span>
+ queryCommandState : <span class="reserved">function</span>(c) {
+ <span class="reserved">return</span> <span class="reserved">this</span>.getDoc().queryCommandState(c);
+ },
+
+ <span class="comment">/**
+ * Gets executed when the editor control instance is added.
+ *
+ * <span class="attrib">@param</span> {HTMLElement} replace_element Element to replace with a editor instance.
+ * <span class="attrib">@param</span> {string} form_element_name Form element name that gets replaced.
+ * <span class="attrib">@param</span> {DOMDocument} target_document Target document reference where the element is located.
+ * <span class="attrib">@private</span>
+ */</span>
+ _onAdd : <span class="reserved">function</span>(replace_element, form_element_name, target_document) {
+ var hc, th, to, editorTemplate;
+
+ th = <span class="reserved">this</span>.settings[<span class="literal">'theme'</span>];
+ to = tinyMCE.themes[th];
+
+ var targetDoc = target_document ? target_document : document;
+
+ <span class="reserved">this</span>.targetDoc = targetDoc;
+
+ tinyMCE.themeURL = tinyMCE.baseURL + <span class="literal">"/themes/"</span> + <span class="reserved">this</span>.settings[<span class="literal">'theme'</span>];
+ <span class="reserved">this</span>.settings[<span class="literal">'themeurl'</span>] = tinyMCE.themeURL;
+
+ <span class="reserved">if</span> (!replace_element) {
+ alert(<span class="literal">"Error: Could not find the target element."</span>);
+ <span class="reserved">return</span> false;
+ }
+
+ <span class="reserved">if</span> (to.getEditorTemplate)
+ editorTemplate = to.getEditorTemplate(<span class="reserved">this</span>.settings, <span class="reserved">this</span>.editorId);
+
+ var deltaWidth = editorTemplate[<span class="literal">'delta_width'</span>] ? editorTemplate[<span class="literal">'delta_width'</span>] : 0;
+ var deltaHeight = editorTemplate[<span class="literal">'delta_height'</span>] ? editorTemplate[<span class="literal">'delta_height'</span>] : 0;
+ var html = <span class="literal">'<span id="'</span> + <span class="reserved">this</span>.editorId + <span class="literal">'_parent" class="mceEditorContainer">'</span> + editorTemplate[<span class="literal">'html'</span>];
+
+ html = tinyMCE.replaceVar(html, <span class="literal">"editor_id"</span>, <span class="reserved">this</span>.editorId);
+ <span class="reserved">this</span>.settings[<span class="literal">'default_document'</span>] = tinyMCE.baseURL + <span class="literal">"/blank.htm"</span>;
+
+ <span class="reserved">this</span>.settings[<span class="literal">'old_width'</span>] = <span class="reserved">this</span>.settings[<span class="literal">'width'</span>];
+ <span class="reserved">this</span>.settings[<span class="literal">'old_height'</span>] = <span class="reserved">this</span>.settings[<span class="literal">'height'</span>];
+
+ <span class="comment">// Set default width, height</span>
+ <span class="reserved">if</span> (<span class="reserved">this</span>.settings[<span class="literal">'width'</span>] == -1)
+ <span class="reserved">this</span>.settings[<span class="literal">'width'</span>] = replace_element.offsetWidth;
+
+ <span class="reserved">if</span> (<span class="reserved">this</span>.settings[<span class="literal">'height'</span>] == -1)
+ <span class="reserved">this</span>.settings[<span class="literal">'height'</span>] = replace_element.offsetHeight;
+
+ <span class="comment">// Try the style width</span>
+ <span class="reserved">if</span> (<span class="reserved">this</span>.settings[<span class="literal">'width'</span>] == 0)
+ <span class="reserved">this</span>.settings[<span class="literal">'width'</span>] = replace_element.style.width;
+
+ <span class="comment">// Try the style height</span>
+ <span class="reserved">if</span> (<span class="reserved">this</span>.settings[<span class="literal">'height'</span>] == 0)
+ <span class="reserved">this</span>.settings[<span class="literal">'height'</span>] = replace_element.style.height;
+
+ <span class="comment">// If no width/height then default to 320x240, better than nothing</span>
+ <span class="reserved">if</span> (<span class="reserved">this</span>.settings[<span class="literal">'width'</span>] == 0)
+ <span class="reserved">this</span>.settings[<span class="literal">'width'</span>] = 320;
+
+ <span class="reserved">if</span> (<span class="reserved">this</span>.settings[<span class="literal">'height'</span>] == 0)
+ <span class="reserved">this</span>.settings[<span class="literal">'height'</span>] = 240;
+
+ <span class="reserved">this</span>.settings[<span class="literal">'area_width'</span>] = parseInt(<span class="reserved">this</span>.settings[<span class="literal">'width'</span>]);
+ <span class="reserved">this</span>.settings[<span class="literal">'area_height'</span>] = parseInt(<span class="reserved">this</span>.settings[<span class="literal">'height'</span>]);
+ <span class="reserved">this</span>.settings[<span class="literal">'area_width'</span>] += deltaWidth;
+ <span class="reserved">this</span>.settings[<span class="literal">'area_height'</span>] += deltaHeight;
+
+ <span class="comment">// Special % handling</span>
+ <span class="reserved">if</span> ((<span class="literal">""</span> + <span class="reserved">this</span>.settings[<span class="literal">'width'</span>]).indexOf(<span class="literal">'%'</span>) != -1)
+ <span class="reserved">this</span>.settings[<span class="literal">'area_width'</span>] = <span class="literal">"100%"</span>;
+
+ <span class="reserved">if</span> ((<span class="literal">""</span> + <span class="reserved">this</span>.settings[<span class="literal">'height'</span>]).indexOf(<span class="literal">'%'</span>) != -1)
+ <span class="reserved">this</span>.settings[<span class="literal">'area_height'</span>] = <span class="literal">"100%"</span>;
+
+ <span class="reserved">if</span> ((<span class="literal">""</span> + replace_element.style.width).indexOf(<span class="literal">'%'</span>) != -1) {
+ <span class="reserved">this</span>.settings[<span class="literal">'width'</span>] = replace_element.style.width;
+ <span class="reserved">this</span>.settings[<span class="literal">'area_width'</span>] = <span class="literal">"100%"</span>;
+ }
+
+ <span class="reserved">if</span> ((<span class="literal">""</span> + replace_element.style.height).indexOf(<span class="literal">'%'</span>) != -1) {
+ <span class="reserved">this</span>.settings[<span class="literal">'height'</span>] = replace_element.style.height;
+ <span class="reserved">this</span>.settings[<span class="literal">'area_height'</span>] = <span class="literal">"100%"</span>;
+ }
+
+ html = tinyMCE.applyTemplate(html);
+
+ <span class="reserved">this</span>.settings[<span class="literal">'width'</span>] = <span class="reserved">this</span>.settings[<span class="literal">'old_width'</span>];
+ <span class="reserved">this</span>.settings[<span class="literal">'height'</span>] = <span class="reserved">this</span>.settings[<span class="literal">'old_height'</span>];
+
+ <span class="reserved">this</span>.visualAid = <span class="reserved">this</span>.settings[<span class="literal">'visual'</span>];
+ <span class="reserved">this</span>.formTargetElementId = form_element_name;
+
+ <span class="comment">// Get replace_element contents</span>
+ <span class="reserved">if</span> (replace_element.nodeName == <span class="literal">"TEXTAREA"</span> || replace_element.nodeName == <span class="literal">"INPUT"</span>)
+ <span class="reserved">this</span>.startContent = replace_element.value;
+ <span class="reserved">else</span>
+ <span class="reserved">this</span>.startContent = replace_element.innerHTML;
+
+ <span class="comment">// If not text area or input</span>
+ <span class="reserved">if</span> (replace_element.nodeName != <span class="literal">"TEXTAREA"</span> && replace_element.nodeName != <span class="literal">"INPUT"</span>) {
+ <span class="reserved">this</span>.oldTargetElement = replace_element;
+
+ <span class="comment">// Debug mode</span>
+ <span class="reserved">if</span> (tinyMCE.settings[<span class="literal">'debug'</span>]) {
+ hc = <span class="literal">'<textarea wrap="off" id="'</span> + form_element_name + <span class="literal">'" name="'</span> + form_element_name + <span class="literal">'" cols="100" rows="15"></textarea>'</span>;
+ } <span class="reserved">else</span> {
+ hc = <span class="literal">'<input type="hidden" type="text" id="'</span> + form_element_name + <span class="literal">'" name="'</span> + form_element_name + <span class="literal">'" />'</span>;
+ <span class="reserved">this</span>.oldTargetElement.style.display = <span class="literal">"none"</span>;
+ }
+
+ html += <span class="literal">'</span>'</span>;
+
+ <span class="reserved">if</span> (tinyMCE.isGecko)
+ html = hc + html;
+ <span class="reserved">else</span>
+ html += hc;
+
+ <span class="comment">// Output HTML and set editable</span>
+ <span class="reserved">if</span> (tinyMCE.isGecko) {
+ var rng = replace_element.ownerDocument.createRange();
+ rng.setStartBefore(replace_element);
+
+ var fragment = rng.createContextualFragment(html);
+ tinyMCE.insertAfter(fragment, replace_element);
+ } <span class="reserved">else</span>
+ replace_element.insertAdjacentHTML(<span class="literal">"beforeBegin"</span>, html);
+ } <span class="reserved">else</span> {
+ html += <span class="literal">'</span>'</span>;
+
+ <span class="comment">// Just hide the textarea element</span>
+ <span class="reserved">this</span>.oldTargetElement = replace_element;
+
+ <span class="reserved">if</span> (!tinyMCE.settings[<span class="literal">'debug'</span>])
+ <span class="reserved">this</span>.oldTargetElement.style.display = <span class="literal">"none"</span>;
+
+ <span class="comment">// Output HTML and set editable</span>
+ <span class="reserved">if</span> (tinyMCE.isGecko) {
+ var rng = replace_element.ownerDocument.createRange();
+ rng.setStartBefore(replace_element);
+
+ var fragment = rng.createContextualFragment(html);
+ tinyMCE.insertAfter(fragment, replace_element);
+ } <span class="reserved">else</span>
+ replace_element.insertAdjacentHTML(<span class="literal">"beforeBegin"</span>, html);
+ }
+
+ <span class="comment">// Setup iframe</span>
+ var dynamicIFrame = false;
+ var tElm = targetDoc.getElementById(<span class="reserved">this</span>.editorId);
+
+ <span class="reserved">if</span> (!tinyMCE.isMSIE) {
+ <span class="reserved">if</span> (tElm && tElm.nodeName == <span class="literal">"SPAN"</span>) {
+ tElm = tinyMCE._createIFrame(tElm, targetDoc);
+ dynamicIFrame = true;
+ }
+
+ <span class="reserved">this</span>.targetElement = tElm;
+ <span class="reserved">this</span>.iframeElement = tElm;
+ <span class="reserved">this</span>.contentDocument = tElm.contentDocument;
+ <span class="reserved">this</span>.contentWindow = tElm.contentWindow;
+
+ <span class="comment">//this.getDoc().designMode = "on";</span>
+ } <span class="reserved">else</span> {
+ <span class="reserved">if</span> (tElm && tElm.nodeName == <span class="literal">"SPAN"</span>)
+ tElm = tinyMCE._createIFrame(tElm, targetDoc, targetDoc.parentWindow);
+ <span class="reserved">else</span>
+ tElm = targetDoc.frames[<span class="reserved">this</span>.editorId];
+
+ <span class="reserved">this</span>.targetElement = tElm;
+ <span class="reserved">this</span>.iframeElement = targetDoc.getElementById(<span class="reserved">this</span>.editorId);
+
+ <span class="reserved">if</span> (tinyMCE.isOpera) {
+ <span class="reserved">this</span>.contentDocument = <span class="reserved">this</span>.iframeElement.contentDocument;
+ <span class="reserved">this</span>.contentWindow = <span class="reserved">this</span>.iframeElement.contentWindow;
+ dynamicIFrame = true;
+ } <span class="reserved">else</span> {
+ <span class="reserved">this</span>.contentDocument = tElm.window.document;
+ <span class="reserved">this</span>.contentWindow = tElm.window;
+ }
+
+ <span class="reserved">this</span>.getDoc().designMode = <span class="literal">"on"</span>;
+ }
+
+ <span class="comment">// Setup base HTML</span>
+ var doc = <span class="reserved">this</span>.contentDocument;
+ <span class="reserved">if</span> (dynamicIFrame) {
+ var html = tinyMCE.getParam(<span class="literal">'doctype'</span>) + <span class="literal">'<html><head xmlns="http://www.w3.org/1999/xhtml"><base href="'</span> + tinyMCE.settings[<span class="literal">'base_href'</span>] + <span class="literal">'" /><title>blank_page</title><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"></head><body class="mceContentBody"></body></html>'</span>;
+
+ try {
+ <span class="reserved">if</span> (!<span class="reserved">this</span>.isHidden())
+ <span class="reserved">this</span>.getDoc().designMode = <span class="literal">"on"</span>;
+
+ doc.open();
+ doc.write(html);
+ doc.close();
+ } catch (e) {
+ <span class="comment">// Failed Mozilla 1.3</span>
+ <span class="reserved">this</span>.getDoc().location.href = tinyMCE.baseURL + <span class="literal">"/blank.htm"</span>;
+ }
+ }
+
+ <span class="comment">// This timeout is needed in MSIE 5.5 for some odd reason</span>
+ <span class="comment">// it seems that the document.frames isn't initialized yet?</span>
+ <span class="reserved">if</span> (tinyMCE.isMSIE)
+ window.setTimeout(<span class="literal">"tinyMCE.addEventHandlers(tinyMCE.instances[\"</span><span class="literal">" + this.editorId + "</span>\<span class="literal">"]);"</span>, 1);
+
+ tinyMCE.setupContent(<span class="reserved">this</span>.editorId, true);
+
+ <span class="reserved">return</span> true;
+ },
+
+ <span class="comment">/**
+ * Sets the base href url of the current document instance. This method is used
+ * to temporarly remove the base url during copy/paste and drag/drop operations
+ * of relative links from external sites into TinyMCE. MSIE has a bug and converts
+ * relative links from external sites to absolute links incorrectly.
+ *
+ * <span class="attrib">@param</span> {string} u URL to set as base URL or null to remove it.
+ */</span>
+ setBaseHREF : <span class="reserved">function</span>(u) {
+ var h, b, d, nl;
+
+ d = <span class="reserved">this</span>.getDoc();
+ nl = d.getElementsByTagName(<span class="literal">"base"</span>);
+ b = nl.length > 0 ? nl[0] : null;
+
+ <span class="reserved">if</span> (!b) {
+ nl = d.getElementsByTagName(<span class="literal">"head"</span>);
+ h = nl.length > 0 ? nl[0] : null;
+
+ b = d.createElement(<span class="literal">"base"</span>);
+ b.setAttribute(<span class="literal">'href'</span>, u);
+ h.appendChild(b);
+ } <span class="reserved">else</span> {
+ <span class="reserved">if</span> (u == <span class="literal">""</span> || u == null)
+ b.parentNode.removeChild(b);
+ <span class="reserved">else</span>
+ b.setAttribute(<span class="literal">'href'</span>, u);
+ }
+ },
+
+ <span class="comment">/**
+ * Returns the currently selected element. This is was added for compatiblity and is deprecated.
+ * Please use inst.selection.getFocusElement instead.
+ *
+ * <span class="attrib">@return</span> Currently selected element.
+ * <span class="attrib">@type</span> HTMLElement
+ * <span class="attrib">@deprecated</span>
+ */</span>
+ getFocusElement : <span class="reserved">function</span>() {
+ <span class="reserved">return</span> <span class="reserved">this</span>.selection.getFocusElement();
+ },
+
+ <span class="comment">/**
+ * Returns the browsers selection instance. This is was added for compatiblity and is deprecated.
+ * Please use inst.selection.getSel instead.
+ *
+ * <span class="attrib">@return</span> Browser selection instance.
+ * <span class="attrib">@type</span> DOMSelection
+ * <span class="attrib">@deprecated</span>
+ */</span>
+ getSel : <span class="reserved">function</span>() {
+ <span class="reserved">return</span> <span class="reserved">this</span>.selection.getSel();
+ },
+
+ <span class="comment">/**
+ * Returns the browsers selections first range instance. This is was added for compatiblity and is deprecated.
+ * Please use inst.selection.getRng instead.
+ *
+ * <span class="attrib">@return</span> Browsers selections first range instance.
+ * <span class="attrib">@type</span> DOMRange
+ * <span class="attrib">@deprecated</span>
+ */</span>
+ getRng : <span class="reserved">function</span>() {
+ <span class="reserved">return</span> <span class="reserved">this</span>.selection.getRng();
+ },
+
+ <span class="comment">/**
+ * Moves the contents from the TinyMCE editor control instance to the hidden textarea
+ * that got replaced with TinyMCE. This is executed automaticly on for example form submit unless you configure otherwice.
+ *
+ * <span class="attrib">@param</span> {boolean} skip_cleanup Optional Skip cleanup, simply move the contents as fast as possible.
+ * <span class="attrib">@param</span> {boolean} skip_callback Optional Skip callback, don't call the save_callback function.
+ */</span>
+ triggerSave : <span class="reserved">function</span>(skip_cleanup, skip_callback) {
+ <span class="reserved">this</span>.switchSettings();
+
+ tinyMCE.settings[<span class="literal">'preformatted'</span>] = false;
+
+ <span class="comment">// Default to false</span>
+ <span class="reserved">if</span> (typeof(skip_cleanup) == <span class="literal">"undefined"</span>)
+ skip_cleanup = false;
+
+ <span class="comment">// Default to false</span>
+ <span class="reserved">if</span> (typeof(skip_callback) == <span class="literal">"undefined"</span>)
+ skip_callback = false;
+
+ tinyMCE._setHTML(<span class="reserved">this</span>.getDoc(), <span class="reserved">this</span>.getBody().innerHTML);
+
+ <span class="comment">// Remove visual aids when cleanup is disabled</span>
+ <span class="reserved">if</span> (<span class="reserved">this</span>.settings[<span class="literal">'cleanup'</span>] == false) {
+ tinyMCE.handleVisualAid(<span class="reserved">this</span>.getBody(), true, false, <span class="reserved">this</span>);
+ tinyMCE._setEventsEnabled(<span class="reserved">this</span>.getBody(), true);
+ }
+
+ tinyMCE._customCleanup(<span class="reserved">this</span>, <span class="literal">"submit_content_dom"</span>, <span class="reserved">this</span>.contentWindow.document.body);
+ var htm = skip_cleanup ? <span class="reserved">this</span>.getBody().innerHTML : tinyMCE._cleanupHTML(<span class="reserved">this</span>, <span class="reserved">this</span>.getDoc(), <span class="reserved">this</span>.settings, <span class="reserved">this</span>.getBody(), tinyMCE.visualAid, true, true);
+ htm = tinyMCE._customCleanup(<span class="reserved">this</span>, <span class="literal">"submit_content"</span>, htm);
+
+ <span class="reserved">if</span> (!skip_callback && tinyMCE.settings[<span class="literal">'save_callback'</span>] != <span class="literal">""</span>)
+ var content = eval(tinyMCE.settings[<span class="literal">'save_callback'</span>] + <span class="literal">"(this.formTargetElementId,htm,this.getBody());"</span>);
+
+ <span class="comment">// Use callback content if available</span>
+ <span class="reserved">if</span> ((typeof(content) != <span class="literal">"undefined"</span>) && content != null)
+ htm = content;
+
+ <span class="comment">// Replace some weird entities (Bug: #1056343)</span>
+ htm = tinyMCE.regexpReplace(htm, <span class="literal">"("</span>, <span class="literal">"("</span>, <span class="literal">"gi"</span>);
+ htm = tinyMCE.regexpReplace(htm, <span class="literal">")"</span>, <span class="literal">")"</span>, <span class="literal">"gi"</span>);
+ htm = tinyMCE.regexpReplace(htm, <span class="literal">";"</span>, <span class="literal">";"</span>, <span class="literal">"gi"</span>);
+ htm = tinyMCE.regexpReplace(htm, <span class="literal">"""</span>, <span class="literal">"""</span>, <span class="literal">"gi"</span>);
+ htm = tinyMCE.regexpReplace(htm, <span class="literal">"^"</span>, <span class="literal">"^"</span>, <span class="literal">"gi"</span>);
+
+ <span class="reserved">if</span> (<span class="reserved">this</span>.formElement)
+ <span class="reserved">this</span>.formElement.value = htm;
+
+ <span class="reserved">if</span> (tinyMCE.isSafari && <span class="reserved">this</span>.formElement)
+ <span class="reserved">this</span>.formElement.innerText = htm;
+ }
+};
+</pre>
+ <hr>
+
+
+
+<!-- ========== START OF NAVBAR ========== -->
+<a name="navbar_top"><!-- --></a>
+<table border="0" width="100%" cellpadding="1" cellspacing="0">
+<tr>
+<td colspan=2 bgcolor="#EEEEFF" class="NavBarCell1">
+<a name="navbar_top_firstrow"><!-- --></a>
+<table border="0" cellpadding="0" cellspacing="3">
+ <tr align="center" valign="top">
+
+
+ <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="overview-summary.html"><font class="NavBarFont1"><b>Overview</b></font></a> </td>
+ <td bgcolor="#FFFFFF" class="NavBarCell1Rev"> <font class="NavBarFont1Rev"><b>File</b></font> </td>
+
+
+ <td bgcolor="#FFFFFF" class="NavBarCell1"> <font class="NavBarFont1">Class</font> </td>
+ <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="overview-tree.html"><font class="NavBarFont1"><b>Tree</b></font></a> </td>
+ <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="index-all.html"--><font class="NavBarFont1"><b>Index</b></font></a> </td>
+ <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="help-doc.html"><font class="NavBarFont1"><b>Help</b></font></a> </td>
+ </tr>
+</table>
+</td>
+<td bgcolor="#EEEEFF" align="right" valign="top"><em>
+<b></b></em>
+</td>
+</tr>
+
+<tr>
+<td bgcolor="white" class="NavBarCell2"><font size="-2">
+ PREV
+ NEXT</font></td>
+<td bgcolor="white" class="NavBarCell2"><font size="-2">
+ <a href="index.html" target="_top"><b>FRAMES</b></a>
+ <a href="overview-summary.html" target="_top"><b>NO FRAMES</b></a>
+
+<script>
+ <!--
+ if(window==top) {
+ document.writeln('<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>');
+ }
+ //-->
+</script>
+<noscript>
+<a href="allclasses-noframe.html" target=""><b>All Classes</b></a>
+</noscript>
+</font></td>
+</tr>
+</table>
+<!-- =========== END OF NAVBAR =========== -->
+
+<hr>
+<font size="-1">
+
+</font>
+<div class="jsdoc_ctime">Documentation generated by <a href="http://jsdoc.sourceforge.net/" target="_parent">JSDoc</a> on Fri Apr 14 21:59:23 2006</div>
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/tinymce_api/overview-summary-TinyMCE_DOMUtils.class.js.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/tinymce_api/overview-summary-TinyMCE_DOMUtils.class.js.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/tinymce_api/overview-summary-TinyMCE_DOMUtils.class.js.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,707 +0,0 @@
-<!doctype html public "-//W3C//DTD HTML 4.0 Frameset//EN""http://www.w3.org/TR/REC-html40/frameset.dtd">
-<html>
-<head>
-<title>
- Overview
-</title>
-<link rel ="stylesheet" type="text/css" href="stylesheet.css" title="Style">
-<script>
-function asd() {
-
- parent.document.title="TinyMCE_DOMUtils.class.js Overview";
-
-}
-</script>
-</head>
-<body bgcolor="white" onload="asd();">
-
-<!-- ========== START OF NAVBAR ========== -->
-<a name="navbar_top"><!-- --></a>
-<table border="0" width="100%" cellpadding="1" cellspacing="0">
-<tr>
-<td colspan=2 bgcolor="#EEEEFF" class="NavBarCell1">
-<a name="navbar_top_firstrow"><!-- --></a>
-<table border="0" cellpadding="0" cellspacing="3">
- <tr align="center" valign="top">
-
-
- <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="overview-summary.html"><font class="NavBarFont1"><b>Overview</b></font></a> </td>
- <td bgcolor="#FFFFFF" class="NavBarCell1Rev"> <font class="NavBarFont1Rev"><b>File</b></font> </td>
-
-
- <td bgcolor="#FFFFFF" class="NavBarCell1"> <font class="NavBarFont1">Class</font> </td>
- <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="overview-tree.html"><font class="NavBarFont1"><b>Tree</b></font></a> </td>
- <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="index-all.html"--><font class="NavBarFont1"><b>Index</b></font></a> </td>
- <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="help-doc.html"><font class="NavBarFont1"><b>Help</b></font></a> </td>
- </tr>
-</table>
-</td>
-<td bgcolor="#EEEEFF" align="right" valign="top">
-<em>
-<b></b></em>
-</td>
-</tr>
-
-<tr>
-<td bgcolor="white" class="NavBarCell2"><font size="-2">
- PREV
- NEXT</font></td>
-<td bgcolor="white" class="NavBarCell2"><font size="-2">
- <a href="index.html" target="_top"><b>FRAMES</b></a>
- <a href="overview-summary.html" target="_top"><b>NO FRAMES</b></a>
-
-<script>
- <!--
- if(window==top) {
- document.writeln('<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>');
- }
- //-->
-</script>
-<noscript>
-<a href="allclasses-noframe.html" target=""><b>All Classes</b></a>
-</noscript>
-</font></td>
-</tr>
-</table>
-<!-- =========== END OF NAVBAR =========== -->
-
-<hr>
-<center>
-
- <h2>TinyMCE_DOMUtils.class.js</h2>
-
-</center>
-
-
-
-
-<h4>Summary</h4>
-<p>
-
- No overview generated for 'TinyMCE_DOMUtils.class.js'<BR/><BR/>
-
-</p>
-
-<hr>
-
-
-
-<!-- ========== METHOD SUMMARY =========== -->
-
-<!-- ========== END METHOD SUMMARY =========== -->
-
-
- <pre class="sourceview"><span class="comment">/**
- * $RCSfile: overview-summary-TinyMCE_DOMUtils.class.js.html,v $
- * $Revision: 1.42 $
- * $Date: 2006/04/14 20:00:29 $
- *
- * <span class="attrib">@author</span> Moxiecode
- * <span class="attrib">@copyright</span> Copyright © 2004-2006, Moxiecode Systems AB, All rights reserved.
- *
- * The contents of this file will be wrapped in a class later on.
- */</span>
-
-<span class="comment">/**
- * Returns a element by a specific attribute and it's value.
- *
- * <span class="attrib">@param</span> {HTMLElement} n Element to search in.
- * <span class="attrib">@param</span> {string} e Element name to search for.
- * <span class="attrib">@param</span> {string} a Attribute name to search for.
- * <span class="attrib">@param</span> {string} v Attribute value to search for.
- * <span class="attrib">@return</span> HTML element that matched the criterias or null on failure.
- * <span class="attrib">@type</span> HTMLElement
- */</span>
-TinyMCE_Engine.<span class="reserved">prototype</span>.getElementByAttributeValue = <span class="reserved">function</span>(n, e, a, v) {
- <span class="reserved">return</span> (n = <span class="reserved">this</span>.getElementsByAttributeValue(n, e, a, v)).length == 0 ? null : n[0];
-};
-
-<span class="comment">/**
- * Returns a element array by a specific attribute and it's value.
- *
- * <span class="attrib">@param</span> {HTMLElement} n Element to search in.
- * <span class="attrib">@param</span> {string} e Element name to search for.
- * <span class="attrib">@param</span> {string} a Attribute name to search for.
- * <span class="attrib">@param</span> {string} v Attribute value to search for.
- * <span class="attrib">@return</span> HTML element array that matched the criterias or null on failure.
- * <span class="attrib">@type</span> Array
- */</span>
-TinyMCE_Engine.<span class="reserved">prototype</span>.getElementsByAttributeValue = <span class="reserved">function</span>(n, e, a, v) {
- var i, nl = n.getElementsByTagName(e), o = new Array();
-
- <span class="reserved">for</span> (i=0; i<nl.length; i++) {
- <span class="reserved">if</span> (tinyMCE.getAttrib(nl[i], a).indexOf(v) != -1)
- o[o.length] = nl[i];
- }
-
- <span class="reserved">return</span> o;
-};
-
-<span class="comment">/**
- * Returns true/false if the specified node is a block element or not.
- *
- * <span class="attrib">@param</span> {HTMLNode} n Node to verify.
- * <span class="attrib">@return</span> true/false if the specified node is a block element or not.
- * <span class="attrib">@type</span> boolean
- */</span>
-TinyMCE_Engine.<span class="reserved">prototype</span>.isBlockElement = <span class="reserved">function</span>(n) {
- <span class="reserved">return</span> n != null && n.nodeType == 1 && <span class="reserved">this</span>.blockRegExp.test(n.nodeName);
-};
-
-<span class="comment">/**
- * Returns the first block element parent of the specified node.
- *
- * <span class="attrib">@param</span> {HTMLNode} n Node get parent block element for.
- * <span class="attrib">@return</span> First block element parent of the specified node or null if it wasn't found.
- * <span class="attrib">@type</span> HTMLElement
- */</span>
-TinyMCE_Engine.<span class="reserved">prototype</span>.getParentBlockElement = <span class="reserved">function</span>(n) {
- <span class="reserved">while</span> (n) {
- <span class="reserved">if</span> (<span class="reserved">this</span>.isBlockElement(n))
- <span class="reserved">return</span> n;
-
- n = n.parentNode;
- }
-
- <span class="reserved">return</span> null;
-};
-
-<span class="comment">/**
- * Inserts a node after the specific node.
- *
- * <span class="attrib">@param</span> {HTMLNode} n New node to insert.
- * <span class="attrib">@param</span> {HTMLNode} r Reference node to insert after.
- */</span>
-TinyMCE_Engine.<span class="reserved">prototype</span>.insertAfter = <span class="reserved">function</span>(n, r){
- <span class="reserved">if</span> (r.nextSibling)
- r.parentNode.insertBefore(n, r.nextSibling);
- <span class="reserved">else</span>
- r.parentNode.appendChild(n);
-};
-
-<span class="comment">/**
- * Sets the innerHTML property of a element, this function also
- * fixes a MSIE bug where the first comment is removed.
- *
- * <span class="attrib">@param</span> {HTMLElement} e Element to insert HTML in.
- * <span class="attrib">@param</span> {string} h HTML code to insert into innerHTML.
- */</span>
-TinyMCE_Engine.<span class="reserved">prototype</span>.setInnerHTML = <span class="reserved">function</span>(e, h) {
- var i, nl, n;
-
- <span class="reserved">if</span> (tinyMCE.isMSIE && !tinyMCE.isOpera) {
- <span class="comment">// Since MSIE handles invalid HTML better that valid XHTML we</span>
- <span class="comment">// need to make some things invalid. <hr /> gets converted to <hr>.</span>
- h = h.replace(/\s\/>/g, <span class="literal">'>'</span>);
-
- <span class="comment">// Since MSIE auto generated emtpy P tags some times we must tell it to keep the real ones</span>
- h = h.replace(/<p([^>]*)>\u00A0?<\/p>/gi, <span class="literal">'<p$1 mce_keep="true"> </p>'</span>); <span class="comment">// Keep empty paragraphs</span>
- h = h.replace(/<p([^>]*)>\s* \s*<\/p>/gi, <span class="literal">'<p$1 mce_keep="true"> </p>'</span>); <span class="comment">// Keep empty paragraphs</span>
- h = h.replace(/<p([^>]*)>\s+<\/p>/gi, <span class="literal">'<p$1 mce_keep="true"> </p>'</span>); <span class="comment">// Keep empty paragraphs</span>
-
- <span class="comment">// Remove first comment</span>
- e.innerHTML = tinyMCE.uniqueTag + h;
- e.firstChild.removeNode(true);
-
- <span class="comment">// Remove weird auto generated empty paragraphs unless it's supposed to be there</span>
- nl = e.getElementsByTagName(<span class="literal">"p"</span>);
- <span class="reserved">for</span> (i=nl.length-1; i>=0; i--) {
- n = nl[i];
-
- <span class="reserved">if</span> (n.nodeName == <span class="literal">'P'</span> && !n.hasChildNodes() && !n.mce_keep)
- n.parentNode.removeChild(n);
- }
- } <span class="reserved">else</span> {
- h = <span class="reserved">this</span>.fixGeckoBaseHREFBug(1, e, h);
- e.innerHTML = h;
- <span class="reserved">this</span>.fixGeckoBaseHREFBug(2, e, h);
- }
-};
-
-<span class="comment">/**
- * Returns the outer HTML of a element, this uses the outerHTML
- * property in MSIE and Opera and a workaround for Gecko.
- *
- * <span class="attrib">@param</span> {HTMLElement} e HTML element to get outerHTML from.
- * <span class="attrib">@return</span> HTML content string.
- * <span class="attrib">@type</span> string
- */</span>
-TinyMCE_Engine.<span class="reserved">prototype</span>.getOuterHTML = <span class="reserved">function</span>(e) {
- <span class="reserved">if</span> (tinyMCE.isMSIE)
- <span class="reserved">return</span> e.outerHTML;
-
- var d = e.ownerDocument.createElement(<span class="literal">"body"</span>);
- d.appendChild(e);
- <span class="reserved">return</span> d.innerHTML;
-};
-
-<span class="comment">/**
- * Sets the outer HTML of a element, this uses the outerHTML
- * property in MSIE and Opera and a workaround for Gecko.
- *
- * <span class="attrib">@param</span> {HTMLElement} e HTML element to set outerHTML on.
- * <span class="attrib">@param</span> {string} h HTML string to set in property.
- */</span>
-TinyMCE_Engine.<span class="reserved">prototype</span>.setOuterHTML = <span class="reserved">function</span>(e, h) {
- <span class="reserved">if</span> (tinyMCE.isMSIE) {
- e.outerHTML = h;
- <span class="reserved">return</span>;
- }
-
- var d = e.ownerDocument.createElement(<span class="literal">"body"</span>);
- d.innerHTML = h;
- e.parentNode.replaceChild(d.firstChild, e);
-};
-
-<span class="comment">/**
- * Returns a element by id, this will also search the form names to match the id.
- *
- * <span class="attrib">@param</span> {string} id Id of element.
- * <span class="attrib">@param</span> {DOMDocument} d Optional document.
- * <span class="attrib">@return</span> HTML element that matches the id.
- * <span class="attrib">@type</span> HTMLElement
- */</span>
-TinyMCE_Engine.<span class="reserved">prototype</span>._getElementById = <span class="reserved">function</span>(id, d) {
- var e, i, j, f;
-
- <span class="reserved">if</span> (typeof(d) == <span class="literal">"undefined"</span>)
- d = document;
-
- e = d.getElementById(id);
- <span class="reserved">if</span> (!e) {
- f = d.forms;
-
- <span class="reserved">for</span> (i=0; i<f.length; i++) {
- <span class="reserved">for</span> (j=0; j<f[i].elements.length; j++) {
- <span class="reserved">if</span> (f[i].elements[j].name == id) {
- e = f[i].elements[j];
- break;
- }
- }
- }
- }
-
- <span class="reserved">return</span> e;
-};
-
-<span class="comment">/**
- * Returns a array of nodes selected retrived from the child nodes of the specified node.
- *
- * <span class="attrib">@param</span> {HTMLNode} n Node to get children from.
- * <span class="attrib">@param</span> {Array} na Array to fill with children.
- * <span class="attrib">@param</span> {int} t Node type to get.
- * <span class="attrib">@param</span> {string} nn Node name of items to retrive.
- * <span class="attrib">@return</span> Node array.
- * <span class="attrib">@type</span> Array
- */</span>
-TinyMCE_Engine.<span class="reserved">prototype</span>.getNodeTree = <span class="reserved">function</span>(n, na, t, nn) {
- var i;
-
- <span class="reserved">if</span> (typeof(t) == <span class="literal">"undefined"</span> || n.nodeType == t && (typeof(nn) == <span class="literal">"undefined"</span> || n.nodeName == nn))
- na[na.length] = n;
-
- <span class="reserved">if</span> (n.hasChildNodes()) {
- <span class="reserved">for</span> (i=0; i<n.childNodes.length; i++)
- tinyMCE.getNodeTree(n.childNodes[i], na, t, nn);
- }
-
- <span class="reserved">return</span> na;
-};
-
-<span class="comment">/**
- * Returns the parent element of the specified node based on the search criteria.
- *
- * <span class="attrib">@param</span> {HTMLNode} node Node to get parent element of.
- * <span class="attrib">@param</span> {string} names Comma separated list of element names to get.
- * <span class="attrib">@param</span> {string} attrib_name Optional attribute name to match.
- * <span class="attrib">@param</span> {string} attrib_value Optional attribute value to match.
- * <span class="attrib">@return</span> HTMLElement or null based on search criteras.
- * <span class="attrib">@type</span> HTMLElement
- */</span>
-TinyMCE_Engine.<span class="reserved">prototype</span>.getParentElement = <span class="reserved">function</span>(node, names, attrib_name, attrib_value) {
- <span class="reserved">if</span> (typeof(names) == <span class="literal">"undefined"</span>) {
- <span class="reserved">if</span> (node.nodeType == 1)
- <span class="reserved">return</span> node;
-
- <span class="comment">// Find parent node that is a element</span>
- <span class="reserved">while</span> ((node = node.parentNode) != null && node.nodeType != 1) ;
-
- <span class="reserved">return</span> node;
- }
-
- <span class="reserved">if</span> (node == null)
- <span class="reserved">return</span> null;
-
- var namesAr = names.toUpperCase().split(<span class="literal">','</span>);
-
- do {
- <span class="reserved">for</span> (var i=0; i<namesAr.length; i++) {
- <span class="reserved">if</span> (node.nodeName == namesAr[i] || names == <span class="literal">"*"</span>) {
- <span class="reserved">if</span> (typeof(attrib_name) == <span class="literal">"undefined"</span>)
- <span class="reserved">return</span> node;
- <span class="reserved">else</span> <span class="reserved">if</span> (node.getAttribute(attrib_name)) {
- <span class="reserved">if</span> (typeof(attrib_value) == <span class="literal">"undefined"</span>) {
- <span class="reserved">if</span> (node.getAttribute(attrib_name) != <span class="literal">""</span>)
- <span class="reserved">return</span> node;
- } <span class="reserved">else</span> <span class="reserved">if</span> (node.getAttribute(attrib_name) == attrib_value)
- <span class="reserved">return</span> node;
- }
- }
- }
- } <span class="reserved">while</span> ((node = node.parentNode) != null);
-
- <span class="reserved">return</span> null;
-};
-
-<span class="comment">/**
- * Returns a node by the specified selector function. This function will
- * loop through all parent nodes and call the specified function for each node.
- * If the function then returns true it will stop the execution and return that node.
- *
- * <span class="attrib">@param</span> {DOMNode} n HTML node to search parents on.
- * <span class="attrib">@param</span> {function} f Selection function to execute on each node.
- * <span class="attrib">@return</span> DOMNode or null if it wasn't found.
- * <span class="attrib">@type</span> DOMNode
- */</span>
-TinyMCE_Engine.<span class="reserved">prototype</span>.getParentNode = <span class="reserved">function</span>(n, f) {
- <span class="reserved">while</span> (n) {
- <span class="reserved">if</span> (f(n))
- <span class="reserved">return</span> n;
-
- n = n.parentNode;
- }
-
- <span class="reserved">return</span> null;
-};
-
-<span class="comment">/**
- * Returns the attribute value of a element or the default value if it wasn't found.
- *
- * <span class="attrib">@param</span> {HTMLElement} elm HTML element to get attribute from.
- * <span class="attrib">@param</span> {string} name Attribute name to retrive.
- * <span class="attrib">@param</span> {string} default_value Optional default value to return, this value defaults to a empty string.
- * <span class="attrib">@return</span> Attribute value or default value if it wasn't found in element.
- * <span class="attrib">@type</span> string
- */</span>
-TinyMCE_Engine.<span class="reserved">prototype</span>.getAttrib = <span class="reserved">function</span>(elm, name, default_value) {
- <span class="reserved">if</span> (typeof(default_value) == <span class="literal">"undefined"</span>)
- default_value = <span class="literal">""</span>;
-
- <span class="comment">// Not a element</span>
- <span class="reserved">if</span> (!elm || elm.nodeType != 1)
- <span class="reserved">return</span> default_value;
-
- var v = elm.getAttribute(name);
-
- <span class="comment">// Try className for class attrib</span>
- <span class="reserved">if</span> (name == <span class="literal">"class"</span> && !v)
- v = elm.className;
-
- <span class="comment">// Workaround for a issue with Firefox 1.5rc2+</span>
- <span class="reserved">if</span> (tinyMCE.isGecko && name == <span class="literal">"src"</span> && elm.src != null && elm.src != <span class="literal">""</span>)
- v = elm.src;
-
- <span class="comment">// Workaround for a issue with Firefox 1.5rc2+</span>
- <span class="reserved">if</span> (tinyMCE.isGecko && name == <span class="literal">"href"</span> && elm.href != null && elm.href != <span class="literal">""</span>)
- v = elm.href;
-
- <span class="reserved">if</span> (name == <span class="literal">"http-equiv"</span> && tinyMCE.isMSIE)
- v = elm.httpEquiv;
-
- <span class="reserved">if</span> (name == <span class="literal">"style"</span> && !tinyMCE.isOpera)
- v = elm.style.cssText;
-
- <span class="reserved">return</span> (v && v != <span class="literal">""</span>) ? v : default_value;
-};
-
-<span class="comment">/**
- * Sets the attribute value for a specific attribute.
- *
- * <span class="attrib">@param</span> {HTMLElement} element HTML element to set attribute on.
- * <span class="attrib">@param</span> {string} name Attribute name to set.
- * <span class="attrib">@param</span> {string} value Attribute value to set.
- * <span class="attrib">@param</span> {boolean} fix_value Optional fix value state, if true only number data will be accepted.
- */</span>
-TinyMCE_Engine.<span class="reserved">prototype</span>.setAttrib = <span class="reserved">function</span>(element, name, value, fix_value) {
- <span class="reserved">if</span> (typeof(value) == <span class="literal">"number"</span> && value != null)
- value = <span class="literal">""</span> + value;
-
- <span class="reserved">if</span> (fix_value) {
- <span class="reserved">if</span> (value == null)
- value = <span class="literal">""</span>;
-
- var re = new RegExp(<span class="literal">'[^0-9%]'</span>, <span class="literal">'g'</span>);
- value = value.replace(re, <span class="literal">''</span>);
- }
-
- <span class="reserved">if</span> (name == <span class="literal">"style"</span>)
- element.style.cssText = value;
-
- <span class="reserved">if</span> (name == <span class="literal">"class"</span>)
- element.className = value;
-
- <span class="reserved">if</span> (value != null && value != <span class="literal">""</span> && value != -1)
- element.setAttribute(name, value);
- <span class="reserved">else</span>
- element.removeAttribute(name);
-};
-
-<span class="comment">/**
- * Sets a style attribute item value.
- *
- * <span class="attrib">@param</span> {HTMLElement} elm HTML element to set style attribute item on.
- * <span class="attrib">@param</span> {string} name Style item name to set.
- * <span class="attrib">@param</span> {string} value Style item value to set.
- */</span>
-TinyMCE_Engine.<span class="reserved">prototype</span>.setStyleAttrib = <span class="reserved">function</span>(elm, name, value) {
- eval(<span class="literal">'elm.style.'</span> + name + <span class="literal">'=value;'</span>);
-
- <span class="comment">// Style attrib deleted</span>
- <span class="reserved">if</span> (tinyMCE.isMSIE && value == null || value == <span class="literal">''</span>) {
- var str = tinyMCE.serializeStyle(tinyMCE.parseStyle(elm.style.cssText));
- elm.style.cssText = str;
- elm.setAttribute(<span class="literal">"style"</span>, str);
- }
-};
-
-<span class="comment">/**
- * Switches the CSS class of the specified element. This method also caches the
- * elements in a lookup table for performance. This should only be used for TinyMCE main UI controls
- * like buttons or select elements.
- *
- * <span class="attrib">@param</span> {HTMLElement} ei Element to set CSS class on.
- * <span class="attrib">@param</span> {string} c CSS class to set.
- */</span>
-TinyMCE_Engine.<span class="reserved">prototype</span>.switchClass = <span class="reserved">function</span>(ei, c) {
- var e;
-
- <span class="reserved">if</span> (tinyMCE.switchClassCache[ei])
- e = tinyMCE.switchClassCache[ei];
- <span class="reserved">else</span>
- e = tinyMCE.switchClassCache[ei] = document.getElementById(ei);
-
- <span class="reserved">if</span> (e) {
- <span class="comment">// Keep tile mode</span>
- <span class="reserved">if</span> (tinyMCE.settings.button_tile_map && e.className && e.className.indexOf(<span class="literal">'mceTiledButton'</span>) == 0)
- c = <span class="literal">'mceTiledButton '</span> + c;
-
- e.className = c;
- }
-};
-
-<span class="comment">/**
- * Returns the absolute x, y position of a node. The position will be returned in a object with
- * two properties absLeft and absTop.
- *
- * <span class="attrib">@param</span> {HTMLNode} n HTML element to get x, y position from.
- * <span class="attrib">@return</span> Absolute position of the specified element.
- * <span class="attrib">@type</span> TinyMCE_ElementPosition
- */</span>
-TinyMCE_Engine.<span class="reserved">prototype</span>.getAbsPosition = <span class="reserved">function</span>(n) {
- var p = {absLeft : 0, absTop : 0};
-
- <span class="reserved">while</span> (n) {
- p.absLeft += n.offsetLeft;
- p.absTop += n.offsetTop;
- n = n.offsetParent;
- }
-
- <span class="reserved">return</span> p;
-};
-
-<span class="comment">/**
- * Finds any previous element by name. This will loop through the siblings
- * inorder to find the specified element by name. If the element wasn't found
- * it will return a null value.
- *
- * <span class="attrib">@param</span> {HTMLNode} e HTML node to search from.
- * <span class="attrib">@param</span> {string} n Comma separated list of element names to search for.
- * <span class="attrib">@return</span> HTML Element or null if it wasn't found.
- * <span class="attrib">@type</span> HTMLElement
- */</span>
-TinyMCE_Engine.<span class="reserved">prototype</span>.prevNode = <span class="reserved">function</span>(e, n) {
- var a = n.split(<span class="literal">','</span>), i;
-
- <span class="reserved">while</span> ((e = e.previousSibling) != null) {
- <span class="reserved">for</span> (i=0; i<a.length; i++) {
- <span class="reserved">if</span> (e.nodeName == a[i])
- <span class="reserved">return</span> e;
- }
- }
-
- <span class="reserved">return</span> null;
-};
-
-<span class="comment">/**
- * Finds any element after the current one by name. This will loop through the siblings
- * inorder to find the specified element by name. If the element wasn't found
- * it will return a null value.
- *
- * <span class="attrib">@param</span> {HTMLNode} e HTML node to search from.
- * <span class="attrib">@param</span> {string} n Comma separated list of element names to search for.
- * <span class="attrib">@return</span> HTML Element or null if it wasn't found.
- * <span class="attrib">@type</span> HTMLElement
- */</span>
-TinyMCE_Engine.<span class="reserved">prototype</span>.nextNode = <span class="reserved">function</span>(e, n) {
- var a = n.split(<span class="literal">','</span>), i;
-
- <span class="reserved">while</span> ((e = e.nextSibling) != null) {
- <span class="reserved">for</span> (i=0; i<a.length; i++) {
- <span class="reserved">if</span> (e.nodeName == a[i])
- <span class="reserved">return</span> e;
- }
- }
-
- <span class="reserved">return</span> null;
-};
-
-<span class="comment">/**
- * Returns a array of nodes when the specified function matches a node.
- *
- * <span class="attrib">@param</span> {DOMNode} n Node to select children from.
- * <span class="attrib">@param</span> {function} f Function that returns true/false if the node is to be added or not.
- * <span class="attrib">@param</span> {Array} a Optional array to fill with nodes.
- * <span class="attrib">@return</span> Array with selected nodes.
- * <span class="attrib">@type</span> Array
- */</span>
-TinyMCE_Engine.<span class="reserved">prototype</span>.selectNodes = <span class="reserved">function</span>(n, f, a) {
- var i;
-
- <span class="reserved">if</span> (!a)
- a = new Array();
-
- <span class="reserved">if</span> (f(n))
- a[a.length] = n;
-
- <span class="reserved">if</span> (n.hasChildNodes()) {
- <span class="reserved">for</span> (i=0; i<n.childNodes.length; i++)
- tinyMCE.selectNodes(n.childNodes[i], f, a);
- }
-
- <span class="reserved">return</span> a;
-};
-
-<span class="comment">/**
- * Adds a CSS class to the specified element. It will remove any previous item with the same name
- * so adding a class that already exists will move it to the end.
- *
- * <span class="attrib">@param</span> {HTMLElement} e HTML element to add CSS class to.
- * <span class="attrib">@param</span> {string] c CSS class to add to HTML element.
- * <span class="attrib">@param</span> {boolean] b Optional parameter, if set to true, class will be added to the beginning.
- * <span class="attrib">@return</span> Returns the new class attribute value.
- * <span class="attrib">@type</span> string
- */</span>
-TinyMCE_Engine.<span class="reserved">prototype</span>.addCSSClass = <span class="reserved">function</span>(e, c, b) {
- var o = <span class="reserved">this</span>.removeCSSClass(e, c);
-
- <span class="reserved">return</span> e.className = b ? c + (o != <span class="literal">''</span> ? (<span class="literal">' '</span> + o) : <span class="literal">''</span>) : (o != <span class="literal">''</span> ? (o + <span class="literal">' '</span>) : <span class="literal">''</span>) + c;
-};
-
-<span class="comment">/**
- * Removes the specified CSS class from the element.
- *
- * <span class="attrib">@param</span> {HTMLElement} e HTML element to remove CSS class to.
- * <span class="attrib">@param</span> {string] c CSS class to remove to HTML element.
- * <span class="attrib">@return</span> Returns the new class attribute value.
- * <span class="attrib">@type</span> string
- */</span>
-TinyMCE_Engine.<span class="reserved">prototype</span>.removeCSSClass = <span class="reserved">function</span>(e, c) {
- var a = <span class="reserved">this</span>.explode(<span class="literal">' '</span>, e.className), i;
-
- <span class="reserved">for</span> (i=0; i<a.length; i++) {
- <span class="reserved">if</span> (a[i] == c)
- a[i] = <span class="literal">''</span>;
- }
-
- <span class="reserved">return</span> e.className = a.join(<span class="literal">' '</span>);
-};
-
-<span class="comment">/**
- * Renames the specified element to the specified name.
- *
- * <span class="attrib">@param</span> {HTMLElement} e Element to rename.
- * <span class="attrib">@param</span> {string} n New name of the element.
- * <span class="attrib">@param</span> {DOMDocument} d Optional document reference.
- */</span>
-TinyMCE_Engine.<span class="reserved">prototype</span>.renameElement = <span class="reserved">function</span>(e, n, d) {
- var ne, i, ar;
-
- d = typeof(d) == <span class="literal">"undefined"</span> ? tinyMCE.selectedInstance.getDoc() : d;
-
- <span class="reserved">if</span> (e) {
- ne = d.createElement(n);
-
- ar = e.attributes;
- <span class="reserved">for</span> (i=ar.length-1; i>-1; i--) {
- <span class="reserved">if</span> (ar[i].specified && ar[i].nodeValue)
- ne.setAttribute(ar[i].nodeName.toLowerCase(), ar[i].nodeValue);
- }
-
- ar = e.childNodes;
- <span class="reserved">for</span> (i=0; i<ar.length; i++)
- ne.appendChild(ar[i].cloneNode(true));
-
- e.parentNode.replaceChild(ne, e);
- }
-};
-</pre>
- <hr>
-
-
-
-<!-- ========== START OF NAVBAR ========== -->
-<a name="navbar_top"><!-- --></a>
-<table border="0" width="100%" cellpadding="1" cellspacing="0">
-<tr>
-<td colspan=2 bgcolor="#EEEEFF" class="NavBarCell1">
-<a name="navbar_top_firstrow"><!-- --></a>
-<table border="0" cellpadding="0" cellspacing="3">
- <tr align="center" valign="top">
-
-
- <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="overview-summary.html"><font class="NavBarFont1"><b>Overview</b></font></a> </td>
- <td bgcolor="#FFFFFF" class="NavBarCell1Rev"> <font class="NavBarFont1Rev"><b>File</b></font> </td>
-
-
- <td bgcolor="#FFFFFF" class="NavBarCell1"> <font class="NavBarFont1">Class</font> </td>
- <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="overview-tree.html"><font class="NavBarFont1"><b>Tree</b></font></a> </td>
- <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="index-all.html"--><font class="NavBarFont1"><b>Index</b></font></a> </td>
- <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="help-doc.html"><font class="NavBarFont1"><b>Help</b></font></a> </td>
- </tr>
-</table>
-</td>
-<td bgcolor="#EEEEFF" align="right" valign="top"><em>
-<b></b></em>
-</td>
-</tr>
-
-<tr>
-<td bgcolor="white" class="NavBarCell2"><font size="-2">
- PREV
- NEXT</font></td>
-<td bgcolor="white" class="NavBarCell2"><font size="-2">
- <a href="index.html" target="_top"><b>FRAMES</b></a>
- <a href="overview-summary.html" target="_top"><b>NO FRAMES</b></a>
-
-<script>
- <!--
- if(window==top) {
- document.writeln('<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>');
- }
- //-->
-</script>
-<noscript>
-<a href="allclasses-noframe.html" target=""><b>All Classes</b></a>
-</noscript>
-</font></td>
-</tr>
-</table>
-<!-- =========== END OF NAVBAR =========== -->
-
-<hr>
-<font size="-1">
-
-</font>
-<div class="jsdoc_ctime">Documentation generated by <a href="http://jsdoc.sourceforge.net/" target="_parent">JSDoc</a> on Fri Apr 14 21:59:23 2006</div>
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/tinymce_api/overview-summary-TinyMCE_DOMUtils.class.js.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/tinymce_api/overview-summary-TinyMCE_DOMUtils.class.js.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/tinymce_api/overview-summary-TinyMCE_DOMUtils.class.js.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/tinymce_api/overview-summary-TinyMCE_DOMUtils.class.js.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,707 @@
+<!doctype html public "-//W3C//DTD HTML 4.0 Frameset//EN""http://www.w3.org/TR/REC-html40/frameset.dtd">
+<html>
+<head>
+<title>
+ Overview
+</title>
+<link rel ="stylesheet" type="text/css" href="stylesheet.css" title="Style">
+<script>
+function asd() {
+
+ parent.document.title="TinyMCE_DOMUtils.class.js Overview";
+
+}
+</script>
+</head>
+<body bgcolor="white" onload="asd();">
+
+<!-- ========== START OF NAVBAR ========== -->
+<a name="navbar_top"><!-- --></a>
+<table border="0" width="100%" cellpadding="1" cellspacing="0">
+<tr>
+<td colspan=2 bgcolor="#EEEEFF" class="NavBarCell1">
+<a name="navbar_top_firstrow"><!-- --></a>
+<table border="0" cellpadding="0" cellspacing="3">
+ <tr align="center" valign="top">
+
+
+ <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="overview-summary.html"><font class="NavBarFont1"><b>Overview</b></font></a> </td>
+ <td bgcolor="#FFFFFF" class="NavBarCell1Rev"> <font class="NavBarFont1Rev"><b>File</b></font> </td>
+
+
+ <td bgcolor="#FFFFFF" class="NavBarCell1"> <font class="NavBarFont1">Class</font> </td>
+ <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="overview-tree.html"><font class="NavBarFont1"><b>Tree</b></font></a> </td>
+ <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="index-all.html"--><font class="NavBarFont1"><b>Index</b></font></a> </td>
+ <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="help-doc.html"><font class="NavBarFont1"><b>Help</b></font></a> </td>
+ </tr>
+</table>
+</td>
+<td bgcolor="#EEEEFF" align="right" valign="top">
+<em>
+<b></b></em>
+</td>
+</tr>
+
+<tr>
+<td bgcolor="white" class="NavBarCell2"><font size="-2">
+ PREV
+ NEXT</font></td>
+<td bgcolor="white" class="NavBarCell2"><font size="-2">
+ <a href="index.html" target="_top"><b>FRAMES</b></a>
+ <a href="overview-summary.html" target="_top"><b>NO FRAMES</b></a>
+
+<script>
+ <!--
+ if(window==top) {
+ document.writeln('<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>');
+ }
+ //-->
+</script>
+<noscript>
+<a href="allclasses-noframe.html" target=""><b>All Classes</b></a>
+</noscript>
+</font></td>
+</tr>
+</table>
+<!-- =========== END OF NAVBAR =========== -->
+
+<hr>
+<center>
+
+ <h2>TinyMCE_DOMUtils.class.js</h2>
+
+</center>
+
+
+
+
+<h4>Summary</h4>
+<p>
+
+ No overview generated for 'TinyMCE_DOMUtils.class.js'<BR/><BR/>
+
+</p>
+
+<hr>
+
+
+
+<!-- ========== METHOD SUMMARY =========== -->
+
+<!-- ========== END METHOD SUMMARY =========== -->
+
+
+ <pre class="sourceview"><span class="comment">/**
+ * $RCSfile: overview-summary-TinyMCE_DOMUtils.class.js.html,v $
+ * $Revision: 1.42 $
+ * $Date: 2006/04/14 20:00:29 $
+ *
+ * <span class="attrib">@author</span> Moxiecode
+ * <span class="attrib">@copyright</span> Copyright © 2004-2006, Moxiecode Systems AB, All rights reserved.
+ *
+ * The contents of this file will be wrapped in a class later on.
+ */</span>
+
+<span class="comment">/**
+ * Returns a element by a specific attribute and it's value.
+ *
+ * <span class="attrib">@param</span> {HTMLElement} n Element to search in.
+ * <span class="attrib">@param</span> {string} e Element name to search for.
+ * <span class="attrib">@param</span> {string} a Attribute name to search for.
+ * <span class="attrib">@param</span> {string} v Attribute value to search for.
+ * <span class="attrib">@return</span> HTML element that matched the criterias or null on failure.
+ * <span class="attrib">@type</span> HTMLElement
+ */</span>
+TinyMCE_Engine.<span class="reserved">prototype</span>.getElementByAttributeValue = <span class="reserved">function</span>(n, e, a, v) {
+ <span class="reserved">return</span> (n = <span class="reserved">this</span>.getElementsByAttributeValue(n, e, a, v)).length == 0 ? null : n[0];
+};
+
+<span class="comment">/**
+ * Returns a element array by a specific attribute and it's value.
+ *
+ * <span class="attrib">@param</span> {HTMLElement} n Element to search in.
+ * <span class="attrib">@param</span> {string} e Element name to search for.
+ * <span class="attrib">@param</span> {string} a Attribute name to search for.
+ * <span class="attrib">@param</span> {string} v Attribute value to search for.
+ * <span class="attrib">@return</span> HTML element array that matched the criterias or null on failure.
+ * <span class="attrib">@type</span> Array
+ */</span>
+TinyMCE_Engine.<span class="reserved">prototype</span>.getElementsByAttributeValue = <span class="reserved">function</span>(n, e, a, v) {
+ var i, nl = n.getElementsByTagName(e), o = new Array();
+
+ <span class="reserved">for</span> (i=0; i<nl.length; i++) {
+ <span class="reserved">if</span> (tinyMCE.getAttrib(nl[i], a).indexOf(v) != -1)
+ o[o.length] = nl[i];
+ }
+
+ <span class="reserved">return</span> o;
+};
+
+<span class="comment">/**
+ * Returns true/false if the specified node is a block element or not.
+ *
+ * <span class="attrib">@param</span> {HTMLNode} n Node to verify.
+ * <span class="attrib">@return</span> true/false if the specified node is a block element or not.
+ * <span class="attrib">@type</span> boolean
+ */</span>
+TinyMCE_Engine.<span class="reserved">prototype</span>.isBlockElement = <span class="reserved">function</span>(n) {
+ <span class="reserved">return</span> n != null && n.nodeType == 1 && <span class="reserved">this</span>.blockRegExp.test(n.nodeName);
+};
+
+<span class="comment">/**
+ * Returns the first block element parent of the specified node.
+ *
+ * <span class="attrib">@param</span> {HTMLNode} n Node get parent block element for.
+ * <span class="attrib">@return</span> First block element parent of the specified node or null if it wasn't found.
+ * <span class="attrib">@type</span> HTMLElement
+ */</span>
+TinyMCE_Engine.<span class="reserved">prototype</span>.getParentBlockElement = <span class="reserved">function</span>(n) {
+ <span class="reserved">while</span> (n) {
+ <span class="reserved">if</span> (<span class="reserved">this</span>.isBlockElement(n))
+ <span class="reserved">return</span> n;
+
+ n = n.parentNode;
+ }
+
+ <span class="reserved">return</span> null;
+};
+
+<span class="comment">/**
+ * Inserts a node after the specific node.
+ *
+ * <span class="attrib">@param</span> {HTMLNode} n New node to insert.
+ * <span class="attrib">@param</span> {HTMLNode} r Reference node to insert after.
+ */</span>
+TinyMCE_Engine.<span class="reserved">prototype</span>.insertAfter = <span class="reserved">function</span>(n, r){
+ <span class="reserved">if</span> (r.nextSibling)
+ r.parentNode.insertBefore(n, r.nextSibling);
+ <span class="reserved">else</span>
+ r.parentNode.appendChild(n);
+};
+
+<span class="comment">/**
+ * Sets the innerHTML property of a element, this function also
+ * fixes a MSIE bug where the first comment is removed.
+ *
+ * <span class="attrib">@param</span> {HTMLElement} e Element to insert HTML in.
+ * <span class="attrib">@param</span> {string} h HTML code to insert into innerHTML.
+ */</span>
+TinyMCE_Engine.<span class="reserved">prototype</span>.setInnerHTML = <span class="reserved">function</span>(e, h) {
+ var i, nl, n;
+
+ <span class="reserved">if</span> (tinyMCE.isMSIE && !tinyMCE.isOpera) {
+ <span class="comment">// Since MSIE handles invalid HTML better that valid XHTML we</span>
+ <span class="comment">// need to make some things invalid. <hr /> gets converted to <hr>.</span>
+ h = h.replace(/\s\/>/g, <span class="literal">'>'</span>);
+
+ <span class="comment">// Since MSIE auto generated emtpy P tags some times we must tell it to keep the real ones</span>
+ h = h.replace(/<p([^>]*)>\u00A0?<\/p>/gi, <span class="literal">'<p$1 mce_keep="true"> </p>'</span>); <span class="comment">// Keep empty paragraphs</span>
+ h = h.replace(/<p([^>]*)>\s* \s*<\/p>/gi, <span class="literal">'<p$1 mce_keep="true"> </p>'</span>); <span class="comment">// Keep empty paragraphs</span>
+ h = h.replace(/<p([^>]*)>\s+<\/p>/gi, <span class="literal">'<p$1 mce_keep="true"> </p>'</span>); <span class="comment">// Keep empty paragraphs</span>
+
+ <span class="comment">// Remove first comment</span>
+ e.innerHTML = tinyMCE.uniqueTag + h;
+ e.firstChild.removeNode(true);
+
+ <span class="comment">// Remove weird auto generated empty paragraphs unless it's supposed to be there</span>
+ nl = e.getElementsByTagName(<span class="literal">"p"</span>);
+ <span class="reserved">for</span> (i=nl.length-1; i>=0; i--) {
+ n = nl[i];
+
+ <span class="reserved">if</span> (n.nodeName == <span class="literal">'P'</span> && !n.hasChildNodes() && !n.mce_keep)
+ n.parentNode.removeChild(n);
+ }
+ } <span class="reserved">else</span> {
+ h = <span class="reserved">this</span>.fixGeckoBaseHREFBug(1, e, h);
+ e.innerHTML = h;
+ <span class="reserved">this</span>.fixGeckoBaseHREFBug(2, e, h);
+ }
+};
+
+<span class="comment">/**
+ * Returns the outer HTML of a element, this uses the outerHTML
+ * property in MSIE and Opera and a workaround for Gecko.
+ *
+ * <span class="attrib">@param</span> {HTMLElement} e HTML element to get outerHTML from.
+ * <span class="attrib">@return</span> HTML content string.
+ * <span class="attrib">@type</span> string
+ */</span>
+TinyMCE_Engine.<span class="reserved">prototype</span>.getOuterHTML = <span class="reserved">function</span>(e) {
+ <span class="reserved">if</span> (tinyMCE.isMSIE)
+ <span class="reserved">return</span> e.outerHTML;
+
+ var d = e.ownerDocument.createElement(<span class="literal">"body"</span>);
+ d.appendChild(e);
+ <span class="reserved">return</span> d.innerHTML;
+};
+
+<span class="comment">/**
+ * Sets the outer HTML of a element, this uses the outerHTML
+ * property in MSIE and Opera and a workaround for Gecko.
+ *
+ * <span class="attrib">@param</span> {HTMLElement} e HTML element to set outerHTML on.
+ * <span class="attrib">@param</span> {string} h HTML string to set in property.
+ */</span>
+TinyMCE_Engine.<span class="reserved">prototype</span>.setOuterHTML = <span class="reserved">function</span>(e, h) {
+ <span class="reserved">if</span> (tinyMCE.isMSIE) {
+ e.outerHTML = h;
+ <span class="reserved">return</span>;
+ }
+
+ var d = e.ownerDocument.createElement(<span class="literal">"body"</span>);
+ d.innerHTML = h;
+ e.parentNode.replaceChild(d.firstChild, e);
+};
+
+<span class="comment">/**
+ * Returns a element by id, this will also search the form names to match the id.
+ *
+ * <span class="attrib">@param</span> {string} id Id of element.
+ * <span class="attrib">@param</span> {DOMDocument} d Optional document.
+ * <span class="attrib">@return</span> HTML element that matches the id.
+ * <span class="attrib">@type</span> HTMLElement
+ */</span>
+TinyMCE_Engine.<span class="reserved">prototype</span>._getElementById = <span class="reserved">function</span>(id, d) {
+ var e, i, j, f;
+
+ <span class="reserved">if</span> (typeof(d) == <span class="literal">"undefined"</span>)
+ d = document;
+
+ e = d.getElementById(id);
+ <span class="reserved">if</span> (!e) {
+ f = d.forms;
+
+ <span class="reserved">for</span> (i=0; i<f.length; i++) {
+ <span class="reserved">for</span> (j=0; j<f[i].elements.length; j++) {
+ <span class="reserved">if</span> (f[i].elements[j].name == id) {
+ e = f[i].elements[j];
+ break;
+ }
+ }
+ }
+ }
+
+ <span class="reserved">return</span> e;
+};
+
+<span class="comment">/**
+ * Returns a array of nodes selected retrived from the child nodes of the specified node.
+ *
+ * <span class="attrib">@param</span> {HTMLNode} n Node to get children from.
+ * <span class="attrib">@param</span> {Array} na Array to fill with children.
+ * <span class="attrib">@param</span> {int} t Node type to get.
+ * <span class="attrib">@param</span> {string} nn Node name of items to retrive.
+ * <span class="attrib">@return</span> Node array.
+ * <span class="attrib">@type</span> Array
+ */</span>
+TinyMCE_Engine.<span class="reserved">prototype</span>.getNodeTree = <span class="reserved">function</span>(n, na, t, nn) {
+ var i;
+
+ <span class="reserved">if</span> (typeof(t) == <span class="literal">"undefined"</span> || n.nodeType == t && (typeof(nn) == <span class="literal">"undefined"</span> || n.nodeName == nn))
+ na[na.length] = n;
+
+ <span class="reserved">if</span> (n.hasChildNodes()) {
+ <span class="reserved">for</span> (i=0; i<n.childNodes.length; i++)
+ tinyMCE.getNodeTree(n.childNodes[i], na, t, nn);
+ }
+
+ <span class="reserved">return</span> na;
+};
+
+<span class="comment">/**
+ * Returns the parent element of the specified node based on the search criteria.
+ *
+ * <span class="attrib">@param</span> {HTMLNode} node Node to get parent element of.
+ * <span class="attrib">@param</span> {string} names Comma separated list of element names to get.
+ * <span class="attrib">@param</span> {string} attrib_name Optional attribute name to match.
+ * <span class="attrib">@param</span> {string} attrib_value Optional attribute value to match.
+ * <span class="attrib">@return</span> HTMLElement or null based on search criteras.
+ * <span class="attrib">@type</span> HTMLElement
+ */</span>
+TinyMCE_Engine.<span class="reserved">prototype</span>.getParentElement = <span class="reserved">function</span>(node, names, attrib_name, attrib_value) {
+ <span class="reserved">if</span> (typeof(names) == <span class="literal">"undefined"</span>) {
+ <span class="reserved">if</span> (node.nodeType == 1)
+ <span class="reserved">return</span> node;
+
+ <span class="comment">// Find parent node that is a element</span>
+ <span class="reserved">while</span> ((node = node.parentNode) != null && node.nodeType != 1) ;
+
+ <span class="reserved">return</span> node;
+ }
+
+ <span class="reserved">if</span> (node == null)
+ <span class="reserved">return</span> null;
+
+ var namesAr = names.toUpperCase().split(<span class="literal">','</span>);
+
+ do {
+ <span class="reserved">for</span> (var i=0; i<namesAr.length; i++) {
+ <span class="reserved">if</span> (node.nodeName == namesAr[i] || names == <span class="literal">"*"</span>) {
+ <span class="reserved">if</span> (typeof(attrib_name) == <span class="literal">"undefined"</span>)
+ <span class="reserved">return</span> node;
+ <span class="reserved">else</span> <span class="reserved">if</span> (node.getAttribute(attrib_name)) {
+ <span class="reserved">if</span> (typeof(attrib_value) == <span class="literal">"undefined"</span>) {
+ <span class="reserved">if</span> (node.getAttribute(attrib_name) != <span class="literal">""</span>)
+ <span class="reserved">return</span> node;
+ } <span class="reserved">else</span> <span class="reserved">if</span> (node.getAttribute(attrib_name) == attrib_value)
+ <span class="reserved">return</span> node;
+ }
+ }
+ }
+ } <span class="reserved">while</span> ((node = node.parentNode) != null);
+
+ <span class="reserved">return</span> null;
+};
+
+<span class="comment">/**
+ * Returns a node by the specified selector function. This function will
+ * loop through all parent nodes and call the specified function for each node.
+ * If the function then returns true it will stop the execution and return that node.
+ *
+ * <span class="attrib">@param</span> {DOMNode} n HTML node to search parents on.
+ * <span class="attrib">@param</span> {function} f Selection function to execute on each node.
+ * <span class="attrib">@return</span> DOMNode or null if it wasn't found.
+ * <span class="attrib">@type</span> DOMNode
+ */</span>
+TinyMCE_Engine.<span class="reserved">prototype</span>.getParentNode = <span class="reserved">function</span>(n, f) {
+ <span class="reserved">while</span> (n) {
+ <span class="reserved">if</span> (f(n))
+ <span class="reserved">return</span> n;
+
+ n = n.parentNode;
+ }
+
+ <span class="reserved">return</span> null;
+};
+
+<span class="comment">/**
+ * Returns the attribute value of a element or the default value if it wasn't found.
+ *
+ * <span class="attrib">@param</span> {HTMLElement} elm HTML element to get attribute from.
+ * <span class="attrib">@param</span> {string} name Attribute name to retrive.
+ * <span class="attrib">@param</span> {string} default_value Optional default value to return, this value defaults to a empty string.
+ * <span class="attrib">@return</span> Attribute value or default value if it wasn't found in element.
+ * <span class="attrib">@type</span> string
+ */</span>
+TinyMCE_Engine.<span class="reserved">prototype</span>.getAttrib = <span class="reserved">function</span>(elm, name, default_value) {
+ <span class="reserved">if</span> (typeof(default_value) == <span class="literal">"undefined"</span>)
+ default_value = <span class="literal">""</span>;
+
+ <span class="comment">// Not a element</span>
+ <span class="reserved">if</span> (!elm || elm.nodeType != 1)
+ <span class="reserved">return</span> default_value;
+
+ var v = elm.getAttribute(name);
+
+ <span class="comment">// Try className for class attrib</span>
+ <span class="reserved">if</span> (name == <span class="literal">"class"</span> && !v)
+ v = elm.className;
+
+ <span class="comment">// Workaround for a issue with Firefox 1.5rc2+</span>
+ <span class="reserved">if</span> (tinyMCE.isGecko && name == <span class="literal">"src"</span> && elm.src != null && elm.src != <span class="literal">""</span>)
+ v = elm.src;
+
+ <span class="comment">// Workaround for a issue with Firefox 1.5rc2+</span>
+ <span class="reserved">if</span> (tinyMCE.isGecko && name == <span class="literal">"href"</span> && elm.href != null && elm.href != <span class="literal">""</span>)
+ v = elm.href;
+
+ <span class="reserved">if</span> (name == <span class="literal">"http-equiv"</span> && tinyMCE.isMSIE)
+ v = elm.httpEquiv;
+
+ <span class="reserved">if</span> (name == <span class="literal">"style"</span> && !tinyMCE.isOpera)
+ v = elm.style.cssText;
+
+ <span class="reserved">return</span> (v && v != <span class="literal">""</span>) ? v : default_value;
+};
+
+<span class="comment">/**
+ * Sets the attribute value for a specific attribute.
+ *
+ * <span class="attrib">@param</span> {HTMLElement} element HTML element to set attribute on.
+ * <span class="attrib">@param</span> {string} name Attribute name to set.
+ * <span class="attrib">@param</span> {string} value Attribute value to set.
+ * <span class="attrib">@param</span> {boolean} fix_value Optional fix value state, if true only number data will be accepted.
+ */</span>
+TinyMCE_Engine.<span class="reserved">prototype</span>.setAttrib = <span class="reserved">function</span>(element, name, value, fix_value) {
+ <span class="reserved">if</span> (typeof(value) == <span class="literal">"number"</span> && value != null)
+ value = <span class="literal">""</span> + value;
+
+ <span class="reserved">if</span> (fix_value) {
+ <span class="reserved">if</span> (value == null)
+ value = <span class="literal">""</span>;
+
+ var re = new RegExp(<span class="literal">'[^0-9%]'</span>, <span class="literal">'g'</span>);
+ value = value.replace(re, <span class="literal">''</span>);
+ }
+
+ <span class="reserved">if</span> (name == <span class="literal">"style"</span>)
+ element.style.cssText = value;
+
+ <span class="reserved">if</span> (name == <span class="literal">"class"</span>)
+ element.className = value;
+
+ <span class="reserved">if</span> (value != null && value != <span class="literal">""</span> && value != -1)
+ element.setAttribute(name, value);
+ <span class="reserved">else</span>
+ element.removeAttribute(name);
+};
+
+<span class="comment">/**
+ * Sets a style attribute item value.
+ *
+ * <span class="attrib">@param</span> {HTMLElement} elm HTML element to set style attribute item on.
+ * <span class="attrib">@param</span> {string} name Style item name to set.
+ * <span class="attrib">@param</span> {string} value Style item value to set.
+ */</span>
+TinyMCE_Engine.<span class="reserved">prototype</span>.setStyleAttrib = <span class="reserved">function</span>(elm, name, value) {
+ eval(<span class="literal">'elm.style.'</span> + name + <span class="literal">'=value;'</span>);
+
+ <span class="comment">// Style attrib deleted</span>
+ <span class="reserved">if</span> (tinyMCE.isMSIE && value == null || value == <span class="literal">''</span>) {
+ var str = tinyMCE.serializeStyle(tinyMCE.parseStyle(elm.style.cssText));
+ elm.style.cssText = str;
+ elm.setAttribute(<span class="literal">"style"</span>, str);
+ }
+};
+
+<span class="comment">/**
+ * Switches the CSS class of the specified element. This method also caches the
+ * elements in a lookup table for performance. This should only be used for TinyMCE main UI controls
+ * like buttons or select elements.
+ *
+ * <span class="attrib">@param</span> {HTMLElement} ei Element to set CSS class on.
+ * <span class="attrib">@param</span> {string} c CSS class to set.
+ */</span>
+TinyMCE_Engine.<span class="reserved">prototype</span>.switchClass = <span class="reserved">function</span>(ei, c) {
+ var e;
+
+ <span class="reserved">if</span> (tinyMCE.switchClassCache[ei])
+ e = tinyMCE.switchClassCache[ei];
+ <span class="reserved">else</span>
+ e = tinyMCE.switchClassCache[ei] = document.getElementById(ei);
+
+ <span class="reserved">if</span> (e) {
+ <span class="comment">// Keep tile mode</span>
+ <span class="reserved">if</span> (tinyMCE.settings.button_tile_map && e.className && e.className.indexOf(<span class="literal">'mceTiledButton'</span>) == 0)
+ c = <span class="literal">'mceTiledButton '</span> + c;
+
+ e.className = c;
+ }
+};
+
+<span class="comment">/**
+ * Returns the absolute x, y position of a node. The position will be returned in a object with
+ * two properties absLeft and absTop.
+ *
+ * <span class="attrib">@param</span> {HTMLNode} n HTML element to get x, y position from.
+ * <span class="attrib">@return</span> Absolute position of the specified element.
+ * <span class="attrib">@type</span> TinyMCE_ElementPosition
+ */</span>
+TinyMCE_Engine.<span class="reserved">prototype</span>.getAbsPosition = <span class="reserved">function</span>(n) {
+ var p = {absLeft : 0, absTop : 0};
+
+ <span class="reserved">while</span> (n) {
+ p.absLeft += n.offsetLeft;
+ p.absTop += n.offsetTop;
+ n = n.offsetParent;
+ }
+
+ <span class="reserved">return</span> p;
+};
+
+<span class="comment">/**
+ * Finds any previous element by name. This will loop through the siblings
+ * inorder to find the specified element by name. If the element wasn't found
+ * it will return a null value.
+ *
+ * <span class="attrib">@param</span> {HTMLNode} e HTML node to search from.
+ * <span class="attrib">@param</span> {string} n Comma separated list of element names to search for.
+ * <span class="attrib">@return</span> HTML Element or null if it wasn't found.
+ * <span class="attrib">@type</span> HTMLElement
+ */</span>
+TinyMCE_Engine.<span class="reserved">prototype</span>.prevNode = <span class="reserved">function</span>(e, n) {
+ var a = n.split(<span class="literal">','</span>), i;
+
+ <span class="reserved">while</span> ((e = e.previousSibling) != null) {
+ <span class="reserved">for</span> (i=0; i<a.length; i++) {
+ <span class="reserved">if</span> (e.nodeName == a[i])
+ <span class="reserved">return</span> e;
+ }
+ }
+
+ <span class="reserved">return</span> null;
+};
+
+<span class="comment">/**
+ * Finds any element after the current one by name. This will loop through the siblings
+ * inorder to find the specified element by name. If the element wasn't found
+ * it will return a null value.
+ *
+ * <span class="attrib">@param</span> {HTMLNode} e HTML node to search from.
+ * <span class="attrib">@param</span> {string} n Comma separated list of element names to search for.
+ * <span class="attrib">@return</span> HTML Element or null if it wasn't found.
+ * <span class="attrib">@type</span> HTMLElement
+ */</span>
+TinyMCE_Engine.<span class="reserved">prototype</span>.nextNode = <span class="reserved">function</span>(e, n) {
+ var a = n.split(<span class="literal">','</span>), i;
+
+ <span class="reserved">while</span> ((e = e.nextSibling) != null) {
+ <span class="reserved">for</span> (i=0; i<a.length; i++) {
+ <span class="reserved">if</span> (e.nodeName == a[i])
+ <span class="reserved">return</span> e;
+ }
+ }
+
+ <span class="reserved">return</span> null;
+};
+
+<span class="comment">/**
+ * Returns a array of nodes when the specified function matches a node.
+ *
+ * <span class="attrib">@param</span> {DOMNode} n Node to select children from.
+ * <span class="attrib">@param</span> {function} f Function that returns true/false if the node is to be added or not.
+ * <span class="attrib">@param</span> {Array} a Optional array to fill with nodes.
+ * <span class="attrib">@return</span> Array with selected nodes.
+ * <span class="attrib">@type</span> Array
+ */</span>
+TinyMCE_Engine.<span class="reserved">prototype</span>.selectNodes = <span class="reserved">function</span>(n, f, a) {
+ var i;
+
+ <span class="reserved">if</span> (!a)
+ a = new Array();
+
+ <span class="reserved">if</span> (f(n))
+ a[a.length] = n;
+
+ <span class="reserved">if</span> (n.hasChildNodes()) {
+ <span class="reserved">for</span> (i=0; i<n.childNodes.length; i++)
+ tinyMCE.selectNodes(n.childNodes[i], f, a);
+ }
+
+ <span class="reserved">return</span> a;
+};
+
+<span class="comment">/**
+ * Adds a CSS class to the specified element. It will remove any previous item with the same name
+ * so adding a class that already exists will move it to the end.
+ *
+ * <span class="attrib">@param</span> {HTMLElement} e HTML element to add CSS class to.
+ * <span class="attrib">@param</span> {string] c CSS class to add to HTML element.
+ * <span class="attrib">@param</span> {boolean] b Optional parameter, if set to true, class will be added to the beginning.
+ * <span class="attrib">@return</span> Returns the new class attribute value.
+ * <span class="attrib">@type</span> string
+ */</span>
+TinyMCE_Engine.<span class="reserved">prototype</span>.addCSSClass = <span class="reserved">function</span>(e, c, b) {
+ var o = <span class="reserved">this</span>.removeCSSClass(e, c);
+
+ <span class="reserved">return</span> e.className = b ? c + (o != <span class="literal">''</span> ? (<span class="literal">' '</span> + o) : <span class="literal">''</span>) : (o != <span class="literal">''</span> ? (o + <span class="literal">' '</span>) : <span class="literal">''</span>) + c;
+};
+
+<span class="comment">/**
+ * Removes the specified CSS class from the element.
+ *
+ * <span class="attrib">@param</span> {HTMLElement} e HTML element to remove CSS class to.
+ * <span class="attrib">@param</span> {string] c CSS class to remove to HTML element.
+ * <span class="attrib">@return</span> Returns the new class attribute value.
+ * <span class="attrib">@type</span> string
+ */</span>
+TinyMCE_Engine.<span class="reserved">prototype</span>.removeCSSClass = <span class="reserved">function</span>(e, c) {
+ var a = <span class="reserved">this</span>.explode(<span class="literal">' '</span>, e.className), i;
+
+ <span class="reserved">for</span> (i=0; i<a.length; i++) {
+ <span class="reserved">if</span> (a[i] == c)
+ a[i] = <span class="literal">''</span>;
+ }
+
+ <span class="reserved">return</span> e.className = a.join(<span class="literal">' '</span>);
+};
+
+<span class="comment">/**
+ * Renames the specified element to the specified name.
+ *
+ * <span class="attrib">@param</span> {HTMLElement} e Element to rename.
+ * <span class="attrib">@param</span> {string} n New name of the element.
+ * <span class="attrib">@param</span> {DOMDocument} d Optional document reference.
+ */</span>
+TinyMCE_Engine.<span class="reserved">prototype</span>.renameElement = <span class="reserved">function</span>(e, n, d) {
+ var ne, i, ar;
+
+ d = typeof(d) == <span class="literal">"undefined"</span> ? tinyMCE.selectedInstance.getDoc() : d;
+
+ <span class="reserved">if</span> (e) {
+ ne = d.createElement(n);
+
+ ar = e.attributes;
+ <span class="reserved">for</span> (i=ar.length-1; i>-1; i--) {
+ <span class="reserved">if</span> (ar[i].specified && ar[i].nodeValue)
+ ne.setAttribute(ar[i].nodeName.toLowerCase(), ar[i].nodeValue);
+ }
+
+ ar = e.childNodes;
+ <span class="reserved">for</span> (i=0; i<ar.length; i++)
+ ne.appendChild(ar[i].cloneNode(true));
+
+ e.parentNode.replaceChild(ne, e);
+ }
+};
+</pre>
+ <hr>
+
+
+
+<!-- ========== START OF NAVBAR ========== -->
+<a name="navbar_top"><!-- --></a>
+<table border="0" width="100%" cellpadding="1" cellspacing="0">
+<tr>
+<td colspan=2 bgcolor="#EEEEFF" class="NavBarCell1">
+<a name="navbar_top_firstrow"><!-- --></a>
+<table border="0" cellpadding="0" cellspacing="3">
+ <tr align="center" valign="top">
+
+
+ <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="overview-summary.html"><font class="NavBarFont1"><b>Overview</b></font></a> </td>
+ <td bgcolor="#FFFFFF" class="NavBarCell1Rev"> <font class="NavBarFont1Rev"><b>File</b></font> </td>
+
+
+ <td bgcolor="#FFFFFF" class="NavBarCell1"> <font class="NavBarFont1">Class</font> </td>
+ <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="overview-tree.html"><font class="NavBarFont1"><b>Tree</b></font></a> </td>
+ <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="index-all.html"--><font class="NavBarFont1"><b>Index</b></font></a> </td>
+ <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="help-doc.html"><font class="NavBarFont1"><b>Help</b></font></a> </td>
+ </tr>
+</table>
+</td>
+<td bgcolor="#EEEEFF" align="right" valign="top"><em>
+<b></b></em>
+</td>
+</tr>
+
+<tr>
+<td bgcolor="white" class="NavBarCell2"><font size="-2">
+ PREV
+ NEXT</font></td>
+<td bgcolor="white" class="NavBarCell2"><font size="-2">
+ <a href="index.html" target="_top"><b>FRAMES</b></a>
+ <a href="overview-summary.html" target="_top"><b>NO FRAMES</b></a>
+
+<script>
+ <!--
+ if(window==top) {
+ document.writeln('<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>');
+ }
+ //-->
+</script>
+<noscript>
+<a href="allclasses-noframe.html" target=""><b>All Classes</b></a>
+</noscript>
+</font></td>
+</tr>
+</table>
+<!-- =========== END OF NAVBAR =========== -->
+
+<hr>
+<font size="-1">
+
+</font>
+<div class="jsdoc_ctime">Documentation generated by <a href="http://jsdoc.sourceforge.net/" target="_parent">JSDoc</a> on Fri Apr 14 21:59:23 2006</div>
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/tinymce_api/overview-summary-TinyMCE_Debug.class.js.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/tinymce_api/overview-summary-TinyMCE_Debug.class.js.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/tinymce_api/overview-summary-TinyMCE_Debug.class.js.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,193 +0,0 @@
-<!doctype html public "-//W3C//DTD HTML 4.0 Frameset//EN""http://www.w3.org/TR/REC-html40/frameset.dtd">
-<html>
-<head>
-<title>
- Overview
-</title>
-<link rel ="stylesheet" type="text/css" href="stylesheet.css" title="Style">
-<script>
-function asd() {
-
- parent.document.title="TinyMCE_Debug.class.js Overview";
-
-}
-</script>
-</head>
-<body bgcolor="white" onload="asd();">
-
-<!-- ========== START OF NAVBAR ========== -->
-<a name="navbar_top"><!-- --></a>
-<table border="0" width="100%" cellpadding="1" cellspacing="0">
-<tr>
-<td colspan=2 bgcolor="#EEEEFF" class="NavBarCell1">
-<a name="navbar_top_firstrow"><!-- --></a>
-<table border="0" cellpadding="0" cellspacing="3">
- <tr align="center" valign="top">
-
-
- <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="overview-summary.html"><font class="NavBarFont1"><b>Overview</b></font></a> </td>
- <td bgcolor="#FFFFFF" class="NavBarCell1Rev"> <font class="NavBarFont1Rev"><b>File</b></font> </td>
-
-
- <td bgcolor="#FFFFFF" class="NavBarCell1"> <font class="NavBarFont1">Class</font> </td>
- <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="overview-tree.html"><font class="NavBarFont1"><b>Tree</b></font></a> </td>
- <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="index-all.html"--><font class="NavBarFont1"><b>Index</b></font></a> </td>
- <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="help-doc.html"><font class="NavBarFont1"><b>Help</b></font></a> </td>
- </tr>
-</table>
-</td>
-<td bgcolor="#EEEEFF" align="right" valign="top">
-<em>
-<b></b></em>
-</td>
-</tr>
-
-<tr>
-<td bgcolor="white" class="NavBarCell2"><font size="-2">
- PREV
- NEXT</font></td>
-<td bgcolor="white" class="NavBarCell2"><font size="-2">
- <a href="index.html" target="_top"><b>FRAMES</b></a>
- <a href="overview-summary.html" target="_top"><b>NO FRAMES</b></a>
-
-<script>
- <!--
- if(window==top) {
- document.writeln('<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>');
- }
- //-->
-</script>
-<noscript>
-<a href="allclasses-noframe.html" target=""><b>All Classes</b></a>
-</noscript>
-</font></td>
-</tr>
-</table>
-<!-- =========== END OF NAVBAR =========== -->
-
-<hr>
-<center>
-
- <h2>TinyMCE_Debug.class.js</h2>
-
-</center>
-
-
-
-
-<h4>Summary</h4>
-<p>
-
- No overview generated for 'TinyMCE_Debug.class.js'<BR/><BR/>
-
-</p>
-
-<hr>
-
-
-
-<!-- ========== METHOD SUMMARY =========== -->
-
-<!-- ========== END METHOD SUMMARY =========== -->
-
-
- <pre class="sourceview"><span class="comment">/**
- * $RCSfile: overview-summary-TinyMCE_Debug.class.js.html,v $
- * $Revision: 1.42 $
- * $Date: 2006/04/14 20:00:29 $
- *
- * <span class="attrib">@author</span> Moxiecode
- * <span class="attrib">@copyright</span> Copyright © 2004-2006, Moxiecode Systems AB, All rights reserved.
- *
- * The contents of this file will be wrapped in a class later on.
- */</span>
-
-<span class="comment">/**
- * Debugs the specified message to a screen.
- *
- * <span class="attrib">@param</span> {1..n} Numerous arguments that will be outputed.
- */</span>
-TinyMCE_Engine.<span class="reserved">prototype</span>.debug = <span class="reserved">function</span>() {
- var m = <span class="literal">""</span>, e, a, i;
-
- e = document.getElementById(<span class="literal">"tinymce_debug"</span>);
- <span class="reserved">if</span> (!e) {
- var d = document.createElement(<span class="literal">"div"</span>);
- d.setAttribute(<span class="literal">"className"</span>, <span class="literal">"debugger"</span>);
- d.className = <span class="literal">"debugger"</span>;
- d.innerHTML = <span class="literal">'Debug output:<textarea id="tinymce_debug" style="width: 100%; height: 300px" wrap="nowrap" mce_editable="false"></textarea>'</span>;
-
- document.body.appendChild(d);
- e = document.getElementById(<span class="literal">"tinymce_debug"</span>);
- }
-
- a = <span class="reserved">this</span>.debug.arguments;
- <span class="reserved">for</span> (i=0; i<a.length; i++) {
- m += a[i];
- <span class="reserved">if</span> (i<a.length-1)
- m += <span class="literal">', '</span>;
- }
-
- e.value += m + <span class="literal">"\n"</span>;
-};
-</pre>
- <hr>
-
-
-
-<!-- ========== START OF NAVBAR ========== -->
-<a name="navbar_top"><!-- --></a>
-<table border="0" width="100%" cellpadding="1" cellspacing="0">
-<tr>
-<td colspan=2 bgcolor="#EEEEFF" class="NavBarCell1">
-<a name="navbar_top_firstrow"><!-- --></a>
-<table border="0" cellpadding="0" cellspacing="3">
- <tr align="center" valign="top">
-
-
- <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="overview-summary.html"><font class="NavBarFont1"><b>Overview</b></font></a> </td>
- <td bgcolor="#FFFFFF" class="NavBarCell1Rev"> <font class="NavBarFont1Rev"><b>File</b></font> </td>
-
-
- <td bgcolor="#FFFFFF" class="NavBarCell1"> <font class="NavBarFont1">Class</font> </td>
- <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="overview-tree.html"><font class="NavBarFont1"><b>Tree</b></font></a> </td>
- <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="index-all.html"--><font class="NavBarFont1"><b>Index</b></font></a> </td>
- <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="help-doc.html"><font class="NavBarFont1"><b>Help</b></font></a> </td>
- </tr>
-</table>
-</td>
-<td bgcolor="#EEEEFF" align="right" valign="top"><em>
-<b></b></em>
-</td>
-</tr>
-
-<tr>
-<td bgcolor="white" class="NavBarCell2"><font size="-2">
- PREV
- NEXT</font></td>
-<td bgcolor="white" class="NavBarCell2"><font size="-2">
- <a href="index.html" target="_top"><b>FRAMES</b></a>
- <a href="overview-summary.html" target="_top"><b>NO FRAMES</b></a>
-
-<script>
- <!--
- if(window==top) {
- document.writeln('<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>');
- }
- //-->
-</script>
-<noscript>
-<a href="allclasses-noframe.html" target=""><b>All Classes</b></a>
-</noscript>
-</font></td>
-</tr>
-</table>
-<!-- =========== END OF NAVBAR =========== -->
-
-<hr>
-<font size="-1">
-
-</font>
-<div class="jsdoc_ctime">Documentation generated by <a href="http://jsdoc.sourceforge.net/" target="_parent">JSDoc</a> on Fri Apr 14 21:59:23 2006</div>
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/tinymce_api/overview-summary-TinyMCE_Debug.class.js.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/tinymce_api/overview-summary-TinyMCE_Debug.class.js.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/tinymce_api/overview-summary-TinyMCE_Debug.class.js.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/tinymce_api/overview-summary-TinyMCE_Debug.class.js.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,193 @@
+<!doctype html public "-//W3C//DTD HTML 4.0 Frameset//EN""http://www.w3.org/TR/REC-html40/frameset.dtd">
+<html>
+<head>
+<title>
+ Overview
+</title>
+<link rel ="stylesheet" type="text/css" href="stylesheet.css" title="Style">
+<script>
+function asd() {
+
+ parent.document.title="TinyMCE_Debug.class.js Overview";
+
+}
+</script>
+</head>
+<body bgcolor="white" onload="asd();">
+
+<!-- ========== START OF NAVBAR ========== -->
+<a name="navbar_top"><!-- --></a>
+<table border="0" width="100%" cellpadding="1" cellspacing="0">
+<tr>
+<td colspan=2 bgcolor="#EEEEFF" class="NavBarCell1">
+<a name="navbar_top_firstrow"><!-- --></a>
+<table border="0" cellpadding="0" cellspacing="3">
+ <tr align="center" valign="top">
+
+
+ <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="overview-summary.html"><font class="NavBarFont1"><b>Overview</b></font></a> </td>
+ <td bgcolor="#FFFFFF" class="NavBarCell1Rev"> <font class="NavBarFont1Rev"><b>File</b></font> </td>
+
+
+ <td bgcolor="#FFFFFF" class="NavBarCell1"> <font class="NavBarFont1">Class</font> </td>
+ <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="overview-tree.html"><font class="NavBarFont1"><b>Tree</b></font></a> </td>
+ <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="index-all.html"--><font class="NavBarFont1"><b>Index</b></font></a> </td>
+ <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="help-doc.html"><font class="NavBarFont1"><b>Help</b></font></a> </td>
+ </tr>
+</table>
+</td>
+<td bgcolor="#EEEEFF" align="right" valign="top">
+<em>
+<b></b></em>
+</td>
+</tr>
+
+<tr>
+<td bgcolor="white" class="NavBarCell2"><font size="-2">
+ PREV
+ NEXT</font></td>
+<td bgcolor="white" class="NavBarCell2"><font size="-2">
+ <a href="index.html" target="_top"><b>FRAMES</b></a>
+ <a href="overview-summary.html" target="_top"><b>NO FRAMES</b></a>
+
+<script>
+ <!--
+ if(window==top) {
+ document.writeln('<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>');
+ }
+ //-->
+</script>
+<noscript>
+<a href="allclasses-noframe.html" target=""><b>All Classes</b></a>
+</noscript>
+</font></td>
+</tr>
+</table>
+<!-- =========== END OF NAVBAR =========== -->
+
+<hr>
+<center>
+
+ <h2>TinyMCE_Debug.class.js</h2>
+
+</center>
+
+
+
+
+<h4>Summary</h4>
+<p>
+
+ No overview generated for 'TinyMCE_Debug.class.js'<BR/><BR/>
+
+</p>
+
+<hr>
+
+
+
+<!-- ========== METHOD SUMMARY =========== -->
+
+<!-- ========== END METHOD SUMMARY =========== -->
+
+
+ <pre class="sourceview"><span class="comment">/**
+ * $RCSfile: overview-summary-TinyMCE_Debug.class.js.html,v $
+ * $Revision: 1.42 $
+ * $Date: 2006/04/14 20:00:29 $
+ *
+ * <span class="attrib">@author</span> Moxiecode
+ * <span class="attrib">@copyright</span> Copyright © 2004-2006, Moxiecode Systems AB, All rights reserved.
+ *
+ * The contents of this file will be wrapped in a class later on.
+ */</span>
+
+<span class="comment">/**
+ * Debugs the specified message to a screen.
+ *
+ * <span class="attrib">@param</span> {1..n} Numerous arguments that will be outputed.
+ */</span>
+TinyMCE_Engine.<span class="reserved">prototype</span>.debug = <span class="reserved">function</span>() {
+ var m = <span class="literal">""</span>, e, a, i;
+
+ e = document.getElementById(<span class="literal">"tinymce_debug"</span>);
+ <span class="reserved">if</span> (!e) {
+ var d = document.createElement(<span class="literal">"div"</span>);
+ d.setAttribute(<span class="literal">"className"</span>, <span class="literal">"debugger"</span>);
+ d.className = <span class="literal">"debugger"</span>;
+ d.innerHTML = <span class="literal">'Debug output:<textarea id="tinymce_debug" style="width: 100%; height: 300px" wrap="nowrap" mce_editable="false"></textarea>'</span>;
+
+ document.body.appendChild(d);
+ e = document.getElementById(<span class="literal">"tinymce_debug"</span>);
+ }
+
+ a = <span class="reserved">this</span>.debug.arguments;
+ <span class="reserved">for</span> (i=0; i<a.length; i++) {
+ m += a[i];
+ <span class="reserved">if</span> (i<a.length-1)
+ m += <span class="literal">', '</span>;
+ }
+
+ e.value += m + <span class="literal">"\n"</span>;
+};
+</pre>
+ <hr>
+
+
+
+<!-- ========== START OF NAVBAR ========== -->
+<a name="navbar_top"><!-- --></a>
+<table border="0" width="100%" cellpadding="1" cellspacing="0">
+<tr>
+<td colspan=2 bgcolor="#EEEEFF" class="NavBarCell1">
+<a name="navbar_top_firstrow"><!-- --></a>
+<table border="0" cellpadding="0" cellspacing="3">
+ <tr align="center" valign="top">
+
+
+ <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="overview-summary.html"><font class="NavBarFont1"><b>Overview</b></font></a> </td>
+ <td bgcolor="#FFFFFF" class="NavBarCell1Rev"> <font class="NavBarFont1Rev"><b>File</b></font> </td>
+
+
+ <td bgcolor="#FFFFFF" class="NavBarCell1"> <font class="NavBarFont1">Class</font> </td>
+ <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="overview-tree.html"><font class="NavBarFont1"><b>Tree</b></font></a> </td>
+ <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="index-all.html"--><font class="NavBarFont1"><b>Index</b></font></a> </td>
+ <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="help-doc.html"><font class="NavBarFont1"><b>Help</b></font></a> </td>
+ </tr>
+</table>
+</td>
+<td bgcolor="#EEEEFF" align="right" valign="top"><em>
+<b></b></em>
+</td>
+</tr>
+
+<tr>
+<td bgcolor="white" class="NavBarCell2"><font size="-2">
+ PREV
+ NEXT</font></td>
+<td bgcolor="white" class="NavBarCell2"><font size="-2">
+ <a href="index.html" target="_top"><b>FRAMES</b></a>
+ <a href="overview-summary.html" target="_top"><b>NO FRAMES</b></a>
+
+<script>
+ <!--
+ if(window==top) {
+ document.writeln('<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>');
+ }
+ //-->
+</script>
+<noscript>
+<a href="allclasses-noframe.html" target=""><b>All Classes</b></a>
+</noscript>
+</font></td>
+</tr>
+</table>
+<!-- =========== END OF NAVBAR =========== -->
+
+<hr>
+<font size="-1">
+
+</font>
+<div class="jsdoc_ctime">Documentation generated by <a href="http://jsdoc.sourceforge.net/" target="_parent">JSDoc</a> on Fri Apr 14 21:59:23 2006</div>
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/tinymce_api/overview-summary-TinyMCE_Engine.class.js.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/tinymce_api/overview-summary-TinyMCE_Engine.class.js.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/tinymce_api/overview-summary-TinyMCE_Engine.class.js.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,2890 +0,0 @@
-<!doctype html public "-//W3C//DTD HTML 4.0 Frameset//EN""http://www.w3.org/TR/REC-html40/frameset.dtd">
-<html>
-<head>
-<title>
- Overview
-</title>
-<link rel ="stylesheet" type="text/css" href="stylesheet.css" title="Style">
-<script>
-function asd() {
-
- parent.document.title="TinyMCE_Engine.class.js Overview";
-
-}
-</script>
-</head>
-<body bgcolor="white" onload="asd();">
-
-<!-- ========== START OF NAVBAR ========== -->
-<a name="navbar_top"><!-- --></a>
-<table border="0" width="100%" cellpadding="1" cellspacing="0">
-<tr>
-<td colspan=2 bgcolor="#EEEEFF" class="NavBarCell1">
-<a name="navbar_top_firstrow"><!-- --></a>
-<table border="0" cellpadding="0" cellspacing="3">
- <tr align="center" valign="top">
-
-
- <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="overview-summary.html"><font class="NavBarFont1"><b>Overview</b></font></a> </td>
- <td bgcolor="#FFFFFF" class="NavBarCell1Rev"> <font class="NavBarFont1Rev"><b>File</b></font> </td>
-
-
- <td bgcolor="#FFFFFF" class="NavBarCell1"> <font class="NavBarFont1">Class</font> </td>
- <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="overview-tree.html"><font class="NavBarFont1"><b>Tree</b></font></a> </td>
- <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="index-all.html"--><font class="NavBarFont1"><b>Index</b></font></a> </td>
- <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="help-doc.html"><font class="NavBarFont1"><b>Help</b></font></a> </td>
- </tr>
-</table>
-</td>
-<td bgcolor="#EEEEFF" align="right" valign="top">
-<em>
-<b></b></em>
-</td>
-</tr>
-
-<tr>
-<td bgcolor="white" class="NavBarCell2"><font size="-2">
- PREV
- NEXT</font></td>
-<td bgcolor="white" class="NavBarCell2"><font size="-2">
- <a href="index.html" target="_top"><b>FRAMES</b></a>
- <a href="overview-summary.html" target="_top"><b>NO FRAMES</b></a>
-
-<script>
- <!--
- if(window==top) {
- document.writeln('<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>');
- }
- //-->
-</script>
-<noscript>
-<a href="allclasses-noframe.html" target=""><b>All Classes</b></a>
-</noscript>
-</font></td>
-</tr>
-</table>
-<!-- =========== END OF NAVBAR =========== -->
-
-<hr>
-<center>
-
- <h2>TinyMCE_Engine.class.js</h2>
-
-</center>
-
-
-
-
-<h4>Summary</h4>
-<p>
-
- No overview generated for 'TinyMCE_Engine.class.js'<BR/><BR/>
-
-</p>
-
-<hr>
-
-
- <table border="1" cellpadding="3" cellspacing="0" width="100%">
- <tr bgcolor="#CCCCFF" class="TableHeadingColor">
- <td colspan=2><font size="+2">
-
- <b>Class Summary</b>
-
- </font></td>
- </tr>
-
- <tr bgcolor="white" class="TableRowColor">
- <td width="15%"><b><a href="TinyMCE_Engine.html">TinyMCE_Engine</a></b></td>
- <td> </td>
- </tr>
-
- </table>
- <hr/>
-
-
-<!-- ========== METHOD SUMMARY =========== -->
-
-<!-- ========== END METHOD SUMMARY =========== -->
-
-
- <pre class="sourceview"><span class="comment">/**
- * $RCSfile: overview-summary-TinyMCE_Engine.class.js.html,v $
- * $Revision: 1.42 $
- * $Date: 2006/04/14 20:00:29 $
- *
- * <span class="attrib">@author</span> Moxiecode
- * <span class="attrib">@copyright</span> Copyright © 2004-2006, Moxiecode Systems AB, All rights reserved.
- */</span>
-
-<span class="comment">/**
- * Core engine class for TinyMCE, a instance of this class is available as a global called tinyMCE.
- *
- * <span class="attrib">@constructor</span>
- */</span>
-<span class="reserved">function</span> TinyMCE_Engine() {
- <span class="reserved">this</span>.majorVersion = <span class="literal">"2"</span>;
- <span class="reserved">this</span>.minorVersion = <span class="literal">"0.6"</span>;
- <span class="reserved">this</span>.releaseDate = <span class="literal">"2006-xx-xx"</span>;
-
- <span class="reserved">this</span>.instances = new Array();
- <span class="reserved">this</span>.switchClassCache = new Array();
- <span class="reserved">this</span>.windowArgs = new Array();
- <span class="reserved">this</span>.loadedFiles = new Array();
- <span class="reserved">this</span>.configs = new Array();
- <span class="reserved">this</span>.currentConfig = 0;
- <span class="reserved">this</span>.eventHandlers = new Array();
-
- <span class="comment">// Browser check</span>
- var ua = navigator.userAgent;
- <span class="reserved">this</span>.isMSIE = (navigator.appName == <span class="literal">"Microsoft Internet Explorer"</span>);
- <span class="reserved">this</span>.isMSIE5 = <span class="reserved">this</span>.isMSIE && (ua.indexOf(<span class="literal">'MSIE 5'</span>) != -1);
- <span class="reserved">this</span>.isMSIE5_0 = <span class="reserved">this</span>.isMSIE && (ua.indexOf(<span class="literal">'MSIE 5.0'</span>) != -1);
- <span class="reserved">this</span>.isGecko = ua.indexOf(<span class="literal">'Gecko'</span>) != -1;
- <span class="reserved">this</span>.isSafari = ua.indexOf(<span class="literal">'Safari'</span>) != -1;
- <span class="reserved">this</span>.isOpera = ua.indexOf(<span class="literal">'Opera'</span>) != -1;
- <span class="reserved">this</span>.isMac = ua.indexOf(<span class="literal">'Mac'</span>) != -1;
- <span class="reserved">this</span>.isNS7 = ua.indexOf(<span class="literal">'Netscape/7'</span>) != -1;
- <span class="reserved">this</span>.isNS71 = ua.indexOf(<span class="literal">'Netscape/7.1'</span>) != -1;
- <span class="reserved">this</span>.dialogCounter = 0;
- <span class="reserved">this</span>.plugins = new Array();
- <span class="reserved">this</span>.themes = new Array();
- <span class="reserved">this</span>.menus = new Array();
- <span class="reserved">this</span>.loadedPlugins = new Array();
- <span class="reserved">this</span>.buttonMap = new Array();
- <span class="reserved">this</span>.isLoaded = false;
-
- <span class="comment">// Fake MSIE on Opera and if Opera fakes IE, Gecko or Safari cancel those</span>
- <span class="reserved">if</span> (<span class="reserved">this</span>.isOpera) {
- <span class="reserved">this</span>.isMSIE = true;
- <span class="reserved">this</span>.isGecko = false;
- <span class="reserved">this</span>.isSafari = false;
- }
-
- <span class="comment">// TinyMCE editor id instance counter</span>
- <span class="reserved">this</span>.idCounter = 0;
-};
-
-TinyMCE_Engine.<span class="reserved">prototype</span> = {
- <span class="comment">/**
- * Initializes TinyMCE with the specific configuration settings. This method
- * may be called multiple times when multiple instances with diffrent settings is to be created.
- *
- * <span class="attrib">@param</span> {Array} Name/Value array of initialization settings.
- */</span>
- init : <span class="reserved">function</span>(settings) {
- var theme;
-
- <span class="reserved">this</span>.settings = settings;
-
- <span class="comment">// Check if valid browser has execcommand support</span>
- <span class="reserved">if</span> (typeof(document.execCommand) == <span class="literal">'undefined'</span>)
- <span class="reserved">return</span>;
-
- <span class="comment">// Get script base path</span>
- <span class="reserved">if</span> (!tinyMCE.baseURL) {
- var elements = document.getElementsByTagName(<span class="literal">'script'</span>);
-
- <span class="reserved">for</span> (var i=0; i<elements.length; i++) {
- <span class="reserved">if</span> (elements[i].src && (elements[i].src.indexOf(<span class="literal">"tiny_mce.js"</span>) != -1 || elements[i].src.indexOf(<span class="literal">"tiny_mce_dev.js"</span>) != -1 || elements[i].src.indexOf(<span class="literal">"tiny_mce_src.js"</span>) != -1 || elements[i].src.indexOf(<span class="literal">"tiny_mce_gzip"</span>) != -1)) {
- var src = elements[i].src;
-
- tinyMCE.srcMode = (src.indexOf(<span class="literal">'_src'</span>) != -1 || src.indexOf(<span class="literal">'_dev'</span>) != -1) ? <span class="literal">'_src'</span> : <span class="literal">''</span>;
- tinyMCE.gzipMode = src.indexOf(<span class="literal">'_gzip'</span>) != -1;
- src = src.substring(0, src.lastIndexOf(<span class="literal">'/'</span>));
-
- <span class="reserved">if</span> (settings.exec_mode == <span class="literal">"src"</span> || settings.exec_mode == <span class="literal">"normal"</span>)
- tinyMCE.srcMode = settings.exec_mode == <span class="literal">"src"</span> ? <span class="literal">'_src'</span> : <span class="literal">''</span>;
-
- tinyMCE.baseURL = src;
- break;
- }
- }
- }
-
- <span class="comment">// Get document base path</span>
- <span class="reserved">this</span>.documentBasePath = document.location.href;
- <span class="reserved">if</span> (<span class="reserved">this</span>.documentBasePath.indexOf(<span class="literal">'?'</span>) != -1)
- <span class="reserved">this</span>.documentBasePath = <span class="reserved">this</span>.documentBasePath.substring(0, <span class="reserved">this</span>.documentBasePath.indexOf(<span class="literal">'?'</span>));
- <span class="reserved">this</span>.documentURL = <span class="reserved">this</span>.documentBasePath;
- <span class="reserved">this</span>.documentBasePath = <span class="reserved">this</span>.documentBasePath.substring(0, <span class="reserved">this</span>.documentBasePath.lastIndexOf(<span class="literal">'/'</span>));
-
- <span class="comment">// If not HTTP absolute</span>
- <span class="reserved">if</span> (tinyMCE.baseURL.indexOf(<span class="literal">'://'</span>) == -1 && tinyMCE.baseURL.charAt(0) != <span class="literal">'/'</span>) {
- <span class="comment">// If site absolute</span>
- tinyMCE.baseURL = <span class="reserved">this</span>.documentBasePath + <span class="literal">"/"</span> + tinyMCE.baseURL;
- }
-
- <span class="comment">// Set default values on settings</span>
- <span class="reserved">this</span>._def(<span class="literal">"mode"</span>, <span class="literal">"none"</span>);
- <span class="reserved">this</span>._def(<span class="literal">"theme"</span>, <span class="literal">"advanced"</span>);
- <span class="reserved">this</span>._def(<span class="literal">"plugins"</span>, <span class="literal">""</span>, true);
- <span class="reserved">this</span>._def(<span class="literal">"language"</span>, <span class="literal">"en"</span>);
- <span class="reserved">this</span>._def(<span class="literal">"docs_language"</span>, <span class="reserved">this</span>.settings[<span class="literal">'language'</span>]);
- <span class="reserved">this</span>._def(<span class="literal">"elements"</span>, <span class="literal">""</span>);
- <span class="reserved">this</span>._def(<span class="literal">"textarea_trigger"</span>, <span class="literal">"mce_editable"</span>);
- <span class="reserved">this</span>._def(<span class="literal">"editor_selector"</span>, <span class="literal">""</span>);
- <span class="reserved">this</span>._def(<span class="literal">"editor_deselector"</span>, <span class="literal">"mceNoEditor"</span>);
- <span class="reserved">this</span>._def(<span class="literal">"valid_elements"</span>, <span class="literal">"+a[id|style|rel|rev|charset|hreflang|dir|lang|tabindex|accesskey|type|name|href|target|title|class|onfocus|onblur|onclick|ondblclick|onmousedown|onmouseup|onmouseover|onmousemove|onmouseout|onkeypress|onkeydown|onkeyup],-strong/-b[class|style],-em/-i[class|style],-strike[class|style],-u[class|style],#p[id|style|dir|class|align],-ol[class|style],-ul[class|style],-li[class|style],br,img[id|dir|lang|longdesc|usemap|style|class|src|onmouseover|onmouseout|border|alt=|title|hspace|vspace|width|height|align],-sub[style|class],-sup[style|class],-blockquote[dir|style],-table[border=0|cellspacing|cellpadding|width|height|class|align|summary|style|dir|id|lang|bgcolor|background|bordercolor],-tr[id|lang|dir|class|rowspan|width|height|align|valign|style|bgcolor|background|bordercolor],tbody[id|class],thead[id|class],tfoot[id|class],-td[id|lang|dir|class|colspan|rowspan|width|height|align|valign|style|bgcolor|background|bordercolor|scope],-th[id|lang|dir|class|colspan|rowspan|width|height|align|valign|style|scope],caption[id|lang|dir|class|style],-div[id|dir|class|align|style],-span[style|class|align],-pre[class|align|style],address[class|align|style],-h1[id|style|dir|class|align],-h2[id|style|dir|class|align],-h3[id|style|dir|class|align],-h4[id|style|dir|class|align],-h5[id|style|dir|class|align],-h6[id|style|dir|class|align],hr[class|style],-font[face|size|style|id|class|dir|color],dd[id|class|title|style|dir|lang],dl[id|class|title|style|dir|lang],dt[id|class|title|style|dir|lang]"</span>);
- <span class="reserved">this</span>._def(<span class="literal">"extended_valid_elements"</span>, <span class="literal">""</span>);
- <span class="reserved">this</span>._def(<span class="literal">"invalid_elements"</span>, <span class="literal">""</span>);
- <span class="reserved">this</span>._def(<span class="literal">"encoding"</span>, <span class="literal">""</span>);
- <span class="reserved">this</span>._def(<span class="literal">"urlconverter_callback"</span>, tinyMCE.getParam(<span class="literal">"urlconvertor_callback"</span>, <span class="literal">"TinyMCE_Engine.prototype.convertURL"</span>));
- <span class="reserved">this</span>._def(<span class="literal">"save_callback"</span>, <span class="literal">""</span>);
- <span class="reserved">this</span>._def(<span class="literal">"debug"</span>, false);
- <span class="reserved">this</span>._def(<span class="literal">"force_br_newlines"</span>, false);
- <span class="reserved">this</span>._def(<span class="literal">"force_p_newlines"</span>, true);
- <span class="reserved">this</span>._def(<span class="literal">"add_form_submit_trigger"</span>, true);
- <span class="reserved">this</span>._def(<span class="literal">"relative_urls"</span>, true);
- <span class="reserved">this</span>._def(<span class="literal">"remove_script_host"</span>, true);
- <span class="reserved">this</span>._def(<span class="literal">"focus_alert"</span>, true);
- <span class="reserved">this</span>._def(<span class="literal">"document_base_url"</span>, <span class="reserved">this</span>.documentURL);
- <span class="reserved">this</span>._def(<span class="literal">"visual"</span>, true);
- <span class="reserved">this</span>._def(<span class="literal">"visual_table_class"</span>, <span class="literal">"mceVisualAid"</span>);
- <span class="reserved">this</span>._def(<span class="literal">"setupcontent_callback"</span>, <span class="literal">""</span>);
- <span class="reserved">this</span>._def(<span class="literal">"fix_content_duplication"</span>, true);
- <span class="reserved">this</span>._def(<span class="literal">"custom_undo_redo"</span>, true);
- <span class="reserved">this</span>._def(<span class="literal">"custom_undo_redo_levels"</span>, -1);
- <span class="reserved">this</span>._def(<span class="literal">"custom_undo_redo_keyboard_shortcuts"</span>, true);
- <span class="reserved">this</span>._def(<span class="literal">"custom_undo_redo_restore_selection"</span>, true);
- <span class="reserved">this</span>._def(<span class="literal">"verify_html"</span>, true);
- <span class="reserved">this</span>._def(<span class="literal">"apply_source_formatting"</span>, false);
- <span class="reserved">this</span>._def(<span class="literal">"directionality"</span>, <span class="literal">"ltr"</span>);
- <span class="reserved">this</span>._def(<span class="literal">"cleanup_on_startup"</span>, false);
- <span class="reserved">this</span>._def(<span class="literal">"inline_styles"</span>, false);
- <span class="reserved">this</span>._def(<span class="literal">"convert_newlines_to_brs"</span>, false);
- <span class="reserved">this</span>._def(<span class="literal">"auto_reset_designmode"</span>, true);
- <span class="reserved">this</span>._def(<span class="literal">"entities"</span>, <span class="literal">"39,#39,160,nbsp,161,iexcl,162,cent,163,pound,164,curren,165,yen,166,brvbar,167,sect,168,uml,169,copy,170,ordf,171,laquo,172,not,173,shy,174,reg,175,macr,176,deg,177,plusmn,178,sup2,179,sup3,180,acute,181,micro,182,para,183,middot,184,cedil,185,sup1,186,ordm,187,raquo,188,frac14,189,frac12,190,frac34,191,iquest,192,Agrave,193,Aacute,194,Acirc,195,Atilde,196,Auml,197,Aring,198,AElig,199,Ccedil,200,Egrave,201,Eacute,202,Ecirc,203,Euml,204,Igrave,205,Iacute,206,Icirc,207,Iuml,208,ETH,209,Ntilde,210,Ograve,211,Oacute,212,Ocirc,213,Otilde,214,Ouml,215,times,216,Oslash,217,Ugrave,218,Uacute,219,Ucirc,220,Uuml,221,Yacute,222,THORN,223,szlig,224,agrave,225,aacute,226,acirc,227,atilde,228,auml,229,aring,230,aelig,231,ccedil,232,egrave,233,eacute,234,ecirc,235,euml,236,igrave,237,iacute,238,icirc,239,iuml,240,eth,241,ntilde,242,ograve,243,oacute,244,ocirc,245,otilde,246,ouml,247,divide,248,oslash,249,ugrave,250,uacute,251,ucirc,252,uuml,253,yacute,254,thorn,255,yuml,402,fnof,913,Alpha,914,Beta,915,Gamma,916,Delta,917,Epsilon,918,Zeta,919,Eta,920,Theta,921,Iota,922,Kappa,923,Lambda,924,Mu,925,Nu,926,Xi,927,Omicron,928,Pi,929,Rho,931,Sigma,932,Tau,933,Upsilon,934,Phi,935,Chi,936,Psi,937,Omega,945,alpha,946,beta,947,gamma,948,delta,949,epsilon,950,zeta,951,eta,952,theta,953,iota,954,kappa,955,lambda,956,mu,957,nu,958,xi,959,omicron,960,pi,961,rho,962,sigmaf,963,sigma,964,tau,965,upsilon,966,phi,967,chi,968,psi,969,omega,977,thetasym,978,upsih,982,piv,8226,bull,8230,hellip,8242,prime,8243,Prime,8254,oline,8260,frasl,8472,weierp,8465,image,8476,real,8482,trade,8501,alefsym,8592,larr,8593,uarr,8594,rarr,8595,darr,8596,harr,8629,crarr,8656,lArr,8657,uArr,8658,rArr,8659,dArr,8660,hArr,8704,forall,8706,part,8707,exist,8709,empty,8711,nabla,8712,isin,8713,notin,8715,ni,8719,prod,8721,sum,8722,minus,8727,lowast,8730,radic,8733,prop,8734,infin,8736,ang,8743,and,8744,or,8745,cap,8746,cup,8747,int,8756,there4,8764,sim,8773,cong,8776,asymp,8800,ne,8801,equiv,8804,le,8805,ge,8834,sub,8835,sup,8836,nsub,8838,sube,8839,supe,8853,oplus,8855,otimes,8869,perp,8901,sdot,8968,lceil,8969,rceil,8970,lfloor,8971,rfloor,9001,lang,9002,rang,9674,loz,9824,spades,9827,clubs,9829,hearts,9830,diams,34,quot,38,amp,60,lt,62,gt,338,OElig,339,oelig,352,Scaron,353,scaron,376,Yuml,710,circ,732,tilde,8194,ensp,8195,emsp,8201,thinsp,8204,zwnj,8205,zwj,8206,lrm,8207,rlm,8211,ndash,8212,mdash,8216,lsquo,8217,rsquo,8218,sbquo,8220,ldquo,8221,rdquo,8222,bdquo,8224,dagger,8225,Dagger,8240,permil,8249,lsaquo,8250,rsaquo,8364,euro"</span>, true);
- <span class="reserved">this</span>._def(<span class="literal">"entity_encoding"</span>, <span class="literal">"named"</span>);
- <span class="reserved">this</span>._def(<span class="literal">"cleanup_callback"</span>, <span class="literal">""</span>);
- <span class="reserved">this</span>._def(<span class="literal">"add_unload_trigger"</span>, true);
- <span class="reserved">this</span>._def(<span class="literal">"ask"</span>, false);
- <span class="reserved">this</span>._def(<span class="literal">"nowrap"</span>, false);
- <span class="reserved">this</span>._def(<span class="literal">"auto_resize"</span>, false);
- <span class="reserved">this</span>._def(<span class="literal">"auto_focus"</span>, false);
- <span class="reserved">this</span>._def(<span class="literal">"cleanup"</span>, true);
- <span class="reserved">this</span>._def(<span class="literal">"remove_linebreaks"</span>, true);
- <span class="reserved">this</span>._def(<span class="literal">"button_tile_map"</span>, false);
- <span class="reserved">this</span>._def(<span class="literal">"submit_patch"</span>, true);
- <span class="reserved">this</span>._def(<span class="literal">"browsers"</span>, <span class="literal">"msie,safari,gecko,opera"</span>, true);
- <span class="reserved">this</span>._def(<span class="literal">"dialog_type"</span>, <span class="literal">"window"</span>);
- <span class="reserved">this</span>._def(<span class="literal">"accessibility_warnings"</span>, true);
- <span class="reserved">this</span>._def(<span class="literal">"accessibility_focus"</span>, true);
- <span class="reserved">this</span>._def(<span class="literal">"merge_styles_invalid_parents"</span>, <span class="literal">""</span>);
- <span class="reserved">this</span>._def(<span class="literal">"force_hex_style_colors"</span>, true);
- <span class="reserved">this</span>._def(<span class="literal">"trim_span_elements"</span>, true);
- <span class="reserved">this</span>._def(<span class="literal">"convert_fonts_to_spans"</span>, false);
- <span class="reserved">this</span>._def(<span class="literal">"doctype"</span>, <span class="literal">'<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">'</span>);
- <span class="reserved">this</span>._def(<span class="literal">"font_size_classes"</span>, <span class="literal">''</span>);
- <span class="reserved">this</span>._def(<span class="literal">"font_size_style_values"</span>, <span class="literal">'xx-small,x-small,small,medium,large,x-large,xx-large'</span>, true);
- <span class="reserved">this</span>._def(<span class="literal">"event_elements"</span>, <span class="literal">'a,img'</span>, true);
- <span class="reserved">this</span>._def(<span class="literal">"convert_urls"</span>, true);
- <span class="reserved">this</span>._def(<span class="literal">"table_inline_editing"</span>, false);
- <span class="reserved">this</span>._def(<span class="literal">"object_resizing"</span>, true);
- <span class="reserved">this</span>._def(<span class="literal">"custom_shortcuts"</span>, true);
- <span class="reserved">this</span>._def(<span class="literal">"convert_on_click"</span>, false);
- <span class="reserved">this</span>._def(<span class="literal">"content_css"</span>, <span class="literal">''</span>);
- <span class="reserved">this</span>._def(<span class="literal">"fix_list_elements"</span>, false);
- <span class="reserved">this</span>._def(<span class="literal">"fix_table_elements"</span>, false);
-
- <span class="comment">// Browser check IE</span>
- <span class="reserved">if</span> (<span class="reserved">this</span>.isMSIE && <span class="reserved">this</span>.settings[<span class="literal">'browsers'</span>].indexOf(<span class="literal">'msie'</span>) == -1)
- <span class="reserved">return</span>;
-
- <span class="comment">// Browser check Gecko</span>
- <span class="reserved">if</span> (<span class="reserved">this</span>.isGecko && <span class="reserved">this</span>.settings[<span class="literal">'browsers'</span>].indexOf(<span class="literal">'gecko'</span>) == -1)
- <span class="reserved">return</span>;
-
- <span class="comment">// Browser check Safari</span>
- <span class="reserved">if</span> (<span class="reserved">this</span>.isSafari && <span class="reserved">this</span>.settings[<span class="literal">'browsers'</span>].indexOf(<span class="literal">'safari'</span>) == -1)
- <span class="reserved">return</span>;
-
- <span class="comment">// Browser check Opera</span>
- <span class="reserved">if</span> (<span class="reserved">this</span>.isOpera && <span class="reserved">this</span>.settings[<span class="literal">'browsers'</span>].indexOf(<span class="literal">'opera'</span>) == -1)
- <span class="reserved">return</span>;
-
- <span class="comment">// If not super absolute make it so</span>
- var baseHREF = tinyMCE.settings[<span class="literal">'document_base_url'</span>];
- var h = document.location.href;
- var p = h.indexOf(<span class="literal">'://'</span>);
- <span class="reserved">if</span> (p > 0 && document.location.protocol != <span class="literal">"file:"</span>) {
- p = h.indexOf(<span class="literal">'/'</span>, p + 3);
- h = h.substring(0, p);
-
- <span class="reserved">if</span> (baseHREF.indexOf(<span class="literal">'://'</span>) == -1)
- baseHREF = h + baseHREF;
-
- tinyMCE.settings[<span class="literal">'document_base_url'</span>] = baseHREF;
- tinyMCE.settings[<span class="literal">'document_base_prefix'</span>] = h;
- }
-
- <span class="comment">// Trim away query part</span>
- <span class="reserved">if</span> (baseHREF.indexOf(<span class="literal">'?'</span>) != -1)
- baseHREF = baseHREF.substring(0, baseHREF.indexOf(<span class="literal">'?'</span>));
-
- <span class="reserved">this</span>.settings[<span class="literal">'base_href'</span>] = baseHREF.substring(0, baseHREF.lastIndexOf(<span class="literal">'/'</span>)) + <span class="literal">"/"</span>;
-
- theme = <span class="reserved">this</span>.settings[<span class="literal">'theme'</span>];
- <span class="reserved">this</span>.blockRegExp = new RegExp(<span class="literal">"^(h[1-6]|p|div|address|pre|form|table|li|ol|ul|td|blockquote|center|dl|dt|dd|dir|fieldset|form|noscript|noframes|menu|isindex|samp)$"</span>, <span class="literal">"i"</span>);
- <span class="reserved">this</span>.posKeyCodes = new Array(13,45,36,35,33,34,37,38,39,40);
- <span class="reserved">this</span>.uniqueURL = <span class="literal">'javascript:TINYMCE_UNIQUEURL();'</span>; <span class="comment">// Make unique URL non real URL</span>
- <span class="reserved">this</span>.uniqueTag = <span class="literal">'<div id="mceTMPElement" style="display: none">TMP</div>'</span>;
- <span class="reserved">this</span>.callbacks = new Array(<span class="literal">'onInit'</span>, <span class="literal">'getInfo'</span>, <span class="literal">'getEditorTemplate'</span>, <span class="literal">'setupContent'</span>, <span class="literal">'onChange'</span>, <span class="literal">'onPageLoad'</span>, <span class="literal">'handleNodeChange'</span>, <span class="literal">'initInstance'</span>, <span class="literal">'execCommand'</span>, <span class="literal">'getControlHTML'</span>, <span class="literal">'handleEvent'</span>, <span class="literal">'cleanup'</span>);
-
- <span class="comment">// Theme url</span>
- <span class="reserved">this</span>.settings[<span class="literal">'theme_href'</span>] = tinyMCE.baseURL + <span class="literal">"/themes/"</span> + theme;
-
- <span class="reserved">if</span> (!tinyMCE.isMSIE)
- <span class="reserved">this</span>.settings[<span class="literal">'force_br_newlines'</span>] = false;
-
- <span class="reserved">if</span> (tinyMCE.getParam(<span class="literal">"popups_css"</span>, false)) {
- var cssPath = tinyMCE.getParam(<span class="literal">"popups_css"</span>, <span class="literal">""</span>);
-
- <span class="comment">// Is relative</span>
- <span class="reserved">if</span> (cssPath.indexOf(<span class="literal">'://'</span>) == -1 && cssPath.charAt(0) != <span class="literal">'/'</span>)
- <span class="reserved">this</span>.settings[<span class="literal">'popups_css'</span>] = <span class="reserved">this</span>.documentBasePath + <span class="literal">"/"</span> + cssPath;
- <span class="reserved">else</span>
- <span class="reserved">this</span>.settings[<span class="literal">'popups_css'</span>] = cssPath;
- } <span class="reserved">else</span>
- <span class="reserved">this</span>.settings[<span class="literal">'popups_css'</span>] = tinyMCE.baseURL + <span class="literal">"/themes/"</span> + theme + <span class="literal">"/css/editor_popup.css"</span>;
-
- <span class="reserved">if</span> (tinyMCE.getParam(<span class="literal">"editor_css"</span>, false)) {
- var cssPath = tinyMCE.getParam(<span class="literal">"editor_css"</span>, <span class="literal">""</span>);
-
- <span class="comment">// Is relative</span>
- <span class="reserved">if</span> (cssPath.indexOf(<span class="literal">'://'</span>) == -1 && cssPath.charAt(0) != <span class="literal">'/'</span>)
- <span class="reserved">this</span>.settings[<span class="literal">'editor_css'</span>] = <span class="reserved">this</span>.documentBasePath + <span class="literal">"/"</span> + cssPath;
- <span class="reserved">else</span>
- <span class="reserved">this</span>.settings[<span class="literal">'editor_css'</span>] = cssPath;
- } <span class="reserved">else</span>
- <span class="reserved">this</span>.settings[<span class="literal">'editor_css'</span>] = tinyMCE.baseURL + <span class="literal">"/themes/"</span> + theme + <span class="literal">"/css/editor_ui.css"</span>;
-
- <span class="reserved">if</span> (tinyMCE.settings[<span class="literal">'debug'</span>]) {
- var msg = <span class="literal">"Debug: \n"</span>;
-
- msg += <span class="literal">"baseURL: "</span> + <span class="reserved">this</span>.baseURL + <span class="literal">"\n"</span>;
- msg += <span class="literal">"documentBasePath: "</span> + <span class="reserved">this</span>.documentBasePath + <span class="literal">"\n"</span>;
- msg += <span class="literal">"content_css: "</span> + <span class="reserved">this</span>.settings[<span class="literal">'content_css'</span>] + <span class="literal">"\n"</span>;
- msg += <span class="literal">"popups_css: "</span> + <span class="reserved">this</span>.settings[<span class="literal">'popups_css'</span>] + <span class="literal">"\n"</span>;
- msg += <span class="literal">"editor_css: "</span> + <span class="reserved">this</span>.settings[<span class="literal">'editor_css'</span>] + <span class="literal">"\n"</span>;
-
- alert(msg);
- }
-
- <span class="comment">// Only do this once</span>
- <span class="reserved">if</span> (<span class="reserved">this</span>.configs.length == 0) {
- <span class="comment">// Is Safari enabled</span>
- <span class="reserved">if</span> (<span class="reserved">this</span>.isSafari && <span class="reserved">this</span>.getParam(<span class="literal">'safari_warning'</span>, false))
- alert(<span class="literal">"Safari support is very limited and should be considered experimental.\nSo there is no need to even submit bugreports on this early version.\nYou can disable this message by setting: safari_warning option to false"</span>);
-
- <span class="reserved">if</span> (typeof(TinyMCECompressed) == <span class="literal">"undefined"</span>) {
- tinyMCE.addEvent(window, <span class="literal">"DOMContentLoaded"</span>, TinyMCE_Engine.<span class="reserved">prototype</span>.onLoad);
-
- <span class="reserved">if</span> (tinyMCE.isMSIE && !tinyMCE.isOpera) {
- <span class="reserved">if</span> (document.body)
- tinyMCE.addEvent(document.body, <span class="literal">"readystatechange"</span>, TinyMCE_Engine.<span class="reserved">prototype</span>.onLoad);
- <span class="reserved">else</span>
- tinyMCE.addEvent(document, <span class="literal">"readystatechange"</span>, TinyMCE_Engine.<span class="reserved">prototype</span>.onLoad);
- }
-
- tinyMCE.addEvent(window, <span class="literal">"load"</span>, TinyMCE_Engine.<span class="reserved">prototype</span>.onLoad);
- tinyMCE._addUnloadEvents();
- }
- }
-
- <span class="reserved">this</span>.loadScript(tinyMCE.baseURL + <span class="literal">'/themes/'</span> + <span class="reserved">this</span>.settings[<span class="literal">'theme'</span>] + <span class="literal">'/editor_template'</span> + tinyMCE.srcMode + <span class="literal">'.js'</span>);
- <span class="reserved">this</span>.loadScript(tinyMCE.baseURL + <span class="literal">'/langs/'</span> + <span class="reserved">this</span>.settings[<span class="literal">'language'</span>] + <span class="literal">'.js'</span>);
- <span class="reserved">this</span>.loadCSS(<span class="reserved">this</span>.settings[<span class="literal">'editor_css'</span>]);
-
- <span class="comment">// Add plugins</span>
- var p = tinyMCE.getParam(<span class="literal">'plugins'</span>, <span class="literal">''</span>, true, <span class="literal">','</span>);
- <span class="reserved">if</span> (p.length > 0) {
- <span class="reserved">for</span> (var i=0; i<p.length; i++) {
- <span class="reserved">if</span> (p[i].charAt(0) != <span class="literal">'-'</span>)
- <span class="reserved">this</span>.loadScript(tinyMCE.baseURL + <span class="literal">'/plugins/'</span> + p[i] + <span class="literal">'/editor_plugin'</span> + tinyMCE.srcMode + <span class="literal">'.js'</span>);
- }
- }
-
- <span class="comment">// Setup entities</span>
- settings[<span class="literal">'cleanup_entities'</span>] = new Array();
- var entities = tinyMCE.getParam(<span class="literal">'entities'</span>, <span class="literal">''</span>, true, <span class="literal">','</span>);
- <span class="reserved">for</span> (var i=0; i<entities.length; i+=2)
- settings[<span class="literal">'cleanup_entities'</span>][<span class="literal">'c'</span> + entities[i]] = entities[i+1];
-
- <span class="comment">// Save away this config</span>
- settings[<span class="literal">'index'</span>] = <span class="reserved">this</span>.configs.length;
- <span class="reserved">this</span>.configs[<span class="reserved">this</span>.configs.length] = settings;
- },
-
- <span class="comment">/**
- * Adds unload event handles to execute triggerSave.
- *
- * <span class="attrib">@private</span>
- */</span>
- _addUnloadEvents : <span class="reserved">function</span>() {
- <span class="reserved">if</span> (tinyMCE.isMSIE) {
- <span class="reserved">if</span> (tinyMCE.settings[<span class="literal">'add_unload_trigger'</span>]) {
- tinyMCE.addEvent(window, <span class="literal">"unload"</span>, TinyMCE_Engine.<span class="reserved">prototype</span>.unloadHandler);
- tinyMCE.addEvent(window.document, <span class="literal">"beforeunload"</span>, TinyMCE_Engine.<span class="reserved">prototype</span>.unloadHandler);
- }
- } <span class="reserved">else</span> {
- <span class="reserved">if</span> (tinyMCE.settings[<span class="literal">'add_unload_trigger'</span>])
- tinyMCE.addEvent(window, <span class="literal">"unload"</span>, <span class="reserved">function</span> () {tinyMCE.triggerSave(true, true);});
- }
- },
-
- <span class="comment">/**
- * Assigns a default value for a specific config parameter.
- *
- * <span class="attrib">@param</span> {string} key Settings key to add default value to.
- * <span class="attrib">@param</span> {object} def_val Default value to assign if the settings option isn't defined.
- * <span class="attrib">@param</span> {boolean} t Trim all white space, if true all whitespace will be removed from option value.
- * <span class="attrib">@private</span>
- */</span>
- _def : <span class="reserved">function</span>(key, def_val, t) {
- var v = tinyMCE.getParam(key, def_val);
-
- v = t ? v.replace(/\s+/g,<span class="literal">""</span>) : v;
-
- <span class="reserved">this</span>.settings[key] = v;
- },
-
- <span class="comment">/**
- * Returns true/false if the specified plugin is loaded or not.
- *
- * <span class="attrib">@param</span> {string} n Plugin name to look for.
- * <span class="attrib">@return</span> true/false if the specified plugin is loaded or not.
- * <span class="attrib">@type</span> boolean
- */</span>
- hasPlugin : <span class="reserved">function</span>(n) {
- <span class="reserved">return</span> typeof(<span class="reserved">this</span>.plugins[n]) != <span class="literal">"undefined"</span> && <span class="reserved">this</span>.plugins[n] != null;
- },
-
- <span class="comment">/**
- * Adds the specified plugin to the list of loaded plugins, this will also setup the baseURL
- * property of the plugin.
- *
- * <span class="attrib">@param</span> {string} Plugin name/id.
- * <span class="attrib">@param</span> {TinyMCE_Plugin} p Plugin instance to add.
- */</span>
- addPlugin : <span class="reserved">function</span>(n, p) {
- var op = <span class="reserved">this</span>.plugins[n];
-
- <span class="comment">// Use the previous plugin object base URL used when loading external plugins</span>
- p.baseURL = op ? op.baseURL : tinyMCE.baseURL + <span class="literal">"/plugins/"</span> + n;
- <span class="reserved">this</span>.plugins[n] = p;
- },
-
- <span class="comment">/**
- * Sets the baseURL of the specified plugin, this is useful if the plugin is loaded from
- * a external location.
- *
- * <span class="attrib">@param</span> {string} n Plugin name/id to set base URL on. This have to be added before.
- * <span class="attrib">@param</span> {string} u Base URL of plugin, this string should be the URL prefix for the plugin without a trailing slash.
- */</span>
- setPluginBaseURL : <span class="reserved">function</span>(n, u) {
- var op = <span class="reserved">this</span>.plugins[n];
-
- <span class="reserved">if</span> (op)
- op.baseURL = u;
- <span class="reserved">else</span>
- <span class="reserved">this</span>.plugins[n] = {baseURL : u};
- },
-
- <span class="comment">/**
- * Load plugin from external URL.
- *
- * <span class="attrib">@param</span> {string} n Plugin name for example \"emotions\".
- * <span class="attrib">@param</span> {string} u URL of plugin directory to load.
- */</span>
- loadPlugin : <span class="reserved">function</span>(n, u) {
- u = u.indexOf(<span class="literal">'.js'</span>) != -1 ? u.substring(0, u.lastIndexOf(<span class="literal">'/'</span>)) : u;
- u = u.charAt(u.length-1) == <span class="literal">'/'</span> ? u.substring(0, u.length-1) : u;
- <span class="reserved">this</span>.plugins[n] = {baseURL : u};
- <span class="reserved">this</span>.loadScript(u + <span class="literal">"/editor_plugin"</span> + (tinyMCE.srcMode ? <span class="literal">'_src'</span> : <span class="literal">''</span>) + <span class="literal">".js"</span>);
- },
-
- <span class="comment">/**
- * Returns true/false if the specified theme is loaded or not.
- *
- * <span class="attrib">@param</span> {string} n Theme name/id to check for.
- * <span class="attrib">@return</span> true/false if the specified theme is loaded or not.
- * <span class="attrib">@type</span> boolean
- */</span>
- hasTheme : <span class="reserved">function</span>(n) {
- <span class="reserved">return</span> typeof(<span class="reserved">this</span>.themes[n]) != <span class="literal">"undefined"</span> && <span class="reserved">this</span>.themes[n] != null;
- },
-
- <span class="comment">/**
- * Adds the specified theme in to the list of loaded themes.
- *
- * <span class="attrib">@param</span> {string} n Theme name/id to add the object reference to.
- * <span class="attrib">@param</span> {TinyMCE_Theme} t Theme instance to add to the loaded list.
- */</span>
- addTheme : <span class="reserved">function</span>(n, t) {
- <span class="reserved">this</span>.themes[n] = t;
- },
-
- <span class="comment">/**
- * Adds a floating menu instance to TinyMCE.
- *
- * <span class="attrib">@param</span> {string} n TinyMCE menu id.
- * <span class="attrib">@param</span> {TinyMCE_Menu} m TinyMCE menu instance.
- */</span>
- addMenu : <span class="reserved">function</span>(n, m) {
- <span class="reserved">this</span>.menus[n] = m;
- },
-
- <span class="comment">/**
- * Checks if the specified menu by name is added to TinyMCE.
- *
- * <span class="attrib">@param</span> {string} n TinyMCE menu id.
- * <span class="attrib">@return</span> true/false if it exists or not.
- * <span class="attrib">@type</span> boolean
- */</span>
- hasMenu : <span class="reserved">function</span>(n) {
- <span class="reserved">return</span> typeof(<span class="reserved">this</span>.plugins[n]) != <span class="literal">"undefined"</span> && <span class="reserved">this</span>.plugins[n] != null;
- },
-
- <span class="comment">/**
- * Loads the specified script by writing the a script tag to the current page.
- * This will also check if the file has been loaded before. This function should only be used
- * when the page is loading.
- *
- * <span class="attrib">@param</span> {string} url Script URL to load.
- */</span>
- loadScript : <span class="reserved">function</span>(url) {
- <span class="reserved">for</span> (var i=0; i<<span class="reserved">this</span>.loadedFiles.length; i++) {
- <span class="reserved">if</span> (<span class="reserved">this</span>.loadedFiles[i] == url)
- <span class="reserved">return</span>;
- }
-
- document.write(<span class="literal">'<sc'</span>+<span class="literal">'ript language="javascript" type="text/javascript" src="'</span> + url + <span class="literal">'"></script>'</span>);
-
- <span class="reserved">this</span>.loadedFiles[<span class="reserved">this</span>.loadedFiles.length] = url;
- },
-
- <span class="comment">/**
- * Loads the specified CSS by writing the a link tag to the current page.
- * This will also check if the file has been loaded before. This function should only be used
- * when the page is loading.
- *
- * <span class="attrib">@param</span> {string} url CSS file URL to load or comma separated list of files.
- */</span>
- loadCSS : <span class="reserved">function</span>(url) {
- var ar = url.replace(/\s+/, <span class="literal">''</span>).split(<span class="literal">','</span>);
- var lflen = 0, csslen = 0;
- var skip = false;
- var x = 0, i = 0;
-
- <span class="reserved">for</span> (x = 0,csslen = ar.length; x<csslen; x++) {
- ignore_css = false;
-
- <span class="reserved">if</span> (ar[x] != null && ar[x] != <span class="literal">'null'</span> && ar[x].length > 0) {
- <span class="comment">/* Make sure it doesn't exist. */</span>
- <span class="reserved">for</span> (i=0, lflen=<span class="reserved">this</span>.loadedFiles.length; i<lflen; i++) {
- <span class="reserved">if</span> (<span class="reserved">this</span>.loadedFiles[i] == ar[x]) {
- skip = true;
- break;
- }
- }
-
- <span class="reserved">if</span> (!skip) {
- document.write(<span class="literal">'<link href="'</span> + ar[x] + <span class="literal">'" rel="stylesheet" type="text/css" />'</span>);
- <span class="reserved">this</span>.loadedFiles[<span class="reserved">this</span>.loadedFiles.length] = ar[x];
- }
- }
- }
- },
-
- <span class="comment">/**
- * Imports a CSS file into a allready loaded document. This will add a link element
- * to the head element of the document.
- *
- * <span class="attrib">@param</span> {DOMDocument} doc DOM Document to load CSS into.
- * <span class="attrib">@param</span> {string} css CSS File URL to load or comma separated list of files.
- */</span>
- importCSS : <span class="reserved">function</span>(doc, css) {
- var css_ary = css.replace(/\s+/, <span class="literal">''</span>).split(<span class="literal">','</span>);
- var csslen, elm, headArr, x, css_file;
-
- <span class="reserved">for</span> (x = 0, csslen = css_ary.length; x<csslen; x++) {
- css_file = css_ary[x];
-
- <span class="reserved">if</span> (css_file != null && css_file != <span class="literal">'null'</span> && css_file.length > 0) {
- <span class="comment">// Is relative, make absolute</span>
- <span class="reserved">if</span> (css_file.indexOf(<span class="literal">'://'</span>) == -1 && css_file.charAt(0) != <span class="literal">'/'</span>)
- css_file = <span class="reserved">this</span>.documentBasePath + <span class="literal">"/"</span> + css_file;
-
- <span class="reserved">if</span> (typeof(doc.createStyleSheet) == <span class="literal">"undefined"</span>) {
- elm = doc.createElement(<span class="literal">"link"</span>);
-
- elm.rel = <span class="literal">"stylesheet"</span>;
- elm.href = css_file;
-
- <span class="reserved">if</span> ((headArr = doc.getElementsByTagName(<span class="literal">"head"</span>)) != null && headArr.length > 0)
- headArr[0].appendChild(elm);
- } <span class="reserved">else</span>
- doc.createStyleSheet(css_file);
- }
- }
- },
-
- <span class="comment">/**
- * Displays a confirm dialog when a user clicks/focus a textarea that is to be converted into
- * a TinyMCE instance.
- *
- * <span class="attrib">@param</span> {DOMEvent} e DOM event instance.
- * <span class="attrib">@param</span> {Array} settings Name/Value array of initialization settings.
- */</span>
- confirmAdd : <span class="reserved">function</span>(e, settings) {
- var elm = tinyMCE.isMSIE ? event.srcElement : e.target;
- var elementId = elm.name ? elm.name : elm.id;
-
- tinyMCE.settings = settings;
-
- <span class="reserved">if</span> (tinyMCE.settings[<span class="literal">'convert_on_click'</span>] || (!elm.getAttribute(<span class="literal">'mce_noask'</span>) && confirm(tinyMCELang[<span class="literal">'lang_edit_confirm'</span>])))
- tinyMCE.addMCEControl(elm, elementId);
-
- elm.setAttribute(<span class="literal">'mce_noask'</span>, <span class="literal">'true'</span>);
- },
-
- <span class="comment">/**
- * Moves the contents from the hidden textarea to the editor that gets inserted.
- *
- * <span class="attrib">@param</span> {string} form_element_name Form element name to move contents from.
- * <span class="attrib">@deprecated</span>
- */</span>
- updateContent : <span class="reserved">function</span>(form_element_name) {
- <span class="comment">// Find MCE instance linked to given form element and copy it's value</span>
- var formElement = document.getElementById(form_element_name);
- <span class="reserved">for</span> (var n in tinyMCE.instances) {
- var inst = tinyMCE.instances[n];
- <span class="reserved">if</span> (!tinyMCE.isInstance(inst))
- continue;
-
- inst.switchSettings();
-
- <span class="reserved">if</span> (inst.formElement == formElement) {
- var doc = inst.getDoc();
-
- tinyMCE._setHTML(doc, inst.formElement.value);
-
- <span class="reserved">if</span> (!tinyMCE.isMSIE)
- doc.body.innerHTML = tinyMCE._cleanupHTML(inst, doc, <span class="reserved">this</span>.settings, doc.body, inst.visualAid);
- }
- }
- },
-
- <span class="comment">/**
- * Adds a TinyMCE editor control instance to a specific form element.
- *
- * <span class="attrib">@param</span> {HTMLElement} replace_element HTML element object to replace.
- * <span class="attrib">@param</span> {string} form_element_name HTML form element name,
- * <span class="attrib">@param</span> {DOMDocument} target_document Target document that holds the element.
- */</span>
- addMCEControl : <span class="reserved">function</span>(replace_element, form_element_name, target_document) {
- var id = <span class="literal">"mce_editor_"</span> + tinyMCE.idCounter++;
- var inst = new TinyMCE_Control(tinyMCE.settings);
-
- inst.editorId = id;
- <span class="reserved">this</span>.instances[id] = inst;
-
- inst._onAdd(replace_element, form_element_name, target_document);
- },
-
- <span class="comment">/**
- * Removes a TinyMCE editor control instance by id.
- *
- * <span class="attrib">@param</span> {string} editor_id Id of editor instance to remove.
- */</span>
- removeMCEControl : <span class="reserved">function</span>(editor_id) {
- var inst = tinyMCE.getInstanceById(editor_id);
-
- <span class="reserved">if</span> (inst) {
- inst.switchSettings();
-
- editor_id = inst.editorId;
- var html = tinyMCE.getContent(editor_id);
-
- <span class="comment">// Remove editor instance from instances array</span>
- var tmpInstances = new Array();
- <span class="reserved">for</span> (var instanceName in tinyMCE.instances) {
- var instance = tinyMCE.instances[instanceName];
- <span class="reserved">if</span> (!tinyMCE.isInstance(instance))
- continue;
-
- <span class="reserved">if</span> (instanceName != editor_id)
- tmpInstances[instanceName] = instance;
- }
- tinyMCE.instances = tmpInstances;
-
- tinyMCE.selectedElement = null;
- tinyMCE.selectedInstance = null;
-
- <span class="comment">// Remove element</span>
- var replaceElement = document.getElementById(editor_id + <span class="literal">"_parent"</span>);
- var oldTargetElement = inst.oldTargetElement;
- var targetName = oldTargetElement.nodeName.toLowerCase();
-
- <span class="reserved">if</span> (targetName == <span class="literal">"textarea"</span> || targetName == <span class="literal">"input"</span>) {
- <span class="comment">// Just show the old text area</span>
- replaceElement.parentNode.removeChild(replaceElement);
- oldTargetElement.style.display = <span class="literal">"inline"</span>;
- oldTargetElement.value = html;
- } <span class="reserved">else</span> {
- oldTargetElement.innerHTML = html;
- oldTargetElement.style.display = <span class="literal">'block'</span>;
-
- replaceElement.parentNode.insertBefore(oldTargetElement, replaceElement);
- replaceElement.parentNode.removeChild(replaceElement);
- }
- }
- },
-
- <span class="comment">/**
- * Moves the contents from a TinyMCE editor control instance to the hidden textarea
- * that got replaced with TinyMCE. This is executed automaticly on for example form submit.
- *
- * <span class="attrib">@param</span> {boolean} skip_cleanup Optional Skip cleanup, simply move the contents as fast as possible.
- * <span class="attrib">@param</span> {boolean} skip_callback Optional Skip callback, don't call the save_callback function.
- */</span>
- triggerSave : <span class="reserved">function</span>(skip_cleanup, skip_callback) {
- var inst, n;
-
- <span class="comment">// Default to false</span>
- <span class="reserved">if</span> (typeof(skip_cleanup) == <span class="literal">"undefined"</span>)
- skip_cleanup = false;
-
- <span class="comment">// Default to false</span>
- <span class="reserved">if</span> (typeof(skip_callback) == <span class="literal">"undefined"</span>)
- skip_callback = false;
-
- <span class="comment">// Cleanup and set all form fields</span>
- <span class="reserved">for</span> (n in tinyMCE.instances) {
- inst = tinyMCE.instances[n];
-
- <span class="reserved">if</span> (!tinyMCE.isInstance(inst))
- continue;
-
- inst.triggerSave(skip_cleanup, skip_callback);
- }
- },
-
- <span class="comment">/**
- * Resets a forms TinyMCE instances based on form index.
- *
- * <span class="attrib">@param</span> {int} form_index Form index to reset.
- */</span>
- resetForm : <span class="reserved">function</span>(form_index) {
- var i, inst, n, formObj = document.forms[form_index];
-
- <span class="reserved">for</span> (n in tinyMCE.instances) {
- inst = tinyMCE.instances[n];
-
- <span class="reserved">if</span> (!tinyMCE.isInstance(inst))
- continue;
-
- inst.switchSettings();
-
- <span class="reserved">for</span> (i=0; i<formObj.elements.length; i++) {
- <span class="reserved">if</span> (inst.formTargetElementId == formObj.elements[i].name)
- inst.getBody().innerHTML = inst.startContent;
- }
- }
- },
-
- <span class="comment">/**
- * Executes a command on a specific editor instance by id.
- *
- * <span class="attrib">@param</span> {string} editor_id TinyMCE editor control instance id to perform comman on.
- * <span class="attrib">@param</span> {string} command Command name to execute, for example mceLink or Bold.
- * <span class="attrib">@param</span> {boolean} user_interface True/false state if a UI (dialog) should be presented or not.
- * <span class="attrib">@param</span> {object} value Optional command value, this can be anything.
- * <span class="attrib">@param</span> {boolean} focus True/false if the editor instance should be focused first.
- */</span>
- execInstanceCommand : <span class="reserved">function</span>(editor_id, command, user_interface, value, focus) {
- var inst = tinyMCE.getInstanceById(editor_id);
- <span class="reserved">if</span> (inst) {
- <span class="reserved">if</span> (typeof(focus) == <span class="literal">"undefined"</span>)
- focus = true;
-
- <span class="reserved">if</span> (focus)
- inst.contentWindow.focus();
-
- <span class="comment">// Reset design mode if lost</span>
- inst.autoResetDesignMode();
-
- <span class="reserved">this</span>.selectedElement = inst.getFocusElement();
- <span class="reserved">this</span>.selectedInstance = inst;
- tinyMCE.execCommand(command, user_interface, value);
-
- <span class="comment">// Cancel event so it doesn't call onbeforeonunlaod</span>
- <span class="reserved">if</span> (tinyMCE.isMSIE && window.event != null)
- tinyMCE.cancelEvent(window.event);
- }
- },
-
- <span class="comment">/**
- * Executes a command on the selected or last selected TinyMCE editor control instance. This function also handles
- * some non instance specific commands like mceAddControl, mceRemoveControl, mceHelp or mceFocus.
- *
- * <span class="attrib">@param</span> {string} command Command name to execute, for example mceLink or Bold.
- * <span class="attrib">@param</span> {boolean} user_interface True/false state if a UI (dialog) should be presented or not.
- * <span class="attrib">@param</span> {object} value Optional command value, this can be anything.
- */</span>
- execCommand : <span class="reserved">function</span>(command, user_interface, value) {
- <span class="comment">// Default input</span>
- user_interface = user_interface ? user_interface : false;
- value = value ? value : null;
-
- <span class="reserved">if</span> (tinyMCE.selectedInstance)
- tinyMCE.selectedInstance.switchSettings();
-
- switch (command) {
- case <span class="literal">'mceHelp'</span>:
- tinyMCE.openWindow({
- file : <span class="literal">'about.htm'</span>,
- width : 480,
- height : 380
- }, {
- tinymce_version : tinyMCE.majorVersion + <span class="literal">"."</span> + tinyMCE.minorVersion,
- tinymce_releasedate : tinyMCE.releaseDate,
- inline : <span class="literal">"yes"</span>
- });
- <span class="reserved">return</span>;
-
- case <span class="literal">'mceFocus'</span>:
- var inst = tinyMCE.getInstanceById(value);
- <span class="reserved">if</span> (inst)
- inst.contentWindow.focus();
- <span class="reserved">return</span>;
-
- case <span class="literal">"mceAddControl"</span>:
- case <span class="literal">"mceAddEditor"</span>:
- tinyMCE.addMCEControl(tinyMCE._getElementById(value), value);
- <span class="reserved">return</span>;
-
- case <span class="literal">"mceAddFrameControl"</span>:
- tinyMCE.addMCEControl(tinyMCE._getElementById(value[<span class="literal">'element'</span>], value[<span class="literal">'document'</span>]), value[<span class="literal">'element'</span>], value[<span class="literal">'document'</span>]);
- <span class="reserved">return</span>;
-
- case <span class="literal">"mceRemoveControl"</span>:
- case <span class="literal">"mceRemoveEditor"</span>:
- tinyMCE.removeMCEControl(value);
- <span class="reserved">return</span>;
-
- case <span class="literal">"mceResetDesignMode"</span>:
- <span class="comment">// Resets the designmode state of the editors in Gecko</span>
- <span class="reserved">if</span> (!tinyMCE.isMSIE) {
- <span class="reserved">for</span> (var n in tinyMCE.instances) {
- <span class="reserved">if</span> (!tinyMCE.isInstance(tinyMCE.instances[n]))
- continue;
-
- try {
- tinyMCE.instances[n].getDoc().designMode = <span class="literal">"on"</span>;
- } catch (e) {
- <span class="comment">// Ignore any errors</span>
- }
- }
- }
-
- <span class="reserved">return</span>;
- }
-
- <span class="reserved">if</span> (<span class="reserved">this</span>.selectedInstance) {
- <span class="reserved">this</span>.selectedInstance.execCommand(command, user_interface, value);
- } <span class="reserved">else</span> <span class="reserved">if</span> (tinyMCE.settings[<span class="literal">'focus_alert'</span>])
- alert(tinyMCELang[<span class="literal">'lang_focus_alert'</span>]);
- },
-
- <span class="comment">/**
- * Creates a iframe editor container for the specified element.
- *
- * <span class="attrib">@param</span> {HTMLElement} replace_element Element to replace with iframe element.
- * <span class="attrib">@param</span> {DOMDocument} doc Optional document to use with iframe replacement.
- * <span class="attrib">@param</span> {DOMWindow} win Optional window to use with iframe replacement.
- * <span class="attrib">@private</span>
- */</span>
- _createIFrame : <span class="reserved">function</span>(replace_element, doc, win) {
- var iframe, id = replace_element.getAttribute(<span class="literal">"id"</span>);
- var aw, ah;
-
- <span class="reserved">if</span> (typeof(doc) == <span class="literal">"undefined"</span>)
- doc = document;
-
- <span class="reserved">if</span> (typeof(win) == <span class="literal">"undefined"</span>)
- win = window;
-
- iframe = doc.createElement(<span class="literal">"iframe"</span>);
-
- aw = <span class="literal">""</span> + tinyMCE.settings[<span class="literal">'area_width'</span>];
- ah = <span class="literal">""</span> + tinyMCE.settings[<span class="literal">'area_height'</span>];
-
- <span class="reserved">if</span> (aw.indexOf(<span class="literal">'%'</span>) == -1) {
- aw = parseInt(aw);
- aw = aw < 0 ? 300 : aw;
- aw = aw + <span class="literal">"px"</span>;
- }
-
- <span class="reserved">if</span> (ah.indexOf(<span class="literal">'%'</span>) == -1) {
- ah = parseInt(ah);
- ah = ah < 0 ? 240 : ah;
- ah = ah + <span class="literal">"px"</span>;
- }
-
- iframe.setAttribute(<span class="literal">"id"</span>, id);
- iframe.setAttribute(<span class="literal">"className"</span>, <span class="literal">"mceEditorIframe"</span>);
- iframe.setAttribute(<span class="literal">"border"</span>, <span class="literal">"0"</span>);
- iframe.setAttribute(<span class="literal">"frameBorder"</span>, <span class="literal">"0"</span>);
- iframe.setAttribute(<span class="literal">"marginWidth"</span>, <span class="literal">"0"</span>);
- iframe.setAttribute(<span class="literal">"marginHeight"</span>, <span class="literal">"0"</span>);
- iframe.setAttribute(<span class="literal">"leftMargin"</span>, <span class="literal">"0"</span>);
- iframe.setAttribute(<span class="literal">"topMargin"</span>, <span class="literal">"0"</span>);
- iframe.setAttribute(<span class="literal">"width"</span>, aw);
- iframe.setAttribute(<span class="literal">"height"</span>, ah);
- iframe.setAttribute(<span class="literal">"allowtransparency"</span>, <span class="literal">"true"</span>);
-
- <span class="reserved">if</span> (tinyMCE.settings[<span class="literal">"auto_resize"</span>])
- iframe.setAttribute(<span class="literal">"scrolling"</span>, <span class="literal">"no"</span>);
-
- <span class="comment">// Must have a src element in MSIE HTTPs breaks aswell as absoute URLs</span>
- <span class="reserved">if</span> (tinyMCE.isMSIE && !tinyMCE.isOpera)
- iframe.setAttribute(<span class="literal">"src"</span>, <span class="reserved">this</span>.settings[<span class="literal">'default_document'</span>]);
-
- iframe.style.width = aw;
- iframe.style.height = ah;
-
- <span class="comment">// MSIE 5.0 issue</span>
- <span class="reserved">if</span> (tinyMCE.isMSIE && !tinyMCE.isOpera)
- replace_element.outerHTML = iframe.outerHTML;
- <span class="reserved">else</span>
- replace_element.parentNode.replaceChild(iframe, replace_element);
-
- <span class="reserved">if</span> (tinyMCE.isMSIE && !tinyMCE.isOpera)
- <span class="reserved">return</span> win.frames[id];
- <span class="reserved">else</span>
- <span class="reserved">return</span> iframe;
- },
-
- <span class="comment">/**
- * Setups the contents of TinyMCE editor instance and fills it with contents.
- *
- * <span class="attrib">@param</span> {string} editor_id TinyMCE editor instance control id to fill.
- */</span>
- setupContent : <span class="reserved">function</span>(editor_id) {
- var inst = tinyMCE.instances[editor_id];
- var doc = inst.getDoc();
- var head = doc.getElementsByTagName(<span class="literal">'head'</span>).item(0);
- var content = inst.startContent;
-
- inst.switchSettings();
-
- <span class="comment">// Not loaded correctly hit it again, Mozilla bug #997860</span>
- <span class="reserved">if</span> (!tinyMCE.isMSIE && tinyMCE.getParam(<span class="literal">"setupcontent_reload"</span>, false) && doc.title != <span class="literal">"blank_page"</span>) {
- <span class="comment">// This part will remove the designMode status</span>
- <span class="comment">// Failes first time in Firefox 1.5b2 on Mac</span>
- try {doc.location.href = tinyMCE.baseURL + <span class="literal">"/blank.htm"</span>;} catch (ex) {}
- window.setTimeout(<span class="literal">"tinyMCE.setupContent('"</span> + editor_id + <span class="literal">"');"</span>, 1000);
- <span class="reserved">return</span>;
- }
-
- <span class="reserved">if</span> (!head) {
- window.setTimeout(<span class="literal">"tinyMCE.setupContent('"</span> + editor_id + <span class="literal">"');"</span>, 10);
- <span class="reserved">return</span>;
- }
-
- <span class="comment">// Import theme specific content CSS the user specific</span>
- tinyMCE.importCSS(inst.getDoc(), tinyMCE.baseURL + <span class="literal">"/themes/"</span> + inst.settings[<span class="literal">'theme'</span>] + <span class="literal">"/css/editor_content.css"</span>);
- tinyMCE.importCSS(inst.getDoc(), inst.settings[<span class="literal">'content_css'</span>]);
- tinyMCE.dispatchCallback(inst, <span class="literal">'init_instance_callback'</span>, <span class="literal">'initInstance'</span>, inst);
-
- <span class="comment">// Setup keyboard shortcuts</span>
- <span class="reserved">if</span> (tinyMCE.getParam(<span class="literal">'custom_undo_redo_keyboard_shortcuts'</span>)) {
- inst.addShortcut(<span class="literal">'ctrl'</span>, <span class="literal">'z'</span>, <span class="literal">'lang_undo_desc'</span>, <span class="literal">'Undo'</span>);
- inst.addShortcut(<span class="literal">'ctrl'</span>, <span class="literal">'y'</span>, <span class="literal">'lang_redo_desc'</span>, <span class="literal">'Redo'</span>);
- }
-
- <span class="comment">// Add default shortcuts for gecko</span>
- <span class="reserved">if</span> (tinyMCE.isGecko) {
- inst.addShortcut(<span class="literal">'ctrl'</span>, <span class="literal">'b'</span>, <span class="literal">'lang_bold_desc'</span>, <span class="literal">'Bold'</span>);
- inst.addShortcut(<span class="literal">'ctrl'</span>, <span class="literal">'i'</span>, <span class="literal">'lang_italic_desc'</span>, <span class="literal">'Italic'</span>);
- inst.addShortcut(<span class="literal">'ctrl'</span>, <span class="literal">'u'</span>, <span class="literal">'lang_underline_desc'</span>, <span class="literal">'Underline'</span>);
- }
-
- <span class="comment">// Setup span styles</span>
- <span class="reserved">if</span> (tinyMCE.getParam(<span class="literal">"convert_fonts_to_spans"</span>))
- inst.getDoc().body.setAttribute(<span class="literal">'id'</span>, <span class="literal">'mceSpanFonts'</span>);
-
- <span class="reserved">if</span> (tinyMCE.settings[<span class="literal">'nowrap'</span>])
- doc.body.style.whiteSpace = <span class="literal">"nowrap"</span>;
-
- doc.body.dir = <span class="reserved">this</span>.settings[<span class="literal">'directionality'</span>];
- doc.editorId = editor_id;
-
- <span class="comment">// Add on document element in Mozilla</span>
- <span class="reserved">if</span> (!tinyMCE.isMSIE)
- doc.documentElement.editorId = editor_id;
-
- inst.setBaseHREF(tinyMCE.settings[<span class="literal">'base_href'</span>]);
-
- <span class="comment">// Replace new line characters to BRs</span>
- <span class="reserved">if</span> (tinyMCE.settings[<span class="literal">'convert_newlines_to_brs'</span>]) {
- content = tinyMCE.regexpReplace(content, <span class="literal">"\r\n"</span>, <span class="literal">"<br />"</span>, <span class="literal">"gi"</span>);
- content = tinyMCE.regexpReplace(content, <span class="literal">"\r"</span>, <span class="literal">"<br />"</span>, <span class="literal">"gi"</span>);
- content = tinyMCE.regexpReplace(content, <span class="literal">"\n"</span>, <span class="literal">"<br />"</span>, <span class="literal">"gi"</span>);
- }
-
- <span class="comment">// Open closed anchors</span>
- <span class="comment">// content = content.replace(new RegExp('<a(.*?)/>', 'gi'), '<a$1></a>');</span>
-
- <span class="comment">// Call custom cleanup code</span>
- content = tinyMCE.storeAwayURLs(content);
- content = tinyMCE._customCleanup(inst, <span class="literal">"insert_to_editor"</span>, content);
-
- <span class="reserved">if</span> (tinyMCE.isMSIE) {
- <span class="comment">// Ugly!!!</span>
- window.setInterval(<span class="literal">'try{tinyMCE.getCSSClasses(tinyMCE.instances["'</span> + editor_id + <span class="literal">'"].getDoc(), "'</span> + editor_id + <span class="literal">'");}catch(e){}'</span>, 500);
-
- <span class="reserved">if</span> (tinyMCE.settings[<span class="literal">"force_br_newlines"</span>])
- doc.styleSheets[0].addRule(<span class="literal">"p"</span>, <span class="literal">"margin: 0;"</span>);
-
- var body = inst.getBody();
- body.editorId = editor_id;
- }
-
- content = tinyMCE.cleanupHTMLCode(content);
-
- <span class="comment">// Fix for bug #958637</span>
- <span class="reserved">if</span> (!tinyMCE.isMSIE) {
- var contentElement = inst.getDoc().createElement(<span class="literal">"body"</span>);
- var doc = inst.getDoc();
-
- contentElement.innerHTML = content;
-
- <span class="comment">// Remove weridness!</span>
- <span class="reserved">if</span> (tinyMCE.isGecko && tinyMCE.settings[<span class="literal">'remove_lt_gt'</span>])
- content = content.replace(new RegExp(<span class="literal">'<>'</span>, <span class="literal">'g'</span>), <span class="literal">""</span>);
-
- <span class="reserved">if</span> (tinyMCE.settings[<span class="literal">'cleanup_on_startup'</span>])
- tinyMCE.setInnerHTML(inst.getBody(), tinyMCE._cleanupHTML(inst, doc, <span class="reserved">this</span>.settings, contentElement));
- <span class="reserved">else</span> {
- <span class="comment">// Convert all strong/em to b/i</span>
- content = tinyMCE.regexpReplace(content, <span class="literal">"<strong"</span>, <span class="literal">"<b"</span>, <span class="literal">"gi"</span>);
- content = tinyMCE.regexpReplace(content, <span class="literal">"<em(/?)>"</span>, <span class="literal">"<i$1>"</span>, <span class="literal">"gi"</span>);
- content = tinyMCE.regexpReplace(content, <span class="literal">"<em "</span>, <span class="literal">"<i "</span>, <span class="literal">"gi"</span>);
- content = tinyMCE.regexpReplace(content, <span class="literal">"</strong>"</span>, <span class="literal">"</b>"</span>, <span class="literal">"gi"</span>);
- content = tinyMCE.regexpReplace(content, <span class="literal">"</em>"</span>, <span class="literal">"</i>"</span>, <span class="literal">"gi"</span>);
- tinyMCE.setInnerHTML(inst.getBody(), content);
- }
-
- tinyMCE.convertAllRelativeURLs(inst.getBody());
- } <span class="reserved">else</span> {
- <span class="reserved">if</span> (tinyMCE.settings[<span class="literal">'cleanup_on_startup'</span>]) {
- tinyMCE._setHTML(inst.getDoc(), content);
-
- <span class="comment">// Produces permission denied error in MSIE 5.5</span>
- eval(<span class="literal">'try {tinyMCE.setInnerHTML(inst.getBody(), tinyMCE._cleanupHTML(inst, inst.contentDocument, this.settings, inst.getBody()));} catch(e) {}'</span>);
- } <span class="reserved">else</span>
- tinyMCE._setHTML(inst.getDoc(), content);
- }
-
- <span class="comment">// Fix for bug #957681</span>
- <span class="comment">//inst.getDoc().designMode = inst.getDoc().designMode;</span>
-
- <span class="comment">// Setup element references</span>
- var parentElm = inst.targetDoc.getElementById(inst.editorId + <span class="literal">'_parent'</span>);
- inst.formElement = tinyMCE.isGecko ? parentElm.previousSibling : parentElm.nextSibling;
-
- tinyMCE.handleVisualAid(inst.getBody(), true, tinyMCE.settings[<span class="literal">'visual'</span>], inst);
- tinyMCE.dispatchCallback(inst, <span class="literal">'setupcontent_callback'</span>, <span class="literal">'setupContent'</span>, editor_id, inst.getBody(), inst.getDoc());
-
- <span class="comment">// Re-add design mode on mozilla</span>
- <span class="reserved">if</span> (!tinyMCE.isMSIE)
- tinyMCE.addEventHandlers(inst);
-
- <span class="comment">// Add blur handler</span>
- <span class="reserved">if</span> (tinyMCE.isMSIE) {
- tinyMCE.addEvent(inst.getBody(), <span class="literal">"blur"</span>, TinyMCE_Engine.<span class="reserved">prototype</span>._eventPatch);
- tinyMCE.addEvent(inst.getBody(), <span class="literal">"beforedeactivate"</span>, TinyMCE_Engine.<span class="reserved">prototype</span>._eventPatch); <span class="comment">// Bug #1439953</span>
-
- <span class="comment">// Workaround for drag drop/copy paste base href bug</span>
- <span class="reserved">if</span> (!tinyMCE.isOpera) {
- tinyMCE.addEvent(doc.body, <span class="literal">"mousemove"</span>, TinyMCE_Engine.<span class="reserved">prototype</span>.onMouseMove);
- tinyMCE.addEvent(doc.body, <span class="literal">"beforepaste"</span>, TinyMCE_Engine.<span class="reserved">prototype</span>._eventPatch);
- tinyMCE.addEvent(doc.body, <span class="literal">"drop"</span>, TinyMCE_Engine.<span class="reserved">prototype</span>._eventPatch);
- }
- }
-
- <span class="comment">// Trigger node change, this call locks buttons for tables and so forth</span>
- tinyMCE.selectedInstance = inst;
- tinyMCE.selectedElement = inst.contentWindow.document.body;
-
- <span class="comment">// Call custom DOM cleanup</span>
- tinyMCE._customCleanup(inst, <span class="literal">"insert_to_editor_dom"</span>, inst.getBody());
- tinyMCE._customCleanup(inst, <span class="literal">"setup_content_dom"</span>, inst.getBody());
- tinyMCE._setEventsEnabled(inst.getBody(), false);
- tinyMCE.cleanupAnchors(inst.getDoc());
-
- <span class="reserved">if</span> (tinyMCE.getParam(<span class="literal">"convert_fonts_to_spans"</span>))
- tinyMCE.convertSpansToFonts(inst.getDoc());
-
- inst.startContent = tinyMCE.trim(inst.getBody().innerHTML);
- inst.undoRedo.add({ content : inst.startContent });
-
- <span class="comment">// Cleanup any mess left from storyAwayURLs</span>
- <span class="reserved">if</span> (tinyMCE.isGecko) {
- <span class="comment">// Remove mce_src from textnodes and comments</span>
- tinyMCE.selectNodes(inst.getBody(), <span class="reserved">function</span>(n) {
- <span class="reserved">if</span> (n.nodeType == 3 || n.nodeType == 8) {
- n.nodeValue = n.nodeValue.replace(new RegExp(<span class="literal">'\\smce_src=\"[^\"]*\"'</span>, <span class="literal">'gi'</span>), <span class="literal">""</span>);
- n.nodeValue = n.nodeValue.replace(new RegExp(<span class="literal">'\\smce_href=\"[^\"]*\"'</span>, <span class="literal">'gi'</span>), <span class="literal">""</span>);
- }
-
- <span class="reserved">return</span> false;
- });
- }
-
- <span class="comment">// Cleanup any mess left from storyAwayURLs</span>
- tinyMCE._removeInternal(inst.getBody());
-
- tinyMCE.selectedInstance = inst;
- tinyMCE.triggerNodeChange(false, true);
- },
-
- <span class="comment">/**
- * Stores away the src and href attribute values in separate mce_src and mce_href attributes.
- * This is needed since both MSIE and Gecko messes with these attributes. The old
- * src and href will be intact, this simply adds them to a separate attribute.
- *
- * <span class="attrib">@param</span> {string} s HTML string to replace src and href attributes in.
- * <span class="attrib">@return</span> HTML string with replaced src and href attributes.
- * <span class="attrib">@type</span> string
- */</span>
- storeAwayURLs : <span class="reserved">function</span>(s) {
- <span class="comment">// Remove all mce_src, mce_href and replace them with new ones</span>
- <span class="comment">// s = s.replace(new RegExp('mce_src\\s*=\\s*\"[^ >\"]*\"', 'gi'), '');</span>
- <span class="comment">// s = s.replace(new RegExp('mce_href\\s*=\\s*\"[^ >\"]*\"', 'gi'), '');</span>
-
- <span class="reserved">if</span> (!s.match(/(mce_src|mce_href)/gi, s)) {
- s = s.replace(new RegExp(<span class="literal">'src\\s*=\\s*\"([^ >\"]*)\"'</span>, <span class="literal">'gi'</span>), <span class="literal">'src="$1" mce_src="$1"'</span>);
- s = s.replace(new RegExp(<span class="literal">'href\\s*=\\s*\"([^ >\"]*)\"'</span>, <span class="literal">'gi'</span>), <span class="literal">'href="$1" mce_href="$1"'</span>);
- }
-
- <span class="reserved">return</span> s;
- },
-
- <span class="comment">/**
- * Removes any internal content inserted by regexps.
- *
- * <span class="attrib">@param</span> {DOMNode} n Node to remove internal content from.
- */</span>
- _removeInternal : <span class="reserved">function</span>(n) {
- <span class="reserved">if</span> (tinyMCE.isGecko) {
- <span class="comment">// Remove mce_src from textnodes and comments</span>
- tinyMCE.selectNodes(n, <span class="reserved">function</span>(n) {
- <span class="reserved">if</span> (n.nodeType == 3 || n.nodeType == 8) {
- n.nodeValue = n.nodeValue.replace(new RegExp(<span class="literal">'\\smce_src=\"[^\"]*\"'</span>, <span class="literal">'gi'</span>), <span class="literal">""</span>);
- n.nodeValue = n.nodeValue.replace(new RegExp(<span class="literal">'\\smce_href=\"[^\"]*\"'</span>, <span class="literal">'gi'</span>), <span class="literal">""</span>);
- }
-
- <span class="reserved">return</span> false;
- });
- }
- },
-
- <span class="comment">/**
- * Removes/disables TinyMCE built in form elements such as select boxes for font sizes etc.
- * These are disabled when the user submits a form so they don't get picked up by the backend script
- * that intercepts the contents.
- *
- * <span class="attrib">@param</span> {HTMLElement} form_obj Form object to loop through for TinyMCE specific form elements.
- */</span>
- removeTinyMCEFormElements : <span class="reserved">function</span>(form_obj) {
- <span class="comment">// Check if form is valid</span>
- <span class="reserved">if</span> (typeof(form_obj) == <span class="literal">"undefined"</span> || form_obj == null)
- <span class="reserved">return</span>;
-
- <span class="comment">// If not a form, find the form</span>
- <span class="reserved">if</span> (form_obj.nodeName != <span class="literal">"FORM"</span>) {
- <span class="reserved">if</span> (form_obj.form)
- form_obj = form_obj.form;
- <span class="reserved">else</span>
- form_obj = tinyMCE.getParentElement(form_obj, <span class="literal">"form"</span>);
- }
-
- <span class="comment">// Still nothing</span>
- <span class="reserved">if</span> (form_obj == null)
- <span class="reserved">return</span>;
-
- <span class="comment">// Disable all UI form elements that TinyMCE created</span>
- <span class="reserved">for</span> (var i=0; i<form_obj.elements.length; i++) {
- var elementId = form_obj.elements[i].name ? form_obj.elements[i].name : form_obj.elements[i].id;
-
- <span class="reserved">if</span> (elementId.indexOf(<span class="literal">'mce_editor_'</span>) == 0)
- form_obj.elements[i].disabled = true;
- }
- },
-
- <span class="comment">/**
- * Event handler function that gets executed each time a event occurs in a TinyMCE editor control instance.
- * Todo: Fix the return statements so they return true or false.
- *
- * <span class="attrib">@param</span> {DOMEvent} e DOM event object reference.
- * <span class="attrib">@return</span> true - if the event is to be chained, false - if the event chain is to be canceled.
- * <span class="attrib">@type</span> boolean
- */</span>
- handleEvent : <span class="reserved">function</span>(e) {
- var inst = tinyMCE.selectedInstance;
-
- <span class="comment">// Remove odd, error</span>
- <span class="reserved">if</span> (typeof(tinyMCE) == <span class="literal">"undefined"</span>)
- <span class="reserved">return</span> true;
-
- <span class="comment">//tinyMCE.debug(e.type + " " + e.target.nodeName + " " + (e.relatedTarget ? e.relatedTarget.nodeName : ""));</span>
-
- <span class="reserved">if</span> (tinyMCE.executeCallback(tinyMCE.selectedInstance, <span class="literal">'handle_event_callback'</span>, <span class="literal">'handleEvent'</span>, e))
- <span class="reserved">return</span> false;
-
- switch (e.type) {
- case <span class="literal">"beforedeactivate"</span>: <span class="comment">// Was added due to bug #1439953</span>
- case <span class="literal">"blur"</span>:
- <span class="reserved">if</span> (tinyMCE.selectedInstance)
- tinyMCE.selectedInstance.execCommand(<span class="literal">'mceEndTyping'</span>);
-
- tinyMCE.hideMenus();
-
- <span class="reserved">return</span>;
-
- <span class="comment">// Workaround for drag drop/copy paste base href bug</span>
- case <span class="literal">"drop"</span>:
- case <span class="literal">"beforepaste"</span>:
- <span class="reserved">if</span> (tinyMCE.selectedInstance)
- tinyMCE.selectedInstance.setBaseHREF(null);
-
- window.setTimeout(<span class="literal">"tinyMCE.selectedInstance.setBaseHREF(tinyMCE.settings['base_href']);"</span>, 1);
- <span class="reserved">return</span>;
-
- case <span class="literal">"submit"</span>:
- tinyMCE.removeTinyMCEFormElements(tinyMCE.isMSIE ? window.event.srcElement : e.target);
- tinyMCE.triggerSave();
- tinyMCE.isNotDirty = true;
- <span class="reserved">return</span>;
-
- case <span class="literal">"reset"</span>:
- var formObj = tinyMCE.isMSIE ? window.event.srcElement : e.target;
-
- <span class="reserved">for</span> (var i=0; i<document.forms.length; i++) {
- <span class="reserved">if</span> (document.forms[i] == formObj)
- window.setTimeout(<span class="literal">'tinyMCE.resetForm('</span> + i + <span class="literal">');'</span>, 10);
- }
-
- <span class="reserved">return</span>;
-
- case <span class="literal">"keypress"</span>:
- <span class="reserved">if</span> (inst && inst.handleShortcut(e))
- <span class="reserved">return</span> false;
-
- <span class="reserved">if</span> (e.target.editorId) {
- tinyMCE.selectedInstance = tinyMCE.instances[e.target.editorId];
- } <span class="reserved">else</span> {
- <span class="reserved">if</span> (e.target.ownerDocument.editorId)
- tinyMCE.selectedInstance = tinyMCE.instances[e.target.ownerDocument.editorId];
- }
-
- <span class="reserved">if</span> (tinyMCE.selectedInstance)
- tinyMCE.selectedInstance.switchSettings();
-
- <span class="comment">// Insert P element</span>
- <span class="reserved">if</span> (tinyMCE.isGecko && tinyMCE.settings[<span class="literal">'force_p_newlines'</span>] && e.keyCode == 13 && !e.shiftKey) {
- <span class="comment">// Insert P element instead of BR</span>
- <span class="reserved">if</span> (TinyMCE_ForceParagraphs._insertPara(tinyMCE.selectedInstance, e)) {
- <span class="comment">// Cancel event</span>
- tinyMCE.execCommand(<span class="literal">"mceAddUndoLevel"</span>);
- tinyMCE.cancelEvent(e);
- <span class="reserved">return</span> false;
- }
- }
-
- <span class="comment">// Handle backspace</span>
- <span class="reserved">if</span> (tinyMCE.isGecko && tinyMCE.settings[<span class="literal">'force_p_newlines'</span>] && (e.keyCode == 8 || e.keyCode == 46) && !e.shiftKey) {
- <span class="comment">// Insert P element instead of BR</span>
- <span class="reserved">if</span> (TinyMCE_ForceParagraphs._handleBackSpace(tinyMCE.selectedInstance, e.type)) {
- <span class="comment">// Cancel event</span>
- tinyMCE.execCommand(<span class="literal">"mceAddUndoLevel"</span>);
- tinyMCE.cancelEvent(e);
- <span class="reserved">return</span> false;
- }
- }
-
- <span class="comment">// Return key pressed</span>
- <span class="reserved">if</span> (tinyMCE.isMSIE && tinyMCE.settings[<span class="literal">'force_br_newlines'</span>] && e.keyCode == 13) {
- <span class="reserved">if</span> (e.target.editorId)
- tinyMCE.selectedInstance = tinyMCE.instances[e.target.editorId];
-
- <span class="reserved">if</span> (tinyMCE.selectedInstance) {
- var sel = tinyMCE.selectedInstance.getDoc().selection;
- var rng = sel.createRange();
-
- <span class="reserved">if</span> (tinyMCE.getParentElement(rng.parentElement(), <span class="literal">"li"</span>) != null)
- <span class="reserved">return</span> false;
-
- <span class="comment">// Cancel event</span>
- e.returnValue = false;
- e.cancelBubble = true;
-
- <span class="comment">// Insert BR element</span>
- rng.pasteHTML(<span class="literal">"<br />"</span>);
- rng.collapse(false);
- rng.select();
-
- tinyMCE.execCommand(<span class="literal">"mceAddUndoLevel"</span>);
- tinyMCE.triggerNodeChange(false);
- <span class="reserved">return</span> false;
- }
- }
-
- <span class="comment">// Backspace or delete</span>
- <span class="reserved">if</span> (e.keyCode == 8 || e.keyCode == 46) {
- tinyMCE.selectedElement = e.target;
- tinyMCE.linkElement = tinyMCE.getParentElement(e.target, <span class="literal">"a"</span>);
- tinyMCE.imgElement = tinyMCE.getParentElement(e.target, <span class="literal">"img"</span>);
- tinyMCE.triggerNodeChange(false);
- }
-
- <span class="reserved">return</span> false;
- break;
-
- case <span class="literal">"keyup"</span>:
- case <span class="literal">"keydown"</span>:
- tinyMCE.hideMenus();
- tinyMCE.hasMouseMoved = false;
-
- <span class="reserved">if</span> (inst && inst.handleShortcut(e))
- <span class="reserved">return</span> false;
-
- <span class="reserved">if</span> (e.target.editorId)
- tinyMCE.selectedInstance = tinyMCE.instances[e.target.editorId];
- <span class="reserved">else</span>
- <span class="reserved">return</span>;
-
- <span class="reserved">if</span> (tinyMCE.selectedInstance)
- tinyMCE.selectedInstance.switchSettings();
-
- var inst = tinyMCE.selectedInstance;
-
- <span class="comment">// Handle backspace</span>
- <span class="reserved">if</span> (tinyMCE.isGecko && tinyMCE.settings[<span class="literal">'force_p_newlines'</span>] && (e.keyCode == 8 || e.keyCode == 46) && !e.shiftKey) {
- <span class="comment">// Insert P element instead of BR</span>
- <span class="reserved">if</span> (TinyMCE_ForceParagraphs._handleBackSpace(tinyMCE.selectedInstance, e.type)) {
- <span class="comment">// Cancel event</span>
- tinyMCE.execCommand(<span class="literal">"mceAddUndoLevel"</span>);
- e.preventDefault();
- <span class="reserved">return</span> false;
- }
- }
-
- tinyMCE.selectedElement = null;
- tinyMCE.selectedNode = null;
- var elm = tinyMCE.selectedInstance.getFocusElement();
- tinyMCE.linkElement = tinyMCE.getParentElement(elm, <span class="literal">"a"</span>);
- tinyMCE.imgElement = tinyMCE.getParentElement(elm, <span class="literal">"img"</span>);
- tinyMCE.selectedElement = elm;
-
- <span class="comment">// Update visualaids on tabs</span>
- <span class="reserved">if</span> (tinyMCE.isGecko && e.type == <span class="literal">"keyup"</span> && e.keyCode == 9)
- tinyMCE.handleVisualAid(tinyMCE.selectedInstance.getBody(), true, tinyMCE.settings[<span class="literal">'visual'</span>], tinyMCE.selectedInstance);
-
- <span class="comment">// Fix empty elements on return/enter, check where enter occured</span>
- <span class="reserved">if</span> (tinyMCE.isMSIE && e.type == <span class="literal">"keydown"</span> && e.keyCode == 13)
- tinyMCE.enterKeyElement = tinyMCE.selectedInstance.getFocusElement();
-
- <span class="comment">// Fix empty elements on return/enter</span>
- <span class="reserved">if</span> (tinyMCE.isMSIE && e.type == <span class="literal">"keyup"</span> && e.keyCode == 13) {
- var elm = tinyMCE.enterKeyElement;
- <span class="reserved">if</span> (elm) {
- var re = new RegExp(<span class="literal">'^HR|IMG|BR$'</span>,<span class="literal">'g'</span>); <span class="comment">// Skip these</span>
- var dre = new RegExp(<span class="literal">'^H[1-6]$'</span>,<span class="literal">'g'</span>); <span class="comment">// Add double on these</span>
-
- <span class="reserved">if</span> (!elm.hasChildNodes() && !re.test(elm.nodeName)) {
- <span class="reserved">if</span> (dre.test(elm.nodeName))
- elm.innerHTML = <span class="literal">" "</span>;
- <span class="reserved">else</span>
- elm.innerHTML = <span class="literal">" "</span>;
- }
- }
- }
-
- <span class="comment">// Check if it's a position key</span>
- var keys = tinyMCE.posKeyCodes;
- var posKey = false;
- <span class="reserved">for</span> (var i=0; i<keys.length; i++) {
- <span class="reserved">if</span> (keys[i] == e.keyCode) {
- posKey = true;
- break;
- }
- }
-
- <span class="comment">// MSIE custom key handling</span>
- <span class="reserved">if</span> (tinyMCE.isMSIE && tinyMCE.settings[<span class="literal">'custom_undo_redo'</span>]) {
- var keys = new Array(8,46); <span class="comment">// Backspace,Delete</span>
- <span class="reserved">for</span> (var i=0; i<keys.length; i++) {
- <span class="reserved">if</span> (keys[i] == e.keyCode) {
- <span class="reserved">if</span> (e.type == <span class="literal">"keyup"</span>)
- tinyMCE.triggerNodeChange(false);
- }
- }
- }
-
- <span class="comment">// If Ctrl key</span>
- <span class="reserved">if</span> (e.keyCode == 17)
- <span class="reserved">return</span> true;
-
- <span class="comment">// Handle Undo/Redo when typing content</span>
-
- <span class="comment">// Start typing (non position key)</span>
- <span class="reserved">if</span> (!posKey && e.type == <span class="literal">"keyup"</span>)
- tinyMCE.execCommand(<span class="literal">"mceStartTyping"</span>);
-
- <span class="comment">// Store undo bookmark</span>
- <span class="reserved">if</span> (e.type == <span class="literal">"keydown"</span> && (posKey || e.ctrlKey) && inst)
- inst.undoBookmark = inst.selection.getBookmark();
-
- <span class="comment">// End typing (position key) or some Ctrl event</span>
- <span class="reserved">if</span> (e.type == <span class="literal">"keyup"</span> && (posKey || e.ctrlKey))
- tinyMCE.execCommand(<span class="literal">"mceEndTyping"</span>);
-
- <span class="reserved">if</span> (posKey && e.type == <span class="literal">"keyup"</span>)
- tinyMCE.triggerNodeChange(false);
-
- <span class="reserved">if</span> (tinyMCE.isMSIE && e.ctrlKey)
- window.setTimeout(<span class="literal">'tinyMCE.triggerNodeChange(false);'</span>, 1);
- break;
-
- case <span class="literal">"mousedown"</span>:
- case <span class="literal">"mouseup"</span>:
- case <span class="literal">"click"</span>:
- case <span class="literal">"focus"</span>:
- tinyMCE.hideMenus();
-
- <span class="reserved">if</span> (tinyMCE.selectedInstance) {
- tinyMCE.selectedInstance.switchSettings();
- tinyMCE.selectedInstance.isFocused = true;
- }
-
- <span class="comment">// Check instance event trigged on</span>
- var targetBody = tinyMCE.getParentElement(e.target, <span class="literal">"body"</span>);
- <span class="reserved">for</span> (var instanceName in tinyMCE.instances) {
- <span class="reserved">if</span> (!tinyMCE.isInstance(tinyMCE.instances[instanceName]))
- continue;
-
- var inst = tinyMCE.instances[instanceName];
-
- <span class="comment">// Reset design mode if lost (on everything just in case)</span>
- inst.autoResetDesignMode();
-
- <span class="reserved">if</span> (inst.getBody() == targetBody) {
- tinyMCE.selectedInstance = inst;
- tinyMCE.selectedElement = e.target;
- tinyMCE.linkElement = tinyMCE.getParentElement(tinyMCE.selectedElement, <span class="literal">"a"</span>);
- tinyMCE.imgElement = tinyMCE.getParentElement(tinyMCE.selectedElement, <span class="literal">"img"</span>);
- break;
- }
- }
-
- <span class="comment">// Add first bookmark location</span>
- <span class="reserved">if</span> (!tinyMCE.selectedInstance.undoRedo.undoLevels[0].bookmark)
- tinyMCE.selectedInstance.undoRedo.undoLevels[0].bookmark = tinyMCE.selectedInstance.selection.getBookmark();
-
- <span class="reserved">if</span> (tinyMCE.isSafari) {
- tinyMCE.selectedInstance.lastSafariSelection = tinyMCE.selectedInstance.selection.getBookmark();
- tinyMCE.selectedInstance.lastSafariSelectedElement = tinyMCE.selectedElement;
-
- var lnk = tinyMCE.getParentElement(tinyMCE.selectedElement, <span class="literal">"a"</span>);
-
- <span class="comment">// Patch the darned link</span>
- <span class="reserved">if</span> (lnk && e.type == <span class="literal">"mousedown"</span>) {
- lnk.setAttribute(<span class="literal">"mce_real_href"</span>, lnk.getAttribute(<span class="literal">"href"</span>));
- lnk.setAttribute(<span class="literal">"href"</span>, <span class="literal">"javascript:void(0);"</span>);
- }
-
- <span class="comment">// Patch back</span>
- <span class="reserved">if</span> (lnk && e.type == <span class="literal">"click"</span>) {
- window.setTimeout(<span class="reserved">function</span>() {
- lnk.setAttribute(<span class="literal">"href"</span>, lnk.getAttribute(<span class="literal">"mce_real_href"</span>));
- lnk.removeAttribute(<span class="literal">"mce_real_href"</span>);
- }, 10);
- }
- }
-
- <span class="comment">// Reset selected node</span>
- <span class="reserved">if</span> (e.type != <span class="literal">"focus"</span>)
- tinyMCE.selectedNode = null;
-
- tinyMCE.triggerNodeChange(false);
- tinyMCE.execCommand(<span class="literal">"mceEndTyping"</span>);
-
- <span class="reserved">if</span> (e.type == <span class="literal">"mouseup"</span>)
- tinyMCE.execCommand(<span class="literal">"mceAddUndoLevel"</span>);
-
- <span class="comment">// Just in case</span>
- <span class="reserved">if</span> (!tinyMCE.selectedInstance && e.target.editorId)
- tinyMCE.selectedInstance = tinyMCE.instances[e.target.editorId];
-
- <span class="reserved">return</span> false;
- break;
- }
- },
-
- <span class="comment">/**
- * Returns the HTML code for a normal button control.
- *
- * <span class="attrib">@param</span> {string} id Button control id, this will be the suffix for the element id, the prefix is the editor id.
- * <span class="attrib">@param</span> {string} lang Language variable key name to insert as the title/alt of the button image.
- * <span class="attrib">@param</span> {string} img Image URL to insert, {$themeurl} and {$pluginurl} will be replaced.
- * <span class="attrib">@param</span> {string} cmd Command to execute when the user clicks the button.
- * <span class="attrib">@param</span> {string} ui Optional user interface boolean for command.
- * <span class="attrib">@param</span> {string} val Optional value for command.
- * <span class="attrib">@return</span> HTML code for a normal button based in input information.
- * <span class="attrib">@type</span> string
- */</span>
- getButtonHTML : <span class="reserved">function</span>(id, lang, img, cmd, ui, val) {
- var h = <span class="literal">''</span>, m, x;
-
- cmd = <span class="literal">'tinyMCE.execInstanceCommand(\'</span>{$editor_id}\<span class="literal">',\'</span><span class="literal">' + cmd + '</span>\<span class="literal">''</span>;
-
- <span class="reserved">if</span> (typeof(ui) != <span class="literal">"undefined"</span> && ui != null)
- cmd += <span class="literal">','</span> + ui;
-
- <span class="reserved">if</span> (typeof(val) != <span class="literal">"undefined"</span> && val != null)
- cmd += <span class="literal">",'"</span> + val + <span class="literal">"'"</span>;
-
- cmd += <span class="literal">');'</span>;
-
- <span class="comment">// Use tilemaps when enabled and found and never in MSIE since it loads the tile each time from cache if cahce is disabled</span>
- <span class="reserved">if</span> (tinyMCE.getParam(<span class="literal">'button_tile_map'</span>) && (!tinyMCE.isMSIE || tinyMCE.isOpera) && (m = <span class="reserved">this</span>.buttonMap[id]) != null && (tinyMCE.getParam(<span class="literal">"language"</span>) == <span class="literal">"en"</span> || img.indexOf(<span class="literal">'$lang'</span>) == -1)) {
- <span class="comment">// Tiled button</span>
- x = 0 - (m * 20) == 0 ? <span class="literal">'0'</span> : 0 - (m * 20);
- h += <span class="literal">'<a id="{$editor_id}_'</span> + id + <span class="literal">'" href="javascript:'</span> + cmd + <span class="literal">'" onclick="'</span> + cmd + <span class="literal">'return false;" onmousedown="return false;" class="mceTiledButton mceButtonNormal" target="_self">'</span>;
- h += <span class="literal">'<img src="{$themeurl}/images/spacer.gif" style="background-position: '</span> + x + <span class="literal">'px 0" title="{$'</span> + lang + <span class="literal">'}" />'</span>;
- h += <span class="literal">'</a>'</span>;
- } <span class="reserved">else</span> {
- <span class="comment">// Normal button</span>
- h += <span class="literal">'<a id="{$editor_id}_'</span> + id + <span class="literal">'" href="javascript:'</span> + cmd + <span class="literal">'" onclick="'</span> + cmd + <span class="literal">'return false;" onmousedown="return false;" class="mceButtonNormal" target="_self">'</span>;
- h += <span class="literal">'<img src="'</span> + img + <span class="literal">'" title="{$'</span> + lang + <span class="literal">'}" />'</span>;
- h += <span class="literal">'</a>'</span>;
- }
-
- <span class="reserved">return</span> h;
- },
-
- <span class="comment">/**
- * Adds a list of buttons available in the tiled button image used by the button_tile_map option.
- *
- * <span class="attrib">@param</span> {string} m Comma separated list of buttons that are available in tiled image.
- */</span>
- addButtonMap : <span class="reserved">function</span>(m) {
- var i, a = m.replace(/\s+/, <span class="literal">''</span>).split(<span class="literal">','</span>);
-
- <span class="reserved">for</span> (i=0; i<a.length; i++)
- <span class="reserved">this</span>.buttonMap[a[i]] = i;
- },
-
- <span class="comment">/**
- * Piggyback onsubmit event handler function, this will remove/hide the TinyMCE specific form elements
- * call triggerSave to fill the textarea with the correct contents then call the old piggy backed event handler.
- */</span>
- submitPatch : <span class="reserved">function</span>() {
- tinyMCE.removeTinyMCEFormElements(<span class="reserved">this</span>);
- tinyMCE.triggerSave();
- <span class="reserved">this</span>.mceOldSubmit();
- tinyMCE.isNotDirty = true;
- },
-
- <span class="comment">/**
- * Gets executed when the page loads or get intitialized. This function will then convert all textareas/divs that
- * is to be converted into TinyMCE editor controls.
- *
- * <span class="attrib">@return</span> true - if the event is to be chained, false - if the event chain is to be canceled.
- * <span class="attrib">@type</span> boolean
- */</span>
- onLoad : <span class="reserved">function</span>() {
- <span class="reserved">if</span> (tinyMCE.isMSIE && !tinyMCE.isOpera && window.event.type == <span class="literal">"readystatechange"</span> && document.readyState != <span class="literal">"complete"</span>)
- <span class="reserved">return</span> true;
-
- <span class="reserved">if</span> (tinyMCE.isLoaded)
- <span class="reserved">return</span> true;
-
- tinyMCE.isLoaded = true;
-
- tinyMCE.dispatchCallback(null, <span class="literal">'onpageload'</span>, <span class="literal">'onPageLoad'</span>);
-
- <span class="reserved">for</span> (var c=0; c<tinyMCE.configs.length; c++) {
- tinyMCE.settings = tinyMCE.configs[c];
-
- var selector = tinyMCE.getParam(<span class="literal">"editor_selector"</span>);
- var deselector = tinyMCE.getParam(<span class="literal">"editor_deselector"</span>);
- var elementRefAr = new Array();
-
- <span class="comment">// Add submit triggers</span>
- <span class="reserved">if</span> (document.forms && tinyMCE.settings[<span class="literal">'add_form_submit_trigger'</span>] && !tinyMCE.submitTriggers) {
- <span class="reserved">for</span> (var i=0; i<document.forms.length; i++) {
- var form = document.forms[i];
-
- tinyMCE.addEvent(form, <span class="literal">"submit"</span>, TinyMCE_Engine.<span class="reserved">prototype</span>.handleEvent);
- tinyMCE.addEvent(form, <span class="literal">"reset"</span>, TinyMCE_Engine.<span class="reserved">prototype</span>.handleEvent);
- tinyMCE.submitTriggers = true; <span class="comment">// Do it only once</span>
-
- <span class="comment">// Patch the form.submit function</span>
- <span class="reserved">if</span> (tinyMCE.settings[<span class="literal">'submit_patch'</span>]) {
- try {
- form.mceOldSubmit = form.submit;
- form.submit = TinyMCE_Engine.<span class="reserved">prototype</span>.submitPatch;
- } catch (e) {
- <span class="comment">// Do nothing</span>
- }
- }
- }
- }
-
- <span class="comment">// Add editor instances based on mode</span>
- var mode = tinyMCE.settings[<span class="literal">'mode'</span>];
- switch (mode) {
- case <span class="literal">"exact"</span>:
- var elements = tinyMCE.getParam(<span class="literal">'elements'</span>, <span class="literal">''</span>, true, <span class="literal">','</span>);
-
- <span class="reserved">for</span> (var i=0; i<elements.length; i++) {
- var element = tinyMCE._getElementById(elements[i]);
- var trigger = element ? element.getAttribute(tinyMCE.settings[<span class="literal">'textarea_trigger'</span>]) : <span class="literal">""</span>;
-
- <span class="reserved">if</span> (tinyMCE.getAttrib(element, <span class="literal">"class"</span>).indexOf(deselector) != -1)
- continue;
-
- <span class="reserved">if</span> (trigger == <span class="literal">"false"</span>)
- continue;
-
- <span class="reserved">if</span> ((tinyMCE.settings[<span class="literal">'ask'</span>] || tinyMCE.settings[<span class="literal">'convert_on_click'</span>]) && element) {
- elementRefAr[elementRefAr.length] = element;
- continue;
- }
-
- <span class="reserved">if</span> (element)
- tinyMCE.addMCEControl(element, elements[i]);
- <span class="reserved">else</span> <span class="reserved">if</span> (tinyMCE.settings[<span class="literal">'debug'</span>])
- alert(<span class="literal">"Error: Could not find element by id or name: "</span> + elements[i]);
- }
- break;
-
- case <span class="literal">"specific_textareas"</span>:
- case <span class="literal">"textareas"</span>:
- var nodeList = document.getElementsByTagName(<span class="literal">"textarea"</span>);
-
- <span class="reserved">for</span> (var i=0; i<nodeList.length; i++) {
- var elm = nodeList.item(i);
- var trigger = elm.getAttribute(tinyMCE.settings[<span class="literal">'textarea_trigger'</span>]);
-
- <span class="reserved">if</span> (selector != <span class="literal">''</span> && tinyMCE.getAttrib(elm, <span class="literal">"class"</span>).indexOf(selector) == -1)
- continue;
-
- <span class="reserved">if</span> (selector != <span class="literal">''</span>)
- trigger = selector != <span class="literal">""</span> ? <span class="literal">"true"</span> : <span class="literal">""</span>;
-
- <span class="reserved">if</span> (tinyMCE.getAttrib(elm, <span class="literal">"class"</span>).indexOf(deselector) != -1)
- continue;
-
- <span class="reserved">if</span> ((mode == <span class="literal">"specific_textareas"</span> && trigger == <span class="literal">"true"</span>) || (mode == <span class="literal">"textareas"</span> && trigger != <span class="literal">"false"</span>))
- elementRefAr[elementRefAr.length] = elm;
- }
- break;
- }
-
- <span class="reserved">for</span> (var i=0; i<elementRefAr.length; i++) {
- var element = elementRefAr[i];
- var elementId = element.name ? element.name : element.id;
-
- <span class="reserved">if</span> (tinyMCE.settings[<span class="literal">'ask'</span>] || tinyMCE.settings[<span class="literal">'convert_on_click'</span>]) {
- <span class="comment">// Focus breaks in Mozilla</span>
- <span class="reserved">if</span> (tinyMCE.isGecko) {
- var settings = tinyMCE.settings;
-
- tinyMCE.addEvent(element, <span class="literal">"focus"</span>, <span class="reserved">function</span> (e) {window.setTimeout(<span class="reserved">function</span>() {TinyMCE_Engine.<span class="reserved">prototype</span>.confirmAdd(e, settings);}, 10);});
-
- <span class="reserved">if</span> (element.nodeName != <span class="literal">"TEXTAREA"</span> && element.nodeName != <span class="literal">"INPUT"</span>)
- tinyMCE.addEvent(element, <span class="literal">"click"</span>, <span class="reserved">function</span> (e) {window.setTimeout(<span class="reserved">function</span>() {TinyMCE_Engine.<span class="reserved">prototype</span>.confirmAdd(e, settings);}, 10);});
- <span class="comment">// tinyMCE.addEvent(element, "mouseover", function (e) {window.setTimeout(function() {TinyMCE_Engine.prototype.confirmAdd(e, settings);}, 10);});</span>
- } <span class="reserved">else</span> {
- var settings = tinyMCE.settings;
-
- tinyMCE.addEvent(element, <span class="literal">"focus"</span>, <span class="reserved">function</span> () { TinyMCE_Engine.<span class="reserved">prototype</span>.confirmAdd(null, settings); });
- tinyMCE.addEvent(element, <span class="literal">"click"</span>, <span class="reserved">function</span> () { TinyMCE_Engine.<span class="reserved">prototype</span>.confirmAdd(null, settings); });
- <span class="comment">// tinyMCE.addEvent(element, "mouseenter", function () { TinyMCE_Engine.prototype.confirmAdd(null, settings); });</span>
- }
- } <span class="reserved">else</span>
- tinyMCE.addMCEControl(element, elementId);
- }
-
- <span class="comment">// Handle auto focus</span>
- <span class="reserved">if</span> (tinyMCE.settings[<span class="literal">'auto_focus'</span>]) {
- window.setTimeout(<span class="reserved">function</span> () {
- var inst = tinyMCE.getInstanceById(tinyMCE.settings[<span class="literal">'auto_focus'</span>]);
- inst.selection.selectNode(inst.getBody(), true, true);
- inst.contentWindow.focus();
- }, 10);
- }
-
- tinyMCE.dispatchCallback(null, <span class="literal">'oninit'</span>, <span class="literal">'onInit'</span>);
- }
- },
-
- <span class="comment">/**
- * Returns true/false if a specific object is a TinyMCE_Control instance or not.
- *
- * <span class="attrib">@param</span> {object} o Object to check.
- * <span class="attrib">@return</span> true/false if it's a control or not.
- * <span class="attrib">@type</span> boolean
- */</span>
- isInstance : <span class="reserved">function</span>(o) {
- <span class="reserved">return</span> o != null && typeof(o) == <span class="literal">"object"</span> && o.isTinyMCE_Control;
- },
-
- <span class="comment">/**
- * Returns a specific configuration setting or the default value if it wasn't found.
- *
- * <span class="attrib">@param</span> {string} name Configuration setting to get.
- * <span class="attrib">@param</span> {string} default_value Default value to return if it wasn't found.
- * <span class="attrib">@param</span> {boolean} strip_whitespace Optional remove all whitespace.
- * <span class="attrib">@param</span> {string} split_chr Split char/regex/string.
- * <span class="attrib">@return</span> Number, string or other object based in parameter and default_value.
- * <span class="attrib">@type</span> object
- */</span>
- getParam : <span class="reserved">function</span>(name, default_value, strip_whitespace, split_chr) {
- var value = (typeof(<span class="reserved">this</span>.settings[name]) == <span class="literal">"undefined"</span>) ? default_value : <span class="reserved">this</span>.settings[name];
-
- <span class="comment">// Fix bool values</span>
- <span class="reserved">if</span> (value == <span class="literal">"true"</span> || value == <span class="literal">"false"</span>)
- <span class="reserved">return</span> (value == <span class="literal">"true"</span>);
-
- <span class="reserved">if</span> (strip_whitespace)
- value = tinyMCE.regexpReplace(value, <span class="literal">"[ \t\r\n]"</span>, <span class="literal">""</span>);
-
- <span class="reserved">if</span> (typeof(split_chr) != <span class="literal">"undefined"</span> && split_chr != null) {
- value = value.split(split_chr);
- var outArray = new Array();
-
- <span class="reserved">for</span> (var i=0; i<value.length; i++) {
- <span class="reserved">if</span> (value[i] && value[i] != <span class="literal">""</span>)
- outArray[outArray.length] = value[i];
- }
-
- value = outArray;
- }
-
- <span class="reserved">return</span> value;
- },
-
- <span class="comment">/**
- * Returns a language variable value from the language packs.
- *
- * <span class="attrib">@param</span> {string} name Name of the key to retrive.
- * <span class="attrib">@param</span> {string} default_value Optional default value to return if it wasn't found.
- * <span class="attrib">@param</span> {boolean} parse_entities Is HTML entities to be resolved or not.
- * <span class="attrib">@param</span> {Array} va Optional name/value array of variables to replace in language string.
- * <span class="attrib">@return</span> Language string value could be a number if it's a relative dimenstion.
- * <span class="attrib">@type</span> object
- */</span>
- getLang : <span class="reserved">function</span>(name, default_value, parse_entities, va) {
- var v = (typeof(tinyMCELang[name]) == <span class="literal">"undefined"</span>) ? default_value : tinyMCELang[name], n;
-
- <span class="reserved">if</span> (parse_entities)
- v = tinyMCE.entityDecode(v);
-
- <span class="reserved">if</span> (va) {
- <span class="reserved">for</span> (n in va)
- v = <span class="reserved">this</span>.replaceVar(v, n, va[n]);
- }
-
- <span class="reserved">return</span> v;
- },
-
- <span class="comment">/**
- * HTML entity decode a string, replaces < with <.
- *
- * <span class="attrib">@param</span> {string} s Entity string to decode into normal string.
- * <span class="attrib">@return</span> Entity decoded string.
- * <span class="attrib">@type</span> string
- */</span>
- entityDecode : <span class="reserved">function</span>(s) {
- var e = document.createElement(<span class="literal">"div"</span>);
- e.innerHTML = s;
- <span class="reserved">return</span> e.innerHTML;
- },
-
- <span class="comment">/**
- * Adds language items to the global language array.
- *
- * <span class="attrib">@param</span> {string} prefix Prefix string to add infront of every array item before adding it.
- * <span class="attrib">@param</span> {Array} ar Language item array to add to global language array.
- */</span>
- addToLang : <span class="reserved">function</span>(prefix, ar) {
- <span class="reserved">for</span> (var key in ar) {
- <span class="reserved">if</span> (typeof(ar[key]) == <span class="literal">'function'</span>)
- continue;
-
- tinyMCELang[(key.indexOf(<span class="literal">'lang_'</span>) == -1 ? <span class="literal">'lang_'</span> : <span class="literal">''</span>) + (prefix != <span class="literal">''</span> ? (prefix + <span class="literal">"_"</span>) : <span class="literal">''</span>) + key] = ar[key];
- }
-
- <span class="comment">// for (var key in ar)</span>
- <span class="comment">// tinyMCELang[(key.indexOf('lang_') == -1 ? 'lang_' : '') + (prefix != '' ? (prefix + "_") : '') + key] = "|" + ar[key] + "|";</span>
- },
-
- <span class="comment">/**
- * Triggers a nodeChange event to every theme and plugin. This will be executed when the cursor moves or
- * when a command that modifies the editor contents is executed.
- *
- * <span class="attrib">@param</span> {boolean} focus Optional state if the last selected editor instance is to be focused or not.
- * <span class="attrib">@param</span> {boolean} setup_content Optional state if it's called from setup content function or not.
- */</span>
- triggerNodeChange : <span class="reserved">function</span>(focus, setup_content) {
- <span class="reserved">if</span> (tinyMCE.selectedInstance) {
- var inst = tinyMCE.selectedInstance;
- var editorId = inst.editorId;
- var elm = (typeof(setup_content) != <span class="literal">"undefined"</span> && setup_content) ? tinyMCE.selectedElement : inst.getFocusElement();
- var undoIndex = -1;
- var undoLevels = -1;
- var anySelection = false;
- var selectedText = inst.selection.getSelectedText();
-
- <span class="reserved">if</span> (setup_content && tinyMCE.isGecko && inst.isHidden())
- elm = inst.getBody();
-
- inst.switchSettings();
-
- <span class="reserved">if</span> (tinyMCE.settings[<span class="literal">"auto_resize"</span>]) {
- var doc = inst.getDoc();
-
- inst.iframeElement.style.width = doc.body.offsetWidth + <span class="literal">"px"</span>;
- inst.iframeElement.style.height = doc.body.offsetHeight + <span class="literal">"px"</span>;
- }
-
- <span class="reserved">if</span> (tinyMCE.selectedElement)
- anySelection = (tinyMCE.selectedElement.nodeName.toLowerCase() == <span class="literal">"img"</span>) || (selectedText && selectedText.length > 0);
-
- <span class="reserved">if</span> (tinyMCE.settings[<span class="literal">'custom_undo_redo'</span>]) {
- undoIndex = inst.undoRedo.undoIndex;
- undoLevels = inst.undoRedo.undoLevels.length;
- }
-
- tinyMCE.dispatchCallback(inst, <span class="literal">'handle_node_change_callback'</span>, <span class="literal">'handleNodeChange'</span>, editorId, elm, undoIndex, undoLevels, inst.visualAid, anySelection, setup_content);
- }
-
- <span class="reserved">if</span> (<span class="reserved">this</span>.selectedInstance && (typeof(focus) == <span class="literal">"undefined"</span> || focus))
- <span class="reserved">this</span>.selectedInstance.contentWindow.focus();
- },
-
- <span class="comment">/**
- * Executes the custom cleanup functions on the specified content.
- *
- * <span class="attrib">@param</span> {TinyMCE_Control} inst TinyMCE editor control instance.
- * <span class="attrib">@param</span> {string} type Event type to call.
- * <span class="attrib">@param</span> {object} content DOM element or string to pass to handlers depending on type.
- * <span class="attrib">@return</span> string or DOM element depending on type.
- * <span class="attrib">@private</span>
- */</span>
- _customCleanup : <span class="reserved">function</span>(inst, type, content) {
- var pl, po, i;
-
- <span class="comment">// Call custom cleanup</span>
- var customCleanup = tinyMCE.settings[<span class="literal">'cleanup_callback'</span>];
- <span class="reserved">if</span> (customCleanup != <span class="literal">""</span> && eval(<span class="literal">"typeof("</span> + customCleanup + <span class="literal">")"</span>) != <span class="literal">"undefined"</span>)
- content = eval(customCleanup + <span class="literal">"(type, content, inst);"</span>);
-
- <span class="comment">// Trigger plugin cleanups</span>
- pl = inst.plugins;
- <span class="reserved">for</span> (i=0; i<pl.length; i++) {
- po = tinyMCE.plugins[pl[i]];
-
- <span class="reserved">if</span> (po && po.cleanup)
- content = po.cleanup(type, content, inst);
- }
-
- <span class="reserved">return</span> content;
- },
-
- <span class="comment">/**
- * Sets the HTML contents of the selected editor instance.
- *
- * <span class="attrib">@param</span> {string} h HTML contents to set in the selected instance.
- * <span class="attrib">@deprecated</span>
- */</span>
- setContent : <span class="reserved">function</span>(h) {
- <span class="reserved">if</span> (tinyMCE.selectedInstance) {
- tinyMCE.selectedInstance.execCommand(<span class="literal">'mceSetContent'</span>, false, h);
- tinyMCE.selectedInstance.repaint();
- }
- },
-
- <span class="comment">/**
- * Loads a theme specific language pack.
- *
- * <span class="attrib">@param</span> {string} name Optional name of the theme to load language pack from.
- */</span>
- importThemeLanguagePack : <span class="reserved">function</span>(name) {
- <span class="reserved">if</span> (typeof(name) == <span class="literal">"undefined"</span>)
- name = tinyMCE.settings[<span class="literal">'theme'</span>];
-
- tinyMCE.loadScript(tinyMCE.baseURL + <span class="literal">'/themes/'</span> + name + <span class="literal">'/langs/'</span> + tinyMCE.settings[<span class="literal">'language'</span>] + <span class="literal">'.js'</span>);
- },
-
- <span class="comment">/**
- * Loads a plugin specific language pack.
- *
- * <span class="attrib">@param</span> {string} name Plugin name/id to load language pack for.
- * <span class="attrib">@param</span> {string} valid_languages Comma separated list of valid languages for the plugin.
- */</span>
- importPluginLanguagePack : <span class="reserved">function</span>(name, valid_languages) {
- var lang = <span class="literal">"en"</span>, b = tinyMCE.baseURL + <span class="literal">'/plugins/'</span> + name;
-
- valid_languages = valid_languages.split(<span class="literal">','</span>);
- <span class="reserved">for</span> (var i=0; i<valid_languages.length; i++) {
- <span class="reserved">if</span> (tinyMCE.settings[<span class="literal">'language'</span>] == valid_languages[i])
- lang = tinyMCE.settings[<span class="literal">'language'</span>];
- }
-
- <span class="reserved">if</span> (<span class="reserved">this</span>.plugins[name])
- b = <span class="reserved">this</span>.plugins[name].baseURL;
-
- tinyMCE.loadScript(b + <span class="literal">'/langs/'</span> + lang + <span class="literal">'.js'</span>);
- },
-
- <span class="comment">/**
- * Replaces language, args and settings variables in a HTML string.
- *
- * <span class="attrib">@param</span> {string} h HTML string to replace language variables in.
- * <span class="attrib">@param</span> {Array} as Optional arguments array to take variables from.
- * <span class="attrib">@return</span> HTML string with replaced varliables.
- * <span class="attrib">@type</span> string
- */</span>
- applyTemplate : <span class="reserved">function</span>(h, as) {
- var i, s, ar = h.match(new RegExp(<span class="literal">'\\{\\$[a-z0-9_]+\\}'</span>, <span class="literal">'gi'</span>));
-
- <span class="reserved">if</span> (ar && ar.length > 0) {
- <span class="reserved">for</span> (i=ar.length-1; i>=0; i--) {
- s = ar[i].substring(2, ar[i].length-1);
-
- <span class="reserved">if</span> (s.indexOf(<span class="literal">'lang_'</span>) == 0 && tinyMCELang[s])
- h = tinyMCE.replaceVar(h, s, tinyMCELang[s]);
- <span class="reserved">else</span> <span class="reserved">if</span> (as && as[s])
- h = tinyMCE.replaceVar(h, s, as[s]);
- <span class="reserved">else</span> <span class="reserved">if</span> (tinyMCE.settings[s])
- h = tinyMCE.replaceVar(h, s, tinyMCE.settings[s]);
- }
- }
-
- h = tinyMCE.replaceVar(h, <span class="literal">"themeurl"</span>, tinyMCE.themeURL);
-
- <span class="reserved">return</span> h;
- },
-
- <span class="comment">/**
- * Replaces a specific variable in the string with a nother string.
- *
- * <span class="attrib">@param</span> {string} h String to search in for the variable.
- * <span class="attrib">@param</span> {string} r Variable name to search for.
- * <span class="attrib">@param</span> {string} v Value to insert where a variable is found.
- * <span class="attrib">@return</span> String with replaced variable.
- * <span class="attrib">@type</span> string
- */</span>
- replaceVar : <span class="reserved">function</span>(h, r, v) {
- <span class="reserved">return</span> h.replace(new RegExp(<span class="literal">'{\\\$'</span> + r + <span class="literal">'}'</span>, <span class="literal">'g'</span>), v);
- },
-
- <span class="comment">/**
- * Opens a popup window based in the specified input data. This function
- * is used for all popup windows in TinyMCE.
- *
- * These are the current template keys: file, width, height, close_previous.
- *
- * <span class="attrib">@param</span> {Array} template Popup template data such as with, height etc.
- * <span class="attrib">@param</span> {Array} args Popup arguments that is to be passed to the popup such as custom data.
- */</span>
- openWindow : <span class="reserved">function</span>(template, args) {
- var html, width, height, x, y, resizable, scrollbars, url;
-
- args[<span class="literal">'mce_template_file'</span>] = template[<span class="literal">'file'</span>];
- args[<span class="literal">'mce_width'</span>] = template[<span class="literal">'width'</span>];
- args[<span class="literal">'mce_height'</span>] = template[<span class="literal">'height'</span>];
- tinyMCE.windowArgs = args;
-
- html = template[<span class="literal">'html'</span>];
- <span class="reserved">if</span> (!(width = parseInt(template[<span class="literal">'width'</span>])))
- width = 320;
-
- <span class="reserved">if</span> (!(height = parseInt(template[<span class="literal">'height'</span>])))
- height = 200;
-
- <span class="comment">// Add to height in M$ due to SP2 WHY DON'T YOU GUYS IMPLEMENT innerWidth of windows!!</span>
- <span class="reserved">if</span> (tinyMCE.isMSIE)
- height += 40;
- <span class="reserved">else</span>
- height += 20;
-
- x = parseInt(screen.width / 2.0) - (width / 2.0);
- y = parseInt(screen.height / 2.0) - (height / 2.0);
-
- resizable = (args && args[<span class="literal">'resizable'</span>]) ? args[<span class="literal">'resizable'</span>] : <span class="literal">"no"</span>;
- scrollbars = (args && args[<span class="literal">'scrollbars'</span>]) ? args[<span class="literal">'scrollbars'</span>] : <span class="literal">"no"</span>;
-
- <span class="reserved">if</span> (template[<span class="literal">'file'</span>].charAt(0) != <span class="literal">'/'</span> && template[<span class="literal">'file'</span>].indexOf(<span class="literal">'://'</span>) == -1)
- url = tinyMCE.baseURL + <span class="literal">"/themes/"</span> + tinyMCE.getParam(<span class="literal">"theme"</span>) + <span class="literal">"/"</span> + template[<span class="literal">'file'</span>];
- <span class="reserved">else</span>
- url = template[<span class="literal">'file'</span>];
-
- <span class="comment">// Replace all args as variables in URL</span>
- <span class="reserved">for</span> (var name in args) {
- <span class="reserved">if</span> (typeof(args[name]) == <span class="literal">'function'</span>)
- continue;
-
- url = tinyMCE.replaceVar(url, name, escape(args[name]));
- }
-
- <span class="reserved">if</span> (html) {
- html = tinyMCE.replaceVar(html, <span class="literal">"css"</span>, <span class="reserved">this</span>.settings[<span class="literal">'popups_css'</span>]);
- html = tinyMCE.applyTemplate(html, args);
-
- var win = window.open(<span class="literal">""</span>, <span class="literal">"mcePopup"</span> + new Date().getTime(), <span class="literal">"top="</span> + y + <span class="literal">",left="</span> + x + <span class="literal">",scrollbars="</span> + scrollbars + <span class="literal">",dialog=yes,minimizable="</span> + resizable + <span class="literal">",modal=yes,width="</span> + width + <span class="literal">",height="</span> + height + <span class="literal">",resizable="</span> + resizable);
- <span class="reserved">if</span> (win == null) {
- alert(tinyMCELang[<span class="literal">'lang_popup_blocked'</span>]);
- <span class="reserved">return</span>;
- }
-
- win.document.write(html);
- win.document.close();
- win.resizeTo(width, height);
- win.focus();
- } <span class="reserved">else</span> {
- <span class="reserved">if</span> ((tinyMCE.isMSIE && !tinyMCE.isOpera) && resizable != <span class="literal">'yes'</span> && tinyMCE.settings[<span class="literal">"dialog_type"</span>] == <span class="literal">"modal"</span>) {
- height += 10;
-
- var features = <span class="literal">"resizable:"</span> + resizable
- + <span class="literal">";scroll:"</span>
- + scrollbars + <span class="literal">";status:yes;center:yes;help:no;dialogWidth:"</span>
- + width + <span class="literal">"px;dialogHeight:"</span> + height + <span class="literal">"px;"</span>;
-
- window.showModalDialog(url, window, features);
- } <span class="reserved">else</span> {
- var modal = (resizable == <span class="literal">"yes"</span>) ? <span class="literal">"no"</span> : <span class="literal">"yes"</span>;
-
- <span class="reserved">if</span> (tinyMCE.isGecko && tinyMCE.isMac)
- modal = <span class="literal">"no"</span>;
-
- <span class="reserved">if</span> (template[<span class="literal">'close_previous'</span>] != <span class="literal">"no"</span>)
- try {tinyMCE.lastWindow.close();} catch (ex) {}
-
- var win = window.open(url, <span class="literal">"mcePopup"</span> + new Date().getTime(), <span class="literal">"top="</span> + y + <span class="literal">",left="</span> + x + <span class="literal">",scrollbars="</span> + scrollbars + <span class="literal">",dialog="</span> + modal + <span class="literal">",minimizable="</span> + resizable + <span class="literal">",modal="</span> + modal + <span class="literal">",width="</span> + width + <span class="literal">",height="</span> + height + <span class="literal">",resizable="</span> + resizable);
- <span class="reserved">if</span> (win == null) {
- alert(tinyMCELang[<span class="literal">'lang_popup_blocked'</span>]);
- <span class="reserved">return</span>;
- }
-
- <span class="reserved">if</span> (template[<span class="literal">'close_previous'</span>] != <span class="literal">"no"</span>)
- tinyMCE.lastWindow = win;
-
- eval(<span class="literal">'try { win.resizeTo(width, height); } catch(e) { }'</span>);
-
- <span class="comment">// Make it bigger if statusbar is forced</span>
- <span class="reserved">if</span> (tinyMCE.isGecko) {
- <span class="reserved">if</span> (win.document.defaultView.statusbar.visible)
- win.resizeBy(0, tinyMCE.isMac ? 10 : 24);
- }
-
- win.focus();
- }
- }
- },
-
- <span class="comment">/**
- * Closes the specified window. This function is deprecated and should be replaced with
- * tinyMCEPopup.close();.
- *
- * <span class="attrib">@param</span> {DOMWindow} win Window reference to close.
- * <span class="attrib">@deprecated</span>
- */</span>
- closeWindow : <span class="reserved">function</span>(win) {
- win.close();
- },
-
- <span class="comment">/**
- * Returns the visual aid class string, this will add/remove the visual aid class.
- *
- * <span class="attrib">@param</span> {string} class_name Class name value to add/remove visual aid classes from.
- * <span class="attrib">@param</span> {boolean} state true/false if the classes should be added or removed.
- * <span class="attrib">@return</span> New class value containing the visual aid classes or not.
- * <span class="attrib">@type</span> string
- */</span>
- getVisualAidClass : <span class="reserved">function</span>(class_name, state) {
- var aidClass = tinyMCE.settings[<span class="literal">'visual_table_class'</span>];
-
- <span class="reserved">if</span> (typeof(state) == <span class="literal">"undefined"</span>)
- state = tinyMCE.settings[<span class="literal">'visual'</span>];
-
- <span class="comment">// Split</span>
- var classNames = new Array();
- var ar = class_name.split(<span class="literal">' '</span>);
- <span class="reserved">for</span> (var i=0; i<ar.length; i++) {
- <span class="reserved">if</span> (ar[i] == aidClass)
- ar[i] = <span class="literal">""</span>;
-
- <span class="reserved">if</span> (ar[i] != <span class="literal">""</span>)
- classNames[classNames.length] = ar[i];
- }
-
- <span class="reserved">if</span> (state)
- classNames[classNames.length] = aidClass;
-
- <span class="comment">// Glue</span>
- var className = <span class="literal">""</span>;
- <span class="reserved">for</span> (var i=0; i<classNames.length; i++) {
- <span class="reserved">if</span> (i > 0)
- className += <span class="literal">" "</span>;
-
- className += classNames[i];
- }
-
- <span class="reserved">return</span> className;
- },
-
- <span class="comment">/**
- * Adds visual aid classes to all elements that need them recursive in the DOM tree.
- *
- * <span class="attrib">@param</span> {HTMLElement} el HTML element to add visual aid classes to.
- * <span class="attrib">@param</span> {boolean} deep Should they be added to all children aswell.
- * <span class="attrib">@param</span> {boolean} state Should they be added or removed.
- * <span class="attrib">@param</span> {TinyMCE_Control} inst TinyMCE editor control instance to add/remove them to/from.
- */</span>
- handleVisualAid : <span class="reserved">function</span>(el, deep, state, inst, skip_dispatch) {
- <span class="reserved">if</span> (!el)
- <span class="reserved">return</span>;
-
- <span class="reserved">if</span> (!skip_dispatch)
- tinyMCE.dispatchCallback(inst, <span class="literal">'handle_visual_aid_callback'</span>, <span class="literal">'handleVisualAid'</span>, el, deep, state, inst);
-
- var tableElement = null;
-
- switch (el.nodeName) {
- case <span class="literal">"TABLE"</span>:
- var oldW = el.style.width;
- var oldH = el.style.height;
- var bo = tinyMCE.getAttrib(el, <span class="literal">"border"</span>);
-
- bo = bo == <span class="literal">""</span> || bo == <span class="literal">"0"</span> ? true : false;
-
- tinyMCE.setAttrib(el, <span class="literal">"class"</span>, tinyMCE.getVisualAidClass(tinyMCE.getAttrib(el, <span class="literal">"class"</span>), state && bo));
-
- el.style.width = oldW;
- el.style.height = oldH;
-
- <span class="reserved">for</span> (var y=0; y<el.rows.length; y++) {
- <span class="reserved">for</span> (var x=0; x<el.rows[y].cells.length; x++) {
- var cn = tinyMCE.getVisualAidClass(tinyMCE.getAttrib(el.rows[y].cells[x], <span class="literal">"class"</span>), state && bo);
- tinyMCE.setAttrib(el.rows[y].cells[x], <span class="literal">"class"</span>, cn);
- }
- }
-
- break;
-
- case <span class="literal">"A"</span>:
- var anchorName = tinyMCE.getAttrib(el, <span class="literal">"name"</span>);
-
- <span class="reserved">if</span> (anchorName != <span class="literal">''</span> && state) {
- el.title = anchorName;
- el.className = <span class="literal">'mceItemAnchor'</span>;
- } <span class="reserved">else</span> <span class="reserved">if</span> (anchorName != <span class="literal">''</span> && !state)
- el.className = <span class="literal">''</span>;
-
- break;
- }
-
- <span class="reserved">if</span> (deep && el.hasChildNodes()) {
- <span class="reserved">for</span> (var i=0; i<el.childNodes.length; i++)
- tinyMCE.handleVisualAid(el.childNodes[i], deep, state, inst, true);
- }
- },
-
- <span class="comment">/*
- applyClassesToFonts : function(doc, size) {
- var f = doc.getElementsByTagName("font");
- for (var i=0; i<f.length; i++) {
- var s = tinyMCE.getAttrib(f[i], "size");
-
- if (s != "")
- tinyMCE.setAttrib(f[i], 'class', "mceItemFont" + s);
- }
-
- if (typeof(size) != "undefined") {
- var css = "";
-
- for (var x=0; x<doc.styleSheets.length; x++) {
- for (var i=0; i<doc.styleSheets[x].rules.length; i++) {
- if (doc.styleSheets[x].rules[i].selectorText == '#mceSpanFonts .mceItemFont' + size) {
- css = doc.styleSheets[x].rules[i].style.cssText;
- break;
- }
- }
-
- if (css != "")
- break;
- }
-
- if (doc.styleSheets[0].rules[0].selectorText == "FONT")
- doc.styleSheets[0].removeRule(0);
-
- doc.styleSheets[0].addRule("FONT", css, 0);
- }
- },
- */</span>
-
- <span class="comment">/**
- * Fixes a Gecko specific bug where href, src attribute values gets converted incorrectly
- * when inserted into editor. This function will replace all src, href with mce_tsrc and mce_thref
- * to keep the values from chaging when they get inserted.
- *
- * <span class="attrib">@param</span> {boolean} m Mode state, true is to replace the src, href attributes to mce_tsrc and mce_thref.
- * <span class="attrib">@param</span> {HTMLElement} e HTML element to replace them in. (Will be used if m is 0)
- * <span class="attrib">@param</span> {string} h HTML code to replace them in. (Will be used if m is 1)
- * <span class="attrib">@return</span> Converted string or the specified HTML value depending on mode.
- * <span class="attrib">@type</span> string
- */</span>
- fixGeckoBaseHREFBug : <span class="reserved">function</span>(m, e, h) {
- var nl, i, a, n, xsrc, xhref, el;
-
- <span class="reserved">if</span> (tinyMCE.isGecko) {
- <span class="reserved">if</span> (m == 1) {
- h = h.replace(/\ssrc=/gi, <span class="literal">" mce_tsrc="</span>);
- h = h.replace(/\shref=/gi, <span class="literal">" mce_thref="</span>);
-
- <span class="reserved">return</span> h;
- } <span class="reserved">else</span> {
- el = new Array(<span class="literal">'a'</span>,<span class="literal">'img'</span>,<span class="literal">'select'</span>,<span class="literal">'area'</span>,<span class="literal">'iframe'</span>,<span class="literal">'base'</span>,<span class="literal">'input'</span>,<span class="literal">'script'</span>,<span class="literal">'embed'</span>,<span class="literal">'object'</span>,<span class="literal">'link'</span>);
-
- <span class="reserved">for</span> (a=0; a<el.length; a++) {
- n = e.getElementsByTagName(el[a]);
-
- <span class="reserved">for</span> (i=0; i<n.length; i++) {
- xsrc = tinyMCE.getAttrib(n[i], <span class="literal">"mce_tsrc"</span>);
- xhref = tinyMCE.getAttrib(n[i], <span class="literal">"mce_thref"</span>);
-
- <span class="reserved">if</span> (xsrc != <span class="literal">""</span>) {
- try {
- n[i].src = tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings[<span class="literal">'base_href'</span>], xsrc);
- } catch (e) {
- <span class="comment">// Ignore, Firefox cast exception if local file wasn't found</span>
- }
-
- n[i].removeAttribute(<span class="literal">"mce_tsrc"</span>);
- }
-
- <span class="reserved">if</span> (xhref != <span class="literal">""</span>) {
- try {
- n[i].href = tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings[<span class="literal">'base_href'</span>], xhref);
- } catch (e) {
- <span class="comment">// Ignore, Firefox cast exception if local file wasn't found</span>
- }
-
- n[i].removeAttribute(<span class="literal">"mce_thref"</span>);
- }
- }
- }
-
- el = tinyMCE.selectNodes(e, <span class="reserved">function</span>(n) {
- <span class="reserved">if</span> (n.nodeType == 3 || n.nodeType == 8) {
- n.nodeValue = n.nodeValue.replace(/\smce_tsrc=/gi, <span class="literal">" src="</span>);
- n.nodeValue = n.nodeValue.replace(/\smce_thref=/gi, <span class="literal">" href="</span>);
- }
-
- <span class="reserved">return</span> false;
- });
- }
- }
-
- <span class="reserved">return</span> h;
- },
-
- <span class="comment">/**
- * Sets the HTML code of a specific document.
- * Todo: Try to merge/remove this one.
- *
- * <span class="attrib">@param</span> {DOMDocument} doc DOM document to set the HTML code in.
- * <span class="attrib">@param</span> {string} html_content HTML contents to set in DOM document.
- * <span class="attrib">@private</span>
- */</span>
- _setHTML : <span class="reserved">function</span>(doc, html_content) {
- <span class="comment">// Force closed anchors open</span>
- <span class="comment">//html_content = html_content.replace(new RegExp('<a(.*?)/>', 'gi'), '<a$1></a>');</span>
-
- html_content = tinyMCE.cleanupHTMLCode(html_content);
-
- <span class="comment">// Try innerHTML if it fails use pasteHTML in MSIE</span>
- try {
- tinyMCE.setInnerHTML(doc.body, html_content);
- } catch (e) {
- <span class="reserved">if</span> (<span class="reserved">this</span>.isMSIE)
- doc.body.createTextRange().pasteHTML(html_content);
- }
-
- <span class="comment">// Content duplication bug fix</span>
- <span class="reserved">if</span> (tinyMCE.isMSIE && tinyMCE.settings[<span class="literal">'fix_content_duplication'</span>]) {
- <span class="comment">// Remove P elements in P elements</span>
- var paras = doc.getElementsByTagName(<span class="literal">"P"</span>);
- <span class="reserved">for</span> (var i=0; i<paras.length; i++) {
- var node = paras[i];
- <span class="reserved">while</span> ((node = node.parentNode) != null) {
- <span class="reserved">if</span> (node.nodeName == <span class="literal">"P"</span>)
- node.outerHTML = node.innerHTML;
- }
- }
-
- <span class="comment">// Content duplication bug fix (Seems to be word crap)</span>
- var html = doc.body.innerHTML;
-<span class="comment">/*
- if (html.indexOf('="mso') != -1) {
- for (var i=0; i<doc.body.all.length; i++) {
- var el = doc.body.all[i];
- el.removeAttribute("className","",0);
- el.removeAttribute("style","",0);
- }
-
- html = doc.body.innerHTML;
- html = tinyMCE.regexpReplace(html, "<o:p><\/o:p>", "<br />");
- html = tinyMCE.regexpReplace(html, "<o:p> <\/o:p>", "");
- html = tinyMCE.regexpReplace(html, "<st1:.*?>", "");
- html = tinyMCE.regexpReplace(html, "<p><\/p>", "");
- html = tinyMCE.regexpReplace(html, "<p><\/p>\r\n<p><\/p>", "");
- html = tinyMCE.regexpReplace(html, "<p> <\/p>", "<br />");
- html = tinyMCE.regexpReplace(html, "<p>\s*(<p>\s*)?", "<p>");
- html = tinyMCE.regexpReplace(html, "<\/p>\s*(<\/p>\s*)?", "</p>");
- }*/</span>
-
- <span class="comment">// Always set the htmlText output</span>
- tinyMCE.setInnerHTML(doc.body, html);
- }
-
- tinyMCE.cleanupAnchors(doc);
-
- <span class="reserved">if</span> (tinyMCE.getParam(<span class="literal">"convert_fonts_to_spans"</span>))
- tinyMCE.convertSpansToFonts(doc);
- },
-
- <span class="comment">/**
- * Returns the editor instance id of a specific form element.
- *
- * <span class="attrib">@param</span> {string} form_element Form element name to get instance id for.
- * <span class="attrib">@return</span> TinyMCE editor instance id or null if it wasn't found.
- * <span class="attrib">@type</span> string
- */</span>
- getEditorId : <span class="reserved">function</span>(form_element) {
- var inst = <span class="reserved">this</span>.getInstanceById(form_element);
- <span class="reserved">if</span> (!inst)
- <span class="reserved">return</span> null;
-
- <span class="reserved">return</span> inst.editorId;
- },
-
- <span class="comment">/**
- * Returns a TinyMCE editor instance by the specified editor id or null if it wasn't found.
- *
- * <span class="attrib">@param</span> {string} editor_id Editor id to get instance for.
- * <span class="attrib">@return</span> TinyMCE editor control instance or null if it wasn't found.
- * <span class="attrib">@type</span> TinyMCE_Control
- */</span>
- getInstanceById : <span class="reserved">function</span>(editor_id) {
- var inst = <span class="reserved">this</span>.instances[editor_id];
- <span class="reserved">if</span> (!inst) {
- <span class="reserved">for</span> (var n in tinyMCE.instances) {
- var instance = tinyMCE.instances[n];
- <span class="reserved">if</span> (!tinyMCE.isInstance(instance))
- continue;
-
- <span class="reserved">if</span> (instance.formTargetElementId == editor_id) {
- inst = instance;
- break;
- }
- }
- }
-
- <span class="reserved">return</span> inst;
- },
-
- <span class="comment">/**
- * Queries a command value for a specific command on a specific editor instance.
- *
- * <span class="attrib">@param</span> {string} editor_id Editor id to query command value on.
- * <span class="attrib">@param</span> {string} command Command to query for.
- * <span class="attrib">@return</span> Command value passed from browser.
- * <span class="attrib">@type</span> object
- */</span>
- queryInstanceCommandValue : <span class="reserved">function</span>(editor_id, command) {
- var inst = tinyMCE.getInstanceById(editor_id);
- <span class="reserved">if</span> (inst)
- <span class="reserved">return</span> inst.queryCommandValue(command);
-
- <span class="reserved">return</span> false;
- },
-
- <span class="comment">/**
- * Queries a command state for a specific command on a specific editor instance.
- *
- * <span class="attrib">@param</span> {string} editor_id Editor id to query command state on.
- * <span class="attrib">@param</span> {string} command Command to query for.
- * <span class="attrib">@return</span> Command state passed from browser.
- * <span class="attrib">@type</span> boolean
- */</span>
- queryInstanceCommandState : <span class="reserved">function</span>(editor_id, command) {
- var inst = tinyMCE.getInstanceById(editor_id);
- <span class="reserved">if</span> (inst)
- <span class="reserved">return</span> inst.queryCommandState(command);
-
- <span class="reserved">return</span> null;
- },
-
- <span class="comment">/**
- * Sets the window argument to be passed to TinyMCE popup.
- *
- * <span class="attrib">@param</span> {string} n Window argument name.
- * <span class="attrib">@param</span> {string} v Window argument value.
- */</span>
- setWindowArg : <span class="reserved">function</span>(n, v) {
- <span class="reserved">this</span>.windowArgs[n] = v;
- },
-
- <span class="comment">/**
- * Returns the window argument to be passed to TinyMCE popup.
- * Use: tinyMCEPopup.getWindowArg instead.
- *
- * <span class="attrib">@param</span> {string} n Window argument name.
- * <span class="attrib">@return</span> Argument value or default value if it wasn't found.
- * <span class="attrib">@deprecated</span>
- */</span>
- getWindowArg : <span class="reserved">function</span>(n, d) {
- <span class="reserved">return</span> (typeof(<span class="reserved">this</span>.windowArgs[n]) == <span class="literal">"undefined"</span>) ? d : <span class="reserved">this</span>.windowArgs[n];
- },
-
- <span class="comment">/**
- * Returns a array of CSS classes that is available in a document.
- * Todo: Fix this one, it's so ugly. :)
- *
- * <span class="attrib">@param</span> {string} editor_id Editor id to get CSS classes from.
- * <span class="attrib">@param</span> {DOMDocument} doc DOM document to get the CSS classes from.
- * <span class="attrib">@return</span> Array of CSS classes that is available in a document.
- * <span class="attrib">@type</span> Array
- */</span>
- getCSSClasses : <span class="reserved">function</span>(editor_id, doc) {
- var output = new Array();
-
- <span class="comment">// Is cached, use that</span>
- <span class="reserved">if</span> (typeof(tinyMCE.cssClasses) != <span class="literal">"undefined"</span>)
- <span class="reserved">return</span> tinyMCE.cssClasses;
-
- <span class="reserved">if</span> (typeof(editor_id) == <span class="literal">"undefined"</span> && typeof(doc) == <span class="literal">"undefined"</span>) {
- var instance;
-
- <span class="reserved">for</span> (var instanceName in tinyMCE.instances) {
- instance = tinyMCE.instances[instanceName];
- <span class="reserved">if</span> (!tinyMCE.isInstance(instance))
- continue;
-
- break;
- }
-
- doc = instance.getDoc();
- }
-
- <span class="reserved">if</span> (typeof(doc) == <span class="literal">"undefined"</span>) {
- var instance = tinyMCE.getInstanceById(editor_id);
- doc = instance.getDoc();
- }
-
- <span class="reserved">if</span> (doc) {
- var styles = doc.styleSheets;
-
- <span class="reserved">if</span> (styles && styles.length > 0) {
- <span class="reserved">for</span> (var x=0; x<styles.length; x++) {
- var csses = null;
-
- <span class="comment">// Just ignore any errors</span>
- eval(<span class="literal">"try {var csses = tinyMCE.isMSIE ? doc.styleSheets("</span> + x + <span class="literal">").rules : styles["</span> + x + <span class="literal">"].cssRules;} catch(e) {}"</span>);
- <span class="reserved">if</span> (!csses)
- <span class="reserved">return</span> new Array();
-
- <span class="reserved">for</span> (var i=0; i<csses.length; i++) {
- var selectorText = csses[i].selectorText;
-
- <span class="comment">// Can be multiple rules per selector</span>
- <span class="reserved">if</span> (selectorText) {
- var rules = selectorText.split(<span class="literal">','</span>);
- <span class="reserved">for</span> (var c=0; c<rules.length; c++) {
- var rule = rules[c];
-
- <span class="comment">// Strip spaces between selectors</span>
- <span class="reserved">while</span> (rule.indexOf(<span class="literal">' '</span>) == 0)
- rule = rule.substring(1);
-
- <span class="comment">// Invalid rule</span>
- <span class="reserved">if</span> (rule.indexOf(<span class="literal">' '</span>) != -1 || rule.indexOf(<span class="literal">':'</span>) != -1 || rule.indexOf(<span class="literal">'mceItem'</span>) != -1)
- continue;
-
- <span class="reserved">if</span> (rule.indexOf(tinyMCE.settings[<span class="literal">'visual_table_class'</span>]) != -1 || rule.indexOf(<span class="literal">'mceEditable'</span>) != -1 || rule.indexOf(<span class="literal">'mceNonEditable'</span>) != -1)
- continue;
-
- <span class="comment">// Is class rule</span>
- <span class="reserved">if</span> (rule.indexOf(<span class="literal">'.'</span>) != -1) {
- var cssClass = rule.substring(rule.indexOf(<span class="literal">'.'</span>) + 1);
- var addClass = true;
-
- <span class="reserved">for</span> (var p=0; p<output.length && addClass; p++) {
- <span class="reserved">if</span> (output[p] == cssClass)
- addClass = false;
- }
-
- <span class="reserved">if</span> (addClass)
- output[output.length] = cssClass;
- }
- }
- }
- }
- }
- }
- }
-
- <span class="comment">// Cache em</span>
- <span class="reserved">if</span> (output.length > 0)
- tinyMCE.cssClasses = output;
-
- <span class="reserved">return</span> output;
- },
-
- <span class="comment">/**
- * Regexp replaces the contents of a string. Use normal replace instead.
- *
- * <span class="attrib">@param</span> {string} in_str String to replace in.
- * <span class="attrib">@param</span> {string} reg_exp Regexp to replace.
- * <span class="attrib">@param</span> {string} replace_str String to replace with.
- * <span class="attrib">@param</span> {string} in_str Optional regexp options like "gi".
- * <span class="attrib">@return</span> Replaced string value.
- * <span class="attrib">@type</span> string
- * <span class="attrib">@deprecated</span>
- */</span>
- regexpReplace : <span class="reserved">function</span>(in_str, reg_exp, replace_str, opts) {
- <span class="reserved">if</span> (in_str == null)
- <span class="reserved">return</span> in_str;
-
- <span class="reserved">if</span> (typeof(opts) == <span class="literal">"undefined"</span>)
- opts = <span class="literal">'g'</span>;
-
- var re = new RegExp(reg_exp, opts);
- <span class="reserved">return</span> in_str.replace(re, replace_str);
- },
-
- <span class="comment">/**
- * Removes all prefix, suffix whitespace of a string.
- *
- * <span class="attrib">@param</span> {string} s String to replace whitespace in.
- * <span class="attrib">@return</span> Replaced string value.
- * <span class="attrib">@type</span> string
- */</span>
- trim : <span class="reserved">function</span>(s) {
- <span class="reserved">return</span> s.replace(/^\s*|\s*$/g, <span class="literal">""</span>);
- },
-
- <span class="comment">/**
- * Removes MSIE 5.5 specific event wrapper function form a event string.
- * This will also remove the event blocker if it's added in front of the event.
- *
- * <span class="attrib">@param</span> {string} s String to replace event data in.
- * <span class="attrib">@return</span> Replaced string value.
- * <span class="attrib">@type</span> string
- */</span>
- cleanupEventStr : <span class="reserved">function</span>(s) {
- s = <span class="literal">""</span> + s;
- s = s.replace(<span class="literal">'function anonymous()\n{\n'</span>, <span class="literal">''</span>);
- s = s.replace(<span class="literal">'\n}'</span>, <span class="literal">''</span>);
- s = s.replace(/^<span class="reserved">return</span> true;/gi, <span class="literal">''</span>); <span class="comment">// Remove event blocker</span>
-
- <span class="reserved">return</span> s;
- },
-
- <span class="comment">/**
- * Returns the HTML for the specified control this will loop through
- * the theme and all plugins inorder to find the control. The callback for each
- * theme and plugin is called getControlHTML.
- *
- * <span class="attrib">@param</span> {string} c Control name/id to get HTML code for.
- * <span class="attrib">@return</span> HTML code for the specified control or empty string if it wasn't found.
- * <span class="attrib">@type</span> string
- */</span>
- getControlHTML : <span class="reserved">function</span>(c) {
- var i, l, n, o, v;
-
- l = tinyMCE.plugins;
- <span class="reserved">for</span> (n in l) {
- o = l[n];
-
- <span class="reserved">if</span> (o.getControlHTML && (v = o.getControlHTML(c)) != <span class="literal">''</span>)
- <span class="reserved">return</span> tinyMCE.replaceVar(v, <span class="literal">"pluginurl"</span>, o.baseURL);
- }
-
- o = tinyMCE.themes[tinyMCE.settings[<span class="literal">'theme'</span>]];
- <span class="reserved">if</span> (o.getControlHTML && (v = o.getControlHTML(c)) != <span class="literal">''</span>)
- <span class="reserved">return</span> v;
-
- <span class="reserved">return</span> <span class="literal">''</span>;
- },
-
- <span class="comment">/**
- * Evaluates the specified function and uses the array of arguments.
- *
- * <span class="attrib">@param</span> {string} f Function reference to execute.
- * <span class="attrib">@param</span> {int} idx Index in array to start grabbing arguments from.
- * <span class="attrib">@param</span> {Array} a Array of function arguments.
- * <span class="attrib">@return</span> Value returned from the evaluated function.
- * <span class="attrib">@type</span> object
- */</span>
- evalFunc : <span class="reserved">function</span>(f, idx, a) {
- var s = <span class="literal">'('</span>, i;
-
- <span class="reserved">for</span> (i=idx; i<a.length; i++) {
- s += <span class="literal">'a['</span> + i + <span class="literal">']'</span>;
-
- <span class="reserved">if</span> (i < a.length-1)
- s += <span class="literal">','</span>;
- }
-
- s += <span class="literal">');'</span>;
-
- <span class="reserved">return</span> eval(<span class="literal">"f"</span> + s);
- },
-
- <span class="comment">/**
- * Dispatches the specified callback on all options, plugins and themes. This will not
- * chain them, so all functions callbacks will be executed regardless if the return true/false.
- *
- * <span class="attrib">@param</span> {TinyMCE_Control} i TinyMCE editor control instance to execute callback on.
- * <span class="attrib">@param</span> {string} p TinyMCE callback parameter to execute.
- * <span class="attrib">@param</span> {string} n Function name to execute.
- * <span class="attrib">@return</span> true/false if they where dispatched.
- */</span>
- dispatchCallback : <span class="reserved">function</span>(i, p, n) {
- <span class="reserved">return</span> <span class="reserved">this</span>.callFunc(i, p, n, 0, <span class="reserved">this</span>.dispatchCallback.arguments);
- },
-
- <span class="comment">/**
- * Executes the specified callback on all options, plugins and themes. This will
- * chain them, so callback chain will be broken if one function returns false.
- *
- * <span class="attrib">@param</span> {TinyMCE_Control} i TinyMCE editor control instance to execute callback on.
- * <span class="attrib">@param</span> {string} p TinyMCE callback parameter to execute.
- * <span class="attrib">@param</span> {string} n Function name to execute.
- * <span class="attrib">@return</span> true/false if a callback was executed.
- */</span>
- executeCallback : <span class="reserved">function</span>(i, p, n) {
- <span class="reserved">return</span> <span class="reserved">this</span>.callFunc(i, p, n, 1, <span class="reserved">this</span>.executeCallback.arguments);
- },
-
- <span class="comment">/**
- * Executes the specified execcommand callback on all options, plugins and themes. This will
- * chain them, so callback chain will be broken if one function returns true.
- *
- * <span class="attrib">@param</span> {TinyMCE_Control} i TinyMCE editor control instance to execute callback on.
- * <span class="attrib">@param</span> {string} p TinyMCE callback parameter to execute.
- * <span class="attrib">@param</span> {string} n Function name to execute.
- * <span class="attrib">@return</span> true/false if a callback was executed.
- */</span>
- execCommandCallback : <span class="reserved">function</span>(i, p, n) {
- <span class="reserved">return</span> <span class="reserved">this</span>.callFunc(i, p, n, 2, <span class="reserved">this</span>.execCommandCallback.arguments);
- },
-
- <span class="comment">/**
- * Executes callback chain. Callback order: Option, Plugins, Themes.
- *
- * <span class="attrib">@param</span> {TinyMCE_Control} ins TinyMCE editor control instance to execute callback on.
- * <span class="attrib">@param</span> {string} p TinyMCE callback parameter name.
- * <span class="attrib">@param</span> {string} n Function name to execute.
- * <span class="attrib">@param</span> {int} m Execution mode value, 0 = no chain, 1 = event chain, 2 = execcommand chain.
- * <span class="attrib">@param</span> {Array} a Array with function arguments.
- * <span class="attrib">@return</span> true - if the callback was executed, false if it wasn't.
- * <span class="attrib">@type</span> boolean
- */</span>
- callFunc : <span class="reserved">function</span>(ins, p, n, m, a) {
- var l, i, on, o, s, v;
-
- s = m == 2;
-
- l = tinyMCE.getParam(p, <span class="literal">''</span>);
-
- <span class="reserved">if</span> (l != <span class="literal">''</span> && (v = tinyMCE.evalFunc(typeof(l) == <span class="literal">"function"</span> ? l : eval(l), 3, a)) == s && m > 0)
- <span class="reserved">return</span> true;
-
- <span class="reserved">if</span> (ins != null) {
- <span class="reserved">for</span> (i=0, l = ins.plugins; i<l.length; i++) {
- o = tinyMCE.plugins[l[i]];
-
- <span class="reserved">if</span> (o[n] && (v = tinyMCE.evalFunc(o[n], 3, a)) == s && m > 0)
- <span class="reserved">return</span> true;
- }
- }
-
- l = tinyMCE.themes;
- <span class="reserved">for</span> (on in l) {
- o = l[on];
-
- <span class="reserved">if</span> (o[n] && (v = tinyMCE.evalFunc(o[n], 3, a)) == s && m > 0)
- <span class="reserved">return</span> true;
- }
-
- <span class="reserved">return</span> false;
- },
-
- <span class="comment">/**
- * Encodes the string to raw XML entities. This will only convert the most common ones.
- * For real entity encoding use the xmlEncode method of the Cleanup class.
- *
- * <span class="attrib">@param</span> {string} s String to encode.
- * <span class="attrib">@return</span> XML Encoded string.
- * <span class="attrib">@type</span> string
- */</span>
- xmlEncode : <span class="reserved">function</span>(s) {
- s = <span class="literal">""</span> + s;
- s = s.replace(/&/g, <span class="literal">'&'</span>);
- s = s.replace(new RegExp(<span class="literal">'"'</span>, <span class="literal">'g'</span>), <span class="literal">'"'</span>);
- s = s.replace(/\<span class="literal">'/g, '</span>'<span class="literal">'); // ' is not working in MSIE
- s = s.replace(/</g, '</span><<span class="literal">');
- s = s.replace(/>/g, '</span>>');
-
- <span class="reserved">return</span> s;
- },
-
- <span class="comment">/**
- * Extends the specified prototype with new methods.
- *
- * <span class="attrib">@param</span> {Object} p Prototype to extend with new methods.
- * <span class="attrib">@param</span> {Object} np New prototype to extend the other one with.
- * <span class="attrib">@return</span> Extended prototype array.
- * <span class="attrib">@type</span> Object
- */</span>
- extend : <span class="reserved">function</span>(p, np) {
- var o = {};
-
- o.parent = p;
-
- <span class="reserved">for</span> (n in p)
- o[n] = p[n];
-
- <span class="reserved">for</span> (n in np)
- o[n] = np[n];
-
- <span class="reserved">return</span> o;
- },
-
- <span class="comment">/**
- * Hides any visible menu layers.
- *
- * <span class="attrib">@private</span>
- */</span>
- hideMenus : <span class="reserved">function</span>() {
- var e = tinyMCE.lastSelectedMenuBtn;
-
- <span class="reserved">if</span> (tinyMCE.lastMenu) {
- tinyMCE.lastMenu.hide();
- tinyMCE.lastMenu = null;
- }
-
- <span class="reserved">if</span> (e) {
- tinyMCE.switchClass(e, tinyMCE.lastMenuBtnClass);
- tinyMCE.lastSelectedMenuBtn = null;
- }
- },
-
- <span class="comment">/**
- * Splits a string by the specified delimiter and skips any empty items.
- *
- * <span class="attrib">@param</span> {string} d Delimiter to split by.
- * <span class="attrib">@param</span> {string} s String to split.
- * <span class="attrib">@return</span> Array with chunks from string.
- * <span class="attrib">@type</span> Array
- */</span>
- explode : <span class="reserved">function</span>(d, s) {
- var ar = s.split(d), oar = new Array(), i;
-
- <span class="reserved">for</span> (i = 0; i<ar.length; i++) {
- <span class="reserved">if</span> (ar[i] != <span class="literal">""</span>)
- oar[oar.length] = ar[i];
- }
-
- <span class="reserved">return</span> oar;
- }
-};
-
-<span class="comment">// Global instances</span>
-var TinyMCE = TinyMCE_Engine; <span class="comment">// Compatiblity with gzip compressors</span>
-var tinyMCE = new TinyMCE_Engine();
-var tinyMCELang = {};
-</pre>
- <hr>
-
-
-
-<!-- ========== START OF NAVBAR ========== -->
-<a name="navbar_top"><!-- --></a>
-<table border="0" width="100%" cellpadding="1" cellspacing="0">
-<tr>
-<td colspan=2 bgcolor="#EEEEFF" class="NavBarCell1">
-<a name="navbar_top_firstrow"><!-- --></a>
-<table border="0" cellpadding="0" cellspacing="3">
- <tr align="center" valign="top">
-
-
- <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="overview-summary.html"><font class="NavBarFont1"><b>Overview</b></font></a> </td>
- <td bgcolor="#FFFFFF" class="NavBarCell1Rev"> <font class="NavBarFont1Rev"><b>File</b></font> </td>
-
-
- <td bgcolor="#FFFFFF" class="NavBarCell1"> <font class="NavBarFont1">Class</font> </td>
- <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="overview-tree.html"><font class="NavBarFont1"><b>Tree</b></font></a> </td>
- <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="index-all.html"--><font class="NavBarFont1"><b>Index</b></font></a> </td>
- <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="help-doc.html"><font class="NavBarFont1"><b>Help</b></font></a> </td>
- </tr>
-</table>
-</td>
-<td bgcolor="#EEEEFF" align="right" valign="top"><em>
-<b></b></em>
-</td>
-</tr>
-
-<tr>
-<td bgcolor="white" class="NavBarCell2"><font size="-2">
- PREV
- NEXT</font></td>
-<td bgcolor="white" class="NavBarCell2"><font size="-2">
- <a href="index.html" target="_top"><b>FRAMES</b></a>
- <a href="overview-summary.html" target="_top"><b>NO FRAMES</b></a>
-
-<script>
- <!--
- if(window==top) {
- document.writeln('<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>');
- }
- //-->
-</script>
-<noscript>
-<a href="allclasses-noframe.html" target=""><b>All Classes</b></a>
-</noscript>
-</font></td>
-</tr>
-</table>
-<!-- =========== END OF NAVBAR =========== -->
-
-<hr>
-<font size="-1">
-
-</font>
-<div class="jsdoc_ctime">Documentation generated by <a href="http://jsdoc.sourceforge.net/" target="_parent">JSDoc</a> on Fri Apr 14 21:59:23 2006</div>
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/tinymce_api/overview-summary-TinyMCE_Engine.class.js.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/tinymce_api/overview-summary-TinyMCE_Engine.class.js.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/tinymce_api/overview-summary-TinyMCE_Engine.class.js.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/tinymce_api/overview-summary-TinyMCE_Engine.class.js.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,2890 @@
+<!doctype html public "-//W3C//DTD HTML 4.0 Frameset//EN""http://www.w3.org/TR/REC-html40/frameset.dtd">
+<html>
+<head>
+<title>
+ Overview
+</title>
+<link rel ="stylesheet" type="text/css" href="stylesheet.css" title="Style">
+<script>
+function asd() {
+
+ parent.document.title="TinyMCE_Engine.class.js Overview";
+
+}
+</script>
+</head>
+<body bgcolor="white" onload="asd();">
+
+<!-- ========== START OF NAVBAR ========== -->
+<a name="navbar_top"><!-- --></a>
+<table border="0" width="100%" cellpadding="1" cellspacing="0">
+<tr>
+<td colspan=2 bgcolor="#EEEEFF" class="NavBarCell1">
+<a name="navbar_top_firstrow"><!-- --></a>
+<table border="0" cellpadding="0" cellspacing="3">
+ <tr align="center" valign="top">
+
+
+ <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="overview-summary.html"><font class="NavBarFont1"><b>Overview</b></font></a> </td>
+ <td bgcolor="#FFFFFF" class="NavBarCell1Rev"> <font class="NavBarFont1Rev"><b>File</b></font> </td>
+
+
+ <td bgcolor="#FFFFFF" class="NavBarCell1"> <font class="NavBarFont1">Class</font> </td>
+ <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="overview-tree.html"><font class="NavBarFont1"><b>Tree</b></font></a> </td>
+ <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="index-all.html"--><font class="NavBarFont1"><b>Index</b></font></a> </td>
+ <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="help-doc.html"><font class="NavBarFont1"><b>Help</b></font></a> </td>
+ </tr>
+</table>
+</td>
+<td bgcolor="#EEEEFF" align="right" valign="top">
+<em>
+<b></b></em>
+</td>
+</tr>
+
+<tr>
+<td bgcolor="white" class="NavBarCell2"><font size="-2">
+ PREV
+ NEXT</font></td>
+<td bgcolor="white" class="NavBarCell2"><font size="-2">
+ <a href="index.html" target="_top"><b>FRAMES</b></a>
+ <a href="overview-summary.html" target="_top"><b>NO FRAMES</b></a>
+
+<script>
+ <!--
+ if(window==top) {
+ document.writeln('<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>');
+ }
+ //-->
+</script>
+<noscript>
+<a href="allclasses-noframe.html" target=""><b>All Classes</b></a>
+</noscript>
+</font></td>
+</tr>
+</table>
+<!-- =========== END OF NAVBAR =========== -->
+
+<hr>
+<center>
+
+ <h2>TinyMCE_Engine.class.js</h2>
+
+</center>
+
+
+
+
+<h4>Summary</h4>
+<p>
+
+ No overview generated for 'TinyMCE_Engine.class.js'<BR/><BR/>
+
+</p>
+
+<hr>
+
+
+ <table border="1" cellpadding="3" cellspacing="0" width="100%">
+ <tr bgcolor="#CCCCFF" class="TableHeadingColor">
+ <td colspan=2><font size="+2">
+
+ <b>Class Summary</b>
+
+ </font></td>
+ </tr>
+
+ <tr bgcolor="white" class="TableRowColor">
+ <td width="15%"><b><a href="TinyMCE_Engine.html">TinyMCE_Engine</a></b></td>
+ <td> </td>
+ </tr>
+
+ </table>
+ <hr/>
+
+
+<!-- ========== METHOD SUMMARY =========== -->
+
+<!-- ========== END METHOD SUMMARY =========== -->
+
+
+ <pre class="sourceview"><span class="comment">/**
+ * $RCSfile: overview-summary-TinyMCE_Engine.class.js.html,v $
+ * $Revision: 1.42 $
+ * $Date: 2006/04/14 20:00:29 $
+ *
+ * <span class="attrib">@author</span> Moxiecode
+ * <span class="attrib">@copyright</span> Copyright © 2004-2006, Moxiecode Systems AB, All rights reserved.
+ */</span>
+
+<span class="comment">/**
+ * Core engine class for TinyMCE, a instance of this class is available as a global called tinyMCE.
+ *
+ * <span class="attrib">@constructor</span>
+ */</span>
+<span class="reserved">function</span> TinyMCE_Engine() {
+ <span class="reserved">this</span>.majorVersion = <span class="literal">"2"</span>;
+ <span class="reserved">this</span>.minorVersion = <span class="literal">"0.6"</span>;
+ <span class="reserved">this</span>.releaseDate = <span class="literal">"2006-xx-xx"</span>;
+
+ <span class="reserved">this</span>.instances = new Array();
+ <span class="reserved">this</span>.switchClassCache = new Array();
+ <span class="reserved">this</span>.windowArgs = new Array();
+ <span class="reserved">this</span>.loadedFiles = new Array();
+ <span class="reserved">this</span>.configs = new Array();
+ <span class="reserved">this</span>.currentConfig = 0;
+ <span class="reserved">this</span>.eventHandlers = new Array();
+
+ <span class="comment">// Browser check</span>
+ var ua = navigator.userAgent;
+ <span class="reserved">this</span>.isMSIE = (navigator.appName == <span class="literal">"Microsoft Internet Explorer"</span>);
+ <span class="reserved">this</span>.isMSIE5 = <span class="reserved">this</span>.isMSIE && (ua.indexOf(<span class="literal">'MSIE 5'</span>) != -1);
+ <span class="reserved">this</span>.isMSIE5_0 = <span class="reserved">this</span>.isMSIE && (ua.indexOf(<span class="literal">'MSIE 5.0'</span>) != -1);
+ <span class="reserved">this</span>.isGecko = ua.indexOf(<span class="literal">'Gecko'</span>) != -1;
+ <span class="reserved">this</span>.isSafari = ua.indexOf(<span class="literal">'Safari'</span>) != -1;
+ <span class="reserved">this</span>.isOpera = ua.indexOf(<span class="literal">'Opera'</span>) != -1;
+ <span class="reserved">this</span>.isMac = ua.indexOf(<span class="literal">'Mac'</span>) != -1;
+ <span class="reserved">this</span>.isNS7 = ua.indexOf(<span class="literal">'Netscape/7'</span>) != -1;
+ <span class="reserved">this</span>.isNS71 = ua.indexOf(<span class="literal">'Netscape/7.1'</span>) != -1;
+ <span class="reserved">this</span>.dialogCounter = 0;
+ <span class="reserved">this</span>.plugins = new Array();
+ <span class="reserved">this</span>.themes = new Array();
+ <span class="reserved">this</span>.menus = new Array();
+ <span class="reserved">this</span>.loadedPlugins = new Array();
+ <span class="reserved">this</span>.buttonMap = new Array();
+ <span class="reserved">this</span>.isLoaded = false;
+
+ <span class="comment">// Fake MSIE on Opera and if Opera fakes IE, Gecko or Safari cancel those</span>
+ <span class="reserved">if</span> (<span class="reserved">this</span>.isOpera) {
+ <span class="reserved">this</span>.isMSIE = true;
+ <span class="reserved">this</span>.isGecko = false;
+ <span class="reserved">this</span>.isSafari = false;
+ }
+
+ <span class="comment">// TinyMCE editor id instance counter</span>
+ <span class="reserved">this</span>.idCounter = 0;
+};
+
+TinyMCE_Engine.<span class="reserved">prototype</span> = {
+ <span class="comment">/**
+ * Initializes TinyMCE with the specific configuration settings. This method
+ * may be called multiple times when multiple instances with diffrent settings is to be created.
+ *
+ * <span class="attrib">@param</span> {Array} Name/Value array of initialization settings.
+ */</span>
+ init : <span class="reserved">function</span>(settings) {
+ var theme;
+
+ <span class="reserved">this</span>.settings = settings;
+
+ <span class="comment">// Check if valid browser has execcommand support</span>
+ <span class="reserved">if</span> (typeof(document.execCommand) == <span class="literal">'undefined'</span>)
+ <span class="reserved">return</span>;
+
+ <span class="comment">// Get script base path</span>
+ <span class="reserved">if</span> (!tinyMCE.baseURL) {
+ var elements = document.getElementsByTagName(<span class="literal">'script'</span>);
+
+ <span class="reserved">for</span> (var i=0; i<elements.length; i++) {
+ <span class="reserved">if</span> (elements[i].src && (elements[i].src.indexOf(<span class="literal">"tiny_mce.js"</span>) != -1 || elements[i].src.indexOf(<span class="literal">"tiny_mce_dev.js"</span>) != -1 || elements[i].src.indexOf(<span class="literal">"tiny_mce_src.js"</span>) != -1 || elements[i].src.indexOf(<span class="literal">"tiny_mce_gzip"</span>) != -1)) {
+ var src = elements[i].src;
+
+ tinyMCE.srcMode = (src.indexOf(<span class="literal">'_src'</span>) != -1 || src.indexOf(<span class="literal">'_dev'</span>) != -1) ? <span class="literal">'_src'</span> : <span class="literal">''</span>;
+ tinyMCE.gzipMode = src.indexOf(<span class="literal">'_gzip'</span>) != -1;
+ src = src.substring(0, src.lastIndexOf(<span class="literal">'/'</span>));
+
+ <span class="reserved">if</span> (settings.exec_mode == <span class="literal">"src"</span> || settings.exec_mode == <span class="literal">"normal"</span>)
+ tinyMCE.srcMode = settings.exec_mode == <span class="literal">"src"</span> ? <span class="literal">'_src'</span> : <span class="literal">''</span>;
+
+ tinyMCE.baseURL = src;
+ break;
+ }
+ }
+ }
+
+ <span class="comment">// Get document base path</span>
+ <span class="reserved">this</span>.documentBasePath = document.location.href;
+ <span class="reserved">if</span> (<span class="reserved">this</span>.documentBasePath.indexOf(<span class="literal">'?'</span>) != -1)
+ <span class="reserved">this</span>.documentBasePath = <span class="reserved">this</span>.documentBasePath.substring(0, <span class="reserved">this</span>.documentBasePath.indexOf(<span class="literal">'?'</span>));
+ <span class="reserved">this</span>.documentURL = <span class="reserved">this</span>.documentBasePath;
+ <span class="reserved">this</span>.documentBasePath = <span class="reserved">this</span>.documentBasePath.substring(0, <span class="reserved">this</span>.documentBasePath.lastIndexOf(<span class="literal">'/'</span>));
+
+ <span class="comment">// If not HTTP absolute</span>
+ <span class="reserved">if</span> (tinyMCE.baseURL.indexOf(<span class="literal">'://'</span>) == -1 && tinyMCE.baseURL.charAt(0) != <span class="literal">'/'</span>) {
+ <span class="comment">// If site absolute</span>
+ tinyMCE.baseURL = <span class="reserved">this</span>.documentBasePath + <span class="literal">"/"</span> + tinyMCE.baseURL;
+ }
+
+ <span class="comment">// Set default values on settings</span>
+ <span class="reserved">this</span>._def(<span class="literal">"mode"</span>, <span class="literal">"none"</span>);
+ <span class="reserved">this</span>._def(<span class="literal">"theme"</span>, <span class="literal">"advanced"</span>);
+ <span class="reserved">this</span>._def(<span class="literal">"plugins"</span>, <span class="literal">""</span>, true);
+ <span class="reserved">this</span>._def(<span class="literal">"language"</span>, <span class="literal">"en"</span>);
+ <span class="reserved">this</span>._def(<span class="literal">"docs_language"</span>, <span class="reserved">this</span>.settings[<span class="literal">'language'</span>]);
+ <span class="reserved">this</span>._def(<span class="literal">"elements"</span>, <span class="literal">""</span>);
+ <span class="reserved">this</span>._def(<span class="literal">"textarea_trigger"</span>, <span class="literal">"mce_editable"</span>);
+ <span class="reserved">this</span>._def(<span class="literal">"editor_selector"</span>, <span class="literal">""</span>);
+ <span class="reserved">this</span>._def(<span class="literal">"editor_deselector"</span>, <span class="literal">"mceNoEditor"</span>);
+ <span class="reserved">this</span>._def(<span class="literal">"valid_elements"</span>, <span class="literal">"+a[id|style|rel|rev|charset|hreflang|dir|lang|tabindex|accesskey|type|name|href|target|title|class|onfocus|onblur|onclick|ondblclick|onmousedown|onmouseup|onmouseover|onmousemove|onmouseout|onkeypress|onkeydown|onkeyup],-strong/-b[class|style],-em/-i[class|style],-strike[class|style],-u[class|style],#p[id|style|dir|class|align],-ol[class|style],-ul[class|style],-li[class|style],br,img[id|dir|lang|longdesc|usemap|style|class|src|onmouseover|onmouseout|border|alt=|title|hspace|vspace|width|height|align],-sub[style|class],-sup[style|class],-blockquote[dir|style],-table[border=0|cellspacing|cellpadding|width|height|class|align|summary|style|dir|id|lang|bgcolor|background|bordercolor],-tr[id|lang|dir|class|rowspan|width|height|align|valign|style|bgcolor|background|bordercolor],tbody[id|class],thead[id|class],tfoot[id|class],-td[id|lang|dir|class|colspan|rowspan|width|height|align|valign|style|bgcolor|background|bordercolor|scope],-th[id|lang|dir|class|colspan|rowspan|width|height|align|valign|style|scope],caption[id|lang|dir|class|style],-div[id|dir|class|align|style],-span[style|class|align],-pre[class|align|style],address[class|align|style],-h1[id|style|dir|class|align],-h2[id|style|dir|class|align],-h3[id|style|dir|class|align],-h4[id|style|dir|class|align],-h5[id|style|dir|class|align],-h6[id|style|dir|class|align],hr[class|style],-font[face|size|style|id|class|dir|color],dd[id|class|title|style|dir|lang],dl[id|class|title|style|dir|lang],dt[id|class|title|style|dir|lang]"</span>);
+ <span class="reserved">this</span>._def(<span class="literal">"extended_valid_elements"</span>, <span class="literal">""</span>);
+ <span class="reserved">this</span>._def(<span class="literal">"invalid_elements"</span>, <span class="literal">""</span>);
+ <span class="reserved">this</span>._def(<span class="literal">"encoding"</span>, <span class="literal">""</span>);
+ <span class="reserved">this</span>._def(<span class="literal">"urlconverter_callback"</span>, tinyMCE.getParam(<span class="literal">"urlconvertor_callback"</span>, <span class="literal">"TinyMCE_Engine.prototype.convertURL"</span>));
+ <span class="reserved">this</span>._def(<span class="literal">"save_callback"</span>, <span class="literal">""</span>);
+ <span class="reserved">this</span>._def(<span class="literal">"debug"</span>, false);
+ <span class="reserved">this</span>._def(<span class="literal">"force_br_newlines"</span>, false);
+ <span class="reserved">this</span>._def(<span class="literal">"force_p_newlines"</span>, true);
+ <span class="reserved">this</span>._def(<span class="literal">"add_form_submit_trigger"</span>, true);
+ <span class="reserved">this</span>._def(<span class="literal">"relative_urls"</span>, true);
+ <span class="reserved">this</span>._def(<span class="literal">"remove_script_host"</span>, true);
+ <span class="reserved">this</span>._def(<span class="literal">"focus_alert"</span>, true);
+ <span class="reserved">this</span>._def(<span class="literal">"document_base_url"</span>, <span class="reserved">this</span>.documentURL);
+ <span class="reserved">this</span>._def(<span class="literal">"visual"</span>, true);
+ <span class="reserved">this</span>._def(<span class="literal">"visual_table_class"</span>, <span class="literal">"mceVisualAid"</span>);
+ <span class="reserved">this</span>._def(<span class="literal">"setupcontent_callback"</span>, <span class="literal">""</span>);
+ <span class="reserved">this</span>._def(<span class="literal">"fix_content_duplication"</span>, true);
+ <span class="reserved">this</span>._def(<span class="literal">"custom_undo_redo"</span>, true);
+ <span class="reserved">this</span>._def(<span class="literal">"custom_undo_redo_levels"</span>, -1);
+ <span class="reserved">this</span>._def(<span class="literal">"custom_undo_redo_keyboard_shortcuts"</span>, true);
+ <span class="reserved">this</span>._def(<span class="literal">"custom_undo_redo_restore_selection"</span>, true);
+ <span class="reserved">this</span>._def(<span class="literal">"verify_html"</span>, true);
+ <span class="reserved">this</span>._def(<span class="literal">"apply_source_formatting"</span>, false);
+ <span class="reserved">this</span>._def(<span class="literal">"directionality"</span>, <span class="literal">"ltr"</span>);
+ <span class="reserved">this</span>._def(<span class="literal">"cleanup_on_startup"</span>, false);
+ <span class="reserved">this</span>._def(<span class="literal">"inline_styles"</span>, false);
+ <span class="reserved">this</span>._def(<span class="literal">"convert_newlines_to_brs"</span>, false);
+ <span class="reserved">this</span>._def(<span class="literal">"auto_reset_designmode"</span>, true);
+ <span class="reserved">this</span>._def(<span class="literal">"entities"</span>, <span class="literal">"39,#39,160,nbsp,161,iexcl,162,cent,163,pound,164,curren,165,yen,166,brvbar,167,sect,168,uml,169,copy,170,ordf,171,laquo,172,not,173,shy,174,reg,175,macr,176,deg,177,plusmn,178,sup2,179,sup3,180,acute,181,micro,182,para,183,middot,184,cedil,185,sup1,186,ordm,187,raquo,188,frac14,189,frac12,190,frac34,191,iquest,192,Agrave,193,Aacute,194,Acirc,195,Atilde,196,Auml,197,Aring,198,AElig,199,Ccedil,200,Egrave,201,Eacute,202,Ecirc,203,Euml,204,Igrave,205,Iacute,206,Icirc,207,Iuml,208,ETH,209,Ntilde,210,Ograve,211,Oacute,212,Ocirc,213,Otilde,214,Ouml,215,times,216,Oslash,217,Ugrave,218,Uacute,219,Ucirc,220,Uuml,221,Yacute,222,THORN,223,szlig,224,agrave,225,aacute,226,acirc,227,atilde,228,auml,229,aring,230,aelig,231,ccedil,232,egrave,233,eacute,234,ecirc,235,euml,236,igrave,237,iacute,238,icirc,239,iuml,240,eth,241,ntilde,242,ograve,243,oacute,244,ocirc,245,otilde,246,ouml,247,divide,248,oslash,249,ugrave,250,uacute,251,ucirc,252,uuml,253,yacute,254,thorn,255,yuml,402,fnof,913,Alpha,914,Beta,915,Gamma,916,Delta,917,Epsilon,918,Zeta,919,Eta,920,Theta,921,Iota,922,Kappa,923,Lambda,924,Mu,925,Nu,926,Xi,927,Omicron,928,Pi,929,Rho,931,Sigma,932,Tau,933,Upsilon,934,Phi,935,Chi,936,Psi,937,Omega,945,alpha,946,beta,947,gamma,948,delta,949,epsilon,950,zeta,951,eta,952,theta,953,iota,954,kappa,955,lambda,956,mu,957,nu,958,xi,959,omicron,960,pi,961,rho,962,sigmaf,963,sigma,964,tau,965,upsilon,966,phi,967,chi,968,psi,969,omega,977,thetasym,978,upsih,982,piv,8226,bull,8230,hellip,8242,prime,8243,Prime,8254,oline,8260,frasl,8472,weierp,8465,image,8476,real,8482,trade,8501,alefsym,8592,larr,8593,uarr,8594,rarr,8595,darr,8596,harr,8629,crarr,8656,lArr,8657,uArr,8658,rArr,8659,dArr,8660,hArr,8704,forall,8706,part,8707,exist,8709,empty,8711,nabla,8712,isin,8713,notin,8715,ni,8719,prod,8721,sum,8722,minus,8727,lowast,8730,radic,8733,prop,8734,infin,8736,ang,8743,and,8744,or,8745,cap,8746,cup,8747,int,8756,there4,8764,sim,8773,cong,8776,asymp,8800,ne,8801,equiv,8804,le,8805,ge,8834,sub,8835,sup,8836,nsub,8838,sube,8839,supe,8853,oplus,8855,otimes,8869,perp,8901,sdot,8968,lceil,8969,rceil,8970,lfloor,8971,rfloor,9001,lang,9002,rang,9674,loz,9824,spades,9827,clubs,9829,hearts,9830,diams,34,quot,38,amp,60,lt,62,gt,338,OElig,339,oelig,352,Scaron,353,scaron,376,Yuml,710,circ,732,tilde,8194,ensp,8195,emsp,8201,thinsp,8204,zwnj,8205,zwj,8206,lrm,8207,rlm,8211,ndash,8212,mdash,8216,lsquo,8217,rsquo,8218,sbquo,8220,ldquo,8221,rdquo,8222,bdquo,8224,dagger,8225,Dagger,8240,permil,8249,lsaquo,8250,rsaquo,8364,euro"</span>, true);
+ <span class="reserved">this</span>._def(<span class="literal">"entity_encoding"</span>, <span class="literal">"named"</span>);
+ <span class="reserved">this</span>._def(<span class="literal">"cleanup_callback"</span>, <span class="literal">""</span>);
+ <span class="reserved">this</span>._def(<span class="literal">"add_unload_trigger"</span>, true);
+ <span class="reserved">this</span>._def(<span class="literal">"ask"</span>, false);
+ <span class="reserved">this</span>._def(<span class="literal">"nowrap"</span>, false);
+ <span class="reserved">this</span>._def(<span class="literal">"auto_resize"</span>, false);
+ <span class="reserved">this</span>._def(<span class="literal">"auto_focus"</span>, false);
+ <span class="reserved">this</span>._def(<span class="literal">"cleanup"</span>, true);
+ <span class="reserved">this</span>._def(<span class="literal">"remove_linebreaks"</span>, true);
+ <span class="reserved">this</span>._def(<span class="literal">"button_tile_map"</span>, false);
+ <span class="reserved">this</span>._def(<span class="literal">"submit_patch"</span>, true);
+ <span class="reserved">this</span>._def(<span class="literal">"browsers"</span>, <span class="literal">"msie,safari,gecko,opera"</span>, true);
+ <span class="reserved">this</span>._def(<span class="literal">"dialog_type"</span>, <span class="literal">"window"</span>);
+ <span class="reserved">this</span>._def(<span class="literal">"accessibility_warnings"</span>, true);
+ <span class="reserved">this</span>._def(<span class="literal">"accessibility_focus"</span>, true);
+ <span class="reserved">this</span>._def(<span class="literal">"merge_styles_invalid_parents"</span>, <span class="literal">""</span>);
+ <span class="reserved">this</span>._def(<span class="literal">"force_hex_style_colors"</span>, true);
+ <span class="reserved">this</span>._def(<span class="literal">"trim_span_elements"</span>, true);
+ <span class="reserved">this</span>._def(<span class="literal">"convert_fonts_to_spans"</span>, false);
+ <span class="reserved">this</span>._def(<span class="literal">"doctype"</span>, <span class="literal">'<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">'</span>);
+ <span class="reserved">this</span>._def(<span class="literal">"font_size_classes"</span>, <span class="literal">''</span>);
+ <span class="reserved">this</span>._def(<span class="literal">"font_size_style_values"</span>, <span class="literal">'xx-small,x-small,small,medium,large,x-large,xx-large'</span>, true);
+ <span class="reserved">this</span>._def(<span class="literal">"event_elements"</span>, <span class="literal">'a,img'</span>, true);
+ <span class="reserved">this</span>._def(<span class="literal">"convert_urls"</span>, true);
+ <span class="reserved">this</span>._def(<span class="literal">"table_inline_editing"</span>, false);
+ <span class="reserved">this</span>._def(<span class="literal">"object_resizing"</span>, true);
+ <span class="reserved">this</span>._def(<span class="literal">"custom_shortcuts"</span>, true);
+ <span class="reserved">this</span>._def(<span class="literal">"convert_on_click"</span>, false);
+ <span class="reserved">this</span>._def(<span class="literal">"content_css"</span>, <span class="literal">''</span>);
+ <span class="reserved">this</span>._def(<span class="literal">"fix_list_elements"</span>, false);
+ <span class="reserved">this</span>._def(<span class="literal">"fix_table_elements"</span>, false);
+
+ <span class="comment">// Browser check IE</span>
+ <span class="reserved">if</span> (<span class="reserved">this</span>.isMSIE && <span class="reserved">this</span>.settings[<span class="literal">'browsers'</span>].indexOf(<span class="literal">'msie'</span>) == -1)
+ <span class="reserved">return</span>;
+
+ <span class="comment">// Browser check Gecko</span>
+ <span class="reserved">if</span> (<span class="reserved">this</span>.isGecko && <span class="reserved">this</span>.settings[<span class="literal">'browsers'</span>].indexOf(<span class="literal">'gecko'</span>) == -1)
+ <span class="reserved">return</span>;
+
+ <span class="comment">// Browser check Safari</span>
+ <span class="reserved">if</span> (<span class="reserved">this</span>.isSafari && <span class="reserved">this</span>.settings[<span class="literal">'browsers'</span>].indexOf(<span class="literal">'safari'</span>) == -1)
+ <span class="reserved">return</span>;
+
+ <span class="comment">// Browser check Opera</span>
+ <span class="reserved">if</span> (<span class="reserved">this</span>.isOpera && <span class="reserved">this</span>.settings[<span class="literal">'browsers'</span>].indexOf(<span class="literal">'opera'</span>) == -1)
+ <span class="reserved">return</span>;
+
+ <span class="comment">// If not super absolute make it so</span>
+ var baseHREF = tinyMCE.settings[<span class="literal">'document_base_url'</span>];
+ var h = document.location.href;
+ var p = h.indexOf(<span class="literal">'://'</span>);
+ <span class="reserved">if</span> (p > 0 && document.location.protocol != <span class="literal">"file:"</span>) {
+ p = h.indexOf(<span class="literal">'/'</span>, p + 3);
+ h = h.substring(0, p);
+
+ <span class="reserved">if</span> (baseHREF.indexOf(<span class="literal">'://'</span>) == -1)
+ baseHREF = h + baseHREF;
+
+ tinyMCE.settings[<span class="literal">'document_base_url'</span>] = baseHREF;
+ tinyMCE.settings[<span class="literal">'document_base_prefix'</span>] = h;
+ }
+
+ <span class="comment">// Trim away query part</span>
+ <span class="reserved">if</span> (baseHREF.indexOf(<span class="literal">'?'</span>) != -1)
+ baseHREF = baseHREF.substring(0, baseHREF.indexOf(<span class="literal">'?'</span>));
+
+ <span class="reserved">this</span>.settings[<span class="literal">'base_href'</span>] = baseHREF.substring(0, baseHREF.lastIndexOf(<span class="literal">'/'</span>)) + <span class="literal">"/"</span>;
+
+ theme = <span class="reserved">this</span>.settings[<span class="literal">'theme'</span>];
+ <span class="reserved">this</span>.blockRegExp = new RegExp(<span class="literal">"^(h[1-6]|p|div|address|pre|form|table|li|ol|ul|td|blockquote|center|dl|dt|dd|dir|fieldset|form|noscript|noframes|menu|isindex|samp)$"</span>, <span class="literal">"i"</span>);
+ <span class="reserved">this</span>.posKeyCodes = new Array(13,45,36,35,33,34,37,38,39,40);
+ <span class="reserved">this</span>.uniqueURL = <span class="literal">'javascript:TINYMCE_UNIQUEURL();'</span>; <span class="comment">// Make unique URL non real URL</span>
+ <span class="reserved">this</span>.uniqueTag = <span class="literal">'<div id="mceTMPElement" style="display: none">TMP</div>'</span>;
+ <span class="reserved">this</span>.callbacks = new Array(<span class="literal">'onInit'</span>, <span class="literal">'getInfo'</span>, <span class="literal">'getEditorTemplate'</span>, <span class="literal">'setupContent'</span>, <span class="literal">'onChange'</span>, <span class="literal">'onPageLoad'</span>, <span class="literal">'handleNodeChange'</span>, <span class="literal">'initInstance'</span>, <span class="literal">'execCommand'</span>, <span class="literal">'getControlHTML'</span>, <span class="literal">'handleEvent'</span>, <span class="literal">'cleanup'</span>);
+
+ <span class="comment">// Theme url</span>
+ <span class="reserved">this</span>.settings[<span class="literal">'theme_href'</span>] = tinyMCE.baseURL + <span class="literal">"/themes/"</span> + theme;
+
+ <span class="reserved">if</span> (!tinyMCE.isMSIE)
+ <span class="reserved">this</span>.settings[<span class="literal">'force_br_newlines'</span>] = false;
+
+ <span class="reserved">if</span> (tinyMCE.getParam(<span class="literal">"popups_css"</span>, false)) {
+ var cssPath = tinyMCE.getParam(<span class="literal">"popups_css"</span>, <span class="literal">""</span>);
+
+ <span class="comment">// Is relative</span>
+ <span class="reserved">if</span> (cssPath.indexOf(<span class="literal">'://'</span>) == -1 && cssPath.charAt(0) != <span class="literal">'/'</span>)
+ <span class="reserved">this</span>.settings[<span class="literal">'popups_css'</span>] = <span class="reserved">this</span>.documentBasePath + <span class="literal">"/"</span> + cssPath;
+ <span class="reserved">else</span>
+ <span class="reserved">this</span>.settings[<span class="literal">'popups_css'</span>] = cssPath;
+ } <span class="reserved">else</span>
+ <span class="reserved">this</span>.settings[<span class="literal">'popups_css'</span>] = tinyMCE.baseURL + <span class="literal">"/themes/"</span> + theme + <span class="literal">"/css/editor_popup.css"</span>;
+
+ <span class="reserved">if</span> (tinyMCE.getParam(<span class="literal">"editor_css"</span>, false)) {
+ var cssPath = tinyMCE.getParam(<span class="literal">"editor_css"</span>, <span class="literal">""</span>);
+
+ <span class="comment">// Is relative</span>
+ <span class="reserved">if</span> (cssPath.indexOf(<span class="literal">'://'</span>) == -1 && cssPath.charAt(0) != <span class="literal">'/'</span>)
+ <span class="reserved">this</span>.settings[<span class="literal">'editor_css'</span>] = <span class="reserved">this</span>.documentBasePath + <span class="literal">"/"</span> + cssPath;
+ <span class="reserved">else</span>
+ <span class="reserved">this</span>.settings[<span class="literal">'editor_css'</span>] = cssPath;
+ } <span class="reserved">else</span>
+ <span class="reserved">this</span>.settings[<span class="literal">'editor_css'</span>] = tinyMCE.baseURL + <span class="literal">"/themes/"</span> + theme + <span class="literal">"/css/editor_ui.css"</span>;
+
+ <span class="reserved">if</span> (tinyMCE.settings[<span class="literal">'debug'</span>]) {
+ var msg = <span class="literal">"Debug: \n"</span>;
+
+ msg += <span class="literal">"baseURL: "</span> + <span class="reserved">this</span>.baseURL + <span class="literal">"\n"</span>;
+ msg += <span class="literal">"documentBasePath: "</span> + <span class="reserved">this</span>.documentBasePath + <span class="literal">"\n"</span>;
+ msg += <span class="literal">"content_css: "</span> + <span class="reserved">this</span>.settings[<span class="literal">'content_css'</span>] + <span class="literal">"\n"</span>;
+ msg += <span class="literal">"popups_css: "</span> + <span class="reserved">this</span>.settings[<span class="literal">'popups_css'</span>] + <span class="literal">"\n"</span>;
+ msg += <span class="literal">"editor_css: "</span> + <span class="reserved">this</span>.settings[<span class="literal">'editor_css'</span>] + <span class="literal">"\n"</span>;
+
+ alert(msg);
+ }
+
+ <span class="comment">// Only do this once</span>
+ <span class="reserved">if</span> (<span class="reserved">this</span>.configs.length == 0) {
+ <span class="comment">// Is Safari enabled</span>
+ <span class="reserved">if</span> (<span class="reserved">this</span>.isSafari && <span class="reserved">this</span>.getParam(<span class="literal">'safari_warning'</span>, false))
+ alert(<span class="literal">"Safari support is very limited and should be considered experimental.\nSo there is no need to even submit bugreports on this early version.\nYou can disable this message by setting: safari_warning option to false"</span>);
+
+ <span class="reserved">if</span> (typeof(TinyMCECompressed) == <span class="literal">"undefined"</span>) {
+ tinyMCE.addEvent(window, <span class="literal">"DOMContentLoaded"</span>, TinyMCE_Engine.<span class="reserved">prototype</span>.onLoad);
+
+ <span class="reserved">if</span> (tinyMCE.isMSIE && !tinyMCE.isOpera) {
+ <span class="reserved">if</span> (document.body)
+ tinyMCE.addEvent(document.body, <span class="literal">"readystatechange"</span>, TinyMCE_Engine.<span class="reserved">prototype</span>.onLoad);
+ <span class="reserved">else</span>
+ tinyMCE.addEvent(document, <span class="literal">"readystatechange"</span>, TinyMCE_Engine.<span class="reserved">prototype</span>.onLoad);
+ }
+
+ tinyMCE.addEvent(window, <span class="literal">"load"</span>, TinyMCE_Engine.<span class="reserved">prototype</span>.onLoad);
+ tinyMCE._addUnloadEvents();
+ }
+ }
+
+ <span class="reserved">this</span>.loadScript(tinyMCE.baseURL + <span class="literal">'/themes/'</span> + <span class="reserved">this</span>.settings[<span class="literal">'theme'</span>] + <span class="literal">'/editor_template'</span> + tinyMCE.srcMode + <span class="literal">'.js'</span>);
+ <span class="reserved">this</span>.loadScript(tinyMCE.baseURL + <span class="literal">'/langs/'</span> + <span class="reserved">this</span>.settings[<span class="literal">'language'</span>] + <span class="literal">'.js'</span>);
+ <span class="reserved">this</span>.loadCSS(<span class="reserved">this</span>.settings[<span class="literal">'editor_css'</span>]);
+
+ <span class="comment">// Add plugins</span>
+ var p = tinyMCE.getParam(<span class="literal">'plugins'</span>, <span class="literal">''</span>, true, <span class="literal">','</span>);
+ <span class="reserved">if</span> (p.length > 0) {
+ <span class="reserved">for</span> (var i=0; i<p.length; i++) {
+ <span class="reserved">if</span> (p[i].charAt(0) != <span class="literal">'-'</span>)
+ <span class="reserved">this</span>.loadScript(tinyMCE.baseURL + <span class="literal">'/plugins/'</span> + p[i] + <span class="literal">'/editor_plugin'</span> + tinyMCE.srcMode + <span class="literal">'.js'</span>);
+ }
+ }
+
+ <span class="comment">// Setup entities</span>
+ settings[<span class="literal">'cleanup_entities'</span>] = new Array();
+ var entities = tinyMCE.getParam(<span class="literal">'entities'</span>, <span class="literal">''</span>, true, <span class="literal">','</span>);
+ <span class="reserved">for</span> (var i=0; i<entities.length; i+=2)
+ settings[<span class="literal">'cleanup_entities'</span>][<span class="literal">'c'</span> + entities[i]] = entities[i+1];
+
+ <span class="comment">// Save away this config</span>
+ settings[<span class="literal">'index'</span>] = <span class="reserved">this</span>.configs.length;
+ <span class="reserved">this</span>.configs[<span class="reserved">this</span>.configs.length] = settings;
+ },
+
+ <span class="comment">/**
+ * Adds unload event handles to execute triggerSave.
+ *
+ * <span class="attrib">@private</span>
+ */</span>
+ _addUnloadEvents : <span class="reserved">function</span>() {
+ <span class="reserved">if</span> (tinyMCE.isMSIE) {
+ <span class="reserved">if</span> (tinyMCE.settings[<span class="literal">'add_unload_trigger'</span>]) {
+ tinyMCE.addEvent(window, <span class="literal">"unload"</span>, TinyMCE_Engine.<span class="reserved">prototype</span>.unloadHandler);
+ tinyMCE.addEvent(window.document, <span class="literal">"beforeunload"</span>, TinyMCE_Engine.<span class="reserved">prototype</span>.unloadHandler);
+ }
+ } <span class="reserved">else</span> {
+ <span class="reserved">if</span> (tinyMCE.settings[<span class="literal">'add_unload_trigger'</span>])
+ tinyMCE.addEvent(window, <span class="literal">"unload"</span>, <span class="reserved">function</span> () {tinyMCE.triggerSave(true, true);});
+ }
+ },
+
+ <span class="comment">/**
+ * Assigns a default value for a specific config parameter.
+ *
+ * <span class="attrib">@param</span> {string} key Settings key to add default value to.
+ * <span class="attrib">@param</span> {object} def_val Default value to assign if the settings option isn't defined.
+ * <span class="attrib">@param</span> {boolean} t Trim all white space, if true all whitespace will be removed from option value.
+ * <span class="attrib">@private</span>
+ */</span>
+ _def : <span class="reserved">function</span>(key, def_val, t) {
+ var v = tinyMCE.getParam(key, def_val);
+
+ v = t ? v.replace(/\s+/g,<span class="literal">""</span>) : v;
+
+ <span class="reserved">this</span>.settings[key] = v;
+ },
+
+ <span class="comment">/**
+ * Returns true/false if the specified plugin is loaded or not.
+ *
+ * <span class="attrib">@param</span> {string} n Plugin name to look for.
+ * <span class="attrib">@return</span> true/false if the specified plugin is loaded or not.
+ * <span class="attrib">@type</span> boolean
+ */</span>
+ hasPlugin : <span class="reserved">function</span>(n) {
+ <span class="reserved">return</span> typeof(<span class="reserved">this</span>.plugins[n]) != <span class="literal">"undefined"</span> && <span class="reserved">this</span>.plugins[n] != null;
+ },
+
+ <span class="comment">/**
+ * Adds the specified plugin to the list of loaded plugins, this will also setup the baseURL
+ * property of the plugin.
+ *
+ * <span class="attrib">@param</span> {string} Plugin name/id.
+ * <span class="attrib">@param</span> {TinyMCE_Plugin} p Plugin instance to add.
+ */</span>
+ addPlugin : <span class="reserved">function</span>(n, p) {
+ var op = <span class="reserved">this</span>.plugins[n];
+
+ <span class="comment">// Use the previous plugin object base URL used when loading external plugins</span>
+ p.baseURL = op ? op.baseURL : tinyMCE.baseURL + <span class="literal">"/plugins/"</span> + n;
+ <span class="reserved">this</span>.plugins[n] = p;
+ },
+
+ <span class="comment">/**
+ * Sets the baseURL of the specified plugin, this is useful if the plugin is loaded from
+ * a external location.
+ *
+ * <span class="attrib">@param</span> {string} n Plugin name/id to set base URL on. This have to be added before.
+ * <span class="attrib">@param</span> {string} u Base URL of plugin, this string should be the URL prefix for the plugin without a trailing slash.
+ */</span>
+ setPluginBaseURL : <span class="reserved">function</span>(n, u) {
+ var op = <span class="reserved">this</span>.plugins[n];
+
+ <span class="reserved">if</span> (op)
+ op.baseURL = u;
+ <span class="reserved">else</span>
+ <span class="reserved">this</span>.plugins[n] = {baseURL : u};
+ },
+
+ <span class="comment">/**
+ * Load plugin from external URL.
+ *
+ * <span class="attrib">@param</span> {string} n Plugin name for example \"emotions\".
+ * <span class="attrib">@param</span> {string} u URL of plugin directory to load.
+ */</span>
+ loadPlugin : <span class="reserved">function</span>(n, u) {
+ u = u.indexOf(<span class="literal">'.js'</span>) != -1 ? u.substring(0, u.lastIndexOf(<span class="literal">'/'</span>)) : u;
+ u = u.charAt(u.length-1) == <span class="literal">'/'</span> ? u.substring(0, u.length-1) : u;
+ <span class="reserved">this</span>.plugins[n] = {baseURL : u};
+ <span class="reserved">this</span>.loadScript(u + <span class="literal">"/editor_plugin"</span> + (tinyMCE.srcMode ? <span class="literal">'_src'</span> : <span class="literal">''</span>) + <span class="literal">".js"</span>);
+ },
+
+ <span class="comment">/**
+ * Returns true/false if the specified theme is loaded or not.
+ *
+ * <span class="attrib">@param</span> {string} n Theme name/id to check for.
+ * <span class="attrib">@return</span> true/false if the specified theme is loaded or not.
+ * <span class="attrib">@type</span> boolean
+ */</span>
+ hasTheme : <span class="reserved">function</span>(n) {
+ <span class="reserved">return</span> typeof(<span class="reserved">this</span>.themes[n]) != <span class="literal">"undefined"</span> && <span class="reserved">this</span>.themes[n] != null;
+ },
+
+ <span class="comment">/**
+ * Adds the specified theme in to the list of loaded themes.
+ *
+ * <span class="attrib">@param</span> {string} n Theme name/id to add the object reference to.
+ * <span class="attrib">@param</span> {TinyMCE_Theme} t Theme instance to add to the loaded list.
+ */</span>
+ addTheme : <span class="reserved">function</span>(n, t) {
+ <span class="reserved">this</span>.themes[n] = t;
+ },
+
+ <span class="comment">/**
+ * Adds a floating menu instance to TinyMCE.
+ *
+ * <span class="attrib">@param</span> {string} n TinyMCE menu id.
+ * <span class="attrib">@param</span> {TinyMCE_Menu} m TinyMCE menu instance.
+ */</span>
+ addMenu : <span class="reserved">function</span>(n, m) {
+ <span class="reserved">this</span>.menus[n] = m;
+ },
+
+ <span class="comment">/**
+ * Checks if the specified menu by name is added to TinyMCE.
+ *
+ * <span class="attrib">@param</span> {string} n TinyMCE menu id.
+ * <span class="attrib">@return</span> true/false if it exists or not.
+ * <span class="attrib">@type</span> boolean
+ */</span>
+ hasMenu : <span class="reserved">function</span>(n) {
+ <span class="reserved">return</span> typeof(<span class="reserved">this</span>.plugins[n]) != <span class="literal">"undefined"</span> && <span class="reserved">this</span>.plugins[n] != null;
+ },
+
+ <span class="comment">/**
+ * Loads the specified script by writing the a script tag to the current page.
+ * This will also check if the file has been loaded before. This function should only be used
+ * when the page is loading.
+ *
+ * <span class="attrib">@param</span> {string} url Script URL to load.
+ */</span>
+ loadScript : <span class="reserved">function</span>(url) {
+ <span class="reserved">for</span> (var i=0; i<<span class="reserved">this</span>.loadedFiles.length; i++) {
+ <span class="reserved">if</span> (<span class="reserved">this</span>.loadedFiles[i] == url)
+ <span class="reserved">return</span>;
+ }
+
+ document.write(<span class="literal">'<sc'</span>+<span class="literal">'ript language="javascript" type="text/javascript" src="'</span> + url + <span class="literal">'"></script>'</span>);
+
+ <span class="reserved">this</span>.loadedFiles[<span class="reserved">this</span>.loadedFiles.length] = url;
+ },
+
+ <span class="comment">/**
+ * Loads the specified CSS by writing the a link tag to the current page.
+ * This will also check if the file has been loaded before. This function should only be used
+ * when the page is loading.
+ *
+ * <span class="attrib">@param</span> {string} url CSS file URL to load or comma separated list of files.
+ */</span>
+ loadCSS : <span class="reserved">function</span>(url) {
+ var ar = url.replace(/\s+/, <span class="literal">''</span>).split(<span class="literal">','</span>);
+ var lflen = 0, csslen = 0;
+ var skip = false;
+ var x = 0, i = 0;
+
+ <span class="reserved">for</span> (x = 0,csslen = ar.length; x<csslen; x++) {
+ ignore_css = false;
+
+ <span class="reserved">if</span> (ar[x] != null && ar[x] != <span class="literal">'null'</span> && ar[x].length > 0) {
+ <span class="comment">/* Make sure it doesn't exist. */</span>
+ <span class="reserved">for</span> (i=0, lflen=<span class="reserved">this</span>.loadedFiles.length; i<lflen; i++) {
+ <span class="reserved">if</span> (<span class="reserved">this</span>.loadedFiles[i] == ar[x]) {
+ skip = true;
+ break;
+ }
+ }
+
+ <span class="reserved">if</span> (!skip) {
+ document.write(<span class="literal">'<link href="'</span> + ar[x] + <span class="literal">'" rel="stylesheet" type="text/css" />'</span>);
+ <span class="reserved">this</span>.loadedFiles[<span class="reserved">this</span>.loadedFiles.length] = ar[x];
+ }
+ }
+ }
+ },
+
+ <span class="comment">/**
+ * Imports a CSS file into a allready loaded document. This will add a link element
+ * to the head element of the document.
+ *
+ * <span class="attrib">@param</span> {DOMDocument} doc DOM Document to load CSS into.
+ * <span class="attrib">@param</span> {string} css CSS File URL to load or comma separated list of files.
+ */</span>
+ importCSS : <span class="reserved">function</span>(doc, css) {
+ var css_ary = css.replace(/\s+/, <span class="literal">''</span>).split(<span class="literal">','</span>);
+ var csslen, elm, headArr, x, css_file;
+
+ <span class="reserved">for</span> (x = 0, csslen = css_ary.length; x<csslen; x++) {
+ css_file = css_ary[x];
+
+ <span class="reserved">if</span> (css_file != null && css_file != <span class="literal">'null'</span> && css_file.length > 0) {
+ <span class="comment">// Is relative, make absolute</span>
+ <span class="reserved">if</span> (css_file.indexOf(<span class="literal">'://'</span>) == -1 && css_file.charAt(0) != <span class="literal">'/'</span>)
+ css_file = <span class="reserved">this</span>.documentBasePath + <span class="literal">"/"</span> + css_file;
+
+ <span class="reserved">if</span> (typeof(doc.createStyleSheet) == <span class="literal">"undefined"</span>) {
+ elm = doc.createElement(<span class="literal">"link"</span>);
+
+ elm.rel = <span class="literal">"stylesheet"</span>;
+ elm.href = css_file;
+
+ <span class="reserved">if</span> ((headArr = doc.getElementsByTagName(<span class="literal">"head"</span>)) != null && headArr.length > 0)
+ headArr[0].appendChild(elm);
+ } <span class="reserved">else</span>
+ doc.createStyleSheet(css_file);
+ }
+ }
+ },
+
+ <span class="comment">/**
+ * Displays a confirm dialog when a user clicks/focus a textarea that is to be converted into
+ * a TinyMCE instance.
+ *
+ * <span class="attrib">@param</span> {DOMEvent} e DOM event instance.
+ * <span class="attrib">@param</span> {Array} settings Name/Value array of initialization settings.
+ */</span>
+ confirmAdd : <span class="reserved">function</span>(e, settings) {
+ var elm = tinyMCE.isMSIE ? event.srcElement : e.target;
+ var elementId = elm.name ? elm.name : elm.id;
+
+ tinyMCE.settings = settings;
+
+ <span class="reserved">if</span> (tinyMCE.settings[<span class="literal">'convert_on_click'</span>] || (!elm.getAttribute(<span class="literal">'mce_noask'</span>) && confirm(tinyMCELang[<span class="literal">'lang_edit_confirm'</span>])))
+ tinyMCE.addMCEControl(elm, elementId);
+
+ elm.setAttribute(<span class="literal">'mce_noask'</span>, <span class="literal">'true'</span>);
+ },
+
+ <span class="comment">/**
+ * Moves the contents from the hidden textarea to the editor that gets inserted.
+ *
+ * <span class="attrib">@param</span> {string} form_element_name Form element name to move contents from.
+ * <span class="attrib">@deprecated</span>
+ */</span>
+ updateContent : <span class="reserved">function</span>(form_element_name) {
+ <span class="comment">// Find MCE instance linked to given form element and copy it's value</span>
+ var formElement = document.getElementById(form_element_name);
+ <span class="reserved">for</span> (var n in tinyMCE.instances) {
+ var inst = tinyMCE.instances[n];
+ <span class="reserved">if</span> (!tinyMCE.isInstance(inst))
+ continue;
+
+ inst.switchSettings();
+
+ <span class="reserved">if</span> (inst.formElement == formElement) {
+ var doc = inst.getDoc();
+
+ tinyMCE._setHTML(doc, inst.formElement.value);
+
+ <span class="reserved">if</span> (!tinyMCE.isMSIE)
+ doc.body.innerHTML = tinyMCE._cleanupHTML(inst, doc, <span class="reserved">this</span>.settings, doc.body, inst.visualAid);
+ }
+ }
+ },
+
+ <span class="comment">/**
+ * Adds a TinyMCE editor control instance to a specific form element.
+ *
+ * <span class="attrib">@param</span> {HTMLElement} replace_element HTML element object to replace.
+ * <span class="attrib">@param</span> {string} form_element_name HTML form element name,
+ * <span class="attrib">@param</span> {DOMDocument} target_document Target document that holds the element.
+ */</span>
+ addMCEControl : <span class="reserved">function</span>(replace_element, form_element_name, target_document) {
+ var id = <span class="literal">"mce_editor_"</span> + tinyMCE.idCounter++;
+ var inst = new TinyMCE_Control(tinyMCE.settings);
+
+ inst.editorId = id;
+ <span class="reserved">this</span>.instances[id] = inst;
+
+ inst._onAdd(replace_element, form_element_name, target_document);
+ },
+
+ <span class="comment">/**
+ * Removes a TinyMCE editor control instance by id.
+ *
+ * <span class="attrib">@param</span> {string} editor_id Id of editor instance to remove.
+ */</span>
+ removeMCEControl : <span class="reserved">function</span>(editor_id) {
+ var inst = tinyMCE.getInstanceById(editor_id);
+
+ <span class="reserved">if</span> (inst) {
+ inst.switchSettings();
+
+ editor_id = inst.editorId;
+ var html = tinyMCE.getContent(editor_id);
+
+ <span class="comment">// Remove editor instance from instances array</span>
+ var tmpInstances = new Array();
+ <span class="reserved">for</span> (var instanceName in tinyMCE.instances) {
+ var instance = tinyMCE.instances[instanceName];
+ <span class="reserved">if</span> (!tinyMCE.isInstance(instance))
+ continue;
+
+ <span class="reserved">if</span> (instanceName != editor_id)
+ tmpInstances[instanceName] = instance;
+ }
+ tinyMCE.instances = tmpInstances;
+
+ tinyMCE.selectedElement = null;
+ tinyMCE.selectedInstance = null;
+
+ <span class="comment">// Remove element</span>
+ var replaceElement = document.getElementById(editor_id + <span class="literal">"_parent"</span>);
+ var oldTargetElement = inst.oldTargetElement;
+ var targetName = oldTargetElement.nodeName.toLowerCase();
+
+ <span class="reserved">if</span> (targetName == <span class="literal">"textarea"</span> || targetName == <span class="literal">"input"</span>) {
+ <span class="comment">// Just show the old text area</span>
+ replaceElement.parentNode.removeChild(replaceElement);
+ oldTargetElement.style.display = <span class="literal">"inline"</span>;
+ oldTargetElement.value = html;
+ } <span class="reserved">else</span> {
+ oldTargetElement.innerHTML = html;
+ oldTargetElement.style.display = <span class="literal">'block'</span>;
+
+ replaceElement.parentNode.insertBefore(oldTargetElement, replaceElement);
+ replaceElement.parentNode.removeChild(replaceElement);
+ }
+ }
+ },
+
+ <span class="comment">/**
+ * Moves the contents from a TinyMCE editor control instance to the hidden textarea
+ * that got replaced with TinyMCE. This is executed automaticly on for example form submit.
+ *
+ * <span class="attrib">@param</span> {boolean} skip_cleanup Optional Skip cleanup, simply move the contents as fast as possible.
+ * <span class="attrib">@param</span> {boolean} skip_callback Optional Skip callback, don't call the save_callback function.
+ */</span>
+ triggerSave : <span class="reserved">function</span>(skip_cleanup, skip_callback) {
+ var inst, n;
+
+ <span class="comment">// Default to false</span>
+ <span class="reserved">if</span> (typeof(skip_cleanup) == <span class="literal">"undefined"</span>)
+ skip_cleanup = false;
+
+ <span class="comment">// Default to false</span>
+ <span class="reserved">if</span> (typeof(skip_callback) == <span class="literal">"undefined"</span>)
+ skip_callback = false;
+
+ <span class="comment">// Cleanup and set all form fields</span>
+ <span class="reserved">for</span> (n in tinyMCE.instances) {
+ inst = tinyMCE.instances[n];
+
+ <span class="reserved">if</span> (!tinyMCE.isInstance(inst))
+ continue;
+
+ inst.triggerSave(skip_cleanup, skip_callback);
+ }
+ },
+
+ <span class="comment">/**
+ * Resets a forms TinyMCE instances based on form index.
+ *
+ * <span class="attrib">@param</span> {int} form_index Form index to reset.
+ */</span>
+ resetForm : <span class="reserved">function</span>(form_index) {
+ var i, inst, n, formObj = document.forms[form_index];
+
+ <span class="reserved">for</span> (n in tinyMCE.instances) {
+ inst = tinyMCE.instances[n];
+
+ <span class="reserved">if</span> (!tinyMCE.isInstance(inst))
+ continue;
+
+ inst.switchSettings();
+
+ <span class="reserved">for</span> (i=0; i<formObj.elements.length; i++) {
+ <span class="reserved">if</span> (inst.formTargetElementId == formObj.elements[i].name)
+ inst.getBody().innerHTML = inst.startContent;
+ }
+ }
+ },
+
+ <span class="comment">/**
+ * Executes a command on a specific editor instance by id.
+ *
+ * <span class="attrib">@param</span> {string} editor_id TinyMCE editor control instance id to perform comman on.
+ * <span class="attrib">@param</span> {string} command Command name to execute, for example mceLink or Bold.
+ * <span class="attrib">@param</span> {boolean} user_interface True/false state if a UI (dialog) should be presented or not.
+ * <span class="attrib">@param</span> {object} value Optional command value, this can be anything.
+ * <span class="attrib">@param</span> {boolean} focus True/false if the editor instance should be focused first.
+ */</span>
+ execInstanceCommand : <span class="reserved">function</span>(editor_id, command, user_interface, value, focus) {
+ var inst = tinyMCE.getInstanceById(editor_id);
+ <span class="reserved">if</span> (inst) {
+ <span class="reserved">if</span> (typeof(focus) == <span class="literal">"undefined"</span>)
+ focus = true;
+
+ <span class="reserved">if</span> (focus)
+ inst.contentWindow.focus();
+
+ <span class="comment">// Reset design mode if lost</span>
+ inst.autoResetDesignMode();
+
+ <span class="reserved">this</span>.selectedElement = inst.getFocusElement();
+ <span class="reserved">this</span>.selectedInstance = inst;
+ tinyMCE.execCommand(command, user_interface, value);
+
+ <span class="comment">// Cancel event so it doesn't call onbeforeonunlaod</span>
+ <span class="reserved">if</span> (tinyMCE.isMSIE && window.event != null)
+ tinyMCE.cancelEvent(window.event);
+ }
+ },
+
+ <span class="comment">/**
+ * Executes a command on the selected or last selected TinyMCE editor control instance. This function also handles
+ * some non instance specific commands like mceAddControl, mceRemoveControl, mceHelp or mceFocus.
+ *
+ * <span class="attrib">@param</span> {string} command Command name to execute, for example mceLink or Bold.
+ * <span class="attrib">@param</span> {boolean} user_interface True/false state if a UI (dialog) should be presented or not.
+ * <span class="attrib">@param</span> {object} value Optional command value, this can be anything.
+ */</span>
+ execCommand : <span class="reserved">function</span>(command, user_interface, value) {
+ <span class="comment">// Default input</span>
+ user_interface = user_interface ? user_interface : false;
+ value = value ? value : null;
+
+ <span class="reserved">if</span> (tinyMCE.selectedInstance)
+ tinyMCE.selectedInstance.switchSettings();
+
+ switch (command) {
+ case <span class="literal">'mceHelp'</span>:
+ tinyMCE.openWindow({
+ file : <span class="literal">'about.htm'</span>,
+ width : 480,
+ height : 380
+ }, {
+ tinymce_version : tinyMCE.majorVersion + <span class="literal">"."</span> + tinyMCE.minorVersion,
+ tinymce_releasedate : tinyMCE.releaseDate,
+ inline : <span class="literal">"yes"</span>
+ });
+ <span class="reserved">return</span>;
+
+ case <span class="literal">'mceFocus'</span>:
+ var inst = tinyMCE.getInstanceById(value);
+ <span class="reserved">if</span> (inst)
+ inst.contentWindow.focus();
+ <span class="reserved">return</span>;
+
+ case <span class="literal">"mceAddControl"</span>:
+ case <span class="literal">"mceAddEditor"</span>:
+ tinyMCE.addMCEControl(tinyMCE._getElementById(value), value);
+ <span class="reserved">return</span>;
+
+ case <span class="literal">"mceAddFrameControl"</span>:
+ tinyMCE.addMCEControl(tinyMCE._getElementById(value[<span class="literal">'element'</span>], value[<span class="literal">'document'</span>]), value[<span class="literal">'element'</span>], value[<span class="literal">'document'</span>]);
+ <span class="reserved">return</span>;
+
+ case <span class="literal">"mceRemoveControl"</span>:
+ case <span class="literal">"mceRemoveEditor"</span>:
+ tinyMCE.removeMCEControl(value);
+ <span class="reserved">return</span>;
+
+ case <span class="literal">"mceResetDesignMode"</span>:
+ <span class="comment">// Resets the designmode state of the editors in Gecko</span>
+ <span class="reserved">if</span> (!tinyMCE.isMSIE) {
+ <span class="reserved">for</span> (var n in tinyMCE.instances) {
+ <span class="reserved">if</span> (!tinyMCE.isInstance(tinyMCE.instances[n]))
+ continue;
+
+ try {
+ tinyMCE.instances[n].getDoc().designMode = <span class="literal">"on"</span>;
+ } catch (e) {
+ <span class="comment">// Ignore any errors</span>
+ }
+ }
+ }
+
+ <span class="reserved">return</span>;
+ }
+
+ <span class="reserved">if</span> (<span class="reserved">this</span>.selectedInstance) {
+ <span class="reserved">this</span>.selectedInstance.execCommand(command, user_interface, value);
+ } <span class="reserved">else</span> <span class="reserved">if</span> (tinyMCE.settings[<span class="literal">'focus_alert'</span>])
+ alert(tinyMCELang[<span class="literal">'lang_focus_alert'</span>]);
+ },
+
+ <span class="comment">/**
+ * Creates a iframe editor container for the specified element.
+ *
+ * <span class="attrib">@param</span> {HTMLElement} replace_element Element to replace with iframe element.
+ * <span class="attrib">@param</span> {DOMDocument} doc Optional document to use with iframe replacement.
+ * <span class="attrib">@param</span> {DOMWindow} win Optional window to use with iframe replacement.
+ * <span class="attrib">@private</span>
+ */</span>
+ _createIFrame : <span class="reserved">function</span>(replace_element, doc, win) {
+ var iframe, id = replace_element.getAttribute(<span class="literal">"id"</span>);
+ var aw, ah;
+
+ <span class="reserved">if</span> (typeof(doc) == <span class="literal">"undefined"</span>)
+ doc = document;
+
+ <span class="reserved">if</span> (typeof(win) == <span class="literal">"undefined"</span>)
+ win = window;
+
+ iframe = doc.createElement(<span class="literal">"iframe"</span>);
+
+ aw = <span class="literal">""</span> + tinyMCE.settings[<span class="literal">'area_width'</span>];
+ ah = <span class="literal">""</span> + tinyMCE.settings[<span class="literal">'area_height'</span>];
+
+ <span class="reserved">if</span> (aw.indexOf(<span class="literal">'%'</span>) == -1) {
+ aw = parseInt(aw);
+ aw = aw < 0 ? 300 : aw;
+ aw = aw + <span class="literal">"px"</span>;
+ }
+
+ <span class="reserved">if</span> (ah.indexOf(<span class="literal">'%'</span>) == -1) {
+ ah = parseInt(ah);
+ ah = ah < 0 ? 240 : ah;
+ ah = ah + <span class="literal">"px"</span>;
+ }
+
+ iframe.setAttribute(<span class="literal">"id"</span>, id);
+ iframe.setAttribute(<span class="literal">"className"</span>, <span class="literal">"mceEditorIframe"</span>);
+ iframe.setAttribute(<span class="literal">"border"</span>, <span class="literal">"0"</span>);
+ iframe.setAttribute(<span class="literal">"frameBorder"</span>, <span class="literal">"0"</span>);
+ iframe.setAttribute(<span class="literal">"marginWidth"</span>, <span class="literal">"0"</span>);
+ iframe.setAttribute(<span class="literal">"marginHeight"</span>, <span class="literal">"0"</span>);
+ iframe.setAttribute(<span class="literal">"leftMargin"</span>, <span class="literal">"0"</span>);
+ iframe.setAttribute(<span class="literal">"topMargin"</span>, <span class="literal">"0"</span>);
+ iframe.setAttribute(<span class="literal">"width"</span>, aw);
+ iframe.setAttribute(<span class="literal">"height"</span>, ah);
+ iframe.setAttribute(<span class="literal">"allowtransparency"</span>, <span class="literal">"true"</span>);
+
+ <span class="reserved">if</span> (tinyMCE.settings[<span class="literal">"auto_resize"</span>])
+ iframe.setAttribute(<span class="literal">"scrolling"</span>, <span class="literal">"no"</span>);
+
+ <span class="comment">// Must have a src element in MSIE HTTPs breaks aswell as absoute URLs</span>
+ <span class="reserved">if</span> (tinyMCE.isMSIE && !tinyMCE.isOpera)
+ iframe.setAttribute(<span class="literal">"src"</span>, <span class="reserved">this</span>.settings[<span class="literal">'default_document'</span>]);
+
+ iframe.style.width = aw;
+ iframe.style.height = ah;
+
+ <span class="comment">// MSIE 5.0 issue</span>
+ <span class="reserved">if</span> (tinyMCE.isMSIE && !tinyMCE.isOpera)
+ replace_element.outerHTML = iframe.outerHTML;
+ <span class="reserved">else</span>
+ replace_element.parentNode.replaceChild(iframe, replace_element);
+
+ <span class="reserved">if</span> (tinyMCE.isMSIE && !tinyMCE.isOpera)
+ <span class="reserved">return</span> win.frames[id];
+ <span class="reserved">else</span>
+ <span class="reserved">return</span> iframe;
+ },
+
+ <span class="comment">/**
+ * Setups the contents of TinyMCE editor instance and fills it with contents.
+ *
+ * <span class="attrib">@param</span> {string} editor_id TinyMCE editor instance control id to fill.
+ */</span>
+ setupContent : <span class="reserved">function</span>(editor_id) {
+ var inst = tinyMCE.instances[editor_id];
+ var doc = inst.getDoc();
+ var head = doc.getElementsByTagName(<span class="literal">'head'</span>).item(0);
+ var content = inst.startContent;
+
+ inst.switchSettings();
+
+ <span class="comment">// Not loaded correctly hit it again, Mozilla bug #997860</span>
+ <span class="reserved">if</span> (!tinyMCE.isMSIE && tinyMCE.getParam(<span class="literal">"setupcontent_reload"</span>, false) && doc.title != <span class="literal">"blank_page"</span>) {
+ <span class="comment">// This part will remove the designMode status</span>
+ <span class="comment">// Failes first time in Firefox 1.5b2 on Mac</span>
+ try {doc.location.href = tinyMCE.baseURL + <span class="literal">"/blank.htm"</span>;} catch (ex) {}
+ window.setTimeout(<span class="literal">"tinyMCE.setupContent('"</span> + editor_id + <span class="literal">"');"</span>, 1000);
+ <span class="reserved">return</span>;
+ }
+
+ <span class="reserved">if</span> (!head) {
+ window.setTimeout(<span class="literal">"tinyMCE.setupContent('"</span> + editor_id + <span class="literal">"');"</span>, 10);
+ <span class="reserved">return</span>;
+ }
+
+ <span class="comment">// Import theme specific content CSS the user specific</span>
+ tinyMCE.importCSS(inst.getDoc(), tinyMCE.baseURL + <span class="literal">"/themes/"</span> + inst.settings[<span class="literal">'theme'</span>] + <span class="literal">"/css/editor_content.css"</span>);
+ tinyMCE.importCSS(inst.getDoc(), inst.settings[<span class="literal">'content_css'</span>]);
+ tinyMCE.dispatchCallback(inst, <span class="literal">'init_instance_callback'</span>, <span class="literal">'initInstance'</span>, inst);
+
+ <span class="comment">// Setup keyboard shortcuts</span>
+ <span class="reserved">if</span> (tinyMCE.getParam(<span class="literal">'custom_undo_redo_keyboard_shortcuts'</span>)) {
+ inst.addShortcut(<span class="literal">'ctrl'</span>, <span class="literal">'z'</span>, <span class="literal">'lang_undo_desc'</span>, <span class="literal">'Undo'</span>);
+ inst.addShortcut(<span class="literal">'ctrl'</span>, <span class="literal">'y'</span>, <span class="literal">'lang_redo_desc'</span>, <span class="literal">'Redo'</span>);
+ }
+
+ <span class="comment">// Add default shortcuts for gecko</span>
+ <span class="reserved">if</span> (tinyMCE.isGecko) {
+ inst.addShortcut(<span class="literal">'ctrl'</span>, <span class="literal">'b'</span>, <span class="literal">'lang_bold_desc'</span>, <span class="literal">'Bold'</span>);
+ inst.addShortcut(<span class="literal">'ctrl'</span>, <span class="literal">'i'</span>, <span class="literal">'lang_italic_desc'</span>, <span class="literal">'Italic'</span>);
+ inst.addShortcut(<span class="literal">'ctrl'</span>, <span class="literal">'u'</span>, <span class="literal">'lang_underline_desc'</span>, <span class="literal">'Underline'</span>);
+ }
+
+ <span class="comment">// Setup span styles</span>
+ <span class="reserved">if</span> (tinyMCE.getParam(<span class="literal">"convert_fonts_to_spans"</span>))
+ inst.getDoc().body.setAttribute(<span class="literal">'id'</span>, <span class="literal">'mceSpanFonts'</span>);
+
+ <span class="reserved">if</span> (tinyMCE.settings[<span class="literal">'nowrap'</span>])
+ doc.body.style.whiteSpace = <span class="literal">"nowrap"</span>;
+
+ doc.body.dir = <span class="reserved">this</span>.settings[<span class="literal">'directionality'</span>];
+ doc.editorId = editor_id;
+
+ <span class="comment">// Add on document element in Mozilla</span>
+ <span class="reserved">if</span> (!tinyMCE.isMSIE)
+ doc.documentElement.editorId = editor_id;
+
+ inst.setBaseHREF(tinyMCE.settings[<span class="literal">'base_href'</span>]);
+
+ <span class="comment">// Replace new line characters to BRs</span>
+ <span class="reserved">if</span> (tinyMCE.settings[<span class="literal">'convert_newlines_to_brs'</span>]) {
+ content = tinyMCE.regexpReplace(content, <span class="literal">"\r\n"</span>, <span class="literal">"<br />"</span>, <span class="literal">"gi"</span>);
+ content = tinyMCE.regexpReplace(content, <span class="literal">"\r"</span>, <span class="literal">"<br />"</span>, <span class="literal">"gi"</span>);
+ content = tinyMCE.regexpReplace(content, <span class="literal">"\n"</span>, <span class="literal">"<br />"</span>, <span class="literal">"gi"</span>);
+ }
+
+ <span class="comment">// Open closed anchors</span>
+ <span class="comment">// content = content.replace(new RegExp('<a(.*?)/>', 'gi'), '<a$1></a>');</span>
+
+ <span class="comment">// Call custom cleanup code</span>
+ content = tinyMCE.storeAwayURLs(content);
+ content = tinyMCE._customCleanup(inst, <span class="literal">"insert_to_editor"</span>, content);
+
+ <span class="reserved">if</span> (tinyMCE.isMSIE) {
+ <span class="comment">// Ugly!!!</span>
+ window.setInterval(<span class="literal">'try{tinyMCE.getCSSClasses(tinyMCE.instances["'</span> + editor_id + <span class="literal">'"].getDoc(), "'</span> + editor_id + <span class="literal">'");}catch(e){}'</span>, 500);
+
+ <span class="reserved">if</span> (tinyMCE.settings[<span class="literal">"force_br_newlines"</span>])
+ doc.styleSheets[0].addRule(<span class="literal">"p"</span>, <span class="literal">"margin: 0;"</span>);
+
+ var body = inst.getBody();
+ body.editorId = editor_id;
+ }
+
+ content = tinyMCE.cleanupHTMLCode(content);
+
+ <span class="comment">// Fix for bug #958637</span>
+ <span class="reserved">if</span> (!tinyMCE.isMSIE) {
+ var contentElement = inst.getDoc().createElement(<span class="literal">"body"</span>);
+ var doc = inst.getDoc();
+
+ contentElement.innerHTML = content;
+
+ <span class="comment">// Remove weridness!</span>
+ <span class="reserved">if</span> (tinyMCE.isGecko && tinyMCE.settings[<span class="literal">'remove_lt_gt'</span>])
+ content = content.replace(new RegExp(<span class="literal">'<>'</span>, <span class="literal">'g'</span>), <span class="literal">""</span>);
+
+ <span class="reserved">if</span> (tinyMCE.settings[<span class="literal">'cleanup_on_startup'</span>])
+ tinyMCE.setInnerHTML(inst.getBody(), tinyMCE._cleanupHTML(inst, doc, <span class="reserved">this</span>.settings, contentElement));
+ <span class="reserved">else</span> {
+ <span class="comment">// Convert all strong/em to b/i</span>
+ content = tinyMCE.regexpReplace(content, <span class="literal">"<strong"</span>, <span class="literal">"<b"</span>, <span class="literal">"gi"</span>);
+ content = tinyMCE.regexpReplace(content, <span class="literal">"<em(/?)>"</span>, <span class="literal">"<i$1>"</span>, <span class="literal">"gi"</span>);
+ content = tinyMCE.regexpReplace(content, <span class="literal">"<em "</span>, <span class="literal">"<i "</span>, <span class="literal">"gi"</span>);
+ content = tinyMCE.regexpReplace(content, <span class="literal">"</strong>"</span>, <span class="literal">"</b>"</span>, <span class="literal">"gi"</span>);
+ content = tinyMCE.regexpReplace(content, <span class="literal">"</em>"</span>, <span class="literal">"</i>"</span>, <span class="literal">"gi"</span>);
+ tinyMCE.setInnerHTML(inst.getBody(), content);
+ }
+
+ tinyMCE.convertAllRelativeURLs(inst.getBody());
+ } <span class="reserved">else</span> {
+ <span class="reserved">if</span> (tinyMCE.settings[<span class="literal">'cleanup_on_startup'</span>]) {
+ tinyMCE._setHTML(inst.getDoc(), content);
+
+ <span class="comment">// Produces permission denied error in MSIE 5.5</span>
+ eval(<span class="literal">'try {tinyMCE.setInnerHTML(inst.getBody(), tinyMCE._cleanupHTML(inst, inst.contentDocument, this.settings, inst.getBody()));} catch(e) {}'</span>);
+ } <span class="reserved">else</span>
+ tinyMCE._setHTML(inst.getDoc(), content);
+ }
+
+ <span class="comment">// Fix for bug #957681</span>
+ <span class="comment">//inst.getDoc().designMode = inst.getDoc().designMode;</span>
+
+ <span class="comment">// Setup element references</span>
+ var parentElm = inst.targetDoc.getElementById(inst.editorId + <span class="literal">'_parent'</span>);
+ inst.formElement = tinyMCE.isGecko ? parentElm.previousSibling : parentElm.nextSibling;
+
+ tinyMCE.handleVisualAid(inst.getBody(), true, tinyMCE.settings[<span class="literal">'visual'</span>], inst);
+ tinyMCE.dispatchCallback(inst, <span class="literal">'setupcontent_callback'</span>, <span class="literal">'setupContent'</span>, editor_id, inst.getBody(), inst.getDoc());
+
+ <span class="comment">// Re-add design mode on mozilla</span>
+ <span class="reserved">if</span> (!tinyMCE.isMSIE)
+ tinyMCE.addEventHandlers(inst);
+
+ <span class="comment">// Add blur handler</span>
+ <span class="reserved">if</span> (tinyMCE.isMSIE) {
+ tinyMCE.addEvent(inst.getBody(), <span class="literal">"blur"</span>, TinyMCE_Engine.<span class="reserved">prototype</span>._eventPatch);
+ tinyMCE.addEvent(inst.getBody(), <span class="literal">"beforedeactivate"</span>, TinyMCE_Engine.<span class="reserved">prototype</span>._eventPatch); <span class="comment">// Bug #1439953</span>
+
+ <span class="comment">// Workaround for drag drop/copy paste base href bug</span>
+ <span class="reserved">if</span> (!tinyMCE.isOpera) {
+ tinyMCE.addEvent(doc.body, <span class="literal">"mousemove"</span>, TinyMCE_Engine.<span class="reserved">prototype</span>.onMouseMove);
+ tinyMCE.addEvent(doc.body, <span class="literal">"beforepaste"</span>, TinyMCE_Engine.<span class="reserved">prototype</span>._eventPatch);
+ tinyMCE.addEvent(doc.body, <span class="literal">"drop"</span>, TinyMCE_Engine.<span class="reserved">prototype</span>._eventPatch);
+ }
+ }
+
+ <span class="comment">// Trigger node change, this call locks buttons for tables and so forth</span>
+ tinyMCE.selectedInstance = inst;
+ tinyMCE.selectedElement = inst.contentWindow.document.body;
+
+ <span class="comment">// Call custom DOM cleanup</span>
+ tinyMCE._customCleanup(inst, <span class="literal">"insert_to_editor_dom"</span>, inst.getBody());
+ tinyMCE._customCleanup(inst, <span class="literal">"setup_content_dom"</span>, inst.getBody());
+ tinyMCE._setEventsEnabled(inst.getBody(), false);
+ tinyMCE.cleanupAnchors(inst.getDoc());
+
+ <span class="reserved">if</span> (tinyMCE.getParam(<span class="literal">"convert_fonts_to_spans"</span>))
+ tinyMCE.convertSpansToFonts(inst.getDoc());
+
+ inst.startContent = tinyMCE.trim(inst.getBody().innerHTML);
+ inst.undoRedo.add({ content : inst.startContent });
+
+ <span class="comment">// Cleanup any mess left from storyAwayURLs</span>
+ <span class="reserved">if</span> (tinyMCE.isGecko) {
+ <span class="comment">// Remove mce_src from textnodes and comments</span>
+ tinyMCE.selectNodes(inst.getBody(), <span class="reserved">function</span>(n) {
+ <span class="reserved">if</span> (n.nodeType == 3 || n.nodeType == 8) {
+ n.nodeValue = n.nodeValue.replace(new RegExp(<span class="literal">'\\smce_src=\"[^\"]*\"'</span>, <span class="literal">'gi'</span>), <span class="literal">""</span>);
+ n.nodeValue = n.nodeValue.replace(new RegExp(<span class="literal">'\\smce_href=\"[^\"]*\"'</span>, <span class="literal">'gi'</span>), <span class="literal">""</span>);
+ }
+
+ <span class="reserved">return</span> false;
+ });
+ }
+
+ <span class="comment">// Cleanup any mess left from storyAwayURLs</span>
+ tinyMCE._removeInternal(inst.getBody());
+
+ tinyMCE.selectedInstance = inst;
+ tinyMCE.triggerNodeChange(false, true);
+ },
+
+ <span class="comment">/**
+ * Stores away the src and href attribute values in separate mce_src and mce_href attributes.
+ * This is needed since both MSIE and Gecko messes with these attributes. The old
+ * src and href will be intact, this simply adds them to a separate attribute.
+ *
+ * <span class="attrib">@param</span> {string} s HTML string to replace src and href attributes in.
+ * <span class="attrib">@return</span> HTML string with replaced src and href attributes.
+ * <span class="attrib">@type</span> string
+ */</span>
+ storeAwayURLs : <span class="reserved">function</span>(s) {
+ <span class="comment">// Remove all mce_src, mce_href and replace them with new ones</span>
+ <span class="comment">// s = s.replace(new RegExp('mce_src\\s*=\\s*\"[^ >\"]*\"', 'gi'), '');</span>
+ <span class="comment">// s = s.replace(new RegExp('mce_href\\s*=\\s*\"[^ >\"]*\"', 'gi'), '');</span>
+
+ <span class="reserved">if</span> (!s.match(/(mce_src|mce_href)/gi, s)) {
+ s = s.replace(new RegExp(<span class="literal">'src\\s*=\\s*\"([^ >\"]*)\"'</span>, <span class="literal">'gi'</span>), <span class="literal">'src="$1" mce_src="$1"'</span>);
+ s = s.replace(new RegExp(<span class="literal">'href\\s*=\\s*\"([^ >\"]*)\"'</span>, <span class="literal">'gi'</span>), <span class="literal">'href="$1" mce_href="$1"'</span>);
+ }
+
+ <span class="reserved">return</span> s;
+ },
+
+ <span class="comment">/**
+ * Removes any internal content inserted by regexps.
+ *
+ * <span class="attrib">@param</span> {DOMNode} n Node to remove internal content from.
+ */</span>
+ _removeInternal : <span class="reserved">function</span>(n) {
+ <span class="reserved">if</span> (tinyMCE.isGecko) {
+ <span class="comment">// Remove mce_src from textnodes and comments</span>
+ tinyMCE.selectNodes(n, <span class="reserved">function</span>(n) {
+ <span class="reserved">if</span> (n.nodeType == 3 || n.nodeType == 8) {
+ n.nodeValue = n.nodeValue.replace(new RegExp(<span class="literal">'\\smce_src=\"[^\"]*\"'</span>, <span class="literal">'gi'</span>), <span class="literal">""</span>);
+ n.nodeValue = n.nodeValue.replace(new RegExp(<span class="literal">'\\smce_href=\"[^\"]*\"'</span>, <span class="literal">'gi'</span>), <span class="literal">""</span>);
+ }
+
+ <span class="reserved">return</span> false;
+ });
+ }
+ },
+
+ <span class="comment">/**
+ * Removes/disables TinyMCE built in form elements such as select boxes for font sizes etc.
+ * These are disabled when the user submits a form so they don't get picked up by the backend script
+ * that intercepts the contents.
+ *
+ * <span class="attrib">@param</span> {HTMLElement} form_obj Form object to loop through for TinyMCE specific form elements.
+ */</span>
+ removeTinyMCEFormElements : <span class="reserved">function</span>(form_obj) {
+ <span class="comment">// Check if form is valid</span>
+ <span class="reserved">if</span> (typeof(form_obj) == <span class="literal">"undefined"</span> || form_obj == null)
+ <span class="reserved">return</span>;
+
+ <span class="comment">// If not a form, find the form</span>
+ <span class="reserved">if</span> (form_obj.nodeName != <span class="literal">"FORM"</span>) {
+ <span class="reserved">if</span> (form_obj.form)
+ form_obj = form_obj.form;
+ <span class="reserved">else</span>
+ form_obj = tinyMCE.getParentElement(form_obj, <span class="literal">"form"</span>);
+ }
+
+ <span class="comment">// Still nothing</span>
+ <span class="reserved">if</span> (form_obj == null)
+ <span class="reserved">return</span>;
+
+ <span class="comment">// Disable all UI form elements that TinyMCE created</span>
+ <span class="reserved">for</span> (var i=0; i<form_obj.elements.length; i++) {
+ var elementId = form_obj.elements[i].name ? form_obj.elements[i].name : form_obj.elements[i].id;
+
+ <span class="reserved">if</span> (elementId.indexOf(<span class="literal">'mce_editor_'</span>) == 0)
+ form_obj.elements[i].disabled = true;
+ }
+ },
+
+ <span class="comment">/**
+ * Event handler function that gets executed each time a event occurs in a TinyMCE editor control instance.
+ * Todo: Fix the return statements so they return true or false.
+ *
+ * <span class="attrib">@param</span> {DOMEvent} e DOM event object reference.
+ * <span class="attrib">@return</span> true - if the event is to be chained, false - if the event chain is to be canceled.
+ * <span class="attrib">@type</span> boolean
+ */</span>
+ handleEvent : <span class="reserved">function</span>(e) {
+ var inst = tinyMCE.selectedInstance;
+
+ <span class="comment">// Remove odd, error</span>
+ <span class="reserved">if</span> (typeof(tinyMCE) == <span class="literal">"undefined"</span>)
+ <span class="reserved">return</span> true;
+
+ <span class="comment">//tinyMCE.debug(e.type + " " + e.target.nodeName + " " + (e.relatedTarget ? e.relatedTarget.nodeName : ""));</span>
+
+ <span class="reserved">if</span> (tinyMCE.executeCallback(tinyMCE.selectedInstance, <span class="literal">'handle_event_callback'</span>, <span class="literal">'handleEvent'</span>, e))
+ <span class="reserved">return</span> false;
+
+ switch (e.type) {
+ case <span class="literal">"beforedeactivate"</span>: <span class="comment">// Was added due to bug #1439953</span>
+ case <span class="literal">"blur"</span>:
+ <span class="reserved">if</span> (tinyMCE.selectedInstance)
+ tinyMCE.selectedInstance.execCommand(<span class="literal">'mceEndTyping'</span>);
+
+ tinyMCE.hideMenus();
+
+ <span class="reserved">return</span>;
+
+ <span class="comment">// Workaround for drag drop/copy paste base href bug</span>
+ case <span class="literal">"drop"</span>:
+ case <span class="literal">"beforepaste"</span>:
+ <span class="reserved">if</span> (tinyMCE.selectedInstance)
+ tinyMCE.selectedInstance.setBaseHREF(null);
+
+ window.setTimeout(<span class="literal">"tinyMCE.selectedInstance.setBaseHREF(tinyMCE.settings['base_href']);"</span>, 1);
+ <span class="reserved">return</span>;
+
+ case <span class="literal">"submit"</span>:
+ tinyMCE.removeTinyMCEFormElements(tinyMCE.isMSIE ? window.event.srcElement : e.target);
+ tinyMCE.triggerSave();
+ tinyMCE.isNotDirty = true;
+ <span class="reserved">return</span>;
+
+ case <span class="literal">"reset"</span>:
+ var formObj = tinyMCE.isMSIE ? window.event.srcElement : e.target;
+
+ <span class="reserved">for</span> (var i=0; i<document.forms.length; i++) {
+ <span class="reserved">if</span> (document.forms[i] == formObj)
+ window.setTimeout(<span class="literal">'tinyMCE.resetForm('</span> + i + <span class="literal">');'</span>, 10);
+ }
+
+ <span class="reserved">return</span>;
+
+ case <span class="literal">"keypress"</span>:
+ <span class="reserved">if</span> (inst && inst.handleShortcut(e))
+ <span class="reserved">return</span> false;
+
+ <span class="reserved">if</span> (e.target.editorId) {
+ tinyMCE.selectedInstance = tinyMCE.instances[e.target.editorId];
+ } <span class="reserved">else</span> {
+ <span class="reserved">if</span> (e.target.ownerDocument.editorId)
+ tinyMCE.selectedInstance = tinyMCE.instances[e.target.ownerDocument.editorId];
+ }
+
+ <span class="reserved">if</span> (tinyMCE.selectedInstance)
+ tinyMCE.selectedInstance.switchSettings();
+
+ <span class="comment">// Insert P element</span>
+ <span class="reserved">if</span> (tinyMCE.isGecko && tinyMCE.settings[<span class="literal">'force_p_newlines'</span>] && e.keyCode == 13 && !e.shiftKey) {
+ <span class="comment">// Insert P element instead of BR</span>
+ <span class="reserved">if</span> (TinyMCE_ForceParagraphs._insertPara(tinyMCE.selectedInstance, e)) {
+ <span class="comment">// Cancel event</span>
+ tinyMCE.execCommand(<span class="literal">"mceAddUndoLevel"</span>);
+ tinyMCE.cancelEvent(e);
+ <span class="reserved">return</span> false;
+ }
+ }
+
+ <span class="comment">// Handle backspace</span>
+ <span class="reserved">if</span> (tinyMCE.isGecko && tinyMCE.settings[<span class="literal">'force_p_newlines'</span>] && (e.keyCode == 8 || e.keyCode == 46) && !e.shiftKey) {
+ <span class="comment">// Insert P element instead of BR</span>
+ <span class="reserved">if</span> (TinyMCE_ForceParagraphs._handleBackSpace(tinyMCE.selectedInstance, e.type)) {
+ <span class="comment">// Cancel event</span>
+ tinyMCE.execCommand(<span class="literal">"mceAddUndoLevel"</span>);
+ tinyMCE.cancelEvent(e);
+ <span class="reserved">return</span> false;
+ }
+ }
+
+ <span class="comment">// Return key pressed</span>
+ <span class="reserved">if</span> (tinyMCE.isMSIE && tinyMCE.settings[<span class="literal">'force_br_newlines'</span>] && e.keyCode == 13) {
+ <span class="reserved">if</span> (e.target.editorId)
+ tinyMCE.selectedInstance = tinyMCE.instances[e.target.editorId];
+
+ <span class="reserved">if</span> (tinyMCE.selectedInstance) {
+ var sel = tinyMCE.selectedInstance.getDoc().selection;
+ var rng = sel.createRange();
+
+ <span class="reserved">if</span> (tinyMCE.getParentElement(rng.parentElement(), <span class="literal">"li"</span>) != null)
+ <span class="reserved">return</span> false;
+
+ <span class="comment">// Cancel event</span>
+ e.returnValue = false;
+ e.cancelBubble = true;
+
+ <span class="comment">// Insert BR element</span>
+ rng.pasteHTML(<span class="literal">"<br />"</span>);
+ rng.collapse(false);
+ rng.select();
+
+ tinyMCE.execCommand(<span class="literal">"mceAddUndoLevel"</span>);
+ tinyMCE.triggerNodeChange(false);
+ <span class="reserved">return</span> false;
+ }
+ }
+
+ <span class="comment">// Backspace or delete</span>
+ <span class="reserved">if</span> (e.keyCode == 8 || e.keyCode == 46) {
+ tinyMCE.selectedElement = e.target;
+ tinyMCE.linkElement = tinyMCE.getParentElement(e.target, <span class="literal">"a"</span>);
+ tinyMCE.imgElement = tinyMCE.getParentElement(e.target, <span class="literal">"img"</span>);
+ tinyMCE.triggerNodeChange(false);
+ }
+
+ <span class="reserved">return</span> false;
+ break;
+
+ case <span class="literal">"keyup"</span>:
+ case <span class="literal">"keydown"</span>:
+ tinyMCE.hideMenus();
+ tinyMCE.hasMouseMoved = false;
+
+ <span class="reserved">if</span> (inst && inst.handleShortcut(e))
+ <span class="reserved">return</span> false;
+
+ <span class="reserved">if</span> (e.target.editorId)
+ tinyMCE.selectedInstance = tinyMCE.instances[e.target.editorId];
+ <span class="reserved">else</span>
+ <span class="reserved">return</span>;
+
+ <span class="reserved">if</span> (tinyMCE.selectedInstance)
+ tinyMCE.selectedInstance.switchSettings();
+
+ var inst = tinyMCE.selectedInstance;
+
+ <span class="comment">// Handle backspace</span>
+ <span class="reserved">if</span> (tinyMCE.isGecko && tinyMCE.settings[<span class="literal">'force_p_newlines'</span>] && (e.keyCode == 8 || e.keyCode == 46) && !e.shiftKey) {
+ <span class="comment">// Insert P element instead of BR</span>
+ <span class="reserved">if</span> (TinyMCE_ForceParagraphs._handleBackSpace(tinyMCE.selectedInstance, e.type)) {
+ <span class="comment">// Cancel event</span>
+ tinyMCE.execCommand(<span class="literal">"mceAddUndoLevel"</span>);
+ e.preventDefault();
+ <span class="reserved">return</span> false;
+ }
+ }
+
+ tinyMCE.selectedElement = null;
+ tinyMCE.selectedNode = null;
+ var elm = tinyMCE.selectedInstance.getFocusElement();
+ tinyMCE.linkElement = tinyMCE.getParentElement(elm, <span class="literal">"a"</span>);
+ tinyMCE.imgElement = tinyMCE.getParentElement(elm, <span class="literal">"img"</span>);
+ tinyMCE.selectedElement = elm;
+
+ <span class="comment">// Update visualaids on tabs</span>
+ <span class="reserved">if</span> (tinyMCE.isGecko && e.type == <span class="literal">"keyup"</span> && e.keyCode == 9)
+ tinyMCE.handleVisualAid(tinyMCE.selectedInstance.getBody(), true, tinyMCE.settings[<span class="literal">'visual'</span>], tinyMCE.selectedInstance);
+
+ <span class="comment">// Fix empty elements on return/enter, check where enter occured</span>
+ <span class="reserved">if</span> (tinyMCE.isMSIE && e.type == <span class="literal">"keydown"</span> && e.keyCode == 13)
+ tinyMCE.enterKeyElement = tinyMCE.selectedInstance.getFocusElement();
+
+ <span class="comment">// Fix empty elements on return/enter</span>
+ <span class="reserved">if</span> (tinyMCE.isMSIE && e.type == <span class="literal">"keyup"</span> && e.keyCode == 13) {
+ var elm = tinyMCE.enterKeyElement;
+ <span class="reserved">if</span> (elm) {
+ var re = new RegExp(<span class="literal">'^HR|IMG|BR$'</span>,<span class="literal">'g'</span>); <span class="comment">// Skip these</span>
+ var dre = new RegExp(<span class="literal">'^H[1-6]$'</span>,<span class="literal">'g'</span>); <span class="comment">// Add double on these</span>
+
+ <span class="reserved">if</span> (!elm.hasChildNodes() && !re.test(elm.nodeName)) {
+ <span class="reserved">if</span> (dre.test(elm.nodeName))
+ elm.innerHTML = <span class="literal">" "</span>;
+ <span class="reserved">else</span>
+ elm.innerHTML = <span class="literal">" "</span>;
+ }
+ }
+ }
+
+ <span class="comment">// Check if it's a position key</span>
+ var keys = tinyMCE.posKeyCodes;
+ var posKey = false;
+ <span class="reserved">for</span> (var i=0; i<keys.length; i++) {
+ <span class="reserved">if</span> (keys[i] == e.keyCode) {
+ posKey = true;
+ break;
+ }
+ }
+
+ <span class="comment">// MSIE custom key handling</span>
+ <span class="reserved">if</span> (tinyMCE.isMSIE && tinyMCE.settings[<span class="literal">'custom_undo_redo'</span>]) {
+ var keys = new Array(8,46); <span class="comment">// Backspace,Delete</span>
+ <span class="reserved">for</span> (var i=0; i<keys.length; i++) {
+ <span class="reserved">if</span> (keys[i] == e.keyCode) {
+ <span class="reserved">if</span> (e.type == <span class="literal">"keyup"</span>)
+ tinyMCE.triggerNodeChange(false);
+ }
+ }
+ }
+
+ <span class="comment">// If Ctrl key</span>
+ <span class="reserved">if</span> (e.keyCode == 17)
+ <span class="reserved">return</span> true;
+
+ <span class="comment">// Handle Undo/Redo when typing content</span>
+
+ <span class="comment">// Start typing (non position key)</span>
+ <span class="reserved">if</span> (!posKey && e.type == <span class="literal">"keyup"</span>)
+ tinyMCE.execCommand(<span class="literal">"mceStartTyping"</span>);
+
+ <span class="comment">// Store undo bookmark</span>
+ <span class="reserved">if</span> (e.type == <span class="literal">"keydown"</span> && (posKey || e.ctrlKey) && inst)
+ inst.undoBookmark = inst.selection.getBookmark();
+
+ <span class="comment">// End typing (position key) or some Ctrl event</span>
+ <span class="reserved">if</span> (e.type == <span class="literal">"keyup"</span> && (posKey || e.ctrlKey))
+ tinyMCE.execCommand(<span class="literal">"mceEndTyping"</span>);
+
+ <span class="reserved">if</span> (posKey && e.type == <span class="literal">"keyup"</span>)
+ tinyMCE.triggerNodeChange(false);
+
+ <span class="reserved">if</span> (tinyMCE.isMSIE && e.ctrlKey)
+ window.setTimeout(<span class="literal">'tinyMCE.triggerNodeChange(false);'</span>, 1);
+ break;
+
+ case <span class="literal">"mousedown"</span>:
+ case <span class="literal">"mouseup"</span>:
+ case <span class="literal">"click"</span>:
+ case <span class="literal">"focus"</span>:
+ tinyMCE.hideMenus();
+
+ <span class="reserved">if</span> (tinyMCE.selectedInstance) {
+ tinyMCE.selectedInstance.switchSettings();
+ tinyMCE.selectedInstance.isFocused = true;
+ }
+
+ <span class="comment">// Check instance event trigged on</span>
+ var targetBody = tinyMCE.getParentElement(e.target, <span class="literal">"body"</span>);
+ <span class="reserved">for</span> (var instanceName in tinyMCE.instances) {
+ <span class="reserved">if</span> (!tinyMCE.isInstance(tinyMCE.instances[instanceName]))
+ continue;
+
+ var inst = tinyMCE.instances[instanceName];
+
+ <span class="comment">// Reset design mode if lost (on everything just in case)</span>
+ inst.autoResetDesignMode();
+
+ <span class="reserved">if</span> (inst.getBody() == targetBody) {
+ tinyMCE.selectedInstance = inst;
+ tinyMCE.selectedElement = e.target;
+ tinyMCE.linkElement = tinyMCE.getParentElement(tinyMCE.selectedElement, <span class="literal">"a"</span>);
+ tinyMCE.imgElement = tinyMCE.getParentElement(tinyMCE.selectedElement, <span class="literal">"img"</span>);
+ break;
+ }
+ }
+
+ <span class="comment">// Add first bookmark location</span>
+ <span class="reserved">if</span> (!tinyMCE.selectedInstance.undoRedo.undoLevels[0].bookmark)
+ tinyMCE.selectedInstance.undoRedo.undoLevels[0].bookmark = tinyMCE.selectedInstance.selection.getBookmark();
+
+ <span class="reserved">if</span> (tinyMCE.isSafari) {
+ tinyMCE.selectedInstance.lastSafariSelection = tinyMCE.selectedInstance.selection.getBookmark();
+ tinyMCE.selectedInstance.lastSafariSelectedElement = tinyMCE.selectedElement;
+
+ var lnk = tinyMCE.getParentElement(tinyMCE.selectedElement, <span class="literal">"a"</span>);
+
+ <span class="comment">// Patch the darned link</span>
+ <span class="reserved">if</span> (lnk && e.type == <span class="literal">"mousedown"</span>) {
+ lnk.setAttribute(<span class="literal">"mce_real_href"</span>, lnk.getAttribute(<span class="literal">"href"</span>));
+ lnk.setAttribute(<span class="literal">"href"</span>, <span class="literal">"javascript:void(0);"</span>);
+ }
+
+ <span class="comment">// Patch back</span>
+ <span class="reserved">if</span> (lnk && e.type == <span class="literal">"click"</span>) {
+ window.setTimeout(<span class="reserved">function</span>() {
+ lnk.setAttribute(<span class="literal">"href"</span>, lnk.getAttribute(<span class="literal">"mce_real_href"</span>));
+ lnk.removeAttribute(<span class="literal">"mce_real_href"</span>);
+ }, 10);
+ }
+ }
+
+ <span class="comment">// Reset selected node</span>
+ <span class="reserved">if</span> (e.type != <span class="literal">"focus"</span>)
+ tinyMCE.selectedNode = null;
+
+ tinyMCE.triggerNodeChange(false);
+ tinyMCE.execCommand(<span class="literal">"mceEndTyping"</span>);
+
+ <span class="reserved">if</span> (e.type == <span class="literal">"mouseup"</span>)
+ tinyMCE.execCommand(<span class="literal">"mceAddUndoLevel"</span>);
+
+ <span class="comment">// Just in case</span>
+ <span class="reserved">if</span> (!tinyMCE.selectedInstance && e.target.editorId)
+ tinyMCE.selectedInstance = tinyMCE.instances[e.target.editorId];
+
+ <span class="reserved">return</span> false;
+ break;
+ }
+ },
+
+ <span class="comment">/**
+ * Returns the HTML code for a normal button control.
+ *
+ * <span class="attrib">@param</span> {string} id Button control id, this will be the suffix for the element id, the prefix is the editor id.
+ * <span class="attrib">@param</span> {string} lang Language variable key name to insert as the title/alt of the button image.
+ * <span class="attrib">@param</span> {string} img Image URL to insert, {$themeurl} and {$pluginurl} will be replaced.
+ * <span class="attrib">@param</span> {string} cmd Command to execute when the user clicks the button.
+ * <span class="attrib">@param</span> {string} ui Optional user interface boolean for command.
+ * <span class="attrib">@param</span> {string} val Optional value for command.
+ * <span class="attrib">@return</span> HTML code for a normal button based in input information.
+ * <span class="attrib">@type</span> string
+ */</span>
+ getButtonHTML : <span class="reserved">function</span>(id, lang, img, cmd, ui, val) {
+ var h = <span class="literal">''</span>, m, x;
+
+ cmd = <span class="literal">'tinyMCE.execInstanceCommand(\'</span>{$editor_id}\<span class="literal">',\'</span><span class="literal">' + cmd + '</span>\<span class="literal">''</span>;
+
+ <span class="reserved">if</span> (typeof(ui) != <span class="literal">"undefined"</span> && ui != null)
+ cmd += <span class="literal">','</span> + ui;
+
+ <span class="reserved">if</span> (typeof(val) != <span class="literal">"undefined"</span> && val != null)
+ cmd += <span class="literal">",'"</span> + val + <span class="literal">"'"</span>;
+
+ cmd += <span class="literal">');'</span>;
+
+ <span class="comment">// Use tilemaps when enabled and found and never in MSIE since it loads the tile each time from cache if cahce is disabled</span>
+ <span class="reserved">if</span> (tinyMCE.getParam(<span class="literal">'button_tile_map'</span>) && (!tinyMCE.isMSIE || tinyMCE.isOpera) && (m = <span class="reserved">this</span>.buttonMap[id]) != null && (tinyMCE.getParam(<span class="literal">"language"</span>) == <span class="literal">"en"</span> || img.indexOf(<span class="literal">'$lang'</span>) == -1)) {
+ <span class="comment">// Tiled button</span>
+ x = 0 - (m * 20) == 0 ? <span class="literal">'0'</span> : 0 - (m * 20);
+ h += <span class="literal">'<a id="{$editor_id}_'</span> + id + <span class="literal">'" href="javascript:'</span> + cmd + <span class="literal">'" onclick="'</span> + cmd + <span class="literal">'return false;" onmousedown="return false;" class="mceTiledButton mceButtonNormal" target="_self">'</span>;
+ h += <span class="literal">'<img src="{$themeurl}/images/spacer.gif" style="background-position: '</span> + x + <span class="literal">'px 0" title="{$'</span> + lang + <span class="literal">'}" />'</span>;
+ h += <span class="literal">'</a>'</span>;
+ } <span class="reserved">else</span> {
+ <span class="comment">// Normal button</span>
+ h += <span class="literal">'<a id="{$editor_id}_'</span> + id + <span class="literal">'" href="javascript:'</span> + cmd + <span class="literal">'" onclick="'</span> + cmd + <span class="literal">'return false;" onmousedown="return false;" class="mceButtonNormal" target="_self">'</span>;
+ h += <span class="literal">'<img src="'</span> + img + <span class="literal">'" title="{$'</span> + lang + <span class="literal">'}" />'</span>;
+ h += <span class="literal">'</a>'</span>;
+ }
+
+ <span class="reserved">return</span> h;
+ },
+
+ <span class="comment">/**
+ * Adds a list of buttons available in the tiled button image used by the button_tile_map option.
+ *
+ * <span class="attrib">@param</span> {string} m Comma separated list of buttons that are available in tiled image.
+ */</span>
+ addButtonMap : <span class="reserved">function</span>(m) {
+ var i, a = m.replace(/\s+/, <span class="literal">''</span>).split(<span class="literal">','</span>);
+
+ <span class="reserved">for</span> (i=0; i<a.length; i++)
+ <span class="reserved">this</span>.buttonMap[a[i]] = i;
+ },
+
+ <span class="comment">/**
+ * Piggyback onsubmit event handler function, this will remove/hide the TinyMCE specific form elements
+ * call triggerSave to fill the textarea with the correct contents then call the old piggy backed event handler.
+ */</span>
+ submitPatch : <span class="reserved">function</span>() {
+ tinyMCE.removeTinyMCEFormElements(<span class="reserved">this</span>);
+ tinyMCE.triggerSave();
+ <span class="reserved">this</span>.mceOldSubmit();
+ tinyMCE.isNotDirty = true;
+ },
+
+ <span class="comment">/**
+ * Gets executed when the page loads or get intitialized. This function will then convert all textareas/divs that
+ * is to be converted into TinyMCE editor controls.
+ *
+ * <span class="attrib">@return</span> true - if the event is to be chained, false - if the event chain is to be canceled.
+ * <span class="attrib">@type</span> boolean
+ */</span>
+ onLoad : <span class="reserved">function</span>() {
+ <span class="reserved">if</span> (tinyMCE.isMSIE && !tinyMCE.isOpera && window.event.type == <span class="literal">"readystatechange"</span> && document.readyState != <span class="literal">"complete"</span>)
+ <span class="reserved">return</span> true;
+
+ <span class="reserved">if</span> (tinyMCE.isLoaded)
+ <span class="reserved">return</span> true;
+
+ tinyMCE.isLoaded = true;
+
+ tinyMCE.dispatchCallback(null, <span class="literal">'onpageload'</span>, <span class="literal">'onPageLoad'</span>);
+
+ <span class="reserved">for</span> (var c=0; c<tinyMCE.configs.length; c++) {
+ tinyMCE.settings = tinyMCE.configs[c];
+
+ var selector = tinyMCE.getParam(<span class="literal">"editor_selector"</span>);
+ var deselector = tinyMCE.getParam(<span class="literal">"editor_deselector"</span>);
+ var elementRefAr = new Array();
+
+ <span class="comment">// Add submit triggers</span>
+ <span class="reserved">if</span> (document.forms && tinyMCE.settings[<span class="literal">'add_form_submit_trigger'</span>] && !tinyMCE.submitTriggers) {
+ <span class="reserved">for</span> (var i=0; i<document.forms.length; i++) {
+ var form = document.forms[i];
+
+ tinyMCE.addEvent(form, <span class="literal">"submit"</span>, TinyMCE_Engine.<span class="reserved">prototype</span>.handleEvent);
+ tinyMCE.addEvent(form, <span class="literal">"reset"</span>, TinyMCE_Engine.<span class="reserved">prototype</span>.handleEvent);
+ tinyMCE.submitTriggers = true; <span class="comment">// Do it only once</span>
+
+ <span class="comment">// Patch the form.submit function</span>
+ <span class="reserved">if</span> (tinyMCE.settings[<span class="literal">'submit_patch'</span>]) {
+ try {
+ form.mceOldSubmit = form.submit;
+ form.submit = TinyMCE_Engine.<span class="reserved">prototype</span>.submitPatch;
+ } catch (e) {
+ <span class="comment">// Do nothing</span>
+ }
+ }
+ }
+ }
+
+ <span class="comment">// Add editor instances based on mode</span>
+ var mode = tinyMCE.settings[<span class="literal">'mode'</span>];
+ switch (mode) {
+ case <span class="literal">"exact"</span>:
+ var elements = tinyMCE.getParam(<span class="literal">'elements'</span>, <span class="literal">''</span>, true, <span class="literal">','</span>);
+
+ <span class="reserved">for</span> (var i=0; i<elements.length; i++) {
+ var element = tinyMCE._getElementById(elements[i]);
+ var trigger = element ? element.getAttribute(tinyMCE.settings[<span class="literal">'textarea_trigger'</span>]) : <span class="literal">""</span>;
+
+ <span class="reserved">if</span> (tinyMCE.getAttrib(element, <span class="literal">"class"</span>).indexOf(deselector) != -1)
+ continue;
+
+ <span class="reserved">if</span> (trigger == <span class="literal">"false"</span>)
+ continue;
+
+ <span class="reserved">if</span> ((tinyMCE.settings[<span class="literal">'ask'</span>] || tinyMCE.settings[<span class="literal">'convert_on_click'</span>]) && element) {
+ elementRefAr[elementRefAr.length] = element;
+ continue;
+ }
+
+ <span class="reserved">if</span> (element)
+ tinyMCE.addMCEControl(element, elements[i]);
+ <span class="reserved">else</span> <span class="reserved">if</span> (tinyMCE.settings[<span class="literal">'debug'</span>])
+ alert(<span class="literal">"Error: Could not find element by id or name: "</span> + elements[i]);
+ }
+ break;
+
+ case <span class="literal">"specific_textareas"</span>:
+ case <span class="literal">"textareas"</span>:
+ var nodeList = document.getElementsByTagName(<span class="literal">"textarea"</span>);
+
+ <span class="reserved">for</span> (var i=0; i<nodeList.length; i++) {
+ var elm = nodeList.item(i);
+ var trigger = elm.getAttribute(tinyMCE.settings[<span class="literal">'textarea_trigger'</span>]);
+
+ <span class="reserved">if</span> (selector != <span class="literal">''</span> && tinyMCE.getAttrib(elm, <span class="literal">"class"</span>).indexOf(selector) == -1)
+ continue;
+
+ <span class="reserved">if</span> (selector != <span class="literal">''</span>)
+ trigger = selector != <span class="literal">""</span> ? <span class="literal">"true"</span> : <span class="literal">""</span>;
+
+ <span class="reserved">if</span> (tinyMCE.getAttrib(elm, <span class="literal">"class"</span>).indexOf(deselector) != -1)
+ continue;
+
+ <span class="reserved">if</span> ((mode == <span class="literal">"specific_textareas"</span> && trigger == <span class="literal">"true"</span>) || (mode == <span class="literal">"textareas"</span> && trigger != <span class="literal">"false"</span>))
+ elementRefAr[elementRefAr.length] = elm;
+ }
+ break;
+ }
+
+ <span class="reserved">for</span> (var i=0; i<elementRefAr.length; i++) {
+ var element = elementRefAr[i];
+ var elementId = element.name ? element.name : element.id;
+
+ <span class="reserved">if</span> (tinyMCE.settings[<span class="literal">'ask'</span>] || tinyMCE.settings[<span class="literal">'convert_on_click'</span>]) {
+ <span class="comment">// Focus breaks in Mozilla</span>
+ <span class="reserved">if</span> (tinyMCE.isGecko) {
+ var settings = tinyMCE.settings;
+
+ tinyMCE.addEvent(element, <span class="literal">"focus"</span>, <span class="reserved">function</span> (e) {window.setTimeout(<span class="reserved">function</span>() {TinyMCE_Engine.<span class="reserved">prototype</span>.confirmAdd(e, settings);}, 10);});
+
+ <span class="reserved">if</span> (element.nodeName != <span class="literal">"TEXTAREA"</span> && element.nodeName != <span class="literal">"INPUT"</span>)
+ tinyMCE.addEvent(element, <span class="literal">"click"</span>, <span class="reserved">function</span> (e) {window.setTimeout(<span class="reserved">function</span>() {TinyMCE_Engine.<span class="reserved">prototype</span>.confirmAdd(e, settings);}, 10);});
+ <span class="comment">// tinyMCE.addEvent(element, "mouseover", function (e) {window.setTimeout(function() {TinyMCE_Engine.prototype.confirmAdd(e, settings);}, 10);});</span>
+ } <span class="reserved">else</span> {
+ var settings = tinyMCE.settings;
+
+ tinyMCE.addEvent(element, <span class="literal">"focus"</span>, <span class="reserved">function</span> () { TinyMCE_Engine.<span class="reserved">prototype</span>.confirmAdd(null, settings); });
+ tinyMCE.addEvent(element, <span class="literal">"click"</span>, <span class="reserved">function</span> () { TinyMCE_Engine.<span class="reserved">prototype</span>.confirmAdd(null, settings); });
+ <span class="comment">// tinyMCE.addEvent(element, "mouseenter", function () { TinyMCE_Engine.prototype.confirmAdd(null, settings); });</span>
+ }
+ } <span class="reserved">else</span>
+ tinyMCE.addMCEControl(element, elementId);
+ }
+
+ <span class="comment">// Handle auto focus</span>
+ <span class="reserved">if</span> (tinyMCE.settings[<span class="literal">'auto_focus'</span>]) {
+ window.setTimeout(<span class="reserved">function</span> () {
+ var inst = tinyMCE.getInstanceById(tinyMCE.settings[<span class="literal">'auto_focus'</span>]);
+ inst.selection.selectNode(inst.getBody(), true, true);
+ inst.contentWindow.focus();
+ }, 10);
+ }
+
+ tinyMCE.dispatchCallback(null, <span class="literal">'oninit'</span>, <span class="literal">'onInit'</span>);
+ }
+ },
+
+ <span class="comment">/**
+ * Returns true/false if a specific object is a TinyMCE_Control instance or not.
+ *
+ * <span class="attrib">@param</span> {object} o Object to check.
+ * <span class="attrib">@return</span> true/false if it's a control or not.
+ * <span class="attrib">@type</span> boolean
+ */</span>
+ isInstance : <span class="reserved">function</span>(o) {
+ <span class="reserved">return</span> o != null && typeof(o) == <span class="literal">"object"</span> && o.isTinyMCE_Control;
+ },
+
+ <span class="comment">/**
+ * Returns a specific configuration setting or the default value if it wasn't found.
+ *
+ * <span class="attrib">@param</span> {string} name Configuration setting to get.
+ * <span class="attrib">@param</span> {string} default_value Default value to return if it wasn't found.
+ * <span class="attrib">@param</span> {boolean} strip_whitespace Optional remove all whitespace.
+ * <span class="attrib">@param</span> {string} split_chr Split char/regex/string.
+ * <span class="attrib">@return</span> Number, string or other object based in parameter and default_value.
+ * <span class="attrib">@type</span> object
+ */</span>
+ getParam : <span class="reserved">function</span>(name, default_value, strip_whitespace, split_chr) {
+ var value = (typeof(<span class="reserved">this</span>.settings[name]) == <span class="literal">"undefined"</span>) ? default_value : <span class="reserved">this</span>.settings[name];
+
+ <span class="comment">// Fix bool values</span>
+ <span class="reserved">if</span> (value == <span class="literal">"true"</span> || value == <span class="literal">"false"</span>)
+ <span class="reserved">return</span> (value == <span class="literal">"true"</span>);
+
+ <span class="reserved">if</span> (strip_whitespace)
+ value = tinyMCE.regexpReplace(value, <span class="literal">"[ \t\r\n]"</span>, <span class="literal">""</span>);
+
+ <span class="reserved">if</span> (typeof(split_chr) != <span class="literal">"undefined"</span> && split_chr != null) {
+ value = value.split(split_chr);
+ var outArray = new Array();
+
+ <span class="reserved">for</span> (var i=0; i<value.length; i++) {
+ <span class="reserved">if</span> (value[i] && value[i] != <span class="literal">""</span>)
+ outArray[outArray.length] = value[i];
+ }
+
+ value = outArray;
+ }
+
+ <span class="reserved">return</span> value;
+ },
+
+ <span class="comment">/**
+ * Returns a language variable value from the language packs.
+ *
+ * <span class="attrib">@param</span> {string} name Name of the key to retrive.
+ * <span class="attrib">@param</span> {string} default_value Optional default value to return if it wasn't found.
+ * <span class="attrib">@param</span> {boolean} parse_entities Is HTML entities to be resolved or not.
+ * <span class="attrib">@param</span> {Array} va Optional name/value array of variables to replace in language string.
+ * <span class="attrib">@return</span> Language string value could be a number if it's a relative dimenstion.
+ * <span class="attrib">@type</span> object
+ */</span>
+ getLang : <span class="reserved">function</span>(name, default_value, parse_entities, va) {
+ var v = (typeof(tinyMCELang[name]) == <span class="literal">"undefined"</span>) ? default_value : tinyMCELang[name], n;
+
+ <span class="reserved">if</span> (parse_entities)
+ v = tinyMCE.entityDecode(v);
+
+ <span class="reserved">if</span> (va) {
+ <span class="reserved">for</span> (n in va)
+ v = <span class="reserved">this</span>.replaceVar(v, n, va[n]);
+ }
+
+ <span class="reserved">return</span> v;
+ },
+
+ <span class="comment">/**
+ * HTML entity decode a string, replaces < with <.
+ *
+ * <span class="attrib">@param</span> {string} s Entity string to decode into normal string.
+ * <span class="attrib">@return</span> Entity decoded string.
+ * <span class="attrib">@type</span> string
+ */</span>
+ entityDecode : <span class="reserved">function</span>(s) {
+ var e = document.createElement(<span class="literal">"div"</span>);
+ e.innerHTML = s;
+ <span class="reserved">return</span> e.innerHTML;
+ },
+
+ <span class="comment">/**
+ * Adds language items to the global language array.
+ *
+ * <span class="attrib">@param</span> {string} prefix Prefix string to add infront of every array item before adding it.
+ * <span class="attrib">@param</span> {Array} ar Language item array to add to global language array.
+ */</span>
+ addToLang : <span class="reserved">function</span>(prefix, ar) {
+ <span class="reserved">for</span> (var key in ar) {
+ <span class="reserved">if</span> (typeof(ar[key]) == <span class="literal">'function'</span>)
+ continue;
+
+ tinyMCELang[(key.indexOf(<span class="literal">'lang_'</span>) == -1 ? <span class="literal">'lang_'</span> : <span class="literal">''</span>) + (prefix != <span class="literal">''</span> ? (prefix + <span class="literal">"_"</span>) : <span class="literal">''</span>) + key] = ar[key];
+ }
+
+ <span class="comment">// for (var key in ar)</span>
+ <span class="comment">// tinyMCELang[(key.indexOf('lang_') == -1 ? 'lang_' : '') + (prefix != '' ? (prefix + "_") : '') + key] = "|" + ar[key] + "|";</span>
+ },
+
+ <span class="comment">/**
+ * Triggers a nodeChange event to every theme and plugin. This will be executed when the cursor moves or
+ * when a command that modifies the editor contents is executed.
+ *
+ * <span class="attrib">@param</span> {boolean} focus Optional state if the last selected editor instance is to be focused or not.
+ * <span class="attrib">@param</span> {boolean} setup_content Optional state if it's called from setup content function or not.
+ */</span>
+ triggerNodeChange : <span class="reserved">function</span>(focus, setup_content) {
+ <span class="reserved">if</span> (tinyMCE.selectedInstance) {
+ var inst = tinyMCE.selectedInstance;
+ var editorId = inst.editorId;
+ var elm = (typeof(setup_content) != <span class="literal">"undefined"</span> && setup_content) ? tinyMCE.selectedElement : inst.getFocusElement();
+ var undoIndex = -1;
+ var undoLevels = -1;
+ var anySelection = false;
+ var selectedText = inst.selection.getSelectedText();
+
+ <span class="reserved">if</span> (setup_content && tinyMCE.isGecko && inst.isHidden())
+ elm = inst.getBody();
+
+ inst.switchSettings();
+
+ <span class="reserved">if</span> (tinyMCE.settings[<span class="literal">"auto_resize"</span>]) {
+ var doc = inst.getDoc();
+
+ inst.iframeElement.style.width = doc.body.offsetWidth + <span class="literal">"px"</span>;
+ inst.iframeElement.style.height = doc.body.offsetHeight + <span class="literal">"px"</span>;
+ }
+
+ <span class="reserved">if</span> (tinyMCE.selectedElement)
+ anySelection = (tinyMCE.selectedElement.nodeName.toLowerCase() == <span class="literal">"img"</span>) || (selectedText && selectedText.length > 0);
+
+ <span class="reserved">if</span> (tinyMCE.settings[<span class="literal">'custom_undo_redo'</span>]) {
+ undoIndex = inst.undoRedo.undoIndex;
+ undoLevels = inst.undoRedo.undoLevels.length;
+ }
+
+ tinyMCE.dispatchCallback(inst, <span class="literal">'handle_node_change_callback'</span>, <span class="literal">'handleNodeChange'</span>, editorId, elm, undoIndex, undoLevels, inst.visualAid, anySelection, setup_content);
+ }
+
+ <span class="reserved">if</span> (<span class="reserved">this</span>.selectedInstance && (typeof(focus) == <span class="literal">"undefined"</span> || focus))
+ <span class="reserved">this</span>.selectedInstance.contentWindow.focus();
+ },
+
+ <span class="comment">/**
+ * Executes the custom cleanup functions on the specified content.
+ *
+ * <span class="attrib">@param</span> {TinyMCE_Control} inst TinyMCE editor control instance.
+ * <span class="attrib">@param</span> {string} type Event type to call.
+ * <span class="attrib">@param</span> {object} content DOM element or string to pass to handlers depending on type.
+ * <span class="attrib">@return</span> string or DOM element depending on type.
+ * <span class="attrib">@private</span>
+ */</span>
+ _customCleanup : <span class="reserved">function</span>(inst, type, content) {
+ var pl, po, i;
+
+ <span class="comment">// Call custom cleanup</span>
+ var customCleanup = tinyMCE.settings[<span class="literal">'cleanup_callback'</span>];
+ <span class="reserved">if</span> (customCleanup != <span class="literal">""</span> && eval(<span class="literal">"typeof("</span> + customCleanup + <span class="literal">")"</span>) != <span class="literal">"undefined"</span>)
+ content = eval(customCleanup + <span class="literal">"(type, content, inst);"</span>);
+
+ <span class="comment">// Trigger plugin cleanups</span>
+ pl = inst.plugins;
+ <span class="reserved">for</span> (i=0; i<pl.length; i++) {
+ po = tinyMCE.plugins[pl[i]];
+
+ <span class="reserved">if</span> (po && po.cleanup)
+ content = po.cleanup(type, content, inst);
+ }
+
+ <span class="reserved">return</span> content;
+ },
+
+ <span class="comment">/**
+ * Sets the HTML contents of the selected editor instance.
+ *
+ * <span class="attrib">@param</span> {string} h HTML contents to set in the selected instance.
+ * <span class="attrib">@deprecated</span>
+ */</span>
+ setContent : <span class="reserved">function</span>(h) {
+ <span class="reserved">if</span> (tinyMCE.selectedInstance) {
+ tinyMCE.selectedInstance.execCommand(<span class="literal">'mceSetContent'</span>, false, h);
+ tinyMCE.selectedInstance.repaint();
+ }
+ },
+
+ <span class="comment">/**
+ * Loads a theme specific language pack.
+ *
+ * <span class="attrib">@param</span> {string} name Optional name of the theme to load language pack from.
+ */</span>
+ importThemeLanguagePack : <span class="reserved">function</span>(name) {
+ <span class="reserved">if</span> (typeof(name) == <span class="literal">"undefined"</span>)
+ name = tinyMCE.settings[<span class="literal">'theme'</span>];
+
+ tinyMCE.loadScript(tinyMCE.baseURL + <span class="literal">'/themes/'</span> + name + <span class="literal">'/langs/'</span> + tinyMCE.settings[<span class="literal">'language'</span>] + <span class="literal">'.js'</span>);
+ },
+
+ <span class="comment">/**
+ * Loads a plugin specific language pack.
+ *
+ * <span class="attrib">@param</span> {string} name Plugin name/id to load language pack for.
+ * <span class="attrib">@param</span> {string} valid_languages Comma separated list of valid languages for the plugin.
+ */</span>
+ importPluginLanguagePack : <span class="reserved">function</span>(name, valid_languages) {
+ var lang = <span class="literal">"en"</span>, b = tinyMCE.baseURL + <span class="literal">'/plugins/'</span> + name;
+
+ valid_languages = valid_languages.split(<span class="literal">','</span>);
+ <span class="reserved">for</span> (var i=0; i<valid_languages.length; i++) {
+ <span class="reserved">if</span> (tinyMCE.settings[<span class="literal">'language'</span>] == valid_languages[i])
+ lang = tinyMCE.settings[<span class="literal">'language'</span>];
+ }
+
+ <span class="reserved">if</span> (<span class="reserved">this</span>.plugins[name])
+ b = <span class="reserved">this</span>.plugins[name].baseURL;
+
+ tinyMCE.loadScript(b + <span class="literal">'/langs/'</span> + lang + <span class="literal">'.js'</span>);
+ },
+
+ <span class="comment">/**
+ * Replaces language, args and settings variables in a HTML string.
+ *
+ * <span class="attrib">@param</span> {string} h HTML string to replace language variables in.
+ * <span class="attrib">@param</span> {Array} as Optional arguments array to take variables from.
+ * <span class="attrib">@return</span> HTML string with replaced varliables.
+ * <span class="attrib">@type</span> string
+ */</span>
+ applyTemplate : <span class="reserved">function</span>(h, as) {
+ var i, s, ar = h.match(new RegExp(<span class="literal">'\\{\\$[a-z0-9_]+\\}'</span>, <span class="literal">'gi'</span>));
+
+ <span class="reserved">if</span> (ar && ar.length > 0) {
+ <span class="reserved">for</span> (i=ar.length-1; i>=0; i--) {
+ s = ar[i].substring(2, ar[i].length-1);
+
+ <span class="reserved">if</span> (s.indexOf(<span class="literal">'lang_'</span>) == 0 && tinyMCELang[s])
+ h = tinyMCE.replaceVar(h, s, tinyMCELang[s]);
+ <span class="reserved">else</span> <span class="reserved">if</span> (as && as[s])
+ h = tinyMCE.replaceVar(h, s, as[s]);
+ <span class="reserved">else</span> <span class="reserved">if</span> (tinyMCE.settings[s])
+ h = tinyMCE.replaceVar(h, s, tinyMCE.settings[s]);
+ }
+ }
+
+ h = tinyMCE.replaceVar(h, <span class="literal">"themeurl"</span>, tinyMCE.themeURL);
+
+ <span class="reserved">return</span> h;
+ },
+
+ <span class="comment">/**
+ * Replaces a specific variable in the string with a nother string.
+ *
+ * <span class="attrib">@param</span> {string} h String to search in for the variable.
+ * <span class="attrib">@param</span> {string} r Variable name to search for.
+ * <span class="attrib">@param</span> {string} v Value to insert where a variable is found.
+ * <span class="attrib">@return</span> String with replaced variable.
+ * <span class="attrib">@type</span> string
+ */</span>
+ replaceVar : <span class="reserved">function</span>(h, r, v) {
+ <span class="reserved">return</span> h.replace(new RegExp(<span class="literal">'{\\\$'</span> + r + <span class="literal">'}'</span>, <span class="literal">'g'</span>), v);
+ },
+
+ <span class="comment">/**
+ * Opens a popup window based in the specified input data. This function
+ * is used for all popup windows in TinyMCE.
+ *
+ * These are the current template keys: file, width, height, close_previous.
+ *
+ * <span class="attrib">@param</span> {Array} template Popup template data such as with, height etc.
+ * <span class="attrib">@param</span> {Array} args Popup arguments that is to be passed to the popup such as custom data.
+ */</span>
+ openWindow : <span class="reserved">function</span>(template, args) {
+ var html, width, height, x, y, resizable, scrollbars, url;
+
+ args[<span class="literal">'mce_template_file'</span>] = template[<span class="literal">'file'</span>];
+ args[<span class="literal">'mce_width'</span>] = template[<span class="literal">'width'</span>];
+ args[<span class="literal">'mce_height'</span>] = template[<span class="literal">'height'</span>];
+ tinyMCE.windowArgs = args;
+
+ html = template[<span class="literal">'html'</span>];
+ <span class="reserved">if</span> (!(width = parseInt(template[<span class="literal">'width'</span>])))
+ width = 320;
+
+ <span class="reserved">if</span> (!(height = parseInt(template[<span class="literal">'height'</span>])))
+ height = 200;
+
+ <span class="comment">// Add to height in M$ due to SP2 WHY DON'T YOU GUYS IMPLEMENT innerWidth of windows!!</span>
+ <span class="reserved">if</span> (tinyMCE.isMSIE)
+ height += 40;
+ <span class="reserved">else</span>
+ height += 20;
+
+ x = parseInt(screen.width / 2.0) - (width / 2.0);
+ y = parseInt(screen.height / 2.0) - (height / 2.0);
+
+ resizable = (args && args[<span class="literal">'resizable'</span>]) ? args[<span class="literal">'resizable'</span>] : <span class="literal">"no"</span>;
+ scrollbars = (args && args[<span class="literal">'scrollbars'</span>]) ? args[<span class="literal">'scrollbars'</span>] : <span class="literal">"no"</span>;
+
+ <span class="reserved">if</span> (template[<span class="literal">'file'</span>].charAt(0) != <span class="literal">'/'</span> && template[<span class="literal">'file'</span>].indexOf(<span class="literal">'://'</span>) == -1)
+ url = tinyMCE.baseURL + <span class="literal">"/themes/"</span> + tinyMCE.getParam(<span class="literal">"theme"</span>) + <span class="literal">"/"</span> + template[<span class="literal">'file'</span>];
+ <span class="reserved">else</span>
+ url = template[<span class="literal">'file'</span>];
+
+ <span class="comment">// Replace all args as variables in URL</span>
+ <span class="reserved">for</span> (var name in args) {
+ <span class="reserved">if</span> (typeof(args[name]) == <span class="literal">'function'</span>)
+ continue;
+
+ url = tinyMCE.replaceVar(url, name, escape(args[name]));
+ }
+
+ <span class="reserved">if</span> (html) {
+ html = tinyMCE.replaceVar(html, <span class="literal">"css"</span>, <span class="reserved">this</span>.settings[<span class="literal">'popups_css'</span>]);
+ html = tinyMCE.applyTemplate(html, args);
+
+ var win = window.open(<span class="literal">""</span>, <span class="literal">"mcePopup"</span> + new Date().getTime(), <span class="literal">"top="</span> + y + <span class="literal">",left="</span> + x + <span class="literal">",scrollbars="</span> + scrollbars + <span class="literal">",dialog=yes,minimizable="</span> + resizable + <span class="literal">",modal=yes,width="</span> + width + <span class="literal">",height="</span> + height + <span class="literal">",resizable="</span> + resizable);
+ <span class="reserved">if</span> (win == null) {
+ alert(tinyMCELang[<span class="literal">'lang_popup_blocked'</span>]);
+ <span class="reserved">return</span>;
+ }
+
+ win.document.write(html);
+ win.document.close();
+ win.resizeTo(width, height);
+ win.focus();
+ } <span class="reserved">else</span> {
+ <span class="reserved">if</span> ((tinyMCE.isMSIE && !tinyMCE.isOpera) && resizable != <span class="literal">'yes'</span> && tinyMCE.settings[<span class="literal">"dialog_type"</span>] == <span class="literal">"modal"</span>) {
+ height += 10;
+
+ var features = <span class="literal">"resizable:"</span> + resizable
+ + <span class="literal">";scroll:"</span>
+ + scrollbars + <span class="literal">";status:yes;center:yes;help:no;dialogWidth:"</span>
+ + width + <span class="literal">"px;dialogHeight:"</span> + height + <span class="literal">"px;"</span>;
+
+ window.showModalDialog(url, window, features);
+ } <span class="reserved">else</span> {
+ var modal = (resizable == <span class="literal">"yes"</span>) ? <span class="literal">"no"</span> : <span class="literal">"yes"</span>;
+
+ <span class="reserved">if</span> (tinyMCE.isGecko && tinyMCE.isMac)
+ modal = <span class="literal">"no"</span>;
+
+ <span class="reserved">if</span> (template[<span class="literal">'close_previous'</span>] != <span class="literal">"no"</span>)
+ try {tinyMCE.lastWindow.close();} catch (ex) {}
+
+ var win = window.open(url, <span class="literal">"mcePopup"</span> + new Date().getTime(), <span class="literal">"top="</span> + y + <span class="literal">",left="</span> + x + <span class="literal">",scrollbars="</span> + scrollbars + <span class="literal">",dialog="</span> + modal + <span class="literal">",minimizable="</span> + resizable + <span class="literal">",modal="</span> + modal + <span class="literal">",width="</span> + width + <span class="literal">",height="</span> + height + <span class="literal">",resizable="</span> + resizable);
+ <span class="reserved">if</span> (win == null) {
+ alert(tinyMCELang[<span class="literal">'lang_popup_blocked'</span>]);
+ <span class="reserved">return</span>;
+ }
+
+ <span class="reserved">if</span> (template[<span class="literal">'close_previous'</span>] != <span class="literal">"no"</span>)
+ tinyMCE.lastWindow = win;
+
+ eval(<span class="literal">'try { win.resizeTo(width, height); } catch(e) { }'</span>);
+
+ <span class="comment">// Make it bigger if statusbar is forced</span>
+ <span class="reserved">if</span> (tinyMCE.isGecko) {
+ <span class="reserved">if</span> (win.document.defaultView.statusbar.visible)
+ win.resizeBy(0, tinyMCE.isMac ? 10 : 24);
+ }
+
+ win.focus();
+ }
+ }
+ },
+
+ <span class="comment">/**
+ * Closes the specified window. This function is deprecated and should be replaced with
+ * tinyMCEPopup.close();.
+ *
+ * <span class="attrib">@param</span> {DOMWindow} win Window reference to close.
+ * <span class="attrib">@deprecated</span>
+ */</span>
+ closeWindow : <span class="reserved">function</span>(win) {
+ win.close();
+ },
+
+ <span class="comment">/**
+ * Returns the visual aid class string, this will add/remove the visual aid class.
+ *
+ * <span class="attrib">@param</span> {string} class_name Class name value to add/remove visual aid classes from.
+ * <span class="attrib">@param</span> {boolean} state true/false if the classes should be added or removed.
+ * <span class="attrib">@return</span> New class value containing the visual aid classes or not.
+ * <span class="attrib">@type</span> string
+ */</span>
+ getVisualAidClass : <span class="reserved">function</span>(class_name, state) {
+ var aidClass = tinyMCE.settings[<span class="literal">'visual_table_class'</span>];
+
+ <span class="reserved">if</span> (typeof(state) == <span class="literal">"undefined"</span>)
+ state = tinyMCE.settings[<span class="literal">'visual'</span>];
+
+ <span class="comment">// Split</span>
+ var classNames = new Array();
+ var ar = class_name.split(<span class="literal">' '</span>);
+ <span class="reserved">for</span> (var i=0; i<ar.length; i++) {
+ <span class="reserved">if</span> (ar[i] == aidClass)
+ ar[i] = <span class="literal">""</span>;
+
+ <span class="reserved">if</span> (ar[i] != <span class="literal">""</span>)
+ classNames[classNames.length] = ar[i];
+ }
+
+ <span class="reserved">if</span> (state)
+ classNames[classNames.length] = aidClass;
+
+ <span class="comment">// Glue</span>
+ var className = <span class="literal">""</span>;
+ <span class="reserved">for</span> (var i=0; i<classNames.length; i++) {
+ <span class="reserved">if</span> (i > 0)
+ className += <span class="literal">" "</span>;
+
+ className += classNames[i];
+ }
+
+ <span class="reserved">return</span> className;
+ },
+
+ <span class="comment">/**
+ * Adds visual aid classes to all elements that need them recursive in the DOM tree.
+ *
+ * <span class="attrib">@param</span> {HTMLElement} el HTML element to add visual aid classes to.
+ * <span class="attrib">@param</span> {boolean} deep Should they be added to all children aswell.
+ * <span class="attrib">@param</span> {boolean} state Should they be added or removed.
+ * <span class="attrib">@param</span> {TinyMCE_Control} inst TinyMCE editor control instance to add/remove them to/from.
+ */</span>
+ handleVisualAid : <span class="reserved">function</span>(el, deep, state, inst, skip_dispatch) {
+ <span class="reserved">if</span> (!el)
+ <span class="reserved">return</span>;
+
+ <span class="reserved">if</span> (!skip_dispatch)
+ tinyMCE.dispatchCallback(inst, <span class="literal">'handle_visual_aid_callback'</span>, <span class="literal">'handleVisualAid'</span>, el, deep, state, inst);
+
+ var tableElement = null;
+
+ switch (el.nodeName) {
+ case <span class="literal">"TABLE"</span>:
+ var oldW = el.style.width;
+ var oldH = el.style.height;
+ var bo = tinyMCE.getAttrib(el, <span class="literal">"border"</span>);
+
+ bo = bo == <span class="literal">""</span> || bo == <span class="literal">"0"</span> ? true : false;
+
+ tinyMCE.setAttrib(el, <span class="literal">"class"</span>, tinyMCE.getVisualAidClass(tinyMCE.getAttrib(el, <span class="literal">"class"</span>), state && bo));
+
+ el.style.width = oldW;
+ el.style.height = oldH;
+
+ <span class="reserved">for</span> (var y=0; y<el.rows.length; y++) {
+ <span class="reserved">for</span> (var x=0; x<el.rows[y].cells.length; x++) {
+ var cn = tinyMCE.getVisualAidClass(tinyMCE.getAttrib(el.rows[y].cells[x], <span class="literal">"class"</span>), state && bo);
+ tinyMCE.setAttrib(el.rows[y].cells[x], <span class="literal">"class"</span>, cn);
+ }
+ }
+
+ break;
+
+ case <span class="literal">"A"</span>:
+ var anchorName = tinyMCE.getAttrib(el, <span class="literal">"name"</span>);
+
+ <span class="reserved">if</span> (anchorName != <span class="literal">''</span> && state) {
+ el.title = anchorName;
+ el.className = <span class="literal">'mceItemAnchor'</span>;
+ } <span class="reserved">else</span> <span class="reserved">if</span> (anchorName != <span class="literal">''</span> && !state)
+ el.className = <span class="literal">''</span>;
+
+ break;
+ }
+
+ <span class="reserved">if</span> (deep && el.hasChildNodes()) {
+ <span class="reserved">for</span> (var i=0; i<el.childNodes.length; i++)
+ tinyMCE.handleVisualAid(el.childNodes[i], deep, state, inst, true);
+ }
+ },
+
+ <span class="comment">/*
+ applyClassesToFonts : function(doc, size) {
+ var f = doc.getElementsByTagName("font");
+ for (var i=0; i<f.length; i++) {
+ var s = tinyMCE.getAttrib(f[i], "size");
+
+ if (s != "")
+ tinyMCE.setAttrib(f[i], 'class', "mceItemFont" + s);
+ }
+
+ if (typeof(size) != "undefined") {
+ var css = "";
+
+ for (var x=0; x<doc.styleSheets.length; x++) {
+ for (var i=0; i<doc.styleSheets[x].rules.length; i++) {
+ if (doc.styleSheets[x].rules[i].selectorText == '#mceSpanFonts .mceItemFont' + size) {
+ css = doc.styleSheets[x].rules[i].style.cssText;
+ break;
+ }
+ }
+
+ if (css != "")
+ break;
+ }
+
+ if (doc.styleSheets[0].rules[0].selectorText == "FONT")
+ doc.styleSheets[0].removeRule(0);
+
+ doc.styleSheets[0].addRule("FONT", css, 0);
+ }
+ },
+ */</span>
+
+ <span class="comment">/**
+ * Fixes a Gecko specific bug where href, src attribute values gets converted incorrectly
+ * when inserted into editor. This function will replace all src, href with mce_tsrc and mce_thref
+ * to keep the values from chaging when they get inserted.
+ *
+ * <span class="attrib">@param</span> {boolean} m Mode state, true is to replace the src, href attributes to mce_tsrc and mce_thref.
+ * <span class="attrib">@param</span> {HTMLElement} e HTML element to replace them in. (Will be used if m is 0)
+ * <span class="attrib">@param</span> {string} h HTML code to replace them in. (Will be used if m is 1)
+ * <span class="attrib">@return</span> Converted string or the specified HTML value depending on mode.
+ * <span class="attrib">@type</span> string
+ */</span>
+ fixGeckoBaseHREFBug : <span class="reserved">function</span>(m, e, h) {
+ var nl, i, a, n, xsrc, xhref, el;
+
+ <span class="reserved">if</span> (tinyMCE.isGecko) {
+ <span class="reserved">if</span> (m == 1) {
+ h = h.replace(/\ssrc=/gi, <span class="literal">" mce_tsrc="</span>);
+ h = h.replace(/\shref=/gi, <span class="literal">" mce_thref="</span>);
+
+ <span class="reserved">return</span> h;
+ } <span class="reserved">else</span> {
+ el = new Array(<span class="literal">'a'</span>,<span class="literal">'img'</span>,<span class="literal">'select'</span>,<span class="literal">'area'</span>,<span class="literal">'iframe'</span>,<span class="literal">'base'</span>,<span class="literal">'input'</span>,<span class="literal">'script'</span>,<span class="literal">'embed'</span>,<span class="literal">'object'</span>,<span class="literal">'link'</span>);
+
+ <span class="reserved">for</span> (a=0; a<el.length; a++) {
+ n = e.getElementsByTagName(el[a]);
+
+ <span class="reserved">for</span> (i=0; i<n.length; i++) {
+ xsrc = tinyMCE.getAttrib(n[i], <span class="literal">"mce_tsrc"</span>);
+ xhref = tinyMCE.getAttrib(n[i], <span class="literal">"mce_thref"</span>);
+
+ <span class="reserved">if</span> (xsrc != <span class="literal">""</span>) {
+ try {
+ n[i].src = tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings[<span class="literal">'base_href'</span>], xsrc);
+ } catch (e) {
+ <span class="comment">// Ignore, Firefox cast exception if local file wasn't found</span>
+ }
+
+ n[i].removeAttribute(<span class="literal">"mce_tsrc"</span>);
+ }
+
+ <span class="reserved">if</span> (xhref != <span class="literal">""</span>) {
+ try {
+ n[i].href = tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings[<span class="literal">'base_href'</span>], xhref);
+ } catch (e) {
+ <span class="comment">// Ignore, Firefox cast exception if local file wasn't found</span>
+ }
+
+ n[i].removeAttribute(<span class="literal">"mce_thref"</span>);
+ }
+ }
+ }
+
+ el = tinyMCE.selectNodes(e, <span class="reserved">function</span>(n) {
+ <span class="reserved">if</span> (n.nodeType == 3 || n.nodeType == 8) {
+ n.nodeValue = n.nodeValue.replace(/\smce_tsrc=/gi, <span class="literal">" src="</span>);
+ n.nodeValue = n.nodeValue.replace(/\smce_thref=/gi, <span class="literal">" href="</span>);
+ }
+
+ <span class="reserved">return</span> false;
+ });
+ }
+ }
+
+ <span class="reserved">return</span> h;
+ },
+
+ <span class="comment">/**
+ * Sets the HTML code of a specific document.
+ * Todo: Try to merge/remove this one.
+ *
+ * <span class="attrib">@param</span> {DOMDocument} doc DOM document to set the HTML code in.
+ * <span class="attrib">@param</span> {string} html_content HTML contents to set in DOM document.
+ * <span class="attrib">@private</span>
+ */</span>
+ _setHTML : <span class="reserved">function</span>(doc, html_content) {
+ <span class="comment">// Force closed anchors open</span>
+ <span class="comment">//html_content = html_content.replace(new RegExp('<a(.*?)/>', 'gi'), '<a$1></a>');</span>
+
+ html_content = tinyMCE.cleanupHTMLCode(html_content);
+
+ <span class="comment">// Try innerHTML if it fails use pasteHTML in MSIE</span>
+ try {
+ tinyMCE.setInnerHTML(doc.body, html_content);
+ } catch (e) {
+ <span class="reserved">if</span> (<span class="reserved">this</span>.isMSIE)
+ doc.body.createTextRange().pasteHTML(html_content);
+ }
+
+ <span class="comment">// Content duplication bug fix</span>
+ <span class="reserved">if</span> (tinyMCE.isMSIE && tinyMCE.settings[<span class="literal">'fix_content_duplication'</span>]) {
+ <span class="comment">// Remove P elements in P elements</span>
+ var paras = doc.getElementsByTagName(<span class="literal">"P"</span>);
+ <span class="reserved">for</span> (var i=0; i<paras.length; i++) {
+ var node = paras[i];
+ <span class="reserved">while</span> ((node = node.parentNode) != null) {
+ <span class="reserved">if</span> (node.nodeName == <span class="literal">"P"</span>)
+ node.outerHTML = node.innerHTML;
+ }
+ }
+
+ <span class="comment">// Content duplication bug fix (Seems to be word crap)</span>
+ var html = doc.body.innerHTML;
+<span class="comment">/*
+ if (html.indexOf('="mso') != -1) {
+ for (var i=0; i<doc.body.all.length; i++) {
+ var el = doc.body.all[i];
+ el.removeAttribute("className","",0);
+ el.removeAttribute("style","",0);
+ }
+
+ html = doc.body.innerHTML;
+ html = tinyMCE.regexpReplace(html, "<o:p><\/o:p>", "<br />");
+ html = tinyMCE.regexpReplace(html, "<o:p> <\/o:p>", "");
+ html = tinyMCE.regexpReplace(html, "<st1:.*?>", "");
+ html = tinyMCE.regexpReplace(html, "<p><\/p>", "");
+ html = tinyMCE.regexpReplace(html, "<p><\/p>\r\n<p><\/p>", "");
+ html = tinyMCE.regexpReplace(html, "<p> <\/p>", "<br />");
+ html = tinyMCE.regexpReplace(html, "<p>\s*(<p>\s*)?", "<p>");
+ html = tinyMCE.regexpReplace(html, "<\/p>\s*(<\/p>\s*)?", "</p>");
+ }*/</span>
+
+ <span class="comment">// Always set the htmlText output</span>
+ tinyMCE.setInnerHTML(doc.body, html);
+ }
+
+ tinyMCE.cleanupAnchors(doc);
+
+ <span class="reserved">if</span> (tinyMCE.getParam(<span class="literal">"convert_fonts_to_spans"</span>))
+ tinyMCE.convertSpansToFonts(doc);
+ },
+
+ <span class="comment">/**
+ * Returns the editor instance id of a specific form element.
+ *
+ * <span class="attrib">@param</span> {string} form_element Form element name to get instance id for.
+ * <span class="attrib">@return</span> TinyMCE editor instance id or null if it wasn't found.
+ * <span class="attrib">@type</span> string
+ */</span>
+ getEditorId : <span class="reserved">function</span>(form_element) {
+ var inst = <span class="reserved">this</span>.getInstanceById(form_element);
+ <span class="reserved">if</span> (!inst)
+ <span class="reserved">return</span> null;
+
+ <span class="reserved">return</span> inst.editorId;
+ },
+
+ <span class="comment">/**
+ * Returns a TinyMCE editor instance by the specified editor id or null if it wasn't found.
+ *
+ * <span class="attrib">@param</span> {string} editor_id Editor id to get instance for.
+ * <span class="attrib">@return</span> TinyMCE editor control instance or null if it wasn't found.
+ * <span class="attrib">@type</span> TinyMCE_Control
+ */</span>
+ getInstanceById : <span class="reserved">function</span>(editor_id) {
+ var inst = <span class="reserved">this</span>.instances[editor_id];
+ <span class="reserved">if</span> (!inst) {
+ <span class="reserved">for</span> (var n in tinyMCE.instances) {
+ var instance = tinyMCE.instances[n];
+ <span class="reserved">if</span> (!tinyMCE.isInstance(instance))
+ continue;
+
+ <span class="reserved">if</span> (instance.formTargetElementId == editor_id) {
+ inst = instance;
+ break;
+ }
+ }
+ }
+
+ <span class="reserved">return</span> inst;
+ },
+
+ <span class="comment">/**
+ * Queries a command value for a specific command on a specific editor instance.
+ *
+ * <span class="attrib">@param</span> {string} editor_id Editor id to query command value on.
+ * <span class="attrib">@param</span> {string} command Command to query for.
+ * <span class="attrib">@return</span> Command value passed from browser.
+ * <span class="attrib">@type</span> object
+ */</span>
+ queryInstanceCommandValue : <span class="reserved">function</span>(editor_id, command) {
+ var inst = tinyMCE.getInstanceById(editor_id);
+ <span class="reserved">if</span> (inst)
+ <span class="reserved">return</span> inst.queryCommandValue(command);
+
+ <span class="reserved">return</span> false;
+ },
+
+ <span class="comment">/**
+ * Queries a command state for a specific command on a specific editor instance.
+ *
+ * <span class="attrib">@param</span> {string} editor_id Editor id to query command state on.
+ * <span class="attrib">@param</span> {string} command Command to query for.
+ * <span class="attrib">@return</span> Command state passed from browser.
+ * <span class="attrib">@type</span> boolean
+ */</span>
+ queryInstanceCommandState : <span class="reserved">function</span>(editor_id, command) {
+ var inst = tinyMCE.getInstanceById(editor_id);
+ <span class="reserved">if</span> (inst)
+ <span class="reserved">return</span> inst.queryCommandState(command);
+
+ <span class="reserved">return</span> null;
+ },
+
+ <span class="comment">/**
+ * Sets the window argument to be passed to TinyMCE popup.
+ *
+ * <span class="attrib">@param</span> {string} n Window argument name.
+ * <span class="attrib">@param</span> {string} v Window argument value.
+ */</span>
+ setWindowArg : <span class="reserved">function</span>(n, v) {
+ <span class="reserved">this</span>.windowArgs[n] = v;
+ },
+
+ <span class="comment">/**
+ * Returns the window argument to be passed to TinyMCE popup.
+ * Use: tinyMCEPopup.getWindowArg instead.
+ *
+ * <span class="attrib">@param</span> {string} n Window argument name.
+ * <span class="attrib">@return</span> Argument value or default value if it wasn't found.
+ * <span class="attrib">@deprecated</span>
+ */</span>
+ getWindowArg : <span class="reserved">function</span>(n, d) {
+ <span class="reserved">return</span> (typeof(<span class="reserved">this</span>.windowArgs[n]) == <span class="literal">"undefined"</span>) ? d : <span class="reserved">this</span>.windowArgs[n];
+ },
+
+ <span class="comment">/**
+ * Returns a array of CSS classes that is available in a document.
+ * Todo: Fix this one, it's so ugly. :)
+ *
+ * <span class="attrib">@param</span> {string} editor_id Editor id to get CSS classes from.
+ * <span class="attrib">@param</span> {DOMDocument} doc DOM document to get the CSS classes from.
+ * <span class="attrib">@return</span> Array of CSS classes that is available in a document.
+ * <span class="attrib">@type</span> Array
+ */</span>
+ getCSSClasses : <span class="reserved">function</span>(editor_id, doc) {
+ var output = new Array();
+
+ <span class="comment">// Is cached, use that</span>
+ <span class="reserved">if</span> (typeof(tinyMCE.cssClasses) != <span class="literal">"undefined"</span>)
+ <span class="reserved">return</span> tinyMCE.cssClasses;
+
+ <span class="reserved">if</span> (typeof(editor_id) == <span class="literal">"undefined"</span> && typeof(doc) == <span class="literal">"undefined"</span>) {
+ var instance;
+
+ <span class="reserved">for</span> (var instanceName in tinyMCE.instances) {
+ instance = tinyMCE.instances[instanceName];
+ <span class="reserved">if</span> (!tinyMCE.isInstance(instance))
+ continue;
+
+ break;
+ }
+
+ doc = instance.getDoc();
+ }
+
+ <span class="reserved">if</span> (typeof(doc) == <span class="literal">"undefined"</span>) {
+ var instance = tinyMCE.getInstanceById(editor_id);
+ doc = instance.getDoc();
+ }
+
+ <span class="reserved">if</span> (doc) {
+ var styles = doc.styleSheets;
+
+ <span class="reserved">if</span> (styles && styles.length > 0) {
+ <span class="reserved">for</span> (var x=0; x<styles.length; x++) {
+ var csses = null;
+
+ <span class="comment">// Just ignore any errors</span>
+ eval(<span class="literal">"try {var csses = tinyMCE.isMSIE ? doc.styleSheets("</span> + x + <span class="literal">").rules : styles["</span> + x + <span class="literal">"].cssRules;} catch(e) {}"</span>);
+ <span class="reserved">if</span> (!csses)
+ <span class="reserved">return</span> new Array();
+
+ <span class="reserved">for</span> (var i=0; i<csses.length; i++) {
+ var selectorText = csses[i].selectorText;
+
+ <span class="comment">// Can be multiple rules per selector</span>
+ <span class="reserved">if</span> (selectorText) {
+ var rules = selectorText.split(<span class="literal">','</span>);
+ <span class="reserved">for</span> (var c=0; c<rules.length; c++) {
+ var rule = rules[c];
+
+ <span class="comment">// Strip spaces between selectors</span>
+ <span class="reserved">while</span> (rule.indexOf(<span class="literal">' '</span>) == 0)
+ rule = rule.substring(1);
+
+ <span class="comment">// Invalid rule</span>
+ <span class="reserved">if</span> (rule.indexOf(<span class="literal">' '</span>) != -1 || rule.indexOf(<span class="literal">':'</span>) != -1 || rule.indexOf(<span class="literal">'mceItem'</span>) != -1)
+ continue;
+
+ <span class="reserved">if</span> (rule.indexOf(tinyMCE.settings[<span class="literal">'visual_table_class'</span>]) != -1 || rule.indexOf(<span class="literal">'mceEditable'</span>) != -1 || rule.indexOf(<span class="literal">'mceNonEditable'</span>) != -1)
+ continue;
+
+ <span class="comment">// Is class rule</span>
+ <span class="reserved">if</span> (rule.indexOf(<span class="literal">'.'</span>) != -1) {
+ var cssClass = rule.substring(rule.indexOf(<span class="literal">'.'</span>) + 1);
+ var addClass = true;
+
+ <span class="reserved">for</span> (var p=0; p<output.length && addClass; p++) {
+ <span class="reserved">if</span> (output[p] == cssClass)
+ addClass = false;
+ }
+
+ <span class="reserved">if</span> (addClass)
+ output[output.length] = cssClass;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ <span class="comment">// Cache em</span>
+ <span class="reserved">if</span> (output.length > 0)
+ tinyMCE.cssClasses = output;
+
+ <span class="reserved">return</span> output;
+ },
+
+ <span class="comment">/**
+ * Regexp replaces the contents of a string. Use normal replace instead.
+ *
+ * <span class="attrib">@param</span> {string} in_str String to replace in.
+ * <span class="attrib">@param</span> {string} reg_exp Regexp to replace.
+ * <span class="attrib">@param</span> {string} replace_str String to replace with.
+ * <span class="attrib">@param</span> {string} in_str Optional regexp options like "gi".
+ * <span class="attrib">@return</span> Replaced string value.
+ * <span class="attrib">@type</span> string
+ * <span class="attrib">@deprecated</span>
+ */</span>
+ regexpReplace : <span class="reserved">function</span>(in_str, reg_exp, replace_str, opts) {
+ <span class="reserved">if</span> (in_str == null)
+ <span class="reserved">return</span> in_str;
+
+ <span class="reserved">if</span> (typeof(opts) == <span class="literal">"undefined"</span>)
+ opts = <span class="literal">'g'</span>;
+
+ var re = new RegExp(reg_exp, opts);
+ <span class="reserved">return</span> in_str.replace(re, replace_str);
+ },
+
+ <span class="comment">/**
+ * Removes all prefix, suffix whitespace of a string.
+ *
+ * <span class="attrib">@param</span> {string} s String to replace whitespace in.
+ * <span class="attrib">@return</span> Replaced string value.
+ * <span class="attrib">@type</span> string
+ */</span>
+ trim : <span class="reserved">function</span>(s) {
+ <span class="reserved">return</span> s.replace(/^\s*|\s*$/g, <span class="literal">""</span>);
+ },
+
+ <span class="comment">/**
+ * Removes MSIE 5.5 specific event wrapper function form a event string.
+ * This will also remove the event blocker if it's added in front of the event.
+ *
+ * <span class="attrib">@param</span> {string} s String to replace event data in.
+ * <span class="attrib">@return</span> Replaced string value.
+ * <span class="attrib">@type</span> string
+ */</span>
+ cleanupEventStr : <span class="reserved">function</span>(s) {
+ s = <span class="literal">""</span> + s;
+ s = s.replace(<span class="literal">'function anonymous()\n{\n'</span>, <span class="literal">''</span>);
+ s = s.replace(<span class="literal">'\n}'</span>, <span class="literal">''</span>);
+ s = s.replace(/^<span class="reserved">return</span> true;/gi, <span class="literal">''</span>); <span class="comment">// Remove event blocker</span>
+
+ <span class="reserved">return</span> s;
+ },
+
+ <span class="comment">/**
+ * Returns the HTML for the specified control this will loop through
+ * the theme and all plugins inorder to find the control. The callback for each
+ * theme and plugin is called getControlHTML.
+ *
+ * <span class="attrib">@param</span> {string} c Control name/id to get HTML code for.
+ * <span class="attrib">@return</span> HTML code for the specified control or empty string if it wasn't found.
+ * <span class="attrib">@type</span> string
+ */</span>
+ getControlHTML : <span class="reserved">function</span>(c) {
+ var i, l, n, o, v;
+
+ l = tinyMCE.plugins;
+ <span class="reserved">for</span> (n in l) {
+ o = l[n];
+
+ <span class="reserved">if</span> (o.getControlHTML && (v = o.getControlHTML(c)) != <span class="literal">''</span>)
+ <span class="reserved">return</span> tinyMCE.replaceVar(v, <span class="literal">"pluginurl"</span>, o.baseURL);
+ }
+
+ o = tinyMCE.themes[tinyMCE.settings[<span class="literal">'theme'</span>]];
+ <span class="reserved">if</span> (o.getControlHTML && (v = o.getControlHTML(c)) != <span class="literal">''</span>)
+ <span class="reserved">return</span> v;
+
+ <span class="reserved">return</span> <span class="literal">''</span>;
+ },
+
+ <span class="comment">/**
+ * Evaluates the specified function and uses the array of arguments.
+ *
+ * <span class="attrib">@param</span> {string} f Function reference to execute.
+ * <span class="attrib">@param</span> {int} idx Index in array to start grabbing arguments from.
+ * <span class="attrib">@param</span> {Array} a Array of function arguments.
+ * <span class="attrib">@return</span> Value returned from the evaluated function.
+ * <span class="attrib">@type</span> object
+ */</span>
+ evalFunc : <span class="reserved">function</span>(f, idx, a) {
+ var s = <span class="literal">'('</span>, i;
+
+ <span class="reserved">for</span> (i=idx; i<a.length; i++) {
+ s += <span class="literal">'a['</span> + i + <span class="literal">']'</span>;
+
+ <span class="reserved">if</span> (i < a.length-1)
+ s += <span class="literal">','</span>;
+ }
+
+ s += <span class="literal">');'</span>;
+
+ <span class="reserved">return</span> eval(<span class="literal">"f"</span> + s);
+ },
+
+ <span class="comment">/**
+ * Dispatches the specified callback on all options, plugins and themes. This will not
+ * chain them, so all functions callbacks will be executed regardless if the return true/false.
+ *
+ * <span class="attrib">@param</span> {TinyMCE_Control} i TinyMCE editor control instance to execute callback on.
+ * <span class="attrib">@param</span> {string} p TinyMCE callback parameter to execute.
+ * <span class="attrib">@param</span> {string} n Function name to execute.
+ * <span class="attrib">@return</span> true/false if they where dispatched.
+ */</span>
+ dispatchCallback : <span class="reserved">function</span>(i, p, n) {
+ <span class="reserved">return</span> <span class="reserved">this</span>.callFunc(i, p, n, 0, <span class="reserved">this</span>.dispatchCallback.arguments);
+ },
+
+ <span class="comment">/**
+ * Executes the specified callback on all options, plugins and themes. This will
+ * chain them, so callback chain will be broken if one function returns false.
+ *
+ * <span class="attrib">@param</span> {TinyMCE_Control} i TinyMCE editor control instance to execute callback on.
+ * <span class="attrib">@param</span> {string} p TinyMCE callback parameter to execute.
+ * <span class="attrib">@param</span> {string} n Function name to execute.
+ * <span class="attrib">@return</span> true/false if a callback was executed.
+ */</span>
+ executeCallback : <span class="reserved">function</span>(i, p, n) {
+ <span class="reserved">return</span> <span class="reserved">this</span>.callFunc(i, p, n, 1, <span class="reserved">this</span>.executeCallback.arguments);
+ },
+
+ <span class="comment">/**
+ * Executes the specified execcommand callback on all options, plugins and themes. This will
+ * chain them, so callback chain will be broken if one function returns true.
+ *
+ * <span class="attrib">@param</span> {TinyMCE_Control} i TinyMCE editor control instance to execute callback on.
+ * <span class="attrib">@param</span> {string} p TinyMCE callback parameter to execute.
+ * <span class="attrib">@param</span> {string} n Function name to execute.
+ * <span class="attrib">@return</span> true/false if a callback was executed.
+ */</span>
+ execCommandCallback : <span class="reserved">function</span>(i, p, n) {
+ <span class="reserved">return</span> <span class="reserved">this</span>.callFunc(i, p, n, 2, <span class="reserved">this</span>.execCommandCallback.arguments);
+ },
+
+ <span class="comment">/**
+ * Executes callback chain. Callback order: Option, Plugins, Themes.
+ *
+ * <span class="attrib">@param</span> {TinyMCE_Control} ins TinyMCE editor control instance to execute callback on.
+ * <span class="attrib">@param</span> {string} p TinyMCE callback parameter name.
+ * <span class="attrib">@param</span> {string} n Function name to execute.
+ * <span class="attrib">@param</span> {int} m Execution mode value, 0 = no chain, 1 = event chain, 2 = execcommand chain.
+ * <span class="attrib">@param</span> {Array} a Array with function arguments.
+ * <span class="attrib">@return</span> true - if the callback was executed, false if it wasn't.
+ * <span class="attrib">@type</span> boolean
+ */</span>
+ callFunc : <span class="reserved">function</span>(ins, p, n, m, a) {
+ var l, i, on, o, s, v;
+
+ s = m == 2;
+
+ l = tinyMCE.getParam(p, <span class="literal">''</span>);
+
+ <span class="reserved">if</span> (l != <span class="literal">''</span> && (v = tinyMCE.evalFunc(typeof(l) == <span class="literal">"function"</span> ? l : eval(l), 3, a)) == s && m > 0)
+ <span class="reserved">return</span> true;
+
+ <span class="reserved">if</span> (ins != null) {
+ <span class="reserved">for</span> (i=0, l = ins.plugins; i<l.length; i++) {
+ o = tinyMCE.plugins[l[i]];
+
+ <span class="reserved">if</span> (o[n] && (v = tinyMCE.evalFunc(o[n], 3, a)) == s && m > 0)
+ <span class="reserved">return</span> true;
+ }
+ }
+
+ l = tinyMCE.themes;
+ <span class="reserved">for</span> (on in l) {
+ o = l[on];
+
+ <span class="reserved">if</span> (o[n] && (v = tinyMCE.evalFunc(o[n], 3, a)) == s && m > 0)
+ <span class="reserved">return</span> true;
+ }
+
+ <span class="reserved">return</span> false;
+ },
+
+ <span class="comment">/**
+ * Encodes the string to raw XML entities. This will only convert the most common ones.
+ * For real entity encoding use the xmlEncode method of the Cleanup class.
+ *
+ * <span class="attrib">@param</span> {string} s String to encode.
+ * <span class="attrib">@return</span> XML Encoded string.
+ * <span class="attrib">@type</span> string
+ */</span>
+ xmlEncode : <span class="reserved">function</span>(s) {
+ s = <span class="literal">""</span> + s;
+ s = s.replace(/&/g, <span class="literal">'&'</span>);
+ s = s.replace(new RegExp(<span class="literal">'"'</span>, <span class="literal">'g'</span>), <span class="literal">'"'</span>);
+ s = s.replace(/\<span class="literal">'/g, '</span>'<span class="literal">'); // ' is not working in MSIE
+ s = s.replace(/</g, '</span><<span class="literal">');
+ s = s.replace(/>/g, '</span>>');
+
+ <span class="reserved">return</span> s;
+ },
+
+ <span class="comment">/**
+ * Extends the specified prototype with new methods.
+ *
+ * <span class="attrib">@param</span> {Object} p Prototype to extend with new methods.
+ * <span class="attrib">@param</span> {Object} np New prototype to extend the other one with.
+ * <span class="attrib">@return</span> Extended prototype array.
+ * <span class="attrib">@type</span> Object
+ */</span>
+ extend : <span class="reserved">function</span>(p, np) {
+ var o = {};
+
+ o.parent = p;
+
+ <span class="reserved">for</span> (n in p)
+ o[n] = p[n];
+
+ <span class="reserved">for</span> (n in np)
+ o[n] = np[n];
+
+ <span class="reserved">return</span> o;
+ },
+
+ <span class="comment">/**
+ * Hides any visible menu layers.
+ *
+ * <span class="attrib">@private</span>
+ */</span>
+ hideMenus : <span class="reserved">function</span>() {
+ var e = tinyMCE.lastSelectedMenuBtn;
+
+ <span class="reserved">if</span> (tinyMCE.lastMenu) {
+ tinyMCE.lastMenu.hide();
+ tinyMCE.lastMenu = null;
+ }
+
+ <span class="reserved">if</span> (e) {
+ tinyMCE.switchClass(e, tinyMCE.lastMenuBtnClass);
+ tinyMCE.lastSelectedMenuBtn = null;
+ }
+ },
+
+ <span class="comment">/**
+ * Splits a string by the specified delimiter and skips any empty items.
+ *
+ * <span class="attrib">@param</span> {string} d Delimiter to split by.
+ * <span class="attrib">@param</span> {string} s String to split.
+ * <span class="attrib">@return</span> Array with chunks from string.
+ * <span class="attrib">@type</span> Array
+ */</span>
+ explode : <span class="reserved">function</span>(d, s) {
+ var ar = s.split(d), oar = new Array(), i;
+
+ <span class="reserved">for</span> (i = 0; i<ar.length; i++) {
+ <span class="reserved">if</span> (ar[i] != <span class="literal">""</span>)
+ oar[oar.length] = ar[i];
+ }
+
+ <span class="reserved">return</span> oar;
+ }
+};
+
+<span class="comment">// Global instances</span>
+var TinyMCE = TinyMCE_Engine; <span class="comment">// Compatiblity with gzip compressors</span>
+var tinyMCE = new TinyMCE_Engine();
+var tinyMCELang = {};
+</pre>
+ <hr>
+
+
+
+<!-- ========== START OF NAVBAR ========== -->
+<a name="navbar_top"><!-- --></a>
+<table border="0" width="100%" cellpadding="1" cellspacing="0">
+<tr>
+<td colspan=2 bgcolor="#EEEEFF" class="NavBarCell1">
+<a name="navbar_top_firstrow"><!-- --></a>
+<table border="0" cellpadding="0" cellspacing="3">
+ <tr align="center" valign="top">
+
+
+ <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="overview-summary.html"><font class="NavBarFont1"><b>Overview</b></font></a> </td>
+ <td bgcolor="#FFFFFF" class="NavBarCell1Rev"> <font class="NavBarFont1Rev"><b>File</b></font> </td>
+
+
+ <td bgcolor="#FFFFFF" class="NavBarCell1"> <font class="NavBarFont1">Class</font> </td>
+ <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="overview-tree.html"><font class="NavBarFont1"><b>Tree</b></font></a> </td>
+ <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="index-all.html"--><font class="NavBarFont1"><b>Index</b></font></a> </td>
+ <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="help-doc.html"><font class="NavBarFont1"><b>Help</b></font></a> </td>
+ </tr>
+</table>
+</td>
+<td bgcolor="#EEEEFF" align="right" valign="top"><em>
+<b></b></em>
+</td>
+</tr>
+
+<tr>
+<td bgcolor="white" class="NavBarCell2"><font size="-2">
+ PREV
+ NEXT</font></td>
+<td bgcolor="white" class="NavBarCell2"><font size="-2">
+ <a href="index.html" target="_top"><b>FRAMES</b></a>
+ <a href="overview-summary.html" target="_top"><b>NO FRAMES</b></a>
+
+<script>
+ <!--
+ if(window==top) {
+ document.writeln('<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>');
+ }
+ //-->
+</script>
+<noscript>
+<a href="allclasses-noframe.html" target=""><b>All Classes</b></a>
+</noscript>
+</font></td>
+</tr>
+</table>
+<!-- =========== END OF NAVBAR =========== -->
+
+<hr>
+<font size="-1">
+
+</font>
+<div class="jsdoc_ctime">Documentation generated by <a href="http://jsdoc.sourceforge.net/" target="_parent">JSDoc</a> on Fri Apr 14 21:59:23 2006</div>
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/tinymce_api/overview-summary-TinyMCE_Event.class.js.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/tinymce_api/overview-summary-TinyMCE_Event.class.js.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/tinymce_api/overview-summary-TinyMCE_Event.class.js.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,403 +0,0 @@
-<!doctype html public "-//W3C//DTD HTML 4.0 Frameset//EN""http://www.w3.org/TR/REC-html40/frameset.dtd">
-<html>
-<head>
-<title>
- Overview
-</title>
-<link rel ="stylesheet" type="text/css" href="stylesheet.css" title="Style">
-<script>
-function asd() {
-
- parent.document.title="TinyMCE_Event.class.js Overview";
-
-}
-</script>
-</head>
-<body bgcolor="white" onload="asd();">
-
-<!-- ========== START OF NAVBAR ========== -->
-<a name="navbar_top"><!-- --></a>
-<table border="0" width="100%" cellpadding="1" cellspacing="0">
-<tr>
-<td colspan=2 bgcolor="#EEEEFF" class="NavBarCell1">
-<a name="navbar_top_firstrow"><!-- --></a>
-<table border="0" cellpadding="0" cellspacing="3">
- <tr align="center" valign="top">
-
-
- <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="overview-summary.html"><font class="NavBarFont1"><b>Overview</b></font></a> </td>
- <td bgcolor="#FFFFFF" class="NavBarCell1Rev"> <font class="NavBarFont1Rev"><b>File</b></font> </td>
-
-
- <td bgcolor="#FFFFFF" class="NavBarCell1"> <font class="NavBarFont1">Class</font> </td>
- <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="overview-tree.html"><font class="NavBarFont1"><b>Tree</b></font></a> </td>
- <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="index-all.html"--><font class="NavBarFont1"><b>Index</b></font></a> </td>
- <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="help-doc.html"><font class="NavBarFont1"><b>Help</b></font></a> </td>
- </tr>
-</table>
-</td>
-<td bgcolor="#EEEEFF" align="right" valign="top">
-<em>
-<b></b></em>
-</td>
-</tr>
-
-<tr>
-<td bgcolor="white" class="NavBarCell2"><font size="-2">
- PREV
- NEXT</font></td>
-<td bgcolor="white" class="NavBarCell2"><font size="-2">
- <a href="index.html" target="_top"><b>FRAMES</b></a>
- <a href="overview-summary.html" target="_top"><b>NO FRAMES</b></a>
-
-<script>
- <!--
- if(window==top) {
- document.writeln('<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>');
- }
- //-->
-</script>
-<noscript>
-<a href="allclasses-noframe.html" target=""><b>All Classes</b></a>
-</noscript>
-</font></td>
-</tr>
-</table>
-<!-- =========== END OF NAVBAR =========== -->
-
-<hr>
-<center>
-
- <h2>TinyMCE_Event.class.js</h2>
-
-</center>
-
-
-
-
-<h4>Summary</h4>
-<p>
-
- No overview generated for 'TinyMCE_Event.class.js'<BR/><BR/>
-
-</p>
-
-<hr>
-
-
-
-<!-- ========== METHOD SUMMARY =========== -->
-
-<!-- ========== END METHOD SUMMARY =========== -->
-
-
- <pre class="sourceview"><span class="comment">/**
- * $RCSfile: overview-summary-TinyMCE_Event.class.js.html,v $
- * $Revision: 1.42 $
- * $Date: 2006/04/14 20:00:30 $
- *
- * <span class="attrib">@author</span> Moxiecode
- * <span class="attrib">@copyright</span> Copyright © 2004-2006, Moxiecode Systems AB, All rights reserved.
- *
- * The contents of this file will be wrapped in a class later on.
- */</span>
-
-<span class="comment">/**
- * Sets the enabled/disabled state of build in events on the specific node.
- * This function is needed since some events gets executed in WYSIWYG mode.
- *
- * <span class="attrib">@param</span> {HTMLNode} node HTML node to enable/disable events on.
- * <span class="attrib">@param</span> {boolean} state true/false state if the events should be disabled or enabled.
- * <span class="attrib">@private</span>
- */</span>
-TinyMCE_Engine.<span class="reserved">prototype</span>._setEventsEnabled = <span class="reserved">function</span>(node, state) {
- var events = new Array(<span class="literal">'onfocus'</span>,<span class="literal">'onblur'</span>,<span class="literal">'onclick'</span>,<span class="literal">'ondblclick'</span>,
- <span class="literal">'onmousedown'</span>,<span class="literal">'onmouseup'</span>,<span class="literal">'onmouseover'</span>,<span class="literal">'onmousemove'</span>,
- <span class="literal">'onmouseout'</span>,<span class="literal">'onkeypress'</span>,<span class="literal">'onkeydown'</span>,<span class="literal">'onkeydown'</span>,<span class="literal">'onkeyup'</span>);
-
- var evs = tinyMCE.settings[<span class="literal">'event_elements'</span>].split(<span class="literal">','</span>);
- <span class="reserved">for</span> (var y=0; y<evs.length; y++){
- var elms = node.getElementsByTagName(evs[y]);
- <span class="reserved">for</span> (var i=0; i<elms.length; i++) {
- var event = <span class="literal">""</span>;
-
- <span class="reserved">for</span> (var x=0; x<events.length; x++) {
- <span class="reserved">if</span> ((event = tinyMCE.getAttrib(elms[i], events[x])) != <span class="literal">''</span>) {
- event = tinyMCE.cleanupEventStr(<span class="literal">""</span> + event);
-
- <span class="reserved">if</span> (!state)
- event = <span class="literal">"return true;"</span> + event;
- <span class="reserved">else</span>
- event = event.replace(/^<span class="reserved">return</span> true;/gi, <span class="literal">''</span>);
-
- elms[i].removeAttribute(events[x]);
- elms[i].setAttribute(events[x], event);
- }
- }
- }
- }
-};
-
-<span class="comment">/**
- * Patch function for MSIE specific events, this one simply grabs the window.event object and
- * passes it as a argument to the handleEvent function of the TinyMCE_Engine class.
- *
- * <span class="attrib">@param</span> {string} editor_id Editor id to patch.
- * <span class="attrib">@private</span>
- */</span>
-TinyMCE_Engine.<span class="reserved">prototype</span>._eventPatch = <span class="reserved">function</span>(editor_id) {
- var n, inst, win, e;
-
- <span class="comment">// Remove odd, error</span>
- <span class="reserved">if</span> (typeof(tinyMCE) == <span class="literal">"undefined"</span>)
- <span class="reserved">return</span> true;
-
- try {
- <span class="comment">// Try selected instance first</span>
- <span class="reserved">if</span> (tinyMCE.selectedInstance) {
- win = tinyMCE.selectedInstance.getWin();
-
- <span class="reserved">if</span> (win && win.event) {
- e = win.event;
-
- <span class="reserved">if</span> (!e.target)
- e.target = e.srcElement;
-
- TinyMCE_Engine.<span class="reserved">prototype</span>.handleEvent(e);
- <span class="reserved">return</span>;
- }
- }
-
- <span class="comment">// Search for it</span>
- <span class="reserved">for</span> (n in tinyMCE.instances) {
- inst = tinyMCE.instances[n];
-
- <span class="reserved">if</span> (!tinyMCE.isInstance(inst))
- continue;
-
- tinyMCE.selectedInstance = inst;
- win = inst.getWin();
-
- <span class="reserved">if</span> (win && win.event) {
- e = win.event;
-
- <span class="reserved">if</span> (!e.target)
- e.target = e.srcElement;
-
- TinyMCE_Engine.<span class="reserved">prototype</span>.handleEvent(e);
- <span class="reserved">return</span>;
- }
- }
- } catch (ex) {
- <span class="comment">// Ignore error if iframe is pointing to external URL</span>
- }
-};
-
-<span class="comment">/**
- * Unload document event handler function. This function will be executed when the
- * page is unloaded, this will automaticly move the current editor contents to the textarea element this enables
- * the editor to restore it's state when the user presses the back button in the browser.
- * This will execute the triggerSave function.
- */</span>
-TinyMCE_Engine.<span class="reserved">prototype</span>.unloadHandler = <span class="reserved">function</span>() {
- tinyMCE.triggerSave(true, true);
-};
-
-<span class="comment">/**
- * Adds the handleEvent function to the specified editor instance.
- *
- * <span class="attrib">@param</span> {inst} inst Editor control instance to add event handler to.
- */</span>
-TinyMCE_Engine.<span class="reserved">prototype</span>.addEventHandlers = <span class="reserved">function</span>(inst) {
- var doc = inst.getDoc();
-
- inst.switchSettings();
-
- <span class="reserved">if</span> (tinyMCE.isMSIE) {
- tinyMCE.addEvent(doc, <span class="literal">"keypress"</span>, TinyMCE_Engine.<span class="reserved">prototype</span>._eventPatch);
- tinyMCE.addEvent(doc, <span class="literal">"keyup"</span>, TinyMCE_Engine.<span class="reserved">prototype</span>._eventPatch);
- tinyMCE.addEvent(doc, <span class="literal">"keydown"</span>, TinyMCE_Engine.<span class="reserved">prototype</span>._eventPatch);
- tinyMCE.addEvent(doc, <span class="literal">"mouseup"</span>, TinyMCE_Engine.<span class="reserved">prototype</span>._eventPatch);
- tinyMCE.addEvent(doc, <span class="literal">"click"</span>, TinyMCE_Engine.<span class="reserved">prototype</span>._eventPatch);
- } <span class="reserved">else</span> {
- tinyMCE.addEvent(doc, <span class="literal">"keypress"</span>, tinyMCE.handleEvent);
- tinyMCE.addEvent(doc, <span class="literal">"keydown"</span>, tinyMCE.handleEvent);
- tinyMCE.addEvent(doc, <span class="literal">"keyup"</span>, tinyMCE.handleEvent);
- tinyMCE.addEvent(doc, <span class="literal">"click"</span>, tinyMCE.handleEvent);
- tinyMCE.addEvent(doc, <span class="literal">"mouseup"</span>, tinyMCE.handleEvent);
- tinyMCE.addEvent(doc, <span class="literal">"mousedown"</span>, tinyMCE.handleEvent);
- tinyMCE.addEvent(doc, <span class="literal">"focus"</span>, tinyMCE.handleEvent);
- tinyMCE.addEvent(doc, <span class="literal">"blur"</span>, tinyMCE.handleEvent);
-
- eval(<span class="literal">'try { doc.designMode = "On"; } catch(e) {}'</span>); <span class="comment">// Force designmode</span>
- }
-};
-
-<span class="comment">/**
- * Mouse move handler function, this will be executed each time
- * the mouse is moved within a editor instance. This function stores away the current selection in MSIE
- * this will then be used when a undo/redo level is added.
- */</span>
-TinyMCE_Engine.<span class="reserved">prototype</span>.onMouseMove = <span class="reserved">function</span>() {
- var inst;
-
- <span class="reserved">if</span> (!tinyMCE.hasMouseMoved) {
- inst = tinyMCE.selectedInstance;
-
- <span class="comment">// Workaround for bug #1437457 (Odd MSIE bug)</span>
- <span class="reserved">if</span> (inst.isFocused) {
- inst.undoBookmark = inst.selection.getBookmark();
- tinyMCE.hasMouseMoved = true;
- }
- }
-
-<span class="comment">// tinyMCE.cancelEvent(inst.getWin().event);</span>
-<span class="comment">// return false;</span>
-};
-
-<span class="comment">/**
- * Cancels the specified event, this will disable the event from be passed to other listeners in event chain.
- *
- * <span class="attrib">@param</span> {DOMEvent} e Event to cancel.
- */</span>
-TinyMCE_Engine.<span class="reserved">prototype</span>.cancelEvent = <span class="reserved">function</span>(e) {
- <span class="reserved">if</span> (tinyMCE.isMSIE) {
- e.returnValue = false;
- e.cancelBubble = true;
- } <span class="reserved">else</span>
- e.preventDefault();
-};
-
-<span class="comment">/**
- * Adds a event handler function to the specified object.
- *
- * <span class="attrib">@param</span> {HTMLElement} o Object to add event handler to.
- * <span class="attrib">@param</span> {string} n Event name to listen to for example "click".
- * <span class="attrib">@param</span> {function} h Function handler to execute when event occurs.
- */</span>
-TinyMCE_Engine.<span class="reserved">prototype</span>.addEvent = <span class="reserved">function</span>(o, n, h) {
- <span class="reserved">if</span> (o.attachEvent)
- o.attachEvent(<span class="literal">"on"</span> + n, h);
- <span class="reserved">else</span>
- o.addEventListener(n, h, false);
-};
-
-<span class="comment">/**
- * Adds accessibility keydown handler to the specified select element.
- *
- * <span class="attrib">@param</span> {DOMEvent} e Event that gets passed when the element is focused.
- * <span class="attrib">@param</span> {HTMLElement} s Select element that the keydown handler gets added to.
- * <span class="attrib">@param</span> {DOMWindow} w DOM window reference to add.
- */</span>
-TinyMCE_Engine.<span class="reserved">prototype</span>.addSelectAccessibility = <span class="reserved">function</span>(e, s, w) {
- <span class="comment">// Add event handlers </span>
- <span class="reserved">if</span> (!s._isAccessible) {
- s.onkeydown = tinyMCE.accessibleEventHandler;
- s.onblur = tinyMCE.accessibleEventHandler;
- s._isAccessible = true;
- s._win = w;
- }
-
- <span class="reserved">return</span> false;
-};
-
-<span class="comment">/**
- * Accessibility handler that gets executed when the user hits a key in a select element.
- * This handler trams the enter/return or space key and then executes the onchange event handler.
- *
- * <span class="attrib">@param</span> {DOMEvent} e DOM event object instance.
- */</span>
-TinyMCE_Engine.<span class="reserved">prototype</span>.accessibleEventHandler = <span class="reserved">function</span>(e) {
- var win = <span class="reserved">this</span>._win;
- e = tinyMCE.isMSIE ? win.event : e;
- var elm = tinyMCE.isMSIE ? e.srcElement : e.target;
-
- <span class="comment">// Unpiggyback onchange on blur</span>
- <span class="reserved">if</span> (e.type == <span class="literal">"blur"</span>) {
- <span class="reserved">if</span> (elm.oldonchange) {
- elm.onchange = elm.oldonchange;
- elm.oldonchange = null;
- }
-
- <span class="reserved">return</span> true;
- }
-
- <span class="comment">// Piggyback onchange</span>
- <span class="reserved">if</span> (elm.nodeName == <span class="literal">"SELECT"</span> && !elm.oldonchange) {
- elm.oldonchange = elm.onchange;
- elm.onchange = null;
- }
-
- <span class="comment">// Execute onchange and remove piggyback</span>
- <span class="reserved">if</span> (e.keyCode == 13 || e.keyCode == 32) {
- elm.onchange = elm.oldonchange;
- elm.onchange();
- elm.oldonchange = null;
-
- tinyMCE.cancelEvent(e);
- <span class="reserved">return</span> false;
- }
-
- <span class="reserved">return</span> true;
-};
-</pre>
- <hr>
-
-
-
-<!-- ========== START OF NAVBAR ========== -->
-<a name="navbar_top"><!-- --></a>
-<table border="0" width="100%" cellpadding="1" cellspacing="0">
-<tr>
-<td colspan=2 bgcolor="#EEEEFF" class="NavBarCell1">
-<a name="navbar_top_firstrow"><!-- --></a>
-<table border="0" cellpadding="0" cellspacing="3">
- <tr align="center" valign="top">
-
-
- <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="overview-summary.html"><font class="NavBarFont1"><b>Overview</b></font></a> </td>
- <td bgcolor="#FFFFFF" class="NavBarCell1Rev"> <font class="NavBarFont1Rev"><b>File</b></font> </td>
-
-
- <td bgcolor="#FFFFFF" class="NavBarCell1"> <font class="NavBarFont1">Class</font> </td>
- <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="overview-tree.html"><font class="NavBarFont1"><b>Tree</b></font></a> </td>
- <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="index-all.html"--><font class="NavBarFont1"><b>Index</b></font></a> </td>
- <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="help-doc.html"><font class="NavBarFont1"><b>Help</b></font></a> </td>
- </tr>
-</table>
-</td>
-<td bgcolor="#EEEEFF" align="right" valign="top"><em>
-<b></b></em>
-</td>
-</tr>
-
-<tr>
-<td bgcolor="white" class="NavBarCell2"><font size="-2">
- PREV
- NEXT</font></td>
-<td bgcolor="white" class="NavBarCell2"><font size="-2">
- <a href="index.html" target="_top"><b>FRAMES</b></a>
- <a href="overview-summary.html" target="_top"><b>NO FRAMES</b></a>
-
-<script>
- <!--
- if(window==top) {
- document.writeln('<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>');
- }
- //-->
-</script>
-<noscript>
-<a href="allclasses-noframe.html" target=""><b>All Classes</b></a>
-</noscript>
-</font></td>
-</tr>
-</table>
-<!-- =========== END OF NAVBAR =========== -->
-
-<hr>
-<font size="-1">
-
-</font>
-<div class="jsdoc_ctime">Documentation generated by <a href="http://jsdoc.sourceforge.net/" target="_parent">JSDoc</a> on Fri Apr 14 21:59:23 2006</div>
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/tinymce_api/overview-summary-TinyMCE_Event.class.js.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/tinymce_api/overview-summary-TinyMCE_Event.class.js.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/tinymce_api/overview-summary-TinyMCE_Event.class.js.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/tinymce_api/overview-summary-TinyMCE_Event.class.js.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,403 @@
+<!doctype html public "-//W3C//DTD HTML 4.0 Frameset//EN""http://www.w3.org/TR/REC-html40/frameset.dtd">
+<html>
+<head>
+<title>
+ Overview
+</title>
+<link rel ="stylesheet" type="text/css" href="stylesheet.css" title="Style">
+<script>
+function asd() {
+
+ parent.document.title="TinyMCE_Event.class.js Overview";
+
+}
+</script>
+</head>
+<body bgcolor="white" onload="asd();">
+
+<!-- ========== START OF NAVBAR ========== -->
+<a name="navbar_top"><!-- --></a>
+<table border="0" width="100%" cellpadding="1" cellspacing="0">
+<tr>
+<td colspan=2 bgcolor="#EEEEFF" class="NavBarCell1">
+<a name="navbar_top_firstrow"><!-- --></a>
+<table border="0" cellpadding="0" cellspacing="3">
+ <tr align="center" valign="top">
+
+
+ <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="overview-summary.html"><font class="NavBarFont1"><b>Overview</b></font></a> </td>
+ <td bgcolor="#FFFFFF" class="NavBarCell1Rev"> <font class="NavBarFont1Rev"><b>File</b></font> </td>
+
+
+ <td bgcolor="#FFFFFF" class="NavBarCell1"> <font class="NavBarFont1">Class</font> </td>
+ <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="overview-tree.html"><font class="NavBarFont1"><b>Tree</b></font></a> </td>
+ <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="index-all.html"--><font class="NavBarFont1"><b>Index</b></font></a> </td>
+ <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="help-doc.html"><font class="NavBarFont1"><b>Help</b></font></a> </td>
+ </tr>
+</table>
+</td>
+<td bgcolor="#EEEEFF" align="right" valign="top">
+<em>
+<b></b></em>
+</td>
+</tr>
+
+<tr>
+<td bgcolor="white" class="NavBarCell2"><font size="-2">
+ PREV
+ NEXT</font></td>
+<td bgcolor="white" class="NavBarCell2"><font size="-2">
+ <a href="index.html" target="_top"><b>FRAMES</b></a>
+ <a href="overview-summary.html" target="_top"><b>NO FRAMES</b></a>
+
+<script>
+ <!--
+ if(window==top) {
+ document.writeln('<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>');
+ }
+ //-->
+</script>
+<noscript>
+<a href="allclasses-noframe.html" target=""><b>All Classes</b></a>
+</noscript>
+</font></td>
+</tr>
+</table>
+<!-- =========== END OF NAVBAR =========== -->
+
+<hr>
+<center>
+
+ <h2>TinyMCE_Event.class.js</h2>
+
+</center>
+
+
+
+
+<h4>Summary</h4>
+<p>
+
+ No overview generated for 'TinyMCE_Event.class.js'<BR/><BR/>
+
+</p>
+
+<hr>
+
+
+
+<!-- ========== METHOD SUMMARY =========== -->
+
+<!-- ========== END METHOD SUMMARY =========== -->
+
+
+ <pre class="sourceview"><span class="comment">/**
+ * $RCSfile: overview-summary-TinyMCE_Event.class.js.html,v $
+ * $Revision: 1.42 $
+ * $Date: 2006/04/14 20:00:30 $
+ *
+ * <span class="attrib">@author</span> Moxiecode
+ * <span class="attrib">@copyright</span> Copyright © 2004-2006, Moxiecode Systems AB, All rights reserved.
+ *
+ * The contents of this file will be wrapped in a class later on.
+ */</span>
+
+<span class="comment">/**
+ * Sets the enabled/disabled state of build in events on the specific node.
+ * This function is needed since some events gets executed in WYSIWYG mode.
+ *
+ * <span class="attrib">@param</span> {HTMLNode} node HTML node to enable/disable events on.
+ * <span class="attrib">@param</span> {boolean} state true/false state if the events should be disabled or enabled.
+ * <span class="attrib">@private</span>
+ */</span>
+TinyMCE_Engine.<span class="reserved">prototype</span>._setEventsEnabled = <span class="reserved">function</span>(node, state) {
+ var events = new Array(<span class="literal">'onfocus'</span>,<span class="literal">'onblur'</span>,<span class="literal">'onclick'</span>,<span class="literal">'ondblclick'</span>,
+ <span class="literal">'onmousedown'</span>,<span class="literal">'onmouseup'</span>,<span class="literal">'onmouseover'</span>,<span class="literal">'onmousemove'</span>,
+ <span class="literal">'onmouseout'</span>,<span class="literal">'onkeypress'</span>,<span class="literal">'onkeydown'</span>,<span class="literal">'onkeydown'</span>,<span class="literal">'onkeyup'</span>);
+
+ var evs = tinyMCE.settings[<span class="literal">'event_elements'</span>].split(<span class="literal">','</span>);
+ <span class="reserved">for</span> (var y=0; y<evs.length; y++){
+ var elms = node.getElementsByTagName(evs[y]);
+ <span class="reserved">for</span> (var i=0; i<elms.length; i++) {
+ var event = <span class="literal">""</span>;
+
+ <span class="reserved">for</span> (var x=0; x<events.length; x++) {
+ <span class="reserved">if</span> ((event = tinyMCE.getAttrib(elms[i], events[x])) != <span class="literal">''</span>) {
+ event = tinyMCE.cleanupEventStr(<span class="literal">""</span> + event);
+
+ <span class="reserved">if</span> (!state)
+ event = <span class="literal">"return true;"</span> + event;
+ <span class="reserved">else</span>
+ event = event.replace(/^<span class="reserved">return</span> true;/gi, <span class="literal">''</span>);
+
+ elms[i].removeAttribute(events[x]);
+ elms[i].setAttribute(events[x], event);
+ }
+ }
+ }
+ }
+};
+
+<span class="comment">/**
+ * Patch function for MSIE specific events, this one simply grabs the window.event object and
+ * passes it as a argument to the handleEvent function of the TinyMCE_Engine class.
+ *
+ * <span class="attrib">@param</span> {string} editor_id Editor id to patch.
+ * <span class="attrib">@private</span>
+ */</span>
+TinyMCE_Engine.<span class="reserved">prototype</span>._eventPatch = <span class="reserved">function</span>(editor_id) {
+ var n, inst, win, e;
+
+ <span class="comment">// Remove odd, error</span>
+ <span class="reserved">if</span> (typeof(tinyMCE) == <span class="literal">"undefined"</span>)
+ <span class="reserved">return</span> true;
+
+ try {
+ <span class="comment">// Try selected instance first</span>
+ <span class="reserved">if</span> (tinyMCE.selectedInstance) {
+ win = tinyMCE.selectedInstance.getWin();
+
+ <span class="reserved">if</span> (win && win.event) {
+ e = win.event;
+
+ <span class="reserved">if</span> (!e.target)
+ e.target = e.srcElement;
+
+ TinyMCE_Engine.<span class="reserved">prototype</span>.handleEvent(e);
+ <span class="reserved">return</span>;
+ }
+ }
+
+ <span class="comment">// Search for it</span>
+ <span class="reserved">for</span> (n in tinyMCE.instances) {
+ inst = tinyMCE.instances[n];
+
+ <span class="reserved">if</span> (!tinyMCE.isInstance(inst))
+ continue;
+
+ tinyMCE.selectedInstance = inst;
+ win = inst.getWin();
+
+ <span class="reserved">if</span> (win && win.event) {
+ e = win.event;
+
+ <span class="reserved">if</span> (!e.target)
+ e.target = e.srcElement;
+
+ TinyMCE_Engine.<span class="reserved">prototype</span>.handleEvent(e);
+ <span class="reserved">return</span>;
+ }
+ }
+ } catch (ex) {
+ <span class="comment">// Ignore error if iframe is pointing to external URL</span>
+ }
+};
+
+<span class="comment">/**
+ * Unload document event handler function. This function will be executed when the
+ * page is unloaded, this will automaticly move the current editor contents to the textarea element this enables
+ * the editor to restore it's state when the user presses the back button in the browser.
+ * This will execute the triggerSave function.
+ */</span>
+TinyMCE_Engine.<span class="reserved">prototype</span>.unloadHandler = <span class="reserved">function</span>() {
+ tinyMCE.triggerSave(true, true);
+};
+
+<span class="comment">/**
+ * Adds the handleEvent function to the specified editor instance.
+ *
+ * <span class="attrib">@param</span> {inst} inst Editor control instance to add event handler to.
+ */</span>
+TinyMCE_Engine.<span class="reserved">prototype</span>.addEventHandlers = <span class="reserved">function</span>(inst) {
+ var doc = inst.getDoc();
+
+ inst.switchSettings();
+
+ <span class="reserved">if</span> (tinyMCE.isMSIE) {
+ tinyMCE.addEvent(doc, <span class="literal">"keypress"</span>, TinyMCE_Engine.<span class="reserved">prototype</span>._eventPatch);
+ tinyMCE.addEvent(doc, <span class="literal">"keyup"</span>, TinyMCE_Engine.<span class="reserved">prototype</span>._eventPatch);
+ tinyMCE.addEvent(doc, <span class="literal">"keydown"</span>, TinyMCE_Engine.<span class="reserved">prototype</span>._eventPatch);
+ tinyMCE.addEvent(doc, <span class="literal">"mouseup"</span>, TinyMCE_Engine.<span class="reserved">prototype</span>._eventPatch);
+ tinyMCE.addEvent(doc, <span class="literal">"click"</span>, TinyMCE_Engine.<span class="reserved">prototype</span>._eventPatch);
+ } <span class="reserved">else</span> {
+ tinyMCE.addEvent(doc, <span class="literal">"keypress"</span>, tinyMCE.handleEvent);
+ tinyMCE.addEvent(doc, <span class="literal">"keydown"</span>, tinyMCE.handleEvent);
+ tinyMCE.addEvent(doc, <span class="literal">"keyup"</span>, tinyMCE.handleEvent);
+ tinyMCE.addEvent(doc, <span class="literal">"click"</span>, tinyMCE.handleEvent);
+ tinyMCE.addEvent(doc, <span class="literal">"mouseup"</span>, tinyMCE.handleEvent);
+ tinyMCE.addEvent(doc, <span class="literal">"mousedown"</span>, tinyMCE.handleEvent);
+ tinyMCE.addEvent(doc, <span class="literal">"focus"</span>, tinyMCE.handleEvent);
+ tinyMCE.addEvent(doc, <span class="literal">"blur"</span>, tinyMCE.handleEvent);
+
+ eval(<span class="literal">'try { doc.designMode = "On"; } catch(e) {}'</span>); <span class="comment">// Force designmode</span>
+ }
+};
+
+<span class="comment">/**
+ * Mouse move handler function, this will be executed each time
+ * the mouse is moved within a editor instance. This function stores away the current selection in MSIE
+ * this will then be used when a undo/redo level is added.
+ */</span>
+TinyMCE_Engine.<span class="reserved">prototype</span>.onMouseMove = <span class="reserved">function</span>() {
+ var inst;
+
+ <span class="reserved">if</span> (!tinyMCE.hasMouseMoved) {
+ inst = tinyMCE.selectedInstance;
+
+ <span class="comment">// Workaround for bug #1437457 (Odd MSIE bug)</span>
+ <span class="reserved">if</span> (inst.isFocused) {
+ inst.undoBookmark = inst.selection.getBookmark();
+ tinyMCE.hasMouseMoved = true;
+ }
+ }
+
+<span class="comment">// tinyMCE.cancelEvent(inst.getWin().event);</span>
+<span class="comment">// return false;</span>
+};
+
+<span class="comment">/**
+ * Cancels the specified event, this will disable the event from be passed to other listeners in event chain.
+ *
+ * <span class="attrib">@param</span> {DOMEvent} e Event to cancel.
+ */</span>
+TinyMCE_Engine.<span class="reserved">prototype</span>.cancelEvent = <span class="reserved">function</span>(e) {
+ <span class="reserved">if</span> (tinyMCE.isMSIE) {
+ e.returnValue = false;
+ e.cancelBubble = true;
+ } <span class="reserved">else</span>
+ e.preventDefault();
+};
+
+<span class="comment">/**
+ * Adds a event handler function to the specified object.
+ *
+ * <span class="attrib">@param</span> {HTMLElement} o Object to add event handler to.
+ * <span class="attrib">@param</span> {string} n Event name to listen to for example "click".
+ * <span class="attrib">@param</span> {function} h Function handler to execute when event occurs.
+ */</span>
+TinyMCE_Engine.<span class="reserved">prototype</span>.addEvent = <span class="reserved">function</span>(o, n, h) {
+ <span class="reserved">if</span> (o.attachEvent)
+ o.attachEvent(<span class="literal">"on"</span> + n, h);
+ <span class="reserved">else</span>
+ o.addEventListener(n, h, false);
+};
+
+<span class="comment">/**
+ * Adds accessibility keydown handler to the specified select element.
+ *
+ * <span class="attrib">@param</span> {DOMEvent} e Event that gets passed when the element is focused.
+ * <span class="attrib">@param</span> {HTMLElement} s Select element that the keydown handler gets added to.
+ * <span class="attrib">@param</span> {DOMWindow} w DOM window reference to add.
+ */</span>
+TinyMCE_Engine.<span class="reserved">prototype</span>.addSelectAccessibility = <span class="reserved">function</span>(e, s, w) {
+ <span class="comment">// Add event handlers </span>
+ <span class="reserved">if</span> (!s._isAccessible) {
+ s.onkeydown = tinyMCE.accessibleEventHandler;
+ s.onblur = tinyMCE.accessibleEventHandler;
+ s._isAccessible = true;
+ s._win = w;
+ }
+
+ <span class="reserved">return</span> false;
+};
+
+<span class="comment">/**
+ * Accessibility handler that gets executed when the user hits a key in a select element.
+ * This handler trams the enter/return or space key and then executes the onchange event handler.
+ *
+ * <span class="attrib">@param</span> {DOMEvent} e DOM event object instance.
+ */</span>
+TinyMCE_Engine.<span class="reserved">prototype</span>.accessibleEventHandler = <span class="reserved">function</span>(e) {
+ var win = <span class="reserved">this</span>._win;
+ e = tinyMCE.isMSIE ? win.event : e;
+ var elm = tinyMCE.isMSIE ? e.srcElement : e.target;
+
+ <span class="comment">// Unpiggyback onchange on blur</span>
+ <span class="reserved">if</span> (e.type == <span class="literal">"blur"</span>) {
+ <span class="reserved">if</span> (elm.oldonchange) {
+ elm.onchange = elm.oldonchange;
+ elm.oldonchange = null;
+ }
+
+ <span class="reserved">return</span> true;
+ }
+
+ <span class="comment">// Piggyback onchange</span>
+ <span class="reserved">if</span> (elm.nodeName == <span class="literal">"SELECT"</span> && !elm.oldonchange) {
+ elm.oldonchange = elm.onchange;
+ elm.onchange = null;
+ }
+
+ <span class="comment">// Execute onchange and remove piggyback</span>
+ <span class="reserved">if</span> (e.keyCode == 13 || e.keyCode == 32) {
+ elm.onchange = elm.oldonchange;
+ elm.onchange();
+ elm.oldonchange = null;
+
+ tinyMCE.cancelEvent(e);
+ <span class="reserved">return</span> false;
+ }
+
+ <span class="reserved">return</span> true;
+};
+</pre>
+ <hr>
+
+
+
+<!-- ========== START OF NAVBAR ========== -->
+<a name="navbar_top"><!-- --></a>
+<table border="0" width="100%" cellpadding="1" cellspacing="0">
+<tr>
+<td colspan=2 bgcolor="#EEEEFF" class="NavBarCell1">
+<a name="navbar_top_firstrow"><!-- --></a>
+<table border="0" cellpadding="0" cellspacing="3">
+ <tr align="center" valign="top">
+
+
+ <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="overview-summary.html"><font class="NavBarFont1"><b>Overview</b></font></a> </td>
+ <td bgcolor="#FFFFFF" class="NavBarCell1Rev"> <font class="NavBarFont1Rev"><b>File</b></font> </td>
+
+
+ <td bgcolor="#FFFFFF" class="NavBarCell1"> <font class="NavBarFont1">Class</font> </td>
+ <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="overview-tree.html"><font class="NavBarFont1"><b>Tree</b></font></a> </td>
+ <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="index-all.html"--><font class="NavBarFont1"><b>Index</b></font></a> </td>
+ <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="help-doc.html"><font class="NavBarFont1"><b>Help</b></font></a> </td>
+ </tr>
+</table>
+</td>
+<td bgcolor="#EEEEFF" align="right" valign="top"><em>
+<b></b></em>
+</td>
+</tr>
+
+<tr>
+<td bgcolor="white" class="NavBarCell2"><font size="-2">
+ PREV
+ NEXT</font></td>
+<td bgcolor="white" class="NavBarCell2"><font size="-2">
+ <a href="index.html" target="_top"><b>FRAMES</b></a>
+ <a href="overview-summary.html" target="_top"><b>NO FRAMES</b></a>
+
+<script>
+ <!--
+ if(window==top) {
+ document.writeln('<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>');
+ }
+ //-->
+</script>
+<noscript>
+<a href="allclasses-noframe.html" target=""><b>All Classes</b></a>
+</noscript>
+</font></td>
+</tr>
+</table>
+<!-- =========== END OF NAVBAR =========== -->
+
+<hr>
+<font size="-1">
+
+</font>
+<div class="jsdoc_ctime">Documentation generated by <a href="http://jsdoc.sourceforge.net/" target="_parent">JSDoc</a> on Fri Apr 14 21:59:23 2006</div>
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/tinymce_api/overview-summary-TinyMCE_ForceParagraphs.class.js.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/tinymce_api/overview-summary-TinyMCE_ForceParagraphs.class.js.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/tinymce_api/overview-summary-TinyMCE_ForceParagraphs.class.js.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,460 +0,0 @@
-<!doctype html public "-//W3C//DTD HTML 4.0 Frameset//EN""http://www.w3.org/TR/REC-html40/frameset.dtd">
-<html>
-<head>
-<title>
- Overview
-</title>
-<link rel ="stylesheet" type="text/css" href="stylesheet.css" title="Style">
-<script>
-function asd() {
-
- parent.document.title="TinyMCE_ForceParagraphs.class.js Overview";
-
-}
-</script>
-</head>
-<body bgcolor="white" onload="asd();">
-
-<!-- ========== START OF NAVBAR ========== -->
-<a name="navbar_top"><!-- --></a>
-<table border="0" width="100%" cellpadding="1" cellspacing="0">
-<tr>
-<td colspan=2 bgcolor="#EEEEFF" class="NavBarCell1">
-<a name="navbar_top_firstrow"><!-- --></a>
-<table border="0" cellpadding="0" cellspacing="3">
- <tr align="center" valign="top">
-
-
- <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="overview-summary.html"><font class="NavBarFont1"><b>Overview</b></font></a> </td>
- <td bgcolor="#FFFFFF" class="NavBarCell1Rev"> <font class="NavBarFont1Rev"><b>File</b></font> </td>
-
-
- <td bgcolor="#FFFFFF" class="NavBarCell1"> <font class="NavBarFont1">Class</font> </td>
- <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="overview-tree.html"><font class="NavBarFont1"><b>Tree</b></font></a> </td>
- <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="index-all.html"--><font class="NavBarFont1"><b>Index</b></font></a> </td>
- <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="help-doc.html"><font class="NavBarFont1"><b>Help</b></font></a> </td>
- </tr>
-</table>
-</td>
-<td bgcolor="#EEEEFF" align="right" valign="top">
-<em>
-<b></b></em>
-</td>
-</tr>
-
-<tr>
-<td bgcolor="white" class="NavBarCell2"><font size="-2">
- PREV
- NEXT</font></td>
-<td bgcolor="white" class="NavBarCell2"><font size="-2">
- <a href="index.html" target="_top"><b>FRAMES</b></a>
- <a href="overview-summary.html" target="_top"><b>NO FRAMES</b></a>
-
-<script>
- <!--
- if(window==top) {
- document.writeln('<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>');
- }
- //-->
-</script>
-<noscript>
-<a href="allclasses-noframe.html" target=""><b>All Classes</b></a>
-</noscript>
-</font></td>
-</tr>
-</table>
-<!-- =========== END OF NAVBAR =========== -->
-
-<hr>
-<center>
-
- <h2>TinyMCE_ForceParagraphs.class.js</h2>
-
-</center>
-
-
-
-
-<h4>Summary</h4>
-<p>
-
- No overview generated for 'TinyMCE_ForceParagraphs.class.js'<BR/><BR/>
-
-</p>
-
-<hr>
-
-
-
-<!-- ========== METHOD SUMMARY =========== -->
-
-<!-- ========== END METHOD SUMMARY =========== -->
-
-
- <pre class="sourceview"><span class="comment">/**
- * $RCSfile: overview-summary-TinyMCE_ForceParagraphs.class.js.html,v $
- * $Revision: 1.42 $
- * $Date: 2006/04/14 20:00:30 $
- *
- * <span class="attrib">@author</span> Moxiecode
- * <span class="attrib">@copyright</span> Copyright © 2004-2006, Moxiecode Systems AB, All rights reserved.
- */</span>
-
-<span class="comment">/**
- * Forces P tags on return/enter in Gecko browsers.
- */</span>
-var TinyMCE_ForceParagraphs = {
- <span class="comment">/**
- * Inserts a paragraph at the current cursor location.
- *
- * <span class="attrib">@param</span> {TinyMCE_Control} inst TinyMCE editor control instance.
- * <span class="attrib">@param</span> {DOMEvent} e DOM event object.
- * <span class="attrib">@return</span> true on success or false if it fails.
- * <span class="attrib">@type</span> boolean
- * <span class="attrib">@private</span>
- */</span>
- _insertPara : <span class="reserved">function</span>(inst, e) {
- <span class="reserved">function</span> isEmpty(para) {
- <span class="reserved">function</span> isEmptyHTML(html) {
- <span class="reserved">return</span> html.replace(new RegExp(<span class="literal">'[ \t\r\n]+'</span>, <span class="literal">'g'</span>), <span class="literal">''</span>).toLowerCase() == <span class="literal">""</span>;
- }
-
- <span class="comment">// Check for images</span>
- <span class="reserved">if</span> (para.getElementsByTagName(<span class="literal">"img"</span>).length > 0)
- <span class="reserved">return</span> false;
-
- <span class="comment">// Check for tables</span>
- <span class="reserved">if</span> (para.getElementsByTagName(<span class="literal">"table"</span>).length > 0)
- <span class="reserved">return</span> false;
-
- <span class="comment">// Check for HRs</span>
- <span class="reserved">if</span> (para.getElementsByTagName(<span class="literal">"hr"</span>).length > 0)
- <span class="reserved">return</span> false;
-
- <span class="comment">// Check all textnodes</span>
- var nodes = tinyMCE.getNodeTree(para, new Array(), 3);
- <span class="reserved">for</span> (var i=0; i<nodes.length; i++) {
- <span class="reserved">if</span> (!isEmptyHTML(nodes[i].nodeValue))
- <span class="reserved">return</span> false;
- }
-
- <span class="comment">// No images, no tables, no hrs, no text content then it's empty</span>
- <span class="reserved">return</span> true;
- }
-
- var doc = inst.getDoc();
- var sel = inst.getSel();
- var win = inst.contentWindow;
- var rng = sel.getRangeAt(0);
- var body = doc.body;
- var rootElm = doc.documentElement;
- var blockName = <span class="literal">"P"</span>;
-
- <span class="comment">// tinyMCE.debug(body.innerHTML);</span>
-
- <span class="comment">// debug(e.target, sel.anchorNode.nodeName, sel.focusNode.nodeName, rng.startContainer, rng.endContainer, rng.commonAncestorContainer, sel.anchorOffset, sel.focusOffset, rng.toString());</span>
-
- <span class="comment">// Setup before range</span>
- var rngBefore = doc.createRange();
- rngBefore.setStart(sel.anchorNode, sel.anchorOffset);
- rngBefore.collapse(true);
-
- <span class="comment">// Setup after range</span>
- var rngAfter = doc.createRange();
- rngAfter.setStart(sel.focusNode, sel.focusOffset);
- rngAfter.collapse(true);
-
- <span class="comment">// Setup start/end points</span>
- var direct = rngBefore.compareBoundaryPoints(rngBefore.START_TO_END, rngAfter) < 0;
- var startNode = direct ? sel.anchorNode : sel.focusNode;
- var startOffset = direct ? sel.anchorOffset : sel.focusOffset;
- var endNode = direct ? sel.focusNode : sel.anchorNode;
- var endOffset = direct ? sel.focusOffset : sel.anchorOffset;
-
- startNode = startNode.nodeName == <span class="literal">"BODY"</span> ? startNode.firstChild : startNode;
- endNode = endNode.nodeName == <span class="literal">"BODY"</span> ? endNode.firstChild : endNode;
-
- <span class="comment">// tinyMCE.debug(startNode, endNode);</span>
-
- <span class="comment">// Get block elements</span>
- var startBlock = tinyMCE.getParentBlockElement(startNode);
- var endBlock = tinyMCE.getParentBlockElement(endNode);
-
- <span class="comment">// If absolute force paragraph generation within</span>
- <span class="reserved">if</span> (startBlock && new RegExp(<span class="literal">'absolute|relative|static'</span>, <span class="literal">'gi'</span>).test(startBlock.style.position))
- startBlock = null;
-
- <span class="reserved">if</span> (endBlock && new RegExp(<span class="literal">'absolute|relative|static'</span>, <span class="literal">'gi'</span>).test(endBlock.style.position))
- endBlock = null;
-
- <span class="comment">// Use current block name</span>
- <span class="reserved">if</span> (startBlock != null) {
- blockName = startBlock.nodeName;
-
- <span class="comment">// Use P instead</span>
- <span class="reserved">if</span> (blockName == <span class="literal">"TD"</span> || blockName == <span class="literal">"TABLE"</span> || (blockName == <span class="literal">"DIV"</span> && new RegExp(<span class="literal">'left|right'</span>, <span class="literal">'gi'</span>).test(startBlock.style.cssFloat)))
- blockName = <span class="literal">"P"</span>;
- }
-
- <span class="comment">// Within a list use normal behaviour</span>
- <span class="reserved">if</span> (tinyMCE.getParentElement(startBlock, <span class="literal">"OL,UL"</span>) != null)
- <span class="reserved">return</span> false;
-
- <span class="comment">// Within a table create new paragraphs</span>
- <span class="reserved">if</span> ((startBlock != null && startBlock.nodeName == <span class="literal">"TABLE"</span>) || (endBlock != null && endBlock.nodeName == <span class="literal">"TABLE"</span>))
- startBlock = endBlock = null;
-
- <span class="comment">// Setup new paragraphs</span>
- var paraBefore = (startBlock != null && startBlock.nodeName == blockName) ? startBlock.cloneNode(false) : doc.createElement(blockName);
- var paraAfter = (endBlock != null && endBlock.nodeName == blockName) ? endBlock.cloneNode(false) : doc.createElement(blockName);
-
- <span class="comment">// Is header, then force paragraph under</span>
- <span class="reserved">if</span> (/^(H[1-6])$/.test(blockName))
- paraAfter = doc.createElement(<span class="literal">"p"</span>);
-
- <span class="comment">// Setup chop nodes</span>
- var startChop = startNode;
- var endChop = endNode;
-
- <span class="comment">// Get startChop node</span>
- node = startChop;
- do {
- <span class="reserved">if</span> (node == body || node.nodeType == 9 || tinyMCE.isBlockElement(node))
- break;
-
- startChop = node;
- } <span class="reserved">while</span> ((node = node.previousSibling ? node.previousSibling : node.parentNode));
-
- <span class="comment">// Get endChop node</span>
- node = endChop;
- do {
- <span class="reserved">if</span> (node == body || node.nodeType == 9 || tinyMCE.isBlockElement(node))
- break;
-
- endChop = node;
- } <span class="reserved">while</span> ((node = node.nextSibling ? node.nextSibling : node.parentNode));
-
- <span class="comment">// Fix when only a image is within the TD</span>
- <span class="reserved">if</span> (startChop.nodeName == <span class="literal">"TD"</span>)
- startChop = startChop.firstChild;
-
- <span class="reserved">if</span> (endChop.nodeName == <span class="literal">"TD"</span>)
- endChop = endChop.lastChild;
-
- <span class="comment">// If not in a block element</span>
- <span class="reserved">if</span> (startBlock == null) {
- <span class="comment">// Delete selection</span>
- rng.deleteContents();
- sel.removeAllRanges();
-
- <span class="reserved">if</span> (startChop != rootElm && endChop != rootElm) {
- <span class="comment">// Insert paragraph before</span>
- rngBefore = rng.cloneRange();
-
- <span class="reserved">if</span> (startChop == body)
- rngBefore.setStart(startChop, 0);
- <span class="reserved">else</span>
- rngBefore.setStartBefore(startChop);
-
- paraBefore.appendChild(rngBefore.cloneContents());
-
- <span class="comment">// Insert paragraph after</span>
- <span class="reserved">if</span> (endChop.parentNode.nodeName == blockName)
- endChop = endChop.parentNode;
-
- <span class="comment">// If not after image</span>
- <span class="comment">//if (rng.startContainer.nodeName != "BODY" && rng.endContainer.nodeName != "BODY")</span>
- rng.setEndAfter(endChop);
-
- <span class="reserved">if</span> (endChop.nodeName != <span class="literal">"#text"</span> && endChop.nodeName != <span class="literal">"BODY"</span>)
- rngBefore.setEndAfter(endChop);
-
- var contents = rng.cloneContents();
- <span class="reserved">if</span> (contents.firstChild && (contents.firstChild.nodeName == blockName || contents.firstChild.nodeName == <span class="literal">"BODY"</span>))
- paraAfter.innerHTML = contents.firstChild.innerHTML;
- <span class="reserved">else</span>
- paraAfter.appendChild(contents);
-
- <span class="comment">// Check if it's a empty paragraph</span>
- <span class="reserved">if</span> (isEmpty(paraBefore))
- paraBefore.innerHTML = <span class="literal">" "</span>;
-
- <span class="comment">// Check if it's a empty paragraph</span>
- <span class="reserved">if</span> (isEmpty(paraAfter))
- paraAfter.innerHTML = <span class="literal">" "</span>;
-
- <span class="comment">// Delete old contents</span>
- rng.deleteContents();
- rngAfter.deleteContents();
- rngBefore.deleteContents();
-
- <span class="comment">// Insert new paragraphs</span>
- paraAfter.normalize();
- rngBefore.insertNode(paraAfter);
- paraBefore.normalize();
- rngBefore.insertNode(paraBefore);
-
- <span class="comment">// tinyMCE.debug("1: ", paraBefore.innerHTML, paraAfter.innerHTML);</span>
- } <span class="reserved">else</span> {
- body.innerHTML = <span class="literal">"<"</span> + blockName + <span class="literal">"> </"</span> + blockName + <span class="literal">"><"</span> + blockName + <span class="literal">"> </"</span> + blockName + <span class="literal">">"</span>;
- paraAfter = body.childNodes[1];
- }
-
- inst.selection.selectNode(paraAfter, true, true);
-
- <span class="reserved">return</span> true;
- }
-
- <span class="comment">// Place first part within new paragraph</span>
- <span class="reserved">if</span> (startChop.nodeName == blockName)
- rngBefore.setStart(startChop, 0);
- <span class="reserved">else</span>
- rngBefore.setStartBefore(startChop);
-
- rngBefore.setEnd(startNode, startOffset);
- paraBefore.appendChild(rngBefore.cloneContents());
-
- <span class="comment">// Place secound part within new paragraph</span>
- rngAfter.setEndAfter(endChop);
- rngAfter.setStart(endNode, endOffset);
- var contents = rngAfter.cloneContents();
-
- <span class="reserved">if</span> (contents.firstChild && contents.firstChild.nodeName == blockName) {
- <span class="comment">/* var nodes = contents.firstChild.childNodes;
- for (var i=0; i<nodes.length; i++) {
- //tinyMCE.debug(nodes[i].nodeName);
- if (nodes[i].nodeName != "BODY")
- paraAfter.appendChild(nodes[i]);
- }
- */</span>
- paraAfter.innerHTML = contents.firstChild.innerHTML;
- } <span class="reserved">else</span>
- paraAfter.appendChild(contents);
-
- <span class="comment">// Check if it's a empty paragraph</span>
- <span class="reserved">if</span> (isEmpty(paraBefore))
- paraBefore.innerHTML = <span class="literal">" "</span>;
-
- <span class="comment">// Check if it's a empty paragraph</span>
- <span class="reserved">if</span> (isEmpty(paraAfter))
- paraAfter.innerHTML = <span class="literal">" "</span>;
-
- <span class="comment">// Create a range around everything</span>
- var rng = doc.createRange();
-
- <span class="reserved">if</span> (!startChop.previousSibling && startChop.parentNode.nodeName.toUpperCase() == blockName) {
- rng.setStartBefore(startChop.parentNode);
- } <span class="reserved">else</span> {
- <span class="reserved">if</span> (rngBefore.startContainer.nodeName.toUpperCase() == blockName && rngBefore.startOffset == 0)
- rng.setStartBefore(rngBefore.startContainer);
- <span class="reserved">else</span>
- rng.setStart(rngBefore.startContainer, rngBefore.startOffset);
- }
-
- <span class="reserved">if</span> (!endChop.nextSibling && endChop.parentNode.nodeName.toUpperCase() == blockName)
- rng.setEndAfter(endChop.parentNode);
- <span class="reserved">else</span>
- rng.setEnd(rngAfter.endContainer, rngAfter.endOffset);
-
- <span class="comment">// Delete all contents and insert new paragraphs</span>
- rng.deleteContents();
- rng.insertNode(paraAfter);
- rng.insertNode(paraBefore);
- <span class="comment">//tinyMCE.debug("2", paraBefore.innerHTML, paraAfter.innerHTML);</span>
-
- <span class="comment">// Normalize</span>
- paraAfter.normalize();
- paraBefore.normalize();
-
- inst.selection.selectNode(paraAfter, true, true);
-
- <span class="reserved">return</span> true;
- },
-
- <span class="comment">/**
- * Handles the backspace action in Gecko. This will remove the weird BR element
- * that gets generated when a user hits backspace in the beginning of a paragraph.
- *
- * <span class="attrib">@param</span> {TinyMCE_Control} inst TinyMCE editor control instance.
- * <span class="attrib">@return</span> true/false if the event should be canceled or not.
- * <span class="attrib">@type</span>
- */</span>
- _handleBackSpace : <span class="reserved">function</span>(inst) {
- var r = inst.getRng(), sn = r.startContainer, nv, s = false;
-
- <span class="reserved">if</span> (sn && sn.nextSibling && sn.nextSibling.nodeName == <span class="literal">"BR"</span>) {
- nv = sn.nodeValue;
-
- <span class="comment">// Handle if a backspace is pressed after a space character #bug 1466054</span>
- <span class="reserved">if</span> (nv != null && nv.length >= r.startOffset && nv.charAt(r.startOffset - 1) == <span class="literal">' '</span>)
- s = true;
-
- <span class="comment">// Only remove BRs if we are at the end of line #bug 1464152</span>
- <span class="reserved">if</span> (nv != null && r.startOffset == nv.length)
- sn.nextSibling.parentNode.removeChild(sn.nextSibling);
- }
-
- <span class="reserved">return</span> s;
- }
-};
-</pre>
- <hr>
-
-
-
-<!-- ========== START OF NAVBAR ========== -->
-<a name="navbar_top"><!-- --></a>
-<table border="0" width="100%" cellpadding="1" cellspacing="0">
-<tr>
-<td colspan=2 bgcolor="#EEEEFF" class="NavBarCell1">
-<a name="navbar_top_firstrow"><!-- --></a>
-<table border="0" cellpadding="0" cellspacing="3">
- <tr align="center" valign="top">
-
-
- <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="overview-summary.html"><font class="NavBarFont1"><b>Overview</b></font></a> </td>
- <td bgcolor="#FFFFFF" class="NavBarCell1Rev"> <font class="NavBarFont1Rev"><b>File</b></font> </td>
-
-
- <td bgcolor="#FFFFFF" class="NavBarCell1"> <font class="NavBarFont1">Class</font> </td>
- <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="overview-tree.html"><font class="NavBarFont1"><b>Tree</b></font></a> </td>
- <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="index-all.html"--><font class="NavBarFont1"><b>Index</b></font></a> </td>
- <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="help-doc.html"><font class="NavBarFont1"><b>Help</b></font></a> </td>
- </tr>
-</table>
-</td>
-<td bgcolor="#EEEEFF" align="right" valign="top"><em>
-<b></b></em>
-</td>
-</tr>
-
-<tr>
-<td bgcolor="white" class="NavBarCell2"><font size="-2">
- PREV
- NEXT</font></td>
-<td bgcolor="white" class="NavBarCell2"><font size="-2">
- <a href="index.html" target="_top"><b>FRAMES</b></a>
- <a href="overview-summary.html" target="_top"><b>NO FRAMES</b></a>
-
-<script>
- <!--
- if(window==top) {
- document.writeln('<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>');
- }
- //-->
-</script>
-<noscript>
-<a href="allclasses-noframe.html" target=""><b>All Classes</b></a>
-</noscript>
-</font></td>
-</tr>
-</table>
-<!-- =========== END OF NAVBAR =========== -->
-
-<hr>
-<font size="-1">
-
-</font>
-<div class="jsdoc_ctime">Documentation generated by <a href="http://jsdoc.sourceforge.net/" target="_parent">JSDoc</a> on Fri Apr 14 21:59:23 2006</div>
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/tinymce_api/overview-summary-TinyMCE_ForceParagraphs.class.js.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/tinymce_api/overview-summary-TinyMCE_ForceParagraphs.class.js.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/tinymce_api/overview-summary-TinyMCE_ForceParagraphs.class.js.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/tinymce_api/overview-summary-TinyMCE_ForceParagraphs.class.js.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,460 @@
+<!doctype html public "-//W3C//DTD HTML 4.0 Frameset//EN""http://www.w3.org/TR/REC-html40/frameset.dtd">
+<html>
+<head>
+<title>
+ Overview
+</title>
+<link rel ="stylesheet" type="text/css" href="stylesheet.css" title="Style">
+<script>
+function asd() {
+
+ parent.document.title="TinyMCE_ForceParagraphs.class.js Overview";
+
+}
+</script>
+</head>
+<body bgcolor="white" onload="asd();">
+
+<!-- ========== START OF NAVBAR ========== -->
+<a name="navbar_top"><!-- --></a>
+<table border="0" width="100%" cellpadding="1" cellspacing="0">
+<tr>
+<td colspan=2 bgcolor="#EEEEFF" class="NavBarCell1">
+<a name="navbar_top_firstrow"><!-- --></a>
+<table border="0" cellpadding="0" cellspacing="3">
+ <tr align="center" valign="top">
+
+
+ <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="overview-summary.html"><font class="NavBarFont1"><b>Overview</b></font></a> </td>
+ <td bgcolor="#FFFFFF" class="NavBarCell1Rev"> <font class="NavBarFont1Rev"><b>File</b></font> </td>
+
+
+ <td bgcolor="#FFFFFF" class="NavBarCell1"> <font class="NavBarFont1">Class</font> </td>
+ <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="overview-tree.html"><font class="NavBarFont1"><b>Tree</b></font></a> </td>
+ <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="index-all.html"--><font class="NavBarFont1"><b>Index</b></font></a> </td>
+ <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="help-doc.html"><font class="NavBarFont1"><b>Help</b></font></a> </td>
+ </tr>
+</table>
+</td>
+<td bgcolor="#EEEEFF" align="right" valign="top">
+<em>
+<b></b></em>
+</td>
+</tr>
+
+<tr>
+<td bgcolor="white" class="NavBarCell2"><font size="-2">
+ PREV
+ NEXT</font></td>
+<td bgcolor="white" class="NavBarCell2"><font size="-2">
+ <a href="index.html" target="_top"><b>FRAMES</b></a>
+ <a href="overview-summary.html" target="_top"><b>NO FRAMES</b></a>
+
+<script>
+ <!--
+ if(window==top) {
+ document.writeln('<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>');
+ }
+ //-->
+</script>
+<noscript>
+<a href="allclasses-noframe.html" target=""><b>All Classes</b></a>
+</noscript>
+</font></td>
+</tr>
+</table>
+<!-- =========== END OF NAVBAR =========== -->
+
+<hr>
+<center>
+
+ <h2>TinyMCE_ForceParagraphs.class.js</h2>
+
+</center>
+
+
+
+
+<h4>Summary</h4>
+<p>
+
+ No overview generated for 'TinyMCE_ForceParagraphs.class.js'<BR/><BR/>
+
+</p>
+
+<hr>
+
+
+
+<!-- ========== METHOD SUMMARY =========== -->
+
+<!-- ========== END METHOD SUMMARY =========== -->
+
+
+ <pre class="sourceview"><span class="comment">/**
+ * $RCSfile: overview-summary-TinyMCE_ForceParagraphs.class.js.html,v $
+ * $Revision: 1.42 $
+ * $Date: 2006/04/14 20:00:30 $
+ *
+ * <span class="attrib">@author</span> Moxiecode
+ * <span class="attrib">@copyright</span> Copyright © 2004-2006, Moxiecode Systems AB, All rights reserved.
+ */</span>
+
+<span class="comment">/**
+ * Forces P tags on return/enter in Gecko browsers.
+ */</span>
+var TinyMCE_ForceParagraphs = {
+ <span class="comment">/**
+ * Inserts a paragraph at the current cursor location.
+ *
+ * <span class="attrib">@param</span> {TinyMCE_Control} inst TinyMCE editor control instance.
+ * <span class="attrib">@param</span> {DOMEvent} e DOM event object.
+ * <span class="attrib">@return</span> true on success or false if it fails.
+ * <span class="attrib">@type</span> boolean
+ * <span class="attrib">@private</span>
+ */</span>
+ _insertPara : <span class="reserved">function</span>(inst, e) {
+ <span class="reserved">function</span> isEmpty(para) {
+ <span class="reserved">function</span> isEmptyHTML(html) {
+ <span class="reserved">return</span> html.replace(new RegExp(<span class="literal">'[ \t\r\n]+'</span>, <span class="literal">'g'</span>), <span class="literal">''</span>).toLowerCase() == <span class="literal">""</span>;
+ }
+
+ <span class="comment">// Check for images</span>
+ <span class="reserved">if</span> (para.getElementsByTagName(<span class="literal">"img"</span>).length > 0)
+ <span class="reserved">return</span> false;
+
+ <span class="comment">// Check for tables</span>
+ <span class="reserved">if</span> (para.getElementsByTagName(<span class="literal">"table"</span>).length > 0)
+ <span class="reserved">return</span> false;
+
+ <span class="comment">// Check for HRs</span>
+ <span class="reserved">if</span> (para.getElementsByTagName(<span class="literal">"hr"</span>).length > 0)
+ <span class="reserved">return</span> false;
+
+ <span class="comment">// Check all textnodes</span>
+ var nodes = tinyMCE.getNodeTree(para, new Array(), 3);
+ <span class="reserved">for</span> (var i=0; i<nodes.length; i++) {
+ <span class="reserved">if</span> (!isEmptyHTML(nodes[i].nodeValue))
+ <span class="reserved">return</span> false;
+ }
+
+ <span class="comment">// No images, no tables, no hrs, no text content then it's empty</span>
+ <span class="reserved">return</span> true;
+ }
+
+ var doc = inst.getDoc();
+ var sel = inst.getSel();
+ var win = inst.contentWindow;
+ var rng = sel.getRangeAt(0);
+ var body = doc.body;
+ var rootElm = doc.documentElement;
+ var blockName = <span class="literal">"P"</span>;
+
+ <span class="comment">// tinyMCE.debug(body.innerHTML);</span>
+
+ <span class="comment">// debug(e.target, sel.anchorNode.nodeName, sel.focusNode.nodeName, rng.startContainer, rng.endContainer, rng.commonAncestorContainer, sel.anchorOffset, sel.focusOffset, rng.toString());</span>
+
+ <span class="comment">// Setup before range</span>
+ var rngBefore = doc.createRange();
+ rngBefore.setStart(sel.anchorNode, sel.anchorOffset);
+ rngBefore.collapse(true);
+
+ <span class="comment">// Setup after range</span>
+ var rngAfter = doc.createRange();
+ rngAfter.setStart(sel.focusNode, sel.focusOffset);
+ rngAfter.collapse(true);
+
+ <span class="comment">// Setup start/end points</span>
+ var direct = rngBefore.compareBoundaryPoints(rngBefore.START_TO_END, rngAfter) < 0;
+ var startNode = direct ? sel.anchorNode : sel.focusNode;
+ var startOffset = direct ? sel.anchorOffset : sel.focusOffset;
+ var endNode = direct ? sel.focusNode : sel.anchorNode;
+ var endOffset = direct ? sel.focusOffset : sel.anchorOffset;
+
+ startNode = startNode.nodeName == <span class="literal">"BODY"</span> ? startNode.firstChild : startNode;
+ endNode = endNode.nodeName == <span class="literal">"BODY"</span> ? endNode.firstChild : endNode;
+
+ <span class="comment">// tinyMCE.debug(startNode, endNode);</span>
+
+ <span class="comment">// Get block elements</span>
+ var startBlock = tinyMCE.getParentBlockElement(startNode);
+ var endBlock = tinyMCE.getParentBlockElement(endNode);
+
+ <span class="comment">// If absolute force paragraph generation within</span>
+ <span class="reserved">if</span> (startBlock && new RegExp(<span class="literal">'absolute|relative|static'</span>, <span class="literal">'gi'</span>).test(startBlock.style.position))
+ startBlock = null;
+
+ <span class="reserved">if</span> (endBlock && new RegExp(<span class="literal">'absolute|relative|static'</span>, <span class="literal">'gi'</span>).test(endBlock.style.position))
+ endBlock = null;
+
+ <span class="comment">// Use current block name</span>
+ <span class="reserved">if</span> (startBlock != null) {
+ blockName = startBlock.nodeName;
+
+ <span class="comment">// Use P instead</span>
+ <span class="reserved">if</span> (blockName == <span class="literal">"TD"</span> || blockName == <span class="literal">"TABLE"</span> || (blockName == <span class="literal">"DIV"</span> && new RegExp(<span class="literal">'left|right'</span>, <span class="literal">'gi'</span>).test(startBlock.style.cssFloat)))
+ blockName = <span class="literal">"P"</span>;
+ }
+
+ <span class="comment">// Within a list use normal behaviour</span>
+ <span class="reserved">if</span> (tinyMCE.getParentElement(startBlock, <span class="literal">"OL,UL"</span>) != null)
+ <span class="reserved">return</span> false;
+
+ <span class="comment">// Within a table create new paragraphs</span>
+ <span class="reserved">if</span> ((startBlock != null && startBlock.nodeName == <span class="literal">"TABLE"</span>) || (endBlock != null && endBlock.nodeName == <span class="literal">"TABLE"</span>))
+ startBlock = endBlock = null;
+
+ <span class="comment">// Setup new paragraphs</span>
+ var paraBefore = (startBlock != null && startBlock.nodeName == blockName) ? startBlock.cloneNode(false) : doc.createElement(blockName);
+ var paraAfter = (endBlock != null && endBlock.nodeName == blockName) ? endBlock.cloneNode(false) : doc.createElement(blockName);
+
+ <span class="comment">// Is header, then force paragraph under</span>
+ <span class="reserved">if</span> (/^(H[1-6])$/.test(blockName))
+ paraAfter = doc.createElement(<span class="literal">"p"</span>);
+
+ <span class="comment">// Setup chop nodes</span>
+ var startChop = startNode;
+ var endChop = endNode;
+
+ <span class="comment">// Get startChop node</span>
+ node = startChop;
+ do {
+ <span class="reserved">if</span> (node == body || node.nodeType == 9 || tinyMCE.isBlockElement(node))
+ break;
+
+ startChop = node;
+ } <span class="reserved">while</span> ((node = node.previousSibling ? node.previousSibling : node.parentNode));
+
+ <span class="comment">// Get endChop node</span>
+ node = endChop;
+ do {
+ <span class="reserved">if</span> (node == body || node.nodeType == 9 || tinyMCE.isBlockElement(node))
+ break;
+
+ endChop = node;
+ } <span class="reserved">while</span> ((node = node.nextSibling ? node.nextSibling : node.parentNode));
+
+ <span class="comment">// Fix when only a image is within the TD</span>
+ <span class="reserved">if</span> (startChop.nodeName == <span class="literal">"TD"</span>)
+ startChop = startChop.firstChild;
+
+ <span class="reserved">if</span> (endChop.nodeName == <span class="literal">"TD"</span>)
+ endChop = endChop.lastChild;
+
+ <span class="comment">// If not in a block element</span>
+ <span class="reserved">if</span> (startBlock == null) {
+ <span class="comment">// Delete selection</span>
+ rng.deleteContents();
+ sel.removeAllRanges();
+
+ <span class="reserved">if</span> (startChop != rootElm && endChop != rootElm) {
+ <span class="comment">// Insert paragraph before</span>
+ rngBefore = rng.cloneRange();
+
+ <span class="reserved">if</span> (startChop == body)
+ rngBefore.setStart(startChop, 0);
+ <span class="reserved">else</span>
+ rngBefore.setStartBefore(startChop);
+
+ paraBefore.appendChild(rngBefore.cloneContents());
+
+ <span class="comment">// Insert paragraph after</span>
+ <span class="reserved">if</span> (endChop.parentNode.nodeName == blockName)
+ endChop = endChop.parentNode;
+
+ <span class="comment">// If not after image</span>
+ <span class="comment">//if (rng.startContainer.nodeName != "BODY" && rng.endContainer.nodeName != "BODY")</span>
+ rng.setEndAfter(endChop);
+
+ <span class="reserved">if</span> (endChop.nodeName != <span class="literal">"#text"</span> && endChop.nodeName != <span class="literal">"BODY"</span>)
+ rngBefore.setEndAfter(endChop);
+
+ var contents = rng.cloneContents();
+ <span class="reserved">if</span> (contents.firstChild && (contents.firstChild.nodeName == blockName || contents.firstChild.nodeName == <span class="literal">"BODY"</span>))
+ paraAfter.innerHTML = contents.firstChild.innerHTML;
+ <span class="reserved">else</span>
+ paraAfter.appendChild(contents);
+
+ <span class="comment">// Check if it's a empty paragraph</span>
+ <span class="reserved">if</span> (isEmpty(paraBefore))
+ paraBefore.innerHTML = <span class="literal">" "</span>;
+
+ <span class="comment">// Check if it's a empty paragraph</span>
+ <span class="reserved">if</span> (isEmpty(paraAfter))
+ paraAfter.innerHTML = <span class="literal">" "</span>;
+
+ <span class="comment">// Delete old contents</span>
+ rng.deleteContents();
+ rngAfter.deleteContents();
+ rngBefore.deleteContents();
+
+ <span class="comment">// Insert new paragraphs</span>
+ paraAfter.normalize();
+ rngBefore.insertNode(paraAfter);
+ paraBefore.normalize();
+ rngBefore.insertNode(paraBefore);
+
+ <span class="comment">// tinyMCE.debug("1: ", paraBefore.innerHTML, paraAfter.innerHTML);</span>
+ } <span class="reserved">else</span> {
+ body.innerHTML = <span class="literal">"<"</span> + blockName + <span class="literal">"> </"</span> + blockName + <span class="literal">"><"</span> + blockName + <span class="literal">"> </"</span> + blockName + <span class="literal">">"</span>;
+ paraAfter = body.childNodes[1];
+ }
+
+ inst.selection.selectNode(paraAfter, true, true);
+
+ <span class="reserved">return</span> true;
+ }
+
+ <span class="comment">// Place first part within new paragraph</span>
+ <span class="reserved">if</span> (startChop.nodeName == blockName)
+ rngBefore.setStart(startChop, 0);
+ <span class="reserved">else</span>
+ rngBefore.setStartBefore(startChop);
+
+ rngBefore.setEnd(startNode, startOffset);
+ paraBefore.appendChild(rngBefore.cloneContents());
+
+ <span class="comment">// Place secound part within new paragraph</span>
+ rngAfter.setEndAfter(endChop);
+ rngAfter.setStart(endNode, endOffset);
+ var contents = rngAfter.cloneContents();
+
+ <span class="reserved">if</span> (contents.firstChild && contents.firstChild.nodeName == blockName) {
+ <span class="comment">/* var nodes = contents.firstChild.childNodes;
+ for (var i=0; i<nodes.length; i++) {
+ //tinyMCE.debug(nodes[i].nodeName);
+ if (nodes[i].nodeName != "BODY")
+ paraAfter.appendChild(nodes[i]);
+ }
+ */</span>
+ paraAfter.innerHTML = contents.firstChild.innerHTML;
+ } <span class="reserved">else</span>
+ paraAfter.appendChild(contents);
+
+ <span class="comment">// Check if it's a empty paragraph</span>
+ <span class="reserved">if</span> (isEmpty(paraBefore))
+ paraBefore.innerHTML = <span class="literal">" "</span>;
+
+ <span class="comment">// Check if it's a empty paragraph</span>
+ <span class="reserved">if</span> (isEmpty(paraAfter))
+ paraAfter.innerHTML = <span class="literal">" "</span>;
+
+ <span class="comment">// Create a range around everything</span>
+ var rng = doc.createRange();
+
+ <span class="reserved">if</span> (!startChop.previousSibling && startChop.parentNode.nodeName.toUpperCase() == blockName) {
+ rng.setStartBefore(startChop.parentNode);
+ } <span class="reserved">else</span> {
+ <span class="reserved">if</span> (rngBefore.startContainer.nodeName.toUpperCase() == blockName && rngBefore.startOffset == 0)
+ rng.setStartBefore(rngBefore.startContainer);
+ <span class="reserved">else</span>
+ rng.setStart(rngBefore.startContainer, rngBefore.startOffset);
+ }
+
+ <span class="reserved">if</span> (!endChop.nextSibling && endChop.parentNode.nodeName.toUpperCase() == blockName)
+ rng.setEndAfter(endChop.parentNode);
+ <span class="reserved">else</span>
+ rng.setEnd(rngAfter.endContainer, rngAfter.endOffset);
+
+ <span class="comment">// Delete all contents and insert new paragraphs</span>
+ rng.deleteContents();
+ rng.insertNode(paraAfter);
+ rng.insertNode(paraBefore);
+ <span class="comment">//tinyMCE.debug("2", paraBefore.innerHTML, paraAfter.innerHTML);</span>
+
+ <span class="comment">// Normalize</span>
+ paraAfter.normalize();
+ paraBefore.normalize();
+
+ inst.selection.selectNode(paraAfter, true, true);
+
+ <span class="reserved">return</span> true;
+ },
+
+ <span class="comment">/**
+ * Handles the backspace action in Gecko. This will remove the weird BR element
+ * that gets generated when a user hits backspace in the beginning of a paragraph.
+ *
+ * <span class="attrib">@param</span> {TinyMCE_Control} inst TinyMCE editor control instance.
+ * <span class="attrib">@return</span> true/false if the event should be canceled or not.
+ * <span class="attrib">@type</span>
+ */</span>
+ _handleBackSpace : <span class="reserved">function</span>(inst) {
+ var r = inst.getRng(), sn = r.startContainer, nv, s = false;
+
+ <span class="reserved">if</span> (sn && sn.nextSibling && sn.nextSibling.nodeName == <span class="literal">"BR"</span>) {
+ nv = sn.nodeValue;
+
+ <span class="comment">// Handle if a backspace is pressed after a space character #bug 1466054</span>
+ <span class="reserved">if</span> (nv != null && nv.length >= r.startOffset && nv.charAt(r.startOffset - 1) == <span class="literal">' '</span>)
+ s = true;
+
+ <span class="comment">// Only remove BRs if we are at the end of line #bug 1464152</span>
+ <span class="reserved">if</span> (nv != null && r.startOffset == nv.length)
+ sn.nextSibling.parentNode.removeChild(sn.nextSibling);
+ }
+
+ <span class="reserved">return</span> s;
+ }
+};
+</pre>
+ <hr>
+
+
+
+<!-- ========== START OF NAVBAR ========== -->
+<a name="navbar_top"><!-- --></a>
+<table border="0" width="100%" cellpadding="1" cellspacing="0">
+<tr>
+<td colspan=2 bgcolor="#EEEEFF" class="NavBarCell1">
+<a name="navbar_top_firstrow"><!-- --></a>
+<table border="0" cellpadding="0" cellspacing="3">
+ <tr align="center" valign="top">
+
+
+ <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="overview-summary.html"><font class="NavBarFont1"><b>Overview</b></font></a> </td>
+ <td bgcolor="#FFFFFF" class="NavBarCell1Rev"> <font class="NavBarFont1Rev"><b>File</b></font> </td>
+
+
+ <td bgcolor="#FFFFFF" class="NavBarCell1"> <font class="NavBarFont1">Class</font> </td>
+ <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="overview-tree.html"><font class="NavBarFont1"><b>Tree</b></font></a> </td>
+ <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="index-all.html"--><font class="NavBarFont1"><b>Index</b></font></a> </td>
+ <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="help-doc.html"><font class="NavBarFont1"><b>Help</b></font></a> </td>
+ </tr>
+</table>
+</td>
+<td bgcolor="#EEEEFF" align="right" valign="top"><em>
+<b></b></em>
+</td>
+</tr>
+
+<tr>
+<td bgcolor="white" class="NavBarCell2"><font size="-2">
+ PREV
+ NEXT</font></td>
+<td bgcolor="white" class="NavBarCell2"><font size="-2">
+ <a href="index.html" target="_top"><b>FRAMES</b></a>
+ <a href="overview-summary.html" target="_top"><b>NO FRAMES</b></a>
+
+<script>
+ <!--
+ if(window==top) {
+ document.writeln('<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>');
+ }
+ //-->
+</script>
+<noscript>
+<a href="allclasses-noframe.html" target=""><b>All Classes</b></a>
+</noscript>
+</font></td>
+</tr>
+</table>
+<!-- =========== END OF NAVBAR =========== -->
+
+<hr>
+<font size="-1">
+
+</font>
+<div class="jsdoc_ctime">Documentation generated by <a href="http://jsdoc.sourceforge.net/" target="_parent">JSDoc</a> on Fri Apr 14 21:59:23 2006</div>
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/tinymce_api/overview-summary-TinyMCE_Layer.class.js.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/tinymce_api/overview-summary-TinyMCE_Layer.class.js.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/tinymce_api/overview-summary-TinyMCE_Layer.class.js.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,455 +0,0 @@
-<!doctype html public "-//W3C//DTD HTML 4.0 Frameset//EN""http://www.w3.org/TR/REC-html40/frameset.dtd">
-<html>
-<head>
-<title>
- Overview
-</title>
-<link rel ="stylesheet" type="text/css" href="stylesheet.css" title="Style">
-<script>
-function asd() {
-
- parent.document.title="TinyMCE_Layer.class.js Overview";
-
-}
-</script>
-</head>
-<body bgcolor="white" onload="asd();">
-
-<!-- ========== START OF NAVBAR ========== -->
-<a name="navbar_top"><!-- --></a>
-<table border="0" width="100%" cellpadding="1" cellspacing="0">
-<tr>
-<td colspan=2 bgcolor="#EEEEFF" class="NavBarCell1">
-<a name="navbar_top_firstrow"><!-- --></a>
-<table border="0" cellpadding="0" cellspacing="3">
- <tr align="center" valign="top">
-
-
- <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="overview-summary.html"><font class="NavBarFont1"><b>Overview</b></font></a> </td>
- <td bgcolor="#FFFFFF" class="NavBarCell1Rev"> <font class="NavBarFont1Rev"><b>File</b></font> </td>
-
-
- <td bgcolor="#FFFFFF" class="NavBarCell1"> <font class="NavBarFont1">Class</font> </td>
- <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="overview-tree.html"><font class="NavBarFont1"><b>Tree</b></font></a> </td>
- <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="index-all.html"--><font class="NavBarFont1"><b>Index</b></font></a> </td>
- <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="help-doc.html"><font class="NavBarFont1"><b>Help</b></font></a> </td>
- </tr>
-</table>
-</td>
-<td bgcolor="#EEEEFF" align="right" valign="top">
-<em>
-<b></b></em>
-</td>
-</tr>
-
-<tr>
-<td bgcolor="white" class="NavBarCell2"><font size="-2">
- PREV
- NEXT</font></td>
-<td bgcolor="white" class="NavBarCell2"><font size="-2">
- <a href="index.html" target="_top"><b>FRAMES</b></a>
- <a href="overview-summary.html" target="_top"><b>NO FRAMES</b></a>
-
-<script>
- <!--
- if(window==top) {
- document.writeln('<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>');
- }
- //-->
-</script>
-<noscript>
-<a href="allclasses-noframe.html" target=""><b>All Classes</b></a>
-</noscript>
-</font></td>
-</tr>
-</table>
-<!-- =========== END OF NAVBAR =========== -->
-
-<hr>
-<center>
-
- <h2>TinyMCE_Layer.class.js</h2>
-
-</center>
-
-
-
-
-<h4>Summary</h4>
-<p>
-
- No overview generated for 'TinyMCE_Layer.class.js'<BR/><BR/>
-
-</p>
-
-<hr>
-
-
- <table border="1" cellpadding="3" cellspacing="0" width="100%">
- <tr bgcolor="#CCCCFF" class="TableHeadingColor">
- <td colspan=2><font size="+2">
-
- <b>Class Summary</b>
-
- </font></td>
- </tr>
-
- <tr bgcolor="white" class="TableRowColor">
- <td width="15%"><b><a href="TinyMCE_Layer.html">TinyMCE_Layer</a></b></td>
- <td> </td>
- </tr>
-
- </table>
- <hr/>
-
-
-<!-- ========== METHOD SUMMARY =========== -->
-
-<!-- ========== END METHOD SUMMARY =========== -->
-
-
- <pre class="sourceview"><span class="comment">/**
- * $RCSfile: overview-summary-TinyMCE_Layer.class.js.html,v $
- * $Revision: 1.19 $
- * $Date: 2006/04/14 20:00:30 $
- *
- * <span class="attrib">@author</span> Moxiecode
- * <span class="attrib">@copyright</span> Copyright © 2004-2006, Moxiecode Systems AB, All rights reserved.
- */</span>
-
-<span class="comment">/**
- * Constructor for the TinyMCE Layer. This class enables you to construct
- * floating layers that is visible on top of select input fields, flashes and iframes.
- *
- * <span class="attrib">@param</span> {string} id Unique ID name for the layer.
- * <span class="attrib">@param</span> {boolean} bm Block mode, defaults to true.
- */</span>
-<span class="reserved">function</span> TinyMCE_Layer(id, bm) {
- <span class="reserved">this</span>.id = id;
- <span class="reserved">this</span>.blockerElement = null;
- <span class="reserved">this</span>.events = false;
- <span class="reserved">this</span>.element = null;
- <span class="reserved">this</span>.blockMode = typeof(bm) != <span class="literal">'undefined'</span> ? bm : true;
- <span class="reserved">this</span>.doc = document;
-};
-
-TinyMCE_Layer.<span class="reserved">prototype</span> = {
- <span class="comment">/**
- * Moves the layer relative to the specified HTML element.
- *
- * <span class="attrib">@param</span> {HTMLElement} re Element to move the layer relative to.
- * <span class="attrib">@param</span> {string} p Position of the layer tl = top left, tr = top right, bl = bottom left, br = bottom right.
- */</span>
- moveRelativeTo : <span class="reserved">function</span>(re, p) {
- var rep = <span class="reserved">this</span>.getAbsPosition(re);
- var w = parseInt(re.offsetWidth);
- var h = parseInt(re.offsetHeight);
- var e = <span class="reserved">this</span>.getElement();
- var ew = parseInt(e.offsetWidth);
- var eh = parseInt(e.offsetHeight);
- var x, y;
-
- switch (p) {
- case <span class="literal">"tl"</span>:
- x = rep.absLeft;
- y = rep.absTop;
- break;
-
- case <span class="literal">"tr"</span>:
- x = rep.absLeft + w;
- y = rep.absTop;
- break;
-
- case <span class="literal">"bl"</span>:
- x = rep.absLeft;
- y = rep.absTop + h;
- break;
-
- case <span class="literal">"br"</span>:
- x = rep.absLeft + w;
- y = rep.absTop + h;
- break;
-
- case <span class="literal">"cc"</span>:
- x = rep.absLeft + (w / 2) - (ew / 2);
- y = rep.absTop + (h / 2) - (eh / 2);
- break;
- }
-
- <span class="reserved">this</span>.moveTo(x, y);
- },
-
- <span class="comment">/**
- * Moves the layer relative in pixels.
- *
- * <span class="attrib">@param</span> {int} x Horizontal relative position in pixels.
- * <span class="attrib">@param</span> {int} y Vertical relative position in pixels.
- */</span>
- moveBy : <span class="reserved">function</span>(x, y) {
- var e = <span class="reserved">this</span>.getElement();
- <span class="reserved">this</span>.moveTo(parseInt(e.style.left) + x, parseInt(e.style.top) + y);
- },
-
- <span class="comment">/**
- * Moves the layer absolute in pixels.
- *
- * <span class="attrib">@param</span> {int} x Horizontal absolute position in pixels.
- * <span class="attrib">@param</span> {int} y Vertical absolute position in pixels.
- */</span>
- moveTo : <span class="reserved">function</span>(x, y) {
- var e = <span class="reserved">this</span>.getElement();
-
- e.style.left = x + <span class="literal">"px"</span>;
- e.style.top = y + <span class="literal">"px"</span>;
-
- <span class="reserved">this</span>.updateBlocker();
- },
-
- <span class="comment">/**
- * Resizes the layer by the specified relative width and height.
- *
- * <span class="attrib">@param</span> {int} w Relative width value.
- * <span class="attrib">@param</span> {int} h Relative height value.
- */</span>
- resizeBy : <span class="reserved">function</span>(w, h) {
- var e = <span class="reserved">this</span>.getElement();
- <span class="reserved">this</span>.resizeTo(parseInt(e.style.width) + w, parseInt(e.style.height) + h);
- },
-
- <span class="comment">/**
- * Resizes the layer to the specified width and height.
- *
- * <span class="attrib">@param</span> {int} w Width value.
- * <span class="attrib">@param</span> {int} h Height value.
- */</span>
- resizeTo : <span class="reserved">function</span>(w, h) {
- var e = <span class="reserved">this</span>.getElement();
-
- <span class="reserved">if</span> (w != null)
- e.style.width = w + <span class="literal">"px"</span>;
-
- <span class="reserved">if</span> (h != null)
- e.style.height = h + <span class="literal">"px"</span>;
-
- <span class="reserved">this</span>.updateBlocker();
- },
-
- <span class="comment">/**
- * Shows the layer.
- */</span>
- show : <span class="reserved">function</span>() {
- <span class="reserved">this</span>.getElement().style.display = <span class="literal">'block'</span>;
- <span class="reserved">this</span>.updateBlocker();
- },
-
- <span class="comment">/**
- * Hides the layer.
- */</span>
- hide : <span class="reserved">function</span>() {
- <span class="reserved">this</span>.getElement().style.display = <span class="literal">'none'</span>;
- <span class="reserved">this</span>.updateBlocker();
- },
-
- <span class="comment">/**
- * Returns true/false if the layer is visible or not.
- *
- * <span class="attrib">@return</span> true/false if it's visible or not.
- * <span class="attrib">@type</span> boolean
- */</span>
- isVisible : <span class="reserved">function</span>() {
- <span class="reserved">return</span> <span class="reserved">this</span>.getElement().style.display == <span class="literal">'block'</span>;
- },
-
- <span class="comment">/**
- * Returns the DOM element that the layer is binded to.
- *
- * <span class="attrib">@return</span> DOM HTML element.
- * <span class="attrib">@type</span> HTMLElement
- */</span>
- getElement : <span class="reserved">function</span>() {
- <span class="reserved">if</span> (!<span class="reserved">this</span>.element)
- <span class="reserved">this</span>.element = <span class="reserved">this</span>.doc.getElementById(<span class="reserved">this</span>.id);
-
- <span class="reserved">return</span> <span class="reserved">this</span>.element;
- },
-
- <span class="comment">/**
- * Sets the block mode. If you set this property to true a control box blocker iframe
- * will be added to the document since MSIE has a issue where select boxes are visible
- * through layers.
- *
- * <span class="attrib">@param</span> {boolean} s Block mode state, true is the default value.
- */</span>
- setBlockMode : <span class="reserved">function</span>(s) {
- <span class="reserved">this</span>.blockMode = s;
- },
-
- <span class="comment">/**
- * Updates the select/iframe/flash blocker this will also block the caret in Firefox.
- */</span>
- updateBlocker : <span class="reserved">function</span>() {
- var e, b, x, y, w, h;
-
- b = <span class="reserved">this</span>.getBlocker();
- <span class="reserved">if</span> (b) {
- <span class="reserved">if</span> (<span class="reserved">this</span>.blockMode) {
- e = <span class="reserved">this</span>.getElement();
- x = <span class="reserved">this</span>.parseInt(e.style.left);
- y = <span class="reserved">this</span>.parseInt(e.style.top);
- w = <span class="reserved">this</span>.parseInt(e.offsetWidth);
- h = <span class="reserved">this</span>.parseInt(e.offsetHeight);
-
- b.style.left = x + <span class="literal">'px'</span>;
- b.style.top = y + <span class="literal">'px'</span>;
- b.style.width = w + <span class="literal">'px'</span>;
- b.style.height = h + <span class="literal">'px'</span>;
- b.style.display = e.style.display;
- } <span class="reserved">else</span>
- b.style.display = <span class="literal">'none'</span>;
- }
- },
-
- <span class="comment">/**
- * Returns the blocker DOM element, this is a invisible iframe.
- *
- * <span class="attrib">@return</span> DOM HTML element.
- * <span class="attrib">@type</span> HTMLElement
- */</span>
- getBlocker : <span class="reserved">function</span>() {
- var d, b;
-
- <span class="reserved">if</span> (!<span class="reserved">this</span>.blockerElement && <span class="reserved">this</span>.blockMode) {
- d = <span class="reserved">this</span>.doc;
- b = d.createElement(<span class="literal">"iframe"</span>);
-
- b.style.cssText = <span class="literal">'display: none; position: absolute; left: 0; top: 0'</span>;
- b.src = <span class="literal">'javascript:false;'</span>;
- b.frameBorder = <span class="literal">'0'</span>;
- b.scrolling = <span class="literal">'no'</span>;
-
- d.body.appendChild(b);
- <span class="reserved">this</span>.blockerElement = b;
- }
-
- <span class="reserved">return</span> <span class="reserved">this</span>.blockerElement;
- },
-
- <span class="comment">/**
- * Returns the absolute x, y cordinate of the specified node.
- *
- * <span class="attrib">@param</span> {DOMElement} n DOM node to retrive x, y of.
- * <span class="attrib">@return</span> Object containing absLeft and absTop properties.
- * <span class="attrib">@type</span> Object
- */</span>
- getAbsPosition : <span class="reserved">function</span>(n) {
- var p = {absLeft : 0, absTop : 0};
-
- <span class="reserved">while</span> (n) {
- p.absLeft += n.offsetLeft;
- p.absTop += n.offsetTop;
- n = n.offsetParent;
- }
-
- <span class="reserved">return</span> p;
- },
-
- <span class="comment">/**
- * Creates a element for the layer based on the id and specified name.
- *
- * <span class="attrib">@param</span> {string} n Element tag name, like div.
- * <span class="attrib">@param</span> {string} c Optional class name to set as class attribute value.
- * <span class="attrib">@param</span> {HTMLElement} p Optional parent element reference, defaults to body.
- * <span class="attrib">@return</span> HTML DOM element that got created.
- * <span class="attrib">@type</span> HTMLElement
- */</span>
- create : <span class="reserved">function</span>(n, c, p) {
- var d = <span class="reserved">this</span>.doc, e = d.createElement(n);
-
- e.setAttribute(<span class="literal">'id'</span>, <span class="reserved">this</span>.id);
-
- <span class="reserved">if</span> (c)
- e.className = c;
-
- <span class="reserved">if</span> (!p)
- p = d.body;
-
- p.appendChild(e);
-
- <span class="reserved">return</span> <span class="reserved">this</span>.element = e;
- },
-
- <span class="comment">/**
- * Parses a int value this method will return 0 if the string is empty.
- *
- * <span class="attrib">@param</span> {string} s String to parse value of.
- * <span class="attrib">@return</span> Parsed number.
- * <span class="attrib">@type</span> int
- */</span>
- parseInt : <span class="reserved">function</span>(s) {
- <span class="reserved">if</span> (s == null || s == <span class="literal">''</span>)
- <span class="reserved">return</span> 0;
-
- <span class="reserved">return</span> parseInt(s);
- }
-};
-</pre>
- <hr>
-
-
-
-<!-- ========== START OF NAVBAR ========== -->
-<a name="navbar_top"><!-- --></a>
-<table border="0" width="100%" cellpadding="1" cellspacing="0">
-<tr>
-<td colspan=2 bgcolor="#EEEEFF" class="NavBarCell1">
-<a name="navbar_top_firstrow"><!-- --></a>
-<table border="0" cellpadding="0" cellspacing="3">
- <tr align="center" valign="top">
-
-
- <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="overview-summary.html"><font class="NavBarFont1"><b>Overview</b></font></a> </td>
- <td bgcolor="#FFFFFF" class="NavBarCell1Rev"> <font class="NavBarFont1Rev"><b>File</b></font> </td>
-
-
- <td bgcolor="#FFFFFF" class="NavBarCell1"> <font class="NavBarFont1">Class</font> </td>
- <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="overview-tree.html"><font class="NavBarFont1"><b>Tree</b></font></a> </td>
- <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="index-all.html"--><font class="NavBarFont1"><b>Index</b></font></a> </td>
- <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="help-doc.html"><font class="NavBarFont1"><b>Help</b></font></a> </td>
- </tr>
-</table>
-</td>
-<td bgcolor="#EEEEFF" align="right" valign="top"><em>
-<b></b></em>
-</td>
-</tr>
-
-<tr>
-<td bgcolor="white" class="NavBarCell2"><font size="-2">
- PREV
- NEXT</font></td>
-<td bgcolor="white" class="NavBarCell2"><font size="-2">
- <a href="index.html" target="_top"><b>FRAMES</b></a>
- <a href="overview-summary.html" target="_top"><b>NO FRAMES</b></a>
-
-<script>
- <!--
- if(window==top) {
- document.writeln('<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>');
- }
- //-->
-</script>
-<noscript>
-<a href="allclasses-noframe.html" target=""><b>All Classes</b></a>
-</noscript>
-</font></td>
-</tr>
-</table>
-<!-- =========== END OF NAVBAR =========== -->
-
-<hr>
-<font size="-1">
-
-</font>
-<div class="jsdoc_ctime">Documentation generated by <a href="http://jsdoc.sourceforge.net/" target="_parent">JSDoc</a> on Fri Apr 14 21:59:23 2006</div>
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/tinymce_api/overview-summary-TinyMCE_Layer.class.js.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/tinymce_api/overview-summary-TinyMCE_Layer.class.js.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/tinymce_api/overview-summary-TinyMCE_Layer.class.js.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/tinymce_api/overview-summary-TinyMCE_Layer.class.js.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,455 @@
+<!doctype html public "-//W3C//DTD HTML 4.0 Frameset//EN""http://www.w3.org/TR/REC-html40/frameset.dtd">
+<html>
+<head>
+<title>
+ Overview
+</title>
+<link rel ="stylesheet" type="text/css" href="stylesheet.css" title="Style">
+<script>
+function asd() {
+
+ parent.document.title="TinyMCE_Layer.class.js Overview";
+
+}
+</script>
+</head>
+<body bgcolor="white" onload="asd();">
+
+<!-- ========== START OF NAVBAR ========== -->
+<a name="navbar_top"><!-- --></a>
+<table border="0" width="100%" cellpadding="1" cellspacing="0">
+<tr>
+<td colspan=2 bgcolor="#EEEEFF" class="NavBarCell1">
+<a name="navbar_top_firstrow"><!-- --></a>
+<table border="0" cellpadding="0" cellspacing="3">
+ <tr align="center" valign="top">
+
+
+ <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="overview-summary.html"><font class="NavBarFont1"><b>Overview</b></font></a> </td>
+ <td bgcolor="#FFFFFF" class="NavBarCell1Rev"> <font class="NavBarFont1Rev"><b>File</b></font> </td>
+
+
+ <td bgcolor="#FFFFFF" class="NavBarCell1"> <font class="NavBarFont1">Class</font> </td>
+ <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="overview-tree.html"><font class="NavBarFont1"><b>Tree</b></font></a> </td>
+ <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="index-all.html"--><font class="NavBarFont1"><b>Index</b></font></a> </td>
+ <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="help-doc.html"><font class="NavBarFont1"><b>Help</b></font></a> </td>
+ </tr>
+</table>
+</td>
+<td bgcolor="#EEEEFF" align="right" valign="top">
+<em>
+<b></b></em>
+</td>
+</tr>
+
+<tr>
+<td bgcolor="white" class="NavBarCell2"><font size="-2">
+ PREV
+ NEXT</font></td>
+<td bgcolor="white" class="NavBarCell2"><font size="-2">
+ <a href="index.html" target="_top"><b>FRAMES</b></a>
+ <a href="overview-summary.html" target="_top"><b>NO FRAMES</b></a>
+
+<script>
+ <!--
+ if(window==top) {
+ document.writeln('<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>');
+ }
+ //-->
+</script>
+<noscript>
+<a href="allclasses-noframe.html" target=""><b>All Classes</b></a>
+</noscript>
+</font></td>
+</tr>
+</table>
+<!-- =========== END OF NAVBAR =========== -->
+
+<hr>
+<center>
+
+ <h2>TinyMCE_Layer.class.js</h2>
+
+</center>
+
+
+
+
+<h4>Summary</h4>
+<p>
+
+ No overview generated for 'TinyMCE_Layer.class.js'<BR/><BR/>
+
+</p>
+
+<hr>
+
+
+ <table border="1" cellpadding="3" cellspacing="0" width="100%">
+ <tr bgcolor="#CCCCFF" class="TableHeadingColor">
+ <td colspan=2><font size="+2">
+
+ <b>Class Summary</b>
+
+ </font></td>
+ </tr>
+
+ <tr bgcolor="white" class="TableRowColor">
+ <td width="15%"><b><a href="TinyMCE_Layer.html">TinyMCE_Layer</a></b></td>
+ <td> </td>
+ </tr>
+
+ </table>
+ <hr/>
+
+
+<!-- ========== METHOD SUMMARY =========== -->
+
+<!-- ========== END METHOD SUMMARY =========== -->
+
+
+ <pre class="sourceview"><span class="comment">/**
+ * $RCSfile: overview-summary-TinyMCE_Layer.class.js.html,v $
+ * $Revision: 1.19 $
+ * $Date: 2006/04/14 20:00:30 $
+ *
+ * <span class="attrib">@author</span> Moxiecode
+ * <span class="attrib">@copyright</span> Copyright © 2004-2006, Moxiecode Systems AB, All rights reserved.
+ */</span>
+
+<span class="comment">/**
+ * Constructor for the TinyMCE Layer. This class enables you to construct
+ * floating layers that is visible on top of select input fields, flashes and iframes.
+ *
+ * <span class="attrib">@param</span> {string} id Unique ID name for the layer.
+ * <span class="attrib">@param</span> {boolean} bm Block mode, defaults to true.
+ */</span>
+<span class="reserved">function</span> TinyMCE_Layer(id, bm) {
+ <span class="reserved">this</span>.id = id;
+ <span class="reserved">this</span>.blockerElement = null;
+ <span class="reserved">this</span>.events = false;
+ <span class="reserved">this</span>.element = null;
+ <span class="reserved">this</span>.blockMode = typeof(bm) != <span class="literal">'undefined'</span> ? bm : true;
+ <span class="reserved">this</span>.doc = document;
+};
+
+TinyMCE_Layer.<span class="reserved">prototype</span> = {
+ <span class="comment">/**
+ * Moves the layer relative to the specified HTML element.
+ *
+ * <span class="attrib">@param</span> {HTMLElement} re Element to move the layer relative to.
+ * <span class="attrib">@param</span> {string} p Position of the layer tl = top left, tr = top right, bl = bottom left, br = bottom right.
+ */</span>
+ moveRelativeTo : <span class="reserved">function</span>(re, p) {
+ var rep = <span class="reserved">this</span>.getAbsPosition(re);
+ var w = parseInt(re.offsetWidth);
+ var h = parseInt(re.offsetHeight);
+ var e = <span class="reserved">this</span>.getElement();
+ var ew = parseInt(e.offsetWidth);
+ var eh = parseInt(e.offsetHeight);
+ var x, y;
+
+ switch (p) {
+ case <span class="literal">"tl"</span>:
+ x = rep.absLeft;
+ y = rep.absTop;
+ break;
+
+ case <span class="literal">"tr"</span>:
+ x = rep.absLeft + w;
+ y = rep.absTop;
+ break;
+
+ case <span class="literal">"bl"</span>:
+ x = rep.absLeft;
+ y = rep.absTop + h;
+ break;
+
+ case <span class="literal">"br"</span>:
+ x = rep.absLeft + w;
+ y = rep.absTop + h;
+ break;
+
+ case <span class="literal">"cc"</span>:
+ x = rep.absLeft + (w / 2) - (ew / 2);
+ y = rep.absTop + (h / 2) - (eh / 2);
+ break;
+ }
+
+ <span class="reserved">this</span>.moveTo(x, y);
+ },
+
+ <span class="comment">/**
+ * Moves the layer relative in pixels.
+ *
+ * <span class="attrib">@param</span> {int} x Horizontal relative position in pixels.
+ * <span class="attrib">@param</span> {int} y Vertical relative position in pixels.
+ */</span>
+ moveBy : <span class="reserved">function</span>(x, y) {
+ var e = <span class="reserved">this</span>.getElement();
+ <span class="reserved">this</span>.moveTo(parseInt(e.style.left) + x, parseInt(e.style.top) + y);
+ },
+
+ <span class="comment">/**
+ * Moves the layer absolute in pixels.
+ *
+ * <span class="attrib">@param</span> {int} x Horizontal absolute position in pixels.
+ * <span class="attrib">@param</span> {int} y Vertical absolute position in pixels.
+ */</span>
+ moveTo : <span class="reserved">function</span>(x, y) {
+ var e = <span class="reserved">this</span>.getElement();
+
+ e.style.left = x + <span class="literal">"px"</span>;
+ e.style.top = y + <span class="literal">"px"</span>;
+
+ <span class="reserved">this</span>.updateBlocker();
+ },
+
+ <span class="comment">/**
+ * Resizes the layer by the specified relative width and height.
+ *
+ * <span class="attrib">@param</span> {int} w Relative width value.
+ * <span class="attrib">@param</span> {int} h Relative height value.
+ */</span>
+ resizeBy : <span class="reserved">function</span>(w, h) {
+ var e = <span class="reserved">this</span>.getElement();
+ <span class="reserved">this</span>.resizeTo(parseInt(e.style.width) + w, parseInt(e.style.height) + h);
+ },
+
+ <span class="comment">/**
+ * Resizes the layer to the specified width and height.
+ *
+ * <span class="attrib">@param</span> {int} w Width value.
+ * <span class="attrib">@param</span> {int} h Height value.
+ */</span>
+ resizeTo : <span class="reserved">function</span>(w, h) {
+ var e = <span class="reserved">this</span>.getElement();
+
+ <span class="reserved">if</span> (w != null)
+ e.style.width = w + <span class="literal">"px"</span>;
+
+ <span class="reserved">if</span> (h != null)
+ e.style.height = h + <span class="literal">"px"</span>;
+
+ <span class="reserved">this</span>.updateBlocker();
+ },
+
+ <span class="comment">/**
+ * Shows the layer.
+ */</span>
+ show : <span class="reserved">function</span>() {
+ <span class="reserved">this</span>.getElement().style.display = <span class="literal">'block'</span>;
+ <span class="reserved">this</span>.updateBlocker();
+ },
+
+ <span class="comment">/**
+ * Hides the layer.
+ */</span>
+ hide : <span class="reserved">function</span>() {
+ <span class="reserved">this</span>.getElement().style.display = <span class="literal">'none'</span>;
+ <span class="reserved">this</span>.updateBlocker();
+ },
+
+ <span class="comment">/**
+ * Returns true/false if the layer is visible or not.
+ *
+ * <span class="attrib">@return</span> true/false if it's visible or not.
+ * <span class="attrib">@type</span> boolean
+ */</span>
+ isVisible : <span class="reserved">function</span>() {
+ <span class="reserved">return</span> <span class="reserved">this</span>.getElement().style.display == <span class="literal">'block'</span>;
+ },
+
+ <span class="comment">/**
+ * Returns the DOM element that the layer is binded to.
+ *
+ * <span class="attrib">@return</span> DOM HTML element.
+ * <span class="attrib">@type</span> HTMLElement
+ */</span>
+ getElement : <span class="reserved">function</span>() {
+ <span class="reserved">if</span> (!<span class="reserved">this</span>.element)
+ <span class="reserved">this</span>.element = <span class="reserved">this</span>.doc.getElementById(<span class="reserved">this</span>.id);
+
+ <span class="reserved">return</span> <span class="reserved">this</span>.element;
+ },
+
+ <span class="comment">/**
+ * Sets the block mode. If you set this property to true a control box blocker iframe
+ * will be added to the document since MSIE has a issue where select boxes are visible
+ * through layers.
+ *
+ * <span class="attrib">@param</span> {boolean} s Block mode state, true is the default value.
+ */</span>
+ setBlockMode : <span class="reserved">function</span>(s) {
+ <span class="reserved">this</span>.blockMode = s;
+ },
+
+ <span class="comment">/**
+ * Updates the select/iframe/flash blocker this will also block the caret in Firefox.
+ */</span>
+ updateBlocker : <span class="reserved">function</span>() {
+ var e, b, x, y, w, h;
+
+ b = <span class="reserved">this</span>.getBlocker();
+ <span class="reserved">if</span> (b) {
+ <span class="reserved">if</span> (<span class="reserved">this</span>.blockMode) {
+ e = <span class="reserved">this</span>.getElement();
+ x = <span class="reserved">this</span>.parseInt(e.style.left);
+ y = <span class="reserved">this</span>.parseInt(e.style.top);
+ w = <span class="reserved">this</span>.parseInt(e.offsetWidth);
+ h = <span class="reserved">this</span>.parseInt(e.offsetHeight);
+
+ b.style.left = x + <span class="literal">'px'</span>;
+ b.style.top = y + <span class="literal">'px'</span>;
+ b.style.width = w + <span class="literal">'px'</span>;
+ b.style.height = h + <span class="literal">'px'</span>;
+ b.style.display = e.style.display;
+ } <span class="reserved">else</span>
+ b.style.display = <span class="literal">'none'</span>;
+ }
+ },
+
+ <span class="comment">/**
+ * Returns the blocker DOM element, this is a invisible iframe.
+ *
+ * <span class="attrib">@return</span> DOM HTML element.
+ * <span class="attrib">@type</span> HTMLElement
+ */</span>
+ getBlocker : <span class="reserved">function</span>() {
+ var d, b;
+
+ <span class="reserved">if</span> (!<span class="reserved">this</span>.blockerElement && <span class="reserved">this</span>.blockMode) {
+ d = <span class="reserved">this</span>.doc;
+ b = d.createElement(<span class="literal">"iframe"</span>);
+
+ b.style.cssText = <span class="literal">'display: none; position: absolute; left: 0; top: 0'</span>;
+ b.src = <span class="literal">'javascript:false;'</span>;
+ b.frameBorder = <span class="literal">'0'</span>;
+ b.scrolling = <span class="literal">'no'</span>;
+
+ d.body.appendChild(b);
+ <span class="reserved">this</span>.blockerElement = b;
+ }
+
+ <span class="reserved">return</span> <span class="reserved">this</span>.blockerElement;
+ },
+
+ <span class="comment">/**
+ * Returns the absolute x, y cordinate of the specified node.
+ *
+ * <span class="attrib">@param</span> {DOMElement} n DOM node to retrive x, y of.
+ * <span class="attrib">@return</span> Object containing absLeft and absTop properties.
+ * <span class="attrib">@type</span> Object
+ */</span>
+ getAbsPosition : <span class="reserved">function</span>(n) {
+ var p = {absLeft : 0, absTop : 0};
+
+ <span class="reserved">while</span> (n) {
+ p.absLeft += n.offsetLeft;
+ p.absTop += n.offsetTop;
+ n = n.offsetParent;
+ }
+
+ <span class="reserved">return</span> p;
+ },
+
+ <span class="comment">/**
+ * Creates a element for the layer based on the id and specified name.
+ *
+ * <span class="attrib">@param</span> {string} n Element tag name, like div.
+ * <span class="attrib">@param</span> {string} c Optional class name to set as class attribute value.
+ * <span class="attrib">@param</span> {HTMLElement} p Optional parent element reference, defaults to body.
+ * <span class="attrib">@return</span> HTML DOM element that got created.
+ * <span class="attrib">@type</span> HTMLElement
+ */</span>
+ create : <span class="reserved">function</span>(n, c, p) {
+ var d = <span class="reserved">this</span>.doc, e = d.createElement(n);
+
+ e.setAttribute(<span class="literal">'id'</span>, <span class="reserved">this</span>.id);
+
+ <span class="reserved">if</span> (c)
+ e.className = c;
+
+ <span class="reserved">if</span> (!p)
+ p = d.body;
+
+ p.appendChild(e);
+
+ <span class="reserved">return</span> <span class="reserved">this</span>.element = e;
+ },
+
+ <span class="comment">/**
+ * Parses a int value this method will return 0 if the string is empty.
+ *
+ * <span class="attrib">@param</span> {string} s String to parse value of.
+ * <span class="attrib">@return</span> Parsed number.
+ * <span class="attrib">@type</span> int
+ */</span>
+ parseInt : <span class="reserved">function</span>(s) {
+ <span class="reserved">if</span> (s == null || s == <span class="literal">''</span>)
+ <span class="reserved">return</span> 0;
+
+ <span class="reserved">return</span> parseInt(s);
+ }
+};
+</pre>
+ <hr>
+
+
+
+<!-- ========== START OF NAVBAR ========== -->
+<a name="navbar_top"><!-- --></a>
+<table border="0" width="100%" cellpadding="1" cellspacing="0">
+<tr>
+<td colspan=2 bgcolor="#EEEEFF" class="NavBarCell1">
+<a name="navbar_top_firstrow"><!-- --></a>
+<table border="0" cellpadding="0" cellspacing="3">
+ <tr align="center" valign="top">
+
+
+ <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="overview-summary.html"><font class="NavBarFont1"><b>Overview</b></font></a> </td>
+ <td bgcolor="#FFFFFF" class="NavBarCell1Rev"> <font class="NavBarFont1Rev"><b>File</b></font> </td>
+
+
+ <td bgcolor="#FFFFFF" class="NavBarCell1"> <font class="NavBarFont1">Class</font> </td>
+ <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="overview-tree.html"><font class="NavBarFont1"><b>Tree</b></font></a> </td>
+ <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="index-all.html"--><font class="NavBarFont1"><b>Index</b></font></a> </td>
+ <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="help-doc.html"><font class="NavBarFont1"><b>Help</b></font></a> </td>
+ </tr>
+</table>
+</td>
+<td bgcolor="#EEEEFF" align="right" valign="top"><em>
+<b></b></em>
+</td>
+</tr>
+
+<tr>
+<td bgcolor="white" class="NavBarCell2"><font size="-2">
+ PREV
+ NEXT</font></td>
+<td bgcolor="white" class="NavBarCell2"><font size="-2">
+ <a href="index.html" target="_top"><b>FRAMES</b></a>
+ <a href="overview-summary.html" target="_top"><b>NO FRAMES</b></a>
+
+<script>
+ <!--
+ if(window==top) {
+ document.writeln('<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>');
+ }
+ //-->
+</script>
+<noscript>
+<a href="allclasses-noframe.html" target=""><b>All Classes</b></a>
+</noscript>
+</font></td>
+</tr>
+</table>
+<!-- =========== END OF NAVBAR =========== -->
+
+<hr>
+<font size="-1">
+
+</font>
+<div class="jsdoc_ctime">Documentation generated by <a href="http://jsdoc.sourceforge.net/" target="_parent">JSDoc</a> on Fri Apr 14 21:59:23 2006</div>
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/tinymce_api/overview-summary-TinyMCE_Menu.class.js.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/tinymce_api/overview-summary-TinyMCE_Menu.class.js.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/tinymce_api/overview-summary-TinyMCE_Menu.class.js.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,361 +0,0 @@
-<!doctype html public "-//W3C//DTD HTML 4.0 Frameset//EN""http://www.w3.org/TR/REC-html40/frameset.dtd">
-<html>
-<head>
-<title>
- Overview
-</title>
-<link rel ="stylesheet" type="text/css" href="stylesheet.css" title="Style">
-<script>
-function asd() {
-
- parent.document.title="TinyMCE_Menu.class.js Overview";
-
-}
-</script>
-</head>
-<body bgcolor="white" onload="asd();">
-
-<!-- ========== START OF NAVBAR ========== -->
-<a name="navbar_top"><!-- --></a>
-<table border="0" width="100%" cellpadding="1" cellspacing="0">
-<tr>
-<td colspan=2 bgcolor="#EEEEFF" class="NavBarCell1">
-<a name="navbar_top_firstrow"><!-- --></a>
-<table border="0" cellpadding="0" cellspacing="3">
- <tr align="center" valign="top">
-
-
- <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="overview-summary.html"><font class="NavBarFont1"><b>Overview</b></font></a> </td>
- <td bgcolor="#FFFFFF" class="NavBarCell1Rev"> <font class="NavBarFont1Rev"><b>File</b></font> </td>
-
-
- <td bgcolor="#FFFFFF" class="NavBarCell1"> <font class="NavBarFont1">Class</font> </td>
- <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="overview-tree.html"><font class="NavBarFont1"><b>Tree</b></font></a> </td>
- <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="index-all.html"--><font class="NavBarFont1"><b>Index</b></font></a> </td>
- <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="help-doc.html"><font class="NavBarFont1"><b>Help</b></font></a> </td>
- </tr>
-</table>
-</td>
-<td bgcolor="#EEEEFF" align="right" valign="top">
-<em>
-<b></b></em>
-</td>
-</tr>
-
-<tr>
-<td bgcolor="white" class="NavBarCell2"><font size="-2">
- PREV
- NEXT</font></td>
-<td bgcolor="white" class="NavBarCell2"><font size="-2">
- <a href="index.html" target="_top"><b>FRAMES</b></a>
- <a href="overview-summary.html" target="_top"><b>NO FRAMES</b></a>
-
-<script>
- <!--
- if(window==top) {
- document.writeln('<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>');
- }
- //-->
-</script>
-<noscript>
-<a href="allclasses-noframe.html" target=""><b>All Classes</b></a>
-</noscript>
-</font></td>
-</tr>
-</table>
-<!-- =========== END OF NAVBAR =========== -->
-
-<hr>
-<center>
-
- <h2>TinyMCE_Menu.class.js</h2>
-
-</center>
-
-
-
-
-<h4>Summary</h4>
-<p>
-
- No overview generated for 'TinyMCE_Menu.class.js'<BR/><BR/>
-
-</p>
-
-<hr>
-
-
-
-<!-- ========== METHOD SUMMARY =========== -->
-
- <a name="method_summary"><!-- --></a>
- <table border="1" cellpadding="3" cellspacing="0" width="100%">
- <tr bgcolor="#CCCCFF" class="TableHeadingColor">
- <td colspan=2>
- <font size="+2">
- <b>Method Summary</b>
- </font>
- </td>
- </tr>
-
-
- <tr bgcolor="white" class="TableRowColor">
- <td align="right" valign="top" width="1%">
- <font size="-1">
- <code>static void</code>
- </font>
- </td>
- <td>
- <code>
- <b>
- <a href="GLOBALS.html#TinyMCE_Menu">TinyMCE_Menu</a></b>()
- </code>
- <br>
-
- Constructor for the menu layer class.
- </td>
- </tr>
-
-
- </table>
- <p>
-
-<!-- ========== END METHOD SUMMARY =========== -->
-
-
- <pre class="sourceview"><span class="comment">/**
- * $RCSfile: overview-summary-TinyMCE_Menu.class.js.html,v $
- * $Revision: 1.15 $
- * $Date: 2006/04/14 20:00:30 $
- *
- * <span class="attrib">@author</span> Moxiecode
- * <span class="attrib">@copyright</span> Copyright © 2004-2006, Moxiecode Systems AB, All rights reserved.
- */</span>
-
-<span class="comment">/**
- * Constructor for the menu layer class.
- */</span>
-<span class="reserved">function</span> TinyMCE_Menu() {
- var id;
-
- <span class="reserved">if</span> (typeof(tinyMCE.menuCounter) == <span class="literal">"undefined"</span>)
- tinyMCE.menuCounter = 0;
-
- id = <span class="literal">"mc_menu_"</span> + tinyMCE.menuCounter++;
-
- TinyMCE_Layer.call(<span class="reserved">this</span>, id, true);
-
- <span class="reserved">this</span>.id = id;
- <span class="reserved">this</span>.items = new Array();
- <span class="reserved">this</span>.needsUpdate = true;
-};
-
-<span class="comment">// Extends the TinyMCE_Layer class</span>
-TinyMCE_Menu.<span class="reserved">prototype</span> = tinyMCE.extend(TinyMCE_Layer.<span class="reserved">prototype</span>, {
- <span class="comment">/**
- * Initializes the Menu with settings. This will also create the menu
- * as a DIV element if it doesn't exists in the DOM.
- *
- * <span class="attrib">@param</span> {Array} s Name/Value array with settings.
- */</span>
- init : <span class="reserved">function</span>(s) {
- var n;
-
- <span class="comment">// Default params</span>
- <span class="reserved">this</span>.settings = {
- separator_class : <span class="literal">'mceMenuSeparator'</span>,
- title_class : <span class="literal">'mceMenuTitle'</span>,
- disabled_class : <span class="literal">'mceMenuDisabled'</span>,
- menu_class : <span class="literal">'mceMenu'</span>,
- drop_menu : true
- };
-
- <span class="reserved">for</span> (n in s)
- <span class="reserved">this</span>.settings[n] = s[n];
-
- <span class="reserved">this</span>.create(<span class="literal">'div'</span>, <span class="reserved">this</span>.settings.menu_class);
- },
-
- <span class="comment">/**
- * Clears the menu.
- */</span>
- clear : <span class="reserved">function</span>() {
- <span class="reserved">this</span>.items = new Array();
- },
-
- <span class="comment">/**
- * Adds a menu title, this is a static item that can't be clicked.
- *
- * <span class="attrib">@param</span> {string} t Text to add to title.
- */</span>
- addTitle : <span class="reserved">function</span>(t) {
- <span class="reserved">this</span>.add({type : <span class="literal">'title'</span>, text : t});
- },
-
- <span class="comment">/**
- * Adds a disabled menu item, this is a static item that can't be clicked.
- *
- * <span class="attrib">@param</span> {string} t Text to add to title.
- */</span>
- addDisabled : <span class="reserved">function</span>(t) {
- <span class="reserved">this</span>.add({type : <span class="literal">'disabled'</span>, text : t});
- },
-
- <span class="comment">/**
- * Adds a menu separator line.
- */</span>
- addSeparator : <span class="reserved">function</span>() {
- <span class="reserved">this</span>.add({type : <span class="literal">'separator'</span>});
- },
-
- <span class="comment">/**
- * Adds a menu item.
- *
- * <span class="attrib">@param</span> {string} t Menu item text.
- * <span class="attrib">@param</span> {string} js JS string to evaluate on click.
- */</span>
- addItem : <span class="reserved">function</span>(t, js) {
- <span class="reserved">this</span>.add({text : t, js : js});
- },
-
- <span class="comment">/**
- * Adds a menu item object.
- *
- * <span class="attrib">@param</span> {Object} mi Menu item object to add.
- */</span>
- add : <span class="reserved">function</span>(mi) {
- <span class="reserved">this</span>.items[<span class="reserved">this</span>.items.length] = mi;
- <span class="reserved">this</span>.needsUpdate = true;
- },
-
- <span class="comment">/**
- * Update the menu with new HTML contents.
- */</span>
- update : <span class="reserved">function</span>() {
- var e = <span class="reserved">this</span>.getElement(), h = <span class="literal">''</span>, i, t, m = <span class="reserved">this</span>.items, s = <span class="reserved">this</span>.settings;
-
- <span class="reserved">if</span> (<span class="reserved">this</span>.settings.drop_menu)
- h += <span class="literal">'<span class="mceMenuLine"></span>'</span>;
-
- h += <span class="literal">'<table border="0" cellpadding="0" cellspacing="0">'</span>;
-
- <span class="reserved">for</span> (i=0; i<m.length; i++) {
- t = tinyMCE.xmlEncode(m[i].text);
- c = m[i].class_name ? <span class="literal">' class="'</span> + m[i].class_name + <span class="literal">'"'</span> : <span class="literal">''</span>;
-
- switch (m[i].type) {
- case <span class="literal">'separator'</span>:
- h += <span class="literal">'<tr class="'</span> + s.separator_class + <span class="literal">'"><td>'</span>;
- break;
-
- case <span class="literal">'title'</span>:
- h += <span class="literal">'<tr class="'</span> + s.title_class + <span class="literal">'"><td><span'</span> + c +<span class="literal">'>'</span> + t + <span class="literal">'</span>'</span>;
- break;
-
- case <span class="literal">'disabled'</span>:
- h += <span class="literal">'<tr class="'</span> + s.disabled_class + <span class="literal">'"><td><span'</span> + c +<span class="literal">'>'</span> + t + <span class="literal">'</span>'</span>;
- break;
-
- default:
- h += <span class="literal">'<tr><td><a href="javascript:void(0);" onmousedown="'</span> + tinyMCE.xmlEncode(m[i].js) + <span class="literal">';return false;"><span'</span> + c +<span class="literal">'>'</span> + t + <span class="literal">'</span></a>'</span>;
- }
-
- h += <span class="literal">'</td></tr>'</span>;
- }
-
- h += <span class="literal">'</table>'</span>;
-
- e.innerHTML = h;
-
- <span class="reserved">this</span>.needsUpdate = false;
- <span class="reserved">this</span>.updateBlocker();
- },
-
- <span class="comment">/**
- * Displays the menu. This function will automaticly hide any previously visible menus.
- */</span>
- show : <span class="reserved">function</span>() {
- var nl, i;
-
- <span class="reserved">if</span> (tinyMCE.lastMenu == <span class="reserved">this</span>)
- <span class="reserved">return</span>;
-
- <span class="reserved">if</span> (<span class="reserved">this</span>.needsUpdate)
- <span class="reserved">this</span>.update();
-
- <span class="reserved">if</span> (tinyMCE.lastMenu && tinyMCE.lastMenu != <span class="reserved">this</span>)
- tinyMCE.lastMenu.hide();
-
- TinyMCE_Layer.<span class="reserved">prototype</span>.show.call(<span class="reserved">this</span>);
-
- <span class="reserved">if</span> (!tinyMCE.isOpera) {
- <span class="comment">// Accessibility stuff</span>
-<span class="comment">/* nl = this.getElement().getElementsByTagName("a");
- if (nl.length > 0)
- nl[0].focus();*/</span>
- }
-
- tinyMCE.lastMenu = <span class="reserved">this</span>;
- }
-});
-</pre>
- <hr>
-
-
-
-<!-- ========== START OF NAVBAR ========== -->
-<a name="navbar_top"><!-- --></a>
-<table border="0" width="100%" cellpadding="1" cellspacing="0">
-<tr>
-<td colspan=2 bgcolor="#EEEEFF" class="NavBarCell1">
-<a name="navbar_top_firstrow"><!-- --></a>
-<table border="0" cellpadding="0" cellspacing="3">
- <tr align="center" valign="top">
-
-
- <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="overview-summary.html"><font class="NavBarFont1"><b>Overview</b></font></a> </td>
- <td bgcolor="#FFFFFF" class="NavBarCell1Rev"> <font class="NavBarFont1Rev"><b>File</b></font> </td>
-
-
- <td bgcolor="#FFFFFF" class="NavBarCell1"> <font class="NavBarFont1">Class</font> </td>
- <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="overview-tree.html"><font class="NavBarFont1"><b>Tree</b></font></a> </td>
- <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="index-all.html"--><font class="NavBarFont1"><b>Index</b></font></a> </td>
- <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="help-doc.html"><font class="NavBarFont1"><b>Help</b></font></a> </td>
- </tr>
-</table>
-</td>
-<td bgcolor="#EEEEFF" align="right" valign="top"><em>
-<b></b></em>
-</td>
-</tr>
-
-<tr>
-<td bgcolor="white" class="NavBarCell2"><font size="-2">
- PREV
- NEXT</font></td>
-<td bgcolor="white" class="NavBarCell2"><font size="-2">
- <a href="index.html" target="_top"><b>FRAMES</b></a>
- <a href="overview-summary.html" target="_top"><b>NO FRAMES</b></a>
-
-<script>
- <!--
- if(window==top) {
- document.writeln('<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>');
- }
- //-->
-</script>
-<noscript>
-<a href="allclasses-noframe.html" target=""><b>All Classes</b></a>
-</noscript>
-</font></td>
-</tr>
-</table>
-<!-- =========== END OF NAVBAR =========== -->
-
-<hr>
-<font size="-1">
-
-</font>
-<div class="jsdoc_ctime">Documentation generated by <a href="http://jsdoc.sourceforge.net/" target="_parent">JSDoc</a> on Fri Apr 14 21:59:23 2006</div>
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/tinymce_api/overview-summary-TinyMCE_Menu.class.js.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/tinymce_api/overview-summary-TinyMCE_Menu.class.js.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/tinymce_api/overview-summary-TinyMCE_Menu.class.js.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/tinymce_api/overview-summary-TinyMCE_Menu.class.js.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,361 @@
+<!doctype html public "-//W3C//DTD HTML 4.0 Frameset//EN""http://www.w3.org/TR/REC-html40/frameset.dtd">
+<html>
+<head>
+<title>
+ Overview
+</title>
+<link rel ="stylesheet" type="text/css" href="stylesheet.css" title="Style">
+<script>
+function asd() {
+
+ parent.document.title="TinyMCE_Menu.class.js Overview";
+
+}
+</script>
+</head>
+<body bgcolor="white" onload="asd();">
+
+<!-- ========== START OF NAVBAR ========== -->
+<a name="navbar_top"><!-- --></a>
+<table border="0" width="100%" cellpadding="1" cellspacing="0">
+<tr>
+<td colspan=2 bgcolor="#EEEEFF" class="NavBarCell1">
+<a name="navbar_top_firstrow"><!-- --></a>
+<table border="0" cellpadding="0" cellspacing="3">
+ <tr align="center" valign="top">
+
+
+ <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="overview-summary.html"><font class="NavBarFont1"><b>Overview</b></font></a> </td>
+ <td bgcolor="#FFFFFF" class="NavBarCell1Rev"> <font class="NavBarFont1Rev"><b>File</b></font> </td>
+
+
+ <td bgcolor="#FFFFFF" class="NavBarCell1"> <font class="NavBarFont1">Class</font> </td>
+ <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="overview-tree.html"><font class="NavBarFont1"><b>Tree</b></font></a> </td>
+ <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="index-all.html"--><font class="NavBarFont1"><b>Index</b></font></a> </td>
+ <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="help-doc.html"><font class="NavBarFont1"><b>Help</b></font></a> </td>
+ </tr>
+</table>
+</td>
+<td bgcolor="#EEEEFF" align="right" valign="top">
+<em>
+<b></b></em>
+</td>
+</tr>
+
+<tr>
+<td bgcolor="white" class="NavBarCell2"><font size="-2">
+ PREV
+ NEXT</font></td>
+<td bgcolor="white" class="NavBarCell2"><font size="-2">
+ <a href="index.html" target="_top"><b>FRAMES</b></a>
+ <a href="overview-summary.html" target="_top"><b>NO FRAMES</b></a>
+
+<script>
+ <!--
+ if(window==top) {
+ document.writeln('<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>');
+ }
+ //-->
+</script>
+<noscript>
+<a href="allclasses-noframe.html" target=""><b>All Classes</b></a>
+</noscript>
+</font></td>
+</tr>
+</table>
+<!-- =========== END OF NAVBAR =========== -->
+
+<hr>
+<center>
+
+ <h2>TinyMCE_Menu.class.js</h2>
+
+</center>
+
+
+
+
+<h4>Summary</h4>
+<p>
+
+ No overview generated for 'TinyMCE_Menu.class.js'<BR/><BR/>
+
+</p>
+
+<hr>
+
+
+
+<!-- ========== METHOD SUMMARY =========== -->
+
+ <a name="method_summary"><!-- --></a>
+ <table border="1" cellpadding="3" cellspacing="0" width="100%">
+ <tr bgcolor="#CCCCFF" class="TableHeadingColor">
+ <td colspan=2>
+ <font size="+2">
+ <b>Method Summary</b>
+ </font>
+ </td>
+ </tr>
+
+
+ <tr bgcolor="white" class="TableRowColor">
+ <td align="right" valign="top" width="1%">
+ <font size="-1">
+ <code>static void</code>
+ </font>
+ </td>
+ <td>
+ <code>
+ <b>
+ <a href="GLOBALS.html#TinyMCE_Menu">TinyMCE_Menu</a></b>()
+ </code>
+ <br>
+
+ Constructor for the menu layer class.
+ </td>
+ </tr>
+
+
+ </table>
+ <p>
+
+<!-- ========== END METHOD SUMMARY =========== -->
+
+
+ <pre class="sourceview"><span class="comment">/**
+ * $RCSfile: overview-summary-TinyMCE_Menu.class.js.html,v $
+ * $Revision: 1.15 $
+ * $Date: 2006/04/14 20:00:30 $
+ *
+ * <span class="attrib">@author</span> Moxiecode
+ * <span class="attrib">@copyright</span> Copyright © 2004-2006, Moxiecode Systems AB, All rights reserved.
+ */</span>
+
+<span class="comment">/**
+ * Constructor for the menu layer class.
+ */</span>
+<span class="reserved">function</span> TinyMCE_Menu() {
+ var id;
+
+ <span class="reserved">if</span> (typeof(tinyMCE.menuCounter) == <span class="literal">"undefined"</span>)
+ tinyMCE.menuCounter = 0;
+
+ id = <span class="literal">"mc_menu_"</span> + tinyMCE.menuCounter++;
+
+ TinyMCE_Layer.call(<span class="reserved">this</span>, id, true);
+
+ <span class="reserved">this</span>.id = id;
+ <span class="reserved">this</span>.items = new Array();
+ <span class="reserved">this</span>.needsUpdate = true;
+};
+
+<span class="comment">// Extends the TinyMCE_Layer class</span>
+TinyMCE_Menu.<span class="reserved">prototype</span> = tinyMCE.extend(TinyMCE_Layer.<span class="reserved">prototype</span>, {
+ <span class="comment">/**
+ * Initializes the Menu with settings. This will also create the menu
+ * as a DIV element if it doesn't exists in the DOM.
+ *
+ * <span class="attrib">@param</span> {Array} s Name/Value array with settings.
+ */</span>
+ init : <span class="reserved">function</span>(s) {
+ var n;
+
+ <span class="comment">// Default params</span>
+ <span class="reserved">this</span>.settings = {
+ separator_class : <span class="literal">'mceMenuSeparator'</span>,
+ title_class : <span class="literal">'mceMenuTitle'</span>,
+ disabled_class : <span class="literal">'mceMenuDisabled'</span>,
+ menu_class : <span class="literal">'mceMenu'</span>,
+ drop_menu : true
+ };
+
+ <span class="reserved">for</span> (n in s)
+ <span class="reserved">this</span>.settings[n] = s[n];
+
+ <span class="reserved">this</span>.create(<span class="literal">'div'</span>, <span class="reserved">this</span>.settings.menu_class);
+ },
+
+ <span class="comment">/**
+ * Clears the menu.
+ */</span>
+ clear : <span class="reserved">function</span>() {
+ <span class="reserved">this</span>.items = new Array();
+ },
+
+ <span class="comment">/**
+ * Adds a menu title, this is a static item that can't be clicked.
+ *
+ * <span class="attrib">@param</span> {string} t Text to add to title.
+ */</span>
+ addTitle : <span class="reserved">function</span>(t) {
+ <span class="reserved">this</span>.add({type : <span class="literal">'title'</span>, text : t});
+ },
+
+ <span class="comment">/**
+ * Adds a disabled menu item, this is a static item that can't be clicked.
+ *
+ * <span class="attrib">@param</span> {string} t Text to add to title.
+ */</span>
+ addDisabled : <span class="reserved">function</span>(t) {
+ <span class="reserved">this</span>.add({type : <span class="literal">'disabled'</span>, text : t});
+ },
+
+ <span class="comment">/**
+ * Adds a menu separator line.
+ */</span>
+ addSeparator : <span class="reserved">function</span>() {
+ <span class="reserved">this</span>.add({type : <span class="literal">'separator'</span>});
+ },
+
+ <span class="comment">/**
+ * Adds a menu item.
+ *
+ * <span class="attrib">@param</span> {string} t Menu item text.
+ * <span class="attrib">@param</span> {string} js JS string to evaluate on click.
+ */</span>
+ addItem : <span class="reserved">function</span>(t, js) {
+ <span class="reserved">this</span>.add({text : t, js : js});
+ },
+
+ <span class="comment">/**
+ * Adds a menu item object.
+ *
+ * <span class="attrib">@param</span> {Object} mi Menu item object to add.
+ */</span>
+ add : <span class="reserved">function</span>(mi) {
+ <span class="reserved">this</span>.items[<span class="reserved">this</span>.items.length] = mi;
+ <span class="reserved">this</span>.needsUpdate = true;
+ },
+
+ <span class="comment">/**
+ * Update the menu with new HTML contents.
+ */</span>
+ update : <span class="reserved">function</span>() {
+ var e = <span class="reserved">this</span>.getElement(), h = <span class="literal">''</span>, i, t, m = <span class="reserved">this</span>.items, s = <span class="reserved">this</span>.settings;
+
+ <span class="reserved">if</span> (<span class="reserved">this</span>.settings.drop_menu)
+ h += <span class="literal">'<span class="mceMenuLine"></span>'</span>;
+
+ h += <span class="literal">'<table border="0" cellpadding="0" cellspacing="0">'</span>;
+
+ <span class="reserved">for</span> (i=0; i<m.length; i++) {
+ t = tinyMCE.xmlEncode(m[i].text);
+ c = m[i].class_name ? <span class="literal">' class="'</span> + m[i].class_name + <span class="literal">'"'</span> : <span class="literal">''</span>;
+
+ switch (m[i].type) {
+ case <span class="literal">'separator'</span>:
+ h += <span class="literal">'<tr class="'</span> + s.separator_class + <span class="literal">'"><td>'</span>;
+ break;
+
+ case <span class="literal">'title'</span>:
+ h += <span class="literal">'<tr class="'</span> + s.title_class + <span class="literal">'"><td><span'</span> + c +<span class="literal">'>'</span> + t + <span class="literal">'</span>'</span>;
+ break;
+
+ case <span class="literal">'disabled'</span>:
+ h += <span class="literal">'<tr class="'</span> + s.disabled_class + <span class="literal">'"><td><span'</span> + c +<span class="literal">'>'</span> + t + <span class="literal">'</span>'</span>;
+ break;
+
+ default:
+ h += <span class="literal">'<tr><td><a href="javascript:void(0);" onmousedown="'</span> + tinyMCE.xmlEncode(m[i].js) + <span class="literal">';return false;"><span'</span> + c +<span class="literal">'>'</span> + t + <span class="literal">'</span></a>'</span>;
+ }
+
+ h += <span class="literal">'</td></tr>'</span>;
+ }
+
+ h += <span class="literal">'</table>'</span>;
+
+ e.innerHTML = h;
+
+ <span class="reserved">this</span>.needsUpdate = false;
+ <span class="reserved">this</span>.updateBlocker();
+ },
+
+ <span class="comment">/**
+ * Displays the menu. This function will automaticly hide any previously visible menus.
+ */</span>
+ show : <span class="reserved">function</span>() {
+ var nl, i;
+
+ <span class="reserved">if</span> (tinyMCE.lastMenu == <span class="reserved">this</span>)
+ <span class="reserved">return</span>;
+
+ <span class="reserved">if</span> (<span class="reserved">this</span>.needsUpdate)
+ <span class="reserved">this</span>.update();
+
+ <span class="reserved">if</span> (tinyMCE.lastMenu && tinyMCE.lastMenu != <span class="reserved">this</span>)
+ tinyMCE.lastMenu.hide();
+
+ TinyMCE_Layer.<span class="reserved">prototype</span>.show.call(<span class="reserved">this</span>);
+
+ <span class="reserved">if</span> (!tinyMCE.isOpera) {
+ <span class="comment">// Accessibility stuff</span>
+<span class="comment">/* nl = this.getElement().getElementsByTagName("a");
+ if (nl.length > 0)
+ nl[0].focus();*/</span>
+ }
+
+ tinyMCE.lastMenu = <span class="reserved">this</span>;
+ }
+});
+</pre>
+ <hr>
+
+
+
+<!-- ========== START OF NAVBAR ========== -->
+<a name="navbar_top"><!-- --></a>
+<table border="0" width="100%" cellpadding="1" cellspacing="0">
+<tr>
+<td colspan=2 bgcolor="#EEEEFF" class="NavBarCell1">
+<a name="navbar_top_firstrow"><!-- --></a>
+<table border="0" cellpadding="0" cellspacing="3">
+ <tr align="center" valign="top">
+
+
+ <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="overview-summary.html"><font class="NavBarFont1"><b>Overview</b></font></a> </td>
+ <td bgcolor="#FFFFFF" class="NavBarCell1Rev"> <font class="NavBarFont1Rev"><b>File</b></font> </td>
+
+
+ <td bgcolor="#FFFFFF" class="NavBarCell1"> <font class="NavBarFont1">Class</font> </td>
+ <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="overview-tree.html"><font class="NavBarFont1"><b>Tree</b></font></a> </td>
+ <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="index-all.html"--><font class="NavBarFont1"><b>Index</b></font></a> </td>
+ <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="help-doc.html"><font class="NavBarFont1"><b>Help</b></font></a> </td>
+ </tr>
+</table>
+</td>
+<td bgcolor="#EEEEFF" align="right" valign="top"><em>
+<b></b></em>
+</td>
+</tr>
+
+<tr>
+<td bgcolor="white" class="NavBarCell2"><font size="-2">
+ PREV
+ NEXT</font></td>
+<td bgcolor="white" class="NavBarCell2"><font size="-2">
+ <a href="index.html" target="_top"><b>FRAMES</b></a>
+ <a href="overview-summary.html" target="_top"><b>NO FRAMES</b></a>
+
+<script>
+ <!--
+ if(window==top) {
+ document.writeln('<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>');
+ }
+ //-->
+</script>
+<noscript>
+<a href="allclasses-noframe.html" target=""><b>All Classes</b></a>
+</noscript>
+</font></td>
+</tr>
+</table>
+<!-- =========== END OF NAVBAR =========== -->
+
+<hr>
+<font size="-1">
+
+</font>
+<div class="jsdoc_ctime">Documentation generated by <a href="http://jsdoc.sourceforge.net/" target="_parent">JSDoc</a> on Fri Apr 14 21:59:23 2006</div>
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/tinymce_api/overview-summary-TinyMCE_Popup.class.js.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/tinymce_api/overview-summary-TinyMCE_Popup.class.js.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/tinymce_api/overview-summary-TinyMCE_Popup.class.js.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,511 +0,0 @@
-<!doctype html public "-//W3C//DTD HTML 4.0 Frameset//EN""http://www.w3.org/TR/REC-html40/frameset.dtd">
-<html>
-<head>
-<title>
- Overview
-</title>
-<link rel ="stylesheet" type="text/css" href="stylesheet.css" title="Style">
-<script>
-function asd() {
-
- parent.document.title="TinyMCE_Popup.class.js Overview";
-
-}
-</script>
-</head>
-<body bgcolor="white" onload="asd();">
-
-<!-- ========== START OF NAVBAR ========== -->
-<a name="navbar_top"><!-- --></a>
-<table border="0" width="100%" cellpadding="1" cellspacing="0">
-<tr>
-<td colspan=2 bgcolor="#EEEEFF" class="NavBarCell1">
-<a name="navbar_top_firstrow"><!-- --></a>
-<table border="0" cellpadding="0" cellspacing="3">
- <tr align="center" valign="top">
-
-
- <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="overview-summary.html"><font class="NavBarFont1"><b>Overview</b></font></a> </td>
- <td bgcolor="#FFFFFF" class="NavBarCell1Rev"> <font class="NavBarFont1Rev"><b>File</b></font> </td>
-
-
- <td bgcolor="#FFFFFF" class="NavBarCell1"> <font class="NavBarFont1">Class</font> </td>
- <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="overview-tree.html"><font class="NavBarFont1"><b>Tree</b></font></a> </td>
- <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="index-all.html"--><font class="NavBarFont1"><b>Index</b></font></a> </td>
- <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="help-doc.html"><font class="NavBarFont1"><b>Help</b></font></a> </td>
- </tr>
-</table>
-</td>
-<td bgcolor="#EEEEFF" align="right" valign="top">
-<em>
-<b></b></em>
-</td>
-</tr>
-
-<tr>
-<td bgcolor="white" class="NavBarCell2"><font size="-2">
- PREV
- NEXT</font></td>
-<td bgcolor="white" class="NavBarCell2"><font size="-2">
- <a href="index.html" target="_top"><b>FRAMES</b></a>
- <a href="overview-summary.html" target="_top"><b>NO FRAMES</b></a>
-
-<script>
- <!--
- if(window==top) {
- document.writeln('<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>');
- }
- //-->
-</script>
-<noscript>
-<a href="allclasses-noframe.html" target=""><b>All Classes</b></a>
-</noscript>
-</font></td>
-</tr>
-</table>
-<!-- =========== END OF NAVBAR =========== -->
-
-<hr>
-<center>
-
- <h2>TinyMCE_Popup.class.js</h2>
-
-</center>
-
-
-
-
-<h4>Summary</h4>
-<p>
-
- No overview generated for 'TinyMCE_Popup.class.js'<BR/><BR/>
-
-</p>
-
-<hr>
-
-
- <table border="1" cellpadding="3" cellspacing="0" width="100%">
- <tr bgcolor="#CCCCFF" class="TableHeadingColor">
- <td colspan=2><font size="+2">
-
- <b>Class Summary</b>
-
- </font></td>
- </tr>
-
- <tr bgcolor="white" class="TableRowColor">
- <td width="15%"><b><a href="TinyMCE_Popup.html">TinyMCE_Popup</a></b></td>
- <td> </td>
- </tr>
-
- </table>
- <hr/>
-
-
-<!-- ========== METHOD SUMMARY =========== -->
-
-<!-- ========== END METHOD SUMMARY =========== -->
-
-
- <pre class="sourceview"><span class="comment">/**
- * $RCSfile: overview-summary-TinyMCE_Popup.class.js.html,v $
- * $Revision: 1.24 $
- * $Date: 2006/04/14 20:00:30 $
- *
- * <span class="attrib">@author</span> Moxiecode
- * <span class="attrib">@copyright</span> Copyright © 2004-2006, Moxiecode Systems AB, All rights reserved.
- */</span>
-
-<span class="comment">// Some global instances, this will be filled later</span>
-var tinyMCE = null, tinyMCELang = null;
-
-<span class="comment">/**
- * Constructor for the popup class. This class contains base logic for popup/dialogs and sets up
- * object references to the TinyMCE core.
- */</span>
-<span class="reserved">function</span> TinyMCE_Popup() {
-};
-
-<span class="comment">/**
- * Initializes the TinyMCE Popup class. This will setup the TinyMCE core references and other popup/dialog related functions.
- */</span>
-TinyMCE_Popup.<span class="reserved">prototype</span>.init = <span class="reserved">function</span>() {
- var win = window.opener ? window.opener : window.dialogArguments;
- var inst;
-
- <span class="reserved">if</span> (!win) {
- <span class="comment">// Try parent</span>
- win = parent.parent;
-
- <span class="comment">// Try top</span>
- <span class="reserved">if</span> (typeof(win.tinyMCE) == <span class="literal">"undefined"</span>)
- win = top;
- }
-
- window.opener = win;
- <span class="reserved">this</span>.windowOpener = win;
- <span class="reserved">this</span>.onLoadEval = <span class="literal">""</span>;
-
- <span class="comment">// Setup parent references</span>
- tinyMCE = win.tinyMCE;
- tinyMCELang = win.tinyMCELang;
-
- <span class="reserved">if</span> (!tinyMCE) {
- alert(<span class="literal">"tinyMCE object reference not found from popup."</span>);
- <span class="reserved">return</span>;
- }
-
- inst = tinyMCE.selectedInstance;
- <span class="reserved">this</span>.isWindow = tinyMCE.getWindowArg(<span class="literal">'mce_inside_iframe'</span>, false) == false;
- <span class="reserved">this</span>.storeSelection = (tinyMCE.isMSIE && !tinyMCE.isOpera) && !<span class="reserved">this</span>.isWindow && tinyMCE.getWindowArg(<span class="literal">'mce_store_selection'</span>, true);
-
- <span class="reserved">if</span> (<span class="reserved">this</span>.isWindow)
- window.focus();
-
- <span class="comment">// Store selection</span>
- <span class="reserved">if</span> (<span class="reserved">this</span>.storeSelection)
- inst.selectionBookmark = inst.selection.getBookmark(true);
-
- <span class="comment">// Setup dir</span>
- <span class="reserved">if</span> (tinyMCELang[<span class="literal">'lang_dir'</span>])
- document.dir = tinyMCELang[<span class="literal">'lang_dir'</span>];
-
- <span class="comment">// Setup title</span>
- var re = new RegExp(<span class="literal">'{|\\\$|}'</span>, <span class="literal">'g'</span>);
- var title = document.title.replace(re, <span class="literal">""</span>);
- <span class="reserved">if</span> (typeof tinyMCELang[title] != <span class="literal">"undefined"</span>) {
- var divElm = document.createElement(<span class="literal">"div"</span>);
- divElm.innerHTML = tinyMCELang[title];
- document.title = divElm.innerHTML;
-
- <span class="reserved">if</span> (tinyMCE.setWindowTitle != null)
- tinyMCE.setWindowTitle(window, divElm.innerHTML);
- }
-
- <span class="comment">// Output Popup CSS class</span>
- document.write(<span class="literal">'<link href="'</span> + tinyMCE.getParam(<span class="literal">"popups_css"</span>) + <span class="literal">'" rel="stylesheet" type="text/css">'</span>);
-
- tinyMCE.addEvent(window, <span class="literal">"load"</span>, <span class="reserved">this</span>.onLoad);
-};
-
-<span class="comment">/**
- * Gets executed when the window has finished loading it's contents. This function will then
- * replace language variables with their real values.
- */</span>
-TinyMCE_Popup.<span class="reserved">prototype</span>.onLoad = <span class="reserved">function</span>() {
- var dir, i, elms, body = document.body;
-
- <span class="reserved">if</span> (tinyMCE.getWindowArg(<span class="literal">'mce_replacevariables'</span>, true))
- body.innerHTML = tinyMCE.applyTemplate(body.innerHTML, tinyMCE.windowArgs);
-
- dir = tinyMCE.selectedInstance.settings[<span class="literal">'directionality'</span>];
- <span class="reserved">if</span> (dir == <span class="literal">"rtl"</span> && document.forms && document.forms.length > 0) {
- elms = document.forms[0].elements;
- <span class="reserved">for</span> (i=0; i<elms.length; i++) {
- <span class="reserved">if</span> ((elms[i].type == <span class="literal">"text"</span> || elms[i].type == <span class="literal">"textarea"</span>) && elms[i].getAttribute(<span class="literal">"dir"</span>) != <span class="literal">"ltr"</span>)
- elms[i].dir = dir;
- }
- }
-
- <span class="reserved">if</span> (body.style.display == <span class="literal">'none'</span>)
- body.style.display = <span class="literal">'block'</span>;
-
- <span class="comment">// Execute real onload (Opera fix)</span>
- <span class="reserved">if</span> (tinyMCEPopup.onLoadEval != <span class="literal">""</span>)
- eval(tinyMCEPopup.onLoadEval);
-};
-
-<span class="comment">/**
- * Executes the specified string onload. This is a workaround for Opera since it
- * doesn't execute the events in the same order than MSIE and Firefox.
- *
- * <span class="attrib">@param</span> {string} str String to evaluate on load.
- */</span>
-TinyMCE_Popup.<span class="reserved">prototype</span>.executeOnLoad = <span class="reserved">function</span>(str) {
- <span class="reserved">if</span> (tinyMCE.isOpera)
- <span class="reserved">this</span>.onLoadEval = str;
- <span class="reserved">else</span>
- eval(str);
-};
-
-<span class="comment">/**
- * Resizes the current window to it's inner body size. This function
- * was needed since MSIE makes the visible dialog area diffrent depending
- * on what Theme/Skin you use.
- */</span>
-TinyMCE_Popup.<span class="reserved">prototype</span>.resizeToInnerSize = <span class="reserved">function</span>() {
- <span class="comment">// Netscape 7.1 workaround</span>
- <span class="reserved">if</span> (<span class="reserved">this</span>.isWindow && tinyMCE.isNS71) {
- window.resizeBy(0, 10);
- <span class="reserved">return</span>;
- }
-
- <span class="reserved">if</span> (<span class="reserved">this</span>.isWindow) {
- var doc = document;
- var body = doc.body;
- var oldMargin, wrapper, iframe, nodes, dx, dy;
-
- <span class="reserved">if</span> (body.style.display == <span class="literal">'none'</span>)
- body.style.display = <span class="literal">'block'</span>;
-
- <span class="comment">// Remove margin</span>
- oldMargin = body.style.margin;
- body.style.margin = <span class="literal">'0'</span>;
-
- <span class="comment">// Create wrapper</span>
- wrapper = doc.createElement(<span class="literal">"div"</span>);
- wrapper.id = <span class="literal">'mcBodyWrapper'</span>;
- wrapper.style.display = <span class="literal">'none'</span>;
- wrapper.style.margin = <span class="literal">'0'</span>;
-
- <span class="comment">// Wrap body elements</span>
- nodes = doc.body.childNodes;
- <span class="reserved">for</span> (var i=nodes.length-1; i>=0; i--) {
- <span class="reserved">if</span> (wrapper.hasChildNodes())
- wrapper.insertBefore(nodes[i].cloneNode(true), wrapper.firstChild);
- <span class="reserved">else</span>
- wrapper.appendChild(nodes[i].cloneNode(true));
-
- nodes[i].parentNode.removeChild(nodes[i]);
- }
-
- <span class="comment">// Add wrapper</span>
- doc.body.appendChild(wrapper);
-
- <span class="comment">// Create iframe</span>
- iframe = document.createElement(<span class="literal">"iframe"</span>);
- iframe.id = <span class="literal">"mcWinIframe"</span>;
- iframe.src = document.location.href.toLowerCase().indexOf(<span class="literal">'https'</span>) == -1 ? <span class="literal">"about:blank"</span> : tinyMCE.settings[<span class="literal">'default_document'</span>];
- iframe.width = <span class="literal">"100%"</span>;
- iframe.height = <span class="literal">"100%"</span>;
- iframe.style.margin = <span class="literal">'0'</span>;
-
- <span class="comment">// Add iframe</span>
- doc.body.appendChild(iframe);
-
- <span class="comment">// Measure iframe</span>
- iframe = document.getElementById(<span class="literal">'mcWinIframe'</span>);
- dx = tinyMCE.getWindowArg(<span class="literal">'mce_width'</span>) - iframe.clientWidth;
- dy = tinyMCE.getWindowArg(<span class="literal">'mce_height'</span>) - iframe.clientHeight;
-
- <span class="comment">// Resize window</span>
- <span class="comment">// tinyMCE.debug(tinyMCE.getWindowArg('mce_width') + "," + tinyMCE.getWindowArg('mce_height') + " - " + dx + "," + dy);</span>
- window.resizeBy(dx, dy);
-
- <span class="comment">// Hide iframe and show wrapper</span>
- body.style.margin = oldMargin;
- iframe.style.display = <span class="literal">'none'</span>;
- wrapper.style.display = <span class="literal">'block'</span>;
- }
-};
-
-<span class="comment">/**
- * Resizes the current window to the dimensions of the body.
- */</span>
-TinyMCE_Popup.<span class="reserved">prototype</span>.resizeToContent = <span class="reserved">function</span>() {
- var isMSIE = (navigator.appName == <span class="literal">"Microsoft Internet Explorer"</span>);
- var isOpera = (navigator.userAgent.indexOf(<span class="literal">"Opera"</span>) != -1);
-
- <span class="reserved">if</span> (isOpera)
- <span class="reserved">return</span>;
-
- <span class="reserved">if</span> (isMSIE) {
- try { window.resizeTo(10, 10); } catch (e) {}
-
- var elm = document.body;
- var width = elm.offsetWidth;
- var height = elm.offsetHeight;
- var dx = (elm.scrollWidth - width) + 4;
- var dy = elm.scrollHeight - height;
-
- try { window.resizeBy(dx, dy); } catch (e) {}
- } <span class="reserved">else</span> {
- window.scrollBy(1000, 1000);
- <span class="reserved">if</span> (window.scrollX > 0 || window.scrollY > 0) {
- window.resizeBy(window.innerWidth * 2, window.innerHeight * 2);
- window.sizeToContent();
- window.scrollTo(0, 0);
- var x = parseInt(screen.width / 2.0) - (window.outerWidth / 2.0);
- var y = parseInt(screen.height / 2.0) - (window.outerHeight / 2.0);
- window.moveTo(x, y);
- }
- }
-};
-
-<span class="comment">/**
- * Returns a window argument, window arguments can be passed from a plugin to a window
- * by using the tinyMCE.openWindow function.
- *
- * <span class="attrib">@param</span> {string} name Argument name to retrive.
- * <span class="attrib">@param</span> {string} default_value Optional default value to assign if the argument wasn't set.
- * <span class="attrib">@return</span> Argument value object.
- * <span class="attrib">@type</span> Object
- */</span>
-TinyMCE_Popup.<span class="reserved">prototype</span>.getWindowArg = <span class="reserved">function</span>(name, default_value) {
- <span class="reserved">return</span> tinyMCE.getWindowArg(name, default_value);
-};
-
-<span class="comment">/**
- * Restores the selection back to the one stored after executing a command.
- * This function was needed in MSIE when using inlinepopups, the selection
- * would otherwice get lost if the user focused another field.
- */</span>
-TinyMCE_Popup.<span class="reserved">prototype</span>.restoreSelection = <span class="reserved">function</span>() {
- <span class="reserved">if</span> (<span class="reserved">this</span>.storeSelection) {
- var inst = tinyMCE.selectedInstance;
-
- inst.getWin().focus();
-
- <span class="reserved">if</span> (inst.selectionBookmark)
- inst.selection.moveToBookmark(inst.selectionBookmark);
- }
-};
-
-<span class="comment">/**
- * Executes the specific command on the parent instance that opened the window. This method
- * will also take care of the storage and restorage of the current selection in MSIE when
- * using inlinepopups. So we suggest using this method instead of tinyMCE.execCommand when using
- * popup windows.
- *
- * <span class="attrib">@param</span> {string} command Command name to execute, for example mceLink or Bold.
- * <span class="attrib">@param</span> {boolean} user_interface True/false state if a UI (dialog) should be presented or not.
- * <span class="attrib">@param</span> {mixed} value Optional command value, this can be anything.
- */</span>
-TinyMCE_Popup.<span class="reserved">prototype</span>.execCommand = <span class="reserved">function</span>(command, user_interface, value) {
- var inst = tinyMCE.selectedInstance;
-
- <span class="reserved">this</span>.restoreSelection();
- inst.execCommand(command, user_interface, value);
-
- <span class="comment">// Store selection</span>
- <span class="reserved">if</span> (<span class="reserved">this</span>.storeSelection)
- inst.selectionBookmark = inst.selection.getBookmark(true);
-};
-
-<span class="comment">/**
- * Closes the current window. This should be used instead of window.close. Since this will
- * also handle inlinepopups closing.
- */</span>
-TinyMCE_Popup.<span class="reserved">prototype</span>.close = <span class="reserved">function</span>() {
- tinyMCE.closeWindow(window);
-};
-
-<span class="comment">/**
- * Executes a color picker on the specified element id. When the user
- * then selects a color it will be set as the value of the specified element.
- *
- * <span class="attrib">@param</span> {DOMEvent} e DOM event object.
- * <span class="attrib">@param</span> {string} element_id Element id to be filled with the color value from the picker.
- */</span>
-TinyMCE_Popup.<span class="reserved">prototype</span>.pickColor = <span class="reserved">function</span>(e, element_id) {
- tinyMCE.selectedInstance.execCommand(<span class="literal">'mceColorPicker'</span>, true, {
- element_id : element_id,
- document : document,
- window : window,
- store_selection : false
- });
-};
-
-<span class="comment">/**
- * Opens a filebrowser/imagebrowser this will set the output value from
- * the browser as a value on the specified element.
- *
- * <span class="attrib">@param</span> {string} element_id Id of the element to set value in.
- * <span class="attrib">@param</span> {string} type Type of browser to open image/file/flash.
- * <span class="attrib">@param</span> {string} option Option name to get the file_broswer_callback function name from.
- */</span>
-TinyMCE_Popup.<span class="reserved">prototype</span>.openBrowser = <span class="reserved">function</span>(element_id, type, option) {
- var cb = tinyMCE.getParam(option, tinyMCE.getParam(<span class="literal">"file_browser_callback"</span>));
- var url = document.getElementById(element_id).value;
-
- tinyMCE.setWindowArg(<span class="literal">"window"</span>, window);
- tinyMCE.setWindowArg(<span class="literal">"document"</span>, document);
-
- <span class="comment">// Call to external callback</span>
- <span class="reserved">if</span> (eval(<span class="literal">'typeof(tinyMCEPopup.windowOpener.'</span> + cb + <span class="literal">')'</span>) == <span class="literal">"undefined"</span>)
- alert(<span class="literal">"Callback function: "</span> + cb + <span class="literal">" could not be found."</span>);
- <span class="reserved">else</span>
- eval(<span class="literal">"tinyMCEPopup.windowOpener."</span> + cb + <span class="literal">"(element_id, url, type, window);"</span>);
-};
-
-<span class="comment">/**
- * Imports the specified class into the current popup. This will setup a local class definition
- * by importing from the parent window.
- *
- * <span class="attrib">@param</span> {string} c Class name to import to current page.
- */</span>
-TinyMCE_Popup.<span class="reserved">prototype</span>.importClass = <span class="reserved">function</span>(c) {
- window[c] = <span class="reserved">function</span>() {};
-
- <span class="reserved">for</span> (var n in window.opener[c].<span class="reserved">prototype</span>)
- window[c].<span class="reserved">prototype</span>[n] = window.opener[c].<span class="reserved">prototype</span>[n];
-
- window[c].constructor = window.opener[c].constructor;
-};
-
-<span class="comment">// Setup global instance</span>
-var tinyMCEPopup = new TinyMCE_Popup();
-
-tinyMCEPopup.init();
-</pre>
- <hr>
-
-
-
-<!-- ========== START OF NAVBAR ========== -->
-<a name="navbar_top"><!-- --></a>
-<table border="0" width="100%" cellpadding="1" cellspacing="0">
-<tr>
-<td colspan=2 bgcolor="#EEEEFF" class="NavBarCell1">
-<a name="navbar_top_firstrow"><!-- --></a>
-<table border="0" cellpadding="0" cellspacing="3">
- <tr align="center" valign="top">
-
-
- <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="overview-summary.html"><font class="NavBarFont1"><b>Overview</b></font></a> </td>
- <td bgcolor="#FFFFFF" class="NavBarCell1Rev"> <font class="NavBarFont1Rev"><b>File</b></font> </td>
-
-
- <td bgcolor="#FFFFFF" class="NavBarCell1"> <font class="NavBarFont1">Class</font> </td>
- <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="overview-tree.html"><font class="NavBarFont1"><b>Tree</b></font></a> </td>
- <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="index-all.html"--><font class="NavBarFont1"><b>Index</b></font></a> </td>
- <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="help-doc.html"><font class="NavBarFont1"><b>Help</b></font></a> </td>
- </tr>
-</table>
-</td>
-<td bgcolor="#EEEEFF" align="right" valign="top"><em>
-<b></b></em>
-</td>
-</tr>
-
-<tr>
-<td bgcolor="white" class="NavBarCell2"><font size="-2">
- PREV
- NEXT</font></td>
-<td bgcolor="white" class="NavBarCell2"><font size="-2">
- <a href="index.html" target="_top"><b>FRAMES</b></a>
- <a href="overview-summary.html" target="_top"><b>NO FRAMES</b></a>
-
-<script>
- <!--
- if(window==top) {
- document.writeln('<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>');
- }
- //-->
-</script>
-<noscript>
-<a href="allclasses-noframe.html" target=""><b>All Classes</b></a>
-</noscript>
-</font></td>
-</tr>
-</table>
-<!-- =========== END OF NAVBAR =========== -->
-
-<hr>
-<font size="-1">
-
-</font>
-<div class="jsdoc_ctime">Documentation generated by <a href="http://jsdoc.sourceforge.net/" target="_parent">JSDoc</a> on Fri Apr 14 21:59:23 2006</div>
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/tinymce_api/overview-summary-TinyMCE_Popup.class.js.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/tinymce_api/overview-summary-TinyMCE_Popup.class.js.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/tinymce_api/overview-summary-TinyMCE_Popup.class.js.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/tinymce_api/overview-summary-TinyMCE_Popup.class.js.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,511 @@
+<!doctype html public "-//W3C//DTD HTML 4.0 Frameset//EN""http://www.w3.org/TR/REC-html40/frameset.dtd">
+<html>
+<head>
+<title>
+ Overview
+</title>
+<link rel ="stylesheet" type="text/css" href="stylesheet.css" title="Style">
+<script>
+function asd() {
+
+ parent.document.title="TinyMCE_Popup.class.js Overview";
+
+}
+</script>
+</head>
+<body bgcolor="white" onload="asd();">
+
+<!-- ========== START OF NAVBAR ========== -->
+<a name="navbar_top"><!-- --></a>
+<table border="0" width="100%" cellpadding="1" cellspacing="0">
+<tr>
+<td colspan=2 bgcolor="#EEEEFF" class="NavBarCell1">
+<a name="navbar_top_firstrow"><!-- --></a>
+<table border="0" cellpadding="0" cellspacing="3">
+ <tr align="center" valign="top">
+
+
+ <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="overview-summary.html"><font class="NavBarFont1"><b>Overview</b></font></a> </td>
+ <td bgcolor="#FFFFFF" class="NavBarCell1Rev"> <font class="NavBarFont1Rev"><b>File</b></font> </td>
+
+
+ <td bgcolor="#FFFFFF" class="NavBarCell1"> <font class="NavBarFont1">Class</font> </td>
+ <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="overview-tree.html"><font class="NavBarFont1"><b>Tree</b></font></a> </td>
+ <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="index-all.html"--><font class="NavBarFont1"><b>Index</b></font></a> </td>
+ <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="help-doc.html"><font class="NavBarFont1"><b>Help</b></font></a> </td>
+ </tr>
+</table>
+</td>
+<td bgcolor="#EEEEFF" align="right" valign="top">
+<em>
+<b></b></em>
+</td>
+</tr>
+
+<tr>
+<td bgcolor="white" class="NavBarCell2"><font size="-2">
+ PREV
+ NEXT</font></td>
+<td bgcolor="white" class="NavBarCell2"><font size="-2">
+ <a href="index.html" target="_top"><b>FRAMES</b></a>
+ <a href="overview-summary.html" target="_top"><b>NO FRAMES</b></a>
+
+<script>
+ <!--
+ if(window==top) {
+ document.writeln('<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>');
+ }
+ //-->
+</script>
+<noscript>
+<a href="allclasses-noframe.html" target=""><b>All Classes</b></a>
+</noscript>
+</font></td>
+</tr>
+</table>
+<!-- =========== END OF NAVBAR =========== -->
+
+<hr>
+<center>
+
+ <h2>TinyMCE_Popup.class.js</h2>
+
+</center>
+
+
+
+
+<h4>Summary</h4>
+<p>
+
+ No overview generated for 'TinyMCE_Popup.class.js'<BR/><BR/>
+
+</p>
+
+<hr>
+
+
+ <table border="1" cellpadding="3" cellspacing="0" width="100%">
+ <tr bgcolor="#CCCCFF" class="TableHeadingColor">
+ <td colspan=2><font size="+2">
+
+ <b>Class Summary</b>
+
+ </font></td>
+ </tr>
+
+ <tr bgcolor="white" class="TableRowColor">
+ <td width="15%"><b><a href="TinyMCE_Popup.html">TinyMCE_Popup</a></b></td>
+ <td> </td>
+ </tr>
+
+ </table>
+ <hr/>
+
+
+<!-- ========== METHOD SUMMARY =========== -->
+
+<!-- ========== END METHOD SUMMARY =========== -->
+
+
+ <pre class="sourceview"><span class="comment">/**
+ * $RCSfile: overview-summary-TinyMCE_Popup.class.js.html,v $
+ * $Revision: 1.24 $
+ * $Date: 2006/04/14 20:00:30 $
+ *
+ * <span class="attrib">@author</span> Moxiecode
+ * <span class="attrib">@copyright</span> Copyright © 2004-2006, Moxiecode Systems AB, All rights reserved.
+ */</span>
+
+<span class="comment">// Some global instances, this will be filled later</span>
+var tinyMCE = null, tinyMCELang = null;
+
+<span class="comment">/**
+ * Constructor for the popup class. This class contains base logic for popup/dialogs and sets up
+ * object references to the TinyMCE core.
+ */</span>
+<span class="reserved">function</span> TinyMCE_Popup() {
+};
+
+<span class="comment">/**
+ * Initializes the TinyMCE Popup class. This will setup the TinyMCE core references and other popup/dialog related functions.
+ */</span>
+TinyMCE_Popup.<span class="reserved">prototype</span>.init = <span class="reserved">function</span>() {
+ var win = window.opener ? window.opener : window.dialogArguments;
+ var inst;
+
+ <span class="reserved">if</span> (!win) {
+ <span class="comment">// Try parent</span>
+ win = parent.parent;
+
+ <span class="comment">// Try top</span>
+ <span class="reserved">if</span> (typeof(win.tinyMCE) == <span class="literal">"undefined"</span>)
+ win = top;
+ }
+
+ window.opener = win;
+ <span class="reserved">this</span>.windowOpener = win;
+ <span class="reserved">this</span>.onLoadEval = <span class="literal">""</span>;
+
+ <span class="comment">// Setup parent references</span>
+ tinyMCE = win.tinyMCE;
+ tinyMCELang = win.tinyMCELang;
+
+ <span class="reserved">if</span> (!tinyMCE) {
+ alert(<span class="literal">"tinyMCE object reference not found from popup."</span>);
+ <span class="reserved">return</span>;
+ }
+
+ inst = tinyMCE.selectedInstance;
+ <span class="reserved">this</span>.isWindow = tinyMCE.getWindowArg(<span class="literal">'mce_inside_iframe'</span>, false) == false;
+ <span class="reserved">this</span>.storeSelection = (tinyMCE.isMSIE && !tinyMCE.isOpera) && !<span class="reserved">this</span>.isWindow && tinyMCE.getWindowArg(<span class="literal">'mce_store_selection'</span>, true);
+
+ <span class="reserved">if</span> (<span class="reserved">this</span>.isWindow)
+ window.focus();
+
+ <span class="comment">// Store selection</span>
+ <span class="reserved">if</span> (<span class="reserved">this</span>.storeSelection)
+ inst.selectionBookmark = inst.selection.getBookmark(true);
+
+ <span class="comment">// Setup dir</span>
+ <span class="reserved">if</span> (tinyMCELang[<span class="literal">'lang_dir'</span>])
+ document.dir = tinyMCELang[<span class="literal">'lang_dir'</span>];
+
+ <span class="comment">// Setup title</span>
+ var re = new RegExp(<span class="literal">'{|\\\$|}'</span>, <span class="literal">'g'</span>);
+ var title = document.title.replace(re, <span class="literal">""</span>);
+ <span class="reserved">if</span> (typeof tinyMCELang[title] != <span class="literal">"undefined"</span>) {
+ var divElm = document.createElement(<span class="literal">"div"</span>);
+ divElm.innerHTML = tinyMCELang[title];
+ document.title = divElm.innerHTML;
+
+ <span class="reserved">if</span> (tinyMCE.setWindowTitle != null)
+ tinyMCE.setWindowTitle(window, divElm.innerHTML);
+ }
+
+ <span class="comment">// Output Popup CSS class</span>
+ document.write(<span class="literal">'<link href="'</span> + tinyMCE.getParam(<span class="literal">"popups_css"</span>) + <span class="literal">'" rel="stylesheet" type="text/css">'</span>);
+
+ tinyMCE.addEvent(window, <span class="literal">"load"</span>, <span class="reserved">this</span>.onLoad);
+};
+
+<span class="comment">/**
+ * Gets executed when the window has finished loading it's contents. This function will then
+ * replace language variables with their real values.
+ */</span>
+TinyMCE_Popup.<span class="reserved">prototype</span>.onLoad = <span class="reserved">function</span>() {
+ var dir, i, elms, body = document.body;
+
+ <span class="reserved">if</span> (tinyMCE.getWindowArg(<span class="literal">'mce_replacevariables'</span>, true))
+ body.innerHTML = tinyMCE.applyTemplate(body.innerHTML, tinyMCE.windowArgs);
+
+ dir = tinyMCE.selectedInstance.settings[<span class="literal">'directionality'</span>];
+ <span class="reserved">if</span> (dir == <span class="literal">"rtl"</span> && document.forms && document.forms.length > 0) {
+ elms = document.forms[0].elements;
+ <span class="reserved">for</span> (i=0; i<elms.length; i++) {
+ <span class="reserved">if</span> ((elms[i].type == <span class="literal">"text"</span> || elms[i].type == <span class="literal">"textarea"</span>) && elms[i].getAttribute(<span class="literal">"dir"</span>) != <span class="literal">"ltr"</span>)
+ elms[i].dir = dir;
+ }
+ }
+
+ <span class="reserved">if</span> (body.style.display == <span class="literal">'none'</span>)
+ body.style.display = <span class="literal">'block'</span>;
+
+ <span class="comment">// Execute real onload (Opera fix)</span>
+ <span class="reserved">if</span> (tinyMCEPopup.onLoadEval != <span class="literal">""</span>)
+ eval(tinyMCEPopup.onLoadEval);
+};
+
+<span class="comment">/**
+ * Executes the specified string onload. This is a workaround for Opera since it
+ * doesn't execute the events in the same order than MSIE and Firefox.
+ *
+ * <span class="attrib">@param</span> {string} str String to evaluate on load.
+ */</span>
+TinyMCE_Popup.<span class="reserved">prototype</span>.executeOnLoad = <span class="reserved">function</span>(str) {
+ <span class="reserved">if</span> (tinyMCE.isOpera)
+ <span class="reserved">this</span>.onLoadEval = str;
+ <span class="reserved">else</span>
+ eval(str);
+};
+
+<span class="comment">/**
+ * Resizes the current window to it's inner body size. This function
+ * was needed since MSIE makes the visible dialog area diffrent depending
+ * on what Theme/Skin you use.
+ */</span>
+TinyMCE_Popup.<span class="reserved">prototype</span>.resizeToInnerSize = <span class="reserved">function</span>() {
+ <span class="comment">// Netscape 7.1 workaround</span>
+ <span class="reserved">if</span> (<span class="reserved">this</span>.isWindow && tinyMCE.isNS71) {
+ window.resizeBy(0, 10);
+ <span class="reserved">return</span>;
+ }
+
+ <span class="reserved">if</span> (<span class="reserved">this</span>.isWindow) {
+ var doc = document;
+ var body = doc.body;
+ var oldMargin, wrapper, iframe, nodes, dx, dy;
+
+ <span class="reserved">if</span> (body.style.display == <span class="literal">'none'</span>)
+ body.style.display = <span class="literal">'block'</span>;
+
+ <span class="comment">// Remove margin</span>
+ oldMargin = body.style.margin;
+ body.style.margin = <span class="literal">'0'</span>;
+
+ <span class="comment">// Create wrapper</span>
+ wrapper = doc.createElement(<span class="literal">"div"</span>);
+ wrapper.id = <span class="literal">'mcBodyWrapper'</span>;
+ wrapper.style.display = <span class="literal">'none'</span>;
+ wrapper.style.margin = <span class="literal">'0'</span>;
+
+ <span class="comment">// Wrap body elements</span>
+ nodes = doc.body.childNodes;
+ <span class="reserved">for</span> (var i=nodes.length-1; i>=0; i--) {
+ <span class="reserved">if</span> (wrapper.hasChildNodes())
+ wrapper.insertBefore(nodes[i].cloneNode(true), wrapper.firstChild);
+ <span class="reserved">else</span>
+ wrapper.appendChild(nodes[i].cloneNode(true));
+
+ nodes[i].parentNode.removeChild(nodes[i]);
+ }
+
+ <span class="comment">// Add wrapper</span>
+ doc.body.appendChild(wrapper);
+
+ <span class="comment">// Create iframe</span>
+ iframe = document.createElement(<span class="literal">"iframe"</span>);
+ iframe.id = <span class="literal">"mcWinIframe"</span>;
+ iframe.src = document.location.href.toLowerCase().indexOf(<span class="literal">'https'</span>) == -1 ? <span class="literal">"about:blank"</span> : tinyMCE.settings[<span class="literal">'default_document'</span>];
+ iframe.width = <span class="literal">"100%"</span>;
+ iframe.height = <span class="literal">"100%"</span>;
+ iframe.style.margin = <span class="literal">'0'</span>;
+
+ <span class="comment">// Add iframe</span>
+ doc.body.appendChild(iframe);
+
+ <span class="comment">// Measure iframe</span>
+ iframe = document.getElementById(<span class="literal">'mcWinIframe'</span>);
+ dx = tinyMCE.getWindowArg(<span class="literal">'mce_width'</span>) - iframe.clientWidth;
+ dy = tinyMCE.getWindowArg(<span class="literal">'mce_height'</span>) - iframe.clientHeight;
+
+ <span class="comment">// Resize window</span>
+ <span class="comment">// tinyMCE.debug(tinyMCE.getWindowArg('mce_width') + "," + tinyMCE.getWindowArg('mce_height') + " - " + dx + "," + dy);</span>
+ window.resizeBy(dx, dy);
+
+ <span class="comment">// Hide iframe and show wrapper</span>
+ body.style.margin = oldMargin;
+ iframe.style.display = <span class="literal">'none'</span>;
+ wrapper.style.display = <span class="literal">'block'</span>;
+ }
+};
+
+<span class="comment">/**
+ * Resizes the current window to the dimensions of the body.
+ */</span>
+TinyMCE_Popup.<span class="reserved">prototype</span>.resizeToContent = <span class="reserved">function</span>() {
+ var isMSIE = (navigator.appName == <span class="literal">"Microsoft Internet Explorer"</span>);
+ var isOpera = (navigator.userAgent.indexOf(<span class="literal">"Opera"</span>) != -1);
+
+ <span class="reserved">if</span> (isOpera)
+ <span class="reserved">return</span>;
+
+ <span class="reserved">if</span> (isMSIE) {
+ try { window.resizeTo(10, 10); } catch (e) {}
+
+ var elm = document.body;
+ var width = elm.offsetWidth;
+ var height = elm.offsetHeight;
+ var dx = (elm.scrollWidth - width) + 4;
+ var dy = elm.scrollHeight - height;
+
+ try { window.resizeBy(dx, dy); } catch (e) {}
+ } <span class="reserved">else</span> {
+ window.scrollBy(1000, 1000);
+ <span class="reserved">if</span> (window.scrollX > 0 || window.scrollY > 0) {
+ window.resizeBy(window.innerWidth * 2, window.innerHeight * 2);
+ window.sizeToContent();
+ window.scrollTo(0, 0);
+ var x = parseInt(screen.width / 2.0) - (window.outerWidth / 2.0);
+ var y = parseInt(screen.height / 2.0) - (window.outerHeight / 2.0);
+ window.moveTo(x, y);
+ }
+ }
+};
+
+<span class="comment">/**
+ * Returns a window argument, window arguments can be passed from a plugin to a window
+ * by using the tinyMCE.openWindow function.
+ *
+ * <span class="attrib">@param</span> {string} name Argument name to retrive.
+ * <span class="attrib">@param</span> {string} default_value Optional default value to assign if the argument wasn't set.
+ * <span class="attrib">@return</span> Argument value object.
+ * <span class="attrib">@type</span> Object
+ */</span>
+TinyMCE_Popup.<span class="reserved">prototype</span>.getWindowArg = <span class="reserved">function</span>(name, default_value) {
+ <span class="reserved">return</span> tinyMCE.getWindowArg(name, default_value);
+};
+
+<span class="comment">/**
+ * Restores the selection back to the one stored after executing a command.
+ * This function was needed in MSIE when using inlinepopups, the selection
+ * would otherwice get lost if the user focused another field.
+ */</span>
+TinyMCE_Popup.<span class="reserved">prototype</span>.restoreSelection = <span class="reserved">function</span>() {
+ <span class="reserved">if</span> (<span class="reserved">this</span>.storeSelection) {
+ var inst = tinyMCE.selectedInstance;
+
+ inst.getWin().focus();
+
+ <span class="reserved">if</span> (inst.selectionBookmark)
+ inst.selection.moveToBookmark(inst.selectionBookmark);
+ }
+};
+
+<span class="comment">/**
+ * Executes the specific command on the parent instance that opened the window. This method
+ * will also take care of the storage and restorage of the current selection in MSIE when
+ * using inlinepopups. So we suggest using this method instead of tinyMCE.execCommand when using
+ * popup windows.
+ *
+ * <span class="attrib">@param</span> {string} command Command name to execute, for example mceLink or Bold.
+ * <span class="attrib">@param</span> {boolean} user_interface True/false state if a UI (dialog) should be presented or not.
+ * <span class="attrib">@param</span> {mixed} value Optional command value, this can be anything.
+ */</span>
+TinyMCE_Popup.<span class="reserved">prototype</span>.execCommand = <span class="reserved">function</span>(command, user_interface, value) {
+ var inst = tinyMCE.selectedInstance;
+
+ <span class="reserved">this</span>.restoreSelection();
+ inst.execCommand(command, user_interface, value);
+
+ <span class="comment">// Store selection</span>
+ <span class="reserved">if</span> (<span class="reserved">this</span>.storeSelection)
+ inst.selectionBookmark = inst.selection.getBookmark(true);
+};
+
+<span class="comment">/**
+ * Closes the current window. This should be used instead of window.close. Since this will
+ * also handle inlinepopups closing.
+ */</span>
+TinyMCE_Popup.<span class="reserved">prototype</span>.close = <span class="reserved">function</span>() {
+ tinyMCE.closeWindow(window);
+};
+
+<span class="comment">/**
+ * Executes a color picker on the specified element id. When the user
+ * then selects a color it will be set as the value of the specified element.
+ *
+ * <span class="attrib">@param</span> {DOMEvent} e DOM event object.
+ * <span class="attrib">@param</span> {string} element_id Element id to be filled with the color value from the picker.
+ */</span>
+TinyMCE_Popup.<span class="reserved">prototype</span>.pickColor = <span class="reserved">function</span>(e, element_id) {
+ tinyMCE.selectedInstance.execCommand(<span class="literal">'mceColorPicker'</span>, true, {
+ element_id : element_id,
+ document : document,
+ window : window,
+ store_selection : false
+ });
+};
+
+<span class="comment">/**
+ * Opens a filebrowser/imagebrowser this will set the output value from
+ * the browser as a value on the specified element.
+ *
+ * <span class="attrib">@param</span> {string} element_id Id of the element to set value in.
+ * <span class="attrib">@param</span> {string} type Type of browser to open image/file/flash.
+ * <span class="attrib">@param</span> {string} option Option name to get the file_broswer_callback function name from.
+ */</span>
+TinyMCE_Popup.<span class="reserved">prototype</span>.openBrowser = <span class="reserved">function</span>(element_id, type, option) {
+ var cb = tinyMCE.getParam(option, tinyMCE.getParam(<span class="literal">"file_browser_callback"</span>));
+ var url = document.getElementById(element_id).value;
+
+ tinyMCE.setWindowArg(<span class="literal">"window"</span>, window);
+ tinyMCE.setWindowArg(<span class="literal">"document"</span>, document);
+
+ <span class="comment">// Call to external callback</span>
+ <span class="reserved">if</span> (eval(<span class="literal">'typeof(tinyMCEPopup.windowOpener.'</span> + cb + <span class="literal">')'</span>) == <span class="literal">"undefined"</span>)
+ alert(<span class="literal">"Callback function: "</span> + cb + <span class="literal">" could not be found."</span>);
+ <span class="reserved">else</span>
+ eval(<span class="literal">"tinyMCEPopup.windowOpener."</span> + cb + <span class="literal">"(element_id, url, type, window);"</span>);
+};
+
+<span class="comment">/**
+ * Imports the specified class into the current popup. This will setup a local class definition
+ * by importing from the parent window.
+ *
+ * <span class="attrib">@param</span> {string} c Class name to import to current page.
+ */</span>
+TinyMCE_Popup.<span class="reserved">prototype</span>.importClass = <span class="reserved">function</span>(c) {
+ window[c] = <span class="reserved">function</span>() {};
+
+ <span class="reserved">for</span> (var n in window.opener[c].<span class="reserved">prototype</span>)
+ window[c].<span class="reserved">prototype</span>[n] = window.opener[c].<span class="reserved">prototype</span>[n];
+
+ window[c].constructor = window.opener[c].constructor;
+};
+
+<span class="comment">// Setup global instance</span>
+var tinyMCEPopup = new TinyMCE_Popup();
+
+tinyMCEPopup.init();
+</pre>
+ <hr>
+
+
+
+<!-- ========== START OF NAVBAR ========== -->
+<a name="navbar_top"><!-- --></a>
+<table border="0" width="100%" cellpadding="1" cellspacing="0">
+<tr>
+<td colspan=2 bgcolor="#EEEEFF" class="NavBarCell1">
+<a name="navbar_top_firstrow"><!-- --></a>
+<table border="0" cellpadding="0" cellspacing="3">
+ <tr align="center" valign="top">
+
+
+ <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="overview-summary.html"><font class="NavBarFont1"><b>Overview</b></font></a> </td>
+ <td bgcolor="#FFFFFF" class="NavBarCell1Rev"> <font class="NavBarFont1Rev"><b>File</b></font> </td>
+
+
+ <td bgcolor="#FFFFFF" class="NavBarCell1"> <font class="NavBarFont1">Class</font> </td>
+ <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="overview-tree.html"><font class="NavBarFont1"><b>Tree</b></font></a> </td>
+ <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="index-all.html"--><font class="NavBarFont1"><b>Index</b></font></a> </td>
+ <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="help-doc.html"><font class="NavBarFont1"><b>Help</b></font></a> </td>
+ </tr>
+</table>
+</td>
+<td bgcolor="#EEEEFF" align="right" valign="top"><em>
+<b></b></em>
+</td>
+</tr>
+
+<tr>
+<td bgcolor="white" class="NavBarCell2"><font size="-2">
+ PREV
+ NEXT</font></td>
+<td bgcolor="white" class="NavBarCell2"><font size="-2">
+ <a href="index.html" target="_top"><b>FRAMES</b></a>
+ <a href="overview-summary.html" target="_top"><b>NO FRAMES</b></a>
+
+<script>
+ <!--
+ if(window==top) {
+ document.writeln('<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>');
+ }
+ //-->
+</script>
+<noscript>
+<a href="allclasses-noframe.html" target=""><b>All Classes</b></a>
+</noscript>
+</font></td>
+</tr>
+</table>
+<!-- =========== END OF NAVBAR =========== -->
+
+<hr>
+<font size="-1">
+
+</font>
+<div class="jsdoc_ctime">Documentation generated by <a href="http://jsdoc.sourceforge.net/" target="_parent">JSDoc</a> on Fri Apr 14 21:59:23 2006</div>
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/tinymce_api/overview-summary-TinyMCE_Selection.class.js.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/tinymce_api/overview-summary-TinyMCE_Selection.class.js.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/tinymce_api/overview-summary-TinyMCE_Selection.class.js.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,646 +0,0 @@
-<!doctype html public "-//W3C//DTD HTML 4.0 Frameset//EN""http://www.w3.org/TR/REC-html40/frameset.dtd">
-<html>
-<head>
-<title>
- Overview
-</title>
-<link rel ="stylesheet" type="text/css" href="stylesheet.css" title="Style">
-<script>
-function asd() {
-
- parent.document.title="TinyMCE_Selection.class.js Overview";
-
-}
-</script>
-</head>
-<body bgcolor="white" onload="asd();">
-
-<!-- ========== START OF NAVBAR ========== -->
-<a name="navbar_top"><!-- --></a>
-<table border="0" width="100%" cellpadding="1" cellspacing="0">
-<tr>
-<td colspan=2 bgcolor="#EEEEFF" class="NavBarCell1">
-<a name="navbar_top_firstrow"><!-- --></a>
-<table border="0" cellpadding="0" cellspacing="3">
- <tr align="center" valign="top">
-
-
- <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="overview-summary.html"><font class="NavBarFont1"><b>Overview</b></font></a> </td>
- <td bgcolor="#FFFFFF" class="NavBarCell1Rev"> <font class="NavBarFont1Rev"><b>File</b></font> </td>
-
-
- <td bgcolor="#FFFFFF" class="NavBarCell1"> <font class="NavBarFont1">Class</font> </td>
- <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="overview-tree.html"><font class="NavBarFont1"><b>Tree</b></font></a> </td>
- <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="index-all.html"--><font class="NavBarFont1"><b>Index</b></font></a> </td>
- <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="help-doc.html"><font class="NavBarFont1"><b>Help</b></font></a> </td>
- </tr>
-</table>
-</td>
-<td bgcolor="#EEEEFF" align="right" valign="top">
-<em>
-<b></b></em>
-</td>
-</tr>
-
-<tr>
-<td bgcolor="white" class="NavBarCell2"><font size="-2">
- PREV
- NEXT</font></td>
-<td bgcolor="white" class="NavBarCell2"><font size="-2">
- <a href="index.html" target="_top"><b>FRAMES</b></a>
- <a href="overview-summary.html" target="_top"><b>NO FRAMES</b></a>
-
-<script>
- <!--
- if(window==top) {
- document.writeln('<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>');
- }
- //-->
-</script>
-<noscript>
-<a href="allclasses-noframe.html" target=""><b>All Classes</b></a>
-</noscript>
-</font></td>
-</tr>
-</table>
-<!-- =========== END OF NAVBAR =========== -->
-
-<hr>
-<center>
-
- <h2>TinyMCE_Selection.class.js</h2>
-
-</center>
-
-
-
-
-<h4>Summary</h4>
-<p>
-
- No overview generated for 'TinyMCE_Selection.class.js'<BR/><BR/>
-
-</p>
-
-<hr>
-
-
- <table border="1" cellpadding="3" cellspacing="0" width="100%">
- <tr bgcolor="#CCCCFF" class="TableHeadingColor">
- <td colspan=2><font size="+2">
-
- <b>Class Summary</b>
-
- </font></td>
- </tr>
-
- <tr bgcolor="white" class="TableRowColor">
- <td width="15%"><b><a href="TinyMCE_Selection.html">TinyMCE_Selection</a></b></td>
- <td> </td>
- </tr>
-
- </table>
- <hr/>
-
-
-<!-- ========== METHOD SUMMARY =========== -->
-
-<!-- ========== END METHOD SUMMARY =========== -->
-
-
- <pre class="sourceview"><span class="comment">/**
- * $RCSfile: overview-summary-TinyMCE_Selection.class.js.html,v $
- * $Revision: 1.42 $
- * $Date: 2006/04/14 20:00:31 $
- *
- * <span class="attrib">@author</span> Moxiecode
- * <span class="attrib">@copyright</span> Copyright © 2004-2006, Moxiecode Systems AB, All rights reserved.
- */</span>
-
-<span class="comment">/**
- * Constructs a Selection instance and binds it to the specificed TinyMCE editor control.
- *
- * <span class="attrib">@param</span> {TinyMCE_Control} inst TinyMCE editor control instance.
- * <span class="attrib">@constructor</span>
- */</span>
-<span class="reserved">function</span> TinyMCE_Selection(inst) {
- <span class="reserved">this</span>.instance = inst;
-};
-
-TinyMCE_Selection.<span class="reserved">prototype</span> = {
- <span class="comment">/**
- * Returns the selected HTML code.
- *
- * <span class="attrib">@return</span> Selected HTML contents.
- * <span class="attrib">@type</span> string
- */</span>
- getSelectedHTML : <span class="reserved">function</span>() {
- var inst = <span class="reserved">this</span>.instance;
- var e, r = <span class="reserved">this</span>.getRng(), h;
-
- <span class="reserved">if</span> (tinyMCE.isSafari) {
- <span class="comment">// Not realy perfect!!</span>
- <span class="reserved">return</span> r.toString();
- }
-
- e = document.createElement(<span class="literal">"body"</span>);
-
- <span class="reserved">if</span> (tinyMCE.isGecko)
- e.appendChild(r.cloneContents());
- <span class="reserved">else</span>
- e.innerHTML = r.item ? r.item(0).outerHTML : r.htmlText;
-
- h = tinyMCE._cleanupHTML(inst, inst.contentDocument, inst.settings, e, e, false, true, false);
-
- <span class="comment">// When editing always use fonts internaly</span>
- <span class="reserved">if</span> (tinyMCE.getParam(<span class="literal">"convert_fonts_to_spans"</span>))
- tinyMCE.convertSpansToFonts(inst.getDoc());
-
- <span class="reserved">return</span> h;
- },
-
- <span class="comment">/**
- * Returns the selected text.
- *
- * <span class="attrib">@return</span> Selected text contents.
- * <span class="attrib">@type</span> string
- */</span>
- getSelectedText : <span class="reserved">function</span>() {
- var inst = <span class="reserved">this</span>.instance;
- var d, r, s, t;
-
- <span class="reserved">if</span> (tinyMCE.isMSIE) {
- d = inst.getDoc();
-
- <span class="reserved">if</span> (d.selection.type == <span class="literal">"Text"</span>) {
- r = d.selection.createRange();
- t = r.text;
- } <span class="reserved">else</span>
- t = <span class="literal">''</span>;
- } <span class="reserved">else</span> {
- s = <span class="reserved">this</span>.getSel();
-
- <span class="reserved">if</span> (s && s.toString)
- t = s.toString();
- <span class="reserved">else</span>
- t = <span class="literal">''</span>;
- }
-
- <span class="reserved">return</span> t;
- },
-
- <span class="comment">/**
- * Returns a selection bookmark that can be restored later with moveToBookmark.
- * This acts much like the one MSIE has built in but this one is persistent if between DOM
- * tree rewritings. The simple mode enables a quicker and non persistent bookmark.
- *
- * <span class="attrib">@param</span> {boolean} simple If this is set to true, the selection bookmark will not me dom persistent.
- * <span class="attrib">@return</span> Selection bookmark that can be restored later with moveToBookmark.
- * <span class="attrib">@type</span> TinyMCE_Bookmark
- */</span>
- getBookmark : <span class="reserved">function</span>(simple) {
- var rng = <span class="reserved">this</span>.getRng();
- var doc = <span class="reserved">this</span>.instance.getDoc();
- var sp, le, s, e, nl, i, si, ei;
- var trng, sx, sy, xx = -999999999;
-
- <span class="comment">// Skip Opera for now</span>
- <span class="reserved">if</span> (tinyMCE.isOpera)
- <span class="reserved">return</span> null;
-
- sx = doc.body.scrollLeft + doc.documentElement.scrollLeft;
- sy = doc.body.scrollTop + doc.documentElement.scrollTop;
-
- <span class="reserved">if</span> (tinyMCE.isSafari || tinyMCE.isGecko)
- <span class="reserved">return</span> {rng : rng, scrollX : sx, scrollY : sy};
-
- <span class="reserved">if</span> (tinyMCE.isMSIE) {
- <span class="reserved">if</span> (simple)
- <span class="reserved">return</span> {rng : rng};
-
- <span class="reserved">if</span> (rng.item) {
- e = rng.item(0);
-
- nl = doc.getElementsByTagName(e.nodeName);
- <span class="reserved">for</span> (i=0; i<nl.length; i++) {
- <span class="reserved">if</span> (e == nl[i]) {
- sp = i;
- break;
- }
- }
-
- <span class="reserved">return</span> {
- tag : e.nodeName,
- index : sp,
- scrollX : sx,
- scrollY : sy
- };
- } <span class="reserved">else</span> {
- trng = rng.duplicate();
- trng.collapse(true);
- sp = Math.abs(trng.move(<span class="literal">'character'</span>, xx));
-
- trng = rng.duplicate();
- trng.collapse(false);
- le = Math.abs(trng.move(<span class="literal">'character'</span>, xx)) - sp;
-
- <span class="reserved">return</span> {
- start : sp,
- length : le,
- scrollX : sx,
- scrollY : sy
- };
- }
- }
-
- <span class="reserved">if</span> (tinyMCE.isGecko) {
- s = tinyMCE.getParentElement(rng.startContainer);
- <span class="reserved">for</span> (si=0; si<s.childNodes.length && s.childNodes[si] != rng.startContainer; si++) ;
-
- nl = doc.getElementsByTagName(s.nodeName);
- <span class="reserved">for</span> (i=0; i<nl.length; i++) {
- <span class="reserved">if</span> (s == nl[i]) {
- sp = i;
- break;
- }
- }
-
- e = tinyMCE.getParentElement(rng.endContainer);
- <span class="reserved">for</span> (ei=0; ei<e.childNodes.length && e.childNodes[ei] != rng.endContainer; ei++) ;
-
- nl = doc.getElementsByTagName(e.nodeName);
- <span class="reserved">for</span> (i=0; i<nl.length; i++) {
- <span class="reserved">if</span> (e == nl[i]) {
- le = i;
- break;
- }
- }
-
- <span class="comment">//tinyMCE.debug(s.nodeName, sp, rng.startOffset, '-' , e.nodeName, le, rng.endOffset);</span>
- <span class="comment">//tinyMCE.debug(sx, sy);</span>
-
- <span class="reserved">return</span> {
- startTag : s.nodeName,
- start : sp,
- startIndex : si,
- endTag : e.nodeName,
- end : le,
- endIndex : ei,
- startOffset : rng.startOffset,
- endOffset : rng.endOffset,
- scrollX : sx,
- scrollY : sy
- };
- }
-
- <span class="reserved">return</span> null;
- },
-
- <span class="comment">/**
- * Restores the selection to the specified bookmark.
- *
- * <span class="attrib">@param</span> {TinyMCE_Bookmark} bookmark Bookmark to restore selection from.
- * <span class="attrib">@return</span> true/false if it was successful or not.
- * <span class="attrib">@type</span> boolean
- */</span>
- moveToBookmark : <span class="reserved">function</span>(bookmark) {
- var rng, nl, i;
- var inst = <span class="reserved">this</span>.instance;
- var doc = inst.getDoc();
- var win = inst.getWin();
- var sel = <span class="reserved">this</span>.getSel();
-
- <span class="reserved">if</span> (!bookmark)
- <span class="reserved">return</span> false;
-
- <span class="reserved">if</span> (tinyMCE.isSafari) {
- sel.setBaseAndExtent(bookmark.startContainer, bookmark.startOffset, bookmark.endContainer, bookmark.endOffset);
- <span class="reserved">return</span> true;
- }
-
- <span class="reserved">if</span> (tinyMCE.isMSIE) {
- <span class="reserved">if</span> (bookmark.rng) {
- bookmark.rng.select();
- <span class="reserved">return</span> true;
- }
-
- win.focus();
-
- <span class="reserved">if</span> (bookmark.tag) {
- rng = inst.getBody().createControlRange();
-
- nl = doc.getElementsByTagName(bookmark.tag);
-
- <span class="reserved">if</span> (nl.length > bookmark.index) {
- try {
- rng.addElement(nl[bookmark.index]);
- } catch (ex) {
- <span class="comment">// Might be thrown if the node no longer exists</span>
- }
- }
- } <span class="reserved">else</span> {
- rng = inst.getSel().createRange();
- rng.moveToElementText(inst.getBody());
- rng.collapse(true);
- rng.moveStart(<span class="literal">'character'</span>, bookmark.start);
- rng.moveEnd(<span class="literal">'character'</span>, bookmark.length);
- }
-
- rng.select();
-
- win.scrollTo(bookmark.scrollX, bookmark.scrollY);
- <span class="reserved">return</span> true;
- }
-
- <span class="reserved">if</span> (tinyMCE.isGecko && bookmark.rng) {
- sel.removeAllRanges();
- sel.addRange(bookmark.rng);
- win.scrollTo(bookmark.scrollX, bookmark.scrollY);
- <span class="reserved">return</span> true;
- }
-
- <span class="reserved">if</span> (tinyMCE.isGecko) {
- <span class="comment">// try {</span>
- rng = doc.createRange();
-
- nl = doc.getElementsByTagName(bookmark.startTag);
- <span class="reserved">if</span> (nl.length > bookmark.start)
- rng.setStart(nl[bookmark.start].childNodes[bookmark.startIndex], bookmark.startOffset);
-
- nl = doc.getElementsByTagName(bookmark.endTag);
- <span class="reserved">if</span> (nl.length > bookmark.end)
- rng.setEnd(nl[bookmark.end].childNodes[bookmark.endIndex], bookmark.endOffset);
-
- sel.removeAllRanges();
- sel.addRange(rng);
- <span class="comment">/* } catch {
- // Ignore
- }*/</span>
-
- win.scrollTo(bookmark.scrollX, bookmark.scrollY);
- <span class="reserved">return</span> true;
- }
-
- <span class="reserved">return</span> false;
- },
-
- <span class="comment">/**
- * Selects the specified node.
- *
- * <span class="attrib">@param</span> {HTMLNode} node Node object to move selection to.
- * <span class="attrib">@param</span> {boolean} collapse True/false if it will be collasped.
- * <span class="attrib">@param</span> {boolean} select_text_node True/false if the text contents should be selected or not.
- * <span class="attrib">@param</span> {boolean} to_start True/false if the collapse should be to start or end of range.
- */</span>
- selectNode : <span class="reserved">function</span>(node, collapse, select_text_node, to_start) {
- var inst = <span class="reserved">this</span>.instance, sel, rng, nodes;
-
- <span class="reserved">if</span> (!node)
- <span class="reserved">return</span>;
-
- <span class="reserved">if</span> (typeof(collapse) == <span class="literal">"undefined"</span>)
- collapse = true;
-
- <span class="reserved">if</span> (typeof(select_text_node) == <span class="literal">"undefined"</span>)
- select_text_node = false;
-
- <span class="reserved">if</span> (typeof(to_start) == <span class="literal">"undefined"</span>)
- to_start = true;
-
- <span class="reserved">if</span> (tinyMCE.isMSIE) {
- rng = inst.getBody().createTextRange();
-
- try {
- rng.moveToElementText(node);
-
- <span class="reserved">if</span> (collapse)
- rng.collapse(to_start);
-
- rng.select();
- } catch (e) {
- <span class="comment">// Throws illigal agrument in MSIE some times</span>
- }
- } <span class="reserved">else</span> {
- sel = <span class="reserved">this</span>.getSel();
-
- <span class="reserved">if</span> (!sel)
- <span class="reserved">return</span>;
-
- <span class="reserved">if</span> (tinyMCE.isSafari) {
- sel.setBaseAndExtent(node, 0, node, node.innerText.length);
-
- <span class="reserved">if</span> (collapse) {
- <span class="reserved">if</span> (to_start)
- sel.collapseToStart();
- <span class="reserved">else</span>
- sel.collapseToEnd();
- }
-
- <span class="reserved">this</span>.scrollToNode(node);
-
- <span class="reserved">return</span>;
- }
-
- rng = inst.getDoc().createRange();
-
- <span class="reserved">if</span> (select_text_node) {
- <span class="comment">// Find first textnode in tree</span>
- nodes = tinyMCE.getNodeTree(node, new Array(), 3);
- <span class="reserved">if</span> (nodes.length > 0)
- rng.selectNodeContents(nodes[0]);
- <span class="reserved">else</span>
- rng.selectNodeContents(node);
- } <span class="reserved">else</span>
- rng.selectNode(node);
-
- <span class="reserved">if</span> (collapse) {
- <span class="comment">// Special treatment of textnode collapse</span>
- <span class="reserved">if</span> (!to_start && node.nodeType == 3) {
- rng.setStart(node, node.nodeValue.length);
- rng.setEnd(node, node.nodeValue.length);
- } <span class="reserved">else</span>
- rng.collapse(to_start);
- }
-
- sel.removeAllRanges();
- sel.addRange(rng);
- }
-
- <span class="reserved">this</span>.scrollToNode(node);
-
- <span class="comment">// Set selected element</span>
- tinyMCE.selectedElement = null;
- <span class="reserved">if</span> (node.nodeType == 1)
- tinyMCE.selectedElement = node;
- },
-
- <span class="comment">/**
- * Scrolls to the specified node location.
- *
- * <span class="attrib">@param</span> {HTMLNode} node Node to scroll to.
- */</span>
- scrollToNode : <span class="reserved">function</span>(node) {
- var inst = <span class="reserved">this</span>.instance;
- var pos, doc, scrollX, scrollY, height;
-
- <span class="comment">// Scroll to node position</span>
- pos = tinyMCE.getAbsPosition(node);
- doc = inst.getDoc();
- scrollX = doc.body.scrollLeft + doc.documentElement.scrollLeft;
- scrollY = doc.body.scrollTop + doc.documentElement.scrollTop;
- height = tinyMCE.isMSIE ? document.getElementById(inst.editorId).style.pixelHeight : inst.targetElement.clientHeight;
-
- <span class="comment">// Only scroll if out of visible area</span>
- <span class="reserved">if</span> (!tinyMCE.settings[<span class="literal">'auto_resize'</span>] && !(pos.absTop > scrollY && pos.absTop < (scrollY - 25 + height)))
- inst.contentWindow.scrollTo(pos.absLeft, pos.absTop - height + 25);
- },
-
- <span class="comment">/**
- * Returns the browsers selection instance.
- *
- * <span class="attrib">@return</span> Browser selection instance.
- * <span class="attrib">@type</span> DOMSelection
- */</span>
- getSel : <span class="reserved">function</span>() {
- var inst = <span class="reserved">this</span>.instance;
-
- <span class="reserved">if</span> (tinyMCE.isMSIE && !tinyMCE.isOpera)
- <span class="reserved">return</span> inst.getDoc().selection;
-
- <span class="reserved">return</span> inst.contentWindow.getSelection();
- },
-
- <span class="comment">/**
- * Returns the browsers selections first range instance.
- *
- * <span class="attrib">@return</span> Browsers selections first range instance.
- * <span class="attrib">@type</span> DOMRange
- */</span>
- getRng : <span class="reserved">function</span>() {
- var inst = <span class="reserved">this</span>.instance;
- var sel = <span class="reserved">this</span>.getSel();
-
- <span class="reserved">if</span> (sel == null)
- <span class="reserved">return</span> null;
-
- <span class="reserved">if</span> (tinyMCE.isMSIE && !tinyMCE.isOpera)
- <span class="reserved">return</span> sel.createRange();
-
- <span class="reserved">if</span> (tinyMCE.isSafari && !sel.getRangeAt)
- <span class="reserved">return</span> <span class="literal">''</span> + window.getSelection();
-
- <span class="reserved">return</span> sel.getRangeAt(0);
- },
-
- <span class="comment">/**
- * Returns the currently selected/focused element.
- *
- * <span class="attrib">@return</span> Currently selected element.
- * <span class="attrib">@type</span> HTMLElement
- */</span>
- getFocusElement : <span class="reserved">function</span>() {
- var inst = <span class="reserved">this</span>.instance;
-
- <span class="reserved">if</span> (tinyMCE.isMSIE && !tinyMCE.isOpera) {
- var doc = inst.getDoc();
- var rng = doc.selection.createRange();
-
- <span class="comment">// if (rng.collapse)</span>
- <span class="comment">// rng.collapse(true);</span>
-
- var elm = rng.item ? rng.item(0) : rng.parentElement();
- } <span class="reserved">else</span> {
- <span class="reserved">if</span> (inst.isHidden())
- <span class="reserved">return</span> inst.getBody();
-
- var sel = <span class="reserved">this</span>.getSel();
- var rng = <span class="reserved">this</span>.getRng();
-
- <span class="reserved">if</span> (!sel || !rng)
- <span class="reserved">return</span> null;
-
- var elm = rng.commonAncestorContainer;
- <span class="comment">//var elm = (sel && sel.anchorNode) ? sel.anchorNode : null;</span>
-
- <span class="comment">// Handle selection a image or other control like element such as anchors</span>
- <span class="reserved">if</span> (!rng.collapsed) {
- <span class="comment">// Is selection small</span>
- <span class="reserved">if</span> (rng.startContainer == rng.endContainer) {
- <span class="reserved">if</span> (rng.startOffset - rng.endOffset < 2) {
- <span class="reserved">if</span> (rng.startContainer.hasChildNodes())
- elm = rng.startContainer.childNodes[rng.startOffset];
- }
- }
- }
-
- <span class="comment">// Get the element parent of the node</span>
- elm = tinyMCE.getParentElement(elm);
-
- <span class="comment">//if (tinyMCE.selectedElement != null && tinyMCE.selectedElement.nodeName.toLowerCase() == "img")</span>
- <span class="comment">// elm = tinyMCE.selectedElement;</span>
- }
-
- <span class="reserved">return</span> elm;
- }
-};
-</pre>
- <hr>
-
-
-
-<!-- ========== START OF NAVBAR ========== -->
-<a name="navbar_top"><!-- --></a>
-<table border="0" width="100%" cellpadding="1" cellspacing="0">
-<tr>
-<td colspan=2 bgcolor="#EEEEFF" class="NavBarCell1">
-<a name="navbar_top_firstrow"><!-- --></a>
-<table border="0" cellpadding="0" cellspacing="3">
- <tr align="center" valign="top">
-
-
- <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="overview-summary.html"><font class="NavBarFont1"><b>Overview</b></font></a> </td>
- <td bgcolor="#FFFFFF" class="NavBarCell1Rev"> <font class="NavBarFont1Rev"><b>File</b></font> </td>
-
-
- <td bgcolor="#FFFFFF" class="NavBarCell1"> <font class="NavBarFont1">Class</font> </td>
- <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="overview-tree.html"><font class="NavBarFont1"><b>Tree</b></font></a> </td>
- <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="index-all.html"--><font class="NavBarFont1"><b>Index</b></font></a> </td>
- <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="help-doc.html"><font class="NavBarFont1"><b>Help</b></font></a> </td>
- </tr>
-</table>
-</td>
-<td bgcolor="#EEEEFF" align="right" valign="top"><em>
-<b></b></em>
-</td>
-</tr>
-
-<tr>
-<td bgcolor="white" class="NavBarCell2"><font size="-2">
- PREV
- NEXT</font></td>
-<td bgcolor="white" class="NavBarCell2"><font size="-2">
- <a href="index.html" target="_top"><b>FRAMES</b></a>
- <a href="overview-summary.html" target="_top"><b>NO FRAMES</b></a>
-
-<script>
- <!--
- if(window==top) {
- document.writeln('<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>');
- }
- //-->
-</script>
-<noscript>
-<a href="allclasses-noframe.html" target=""><b>All Classes</b></a>
-</noscript>
-</font></td>
-</tr>
-</table>
-<!-- =========== END OF NAVBAR =========== -->
-
-<hr>
-<font size="-1">
-
-</font>
-<div class="jsdoc_ctime">Documentation generated by <a href="http://jsdoc.sourceforge.net/" target="_parent">JSDoc</a> on Fri Apr 14 21:59:23 2006</div>
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/tinymce_api/overview-summary-TinyMCE_Selection.class.js.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/tinymce_api/overview-summary-TinyMCE_Selection.class.js.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/tinymce_api/overview-summary-TinyMCE_Selection.class.js.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/tinymce_api/overview-summary-TinyMCE_Selection.class.js.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,646 @@
+<!doctype html public "-//W3C//DTD HTML 4.0 Frameset//EN""http://www.w3.org/TR/REC-html40/frameset.dtd">
+<html>
+<head>
+<title>
+ Overview
+</title>
+<link rel ="stylesheet" type="text/css" href="stylesheet.css" title="Style">
+<script>
+function asd() {
+
+ parent.document.title="TinyMCE_Selection.class.js Overview";
+
+}
+</script>
+</head>
+<body bgcolor="white" onload="asd();">
+
+<!-- ========== START OF NAVBAR ========== -->
+<a name="navbar_top"><!-- --></a>
+<table border="0" width="100%" cellpadding="1" cellspacing="0">
+<tr>
+<td colspan=2 bgcolor="#EEEEFF" class="NavBarCell1">
+<a name="navbar_top_firstrow"><!-- --></a>
+<table border="0" cellpadding="0" cellspacing="3">
+ <tr align="center" valign="top">
+
+
+ <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="overview-summary.html"><font class="NavBarFont1"><b>Overview</b></font></a> </td>
+ <td bgcolor="#FFFFFF" class="NavBarCell1Rev"> <font class="NavBarFont1Rev"><b>File</b></font> </td>
+
+
+ <td bgcolor="#FFFFFF" class="NavBarCell1"> <font class="NavBarFont1">Class</font> </td>
+ <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="overview-tree.html"><font class="NavBarFont1"><b>Tree</b></font></a> </td>
+ <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="index-all.html"--><font class="NavBarFont1"><b>Index</b></font></a> </td>
+ <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="help-doc.html"><font class="NavBarFont1"><b>Help</b></font></a> </td>
+ </tr>
+</table>
+</td>
+<td bgcolor="#EEEEFF" align="right" valign="top">
+<em>
+<b></b></em>
+</td>
+</tr>
+
+<tr>
+<td bgcolor="white" class="NavBarCell2"><font size="-2">
+ PREV
+ NEXT</font></td>
+<td bgcolor="white" class="NavBarCell2"><font size="-2">
+ <a href="index.html" target="_top"><b>FRAMES</b></a>
+ <a href="overview-summary.html" target="_top"><b>NO FRAMES</b></a>
+
+<script>
+ <!--
+ if(window==top) {
+ document.writeln('<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>');
+ }
+ //-->
+</script>
+<noscript>
+<a href="allclasses-noframe.html" target=""><b>All Classes</b></a>
+</noscript>
+</font></td>
+</tr>
+</table>
+<!-- =========== END OF NAVBAR =========== -->
+
+<hr>
+<center>
+
+ <h2>TinyMCE_Selection.class.js</h2>
+
+</center>
+
+
+
+
+<h4>Summary</h4>
+<p>
+
+ No overview generated for 'TinyMCE_Selection.class.js'<BR/><BR/>
+
+</p>
+
+<hr>
+
+
+ <table border="1" cellpadding="3" cellspacing="0" width="100%">
+ <tr bgcolor="#CCCCFF" class="TableHeadingColor">
+ <td colspan=2><font size="+2">
+
+ <b>Class Summary</b>
+
+ </font></td>
+ </tr>
+
+ <tr bgcolor="white" class="TableRowColor">
+ <td width="15%"><b><a href="TinyMCE_Selection.html">TinyMCE_Selection</a></b></td>
+ <td> </td>
+ </tr>
+
+ </table>
+ <hr/>
+
+
+<!-- ========== METHOD SUMMARY =========== -->
+
+<!-- ========== END METHOD SUMMARY =========== -->
+
+
+ <pre class="sourceview"><span class="comment">/**
+ * $RCSfile: overview-summary-TinyMCE_Selection.class.js.html,v $
+ * $Revision: 1.42 $
+ * $Date: 2006/04/14 20:00:31 $
+ *
+ * <span class="attrib">@author</span> Moxiecode
+ * <span class="attrib">@copyright</span> Copyright © 2004-2006, Moxiecode Systems AB, All rights reserved.
+ */</span>
+
+<span class="comment">/**
+ * Constructs a Selection instance and binds it to the specificed TinyMCE editor control.
+ *
+ * <span class="attrib">@param</span> {TinyMCE_Control} inst TinyMCE editor control instance.
+ * <span class="attrib">@constructor</span>
+ */</span>
+<span class="reserved">function</span> TinyMCE_Selection(inst) {
+ <span class="reserved">this</span>.instance = inst;
+};
+
+TinyMCE_Selection.<span class="reserved">prototype</span> = {
+ <span class="comment">/**
+ * Returns the selected HTML code.
+ *
+ * <span class="attrib">@return</span> Selected HTML contents.
+ * <span class="attrib">@type</span> string
+ */</span>
+ getSelectedHTML : <span class="reserved">function</span>() {
+ var inst = <span class="reserved">this</span>.instance;
+ var e, r = <span class="reserved">this</span>.getRng(), h;
+
+ <span class="reserved">if</span> (tinyMCE.isSafari) {
+ <span class="comment">// Not realy perfect!!</span>
+ <span class="reserved">return</span> r.toString();
+ }
+
+ e = document.createElement(<span class="literal">"body"</span>);
+
+ <span class="reserved">if</span> (tinyMCE.isGecko)
+ e.appendChild(r.cloneContents());
+ <span class="reserved">else</span>
+ e.innerHTML = r.item ? r.item(0).outerHTML : r.htmlText;
+
+ h = tinyMCE._cleanupHTML(inst, inst.contentDocument, inst.settings, e, e, false, true, false);
+
+ <span class="comment">// When editing always use fonts internaly</span>
+ <span class="reserved">if</span> (tinyMCE.getParam(<span class="literal">"convert_fonts_to_spans"</span>))
+ tinyMCE.convertSpansToFonts(inst.getDoc());
+
+ <span class="reserved">return</span> h;
+ },
+
+ <span class="comment">/**
+ * Returns the selected text.
+ *
+ * <span class="attrib">@return</span> Selected text contents.
+ * <span class="attrib">@type</span> string
+ */</span>
+ getSelectedText : <span class="reserved">function</span>() {
+ var inst = <span class="reserved">this</span>.instance;
+ var d, r, s, t;
+
+ <span class="reserved">if</span> (tinyMCE.isMSIE) {
+ d = inst.getDoc();
+
+ <span class="reserved">if</span> (d.selection.type == <span class="literal">"Text"</span>) {
+ r = d.selection.createRange();
+ t = r.text;
+ } <span class="reserved">else</span>
+ t = <span class="literal">''</span>;
+ } <span class="reserved">else</span> {
+ s = <span class="reserved">this</span>.getSel();
+
+ <span class="reserved">if</span> (s && s.toString)
+ t = s.toString();
+ <span class="reserved">else</span>
+ t = <span class="literal">''</span>;
+ }
+
+ <span class="reserved">return</span> t;
+ },
+
+ <span class="comment">/**
+ * Returns a selection bookmark that can be restored later with moveToBookmark.
+ * This acts much like the one MSIE has built in but this one is persistent if between DOM
+ * tree rewritings. The simple mode enables a quicker and non persistent bookmark.
+ *
+ * <span class="attrib">@param</span> {boolean} simple If this is set to true, the selection bookmark will not me dom persistent.
+ * <span class="attrib">@return</span> Selection bookmark that can be restored later with moveToBookmark.
+ * <span class="attrib">@type</span> TinyMCE_Bookmark
+ */</span>
+ getBookmark : <span class="reserved">function</span>(simple) {
+ var rng = <span class="reserved">this</span>.getRng();
+ var doc = <span class="reserved">this</span>.instance.getDoc();
+ var sp, le, s, e, nl, i, si, ei;
+ var trng, sx, sy, xx = -999999999;
+
+ <span class="comment">// Skip Opera for now</span>
+ <span class="reserved">if</span> (tinyMCE.isOpera)
+ <span class="reserved">return</span> null;
+
+ sx = doc.body.scrollLeft + doc.documentElement.scrollLeft;
+ sy = doc.body.scrollTop + doc.documentElement.scrollTop;
+
+ <span class="reserved">if</span> (tinyMCE.isSafari || tinyMCE.isGecko)
+ <span class="reserved">return</span> {rng : rng, scrollX : sx, scrollY : sy};
+
+ <span class="reserved">if</span> (tinyMCE.isMSIE) {
+ <span class="reserved">if</span> (simple)
+ <span class="reserved">return</span> {rng : rng};
+
+ <span class="reserved">if</span> (rng.item) {
+ e = rng.item(0);
+
+ nl = doc.getElementsByTagName(e.nodeName);
+ <span class="reserved">for</span> (i=0; i<nl.length; i++) {
+ <span class="reserved">if</span> (e == nl[i]) {
+ sp = i;
+ break;
+ }
+ }
+
+ <span class="reserved">return</span> {
+ tag : e.nodeName,
+ index : sp,
+ scrollX : sx,
+ scrollY : sy
+ };
+ } <span class="reserved">else</span> {
+ trng = rng.duplicate();
+ trng.collapse(true);
+ sp = Math.abs(trng.move(<span class="literal">'character'</span>, xx));
+
+ trng = rng.duplicate();
+ trng.collapse(false);
+ le = Math.abs(trng.move(<span class="literal">'character'</span>, xx)) - sp;
+
+ <span class="reserved">return</span> {
+ start : sp,
+ length : le,
+ scrollX : sx,
+ scrollY : sy
+ };
+ }
+ }
+
+ <span class="reserved">if</span> (tinyMCE.isGecko) {
+ s = tinyMCE.getParentElement(rng.startContainer);
+ <span class="reserved">for</span> (si=0; si<s.childNodes.length && s.childNodes[si] != rng.startContainer; si++) ;
+
+ nl = doc.getElementsByTagName(s.nodeName);
+ <span class="reserved">for</span> (i=0; i<nl.length; i++) {
+ <span class="reserved">if</span> (s == nl[i]) {
+ sp = i;
+ break;
+ }
+ }
+
+ e = tinyMCE.getParentElement(rng.endContainer);
+ <span class="reserved">for</span> (ei=0; ei<e.childNodes.length && e.childNodes[ei] != rng.endContainer; ei++) ;
+
+ nl = doc.getElementsByTagName(e.nodeName);
+ <span class="reserved">for</span> (i=0; i<nl.length; i++) {
+ <span class="reserved">if</span> (e == nl[i]) {
+ le = i;
+ break;
+ }
+ }
+
+ <span class="comment">//tinyMCE.debug(s.nodeName, sp, rng.startOffset, '-' , e.nodeName, le, rng.endOffset);</span>
+ <span class="comment">//tinyMCE.debug(sx, sy);</span>
+
+ <span class="reserved">return</span> {
+ startTag : s.nodeName,
+ start : sp,
+ startIndex : si,
+ endTag : e.nodeName,
+ end : le,
+ endIndex : ei,
+ startOffset : rng.startOffset,
+ endOffset : rng.endOffset,
+ scrollX : sx,
+ scrollY : sy
+ };
+ }
+
+ <span class="reserved">return</span> null;
+ },
+
+ <span class="comment">/**
+ * Restores the selection to the specified bookmark.
+ *
+ * <span class="attrib">@param</span> {TinyMCE_Bookmark} bookmark Bookmark to restore selection from.
+ * <span class="attrib">@return</span> true/false if it was successful or not.
+ * <span class="attrib">@type</span> boolean
+ */</span>
+ moveToBookmark : <span class="reserved">function</span>(bookmark) {
+ var rng, nl, i;
+ var inst = <span class="reserved">this</span>.instance;
+ var doc = inst.getDoc();
+ var win = inst.getWin();
+ var sel = <span class="reserved">this</span>.getSel();
+
+ <span class="reserved">if</span> (!bookmark)
+ <span class="reserved">return</span> false;
+
+ <span class="reserved">if</span> (tinyMCE.isSafari) {
+ sel.setBaseAndExtent(bookmark.startContainer, bookmark.startOffset, bookmark.endContainer, bookmark.endOffset);
+ <span class="reserved">return</span> true;
+ }
+
+ <span class="reserved">if</span> (tinyMCE.isMSIE) {
+ <span class="reserved">if</span> (bookmark.rng) {
+ bookmark.rng.select();
+ <span class="reserved">return</span> true;
+ }
+
+ win.focus();
+
+ <span class="reserved">if</span> (bookmark.tag) {
+ rng = inst.getBody().createControlRange();
+
+ nl = doc.getElementsByTagName(bookmark.tag);
+
+ <span class="reserved">if</span> (nl.length > bookmark.index) {
+ try {
+ rng.addElement(nl[bookmark.index]);
+ } catch (ex) {
+ <span class="comment">// Might be thrown if the node no longer exists</span>
+ }
+ }
+ } <span class="reserved">else</span> {
+ rng = inst.getSel().createRange();
+ rng.moveToElementText(inst.getBody());
+ rng.collapse(true);
+ rng.moveStart(<span class="literal">'character'</span>, bookmark.start);
+ rng.moveEnd(<span class="literal">'character'</span>, bookmark.length);
+ }
+
+ rng.select();
+
+ win.scrollTo(bookmark.scrollX, bookmark.scrollY);
+ <span class="reserved">return</span> true;
+ }
+
+ <span class="reserved">if</span> (tinyMCE.isGecko && bookmark.rng) {
+ sel.removeAllRanges();
+ sel.addRange(bookmark.rng);
+ win.scrollTo(bookmark.scrollX, bookmark.scrollY);
+ <span class="reserved">return</span> true;
+ }
+
+ <span class="reserved">if</span> (tinyMCE.isGecko) {
+ <span class="comment">// try {</span>
+ rng = doc.createRange();
+
+ nl = doc.getElementsByTagName(bookmark.startTag);
+ <span class="reserved">if</span> (nl.length > bookmark.start)
+ rng.setStart(nl[bookmark.start].childNodes[bookmark.startIndex], bookmark.startOffset);
+
+ nl = doc.getElementsByTagName(bookmark.endTag);
+ <span class="reserved">if</span> (nl.length > bookmark.end)
+ rng.setEnd(nl[bookmark.end].childNodes[bookmark.endIndex], bookmark.endOffset);
+
+ sel.removeAllRanges();
+ sel.addRange(rng);
+ <span class="comment">/* } catch {
+ // Ignore
+ }*/</span>
+
+ win.scrollTo(bookmark.scrollX, bookmark.scrollY);
+ <span class="reserved">return</span> true;
+ }
+
+ <span class="reserved">return</span> false;
+ },
+
+ <span class="comment">/**
+ * Selects the specified node.
+ *
+ * <span class="attrib">@param</span> {HTMLNode} node Node object to move selection to.
+ * <span class="attrib">@param</span> {boolean} collapse True/false if it will be collasped.
+ * <span class="attrib">@param</span> {boolean} select_text_node True/false if the text contents should be selected or not.
+ * <span class="attrib">@param</span> {boolean} to_start True/false if the collapse should be to start or end of range.
+ */</span>
+ selectNode : <span class="reserved">function</span>(node, collapse, select_text_node, to_start) {
+ var inst = <span class="reserved">this</span>.instance, sel, rng, nodes;
+
+ <span class="reserved">if</span> (!node)
+ <span class="reserved">return</span>;
+
+ <span class="reserved">if</span> (typeof(collapse) == <span class="literal">"undefined"</span>)
+ collapse = true;
+
+ <span class="reserved">if</span> (typeof(select_text_node) == <span class="literal">"undefined"</span>)
+ select_text_node = false;
+
+ <span class="reserved">if</span> (typeof(to_start) == <span class="literal">"undefined"</span>)
+ to_start = true;
+
+ <span class="reserved">if</span> (tinyMCE.isMSIE) {
+ rng = inst.getBody().createTextRange();
+
+ try {
+ rng.moveToElementText(node);
+
+ <span class="reserved">if</span> (collapse)
+ rng.collapse(to_start);
+
+ rng.select();
+ } catch (e) {
+ <span class="comment">// Throws illigal agrument in MSIE some times</span>
+ }
+ } <span class="reserved">else</span> {
+ sel = <span class="reserved">this</span>.getSel();
+
+ <span class="reserved">if</span> (!sel)
+ <span class="reserved">return</span>;
+
+ <span class="reserved">if</span> (tinyMCE.isSafari) {
+ sel.setBaseAndExtent(node, 0, node, node.innerText.length);
+
+ <span class="reserved">if</span> (collapse) {
+ <span class="reserved">if</span> (to_start)
+ sel.collapseToStart();
+ <span class="reserved">else</span>
+ sel.collapseToEnd();
+ }
+
+ <span class="reserved">this</span>.scrollToNode(node);
+
+ <span class="reserved">return</span>;
+ }
+
+ rng = inst.getDoc().createRange();
+
+ <span class="reserved">if</span> (select_text_node) {
+ <span class="comment">// Find first textnode in tree</span>
+ nodes = tinyMCE.getNodeTree(node, new Array(), 3);
+ <span class="reserved">if</span> (nodes.length > 0)
+ rng.selectNodeContents(nodes[0]);
+ <span class="reserved">else</span>
+ rng.selectNodeContents(node);
+ } <span class="reserved">else</span>
+ rng.selectNode(node);
+
+ <span class="reserved">if</span> (collapse) {
+ <span class="comment">// Special treatment of textnode collapse</span>
+ <span class="reserved">if</span> (!to_start && node.nodeType == 3) {
+ rng.setStart(node, node.nodeValue.length);
+ rng.setEnd(node, node.nodeValue.length);
+ } <span class="reserved">else</span>
+ rng.collapse(to_start);
+ }
+
+ sel.removeAllRanges();
+ sel.addRange(rng);
+ }
+
+ <span class="reserved">this</span>.scrollToNode(node);
+
+ <span class="comment">// Set selected element</span>
+ tinyMCE.selectedElement = null;
+ <span class="reserved">if</span> (node.nodeType == 1)
+ tinyMCE.selectedElement = node;
+ },
+
+ <span class="comment">/**
+ * Scrolls to the specified node location.
+ *
+ * <span class="attrib">@param</span> {HTMLNode} node Node to scroll to.
+ */</span>
+ scrollToNode : <span class="reserved">function</span>(node) {
+ var inst = <span class="reserved">this</span>.instance;
+ var pos, doc, scrollX, scrollY, height;
+
+ <span class="comment">// Scroll to node position</span>
+ pos = tinyMCE.getAbsPosition(node);
+ doc = inst.getDoc();
+ scrollX = doc.body.scrollLeft + doc.documentElement.scrollLeft;
+ scrollY = doc.body.scrollTop + doc.documentElement.scrollTop;
+ height = tinyMCE.isMSIE ? document.getElementById(inst.editorId).style.pixelHeight : inst.targetElement.clientHeight;
+
+ <span class="comment">// Only scroll if out of visible area</span>
+ <span class="reserved">if</span> (!tinyMCE.settings[<span class="literal">'auto_resize'</span>] && !(pos.absTop > scrollY && pos.absTop < (scrollY - 25 + height)))
+ inst.contentWindow.scrollTo(pos.absLeft, pos.absTop - height + 25);
+ },
+
+ <span class="comment">/**
+ * Returns the browsers selection instance.
+ *
+ * <span class="attrib">@return</span> Browser selection instance.
+ * <span class="attrib">@type</span> DOMSelection
+ */</span>
+ getSel : <span class="reserved">function</span>() {
+ var inst = <span class="reserved">this</span>.instance;
+
+ <span class="reserved">if</span> (tinyMCE.isMSIE && !tinyMCE.isOpera)
+ <span class="reserved">return</span> inst.getDoc().selection;
+
+ <span class="reserved">return</span> inst.contentWindow.getSelection();
+ },
+
+ <span class="comment">/**
+ * Returns the browsers selections first range instance.
+ *
+ * <span class="attrib">@return</span> Browsers selections first range instance.
+ * <span class="attrib">@type</span> DOMRange
+ */</span>
+ getRng : <span class="reserved">function</span>() {
+ var inst = <span class="reserved">this</span>.instance;
+ var sel = <span class="reserved">this</span>.getSel();
+
+ <span class="reserved">if</span> (sel == null)
+ <span class="reserved">return</span> null;
+
+ <span class="reserved">if</span> (tinyMCE.isMSIE && !tinyMCE.isOpera)
+ <span class="reserved">return</span> sel.createRange();
+
+ <span class="reserved">if</span> (tinyMCE.isSafari && !sel.getRangeAt)
+ <span class="reserved">return</span> <span class="literal">''</span> + window.getSelection();
+
+ <span class="reserved">return</span> sel.getRangeAt(0);
+ },
+
+ <span class="comment">/**
+ * Returns the currently selected/focused element.
+ *
+ * <span class="attrib">@return</span> Currently selected element.
+ * <span class="attrib">@type</span> HTMLElement
+ */</span>
+ getFocusElement : <span class="reserved">function</span>() {
+ var inst = <span class="reserved">this</span>.instance;
+
+ <span class="reserved">if</span> (tinyMCE.isMSIE && !tinyMCE.isOpera) {
+ var doc = inst.getDoc();
+ var rng = doc.selection.createRange();
+
+ <span class="comment">// if (rng.collapse)</span>
+ <span class="comment">// rng.collapse(true);</span>
+
+ var elm = rng.item ? rng.item(0) : rng.parentElement();
+ } <span class="reserved">else</span> {
+ <span class="reserved">if</span> (inst.isHidden())
+ <span class="reserved">return</span> inst.getBody();
+
+ var sel = <span class="reserved">this</span>.getSel();
+ var rng = <span class="reserved">this</span>.getRng();
+
+ <span class="reserved">if</span> (!sel || !rng)
+ <span class="reserved">return</span> null;
+
+ var elm = rng.commonAncestorContainer;
+ <span class="comment">//var elm = (sel && sel.anchorNode) ? sel.anchorNode : null;</span>
+
+ <span class="comment">// Handle selection a image or other control like element such as anchors</span>
+ <span class="reserved">if</span> (!rng.collapsed) {
+ <span class="comment">// Is selection small</span>
+ <span class="reserved">if</span> (rng.startContainer == rng.endContainer) {
+ <span class="reserved">if</span> (rng.startOffset - rng.endOffset < 2) {
+ <span class="reserved">if</span> (rng.startContainer.hasChildNodes())
+ elm = rng.startContainer.childNodes[rng.startOffset];
+ }
+ }
+ }
+
+ <span class="comment">// Get the element parent of the node</span>
+ elm = tinyMCE.getParentElement(elm);
+
+ <span class="comment">//if (tinyMCE.selectedElement != null && tinyMCE.selectedElement.nodeName.toLowerCase() == "img")</span>
+ <span class="comment">// elm = tinyMCE.selectedElement;</span>
+ }
+
+ <span class="reserved">return</span> elm;
+ }
+};
+</pre>
+ <hr>
+
+
+
+<!-- ========== START OF NAVBAR ========== -->
+<a name="navbar_top"><!-- --></a>
+<table border="0" width="100%" cellpadding="1" cellspacing="0">
+<tr>
+<td colspan=2 bgcolor="#EEEEFF" class="NavBarCell1">
+<a name="navbar_top_firstrow"><!-- --></a>
+<table border="0" cellpadding="0" cellspacing="3">
+ <tr align="center" valign="top">
+
+
+ <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="overview-summary.html"><font class="NavBarFont1"><b>Overview</b></font></a> </td>
+ <td bgcolor="#FFFFFF" class="NavBarCell1Rev"> <font class="NavBarFont1Rev"><b>File</b></font> </td>
+
+
+ <td bgcolor="#FFFFFF" class="NavBarCell1"> <font class="NavBarFont1">Class</font> </td>
+ <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="overview-tree.html"><font class="NavBarFont1"><b>Tree</b></font></a> </td>
+ <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="index-all.html"--><font class="NavBarFont1"><b>Index</b></font></a> </td>
+ <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="help-doc.html"><font class="NavBarFont1"><b>Help</b></font></a> </td>
+ </tr>
+</table>
+</td>
+<td bgcolor="#EEEEFF" align="right" valign="top"><em>
+<b></b></em>
+</td>
+</tr>
+
+<tr>
+<td bgcolor="white" class="NavBarCell2"><font size="-2">
+ PREV
+ NEXT</font></td>
+<td bgcolor="white" class="NavBarCell2"><font size="-2">
+ <a href="index.html" target="_top"><b>FRAMES</b></a>
+ <a href="overview-summary.html" target="_top"><b>NO FRAMES</b></a>
+
+<script>
+ <!--
+ if(window==top) {
+ document.writeln('<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>');
+ }
+ //-->
+</script>
+<noscript>
+<a href="allclasses-noframe.html" target=""><b>All Classes</b></a>
+</noscript>
+</font></td>
+</tr>
+</table>
+<!-- =========== END OF NAVBAR =========== -->
+
+<hr>
+<font size="-1">
+
+</font>
+<div class="jsdoc_ctime">Documentation generated by <a href="http://jsdoc.sourceforge.net/" target="_parent">JSDoc</a> on Fri Apr 14 21:59:23 2006</div>
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/tinymce_api/overview-summary-TinyMCE_URL.class.js.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/tinymce_api/overview-summary-TinyMCE_URL.class.js.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/tinymce_api/overview-summary-TinyMCE_URL.class.js.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,530 +0,0 @@
-<!doctype html public "-//W3C//DTD HTML 4.0 Frameset//EN""http://www.w3.org/TR/REC-html40/frameset.dtd">
-<html>
-<head>
-<title>
- Overview
-</title>
-<link rel ="stylesheet" type="text/css" href="stylesheet.css" title="Style">
-<script>
-function asd() {
-
- parent.document.title="TinyMCE_URL.class.js Overview";
-
-}
-</script>
-</head>
-<body bgcolor="white" onload="asd();">
-
-<!-- ========== START OF NAVBAR ========== -->
-<a name="navbar_top"><!-- --></a>
-<table border="0" width="100%" cellpadding="1" cellspacing="0">
-<tr>
-<td colspan=2 bgcolor="#EEEEFF" class="NavBarCell1">
-<a name="navbar_top_firstrow"><!-- --></a>
-<table border="0" cellpadding="0" cellspacing="3">
- <tr align="center" valign="top">
-
-
- <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="overview-summary.html"><font class="NavBarFont1"><b>Overview</b></font></a> </td>
- <td bgcolor="#FFFFFF" class="NavBarCell1Rev"> <font class="NavBarFont1Rev"><b>File</b></font> </td>
-
-
- <td bgcolor="#FFFFFF" class="NavBarCell1"> <font class="NavBarFont1">Class</font> </td>
- <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="overview-tree.html"><font class="NavBarFont1"><b>Tree</b></font></a> </td>
- <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="index-all.html"--><font class="NavBarFont1"><b>Index</b></font></a> </td>
- <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="help-doc.html"><font class="NavBarFont1"><b>Help</b></font></a> </td>
- </tr>
-</table>
-</td>
-<td bgcolor="#EEEEFF" align="right" valign="top">
-<em>
-<b></b></em>
-</td>
-</tr>
-
-<tr>
-<td bgcolor="white" class="NavBarCell2"><font size="-2">
- PREV
- NEXT</font></td>
-<td bgcolor="white" class="NavBarCell2"><font size="-2">
- <a href="index.html" target="_top"><b>FRAMES</b></a>
- <a href="overview-summary.html" target="_top"><b>NO FRAMES</b></a>
-
-<script>
- <!--
- if(window==top) {
- document.writeln('<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>');
- }
- //-->
-</script>
-<noscript>
-<a href="allclasses-noframe.html" target=""><b>All Classes</b></a>
-</noscript>
-</font></td>
-</tr>
-</table>
-<!-- =========== END OF NAVBAR =========== -->
-
-<hr>
-<center>
-
- <h2>TinyMCE_URL.class.js</h2>
-
-</center>
-
-
-
-
-<h4>Summary</h4>
-<p>
-
- No overview generated for 'TinyMCE_URL.class.js'<BR/><BR/>
-
-</p>
-
-<hr>
-
-
-
-<!-- ========== METHOD SUMMARY =========== -->
-
-<!-- ========== END METHOD SUMMARY =========== -->
-
-
- <pre class="sourceview"><span class="comment">/**
- * $RCSfile: overview-summary-TinyMCE_URL.class.js.html,v $
- * $Revision: 1.42 $
- * $Date: 2006/04/14 20:00:31 $
- *
- * <span class="attrib">@author</span> Moxiecode
- * <span class="attrib">@copyright</span> Copyright © 2004-2006, Moxiecode Systems AB, All rights reserved.
- *
- * The contents of this file will be wrapped in a class later on.
- */</span>
-
-<span class="comment">/**
- * Parses a URL in to its diffrent components.
- *
- * <span class="attrib">@param</span> {string} url_str URL string to parse into a URL object.
- * <span class="attrib">@return</span> URL object based on input string.
- * <span class="attrib">@type</span> TinyMCE_URL_Item
- */</span>
-TinyMCE_Engine.<span class="reserved">prototype</span>.parseURL = <span class="reserved">function</span>(url_str) {
- var urlParts = new Array();
-
- <span class="reserved">if</span> (url_str) {
- var pos, lastPos;
-
- <span class="comment">// Parse protocol part</span>
- pos = url_str.indexOf(<span class="literal">'://'</span>);
- <span class="reserved">if</span> (pos != -1) {
- urlParts[<span class="literal">'protocol'</span>] = url_str.substring(0, pos);
- lastPos = pos + 3;
- }
-
- <span class="comment">// Find port or path start</span>
- <span class="reserved">for</span> (var i=lastPos; i<url_str.length; i++) {
- var chr = url_str.charAt(i);
-
- <span class="reserved">if</span> (chr == <span class="literal">':'</span>)
- break;
-
- <span class="reserved">if</span> (chr == <span class="literal">'/'</span>)
- break;
- }
- pos = i;
-
- <span class="comment">// Get host</span>
- urlParts[<span class="literal">'host'</span>] = url_str.substring(lastPos, pos);
-
- <span class="comment">// Get port</span>
- urlParts[<span class="literal">'port'</span>] = <span class="literal">""</span>;
- lastPos = pos;
- <span class="reserved">if</span> (url_str.charAt(pos) == <span class="literal">':'</span>) {
- pos = url_str.indexOf(<span class="literal">'/'</span>, lastPos);
- urlParts[<span class="literal">'port'</span>] = url_str.substring(lastPos+1, pos);
- }
-
- <span class="comment">// Get path</span>
- lastPos = pos;
- pos = url_str.indexOf(<span class="literal">'?'</span>, lastPos);
-
- <span class="reserved">if</span> (pos == -1)
- pos = url_str.indexOf(<span class="literal">'#'</span>, lastPos);
-
- <span class="reserved">if</span> (pos == -1)
- pos = url_str.length;
-
- urlParts[<span class="literal">'path'</span>] = url_str.substring(lastPos, pos);
-
- <span class="comment">// Get query</span>
- lastPos = pos;
- <span class="reserved">if</span> (url_str.charAt(pos) == <span class="literal">'?'</span>) {
- pos = url_str.indexOf(<span class="literal">'#'</span>);
- pos = (pos == -1) ? url_str.length : pos;
- urlParts[<span class="literal">'query'</span>] = url_str.substring(lastPos+1, pos);
- }
-
- <span class="comment">// Get anchor</span>
- lastPos = pos;
- <span class="reserved">if</span> (url_str.charAt(pos) == <span class="literal">'#'</span>) {
- pos = url_str.length;
- urlParts[<span class="literal">'anchor'</span>] = url_str.substring(lastPos+1, pos);
- }
- }
-
- <span class="reserved">return</span> urlParts;
-};
-
-<span class="comment">/**
- * Serializes the specified URL object into a string.
- *
- * <span class="attrib">@param</span> {TinyMCE_URL_Item} up URL object to serialize.
- * <span class="attrib">@return</span> Serialized URL object.
- * <span class="attrib">@type</span> string
- */</span>
-TinyMCE_Engine.<span class="reserved">prototype</span>.serializeURL = <span class="reserved">function</span>(up) {
- var o = <span class="literal">""</span>;
-
- <span class="reserved">if</span> (up[<span class="literal">'protocol'</span>])
- o += up[<span class="literal">'protocol'</span>] + <span class="literal">"://"</span>;
-
- <span class="reserved">if</span> (up[<span class="literal">'host'</span>])
- o += up[<span class="literal">'host'</span>];
-
- <span class="reserved">if</span> (up[<span class="literal">'port'</span>])
- o += <span class="literal">":"</span> + up[<span class="literal">'port'</span>];
-
- <span class="reserved">if</span> (up[<span class="literal">'path'</span>])
- o += up[<span class="literal">'path'</span>];
-
- <span class="reserved">if</span> (up[<span class="literal">'query'</span>])
- o += <span class="literal">"?"</span> + up[<span class="literal">'query'</span>];
-
- <span class="reserved">if</span> (up[<span class="literal">'anchor'</span>])
- o += <span class="literal">"#"</span> + up[<span class="literal">'anchor'</span>];
-
- <span class="reserved">return</span> o;
-};
-
-<span class="comment">/**
- * Converts an absolute path to relative path.
- *
- * <span class="attrib">@param</span> {string} base_url URL to make as a base path, URLs will be converted relative from this point.
- * <span class="attrib">@param</span> {string} url_to_relative URL to convert into a relative URL.
- * <span class="attrib">@return</span> Relative URL based in input.
- * <span class="attrib">@type</span> string
- */</span>
-TinyMCE_Engine.<span class="reserved">prototype</span>.convertAbsoluteURLToRelativeURL = <span class="reserved">function</span>(base_url, url_to_relative) {
- var baseURL = <span class="reserved">this</span>.parseURL(base_url);
- var targetURL = <span class="reserved">this</span>.parseURL(url_to_relative);
- var strTok1;
- var strTok2;
- var breakPoint = 0;
- var outPath = <span class="literal">""</span>;
- var forceSlash = false;
-
- <span class="reserved">if</span> (targetURL.path == <span class="literal">""</span>)
- targetURL.path = <span class="literal">"/"</span>;
- <span class="reserved">else</span>
- forceSlash = true;
-
- <span class="comment">// Crop away last path part</span>
- base_url = baseURL.path.substring(0, baseURL.path.lastIndexOf(<span class="literal">'/'</span>));
- strTok1 = base_url.split(<span class="literal">'/'</span>);
- strTok2 = targetURL.path.split(<span class="literal">'/'</span>);
-
- <span class="reserved">if</span> (strTok1.length >= strTok2.length) {
- <span class="reserved">for</span> (var i=0; i<strTok1.length; i++) {
- <span class="reserved">if</span> (i >= strTok2.length || strTok1[i] != strTok2[i]) {
- breakPoint = i + 1;
- break;
- }
- }
- }
-
- <span class="reserved">if</span> (strTok1.length < strTok2.length) {
- <span class="reserved">for</span> (var i=0; i<strTok2.length; i++) {
- <span class="reserved">if</span> (i >= strTok1.length || strTok1[i] != strTok2[i]) {
- breakPoint = i + 1;
- break;
- }
- }
- }
-
- <span class="reserved">if</span> (breakPoint == 1)
- <span class="reserved">return</span> targetURL.path;
-
- <span class="reserved">for</span> (var i=0; i<(strTok1.length-(breakPoint-1)); i++)
- outPath += <span class="literal">"../"</span>;
-
- <span class="reserved">for</span> (var i=breakPoint-1; i<strTok2.length; i++) {
- <span class="reserved">if</span> (i != (breakPoint-1))
- outPath += <span class="literal">"/"</span> + strTok2[i];
- <span class="reserved">else</span>
- outPath += strTok2[i];
- }
-
- targetURL.protocol = null;
- targetURL.host = null;
- targetURL.port = null;
- targetURL.path = outPath == <span class="literal">""</span> && forceSlash ? <span class="literal">"/"</span> : outPath;
-
- <span class="comment">// Remove document prefix from local anchors</span>
- var fileName = baseURL.path;
- var pos;
-
- <span class="reserved">if</span> ((pos = fileName.lastIndexOf(<span class="literal">'/'</span>)) != -1)
- fileName = fileName.substring(pos + 1);
-
- <span class="comment">// Is local anchor</span>
- <span class="reserved">if</span> (fileName == targetURL.path && targetURL.anchor != <span class="literal">""</span>)
- targetURL.path = <span class="literal">""</span>;
-
- <span class="comment">// If empty and not local anchor force filename or slash</span>
- <span class="reserved">if</span> (targetURL.path == <span class="literal">""</span> && !targetURL.anchor)
- targetURL.path = fileName != <span class="literal">""</span> ? fileName : <span class="literal">"/"</span>;
-
- <span class="reserved">return</span> <span class="reserved">this</span>.serializeURL(targetURL);
-};
-
-<span class="comment">/**
- * Converts an relative path to absolute path.
- *
- * <span class="attrib">@param</span> {string} base_url URL to make as a base path, URLs will be converted absolute from this point.
- * <span class="attrib">@param</span> {string} relative_url URL to convert into a absolute URL.
- * <span class="attrib">@return</span> Absolute URL based in input.
- * <span class="attrib">@type</span> string
- */</span>
-TinyMCE_Engine.<span class="reserved">prototype</span>.convertRelativeToAbsoluteURL = <span class="reserved">function</span>(base_url, relative_url) {
- var baseURL = <span class="reserved">this</span>.parseURL(base_url);
- var relURL = <span class="reserved">this</span>.parseURL(relative_url);
-
- <span class="reserved">if</span> (relative_url == <span class="literal">""</span> || relative_url.charAt(0) == <span class="literal">'/'</span> || relative_url.indexOf(<span class="literal">'://'</span>) != -1 || relative_url.indexOf(<span class="literal">'mailto:'</span>) != -1 || relative_url.indexOf(<span class="literal">'javascript:'</span>) != -1)
- <span class="reserved">return</span> relative_url;
-
- <span class="comment">// Split parts</span>
- baseURLParts = baseURL[<span class="literal">'path'</span>].split(<span class="literal">'/'</span>);
- relURLParts = relURL[<span class="literal">'path'</span>].split(<span class="literal">'/'</span>);
-
- <span class="comment">// Remove empty chunks</span>
- var newBaseURLParts = new Array();
- <span class="reserved">for</span> (var i=baseURLParts.length-1; i>=0; i--) {
- <span class="reserved">if</span> (baseURLParts[i].length == 0)
- continue;
-
- newBaseURLParts[newBaseURLParts.length] = baseURLParts[i];
- }
- baseURLParts = newBaseURLParts.reverse();
-
- <span class="comment">// Merge relURLParts chunks</span>
- var newRelURLParts = new Array();
- var numBack = 0;
- <span class="reserved">for</span> (var i=relURLParts.length-1; i>=0; i--) {
- <span class="reserved">if</span> (relURLParts[i].length == 0 || relURLParts[i] == <span class="literal">"."</span>)
- continue;
-
- <span class="reserved">if</span> (relURLParts[i] == <span class="literal">'..'</span>) {
- numBack++;
- continue;
- }
-
- <span class="reserved">if</span> (numBack > 0) {
- numBack--;
- continue;
- }
-
- newRelURLParts[newRelURLParts.length] = relURLParts[i];
- }
-
- relURLParts = newRelURLParts.reverse();
-
- <span class="comment">// Remove end from absolute path</span>
- var len = baseURLParts.length-numBack;
- var absPath = (len <= 0 ? <span class="literal">""</span> : <span class="literal">"/"</span>) + baseURLParts.slice(0, len).join(<span class="literal">'/'</span>) + <span class="literal">"/"</span> + relURLParts.join(<span class="literal">'/'</span>);
- var start = <span class="literal">""</span>, end = <span class="literal">""</span>;
-
- <span class="comment">// Build output URL</span>
- relURL.protocol = baseURL.protocol;
- relURL.host = baseURL.host;
- relURL.port = baseURL.port;
-
- <span class="comment">// Re-add trailing slash if it's removed</span>
- <span class="reserved">if</span> (relURL.path.charAt(relURL.path.length-1) == <span class="literal">"/"</span>)
- absPath += <span class="literal">"/"</span>;
-
- relURL.path = absPath;
-
- <span class="reserved">return</span> <span class="reserved">this</span>.serializeURL(relURL);
-};
-
-<span class="comment">/**
- * Converts the specified URL based in TinyMCE configuration settings.
- *
- * <span class="attrib">@param</span> {string} url URL to convert based on config.
- * <span class="attrib">@param</span> {HTMLElement} node HTML element that holds the URL.
- * <span class="attrib">@param</span> {boolean} on_save Is this convertion the final output URL.
- * <span class="attrib">@return</span> Converted URL string.
- * <span class="attrib">@type</span> string
- */</span>
-TinyMCE_Engine.<span class="reserved">prototype</span>.convertURL = <span class="reserved">function</span>(url, node, on_save) {
- var prot = document.location.protocol;
- var host = document.location.hostname;
- var port = document.location.port;
-
- <span class="comment">// Pass through file protocol</span>
- <span class="reserved">if</span> (prot == <span class="literal">"file:"</span>)
- <span class="reserved">return</span> url;
-
- <span class="comment">// Something is wrong, remove weirdness</span>
- url = tinyMCE.regexpReplace(url, <span class="literal">'(http|https):///'</span>, <span class="literal">'/'</span>);
-
- <span class="comment">// Mailto link or anchor (Pass through)</span>
- <span class="reserved">if</span> (url.indexOf(<span class="literal">'mailto:'</span>) != -1 || url.indexOf(<span class="literal">'javascript:'</span>) != -1 || tinyMCE.regexpReplace(url,<span class="literal">'[ \t\r\n\+]|%20'</span>,<span class="literal">''</span>).charAt(0) == <span class="literal">"#"</span>)
- <span class="reserved">return</span> url;
-
- <span class="comment">// Fix relative/Mozilla</span>
- <span class="reserved">if</span> (!tinyMCE.isMSIE && !on_save && url.indexOf(<span class="literal">"://"</span>) == -1 && url.charAt(0) != <span class="literal">'/'</span>)
- <span class="reserved">return</span> tinyMCE.settings[<span class="literal">'base_href'</span>] + url;
-
- <span class="comment">// Handle relative URLs</span>
- <span class="reserved">if</span> (on_save && tinyMCE.getParam(<span class="literal">'relative_urls'</span>)) {
- var curl = tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings[<span class="literal">'base_href'</span>], url);
- <span class="reserved">if</span> (curl.charAt(0) == <span class="literal">'/'</span>)
- curl = tinyMCE.settings[<span class="literal">'document_base_prefix'</span>] + curl;
-
- var urlParts = tinyMCE.parseURL(curl);
- var tmpUrlParts = tinyMCE.parseURL(tinyMCE.settings[<span class="literal">'document_base_url'</span>]);
-
- <span class="comment">// Force relative</span>
- <span class="reserved">if</span> (urlParts[<span class="literal">'host'</span>] == tmpUrlParts[<span class="literal">'host'</span>] && (urlParts[<span class="literal">'port'</span>] == tmpUrlParts[<span class="literal">'port'</span>]))
- <span class="reserved">return</span> tinyMCE.convertAbsoluteURLToRelativeURL(tinyMCE.settings[<span class="literal">'document_base_url'</span>], curl);
- }
-
- <span class="comment">// Handle absolute URLs</span>
- <span class="reserved">if</span> (!tinyMCE.getParam(<span class="literal">'relative_urls'</span>)) {
- var urlParts = tinyMCE.parseURL(url);
- var baseUrlParts = tinyMCE.parseURL(tinyMCE.settings[<span class="literal">'base_href'</span>]);
-
- <span class="comment">// Force absolute URLs from relative URLs</span>
- url = tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings[<span class="literal">'base_href'</span>], url);
-
- <span class="comment">// If anchor and path is the same page</span>
- <span class="reserved">if</span> (urlParts[<span class="literal">'anchor'</span>] && urlParts[<span class="literal">'path'</span>] == baseUrlParts[<span class="literal">'path'</span>])
- <span class="reserved">return</span> <span class="literal">"#"</span> + urlParts[<span class="literal">'anchor'</span>];
- }
-
- <span class="comment">// Remove current domain</span>
- <span class="reserved">if</span> (tinyMCE.getParam(<span class="literal">'remove_script_host'</span>)) {
- var start = <span class="literal">""</span>, portPart = <span class="literal">""</span>;
-
- <span class="reserved">if</span> (port != <span class="literal">""</span>)
- portPart = <span class="literal">":"</span> + port;
-
- start = prot + <span class="literal">"//"</span> + host + portPart + <span class="literal">"/"</span>;
-
- <span class="reserved">if</span> (url.indexOf(start) == 0)
- url = url.substring(start.length-1);
- }
-
- <span class="reserved">return</span> url;
-};
-
-<span class="comment">/**
- * Converts all img and a element URLs to absolute URLs. This will use the mce_src or mce_href attribute values
- * if they are provided. This function is used when the editor is initialized.
- *
- * <span class="attrib">@param</span> {HTMLElement} body HTML element to convert all URLs in.
- */</span>
-TinyMCE_Engine.<span class="reserved">prototype</span>.convertAllRelativeURLs = <span class="reserved">function</span>(body) {
- <span class="comment">// Convert all image URL:s to absolute URL</span>
- var elms = body.getElementsByTagName(<span class="literal">"img"</span>);
- <span class="reserved">for</span> (var i=0; i<elms.length; i++) {
- var src = tinyMCE.getAttrib(elms[i], <span class="literal">'src'</span>);
-
- var msrc = tinyMCE.getAttrib(elms[i], <span class="literal">'mce_src'</span>);
- <span class="reserved">if</span> (msrc != <span class="literal">""</span>)
- src = msrc;
-
- <span class="reserved">if</span> (src != <span class="literal">""</span>) {
- src = tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings[<span class="literal">'base_href'</span>], src);
- elms[i].setAttribute(<span class="literal">"src"</span>, src);
- }
- }
-
- <span class="comment">// Convert all link URL:s to absolute URL</span>
- var elms = body.getElementsByTagName(<span class="literal">"a"</span>);
- <span class="reserved">for</span> (var i=0; i<elms.length; i++) {
- var href = tinyMCE.getAttrib(elms[i], <span class="literal">'href'</span>);
-
- var mhref = tinyMCE.getAttrib(elms[i], <span class="literal">'mce_href'</span>);
- <span class="reserved">if</span> (mhref != <span class="literal">""</span>)
- href = mhref;
-
- <span class="reserved">if</span> (href && href != <span class="literal">""</span>) {
- href = tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings[<span class="literal">'base_href'</span>], href);
- elms[i].setAttribute(<span class="literal">"href"</span>, href);
- }
- }
-};
-</pre>
- <hr>
-
-
-
-<!-- ========== START OF NAVBAR ========== -->
-<a name="navbar_top"><!-- --></a>
-<table border="0" width="100%" cellpadding="1" cellspacing="0">
-<tr>
-<td colspan=2 bgcolor="#EEEEFF" class="NavBarCell1">
-<a name="navbar_top_firstrow"><!-- --></a>
-<table border="0" cellpadding="0" cellspacing="3">
- <tr align="center" valign="top">
-
-
- <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="overview-summary.html"><font class="NavBarFont1"><b>Overview</b></font></a> </td>
- <td bgcolor="#FFFFFF" class="NavBarCell1Rev"> <font class="NavBarFont1Rev"><b>File</b></font> </td>
-
-
- <td bgcolor="#FFFFFF" class="NavBarCell1"> <font class="NavBarFont1">Class</font> </td>
- <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="overview-tree.html"><font class="NavBarFont1"><b>Tree</b></font></a> </td>
- <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="index-all.html"--><font class="NavBarFont1"><b>Index</b></font></a> </td>
- <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="help-doc.html"><font class="NavBarFont1"><b>Help</b></font></a> </td>
- </tr>
-</table>
-</td>
-<td bgcolor="#EEEEFF" align="right" valign="top"><em>
-<b></b></em>
-</td>
-</tr>
-
-<tr>
-<td bgcolor="white" class="NavBarCell2"><font size="-2">
- PREV
- NEXT</font></td>
-<td bgcolor="white" class="NavBarCell2"><font size="-2">
- <a href="index.html" target="_top"><b>FRAMES</b></a>
- <a href="overview-summary.html" target="_top"><b>NO FRAMES</b></a>
-
-<script>
- <!--
- if(window==top) {
- document.writeln('<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>');
- }
- //-->
-</script>
-<noscript>
-<a href="allclasses-noframe.html" target=""><b>All Classes</b></a>
-</noscript>
-</font></td>
-</tr>
-</table>
-<!-- =========== END OF NAVBAR =========== -->
-
-<hr>
-<font size="-1">
-
-</font>
-<div class="jsdoc_ctime">Documentation generated by <a href="http://jsdoc.sourceforge.net/" target="_parent">JSDoc</a> on Fri Apr 14 21:59:23 2006</div>
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/tinymce_api/overview-summary-TinyMCE_URL.class.js.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/tinymce_api/overview-summary-TinyMCE_URL.class.js.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/tinymce_api/overview-summary-TinyMCE_URL.class.js.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/tinymce_api/overview-summary-TinyMCE_URL.class.js.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,530 @@
+<!doctype html public "-//W3C//DTD HTML 4.0 Frameset//EN""http://www.w3.org/TR/REC-html40/frameset.dtd">
+<html>
+<head>
+<title>
+ Overview
+</title>
+<link rel ="stylesheet" type="text/css" href="stylesheet.css" title="Style">
+<script>
+function asd() {
+
+ parent.document.title="TinyMCE_URL.class.js Overview";
+
+}
+</script>
+</head>
+<body bgcolor="white" onload="asd();">
+
+<!-- ========== START OF NAVBAR ========== -->
+<a name="navbar_top"><!-- --></a>
+<table border="0" width="100%" cellpadding="1" cellspacing="0">
+<tr>
+<td colspan=2 bgcolor="#EEEEFF" class="NavBarCell1">
+<a name="navbar_top_firstrow"><!-- --></a>
+<table border="0" cellpadding="0" cellspacing="3">
+ <tr align="center" valign="top">
+
+
+ <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="overview-summary.html"><font class="NavBarFont1"><b>Overview</b></font></a> </td>
+ <td bgcolor="#FFFFFF" class="NavBarCell1Rev"> <font class="NavBarFont1Rev"><b>File</b></font> </td>
+
+
+ <td bgcolor="#FFFFFF" class="NavBarCell1"> <font class="NavBarFont1">Class</font> </td>
+ <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="overview-tree.html"><font class="NavBarFont1"><b>Tree</b></font></a> </td>
+ <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="index-all.html"--><font class="NavBarFont1"><b>Index</b></font></a> </td>
+ <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="help-doc.html"><font class="NavBarFont1"><b>Help</b></font></a> </td>
+ </tr>
+</table>
+</td>
+<td bgcolor="#EEEEFF" align="right" valign="top">
+<em>
+<b></b></em>
+</td>
+</tr>
+
+<tr>
+<td bgcolor="white" class="NavBarCell2"><font size="-2">
+ PREV
+ NEXT</font></td>
+<td bgcolor="white" class="NavBarCell2"><font size="-2">
+ <a href="index.html" target="_top"><b>FRAMES</b></a>
+ <a href="overview-summary.html" target="_top"><b>NO FRAMES</b></a>
+
+<script>
+ <!--
+ if(window==top) {
+ document.writeln('<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>');
+ }
+ //-->
+</script>
+<noscript>
+<a href="allclasses-noframe.html" target=""><b>All Classes</b></a>
+</noscript>
+</font></td>
+</tr>
+</table>
+<!-- =========== END OF NAVBAR =========== -->
+
+<hr>
+<center>
+
+ <h2>TinyMCE_URL.class.js</h2>
+
+</center>
+
+
+
+
+<h4>Summary</h4>
+<p>
+
+ No overview generated for 'TinyMCE_URL.class.js'<BR/><BR/>
+
+</p>
+
+<hr>
+
+
+
+<!-- ========== METHOD SUMMARY =========== -->
+
+<!-- ========== END METHOD SUMMARY =========== -->
+
+
+ <pre class="sourceview"><span class="comment">/**
+ * $RCSfile: overview-summary-TinyMCE_URL.class.js.html,v $
+ * $Revision: 1.42 $
+ * $Date: 2006/04/14 20:00:31 $
+ *
+ * <span class="attrib">@author</span> Moxiecode
+ * <span class="attrib">@copyright</span> Copyright © 2004-2006, Moxiecode Systems AB, All rights reserved.
+ *
+ * The contents of this file will be wrapped in a class later on.
+ */</span>
+
+<span class="comment">/**
+ * Parses a URL in to its diffrent components.
+ *
+ * <span class="attrib">@param</span> {string} url_str URL string to parse into a URL object.
+ * <span class="attrib">@return</span> URL object based on input string.
+ * <span class="attrib">@type</span> TinyMCE_URL_Item
+ */</span>
+TinyMCE_Engine.<span class="reserved">prototype</span>.parseURL = <span class="reserved">function</span>(url_str) {
+ var urlParts = new Array();
+
+ <span class="reserved">if</span> (url_str) {
+ var pos, lastPos;
+
+ <span class="comment">// Parse protocol part</span>
+ pos = url_str.indexOf(<span class="literal">'://'</span>);
+ <span class="reserved">if</span> (pos != -1) {
+ urlParts[<span class="literal">'protocol'</span>] = url_str.substring(0, pos);
+ lastPos = pos + 3;
+ }
+
+ <span class="comment">// Find port or path start</span>
+ <span class="reserved">for</span> (var i=lastPos; i<url_str.length; i++) {
+ var chr = url_str.charAt(i);
+
+ <span class="reserved">if</span> (chr == <span class="literal">':'</span>)
+ break;
+
+ <span class="reserved">if</span> (chr == <span class="literal">'/'</span>)
+ break;
+ }
+ pos = i;
+
+ <span class="comment">// Get host</span>
+ urlParts[<span class="literal">'host'</span>] = url_str.substring(lastPos, pos);
+
+ <span class="comment">// Get port</span>
+ urlParts[<span class="literal">'port'</span>] = <span class="literal">""</span>;
+ lastPos = pos;
+ <span class="reserved">if</span> (url_str.charAt(pos) == <span class="literal">':'</span>) {
+ pos = url_str.indexOf(<span class="literal">'/'</span>, lastPos);
+ urlParts[<span class="literal">'port'</span>] = url_str.substring(lastPos+1, pos);
+ }
+
+ <span class="comment">// Get path</span>
+ lastPos = pos;
+ pos = url_str.indexOf(<span class="literal">'?'</span>, lastPos);
+
+ <span class="reserved">if</span> (pos == -1)
+ pos = url_str.indexOf(<span class="literal">'#'</span>, lastPos);
+
+ <span class="reserved">if</span> (pos == -1)
+ pos = url_str.length;
+
+ urlParts[<span class="literal">'path'</span>] = url_str.substring(lastPos, pos);
+
+ <span class="comment">// Get query</span>
+ lastPos = pos;
+ <span class="reserved">if</span> (url_str.charAt(pos) == <span class="literal">'?'</span>) {
+ pos = url_str.indexOf(<span class="literal">'#'</span>);
+ pos = (pos == -1) ? url_str.length : pos;
+ urlParts[<span class="literal">'query'</span>] = url_str.substring(lastPos+1, pos);
+ }
+
+ <span class="comment">// Get anchor</span>
+ lastPos = pos;
+ <span class="reserved">if</span> (url_str.charAt(pos) == <span class="literal">'#'</span>) {
+ pos = url_str.length;
+ urlParts[<span class="literal">'anchor'</span>] = url_str.substring(lastPos+1, pos);
+ }
+ }
+
+ <span class="reserved">return</span> urlParts;
+};
+
+<span class="comment">/**
+ * Serializes the specified URL object into a string.
+ *
+ * <span class="attrib">@param</span> {TinyMCE_URL_Item} up URL object to serialize.
+ * <span class="attrib">@return</span> Serialized URL object.
+ * <span class="attrib">@type</span> string
+ */</span>
+TinyMCE_Engine.<span class="reserved">prototype</span>.serializeURL = <span class="reserved">function</span>(up) {
+ var o = <span class="literal">""</span>;
+
+ <span class="reserved">if</span> (up[<span class="literal">'protocol'</span>])
+ o += up[<span class="literal">'protocol'</span>] + <span class="literal">"://"</span>;
+
+ <span class="reserved">if</span> (up[<span class="literal">'host'</span>])
+ o += up[<span class="literal">'host'</span>];
+
+ <span class="reserved">if</span> (up[<span class="literal">'port'</span>])
+ o += <span class="literal">":"</span> + up[<span class="literal">'port'</span>];
+
+ <span class="reserved">if</span> (up[<span class="literal">'path'</span>])
+ o += up[<span class="literal">'path'</span>];
+
+ <span class="reserved">if</span> (up[<span class="literal">'query'</span>])
+ o += <span class="literal">"?"</span> + up[<span class="literal">'query'</span>];
+
+ <span class="reserved">if</span> (up[<span class="literal">'anchor'</span>])
+ o += <span class="literal">"#"</span> + up[<span class="literal">'anchor'</span>];
+
+ <span class="reserved">return</span> o;
+};
+
+<span class="comment">/**
+ * Converts an absolute path to relative path.
+ *
+ * <span class="attrib">@param</span> {string} base_url URL to make as a base path, URLs will be converted relative from this point.
+ * <span class="attrib">@param</span> {string} url_to_relative URL to convert into a relative URL.
+ * <span class="attrib">@return</span> Relative URL based in input.
+ * <span class="attrib">@type</span> string
+ */</span>
+TinyMCE_Engine.<span class="reserved">prototype</span>.convertAbsoluteURLToRelativeURL = <span class="reserved">function</span>(base_url, url_to_relative) {
+ var baseURL = <span class="reserved">this</span>.parseURL(base_url);
+ var targetURL = <span class="reserved">this</span>.parseURL(url_to_relative);
+ var strTok1;
+ var strTok2;
+ var breakPoint = 0;
+ var outPath = <span class="literal">""</span>;
+ var forceSlash = false;
+
+ <span class="reserved">if</span> (targetURL.path == <span class="literal">""</span>)
+ targetURL.path = <span class="literal">"/"</span>;
+ <span class="reserved">else</span>
+ forceSlash = true;
+
+ <span class="comment">// Crop away last path part</span>
+ base_url = baseURL.path.substring(0, baseURL.path.lastIndexOf(<span class="literal">'/'</span>));
+ strTok1 = base_url.split(<span class="literal">'/'</span>);
+ strTok2 = targetURL.path.split(<span class="literal">'/'</span>);
+
+ <span class="reserved">if</span> (strTok1.length >= strTok2.length) {
+ <span class="reserved">for</span> (var i=0; i<strTok1.length; i++) {
+ <span class="reserved">if</span> (i >= strTok2.length || strTok1[i] != strTok2[i]) {
+ breakPoint = i + 1;
+ break;
+ }
+ }
+ }
+
+ <span class="reserved">if</span> (strTok1.length < strTok2.length) {
+ <span class="reserved">for</span> (var i=0; i<strTok2.length; i++) {
+ <span class="reserved">if</span> (i >= strTok1.length || strTok1[i] != strTok2[i]) {
+ breakPoint = i + 1;
+ break;
+ }
+ }
+ }
+
+ <span class="reserved">if</span> (breakPoint == 1)
+ <span class="reserved">return</span> targetURL.path;
+
+ <span class="reserved">for</span> (var i=0; i<(strTok1.length-(breakPoint-1)); i++)
+ outPath += <span class="literal">"../"</span>;
+
+ <span class="reserved">for</span> (var i=breakPoint-1; i<strTok2.length; i++) {
+ <span class="reserved">if</span> (i != (breakPoint-1))
+ outPath += <span class="literal">"/"</span> + strTok2[i];
+ <span class="reserved">else</span>
+ outPath += strTok2[i];
+ }
+
+ targetURL.protocol = null;
+ targetURL.host = null;
+ targetURL.port = null;
+ targetURL.path = outPath == <span class="literal">""</span> && forceSlash ? <span class="literal">"/"</span> : outPath;
+
+ <span class="comment">// Remove document prefix from local anchors</span>
+ var fileName = baseURL.path;
+ var pos;
+
+ <span class="reserved">if</span> ((pos = fileName.lastIndexOf(<span class="literal">'/'</span>)) != -1)
+ fileName = fileName.substring(pos + 1);
+
+ <span class="comment">// Is local anchor</span>
+ <span class="reserved">if</span> (fileName == targetURL.path && targetURL.anchor != <span class="literal">""</span>)
+ targetURL.path = <span class="literal">""</span>;
+
+ <span class="comment">// If empty and not local anchor force filename or slash</span>
+ <span class="reserved">if</span> (targetURL.path == <span class="literal">""</span> && !targetURL.anchor)
+ targetURL.path = fileName != <span class="literal">""</span> ? fileName : <span class="literal">"/"</span>;
+
+ <span class="reserved">return</span> <span class="reserved">this</span>.serializeURL(targetURL);
+};
+
+<span class="comment">/**
+ * Converts an relative path to absolute path.
+ *
+ * <span class="attrib">@param</span> {string} base_url URL to make as a base path, URLs will be converted absolute from this point.
+ * <span class="attrib">@param</span> {string} relative_url URL to convert into a absolute URL.
+ * <span class="attrib">@return</span> Absolute URL based in input.
+ * <span class="attrib">@type</span> string
+ */</span>
+TinyMCE_Engine.<span class="reserved">prototype</span>.convertRelativeToAbsoluteURL = <span class="reserved">function</span>(base_url, relative_url) {
+ var baseURL = <span class="reserved">this</span>.parseURL(base_url);
+ var relURL = <span class="reserved">this</span>.parseURL(relative_url);
+
+ <span class="reserved">if</span> (relative_url == <span class="literal">""</span> || relative_url.charAt(0) == <span class="literal">'/'</span> || relative_url.indexOf(<span class="literal">'://'</span>) != -1 || relative_url.indexOf(<span class="literal">'mailto:'</span>) != -1 || relative_url.indexOf(<span class="literal">'javascript:'</span>) != -1)
+ <span class="reserved">return</span> relative_url;
+
+ <span class="comment">// Split parts</span>
+ baseURLParts = baseURL[<span class="literal">'path'</span>].split(<span class="literal">'/'</span>);
+ relURLParts = relURL[<span class="literal">'path'</span>].split(<span class="literal">'/'</span>);
+
+ <span class="comment">// Remove empty chunks</span>
+ var newBaseURLParts = new Array();
+ <span class="reserved">for</span> (var i=baseURLParts.length-1; i>=0; i--) {
+ <span class="reserved">if</span> (baseURLParts[i].length == 0)
+ continue;
+
+ newBaseURLParts[newBaseURLParts.length] = baseURLParts[i];
+ }
+ baseURLParts = newBaseURLParts.reverse();
+
+ <span class="comment">// Merge relURLParts chunks</span>
+ var newRelURLParts = new Array();
+ var numBack = 0;
+ <span class="reserved">for</span> (var i=relURLParts.length-1; i>=0; i--) {
+ <span class="reserved">if</span> (relURLParts[i].length == 0 || relURLParts[i] == <span class="literal">"."</span>)
+ continue;
+
+ <span class="reserved">if</span> (relURLParts[i] == <span class="literal">'..'</span>) {
+ numBack++;
+ continue;
+ }
+
+ <span class="reserved">if</span> (numBack > 0) {
+ numBack--;
+ continue;
+ }
+
+ newRelURLParts[newRelURLParts.length] = relURLParts[i];
+ }
+
+ relURLParts = newRelURLParts.reverse();
+
+ <span class="comment">// Remove end from absolute path</span>
+ var len = baseURLParts.length-numBack;
+ var absPath = (len <= 0 ? <span class="literal">""</span> : <span class="literal">"/"</span>) + baseURLParts.slice(0, len).join(<span class="literal">'/'</span>) + <span class="literal">"/"</span> + relURLParts.join(<span class="literal">'/'</span>);
+ var start = <span class="literal">""</span>, end = <span class="literal">""</span>;
+
+ <span class="comment">// Build output URL</span>
+ relURL.protocol = baseURL.protocol;
+ relURL.host = baseURL.host;
+ relURL.port = baseURL.port;
+
+ <span class="comment">// Re-add trailing slash if it's removed</span>
+ <span class="reserved">if</span> (relURL.path.charAt(relURL.path.length-1) == <span class="literal">"/"</span>)
+ absPath += <span class="literal">"/"</span>;
+
+ relURL.path = absPath;
+
+ <span class="reserved">return</span> <span class="reserved">this</span>.serializeURL(relURL);
+};
+
+<span class="comment">/**
+ * Converts the specified URL based in TinyMCE configuration settings.
+ *
+ * <span class="attrib">@param</span> {string} url URL to convert based on config.
+ * <span class="attrib">@param</span> {HTMLElement} node HTML element that holds the URL.
+ * <span class="attrib">@param</span> {boolean} on_save Is this convertion the final output URL.
+ * <span class="attrib">@return</span> Converted URL string.
+ * <span class="attrib">@type</span> string
+ */</span>
+TinyMCE_Engine.<span class="reserved">prototype</span>.convertURL = <span class="reserved">function</span>(url, node, on_save) {
+ var prot = document.location.protocol;
+ var host = document.location.hostname;
+ var port = document.location.port;
+
+ <span class="comment">// Pass through file protocol</span>
+ <span class="reserved">if</span> (prot == <span class="literal">"file:"</span>)
+ <span class="reserved">return</span> url;
+
+ <span class="comment">// Something is wrong, remove weirdness</span>
+ url = tinyMCE.regexpReplace(url, <span class="literal">'(http|https):///'</span>, <span class="literal">'/'</span>);
+
+ <span class="comment">// Mailto link or anchor (Pass through)</span>
+ <span class="reserved">if</span> (url.indexOf(<span class="literal">'mailto:'</span>) != -1 || url.indexOf(<span class="literal">'javascript:'</span>) != -1 || tinyMCE.regexpReplace(url,<span class="literal">'[ \t\r\n\+]|%20'</span>,<span class="literal">''</span>).charAt(0) == <span class="literal">"#"</span>)
+ <span class="reserved">return</span> url;
+
+ <span class="comment">// Fix relative/Mozilla</span>
+ <span class="reserved">if</span> (!tinyMCE.isMSIE && !on_save && url.indexOf(<span class="literal">"://"</span>) == -1 && url.charAt(0) != <span class="literal">'/'</span>)
+ <span class="reserved">return</span> tinyMCE.settings[<span class="literal">'base_href'</span>] + url;
+
+ <span class="comment">// Handle relative URLs</span>
+ <span class="reserved">if</span> (on_save && tinyMCE.getParam(<span class="literal">'relative_urls'</span>)) {
+ var curl = tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings[<span class="literal">'base_href'</span>], url);
+ <span class="reserved">if</span> (curl.charAt(0) == <span class="literal">'/'</span>)
+ curl = tinyMCE.settings[<span class="literal">'document_base_prefix'</span>] + curl;
+
+ var urlParts = tinyMCE.parseURL(curl);
+ var tmpUrlParts = tinyMCE.parseURL(tinyMCE.settings[<span class="literal">'document_base_url'</span>]);
+
+ <span class="comment">// Force relative</span>
+ <span class="reserved">if</span> (urlParts[<span class="literal">'host'</span>] == tmpUrlParts[<span class="literal">'host'</span>] && (urlParts[<span class="literal">'port'</span>] == tmpUrlParts[<span class="literal">'port'</span>]))
+ <span class="reserved">return</span> tinyMCE.convertAbsoluteURLToRelativeURL(tinyMCE.settings[<span class="literal">'document_base_url'</span>], curl);
+ }
+
+ <span class="comment">// Handle absolute URLs</span>
+ <span class="reserved">if</span> (!tinyMCE.getParam(<span class="literal">'relative_urls'</span>)) {
+ var urlParts = tinyMCE.parseURL(url);
+ var baseUrlParts = tinyMCE.parseURL(tinyMCE.settings[<span class="literal">'base_href'</span>]);
+
+ <span class="comment">// Force absolute URLs from relative URLs</span>
+ url = tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings[<span class="literal">'base_href'</span>], url);
+
+ <span class="comment">// If anchor and path is the same page</span>
+ <span class="reserved">if</span> (urlParts[<span class="literal">'anchor'</span>] && urlParts[<span class="literal">'path'</span>] == baseUrlParts[<span class="literal">'path'</span>])
+ <span class="reserved">return</span> <span class="literal">"#"</span> + urlParts[<span class="literal">'anchor'</span>];
+ }
+
+ <span class="comment">// Remove current domain</span>
+ <span class="reserved">if</span> (tinyMCE.getParam(<span class="literal">'remove_script_host'</span>)) {
+ var start = <span class="literal">""</span>, portPart = <span class="literal">""</span>;
+
+ <span class="reserved">if</span> (port != <span class="literal">""</span>)
+ portPart = <span class="literal">":"</span> + port;
+
+ start = prot + <span class="literal">"//"</span> + host + portPart + <span class="literal">"/"</span>;
+
+ <span class="reserved">if</span> (url.indexOf(start) == 0)
+ url = url.substring(start.length-1);
+ }
+
+ <span class="reserved">return</span> url;
+};
+
+<span class="comment">/**
+ * Converts all img and a element URLs to absolute URLs. This will use the mce_src or mce_href attribute values
+ * if they are provided. This function is used when the editor is initialized.
+ *
+ * <span class="attrib">@param</span> {HTMLElement} body HTML element to convert all URLs in.
+ */</span>
+TinyMCE_Engine.<span class="reserved">prototype</span>.convertAllRelativeURLs = <span class="reserved">function</span>(body) {
+ <span class="comment">// Convert all image URL:s to absolute URL</span>
+ var elms = body.getElementsByTagName(<span class="literal">"img"</span>);
+ <span class="reserved">for</span> (var i=0; i<elms.length; i++) {
+ var src = tinyMCE.getAttrib(elms[i], <span class="literal">'src'</span>);
+
+ var msrc = tinyMCE.getAttrib(elms[i], <span class="literal">'mce_src'</span>);
+ <span class="reserved">if</span> (msrc != <span class="literal">""</span>)
+ src = msrc;
+
+ <span class="reserved">if</span> (src != <span class="literal">""</span>) {
+ src = tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings[<span class="literal">'base_href'</span>], src);
+ elms[i].setAttribute(<span class="literal">"src"</span>, src);
+ }
+ }
+
+ <span class="comment">// Convert all link URL:s to absolute URL</span>
+ var elms = body.getElementsByTagName(<span class="literal">"a"</span>);
+ <span class="reserved">for</span> (var i=0; i<elms.length; i++) {
+ var href = tinyMCE.getAttrib(elms[i], <span class="literal">'href'</span>);
+
+ var mhref = tinyMCE.getAttrib(elms[i], <span class="literal">'mce_href'</span>);
+ <span class="reserved">if</span> (mhref != <span class="literal">""</span>)
+ href = mhref;
+
+ <span class="reserved">if</span> (href && href != <span class="literal">""</span>) {
+ href = tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings[<span class="literal">'base_href'</span>], href);
+ elms[i].setAttribute(<span class="literal">"href"</span>, href);
+ }
+ }
+};
+</pre>
+ <hr>
+
+
+
+<!-- ========== START OF NAVBAR ========== -->
+<a name="navbar_top"><!-- --></a>
+<table border="0" width="100%" cellpadding="1" cellspacing="0">
+<tr>
+<td colspan=2 bgcolor="#EEEEFF" class="NavBarCell1">
+<a name="navbar_top_firstrow"><!-- --></a>
+<table border="0" cellpadding="0" cellspacing="3">
+ <tr align="center" valign="top">
+
+
+ <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="overview-summary.html"><font class="NavBarFont1"><b>Overview</b></font></a> </td>
+ <td bgcolor="#FFFFFF" class="NavBarCell1Rev"> <font class="NavBarFont1Rev"><b>File</b></font> </td>
+
+
+ <td bgcolor="#FFFFFF" class="NavBarCell1"> <font class="NavBarFont1">Class</font> </td>
+ <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="overview-tree.html"><font class="NavBarFont1"><b>Tree</b></font></a> </td>
+ <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="index-all.html"--><font class="NavBarFont1"><b>Index</b></font></a> </td>
+ <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="help-doc.html"><font class="NavBarFont1"><b>Help</b></font></a> </td>
+ </tr>
+</table>
+</td>
+<td bgcolor="#EEEEFF" align="right" valign="top"><em>
+<b></b></em>
+</td>
+</tr>
+
+<tr>
+<td bgcolor="white" class="NavBarCell2"><font size="-2">
+ PREV
+ NEXT</font></td>
+<td bgcolor="white" class="NavBarCell2"><font size="-2">
+ <a href="index.html" target="_top"><b>FRAMES</b></a>
+ <a href="overview-summary.html" target="_top"><b>NO FRAMES</b></a>
+
+<script>
+ <!--
+ if(window==top) {
+ document.writeln('<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>');
+ }
+ //-->
+</script>
+<noscript>
+<a href="allclasses-noframe.html" target=""><b>All Classes</b></a>
+</noscript>
+</font></td>
+</tr>
+</table>
+<!-- =========== END OF NAVBAR =========== -->
+
+<hr>
+<font size="-1">
+
+</font>
+<div class="jsdoc_ctime">Documentation generated by <a href="http://jsdoc.sourceforge.net/" target="_parent">JSDoc</a> on Fri Apr 14 21:59:23 2006</div>
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/tinymce_api/overview-summary-TinyMCE_UndoRedo.class.js.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/tinymce_api/overview-summary-TinyMCE_UndoRedo.class.js.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/tinymce_api/overview-summary-TinyMCE_UndoRedo.class.js.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,296 +0,0 @@
-<!doctype html public "-//W3C//DTD HTML 4.0 Frameset//EN""http://www.w3.org/TR/REC-html40/frameset.dtd">
-<html>
-<head>
-<title>
- Overview
-</title>
-<link rel ="stylesheet" type="text/css" href="stylesheet.css" title="Style">
-<script>
-function asd() {
-
- parent.document.title="TinyMCE_UndoRedo.class.js Overview";
-
-}
-</script>
-</head>
-<body bgcolor="white" onload="asd();">
-
-<!-- ========== START OF NAVBAR ========== -->
-<a name="navbar_top"><!-- --></a>
-<table border="0" width="100%" cellpadding="1" cellspacing="0">
-<tr>
-<td colspan=2 bgcolor="#EEEEFF" class="NavBarCell1">
-<a name="navbar_top_firstrow"><!-- --></a>
-<table border="0" cellpadding="0" cellspacing="3">
- <tr align="center" valign="top">
-
-
- <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="overview-summary.html"><font class="NavBarFont1"><b>Overview</b></font></a> </td>
- <td bgcolor="#FFFFFF" class="NavBarCell1Rev"> <font class="NavBarFont1Rev"><b>File</b></font> </td>
-
-
- <td bgcolor="#FFFFFF" class="NavBarCell1"> <font class="NavBarFont1">Class</font> </td>
- <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="overview-tree.html"><font class="NavBarFont1"><b>Tree</b></font></a> </td>
- <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="index-all.html"--><font class="NavBarFont1"><b>Index</b></font></a> </td>
- <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="help-doc.html"><font class="NavBarFont1"><b>Help</b></font></a> </td>
- </tr>
-</table>
-</td>
-<td bgcolor="#EEEEFF" align="right" valign="top">
-<em>
-<b></b></em>
-</td>
-</tr>
-
-<tr>
-<td bgcolor="white" class="NavBarCell2"><font size="-2">
- PREV
- NEXT</font></td>
-<td bgcolor="white" class="NavBarCell2"><font size="-2">
- <a href="index.html" target="_top"><b>FRAMES</b></a>
- <a href="overview-summary.html" target="_top"><b>NO FRAMES</b></a>
-
-<script>
- <!--
- if(window==top) {
- document.writeln('<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>');
- }
- //-->
-</script>
-<noscript>
-<a href="allclasses-noframe.html" target=""><b>All Classes</b></a>
-</noscript>
-</font></td>
-</tr>
-</table>
-<!-- =========== END OF NAVBAR =========== -->
-
-<hr>
-<center>
-
- <h2>TinyMCE_UndoRedo.class.js</h2>
-
-</center>
-
-
-
-
-<h4>Summary</h4>
-<p>
-
- No overview generated for 'TinyMCE_UndoRedo.class.js'<BR/><BR/>
-
-</p>
-
-<hr>
-
-
- <table border="1" cellpadding="3" cellspacing="0" width="100%">
- <tr bgcolor="#CCCCFF" class="TableHeadingColor">
- <td colspan=2><font size="+2">
-
- <b>Class Summary</b>
-
- </font></td>
- </tr>
-
- <tr bgcolor="white" class="TableRowColor">
- <td width="15%"><b><a href="TinyMCE_UndoRedo.html">TinyMCE_UndoRedo</a></b></td>
- <td> </td>
- </tr>
-
- </table>
- <hr/>
-
-
-<!-- ========== METHOD SUMMARY =========== -->
-
-<!-- ========== END METHOD SUMMARY =========== -->
-
-
- <pre class="sourceview"><span class="comment">/**
- * $RCSfile: overview-summary-TinyMCE_UndoRedo.class.js.html,v $
- * $Revision: 1.42 $
- * $Date: 2006/04/14 20:00:31 $
- *
- * <span class="attrib">@author</span> Moxiecode
- * <span class="attrib">@copyright</span> Copyright © 2004-2006, Moxiecode Systems AB, All rights reserved.
- */</span>
-
-<span class="comment">/**
- * Constructs a undo redo instance, this instance handles the custom undo/redo handeling in TinyMCE.
- *
- * <span class="attrib">@param</span> {TinyMCE_Control} inst TinyMCE editor control instance.
- * <span class="attrib">@constructor</span>
- */</span>
-<span class="reserved">function</span> TinyMCE_UndoRedo(inst) {
- <span class="reserved">this</span>.instance = inst;
- <span class="reserved">this</span>.undoLevels = new Array();
- <span class="reserved">this</span>.undoIndex = 0;
- <span class="reserved">this</span>.typingUndoIndex = -1;
- <span class="reserved">this</span>.undoRedo = true;
-};
-
-TinyMCE_UndoRedo.<span class="reserved">prototype</span> = {
- <span class="comment">/**
- * Adds a new undo level, this will take a snapshot of the current instance HTML or use the specified level.
- *
- * <span class="attrib">@param</span> {TinyMCE_UndoRedoLevel} l Optional undo/redo level to add.
- * <span class="attrib">@return</span> true/false on success or failure.
- * <span class="attrib">@type</span> boolean
- */</span>
- add : <span class="reserved">function</span>(l) {
- var b;
-
- <span class="reserved">if</span> (l) {
- <span class="reserved">this</span>.undoLevels[<span class="reserved">this</span>.undoLevels.length] = l;
- <span class="reserved">return</span> true;
- }
-
- var inst = <span class="reserved">this</span>.instance;
-
- <span class="reserved">if</span> (<span class="reserved">this</span>.typingUndoIndex != -1) {
- <span class="reserved">this</span>.undoIndex = <span class="reserved">this</span>.typingUndoIndex;
- <span class="comment">// tinyMCE.debug("Override: " + this.undoIndex);</span>
- }
-
- var newHTML = tinyMCE.trim(inst.getBody().innerHTML);
- <span class="reserved">if</span> (<span class="reserved">this</span>.undoLevels[<span class="reserved">this</span>.undoIndex] && newHTML != <span class="reserved">this</span>.undoLevels[<span class="reserved">this</span>.undoIndex].content) {
- <span class="comment">//tinyMCE.debug(newHTML, this.undoLevels[this.undoIndex]);</span>
-
- tinyMCE.dispatchCallback(inst, <span class="literal">'onchange_callback'</span>, <span class="literal">'onChange'</span>, inst);
-
- <span class="comment">// Time to compress</span>
- var customUndoLevels = tinyMCE.settings[<span class="literal">'custom_undo_redo_levels'</span>];
- <span class="reserved">if</span> (customUndoLevels != -1 && <span class="reserved">this</span>.undoLevels.length > customUndoLevels) {
- <span class="reserved">for</span> (var i=0; i<<span class="reserved">this</span>.undoLevels.length-1; i++) {
- <span class="comment">//tinyMCE.debug(this.undoLevels[i] + "=" + this.undoLevels[i+1]);</span>
- <span class="reserved">this</span>.undoLevels[i] = <span class="reserved">this</span>.undoLevels[i+1];
- }
-
- <span class="reserved">this</span>.undoLevels.length--;
- <span class="reserved">this</span>.undoIndex--;
- }
-
- b = inst.undoBookmark;
- <span class="reserved">if</span> (!b)
- b = inst.selection.getBookmark();
-
- <span class="reserved">this</span>.undoIndex++;
- <span class="reserved">this</span>.undoLevels[<span class="reserved">this</span>.undoIndex] = {
- content : newHTML,
- bookmark : b
- };
-
- <span class="reserved">this</span>.undoLevels.length = <span class="reserved">this</span>.undoIndex + 1;
-
- <span class="comment">//tinyMCE.debug("level added" + this.undoIndex);</span>
- <span class="reserved">return</span> true;
-
- <span class="comment">// tinyMCE.debug(this.undoIndex + "," + (this.undoLevels.length-1));</span>
- }
-
- <span class="reserved">return</span> false;
- },
-
- <span class="comment">/**
- * Performes a undo action, this will restore the HTML contents of the editor to a former state.
- */</span>
- undo : <span class="reserved">function</span>() {
- var inst = <span class="reserved">this</span>.instance;
-
- <span class="comment">// Do undo</span>
- <span class="reserved">if</span> (<span class="reserved">this</span>.undoIndex > 0) {
- <span class="reserved">this</span>.undoIndex--;
- tinyMCE.setInnerHTML(inst.getBody(), <span class="reserved">this</span>.undoLevels[<span class="reserved">this</span>.undoIndex].content);
- inst.repaint();
- <span class="reserved">if</span> (inst.settings.custom_undo_redo_restore_selection)
- inst.selection.moveToBookmark(<span class="reserved">this</span>.undoLevels[<span class="reserved">this</span>.undoIndex].bookmark);
- }
-
- <span class="comment">// tinyMCE.debug("Undo - undo levels:" + this.undoLevels.length + ", undo index: " + this.undoIndex);</span>
- },
-
- <span class="comment">/**
- * Performes a undo action, this will restore the HTML contents of the editor to a former undoed state.
- */</span>
- redo : <span class="reserved">function</span>() {
- var inst = <span class="reserved">this</span>.instance;
-
- tinyMCE.execCommand(<span class="literal">"mceEndTyping"</span>);
-
- <span class="reserved">if</span> (<span class="reserved">this</span>.undoIndex < (<span class="reserved">this</span>.undoLevels.length-1)) {
- <span class="reserved">this</span>.undoIndex++;
- tinyMCE.setInnerHTML(inst.getBody(), <span class="reserved">this</span>.undoLevels[<span class="reserved">this</span>.undoIndex].content);
- inst.repaint();
-<span class="comment">// if (this.undoIndex > 0)</span>
-<span class="comment">// inst.selection.moveToBookmark(this.undoLevels[this.undoIndex-1].bookmark);</span>
- <span class="reserved">if</span> (inst.settings.custom_undo_redo_restore_selection)
- inst.selection.moveToBookmark(<span class="reserved">this</span>.undoLevels[<span class="reserved">this</span>.undoIndex].bookmark);
- <span class="comment">// tinyMCE.debug("Redo - undo levels:" + this.undoLevels.length + ", undo index: " + this.undoIndex);</span>
- }
-
- tinyMCE.triggerNodeChange();
- }
-};
-</pre>
- <hr>
-
-
-
-<!-- ========== START OF NAVBAR ========== -->
-<a name="navbar_top"><!-- --></a>
-<table border="0" width="100%" cellpadding="1" cellspacing="0">
-<tr>
-<td colspan=2 bgcolor="#EEEEFF" class="NavBarCell1">
-<a name="navbar_top_firstrow"><!-- --></a>
-<table border="0" cellpadding="0" cellspacing="3">
- <tr align="center" valign="top">
-
-
- <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="overview-summary.html"><font class="NavBarFont1"><b>Overview</b></font></a> </td>
- <td bgcolor="#FFFFFF" class="NavBarCell1Rev"> <font class="NavBarFont1Rev"><b>File</b></font> </td>
-
-
- <td bgcolor="#FFFFFF" class="NavBarCell1"> <font class="NavBarFont1">Class</font> </td>
- <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="overview-tree.html"><font class="NavBarFont1"><b>Tree</b></font></a> </td>
- <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="index-all.html"--><font class="NavBarFont1"><b>Index</b></font></a> </td>
- <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="help-doc.html"><font class="NavBarFont1"><b>Help</b></font></a> </td>
- </tr>
-</table>
-</td>
-<td bgcolor="#EEEEFF" align="right" valign="top"><em>
-<b></b></em>
-</td>
-</tr>
-
-<tr>
-<td bgcolor="white" class="NavBarCell2"><font size="-2">
- PREV
- NEXT</font></td>
-<td bgcolor="white" class="NavBarCell2"><font size="-2">
- <a href="index.html" target="_top"><b>FRAMES</b></a>
- <a href="overview-summary.html" target="_top"><b>NO FRAMES</b></a>
-
-<script>
- <!--
- if(window==top) {
- document.writeln('<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>');
- }
- //-->
-</script>
-<noscript>
-<a href="allclasses-noframe.html" target=""><b>All Classes</b></a>
-</noscript>
-</font></td>
-</tr>
-</table>
-<!-- =========== END OF NAVBAR =========== -->
-
-<hr>
-<font size="-1">
-
-</font>
-<div class="jsdoc_ctime">Documentation generated by <a href="http://jsdoc.sourceforge.net/" target="_parent">JSDoc</a> on Fri Apr 14 21:59:23 2006</div>
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/tinymce_api/overview-summary-TinyMCE_UndoRedo.class.js.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/tinymce_api/overview-summary-TinyMCE_UndoRedo.class.js.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/tinymce_api/overview-summary-TinyMCE_UndoRedo.class.js.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/tinymce_api/overview-summary-TinyMCE_UndoRedo.class.js.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,296 @@
+<!doctype html public "-//W3C//DTD HTML 4.0 Frameset//EN""http://www.w3.org/TR/REC-html40/frameset.dtd">
+<html>
+<head>
+<title>
+ Overview
+</title>
+<link rel ="stylesheet" type="text/css" href="stylesheet.css" title="Style">
+<script>
+function asd() {
+
+ parent.document.title="TinyMCE_UndoRedo.class.js Overview";
+
+}
+</script>
+</head>
+<body bgcolor="white" onload="asd();">
+
+<!-- ========== START OF NAVBAR ========== -->
+<a name="navbar_top"><!-- --></a>
+<table border="0" width="100%" cellpadding="1" cellspacing="0">
+<tr>
+<td colspan=2 bgcolor="#EEEEFF" class="NavBarCell1">
+<a name="navbar_top_firstrow"><!-- --></a>
+<table border="0" cellpadding="0" cellspacing="3">
+ <tr align="center" valign="top">
+
+
+ <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="overview-summary.html"><font class="NavBarFont1"><b>Overview</b></font></a> </td>
+ <td bgcolor="#FFFFFF" class="NavBarCell1Rev"> <font class="NavBarFont1Rev"><b>File</b></font> </td>
+
+
+ <td bgcolor="#FFFFFF" class="NavBarCell1"> <font class="NavBarFont1">Class</font> </td>
+ <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="overview-tree.html"><font class="NavBarFont1"><b>Tree</b></font></a> </td>
+ <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="index-all.html"--><font class="NavBarFont1"><b>Index</b></font></a> </td>
+ <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="help-doc.html"><font class="NavBarFont1"><b>Help</b></font></a> </td>
+ </tr>
+</table>
+</td>
+<td bgcolor="#EEEEFF" align="right" valign="top">
+<em>
+<b></b></em>
+</td>
+</tr>
+
+<tr>
+<td bgcolor="white" class="NavBarCell2"><font size="-2">
+ PREV
+ NEXT</font></td>
+<td bgcolor="white" class="NavBarCell2"><font size="-2">
+ <a href="index.html" target="_top"><b>FRAMES</b></a>
+ <a href="overview-summary.html" target="_top"><b>NO FRAMES</b></a>
+
+<script>
+ <!--
+ if(window==top) {
+ document.writeln('<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>');
+ }
+ //-->
+</script>
+<noscript>
+<a href="allclasses-noframe.html" target=""><b>All Classes</b></a>
+</noscript>
+</font></td>
+</tr>
+</table>
+<!-- =========== END OF NAVBAR =========== -->
+
+<hr>
+<center>
+
+ <h2>TinyMCE_UndoRedo.class.js</h2>
+
+</center>
+
+
+
+
+<h4>Summary</h4>
+<p>
+
+ No overview generated for 'TinyMCE_UndoRedo.class.js'<BR/><BR/>
+
+</p>
+
+<hr>
+
+
+ <table border="1" cellpadding="3" cellspacing="0" width="100%">
+ <tr bgcolor="#CCCCFF" class="TableHeadingColor">
+ <td colspan=2><font size="+2">
+
+ <b>Class Summary</b>
+
+ </font></td>
+ </tr>
+
+ <tr bgcolor="white" class="TableRowColor">
+ <td width="15%"><b><a href="TinyMCE_UndoRedo.html">TinyMCE_UndoRedo</a></b></td>
+ <td> </td>
+ </tr>
+
+ </table>
+ <hr/>
+
+
+<!-- ========== METHOD SUMMARY =========== -->
+
+<!-- ========== END METHOD SUMMARY =========== -->
+
+
+ <pre class="sourceview"><span class="comment">/**
+ * $RCSfile: overview-summary-TinyMCE_UndoRedo.class.js.html,v $
+ * $Revision: 1.42 $
+ * $Date: 2006/04/14 20:00:31 $
+ *
+ * <span class="attrib">@author</span> Moxiecode
+ * <span class="attrib">@copyright</span> Copyright © 2004-2006, Moxiecode Systems AB, All rights reserved.
+ */</span>
+
+<span class="comment">/**
+ * Constructs a undo redo instance, this instance handles the custom undo/redo handeling in TinyMCE.
+ *
+ * <span class="attrib">@param</span> {TinyMCE_Control} inst TinyMCE editor control instance.
+ * <span class="attrib">@constructor</span>
+ */</span>
+<span class="reserved">function</span> TinyMCE_UndoRedo(inst) {
+ <span class="reserved">this</span>.instance = inst;
+ <span class="reserved">this</span>.undoLevels = new Array();
+ <span class="reserved">this</span>.undoIndex = 0;
+ <span class="reserved">this</span>.typingUndoIndex = -1;
+ <span class="reserved">this</span>.undoRedo = true;
+};
+
+TinyMCE_UndoRedo.<span class="reserved">prototype</span> = {
+ <span class="comment">/**
+ * Adds a new undo level, this will take a snapshot of the current instance HTML or use the specified level.
+ *
+ * <span class="attrib">@param</span> {TinyMCE_UndoRedoLevel} l Optional undo/redo level to add.
+ * <span class="attrib">@return</span> true/false on success or failure.
+ * <span class="attrib">@type</span> boolean
+ */</span>
+ add : <span class="reserved">function</span>(l) {
+ var b;
+
+ <span class="reserved">if</span> (l) {
+ <span class="reserved">this</span>.undoLevels[<span class="reserved">this</span>.undoLevels.length] = l;
+ <span class="reserved">return</span> true;
+ }
+
+ var inst = <span class="reserved">this</span>.instance;
+
+ <span class="reserved">if</span> (<span class="reserved">this</span>.typingUndoIndex != -1) {
+ <span class="reserved">this</span>.undoIndex = <span class="reserved">this</span>.typingUndoIndex;
+ <span class="comment">// tinyMCE.debug("Override: " + this.undoIndex);</span>
+ }
+
+ var newHTML = tinyMCE.trim(inst.getBody().innerHTML);
+ <span class="reserved">if</span> (<span class="reserved">this</span>.undoLevels[<span class="reserved">this</span>.undoIndex] && newHTML != <span class="reserved">this</span>.undoLevels[<span class="reserved">this</span>.undoIndex].content) {
+ <span class="comment">//tinyMCE.debug(newHTML, this.undoLevels[this.undoIndex]);</span>
+
+ tinyMCE.dispatchCallback(inst, <span class="literal">'onchange_callback'</span>, <span class="literal">'onChange'</span>, inst);
+
+ <span class="comment">// Time to compress</span>
+ var customUndoLevels = tinyMCE.settings[<span class="literal">'custom_undo_redo_levels'</span>];
+ <span class="reserved">if</span> (customUndoLevels != -1 && <span class="reserved">this</span>.undoLevels.length > customUndoLevels) {
+ <span class="reserved">for</span> (var i=0; i<<span class="reserved">this</span>.undoLevels.length-1; i++) {
+ <span class="comment">//tinyMCE.debug(this.undoLevels[i] + "=" + this.undoLevels[i+1]);</span>
+ <span class="reserved">this</span>.undoLevels[i] = <span class="reserved">this</span>.undoLevels[i+1];
+ }
+
+ <span class="reserved">this</span>.undoLevels.length--;
+ <span class="reserved">this</span>.undoIndex--;
+ }
+
+ b = inst.undoBookmark;
+ <span class="reserved">if</span> (!b)
+ b = inst.selection.getBookmark();
+
+ <span class="reserved">this</span>.undoIndex++;
+ <span class="reserved">this</span>.undoLevels[<span class="reserved">this</span>.undoIndex] = {
+ content : newHTML,
+ bookmark : b
+ };
+
+ <span class="reserved">this</span>.undoLevels.length = <span class="reserved">this</span>.undoIndex + 1;
+
+ <span class="comment">//tinyMCE.debug("level added" + this.undoIndex);</span>
+ <span class="reserved">return</span> true;
+
+ <span class="comment">// tinyMCE.debug(this.undoIndex + "," + (this.undoLevels.length-1));</span>
+ }
+
+ <span class="reserved">return</span> false;
+ },
+
+ <span class="comment">/**
+ * Performes a undo action, this will restore the HTML contents of the editor to a former state.
+ */</span>
+ undo : <span class="reserved">function</span>() {
+ var inst = <span class="reserved">this</span>.instance;
+
+ <span class="comment">// Do undo</span>
+ <span class="reserved">if</span> (<span class="reserved">this</span>.undoIndex > 0) {
+ <span class="reserved">this</span>.undoIndex--;
+ tinyMCE.setInnerHTML(inst.getBody(), <span class="reserved">this</span>.undoLevels[<span class="reserved">this</span>.undoIndex].content);
+ inst.repaint();
+ <span class="reserved">if</span> (inst.settings.custom_undo_redo_restore_selection)
+ inst.selection.moveToBookmark(<span class="reserved">this</span>.undoLevels[<span class="reserved">this</span>.undoIndex].bookmark);
+ }
+
+ <span class="comment">// tinyMCE.debug("Undo - undo levels:" + this.undoLevels.length + ", undo index: " + this.undoIndex);</span>
+ },
+
+ <span class="comment">/**
+ * Performes a undo action, this will restore the HTML contents of the editor to a former undoed state.
+ */</span>
+ redo : <span class="reserved">function</span>() {
+ var inst = <span class="reserved">this</span>.instance;
+
+ tinyMCE.execCommand(<span class="literal">"mceEndTyping"</span>);
+
+ <span class="reserved">if</span> (<span class="reserved">this</span>.undoIndex < (<span class="reserved">this</span>.undoLevels.length-1)) {
+ <span class="reserved">this</span>.undoIndex++;
+ tinyMCE.setInnerHTML(inst.getBody(), <span class="reserved">this</span>.undoLevels[<span class="reserved">this</span>.undoIndex].content);
+ inst.repaint();
+<span class="comment">// if (this.undoIndex > 0)</span>
+<span class="comment">// inst.selection.moveToBookmark(this.undoLevels[this.undoIndex-1].bookmark);</span>
+ <span class="reserved">if</span> (inst.settings.custom_undo_redo_restore_selection)
+ inst.selection.moveToBookmark(<span class="reserved">this</span>.undoLevels[<span class="reserved">this</span>.undoIndex].bookmark);
+ <span class="comment">// tinyMCE.debug("Redo - undo levels:" + this.undoLevels.length + ", undo index: " + this.undoIndex);</span>
+ }
+
+ tinyMCE.triggerNodeChange();
+ }
+};
+</pre>
+ <hr>
+
+
+
+<!-- ========== START OF NAVBAR ========== -->
+<a name="navbar_top"><!-- --></a>
+<table border="0" width="100%" cellpadding="1" cellspacing="0">
+<tr>
+<td colspan=2 bgcolor="#EEEEFF" class="NavBarCell1">
+<a name="navbar_top_firstrow"><!-- --></a>
+<table border="0" cellpadding="0" cellspacing="3">
+ <tr align="center" valign="top">
+
+
+ <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="overview-summary.html"><font class="NavBarFont1"><b>Overview</b></font></a> </td>
+ <td bgcolor="#FFFFFF" class="NavBarCell1Rev"> <font class="NavBarFont1Rev"><b>File</b></font> </td>
+
+
+ <td bgcolor="#FFFFFF" class="NavBarCell1"> <font class="NavBarFont1">Class</font> </td>
+ <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="overview-tree.html"><font class="NavBarFont1"><b>Tree</b></font></a> </td>
+ <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="index-all.html"--><font class="NavBarFont1"><b>Index</b></font></a> </td>
+ <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="help-doc.html"><font class="NavBarFont1"><b>Help</b></font></a> </td>
+ </tr>
+</table>
+</td>
+<td bgcolor="#EEEEFF" align="right" valign="top"><em>
+<b></b></em>
+</td>
+</tr>
+
+<tr>
+<td bgcolor="white" class="NavBarCell2"><font size="-2">
+ PREV
+ NEXT</font></td>
+<td bgcolor="white" class="NavBarCell2"><font size="-2">
+ <a href="index.html" target="_top"><b>FRAMES</b></a>
+ <a href="overview-summary.html" target="_top"><b>NO FRAMES</b></a>
+
+<script>
+ <!--
+ if(window==top) {
+ document.writeln('<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>');
+ }
+ //-->
+</script>
+<noscript>
+<a href="allclasses-noframe.html" target=""><b>All Classes</b></a>
+</noscript>
+</font></td>
+</tr>
+</table>
+<!-- =========== END OF NAVBAR =========== -->
+
+<hr>
+<font size="-1">
+
+</font>
+<div class="jsdoc_ctime">Documentation generated by <a href="http://jsdoc.sourceforge.net/" target="_parent">JSDoc</a> on Fri Apr 14 21:59:23 2006</div>
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/tinymce_api/overview-summary.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/tinymce_api/overview-summary.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/tinymce_api/overview-summary.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,231 +0,0 @@
-<!doctype html public "-//W3C//DTD HTML 4.0 Frameset//EN""http://www.w3.org/TR/REC-html40/frameset.dtd">
-<html>
-<head>
-<title>
- Overview
-</title>
-<link rel ="stylesheet" type="text/css" href="stylesheet.css" title="Style">
-<script>
-function asd() {
-
- parent.document.title=" Overview";
-
-}
-</script>
-</head>
-<body bgcolor="white" onload="asd();">
-
-<!-- ========== START OF NAVBAR ========== -->
-<a name="navbar_top"><!-- --></a>
-<table border="0" width="100%" cellpadding="1" cellspacing="0">
-<tr>
-<td colspan=2 bgcolor="#EEEEFF" class="NavBarCell1">
-<a name="navbar_top_firstrow"><!-- --></a>
-<table border="0" cellpadding="0" cellspacing="3">
- <tr align="center" valign="top">
-
-
- <td bgcolor="#FFFFFF" class="NavBarCell1Rev"> <font class="NavBarFont1Rev"><b>Overview</b></font> </td>
- <td bgcolor="#EEEEFF" class="NavBarCell1"> <font class="NavBarFont1">File</font> </td>
-
-
- <td bgcolor="#FFFFFF" class="NavBarCell1"> <font class="NavBarFont1">Class</font> </td>
- <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="overview-tree.html"><font class="NavBarFont1"><b>Tree</b></font></a> </td>
- <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="index-all.html"--><font class="NavBarFont1"><b>Index</b></font></a> </td>
- <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="help-doc.html"><font class="NavBarFont1"><b>Help</b></font></a> </td>
- </tr>
-</table>
-</td>
-<td bgcolor="#EEEEFF" align="right" valign="top">
-<em>
-<b></b></em>
-</td>
-</tr>
-
-<tr>
-<td bgcolor="white" class="NavBarCell2"><font size="-2">
- PREV
- NEXT</font></td>
-<td bgcolor="white" class="NavBarCell2"><font size="-2">
- <a href="index.html" target="_top"><b>FRAMES</b></a>
- <a href="overview-summary.html" target="_top"><b>NO FRAMES</b></a>
-
-<script>
- <!--
- if(window==top) {
- document.writeln('<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>');
- }
- //-->
-</script>
-<noscript>
-<a href="allclasses-noframe.html" target=""><b>All Classes</b></a>
-</noscript>
-</font></td>
-</tr>
-</table>
-<!-- =========== END OF NAVBAR =========== -->
-
-<hr>
-<center>
-
- <h2>JSDoc Documentation</h2>
-
-</center>
-
-
-<h4>Summary</h4>
-<p>
-
- No summary generated for these documents.
-
-</p>
-
-<hr>
-
-
- <table border="1" cellpadding="3" cellspacing="0" width="100%">
- <tr bgcolor="#CCCCFF" class="TableHeadingColor">
- <td colspan=2><font size="+2">
-
- <b>File Summary</b>
-
- </font></td>
- </tr>
-
- <tr bgcolor="white" class="TableRowColor">
- <td width="15%"><b><a href="overview-summary-TinyMCE_Array.class.js.html">TinyMCE_Array.class.js</a></b></td>
- <td> </td>
- </tr>
-
- <tr bgcolor="white" class="TableRowColor">
- <td width="15%"><b><a href="overview-summary-TinyMCE_Cleanup.class.js.html">TinyMCE_Cleanup.class.js</a></b></td>
- <td> </td>
- </tr>
-
- <tr bgcolor="white" class="TableRowColor">
- <td width="15%"><b><a href="overview-summary-TinyMCE_Control.class.js.html">TinyMCE_Control.class.js</a></b></td>
- <td> </td>
- </tr>
-
- <tr bgcolor="white" class="TableRowColor">
- <td width="15%"><b><a href="overview-summary-TinyMCE_Debug.class.js.html">TinyMCE_Debug.class.js</a></b></td>
- <td> </td>
- </tr>
-
- <tr bgcolor="white" class="TableRowColor">
- <td width="15%"><b><a href="overview-summary-TinyMCE_DOMUtils.class.js.html">TinyMCE_DOMUtils.class.js</a></b></td>
- <td> </td>
- </tr>
-
- <tr bgcolor="white" class="TableRowColor">
- <td width="15%"><b><a href="overview-summary-TinyMCE_Engine.class.js.html">TinyMCE_Engine.class.js</a></b></td>
- <td> </td>
- </tr>
-
- <tr bgcolor="white" class="TableRowColor">
- <td width="15%"><b><a href="overview-summary-TinyMCE_Event.class.js.html">TinyMCE_Event.class.js</a></b></td>
- <td> </td>
- </tr>
-
- <tr bgcolor="white" class="TableRowColor">
- <td width="15%"><b><a href="overview-summary-TinyMCE_ForceParagraphs.class.js.html">TinyMCE_ForceParagraphs.class.js</a></b></td>
- <td> </td>
- </tr>
-
- <tr bgcolor="white" class="TableRowColor">
- <td width="15%"><b><a href="overview-summary-TinyMCE_Layer.class.js.html">TinyMCE_Layer.class.js</a></b></td>
- <td> </td>
- </tr>
-
- <tr bgcolor="white" class="TableRowColor">
- <td width="15%"><b><a href="overview-summary-TinyMCE_Menu.class.js.html">TinyMCE_Menu.class.js</a></b></td>
- <td> </td>
- </tr>
-
- <tr bgcolor="white" class="TableRowColor">
- <td width="15%"><b><a href="overview-summary-TinyMCE_Popup.class.js.html">TinyMCE_Popup.class.js</a></b></td>
- <td> </td>
- </tr>
-
- <tr bgcolor="white" class="TableRowColor">
- <td width="15%"><b><a href="overview-summary-TinyMCE_Selection.class.js.html">TinyMCE_Selection.class.js</a></b></td>
- <td> </td>
- </tr>
-
- <tr bgcolor="white" class="TableRowColor">
- <td width="15%"><b><a href="overview-summary-TinyMCE_UndoRedo.class.js.html">TinyMCE_UndoRedo.class.js</a></b></td>
- <td> </td>
- </tr>
-
- <tr bgcolor="white" class="TableRowColor">
- <td width="15%"><b><a href="overview-summary-TinyMCE_URL.class.js.html">TinyMCE_URL.class.js</a></b></td>
- <td> </td>
- </tr>
-
- </table>
- <hr/>
-
-
-<!-- ========== METHOD SUMMARY =========== -->
-
-<!-- ========== END METHOD SUMMARY =========== -->
-
-
-
-
-<!-- ========== START OF NAVBAR ========== -->
-<a name="navbar_top"><!-- --></a>
-<table border="0" width="100%" cellpadding="1" cellspacing="0">
-<tr>
-<td colspan=2 bgcolor="#EEEEFF" class="NavBarCell1">
-<a name="navbar_top_firstrow"><!-- --></a>
-<table border="0" cellpadding="0" cellspacing="3">
- <tr align="center" valign="top">
-
-
- <td bgcolor="#FFFFFF" class="NavBarCell1Rev"> <font class="NavBarFont1Rev"><b>Overview</b></font> </td>
- <td bgcolor="#EEEEFF" class="NavBarCell1"> <font class="NavBarFont1">File</font> </td>
-
-
- <td bgcolor="#FFFFFF" class="NavBarCell1"> <font class="NavBarFont1">Class</font> </td>
- <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="overview-tree.html"><font class="NavBarFont1"><b>Tree</b></font></a> </td>
- <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="index-all.html"--><font class="NavBarFont1"><b>Index</b></font></a> </td>
- <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="help-doc.html"><font class="NavBarFont1"><b>Help</b></font></a> </td>
- </tr>
-</table>
-</td>
-<td bgcolor="#EEEEFF" align="right" valign="top"><em>
-<b></b></em>
-</td>
-</tr>
-
-<tr>
-<td bgcolor="white" class="NavBarCell2"><font size="-2">
- PREV
- NEXT</font></td>
-<td bgcolor="white" class="NavBarCell2"><font size="-2">
- <a href="index.html" target="_top"><b>FRAMES</b></a>
- <a href="overview-summary.html" target="_top"><b>NO FRAMES</b></a>
-
-<script>
- <!--
- if(window==top) {
- document.writeln('<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>');
- }
- //-->
-</script>
-<noscript>
-<a href="allclasses-noframe.html" target=""><b>All Classes</b></a>
-</noscript>
-</font></td>
-</tr>
-</table>
-<!-- =========== END OF NAVBAR =========== -->
-
-<hr>
-<font size="-1">
-
-</font>
-<div class="jsdoc_ctime">Documentation generated by <a href="http://jsdoc.sourceforge.net/" target="_parent">JSDoc</a> on Fri Apr 14 21:59:23 2006</div>
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/docs/tinymce_api/overview-summary.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/tinymce_api/overview-summary.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/tinymce_api/overview-summary.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/tinymce_api/overview-summary.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,231 @@
+<!doctype html public "-//W3C//DTD HTML 4.0 Frameset//EN""http://www.w3.org/TR/REC-html40/frameset.dtd">
+<html>
+<head>
+<title>
+ Overview
+</title>
+<link rel ="stylesheet" type="text/css" href="stylesheet.css" title="Style">
+<script>
+function asd() {
+
+ parent.document.title=" Overview";
+
+}
+</script>
+</head>
+<body bgcolor="white" onload="asd();">
+
+<!-- ========== START OF NAVBAR ========== -->
+<a name="navbar_top"><!-- --></a>
+<table border="0" width="100%" cellpadding="1" cellspacing="0">
+<tr>
+<td colspan=2 bgcolor="#EEEEFF" class="NavBarCell1">
+<a name="navbar_top_firstrow"><!-- --></a>
+<table border="0" cellpadding="0" cellspacing="3">
+ <tr align="center" valign="top">
+
+
+ <td bgcolor="#FFFFFF" class="NavBarCell1Rev"> <font class="NavBarFont1Rev"><b>Overview</b></font> </td>
+ <td bgcolor="#EEEEFF" class="NavBarCell1"> <font class="NavBarFont1">File</font> </td>
+
+
+ <td bgcolor="#FFFFFF" class="NavBarCell1"> <font class="NavBarFont1">Class</font> </td>
+ <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="overview-tree.html"><font class="NavBarFont1"><b>Tree</b></font></a> </td>
+ <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="index-all.html"--><font class="NavBarFont1"><b>Index</b></font></a> </td>
+ <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="help-doc.html"><font class="NavBarFont1"><b>Help</b></font></a> </td>
+ </tr>
+</table>
+</td>
+<td bgcolor="#EEEEFF" align="right" valign="top">
+<em>
+<b></b></em>
+</td>
+</tr>
+
+<tr>
+<td bgcolor="white" class="NavBarCell2"><font size="-2">
+ PREV
+ NEXT</font></td>
+<td bgcolor="white" class="NavBarCell2"><font size="-2">
+ <a href="index.html" target="_top"><b>FRAMES</b></a>
+ <a href="overview-summary.html" target="_top"><b>NO FRAMES</b></a>
+
+<script>
+ <!--
+ if(window==top) {
+ document.writeln('<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>');
+ }
+ //-->
+</script>
+<noscript>
+<a href="allclasses-noframe.html" target=""><b>All Classes</b></a>
+</noscript>
+</font></td>
+</tr>
+</table>
+<!-- =========== END OF NAVBAR =========== -->
+
+<hr>
+<center>
+
+ <h2>JSDoc Documentation</h2>
+
+</center>
+
+
+<h4>Summary</h4>
+<p>
+
+ No summary generated for these documents.
+
+</p>
+
+<hr>
+
+
+ <table border="1" cellpadding="3" cellspacing="0" width="100%">
+ <tr bgcolor="#CCCCFF" class="TableHeadingColor">
+ <td colspan=2><font size="+2">
+
+ <b>File Summary</b>
+
+ </font></td>
+ </tr>
+
+ <tr bgcolor="white" class="TableRowColor">
+ <td width="15%"><b><a href="overview-summary-TinyMCE_Array.class.js.html">TinyMCE_Array.class.js</a></b></td>
+ <td> </td>
+ </tr>
+
+ <tr bgcolor="white" class="TableRowColor">
+ <td width="15%"><b><a href="overview-summary-TinyMCE_Cleanup.class.js.html">TinyMCE_Cleanup.class.js</a></b></td>
+ <td> </td>
+ </tr>
+
+ <tr bgcolor="white" class="TableRowColor">
+ <td width="15%"><b><a href="overview-summary-TinyMCE_Control.class.js.html">TinyMCE_Control.class.js</a></b></td>
+ <td> </td>
+ </tr>
+
+ <tr bgcolor="white" class="TableRowColor">
+ <td width="15%"><b><a href="overview-summary-TinyMCE_Debug.class.js.html">TinyMCE_Debug.class.js</a></b></td>
+ <td> </td>
+ </tr>
+
+ <tr bgcolor="white" class="TableRowColor">
+ <td width="15%"><b><a href="overview-summary-TinyMCE_DOMUtils.class.js.html">TinyMCE_DOMUtils.class.js</a></b></td>
+ <td> </td>
+ </tr>
+
+ <tr bgcolor="white" class="TableRowColor">
+ <td width="15%"><b><a href="overview-summary-TinyMCE_Engine.class.js.html">TinyMCE_Engine.class.js</a></b></td>
+ <td> </td>
+ </tr>
+
+ <tr bgcolor="white" class="TableRowColor">
+ <td width="15%"><b><a href="overview-summary-TinyMCE_Event.class.js.html">TinyMCE_Event.class.js</a></b></td>
+ <td> </td>
+ </tr>
+
+ <tr bgcolor="white" class="TableRowColor">
+ <td width="15%"><b><a href="overview-summary-TinyMCE_ForceParagraphs.class.js.html">TinyMCE_ForceParagraphs.class.js</a></b></td>
+ <td> </td>
+ </tr>
+
+ <tr bgcolor="white" class="TableRowColor">
+ <td width="15%"><b><a href="overview-summary-TinyMCE_Layer.class.js.html">TinyMCE_Layer.class.js</a></b></td>
+ <td> </td>
+ </tr>
+
+ <tr bgcolor="white" class="TableRowColor">
+ <td width="15%"><b><a href="overview-summary-TinyMCE_Menu.class.js.html">TinyMCE_Menu.class.js</a></b></td>
+ <td> </td>
+ </tr>
+
+ <tr bgcolor="white" class="TableRowColor">
+ <td width="15%"><b><a href="overview-summary-TinyMCE_Popup.class.js.html">TinyMCE_Popup.class.js</a></b></td>
+ <td> </td>
+ </tr>
+
+ <tr bgcolor="white" class="TableRowColor">
+ <td width="15%"><b><a href="overview-summary-TinyMCE_Selection.class.js.html">TinyMCE_Selection.class.js</a></b></td>
+ <td> </td>
+ </tr>
+
+ <tr bgcolor="white" class="TableRowColor">
+ <td width="15%"><b><a href="overview-summary-TinyMCE_UndoRedo.class.js.html">TinyMCE_UndoRedo.class.js</a></b></td>
+ <td> </td>
+ </tr>
+
+ <tr bgcolor="white" class="TableRowColor">
+ <td width="15%"><b><a href="overview-summary-TinyMCE_URL.class.js.html">TinyMCE_URL.class.js</a></b></td>
+ <td> </td>
+ </tr>
+
+ </table>
+ <hr/>
+
+
+<!-- ========== METHOD SUMMARY =========== -->
+
+<!-- ========== END METHOD SUMMARY =========== -->
+
+
+
+
+<!-- ========== START OF NAVBAR ========== -->
+<a name="navbar_top"><!-- --></a>
+<table border="0" width="100%" cellpadding="1" cellspacing="0">
+<tr>
+<td colspan=2 bgcolor="#EEEEFF" class="NavBarCell1">
+<a name="navbar_top_firstrow"><!-- --></a>
+<table border="0" cellpadding="0" cellspacing="3">
+ <tr align="center" valign="top">
+
+
+ <td bgcolor="#FFFFFF" class="NavBarCell1Rev"> <font class="NavBarFont1Rev"><b>Overview</b></font> </td>
+ <td bgcolor="#EEEEFF" class="NavBarCell1"> <font class="NavBarFont1">File</font> </td>
+
+
+ <td bgcolor="#FFFFFF" class="NavBarCell1"> <font class="NavBarFont1">Class</font> </td>
+ <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="overview-tree.html"><font class="NavBarFont1"><b>Tree</b></font></a> </td>
+ <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="index-all.html"--><font class="NavBarFont1"><b>Index</b></font></a> </td>
+ <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="help-doc.html"><font class="NavBarFont1"><b>Help</b></font></a> </td>
+ </tr>
+</table>
+</td>
+<td bgcolor="#EEEEFF" align="right" valign="top"><em>
+<b></b></em>
+</td>
+</tr>
+
+<tr>
+<td bgcolor="white" class="NavBarCell2"><font size="-2">
+ PREV
+ NEXT</font></td>
+<td bgcolor="white" class="NavBarCell2"><font size="-2">
+ <a href="index.html" target="_top"><b>FRAMES</b></a>
+ <a href="overview-summary.html" target="_top"><b>NO FRAMES</b></a>
+
+<script>
+ <!--
+ if(window==top) {
+ document.writeln('<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>');
+ }
+ //-->
+</script>
+<noscript>
+<a href="allclasses-noframe.html" target=""><b>All Classes</b></a>
+</noscript>
+</font></td>
+</tr>
+</table>
+<!-- =========== END OF NAVBAR =========== -->
+
+<hr>
+<font size="-1">
+
+</font>
+<div class="jsdoc_ctime">Documentation generated by <a href="http://jsdoc.sourceforge.net/" target="_parent">JSDoc</a> on Fri Apr 14 21:59:23 2006</div>
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/docs/tinymce_api/overview-tree.html
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/tinymce_api/overview-tree.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/tinymce_api/overview-tree.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,149 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Frameset//EN""http://www.w3.org/TR/REC-html40/frameset.dtd">
-<!--NewPage-->
-<HTML>
-<HEAD>
-<TITLE>
- Class Hierarchy
-</TITLE>
-<LINK REL="stylesheet" TYPE="text/css" HREF="stylesheet.css" TITLE="Style">
-<SCRIPT>
-function asd()
-{
-parent.document.title=" Class Hierarchy";
-}
-</SCRIPT>
-</HEAD>
-<BODY BGCOLOR="white" onload="asd();">
-
-<!-- ========== START OF NAVBAR ========== -->
-<A NAME="navbar_top"><!-- --></A>
-<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0">
-<TR>
-<TD COLSPAN=3 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
-<A NAME="navbar_top_firstrow"><!-- --></A>
-<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3">
- <TR ALIGN="center" VALIGN="top">
- <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1"><A HREF="overview-summary.html"><FONT CLASS="NavBarFont1"><b>Overview</b></A></FONT> </TD>
- <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1"> <FONT CLASS="NavBarFont1">File</FONT> </TD>
- <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1"> <FONT CLASS="NavBarFont1">Class</FONT> </TD>
- <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1Rev"> <FONT CLASS="NavBarFont1Rev"><b>Tree</b></FONT> </TD>
- <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="index-all.html"--><FONT CLASS="NavBarFont1"><b>Index</b></FONT></A> </TD>
- <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="help-doc.html"><FONT CLASS="NavBarFont1"><b>Help</b></FONT></A> </TD>
- </TR>
-</TABLE>
-</TD>
-<TD BGCOLOR="#FFFFFF" ALIGN="right" VALIGN="top"><EM>
-<B></B></EM>
-</TD>
-</TR>
-
-<TR>
-<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
- PREV
- NEXT</FONT></TD>
-<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
- <A HREF="index.html" TARGET="_top"><B>FRAMES</B></A>
- <A HREF="overview-summary.html" TARGET="_top"><B>NO FRAMES</B></A>
-
-<SCRIPT>
- <!--
- if(window==top) {
- document.writeln('<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>');
- }
- //-->
-</SCRIPT>
-<NOSCRIPT>
-<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>
-</NOSCRIPT>
-</FONT></TD>
-</TR>
-</TABLE>
-<!-- =========== END OF NAVBAR =========== -->
-
-<HR>
-<H2>Class Hierarchy</H2>
-
-<UL><LI TYPE="circle">Object</LI><UL>
- <LI TYPE="circle">
- <A HREF="TinyMCE_Cleanup.html">
- <B>TinyMCE_Cleanup</B></A></LI>
-
- <LI TYPE="circle">
- <A HREF="TinyMCE_Control.html">
- <B>TinyMCE_Control</B></A></LI>
-
- <LI TYPE="circle">
- <A HREF="TinyMCE_Engine.html">
- <B>TinyMCE_Engine</B></A></LI>
-
- <LI TYPE="circle">
- <A HREF="TinyMCE_Layer.html">
- <B>TinyMCE_Layer</B></A></LI>
-
- <LI TYPE="circle">
- <A HREF="TinyMCE_Popup.html">
- <B>TinyMCE_Popup</B></A></LI>
-
- <LI TYPE="circle">
- <A HREF="TinyMCE_Selection.html">
- <B>TinyMCE_Selection</B></A></LI>
-
- <LI TYPE="circle">
- <A HREF="TinyMCE_UndoRedo.html">
- <B>TinyMCE_UndoRedo</B></A></LI>
- </UL></UL>
-
-<HR>
-
-<!-- ========== START OF NAVBAR ========== -->
-<A NAME="navbar_top"><!-- --></A>
-<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0">
-<TR>
-<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
-<A NAME="navbar_top_firstrow"><!-- --></A>
-<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3">
- <TR ALIGN="center" VALIGN="top">
- <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1"><A HREF="overview-summary.html"><FONT CLASS="NavBarFont1"><b>Overview</b></A></FONT> </TD>
- <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1"> <FONT CLASS="NavBarFont1">File</FONT> </TD>
- <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1"> <FONT CLASS="NavBarFont1">Class</FONT> </TD>
- <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1Rev"> <FONT CLASS="NavBarFont1Rev"><b>Tree</b></FONT> </TD>
- <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="index-all.html"--><FONT CLASS="NavBarFont1"><b>Index</b></FONT></A> </TD>
- <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="help-doc.html"><FONT CLASS="NavBarFont1"><b>Help</b></FONT></A> </TD>
- </TR>
-</TABLE>
-</TD>
-<TD BGCOLOR="#FFFFFF" ALIGN="right" VALIGN="top"><EM>
-<B></B></EM>
-</TD>
-</TR>
-
-<TR>
-<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
- PREV
- NEXT</FONT></TD>
-<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
- <A HREF="index.html" TARGET="_top"><B>FRAMES</B></A>
- <A HREF="overview-summary.html" TARGET="_top"><B>NO FRAMES</B></A>
-
-<SCRIPT>
- <!--
- if(window==top) {
- document.writeln('<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>');
- }
- //-->
-</SCRIPT>
-<NOSCRIPT>
-<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>
-</NOSCRIPT>
-</FONT></TD>
-</TR>
-</TABLE>
-<!-- =========== END OF NAVBAR =========== -->
-
-<hr>
-<FONT SIZE="-1">
-
-</FONT>
-<div class="jsdoc_ctime">Documentation generated by <a href="http://jsdoc.sourceforge.net/" parent="_parent">JSDoc</a> on Fri Apr 14 21:59:23 2006</div>
-</BODY>
-</HTML>
Copied: trunk/htdocs/js/tinymce/docs/tinymce_api/overview-tree.html (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/tinymce_api/overview-tree.html)
===================================================================
--- trunk/htdocs/js/tinymce/docs/tinymce_api/overview-tree.html (rev 0)
+++ trunk/htdocs/js/tinymce/docs/tinymce_api/overview-tree.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,149 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Frameset//EN""http://www.w3.org/TR/REC-html40/frameset.dtd">
+<!--NewPage-->
+<HTML>
+<HEAD>
+<TITLE>
+ Class Hierarchy
+</TITLE>
+<LINK REL="stylesheet" TYPE="text/css" HREF="stylesheet.css" TITLE="Style">
+<SCRIPT>
+function asd()
+{
+parent.document.title=" Class Hierarchy";
+}
+</SCRIPT>
+</HEAD>
+<BODY BGCOLOR="white" onload="asd();">
+
+<!-- ========== START OF NAVBAR ========== -->
+<A NAME="navbar_top"><!-- --></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0">
+<TR>
+<TD COLSPAN=3 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_top_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3">
+ <TR ALIGN="center" VALIGN="top">
+ <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1"><A HREF="overview-summary.html"><FONT CLASS="NavBarFont1"><b>Overview</b></A></FONT> </TD>
+ <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1"> <FONT CLASS="NavBarFont1">File</FONT> </TD>
+ <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1"> <FONT CLASS="NavBarFont1">Class</FONT> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1Rev"> <FONT CLASS="NavBarFont1Rev"><b>Tree</b></FONT> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="index-all.html"--><FONT CLASS="NavBarFont1"><b>Index</b></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="help-doc.html"><FONT CLASS="NavBarFont1"><b>Help</b></FONT></A> </TD>
+ </TR>
+</TABLE>
+</TD>
+<TD BGCOLOR="#FFFFFF" ALIGN="right" VALIGN="top"><EM>
+<B></B></EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ PREV
+ NEXT</FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="index.html" TARGET="_top"><B>FRAMES</B></A>
+ <A HREF="overview-summary.html" TARGET="_top"><B>NO FRAMES</B></A>
+
+<SCRIPT>
+ <!--
+ if(window==top) {
+ document.writeln('<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>');
+ }
+ //-->
+</SCRIPT>
+<NOSCRIPT>
+<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>
+</NOSCRIPT>
+</FONT></TD>
+</TR>
+</TABLE>
+<!-- =========== END OF NAVBAR =========== -->
+
+<HR>
+<H2>Class Hierarchy</H2>
+
+<UL><LI TYPE="circle">Object</LI><UL>
+ <LI TYPE="circle">
+ <A HREF="TinyMCE_Cleanup.html">
+ <B>TinyMCE_Cleanup</B></A></LI>
+
+ <LI TYPE="circle">
+ <A HREF="TinyMCE_Control.html">
+ <B>TinyMCE_Control</B></A></LI>
+
+ <LI TYPE="circle">
+ <A HREF="TinyMCE_Engine.html">
+ <B>TinyMCE_Engine</B></A></LI>
+
+ <LI TYPE="circle">
+ <A HREF="TinyMCE_Layer.html">
+ <B>TinyMCE_Layer</B></A></LI>
+
+ <LI TYPE="circle">
+ <A HREF="TinyMCE_Popup.html">
+ <B>TinyMCE_Popup</B></A></LI>
+
+ <LI TYPE="circle">
+ <A HREF="TinyMCE_Selection.html">
+ <B>TinyMCE_Selection</B></A></LI>
+
+ <LI TYPE="circle">
+ <A HREF="TinyMCE_UndoRedo.html">
+ <B>TinyMCE_UndoRedo</B></A></LI>
+ </UL></UL>
+
+<HR>
+
+<!-- ========== START OF NAVBAR ========== -->
+<A NAME="navbar_top"><!-- --></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_top_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3">
+ <TR ALIGN="center" VALIGN="top">
+ <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1"><A HREF="overview-summary.html"><FONT CLASS="NavBarFont1"><b>Overview</b></A></FONT> </TD>
+ <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1"> <FONT CLASS="NavBarFont1">File</FONT> </TD>
+ <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1"> <FONT CLASS="NavBarFont1">Class</FONT> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1Rev"> <FONT CLASS="NavBarFont1Rev"><b>Tree</b></FONT> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="index-all.html"--><FONT CLASS="NavBarFont1"><b>Index</b></FONT></A> </TD>
+ <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="help-doc.html"><FONT CLASS="NavBarFont1"><b>Help</b></FONT></A> </TD>
+ </TR>
+</TABLE>
+</TD>
+<TD BGCOLOR="#FFFFFF" ALIGN="right" VALIGN="top"><EM>
+<B></B></EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ PREV
+ NEXT</FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="index.html" TARGET="_top"><B>FRAMES</B></A>
+ <A HREF="overview-summary.html" TARGET="_top"><B>NO FRAMES</B></A>
+
+<SCRIPT>
+ <!--
+ if(window==top) {
+ document.writeln('<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>');
+ }
+ //-->
+</SCRIPT>
+<NOSCRIPT>
+<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>
+</NOSCRIPT>
+</FONT></TD>
+</TR>
+</TABLE>
+<!-- =========== END OF NAVBAR =========== -->
+
+<hr>
+<FONT SIZE="-1">
+
+</FONT>
+<div class="jsdoc_ctime">Documentation generated by <a href="http://jsdoc.sourceforge.net/" parent="_parent">JSDoc</a> on Fri Apr 14 21:59:23 2006</div>
+</BODY>
+</HTML>
Deleted: trunk/htdocs/js/tinymce/docs/tinymce_api/stylesheet.css
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/docs/tinymce_api/stylesheet.css 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/docs/tinymce_api/stylesheet.css 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,39 +0,0 @@
-/* JSDoc style sheet */
-
-/* Define colors, fonts and other style attributes here to override the defaults */
-
-/* Page background color */
-body { background-color: #FFFFFF }
-
-/* Table colors */
-.TableHeadingColor { background: #CCCCFF } /* Dark mauve */
-.TableSubHeadingColor { background: #EEEEFF } /* Light mauve */
-.TableRowColor { background: #FFFFFF } /* White */
-
-/* Font used in left-hand frame lists */
-.FrameTitleFont { font-size: 10pt; font-family: Helvetica, Arial, san-serif }
-.FrameHeadingFont { font-size: 10pt; font-family: Helvetica, Arial, san-serif }
-.FrameItemFont { font-size: 10pt; font-family: Helvetica, Arial, san-serif }
-
-/* Example of smaller, sans-serif font in frames */
-/* .FrameItemFont { font-size: 10pt; font-family: Helvetica, Arial, sans-serif } */
-
-/* Navigation bar fonts and colors */
-.NavBarCell1 { background-color:#EEEEFF;}/* Light mauve */
-.NavBarCell1Rev { background-color:#00008B;}/* Dark Blue */
-.NavBarFont1 { font-family: Arial, Helvetica, sans-serif; color:#000000;}
-.NavBarFont1Rev { font-family: Arial, Helvetica, sans-serif; color:#FFFFFF;}
-
-.NavBarCell2 { font-family: Arial, Helvetica, sans-serif; background-color:#FFFFFF;}
-.NavBarCell3 { font-family: Arial, Helvetica, sans-serif; background-color:#FFFFFF;}
-
-.jsdoc_ctime { font-family: Arial, Helvetica, sans-serif; font-size: 9pt;
- text-align: right }
-
-/* Sourcecode view */
-.sourceview { background: #FFFFFF }
-.attrib { color: #DD7777 }
-.comment { color: #55AA55 }
-.reserved { color: #FF5555 }
-.literal { color: #5555FF }
-
Copied: trunk/htdocs/js/tinymce/docs/tinymce_api/stylesheet.css (from rev 656, branches/sucs-site/htdocs/js/tinymce/docs/tinymce_api/stylesheet.css)
===================================================================
--- trunk/htdocs/js/tinymce/docs/tinymce_api/stylesheet.css (rev 0)
+++ trunk/htdocs/js/tinymce/docs/tinymce_api/stylesheet.css 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,39 @@
+/* JSDoc style sheet */
+
+/* Define colors, fonts and other style attributes here to override the defaults */
+
+/* Page background color */
+body { background-color: #FFFFFF }
+
+/* Table colors */
+.TableHeadingColor { background: #CCCCFF } /* Dark mauve */
+.TableSubHeadingColor { background: #EEEEFF } /* Light mauve */
+.TableRowColor { background: #FFFFFF } /* White */
+
+/* Font used in left-hand frame lists */
+.FrameTitleFont { font-size: 10pt; font-family: Helvetica, Arial, san-serif }
+.FrameHeadingFont { font-size: 10pt; font-family: Helvetica, Arial, san-serif }
+.FrameItemFont { font-size: 10pt; font-family: Helvetica, Arial, san-serif }
+
+/* Example of smaller, sans-serif font in frames */
+/* .FrameItemFont { font-size: 10pt; font-family: Helvetica, Arial, sans-serif } */
+
+/* Navigation bar fonts and colors */
+.NavBarCell1 { background-color:#EEEEFF;}/* Light mauve */
+.NavBarCell1Rev { background-color:#00008B;}/* Dark Blue */
+.NavBarFont1 { font-family: Arial, Helvetica, sans-serif; color:#000000;}
+.NavBarFont1Rev { font-family: Arial, Helvetica, sans-serif; color:#FFFFFF;}
+
+.NavBarCell2 { font-family: Arial, Helvetica, sans-serif; background-color:#FFFFFF;}
+.NavBarCell3 { font-family: Arial, Helvetica, sans-serif; background-color:#FFFFFF;}
+
+.jsdoc_ctime { font-family: Arial, Helvetica, sans-serif; font-size: 9pt;
+ text-align: right }
+
+/* Sourcecode view */
+.sourceview { background: #FFFFFF }
+.attrib { color: #DD7777 }
+.comment { color: #55AA55 }
+.reserved { color: #FF5555 }
+.literal { color: #5555FF }
+
Deleted: trunk/htdocs/js/tinymce/examples/example_advanced.css
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/examples/example_advanced.css 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/examples/example_advanced.css 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,40 +0,0 @@
-body {
- background-color: #FFFFFF;
- font-family: Verdana, Arial, Helvetica, sans-serif;
- font-size: 12px;
- color: #880000;
- scrollbar-3dlight-color: #F0F0EE;
- scrollbar-arrow-color: #676662;
- scrollbar-base-color: #F0F0EE;
- scrollbar-darkshadow-color: #DDDDDD;
- scrollbar-face-color: #E0E0DD;
- scrollbar-highlight-color: #F0F0EE;
- scrollbar-shadow-color: #F0F0EE;
- scrollbar-track-color: #F5F5F5;
-}
-
-.header1 {
- font-weight: bold;
- font-size: 14px
-}
-
-.header2 {
- font-weight: bold;
- font-size: 12px;
- color: #FF0000
-}
-
-.header3 {
- font-weight: normal;
- font-size: 12px;
- color: #0000FF
-}
-
-.tablerow1 {
- background-color: #BBBBBB;
-}
-
-td {
- font-family: Verdana, Arial, Helvetica, sans-serif;
- font-size: 12px;
-}
Copied: trunk/htdocs/js/tinymce/examples/example_advanced.css (from rev 656, branches/sucs-site/htdocs/js/tinymce/examples/example_advanced.css)
===================================================================
--- trunk/htdocs/js/tinymce/examples/example_advanced.css (rev 0)
+++ trunk/htdocs/js/tinymce/examples/example_advanced.css 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,40 @@
+body {
+ background-color: #FFFFFF;
+ font-family: Verdana, Arial, Helvetica, sans-serif;
+ font-size: 12px;
+ color: #880000;
+ scrollbar-3dlight-color: #F0F0EE;
+ scrollbar-arrow-color: #676662;
+ scrollbar-base-color: #F0F0EE;
+ scrollbar-darkshadow-color: #DDDDDD;
+ scrollbar-face-color: #E0E0DD;
+ scrollbar-highlight-color: #F0F0EE;
+ scrollbar-shadow-color: #F0F0EE;
+ scrollbar-track-color: #F5F5F5;
+}
+
+.header1 {
+ font-weight: bold;
+ font-size: 14px
+}
+
+.header2 {
+ font-weight: bold;
+ font-size: 12px;
+ color: #FF0000
+}
+
+.header3 {
+ font-weight: normal;
+ font-size: 12px;
+ color: #0000FF
+}
+
+.tablerow1 {
+ background-color: #BBBBBB;
+}
+
+td {
+ font-family: Verdana, Arial, Helvetica, sans-serif;
+ font-size: 12px;
+}
Deleted: trunk/htdocs/js/tinymce/examples/example_advanced.htm
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/examples/example_advanced.htm 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/examples/example_advanced.htm 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,99 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Advanced example</title>
-<!-- tinyMCE -->
-<script language="javascript" type="text/javascript" src="../jscripts/tiny_mce/tiny_mce.js"></script>
-<script language="javascript" type="text/javascript">
- tinyMCE.init({
- theme : "advanced",
- mode : "exact",
- elements : "elm1,elm2",
- save_callback : "customSave",
- content_css : "example_advanced.css",
- extended_valid_elements : "a[href|target|name]",
- plugins : "table",
- theme_advanced_buttons3_add_before : "tablecontrols,separator",
- //invalid_elements : "a",
- theme_advanced_styles : "Header 1=header1;Header 2=header2;Header 3=header3;Table Row=tableRow1", // Theme specific setting CSS classes
- //execcommand_callback : "myCustomExecCommandHandler",
- debug : false
- });
-
- // Custom event handler
- function myCustomExecCommandHandler(editor_id, elm, command, user_interface, value) {
- var linkElm, imageElm, inst;
-
- switch (command) {
- case "mceLink":
- inst = tinyMCE.getInstanceById(editor_id);
- linkElm = tinyMCE.getParentElement(inst.selection.getFocusElement(), "a");
-
- if (linkElm)
- alert("Link dialog has been overriden. Found link href: " + tinyMCE.getAttrib(linkElm, "href"));
- else
- alert("Link dialog has been overriden.");
-
- return true;
-
- case "mceImage":
- inst = tinyMCE.getInstanceById(editor_id);
- imageElm = tinyMCE.getParentElement(inst.selection.getFocusElement(), "img");
-
- if (imageElm)
- alert("Image dialog has been overriden. Found image src: " + tinyMCE.getAttrib(imageElm, "src"));
- else
- alert("Image dialog has been overriden.");
-
- return true;
- }
-
- return false; // Pass to next handler in chain
- }
-
- // Custom save callback, gets called when the contents is to be submitted
- function customSave(id, content) {
- alert(id + "=" + content);
- }
-</script>
-<!-- /tinyMCE -->
-
-</head>
-<body>
-
-<a href="example_full.htm">[Full featured example]</a> [Advanced example] <a href="example_simple.htm">[Simple example]</a> <a href="example_word.htm">[Word example]</a>
-
-<h3>Advanced example</h3>
-This page shows a more complex usage of TinyMCE. On this page the mode is set to convert specific elements in this case a DIV element and a TEXTAREA into editor instances. The example below uses a custom CSS, thats why the text is red and it allso uses the "advanced" theme that includes more options than the default one. The code allso includes examples of custom call back functions and much more. Notice the submit button at the end of the page, this button triggers a save action. Read more about the features and possible settings of TinyMCE in the <a href="../docs/index.html">manual</a>.<br />
-<br />
-
-<!-- Form with textare element with width: 100% -->
-<form method="post" action="http://tinymce.moxiecode.com/dump.php?example=true">
-<textarea name="elm1" style="width:100%" rows="15">
- Some <b>element</b>, this is to be editor 1. <br /> This editor instance has a 100% width to it.
- <p>Some paragraph. <a href="http://www.sourceforge.net">Some link</a></p>
- <img src="logo.jpg">
-</textarea>
-<br />
-<input type="button" name="save" value="save" onclick="tinyMCE.triggerSave();" />
-</form>
-
-<!-- Div elements that gets to be a editor instance aswell -->
-<div id="elm2" style="width:450px; height:250px">
- Some <b>element</b>, this is to be editor 2. <br /> This editor instance is a DIV element instead of a textarea.
- <p>Some paragraph. <a href="http://www.sourceforge.net">Some link</a></p>
- <img src="logo.jpg" />
-</div>
-
-<br />
-
-Some custom actions:
-<a href="javascript:tinyMCE.execCommand('Bold');">[Bold]</a> |
-<a href="javascript:tinyMCE.execCommand('Italic');">[Italic]</a>
-<a href="javascript:void(0);" onclick="tinyMCE.execCommand('mceInsertContent',false,'<b>Hello world!!</b>');">[Insert some HTML]</a>
-<a href="javascript:void(0);" onclick="tinyMCE.execCommand('mceReplaceContent',false,'<!-- comment --><b>{$selection}</b>');">[Replace selection]</a>
-
-<br />
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/examples/example_advanced.htm (from rev 656, branches/sucs-site/htdocs/js/tinymce/examples/example_advanced.htm)
===================================================================
--- trunk/htdocs/js/tinymce/examples/example_advanced.htm (rev 0)
+++ trunk/htdocs/js/tinymce/examples/example_advanced.htm 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,99 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Advanced example</title>
+<!-- tinyMCE -->
+<script language="javascript" type="text/javascript" src="../jscripts/tiny_mce/tiny_mce.js"></script>
+<script language="javascript" type="text/javascript">
+ tinyMCE.init({
+ theme : "advanced",
+ mode : "exact",
+ elements : "elm1,elm2",
+ save_callback : "customSave",
+ content_css : "example_advanced.css",
+ extended_valid_elements : "a[href|target|name]",
+ plugins : "table",
+ theme_advanced_buttons3_add_before : "tablecontrols,separator",
+ //invalid_elements : "a",
+ theme_advanced_styles : "Header 1=header1;Header 2=header2;Header 3=header3;Table Row=tableRow1", // Theme specific setting CSS classes
+ //execcommand_callback : "myCustomExecCommandHandler",
+ debug : false
+ });
+
+ // Custom event handler
+ function myCustomExecCommandHandler(editor_id, elm, command, user_interface, value) {
+ var linkElm, imageElm, inst;
+
+ switch (command) {
+ case "mceLink":
+ inst = tinyMCE.getInstanceById(editor_id);
+ linkElm = tinyMCE.getParentElement(inst.selection.getFocusElement(), "a");
+
+ if (linkElm)
+ alert("Link dialog has been overriden. Found link href: " + tinyMCE.getAttrib(linkElm, "href"));
+ else
+ alert("Link dialog has been overriden.");
+
+ return true;
+
+ case "mceImage":
+ inst = tinyMCE.getInstanceById(editor_id);
+ imageElm = tinyMCE.getParentElement(inst.selection.getFocusElement(), "img");
+
+ if (imageElm)
+ alert("Image dialog has been overriden. Found image src: " + tinyMCE.getAttrib(imageElm, "src"));
+ else
+ alert("Image dialog has been overriden.");
+
+ return true;
+ }
+
+ return false; // Pass to next handler in chain
+ }
+
+ // Custom save callback, gets called when the contents is to be submitted
+ function customSave(id, content) {
+ alert(id + "=" + content);
+ }
+</script>
+<!-- /tinyMCE -->
+
+</head>
+<body>
+
+<a href="example_full.htm">[Full featured example]</a> [Advanced example] <a href="example_simple.htm">[Simple example]</a> <a href="example_word.htm">[Word example]</a>
+
+<h3>Advanced example</h3>
+This page shows a more complex usage of TinyMCE. On this page the mode is set to convert specific elements in this case a DIV element and a TEXTAREA into editor instances. The example below uses a custom CSS, thats why the text is red and it allso uses the "advanced" theme that includes more options than the default one. The code allso includes examples of custom call back functions and much more. Notice the submit button at the end of the page, this button triggers a save action. Read more about the features and possible settings of TinyMCE in the <a href="../docs/index.html">manual</a>.<br />
+<br />
+
+<!-- Form with textare element with width: 100% -->
+<form method="post" action="http://tinymce.moxiecode.com/dump.php?example=true">
+<textarea name="elm1" style="width:100%" rows="15">
+ Some <b>element</b>, this is to be editor 1. <br /> This editor instance has a 100% width to it.
+ <p>Some paragraph. <a href="http://www.sourceforge.net">Some link</a></p>
+ <img src="logo.jpg">
+</textarea>
+<br />
+<input type="button" name="save" value="save" onclick="tinyMCE.triggerSave();" />
+</form>
+
+<!-- Div elements that gets to be a editor instance aswell -->
+<div id="elm2" style="width:450px; height:250px">
+ Some <b>element</b>, this is to be editor 2. <br /> This editor instance is a DIV element instead of a textarea.
+ <p>Some paragraph. <a href="http://www.sourceforge.net">Some link</a></p>
+ <img src="logo.jpg" />
+</div>
+
+<br />
+
+Some custom actions:
+<a href="javascript:tinyMCE.execCommand('Bold');">[Bold]</a> |
+<a href="javascript:tinyMCE.execCommand('Italic');">[Italic]</a>
+<a href="javascript:void(0);" onclick="tinyMCE.execCommand('mceInsertContent',false,'<b>Hello world!!</b>');">[Insert some HTML]</a>
+<a href="javascript:void(0);" onclick="tinyMCE.execCommand('mceReplaceContent',false,'<!-- comment --><b>{$selection}</b>');">[Replace selection]</a>
+
+<br />
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/examples/example_flash_list.js
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/examples/example_flash_list.js 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/examples/example_flash_list.js 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,9 +0,0 @@
-// This list may be created by a server logic page PHP/ASP/ASPX/JSP in some backend system.
-// There flash movies will be displayed as a dropdown in all flash dialogs if the "flash_external_list_url"
-// option is defined in TinyMCE init.
-
-var tinyMCEFlashList = new Array(
- // Name, URL
- ["Some Flash 1", "test1.swf"],
- ["Some Flash 2", "test2.swf"]
-);
Copied: trunk/htdocs/js/tinymce/examples/example_flash_list.js (from rev 656, branches/sucs-site/htdocs/js/tinymce/examples/example_flash_list.js)
===================================================================
--- trunk/htdocs/js/tinymce/examples/example_flash_list.js (rev 0)
+++ trunk/htdocs/js/tinymce/examples/example_flash_list.js 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,9 @@
+// This list may be created by a server logic page PHP/ASP/ASPX/JSP in some backend system.
+// There flash movies will be displayed as a dropdown in all flash dialogs if the "flash_external_list_url"
+// option is defined in TinyMCE init.
+
+var tinyMCEFlashList = new Array(
+ // Name, URL
+ ["Some Flash 1", "test1.swf"],
+ ["Some Flash 2", "test2.swf"]
+);
Deleted: trunk/htdocs/js/tinymce/examples/example_full.css
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/examples/example_full.css 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/examples/example_full.css 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,51 +0,0 @@
-body {
- background-color: #FFFFFF;
- font-family: Verdana, Arial, Helvetica, sans-serif;
- font-size: 10px;
- scrollbar-3dlight-color: #F0F0EE;
- scrollbar-arrow-color: #676662;
- scrollbar-base-color: #F0F0EE;
- scrollbar-darkshadow-color: #DDDDDD;
- scrollbar-face-color: #E0E0DD;
- scrollbar-highlight-color: #F0F0EE;
- scrollbar-shadow-color: #F0F0EE;
- scrollbar-track-color: #F5F5F5;
-}
-
-td {
- font-family: Verdana, Arial, Helvetica, sans-serif;
- font-size: 10px;
-}
-
-pre {
- font-family: Verdana, Arial, Helvetica, sans-serif;
- font-size: 10px;
-}
-
-.example1 {
- font-weight: bold;
- font-size: 14px
-}
-
-.example2 {
- font-weight: bold;
- font-size: 12px;
- color: #FF0000
-}
-
-.tablerow1 {
- background-color: #BBBBBB;
-}
-
-thead {
- background-color: #FFBBBB;
-}
-
-tfoot {
- background-color: #BBBBFF;
-}
-
-th {
- font-family: Verdana, Arial, Helvetica, sans-serif;
- font-size: 13px;
-}
Copied: trunk/htdocs/js/tinymce/examples/example_full.css (from rev 656, branches/sucs-site/htdocs/js/tinymce/examples/example_full.css)
===================================================================
--- trunk/htdocs/js/tinymce/examples/example_full.css (rev 0)
+++ trunk/htdocs/js/tinymce/examples/example_full.css 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,51 @@
+body {
+ background-color: #FFFFFF;
+ font-family: Verdana, Arial, Helvetica, sans-serif;
+ font-size: 10px;
+ scrollbar-3dlight-color: #F0F0EE;
+ scrollbar-arrow-color: #676662;
+ scrollbar-base-color: #F0F0EE;
+ scrollbar-darkshadow-color: #DDDDDD;
+ scrollbar-face-color: #E0E0DD;
+ scrollbar-highlight-color: #F0F0EE;
+ scrollbar-shadow-color: #F0F0EE;
+ scrollbar-track-color: #F5F5F5;
+}
+
+td {
+ font-family: Verdana, Arial, Helvetica, sans-serif;
+ font-size: 10px;
+}
+
+pre {
+ font-family: Verdana, Arial, Helvetica, sans-serif;
+ font-size: 10px;
+}
+
+.example1 {
+ font-weight: bold;
+ font-size: 14px
+}
+
+.example2 {
+ font-weight: bold;
+ font-size: 12px;
+ color: #FF0000
+}
+
+.tablerow1 {
+ background-color: #BBBBBB;
+}
+
+thead {
+ background-color: #FFBBBB;
+}
+
+tfoot {
+ background-color: #BBBBFF;
+}
+
+th {
+ font-family: Verdana, Arial, Helvetica, sans-serif;
+ font-size: 13px;
+}
Deleted: trunk/htdocs/js/tinymce/examples/example_full.htm
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/examples/example_full.htm 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/examples/example_full.htm 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,64 +0,0 @@
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Full featured example</title>
-<!-- TinyMCE -->
-<script language="javascript" type="text/javascript" src="../jscripts/tiny_mce/tiny_mce.js"></script>
-<script language="javascript" type="text/javascript">
- tinyMCE.init({
- mode : "textareas",
- theme : "advanced",
- plugins : "style,layer,table,save,advhr,advimage,advlink,emotions,iespell,insertdatetime,preview,flash,searchreplace,print,contextmenu,paste,directionality,fullscreen,noneditable",
- theme_advanced_buttons1_add_before : "save,newdocument,separator",
- theme_advanced_buttons1_add : "fontselect,fontsizeselect",
- theme_advanced_buttons2_add : "separator,insertdate,inserttime,preview,separator,forecolor,backcolor",
- theme_advanced_buttons2_add_before: "cut,copy,paste,pastetext,pasteword,separator,search,replace,separator",
- theme_advanced_buttons3_add_before : "tablecontrols,separator",
- theme_advanced_buttons3_add : "emotions,iespell,flash,advhr,separator,print,separator,ltr,rtl,separator,fullscreen",
- theme_advanced_buttons4 : "insertlayer,moveforward,movebackward,absolute,|,styleprops",
- theme_advanced_toolbar_location : "top",
- theme_advanced_toolbar_align : "left",
- theme_advanced_path_location : "bottom",
- content_css : "example_full.css",
- plugin_insertdate_dateFormat : "%Y-%m-%d",
- plugin_insertdate_timeFormat : "%H:%M:%S",
- extended_valid_elements : "hr[class|width|size|noshade],font[face|size|color|style],span[class|align|style]",
- external_link_list_url : "example_link_list.js",
- external_image_list_url : "example_image_list.js",
- flash_external_list_url : "example_flash_list.js",
- file_browser_callback : "fileBrowserCallBack",
- theme_advanced_resize_horizontal : false,
- theme_advanced_resizing : true
- });
-
- function fileBrowserCallBack(field_name, url, type, win) {
- // This is where you insert your custom filebrowser logic
- alert("Example of filebrowser callback: field_name: " + field_name + ", url: " + url + ", type: " + type);
-
- // Insert new URL, this would normaly be done in a popup
- win.document.forms[0].elements[field_name].value = "someurl.htm";
- }
-</script>
-<!-- /TinyMCE -->
-</head>
-<body>
-
-[Full featured example] <a href="example_advanced.htm">[Advanced example]</a> <a href="example_simple.htm">[Simple example]</a> <a href="example_word.htm">[Word example]</a>
-
-<form method="post" action="http://tinymce.moxiecode.com/dump.php?example=true">
- <h3>Full featured example</h3>
- This page shows all available plugins that are included in the TinyMCE distribution. Some of these plugins will only be visible on MSIE due to the lack of some support in FF. For more details on the various options on TinyMCE check the <a href="../docs/index.html">manual</a> or for more third party plugins check the plugin section.<br /><br />
- <textarea id="elm1" name="elm1" rows="15" cols="80" style="width: 100%">
- <span class="example1">Test header 1</span><br />
- <span class="example2">Test header 2</span><br />
- <span class="example3">Test header 3</span><br />
- Some <b>element</b>, this is to be editor 1. <br /> This editor instance has a 100% width to it.
- <p>Some paragraph. <a href="http://www.sourceforge.net">Some link</a></p>
- <img src="logo.jpg">
- </textarea>
- <br />
- <input type="submit" name="save" value="Submit" />
- <input type="reset" name="reset" value="Reset" />
-</form>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/examples/example_full.htm (from rev 656, branches/sucs-site/htdocs/js/tinymce/examples/example_full.htm)
===================================================================
--- trunk/htdocs/js/tinymce/examples/example_full.htm (rev 0)
+++ trunk/htdocs/js/tinymce/examples/example_full.htm 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,64 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Full featured example</title>
+<!-- TinyMCE -->
+<script language="javascript" type="text/javascript" src="../jscripts/tiny_mce/tiny_mce.js"></script>
+<script language="javascript" type="text/javascript">
+ tinyMCE.init({
+ mode : "textareas",
+ theme : "advanced",
+ plugins : "style,layer,table,save,advhr,advimage,advlink,emotions,iespell,insertdatetime,preview,flash,searchreplace,print,contextmenu,paste,directionality,fullscreen,noneditable",
+ theme_advanced_buttons1_add_before : "save,newdocument,separator",
+ theme_advanced_buttons1_add : "fontselect,fontsizeselect",
+ theme_advanced_buttons2_add : "separator,insertdate,inserttime,preview,separator,forecolor,backcolor",
+ theme_advanced_buttons2_add_before: "cut,copy,paste,pastetext,pasteword,separator,search,replace,separator",
+ theme_advanced_buttons3_add_before : "tablecontrols,separator",
+ theme_advanced_buttons3_add : "emotions,iespell,flash,advhr,separator,print,separator,ltr,rtl,separator,fullscreen",
+ theme_advanced_buttons4 : "insertlayer,moveforward,movebackward,absolute,|,styleprops",
+ theme_advanced_toolbar_location : "top",
+ theme_advanced_toolbar_align : "left",
+ theme_advanced_path_location : "bottom",
+ content_css : "example_full.css",
+ plugin_insertdate_dateFormat : "%Y-%m-%d",
+ plugin_insertdate_timeFormat : "%H:%M:%S",
+ extended_valid_elements : "hr[class|width|size|noshade],font[face|size|color|style],span[class|align|style]",
+ external_link_list_url : "example_link_list.js",
+ external_image_list_url : "example_image_list.js",
+ flash_external_list_url : "example_flash_list.js",
+ file_browser_callback : "fileBrowserCallBack",
+ theme_advanced_resize_horizontal : false,
+ theme_advanced_resizing : true
+ });
+
+ function fileBrowserCallBack(field_name, url, type, win) {
+ // This is where you insert your custom filebrowser logic
+ alert("Example of filebrowser callback: field_name: " + field_name + ", url: " + url + ", type: " + type);
+
+ // Insert new URL, this would normaly be done in a popup
+ win.document.forms[0].elements[field_name].value = "someurl.htm";
+ }
+</script>
+<!-- /TinyMCE -->
+</head>
+<body>
+
+[Full featured example] <a href="example_advanced.htm">[Advanced example]</a> <a href="example_simple.htm">[Simple example]</a> <a href="example_word.htm">[Word example]</a>
+
+<form method="post" action="http://tinymce.moxiecode.com/dump.php?example=true">
+ <h3>Full featured example</h3>
+ This page shows all available plugins that are included in the TinyMCE distribution. Some of these plugins will only be visible on MSIE due to the lack of some support in FF. For more details on the various options on TinyMCE check the <a href="../docs/index.html">manual</a> or for more third party plugins check the plugin section.<br /><br />
+ <textarea id="elm1" name="elm1" rows="15" cols="80" style="width: 100%">
+ <span class="example1">Test header 1</span><br />
+ <span class="example2">Test header 2</span><br />
+ <span class="example3">Test header 3</span><br />
+ Some <b>element</b>, this is to be editor 1. <br /> This editor instance has a 100% width to it.
+ <p>Some paragraph. <a href="http://www.sourceforge.net">Some link</a></p>
+ <img src="logo.jpg">
+ </textarea>
+ <br />
+ <input type="submit" name="save" value="Submit" />
+ <input type="reset" name="reset" value="Reset" />
+</form>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/examples/example_image_list.js
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/examples/example_image_list.js 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/examples/example_image_list.js 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,9 +0,0 @@
-// This list may be created by a server logic page PHP/ASP/ASPX/JSP in some backend system.
-// There images will be displayed as a dropdown in all image dialogs if the "external_link_image_url"
-// option is defined in TinyMCE init.
-
-var tinyMCEImageList = new Array(
- // Name, URL
- ["Logo 1", "logo.jpg"],
- ["Logo 2 Over", "logo_over.jpg"]
-);
Copied: trunk/htdocs/js/tinymce/examples/example_image_list.js (from rev 656, branches/sucs-site/htdocs/js/tinymce/examples/example_image_list.js)
===================================================================
--- trunk/htdocs/js/tinymce/examples/example_image_list.js (rev 0)
+++ trunk/htdocs/js/tinymce/examples/example_image_list.js 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,9 @@
+// This list may be created by a server logic page PHP/ASP/ASPX/JSP in some backend system.
+// There images will be displayed as a dropdown in all image dialogs if the "external_link_image_url"
+// option is defined in TinyMCE init.
+
+var tinyMCEImageList = new Array(
+ // Name, URL
+ ["Logo 1", "logo.jpg"],
+ ["Logo 2 Over", "logo_over.jpg"]
+);
Deleted: trunk/htdocs/js/tinymce/examples/example_link_list.js
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/examples/example_link_list.js 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/examples/example_link_list.js 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,10 +0,0 @@
-// This list may be created by a server logic page PHP/ASP/ASPX/JSP in some backend system.
-// There links will be displayed as a dropdown in all link dialogs if the "external_link_list_url"
-// option is defined in TinyMCE init.
-
-var tinyMCELinkList = new Array(
- // Name, URL
- ["Moxiecode", "http://www.moxiecode.com"],
- ["Freshmeat", "http://www.freshmeat.com"],
- ["Sourceforge", "http://www.sourceforge.com"]
-);
Copied: trunk/htdocs/js/tinymce/examples/example_link_list.js (from rev 656, branches/sucs-site/htdocs/js/tinymce/examples/example_link_list.js)
===================================================================
--- trunk/htdocs/js/tinymce/examples/example_link_list.js (rev 0)
+++ trunk/htdocs/js/tinymce/examples/example_link_list.js 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,10 @@
+// This list may be created by a server logic page PHP/ASP/ASPX/JSP in some backend system.
+// There links will be displayed as a dropdown in all link dialogs if the "external_link_list_url"
+// option is defined in TinyMCE init.
+
+var tinyMCELinkList = new Array(
+ // Name, URL
+ ["Moxiecode", "http://www.moxiecode.com"],
+ ["Freshmeat", "http://www.freshmeat.com"],
+ ["Sourceforge", "http://www.sourceforge.com"]
+);
Deleted: trunk/htdocs/js/tinymce/examples/example_simple.htm
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/examples/example_simple.htm 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/examples/example_simple.htm 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,46 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<meta http-equiv="content-type" content="application/xhtml+xml; charset=utf-8" />
-<title>Simple example</title>
-<!-- tinyMCE -->
-<script language="javascript" type="text/javascript" src="../jscripts/tiny_mce/tiny_mce.js"></script>
-<script language="javascript" type="text/javascript">
- // Notice: The simple theme does not use all options some of them are limited to the advanced theme
- tinyMCE.init({
- mode : "textareas",
- theme : "simple"
- });
-</script>
-<!-- /tinyMCE -->
-
-</head>
-<body>
-
-<a href="example_full.htm">[Full featured example]</a> <a href="example_advanced.htm">[Advanced example]</a> [Simple example] <a href="example_word.htm">[Word example]</a>
-
-<form method="post" action="http://tinymce.moxiecode.com/dump.php?example=true">
-<h3>Simple example</h3>
-This page shows how to use TinyMCE on a HTML page in the most common and simple way. On this page each TEXTAREA
-element gets converted to a editor instance on page load. Notice how TinyMCE tries to match the width and height of the old text area elements. Read more about the features and settings of TinyMCE in the <a href="../docs/index.html">manual</a>.<br /><br />
-
-<textarea id="elm1" name="elm1" rows="10" cols="40">
- Some <b>element</b>, this is to be editor 1.
- <p>Some paragraph. <a href="http://www.sourceforge.net">Some link</a></p>
- <img src="logo.jpg">
-</textarea>
-
-<br />
-
-<textarea id="elm2" name="elm2" rows="15" cols="32">
- Some <b>element</b>, this is to be editor 2.
- <p>Some paragraph. <a href="http://www.sourceforge.net">Some link</a></p>
- <img src="logo.jpg">
-</textarea>
-<br />
- <input type="submit" name="save" value="Submit" />
- <input type="reset" name="reset" value="Reset" />
-</form>
-
-</body>
-</html>
Copied: trunk/htdocs/js/tinymce/examples/example_simple.htm (from rev 656, branches/sucs-site/htdocs/js/tinymce/examples/example_simple.htm)
===================================================================
--- trunk/htdocs/js/tinymce/examples/example_simple.htm (rev 0)
+++ trunk/htdocs/js/tinymce/examples/example_simple.htm 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,46 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="content-type" content="application/xhtml+xml; charset=utf-8" />
+<title>Simple example</title>
+<!-- tinyMCE -->
+<script language="javascript" type="text/javascript" src="../jscripts/tiny_mce/tiny_mce.js"></script>
+<script language="javascript" type="text/javascript">
+ // Notice: The simple theme does not use all options some of them are limited to the advanced theme
+ tinyMCE.init({
+ mode : "textareas",
+ theme : "simple"
+ });
+</script>
+<!-- /tinyMCE -->
+
+</head>
+<body>
+
+<a href="example_full.htm">[Full featured example]</a> <a href="example_advanced.htm">[Advanced example]</a> [Simple example] <a href="example_word.htm">[Word example]</a>
+
+<form method="post" action="http://tinymce.moxiecode.com/dump.php?example=true">
+<h3>Simple example</h3>
+This page shows how to use TinyMCE on a HTML page in the most common and simple way. On this page each TEXTAREA
+element gets converted to a editor instance on page load. Notice how TinyMCE tries to match the width and height of the old text area elements. Read more about the features and settings of TinyMCE in the <a href="../docs/index.html">manual</a>.<br /><br />
+
+<textarea id="elm1" name="elm1" rows="10" cols="40">
+ Some <b>element</b>, this is to be editor 1.
+ <p>Some paragraph. <a href="http://www.sourceforge.net">Some link</a></p>
+ <img src="logo.jpg">
+</textarea>
+
+<br />
+
+<textarea id="elm2" name="elm2" rows="15" cols="32">
+ Some <b>element</b>, this is to be editor 2.
+ <p>Some paragraph. <a href="http://www.sourceforge.net">Some link</a></p>
+ <img src="logo.jpg">
+</textarea>
+<br />
+ <input type="submit" name="save" value="Submit" />
+ <input type="reset" name="reset" value="Reset" />
+</form>
+
+</body>
+</html>
Deleted: trunk/htdocs/js/tinymce/examples/example_word.css
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/examples/example_word.css 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/examples/example_word.css 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,61 +0,0 @@
-body {
- background-color: #FFFFFF;
- font-family: Verdana, Arial, Helvetica, sans-serif;
- font-size: 10px;
- scrollbar-3dlight-color: #F0F0EE;
- scrollbar-arrow-color: #676662;
- scrollbar-base-color: #F0F0EE;
- scrollbar-darkshadow-color: #DDDDDD;
- scrollbar-face-color: #E0E0DD;
- scrollbar-highlight-color: #F0F0EE;
- scrollbar-shadow-color: #F0F0EE;
- scrollbar-track-color: #F5F5F5;
-}
-
-td {
- font-family: Verdana, Arial, Helvetica, sans-serif;
- font-size: 10px;
-}
-
-pre {
- font-family: Verdana, Arial, Helvetica, sans-serif;
- font-size: 10px;
-}
-
-.example1 {
- font-weight: bold;
- font-size: 14px
-}
-
-.example2 {
- font-weight: bold;
- font-size: 12px;
- color: #FF0000
-}
-
-.tablerow1 {
- background-color: #BBBBBB;
-}
-
-/* Fix for MS Office style paragraphs (MsoNormal) */
-p {
- margin: 0;
- padding: 0;
-}
-
-/* Fix for MS Office unindeted lists */
-.unIndentedList {
- margin: 0;
- padding: 0;
- list-style-position: inside;
-}
-
-.unIndentedList li {
- padding: 0;
-}
-
-/* Fix for MS Office UL lists */
-ul {
- margin-top: 0;
- margin-bottom: 0;
-}
Copied: trunk/htdocs/js/tinymce/examples/example_word.css (from rev 656, branches/sucs-site/htdocs/js/tinymce/examples/example_word.css)
===================================================================
--- trunk/htdocs/js/tinymce/examples/example_word.css (rev 0)
+++ trunk/htdocs/js/tinymce/examples/example_word.css 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,61 @@
+body {
+ background-color: #FFFFFF;
+ font-family: Verdana, Arial, Helvetica, sans-serif;
+ font-size: 10px;
+ scrollbar-3dlight-color: #F0F0EE;
+ scrollbar-arrow-color: #676662;
+ scrollbar-base-color: #F0F0EE;
+ scrollbar-darkshadow-color: #DDDDDD;
+ scrollbar-face-color: #E0E0DD;
+ scrollbar-highlight-color: #F0F0EE;
+ scrollbar-shadow-color: #F0F0EE;
+ scrollbar-track-color: #F5F5F5;
+}
+
+td {
+ font-family: Verdana, Arial, Helvetica, sans-serif;
+ font-size: 10px;
+}
+
+pre {
+ font-family: Verdana, Arial, Helvetica, sans-serif;
+ font-size: 10px;
+}
+
+.example1 {
+ font-weight: bold;
+ font-size: 14px
+}
+
+.example2 {
+ font-weight: bold;
+ font-size: 12px;
+ color: #FF0000
+}
+
+.tablerow1 {
+ background-color: #BBBBBB;
+}
+
+/* Fix for MS Office style paragraphs (MsoNormal) */
+p {
+ margin: 0;
+ padding: 0;
+}
+
+/* Fix for MS Office unindeted lists */
+.unIndentedList {
+ margin: 0;
+ padding: 0;
+ list-style-position: inside;
+}
+
+.unIndentedList li {
+ padding: 0;
+}
+
+/* Fix for MS Office UL lists */
+ul {
+ margin-top: 0;
+ margin-bottom: 0;
+}
Deleted: trunk/htdocs/js/tinymce/examples/example_word.htm
===================================================================
--- branches/sucs-site/htdocs/js/tinymce/examples/example_word.htm 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/tinymce/examples/example_word.htm 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,68 +0,0 @@
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Word example</title>
-<!-- TinyMCE -->
-<script language="javascript" type="text/javascript" src="../jscripts/tiny_mce/tiny_mce.js"></script>
-<script language="javascript" type="text/javascript">
- tinyMCE.init({
- mode : "textareas",
- theme : "advanced",
- plugins : "table,save,advhr,advimage,advlink,emotions,iespell,insertdatetime,preview,zoom,flash,searchreplace,print,contextmenu,paste,directionality,fullscreen",
- theme_advanced_buttons1_add_before : "save,newdocument,separator",
- theme_advanced_buttons1_add : "fontselect,fontsizeselect",
- theme_advanced_buttons2_add : "separator,insertdate,inserttime,preview,zoom,separator,forecolor,backcolor",
- theme_advanced_buttons2_add_before: "cut,copy,paste,pastetext,pasteword,separator,search,replace,separator",
- theme_advanced_buttons3_add_before : "tablecontrols,separator",
- theme_advanced_buttons3_add : "emotions,iespell,flash,advhr,separator,print,separator,ltr,rtl,separator,fullscreen",
- theme_advanced_toolbar_location : "top",
- theme_advanced_toolbar_align : "left",
- theme_advanced_statusbar_location : "bottom",
- content_css : "example_word.css",
- plugi2n_insertdate_dateFormat : "%Y-%m-%d",
- plugi2n_insertdate_timeFormat : "%H:%M:%S",
- external_link_list_url : "example_link_list.js",
- external_image_list_url : "example_image_list.js",
- flash_external_list_url : "example_flash_list.js",
- file_browser_callback : "fileBrowserCallBack",
- paste_use_dialog : false,
- theme_advanced_resizing : true,
- theme_advanced_resize_horizontal : false,
- theme_advanced_link_targets : "_something=My somthing;_something2=My somthing2;_something3=My somthing3;",
- paste_auto_cleanup_on_paste : true,
- paste_convert_headers_to_strong : false,
- paste_strip_class_attributes : "all",
- paste_remove_spans : false,
- paste_remove_styles : false
- });
-
- function fileBrowserCallBack(field_name, url, type, win) {
- // This is where you insert your custom filebrowser logic
- alert("Filebrowser callback: field_name: " + field_name + ", url: " + url + ", type: " + type);
-
- // Insert new URL, this would normaly be done in a popup
- win.document.forms[0].elements[field_name].value = "someurl.htm";
- }
-</script>
-<!-- /TinyMCE -->
-</head>
-<body>
-
-<a href="example_full.htm">[Full featured example]</a> <a href="example_advanced.htm">[Advanced example]</a> <a href="example_simple.htm">[Simple example]</a> [Word example]
-
-<form method="post" action="http://tinymce.moxiecode.com/dump.php?example=true">
- <h3>Word example</h3>
- This example shows you how TinyMCE can be configurated to function with Word content in the best possible way. TinyMCE is configured to auto convert/cleanup pasted Word content in this example. It's has also a custom CSS that makes paragraphs marginless as in Word.<br /><br />
- <textarea id="elm1" name="elm1" rows="15" cols="80" style="width: 100%">
- <p>Some paragraph</p>
- <p>Some other paragraph</p>
- <p>Some <b>element</b>, this is to be editor 1. <br /> This editor instance has a 100% width to it.
- <p>Some paragraph. <a href="http://www.sourceforge.net">Some link</a></p>
- <img src="logo.jpg"></p>
- </textarea>
- <br />
- <input type="submit" name="save" value="Submit" />
- <input type="reset" name="reset" value="Reset" />
-</form>
-
-</body>
-</html>
\ No newline at end of file
Copied: trunk/htdocs/js/tinymce/examples/example_word.htm (from rev 656, branches/sucs-site/htdocs/js/tinymce/examples/example_word.htm)
===================================================================
--- trunk/htdocs/js/tinymce/examples/example_word.htm (rev 0)
+++ trunk/htdocs/js/tinymce/examples/example_word.htm 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,68 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Word example</title>
+<!-- TinyMCE -->
+<script language="javascript" type="text/javascript" src="../jscripts/tiny_mce/tiny_mce.js"></script>
+<script language="javascript" type="text/javascript">
+ tinyMCE.init({
+ mode : "textareas",
+ theme : "advanced",
+ plugins : "table,save,advhr,advimage,advlink,emotions,iespell,insertdatetime,preview,zoom,flash,searchreplace,print,contextmenu,paste,directionality,fullscreen",
+ theme_advanced_buttons1_add_before : "save,newdocument,separator",
+ theme_advanced_buttons1_add : "fontselect,fontsizeselect",
+ theme_advanced_buttons2_add : "separator,insertdate,inserttime,preview,zoom,separator,forecolor,backcolor",
+ theme_advanced_buttons2_add_before: "cut,copy,paste,pastetext,pasteword,separator,search,replace,separator",
+ theme_advanced_buttons3_add_before : "tablecontrols,separator",
+ theme_advanced_buttons3_add : "emotions,iespell,flash,advhr,separator,print,separator,ltr,rtl,separator,fullscreen",
+ theme_advanced_toolbar_location : "top",
+ theme_advanced_toolbar_align : "left",
+ theme_advanced_statusbar_location : "bottom",
+ content_css : "example_word.css",
+ plugi2n_insertdate_dateFormat : "%Y-%m-%d",
+ plugi2n_insertdate_timeFormat : "%H:%M:%S",
+ external_link_list_url : "example_link_list.js",
+ external_image_list_url : "example_image_list.js",
+ flash_external_list_url : "example_flash_list.js",
+ file_browser_callback : "fileBrowserCallBack",
+ paste_use_dialog : false,
+ theme_advanced_resizing : true,
+ theme_advanced_resize_horizontal : false,
+ theme_advanced_link_targets : "_something=My somthing;_something2=My somthing2;_something3=My somthing3;",
+ paste_auto_cleanup_on_paste : true,
+ paste_convert_headers_to_strong : false,
+ paste_strip_class_attributes : "all",
+ paste_remove_spans : false,
+ paste_remove_styles : false
+ });
+
+ function fileBrowserCallBack(field_name, url, type, win) {
+ // This is where you insert your custom filebrowser logic
+ alert("Filebrowser callback: field_name: " + field_name + ", url: " + url + ", type: " + type);
+
+ // Insert new URL, this would normaly be done in a popup
+ win.document.forms[0].elements[field_name].value = "someurl.htm";
+ }
+</script>
+<!-- /TinyMCE -->
+</head>
+<body>
+
+<a href="example_full.htm">[Full featured example]</a> <a href="example_advanced.htm">[Advanced example]</a> <a href="example_simple.htm">[Simple example]</a> [Word example]
+
+<form method="post" action="http://tinymce.moxiecode.com/dump.php?example=true">
+ <h3>Word example</h3>
+ This example shows you how TinyMCE can be configurated to function with Word content in the best possible way. TinyMCE is configured to auto convert/cleanup pasted Word content in this example. It's has also a custom CSS that makes paragraphs marginless as in Word.<br /><br />
+ <textarea id="elm1" name="elm1" rows="15" cols="80" style="width: 100%">
+ <p>Some paragraph</p>
+ <p>Some other paragraph</p>
+ <p>Some <b>element</b>, this is to be editor 1. <br /> This editor instance has a 100% width to it.
+ <p>Some paragraph. <a href="http://www.sourceforge.net">Some link</a></p>
+ <img src="logo.jpg"></p>
+ </textarea>
+ <br />
+ <input type="submit" name="save" value="Submit" />
+ <input type="reset" name="reset" value="Reset" />
+</form>
+
+</body>
+</html>
\ No newline at end of file
Deleted: trunk/htdocs/js/tinymce/examples/logo.jpg
===================================================================
(Binary files differ)
Copied: trunk/htdocs/js/tinymce/examples/logo.jpg (from rev 656, branches/sucs-site/htdocs/js/tinymce/examples/logo.jpg)
===================================================================
(Binary files differ)
Deleted: trunk/htdocs/js/tinymce/examples/logo_over.jpg
===================================================================
(Binary files differ)
Copied: trunk/htdocs/js/tinymce/examples/logo_over.jpg (from rev 656, branches/sucs-site/htdocs/js/tinymce/examples/logo_over.jpg)
===================================================================
(Binary files differ)
Copied: trunk/htdocs/js/tinymce/readme (from rev 656, branches/sucs-site/htdocs/js/tinymce/readme)
===================================================================
--- trunk/htdocs/js/tinymce/readme (rev 0)
+++ trunk/htdocs/js/tinymce/readme 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,2 @@
+Please consult the HTML documentation for details.
+
Modified: trunk/htdocs/js/xmlhttp.js
===================================================================
--- trunk/htdocs/js/xmlhttp.js 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/htdocs/js/xmlhttp.js 2015-04-05 16:42:47 UTC (rev 657)
@@ -15,7 +15,7 @@
frm = document.forms['commentform'];
url = "blog=" + strBlog + "&post=" + strPost + "&author=" + escape(frm.elements['author'].value) + "&email=" + escape(frm.elements['email'].value) + "&comment=" + escape(frm.elements['comment'].value);
- xmlhttp.open("POST", strBaseUrl+"postcomment.php", true);
+ xmlhttp.open("POST", strBaseUrl+"comment", true);
xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
xmlhttp.onreadystatechange = function() {
if (xmlhttp.readyState == 4) {
Property changes on: trunk/htdocs/pictures/people
___________________________________________________________________
Added: svn:ignore
+ *
Modified: trunk/lib/ArrayRenderer.php
===================================================================
--- trunk/lib/ArrayRenderer.php 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/lib/ArrayRenderer.php 2015-04-05 16:42:47 UTC (rev 657)
@@ -43,7 +43,7 @@
* @link http://pear.php.net/package/Text_Highlighter
*/
-class Text_Highlighter_Renderer_Array extends Text_Highlighter_Renderer
+class Text_Highlighter_Renderer_Array_dez extends Text_Highlighter_Renderer
{
/**#@+
Deleted: trunk/lib/Validate/ISPN.php
===================================================================
--- branches/sucs-site/lib/Validate/ISPN.php 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/lib/Validate/ISPN.php 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,371 +0,0 @@
-<?php
-/* vim: set expandtab tabstop=4 shiftwidth=4: */
-// +----------------------------------------------------------------------+
-// | Copyright (c) 1997-2005 Piotr Klaban, Damien Seguy, Helgi Þormar |
-// | Þorbjörnsson, Pierre-Alain Joye |
-// +----------------------------------------------------------------------+
-// | This source file is subject to the New BSD license, That is bundled |
-// | with this package in the file LICENSE, and is available through |
-// | the world-wide-web at |
-// | http://www.opensource.org/licenses/bsd-license.php |
-// | If you did not receive a copy of the new BSDlicense and are unable |
-// | to obtain it through the world-wide-web, please send a note to |
-// | pajoye at php.net so we can mail you a copy immediately. |
-// +----------------------------------------------------------------------+
-// | Author: Tomas V.V.Cox <cox at idecnet.com> |
-// | Pierre-Alain Joye <pajoye at php.net> |
-// +----------------------------------------------------------------------+
-//
-/**
- * Specific validation methods for International Standard Product Numbers (ISPN)
- *
- * @category Validate
- * @package Validate_ISPN
- * @author Piotr Klaban <makler at man.torun.pl>
- * @author Damien Seguy <dams at nexen.net>
- * @author Helgi Þormar Þorbjörnsson <dufuz at php.net>
- * @copyright 1997-2005 Piotr Klaban, Damien Seguy, Helgi Þormar Þorbjörnsson,
- * Pierre-Alain Joye
- * @license http://www.opensource.org/licenses/bsd-license.php new BSD
- * @version CVS: $Id: ISPN.php,v 1.12 2005/11/12 16:03:02 dufuz Exp $
- * @link http://pear.php.net/package/Validate_ISPN
- */
-
-/**
- * Data validation class for International Standard Product Numbers (ISPN)
- *
- * This class provides methods to validate:
- * - ISBN (International Standard Book Number)
- * - ISSN (International Standard Serial Number)
- * - ISMN (International Standard Music Number)
- * - ISRC (International Standard Recording Code)
- * - EAN/UCC-8 number
- * - EAN/UCC-13 number
- * - EAN/UCC-14 number
- * - UCC-12 (U.P.C.) ID number
- * - SSCC (Serial Shipping Container Code)
- *
- * @category Validate
- * @package Validate_ISPN
- * @author Piotr Klaban <makler at man.torun.pl>
- * @author Damien Seguy <dams at nexen.net>
- * @author Helgi Þormar Þorbjörnsson <dufuz at php.net>
- * @copyright 1997-2005 Piotr Klaban, Damien Seguy, Helgi Þormar Þorbjörnsson,
- * Pierre-Alain Joye
- * @license http://www.opensource.org/licenses/bsd-license.php new BSD
- * @version Release: @package_version@
- * @link http://pear.php.net/package/Validate_ISPN
- */
-class Validate_ISPN
-{
- function isbn($isbn)
- {
- if (preg_match("/[^0-9 IXSBN-]/", $isbn)) {
- return false;
- }
-
- $isbn = strtoupper($isbn);
- $isbn = str_replace(array('ISBN', '-', ' ', "\t", "\n"), '', $isbn);
-
- if (strlen($isbn) == 13) {
- return Validate_ISPN::isbn13($isbn);
- } elseif (strlen($isbn) == 10) {
- return Validate_ISPN::isbn10($isbn);
- } else {
- return false;
- }
- }
-
- /**
- * Validate a ISBN 13 number
- * The ISBN is a unique machine-readable identification number,
- * which marks any book unmistakably.
- *
- * This function checks given number according
- *
- * Manual can be found at http://www.isbn-international.org
- *
- * @param string $isbn number (only numeric chars will be considered)
- * @return bool true if number is valid, otherwise false
- * @access public
- * @author Helgi Þormar <dufuz at php.net>
- * @author Piotr Klaban <makler at man.torun.pl>
- */
- function isbn13($isbn)
- {
- if (preg_match("/[^0-9 ISBN-]/", $isbn)) {
- return false;
- }
-
- $isbn = strtoupper($isbn);
- $isbn = str_replace(array('ISBN', '-', ' ', "\t", "\n"), '', $isbn);
- if (!preg_match('/^[0-9]{13}$/', $isbn)) {
- return false;
- }
-
- return Validate_ISPN::ean13($isbn);
- }
-
- /**
- * Validate a ISBN 10 number
- * The ISBN is a unique machine-readable identification number,
- * which marks any book unmistakably.
- *
- * This function checks given number according
- *
- * Manual can be found at http://www.isbn-international.org
- *
- * @param string $isbn number (only numeric chars will be considered)
- * @return bool true if number is valid, otherwise false
- * @access public
- * @author Damien Seguy <dams at nexen.net>
- * @author Helgi Þormar <dufuz at php.net>
- */
- function isbn10($isbn)
- {
- static $weights_isbn = array(10,9,8,7,6,5,4,3,2);
-
- if (preg_match("/[^0-9 IXSBN-]/", $isbn)) {
- return false;
- }
-
- $isbn = strtoupper($isbn);
- $isbn = str_replace(array('ISBN', '-', ' ', "\t", "\n"), '', $isbn);
- if (strlen($isbn) != 10) {
- return false;
- }
-
- if (!preg_match('/^[0-9]{9}[0-9X]$/', $isbn)) {
- return false;
- }
-
- // Requires base class Validate
- require_once 'Validate.php';
- return Validate::_checkControlNumber($isbn, $weights_isbn, 11, 11);
- }
-
-
- /**
- * Validate an ISSN (International Standard Serial Number)
- *
- * This function checks given ISSN number
- * ISSN identifies periodical publications:
- * http://www.issn.org
- *
- * @param string $issn number (only numeric chars will be considered)
- * @return bool true if number is valid, otherwise false
- * @access public
- * @author Piotr Klaban <makler at man.torun.pl>
- */
- function issn($issn)
- {
- static $weights_issn = array(8,7,6,5,4,3,2);
-
- $issn = strtoupper($issn);
- $issn = str_replace(array('ISSN', '-', '/', ' ', "\t", "\n"), '', $issn);
- $issn_num = str_replace('X', '0', $issn);
-
- // check if this is an 8-digit number
- if (!is_numeric($issn_num) || strlen($issn) != 8) {
- return false;
- }
-
- // Requires base class Validate
- require_once 'Validate.php';
- return Validate::_checkControlNumber($issn, $weights_issn, 11, 11);
- }
-
- /**
- * Validate a ISMN (International Standard Music Number)
- *
- * This function checks given ISMN number (ISO Standard 10957)
- * ISMN identifies all printed music publications from all over the world
- * whether available for sale, hire or gratis--whether a part, a score,
- * or an element in a multi-media kit.
- *
- * Manual can be found at:
- * http://www.ismn-international.org/
- *
- * @param string $ismn ISMN number
- * @return bool true if number is valid, otherwise false
- * @access public
- * @author Piotr Klaban <makler at man.torun.pl>
- */
- function ismn($ismn)
- {
- static $weights_ismn = array(3,1,3,1,3,1,3,1,3);
-
- $ismn = strtoupper($ismn);
- $ismn = str_replace(array('ISMN', '-', '/', ' ', "\t", "\n"), '', $ismn);
- // First char has to be M (after ISMN has been stripped if present)
- if ($ismn{0} != 'M') {
- return false;
- }
-
- // change M to 3
- $ismn{0} = 3;
-
- // check if this is a 10-digit number
- if (!is_numeric($ismn) || strlen($ismn) != 10) {
- return false;
- }
-
- // Requires base class Validate
- require_once 'Validate.php';
- return Validate::_checkControlNumber($ismn, $weights_ismn, 10, 10);
- }
-
- /**
- * Validate a ISRC (International Standard Recording Code)
- *
- * This function validates an International Standard Recording Code
- * which is the international identification system for sound recordings
- * and music videorecordings.
- *
- * @param string $isrc ISRC number
- * @return bool true if number is valid, otherwise false
- * @see http://www.ifpi.org/isrc/isrc_handbook.html
- * @access public
- * @author David Grant <david at grant.org.uk>
- */
- function isrc($isrc)
- {
- $isrc = str_replace(array('ISRC', '-', ' '), '', strtoupper($isrc));
- if (!preg_match("/[A-Z]{2}[A-Z0-9]{3}[0-9]{7}/", $isrc)) {
- return false;
- }
-
- return true;
- }
-
- /**
- * Validate a EAN/UCC-8 number
- *
- * This function checks given EAN8 number
- * used to identify trade items and special applications.
- * http://www.ean-ucc.org/
- * http://www.uc-council.org/checkdig.htm
- *
- * @param string $ean number (only numeric chars will be considered)
- * @return bool true if number is valid, otherwise false
- * @access public
- * @see Validate_ISPN::process()
- * @author Piotr Klaban <makler at man.torun.pl>
- */
- function ean8($ean)
- {
- static $weights_ean8 = array(3,1,3,1,3,1,3);
- return Validate_ISPN::process($ean, 8, $weights_ean8, 10, 10);
- }
-
- /**
- * Validate a EAN/UCC-13 number
- *
- * This function checks given EAN/UCC-13 number used to identify
- * trade items, locations, and special applications (e.g., coupons)
- * http://www.ean-ucc.org/
- * http://www.uc-council.org/checkdig.htm
- *
- * @param string $ean number (only numeric chars will be considered)
- * @return bool true if number is valid, otherwise false
- * @access public
- * @see Validate_ISPN::process()
- * @author Piotr Klaban <makler at man.torun.pl>
- */
- function ean13($ean)
- {
- static $weights_ean13 = array(1,3,1,3,1,3,1,3,1,3,1,3);
- return Validate_ISPN::process($ean, 13, $weights_ean13, 10, 10);
- }
-
- /**
- * Validate a EAN/UCC-14 number
- *
- * This function checks given EAN/UCC-14 number
- * used to identify trade items.
- * http://www.ean-ucc.org/
- * http://www.uc-council.org/checkdig.htm
- *
- * @param string $ean number (only numeric chars will be considered)
- * @return bool true if number is valid, otherwise false
- * @access public
- * @see Validate_ISPN::process()
- * @author Piotr Klaban <makler at man.torun.pl>
- */
- function ean14($ean)
- {
- static $weights_ean14 = array(3,1,3,1,3,1,3,1,3,1,3,1,3);
- return Validate_ISPN::process($ean, 14, $weights_ean14, 10, 10);
- }
-
- /**
- * Validate a UCC-12 (U.P.C.) ID number
- *
- * This function checks given UCC-12 number used to identify
- * trade items, locations, and special applications (e.g., * coupons)
- * http://www.ean-ucc.org/
- * http://www.uc-council.org/checkdig.htm
- *
- * @param string $ucc number (only numeric chars will be considered)
- * @return bool true if number is valid, otherwise false
- * @access public
- * @see Validate_ISPN::process()
- * @author Piotr Klaban <makler at man.torun.pl>
- */
- function ucc12($ucc)
- {
- static $weights_ucc12 = array(3,1,3,1,3,1,3,1,3,1,3);
- return Validate_ISPN::process($ucc, 12, $weights_ucc12, 10, 10);
- }
-
- /**
- * Validate a SSCC (Serial Shipping Container Code)
- *
- * This function checks given SSCC number
- * used to identify logistic units.
- * http://www.ean-ucc.org/
- * http://www.uc-council.org/checkdig.htm
- *
- * @param string $sscc number (only numeric chars will be considered)
- * @return bool true if number is valid, otherwise false
- * @access public
- * @see Validate_ISPN::process()
- * @author Piotr Klaban <makler at man.torun.pl>
- */
- function sscc($sscc)
- {
- static $weights_sscc = array(3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3);
- return Validate_ISPN::process($sscc, 18, $weights_sscc, 10, 10);
- }
-
- /**
- * Does all the work for EAN8, EAN13, EAN14, UCC12 and SSCC
- * and can be used for as base for similar kind of calculations
- *
- * @param int $data number (only numeric chars will be considered)
- * @param int $lenght required length of number string
- * @param int $modulo (optionsl) number
- * @param int $subtract (optional) numbier
- * @param array $weights holds the weight that will be used in calculations for the validation
- * @return bool true if number is valid, otherwise false
- * @access public
- * @see Validate::_checkControlNumber()
- */
- function process($data, $length, &$weights, $modulo = 10, $subtract = 0)
- {
- //$weights = array(3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3);
- //$weights = array_slice($weights, 0, $length);
-
- $data = str_replace(array('-', '/', ' ', "\t", "\n"), '', $data);
-
- // check if this is a digit number and is the right length
- if (!is_numeric($data) || strlen($data) != $length) {
- return false;
- }
-
- // Requires base class Validate
- require_once 'Validate.php';
- return Validate::_checkControlNumber($data, $weights, $modulo, $subtract);
- }
-}
-?>
Copied: trunk/lib/Validate/ISPN.php (from rev 656, branches/sucs-site/lib/Validate/ISPN.php)
===================================================================
--- trunk/lib/Validate/ISPN.php (rev 0)
+++ trunk/lib/Validate/ISPN.php 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,371 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4: */
+// +----------------------------------------------------------------------+
+// | Copyright (c) 1997-2005 Piotr Klaban, Damien Seguy, Helgi Þormar |
+// | Þorbjörnsson, Pierre-Alain Joye |
+// +----------------------------------------------------------------------+
+// | This source file is subject to the New BSD license, That is bundled |
+// | with this package in the file LICENSE, and is available through |
+// | the world-wide-web at |
+// | http://www.opensource.org/licenses/bsd-license.php |
+// | If you did not receive a copy of the new BSDlicense and are unable |
+// | to obtain it through the world-wide-web, please send a note to |
+// | pajoye at php.net so we can mail you a copy immediately. |
+// +----------------------------------------------------------------------+
+// | Author: Tomas V.V.Cox <cox at idecnet.com> |
+// | Pierre-Alain Joye <pajoye at php.net> |
+// +----------------------------------------------------------------------+
+//
+/**
+ * Specific validation methods for International Standard Product Numbers (ISPN)
+ *
+ * @category Validate
+ * @package Validate_ISPN
+ * @author Piotr Klaban <makler at man.torun.pl>
+ * @author Damien Seguy <dams at nexen.net>
+ * @author Helgi Þormar Þorbjörnsson <dufuz at php.net>
+ * @copyright 1997-2005 Piotr Klaban, Damien Seguy, Helgi Þormar Þorbjörnsson,
+ * Pierre-Alain Joye
+ * @license http://www.opensource.org/licenses/bsd-license.php new BSD
+ * @version CVS: $Id: ISPN.php,v 1.12 2005/11/12 16:03:02 dufuz Exp $
+ * @link http://pear.php.net/package/Validate_ISPN
+ */
+
+/**
+ * Data validation class for International Standard Product Numbers (ISPN)
+ *
+ * This class provides methods to validate:
+ * - ISBN (International Standard Book Number)
+ * - ISSN (International Standard Serial Number)
+ * - ISMN (International Standard Music Number)
+ * - ISRC (International Standard Recording Code)
+ * - EAN/UCC-8 number
+ * - EAN/UCC-13 number
+ * - EAN/UCC-14 number
+ * - UCC-12 (U.P.C.) ID number
+ * - SSCC (Serial Shipping Container Code)
+ *
+ * @category Validate
+ * @package Validate_ISPN
+ * @author Piotr Klaban <makler at man.torun.pl>
+ * @author Damien Seguy <dams at nexen.net>
+ * @author Helgi Þormar Þorbjörnsson <dufuz at php.net>
+ * @copyright 1997-2005 Piotr Klaban, Damien Seguy, Helgi Þormar Þorbjörnsson,
+ * Pierre-Alain Joye
+ * @license http://www.opensource.org/licenses/bsd-license.php new BSD
+ * @version Release: @package_version@
+ * @link http://pear.php.net/package/Validate_ISPN
+ */
+class Validate_ISPN
+{
+ function isbn($isbn)
+ {
+ if (preg_match("/[^0-9 IXSBN-]/", $isbn)) {
+ return false;
+ }
+
+ $isbn = strtoupper($isbn);
+ $isbn = str_replace(array('ISBN', '-', ' ', "\t", "\n"), '', $isbn);
+
+ if (strlen($isbn) == 13) {
+ return Validate_ISPN::isbn13($isbn);
+ } elseif (strlen($isbn) == 10) {
+ return Validate_ISPN::isbn10($isbn);
+ } else {
+ return false;
+ }
+ }
+
+ /**
+ * Validate a ISBN 13 number
+ * The ISBN is a unique machine-readable identification number,
+ * which marks any book unmistakably.
+ *
+ * This function checks given number according
+ *
+ * Manual can be found at http://www.isbn-international.org
+ *
+ * @param string $isbn number (only numeric chars will be considered)
+ * @return bool true if number is valid, otherwise false
+ * @access public
+ * @author Helgi Þormar <dufuz at php.net>
+ * @author Piotr Klaban <makler at man.torun.pl>
+ */
+ function isbn13($isbn)
+ {
+ if (preg_match("/[^0-9 ISBN-]/", $isbn)) {
+ return false;
+ }
+
+ $isbn = strtoupper($isbn);
+ $isbn = str_replace(array('ISBN', '-', ' ', "\t", "\n"), '', $isbn);
+ if (!preg_match('/^[0-9]{13}$/', $isbn)) {
+ return false;
+ }
+
+ return Validate_ISPN::ean13($isbn);
+ }
+
+ /**
+ * Validate a ISBN 10 number
+ * The ISBN is a unique machine-readable identification number,
+ * which marks any book unmistakably.
+ *
+ * This function checks given number according
+ *
+ * Manual can be found at http://www.isbn-international.org
+ *
+ * @param string $isbn number (only numeric chars will be considered)
+ * @return bool true if number is valid, otherwise false
+ * @access public
+ * @author Damien Seguy <dams at nexen.net>
+ * @author Helgi Þormar <dufuz at php.net>
+ */
+ function isbn10($isbn)
+ {
+ static $weights_isbn = array(10,9,8,7,6,5,4,3,2);
+
+ if (preg_match("/[^0-9 IXSBN-]/", $isbn)) {
+ return false;
+ }
+
+ $isbn = strtoupper($isbn);
+ $isbn = str_replace(array('ISBN', '-', ' ', "\t", "\n"), '', $isbn);
+ if (strlen($isbn) != 10) {
+ return false;
+ }
+
+ if (!preg_match('/^[0-9]{9}[0-9X]$/', $isbn)) {
+ return false;
+ }
+
+ // Requires base class Validate
+ require_once 'Validate.php';
+ return Validate::_checkControlNumber($isbn, $weights_isbn, 11, 11);
+ }
+
+
+ /**
+ * Validate an ISSN (International Standard Serial Number)
+ *
+ * This function checks given ISSN number
+ * ISSN identifies periodical publications:
+ * http://www.issn.org
+ *
+ * @param string $issn number (only numeric chars will be considered)
+ * @return bool true if number is valid, otherwise false
+ * @access public
+ * @author Piotr Klaban <makler at man.torun.pl>
+ */
+ function issn($issn)
+ {
+ static $weights_issn = array(8,7,6,5,4,3,2);
+
+ $issn = strtoupper($issn);
+ $issn = str_replace(array('ISSN', '-', '/', ' ', "\t", "\n"), '', $issn);
+ $issn_num = str_replace('X', '0', $issn);
+
+ // check if this is an 8-digit number
+ if (!is_numeric($issn_num) || strlen($issn) != 8) {
+ return false;
+ }
+
+ // Requires base class Validate
+ require_once 'Validate.php';
+ return Validate::_checkControlNumber($issn, $weights_issn, 11, 11);
+ }
+
+ /**
+ * Validate a ISMN (International Standard Music Number)
+ *
+ * This function checks given ISMN number (ISO Standard 10957)
+ * ISMN identifies all printed music publications from all over the world
+ * whether available for sale, hire or gratis--whether a part, a score,
+ * or an element in a multi-media kit.
+ *
+ * Manual can be found at:
+ * http://www.ismn-international.org/
+ *
+ * @param string $ismn ISMN number
+ * @return bool true if number is valid, otherwise false
+ * @access public
+ * @author Piotr Klaban <makler at man.torun.pl>
+ */
+ function ismn($ismn)
+ {
+ static $weights_ismn = array(3,1,3,1,3,1,3,1,3);
+
+ $ismn = strtoupper($ismn);
+ $ismn = str_replace(array('ISMN', '-', '/', ' ', "\t", "\n"), '', $ismn);
+ // First char has to be M (after ISMN has been stripped if present)
+ if ($ismn{0} != 'M') {
+ return false;
+ }
+
+ // change M to 3
+ $ismn{0} = 3;
+
+ // check if this is a 10-digit number
+ if (!is_numeric($ismn) || strlen($ismn) != 10) {
+ return false;
+ }
+
+ // Requires base class Validate
+ require_once 'Validate.php';
+ return Validate::_checkControlNumber($ismn, $weights_ismn, 10, 10);
+ }
+
+ /**
+ * Validate a ISRC (International Standard Recording Code)
+ *
+ * This function validates an International Standard Recording Code
+ * which is the international identification system for sound recordings
+ * and music videorecordings.
+ *
+ * @param string $isrc ISRC number
+ * @return bool true if number is valid, otherwise false
+ * @see http://www.ifpi.org/isrc/isrc_handbook.html
+ * @access public
+ * @author David Grant <david at grant.org.uk>
+ */
+ function isrc($isrc)
+ {
+ $isrc = str_replace(array('ISRC', '-', ' '), '', strtoupper($isrc));
+ if (!preg_match("/[A-Z]{2}[A-Z0-9]{3}[0-9]{7}/", $isrc)) {
+ return false;
+ }
+
+ return true;
+ }
+
+ /**
+ * Validate a EAN/UCC-8 number
+ *
+ * This function checks given EAN8 number
+ * used to identify trade items and special applications.
+ * http://www.ean-ucc.org/
+ * http://www.uc-council.org/checkdig.htm
+ *
+ * @param string $ean number (only numeric chars will be considered)
+ * @return bool true if number is valid, otherwise false
+ * @access public
+ * @see Validate_ISPN::process()
+ * @author Piotr Klaban <makler at man.torun.pl>
+ */
+ function ean8($ean)
+ {
+ static $weights_ean8 = array(3,1,3,1,3,1,3);
+ return Validate_ISPN::process($ean, 8, $weights_ean8, 10, 10);
+ }
+
+ /**
+ * Validate a EAN/UCC-13 number
+ *
+ * This function checks given EAN/UCC-13 number used to identify
+ * trade items, locations, and special applications (e.g., coupons)
+ * http://www.ean-ucc.org/
+ * http://www.uc-council.org/checkdig.htm
+ *
+ * @param string $ean number (only numeric chars will be considered)
+ * @return bool true if number is valid, otherwise false
+ * @access public
+ * @see Validate_ISPN::process()
+ * @author Piotr Klaban <makler at man.torun.pl>
+ */
+ function ean13($ean)
+ {
+ static $weights_ean13 = array(1,3,1,3,1,3,1,3,1,3,1,3);
+ return Validate_ISPN::process($ean, 13, $weights_ean13, 10, 10);
+ }
+
+ /**
+ * Validate a EAN/UCC-14 number
+ *
+ * This function checks given EAN/UCC-14 number
+ * used to identify trade items.
+ * http://www.ean-ucc.org/
+ * http://www.uc-council.org/checkdig.htm
+ *
+ * @param string $ean number (only numeric chars will be considered)
+ * @return bool true if number is valid, otherwise false
+ * @access public
+ * @see Validate_ISPN::process()
+ * @author Piotr Klaban <makler at man.torun.pl>
+ */
+ function ean14($ean)
+ {
+ static $weights_ean14 = array(3,1,3,1,3,1,3,1,3,1,3,1,3);
+ return Validate_ISPN::process($ean, 14, $weights_ean14, 10, 10);
+ }
+
+ /**
+ * Validate a UCC-12 (U.P.C.) ID number
+ *
+ * This function checks given UCC-12 number used to identify
+ * trade items, locations, and special applications (e.g., * coupons)
+ * http://www.ean-ucc.org/
+ * http://www.uc-council.org/checkdig.htm
+ *
+ * @param string $ucc number (only numeric chars will be considered)
+ * @return bool true if number is valid, otherwise false
+ * @access public
+ * @see Validate_ISPN::process()
+ * @author Piotr Klaban <makler at man.torun.pl>
+ */
+ function ucc12($ucc)
+ {
+ static $weights_ucc12 = array(3,1,3,1,3,1,3,1,3,1,3);
+ return Validate_ISPN::process($ucc, 12, $weights_ucc12, 10, 10);
+ }
+
+ /**
+ * Validate a SSCC (Serial Shipping Container Code)
+ *
+ * This function checks given SSCC number
+ * used to identify logistic units.
+ * http://www.ean-ucc.org/
+ * http://www.uc-council.org/checkdig.htm
+ *
+ * @param string $sscc number (only numeric chars will be considered)
+ * @return bool true if number is valid, otherwise false
+ * @access public
+ * @see Validate_ISPN::process()
+ * @author Piotr Klaban <makler at man.torun.pl>
+ */
+ function sscc($sscc)
+ {
+ static $weights_sscc = array(3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3);
+ return Validate_ISPN::process($sscc, 18, $weights_sscc, 10, 10);
+ }
+
+ /**
+ * Does all the work for EAN8, EAN13, EAN14, UCC12 and SSCC
+ * and can be used for as base for similar kind of calculations
+ *
+ * @param int $data number (only numeric chars will be considered)
+ * @param int $lenght required length of number string
+ * @param int $modulo (optionsl) number
+ * @param int $subtract (optional) numbier
+ * @param array $weights holds the weight that will be used in calculations for the validation
+ * @return bool true if number is valid, otherwise false
+ * @access public
+ * @see Validate::_checkControlNumber()
+ */
+ function process($data, $length, &$weights, $modulo = 10, $subtract = 0)
+ {
+ //$weights = array(3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3);
+ //$weights = array_slice($weights, 0, $length);
+
+ $data = str_replace(array('-', '/', ' ', "\t", "\n"), '', $data);
+
+ // check if this is a digit number and is the right length
+ if (!is_numeric($data) || strlen($data) != $length) {
+ return false;
+ }
+
+ // Requires base class Validate
+ require_once 'Validate.php';
+ return Validate::_checkControlNumber($data, $weights, $modulo, $subtract);
+ }
+}
+?>
Deleted: trunk/lib/Validate/Validate.php
===================================================================
--- branches/sucs-site/lib/Validate/Validate.php 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/lib/Validate/Validate.php 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,762 +0,0 @@
-<?php
-/* vim: set expandtab tabstop=4 shiftwidth=4: */
-// +----------------------------------------------------------------------+
-// | Copyright (c) 1997-2005 Pierre-Alain Joye,Tomas V.V.Cox |
-// +----------------------------------------------------------------------+
-// | This source file is subject to the New BSD license, That is bundled |
-// | with this package in the file LICENSE, and is available through |
-// | the world-wide-web at |
-// | http://www.opensource.org/licenses/bsd-license.php |
-// | If you did not receive a copy of the new BSDlicense and are unable |
-// | to obtain it through the world-wide-web, please send a note to |
-// | pajoye at php.net so we can mail you a copy immediately. |
-// +----------------------------------------------------------------------+
-// | Author: Tomas V.V.Cox <cox at idecnet.com> |
-// | Pierre-Alain Joye <pajoye at php.net> |
-// +----------------------------------------------------------------------+
-//
-/**
- * Validation class
- *
- * Package to validate various datas. It includes :
- * - numbers (min/max, decimal or not)
- * - email (syntax, domain check)
- * - string (predifined type alpha upper and/or lowercase, numeric,...)
- * - date (min, max)
- * - uri (RFC2396)
- * - possibility valid multiple data with a single method call (::multiple)
- *
- * @category Validate
- * @package Validate
- * @author Tomas V.V.Cox <cox at idecnet.com>
- * @author Pierre-Alain Joye <pajoye at php.net>
- * @copyright 1997-2005 Pierre-Alain Joye,Tomas V.V.Cox
- * @license http://www.opensource.org/licenses/bsd-license.php New BSD License
- * @version CVS: $Id: Validate.php,v 1.94 2006/07/31 11:53:22 amir Exp $
- * @link http://pear.php.net/package/Validate
- */
-
-/**
- * Methods for common data validations
- */
-define('VALIDATE_NUM', '0-9');
-define('VALIDATE_SPACE', '\s');
-define('VALIDATE_ALPHA_LOWER', 'a-z');
-define('VALIDATE_ALPHA_UPPER', 'A-Z');
-define('VALIDATE_ALPHA', VALIDATE_ALPHA_LOWER . VALIDATE_ALPHA_UPPER);
-define('VALIDATE_EALPHA_LOWER', VALIDATE_ALPHA_LOWER . 'áéíóúàèìòùäëïöüâêîôûñçþæðå');
-define('VALIDATE_EALPHA_UPPER', VALIDATE_ALPHA_UPPER . 'ÁÉÍÓÚÀÈÌÒÙÄËÏÖÜÂÊÎÔÛÑÇÞÆÐÅ');
-define('VALIDATE_EALPHA', VALIDATE_EALPHA_LOWER . VALIDATE_EALPHA_UPPER);
-define('VALIDATE_PUNCTUATION', VALIDATE_SPACE . '\.,;\:&"\'\?\!\(\)');
-define('VALIDATE_NAME', VALIDATE_EALPHA . VALIDATE_SPACE . "'");
-define('VALIDATE_STREET', VALIDATE_NAME . "/\\ºª\.");
-
-/**
- * Validation class
- *
- * Package to validate various datas. It includes :
- * - numbers (min/max, decimal or not)
- * - email (syntax, domain check)
- * - string (predifined type alpha upper and/or lowercase, numeric,...)
- * - date (min, max)
- * - uri (RFC2396)
- * - possibility valid multiple data with a single method call (::multiple)
- *
- * @category Validate
- * @package Validate
- * @author Tomas V.V.Cox <cox at idecnet.com>
- * @author Pierre-Alain Joye <pajoye at php.net>
- * @copyright 1997-2005 Pierre-Alain Joye,Tomas V.V.Cox
- * @license http://www.opensource.org/licenses/bsd-license.php New BSD License
- * @version Release: @package_version@
- * @link http://pear.php.net/package/Validate
- */
-class Validate
-{
- /**
- * Validate a number
- *
- * @param string $number Number to validate
- * @param array $options array where:
- * 'decimal' is the decimal char or false when decimal not allowed
- * i.e. ',.' to allow both ',' and '.'
- * 'dec_prec' Number of allowed decimals
- * 'min' minimum value
- * 'max' maximum value
- *
- * @return boolean true if valid number, false if not
- *
- * @access public
- */
- function number($number, $options = array())
- {
- $decimal = $dec_prec = $min = $max = null;
- if (is_array($options)) {
- extract($options);
- }
-
- $dec_prec = $dec_prec ? "{1,$dec_prec}" : '+';
- $dec_regex = $decimal ? "[$decimal][0-9]$dec_prec" : '';
-
- if (!preg_match("|^[-+]?\s*[0-9]+($dec_regex)?\$|", $number)) {
- return false;
- }
-
- if ($decimal != '.') {
- $number = strtr($number, $decimal, '.');
- }
-
- $number = (float)str_replace(' ', '', $number);
- if ($min !== null && $min > $number) {
- return false;
- }
-
- if ($max !== null && $max < $number) {
- return false;
- }
- return true;
- }
-
- /**
- * Converting a string to UTF-7 (RFC 2152)
- *
- * @param $string string to be converted
- *
- * @return string converted string
- *
- * @access private
- */
- function __stringToUtf7($string) {
- $utf7 = array(
- 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K',
- 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V',
- 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g',
- 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r',
- 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2',
- '3', '4', '5', '6', '7', '8', '9', '+', ','
- );
-
- $state = 0;
- if (!empty($string)) {
- $i = 0;
- while ($i <= strlen($string)) {
- $char = substr($string, $i, 1);
- if ($state == 0) {
- if ((ord($char) >= 0x7F) || (ord($char) <= 0x1F)) {
- if ($char) {
- $return .= '&';
- }
- $state = 1;
- } elseif ($char == '&') {
- $return .= '&-';
- } else {
- $return .= $char;
- }
- } elseif (($i == strlen($string) ||
- !((ord($char) >= 0x7F)) || (ord($char) <= 0x1F))) {
- if ($state != 1) {
- $return .= $utf7[ord($char)];
- }
- $return .= '-';
- $state = 0;
- } else {
- switch($state) {
- case 1:
- $return .= $utf7[ord($char) >> 2];
- $residue = (ord($char) & 0x03) << 4;
- $state = 2;
- break;
- case 2:
- $return .= $utf7[$residue | (ord($char) >> 4)];
- $residue = (ord($char) & 0x0F) << 2;
- $state = 3;
- break;
- case 3:
- $return .= $utf7[$residue | (ord($char) >> 6)];
- $return .= $utf7[ord($char) & 0x3F];
- $state = 1;
- break;
- }
- }
- $i++;
- }
- return $return;
- }
- return '';
- }
-
- /**
- * Validate an email according to full RFC822 (inclusive human readable part)
- *
- * @param string $email email to validate,
- * will return the address for optional dns validation
- * @param array $options email() options
- *
- * @return boolean true if valid email, false if not
- *
- * @access private
- */
- function __emailRFC822(&$email, &$options)
- {
- if (Validate::__stringToUtf7($email) != $email) {
- return false;
- }
- static $address = null;
- static $uncomment = null;
- if (!$address) {
- // atom = 1*<any CHAR except specials, SPACE and CTLs>
- $atom = '[^][()<>@,;:\\".\s\000-\037\177-\377]+\s*';
- // qtext = <any CHAR excepting <">, ; => may be folded
- // "\" & CR, and including linear-white-space>
- $qtext = '[^"\\\\\r]';
- // quoted-pair = "\" CHAR ; may quote any char
- $quoted_pair = '\\\\.';
- // quoted-string = <"> *(qtext/quoted-pair) <">; Regular qtext or
- // ; quoted chars.
- $quoted_string = '"(?:' . $qtext . '|' . $quoted_pair . ')*"\s*';
- // word = atom / quoted-string
- $word = '(?:' . $atom . '|' . $quoted_string . ')';
- // local-part = word *("." word) ; uninterpreted
- // ; case-preserved
- $local_part = $word . '(?:\.\s*' . $word . ')*';
- // dtext = <any CHAR excluding "[", ; => may be folded
- // "]", "\" & CR, & including linear-white-space>
- $dtext = '[^][\\\\\r]';
- // domain-literal = "[" *(dtext / quoted-pair) "]"
- $domain_literal = '\[(?:' . $dtext . '|' . $quoted_pair . ')*\]\s*';
- // sub-domain = domain-ref / domain-literal
- // domain-ref = atom ; symbolic reference
- $sub_domain = '(?:' . $atom . '|' . $domain_literal . ')';
- // domain = sub-domain *("." sub-domain)
- $domain = $sub_domain . '(?:\.\s*' . $sub_domain . ')*';
- // addr-spec = local-part "@" domain ; global address
- $addr_spec = $local_part . '@\s*' . $domain;
- // route = 1#("@" domain) ":" ; path-relative
- $route = '@' . $domain . '(?:,@\s*' . $domain . ')*:\s*';
- // route-addr = "<" [route] addr-spec ">"
- $route_addr = '<\s*(?:' . $route . ')?' . $addr_spec . '>\s*';
- // phrase = 1*word ; Sequence of words
- $phrase = $word . '+';
- // mailbox = addr-spec ; simple address
- // / phrase route-addr ; name & addr-spec
- $mailbox = '(?:' . $addr_spec . '|' . $phrase . $route_addr . ')';
- // group = phrase ":" [#mailbox] ";"
- $group = $phrase . ':\s*(?:' . $mailbox . '(?:,\s*' . $mailbox . ')*)?;\s*';
- // address = mailbox ; one addressee
- // / group ; named list
- $address = '/^\s*(?:' . $mailbox . '|' . $group . ')$/';
- $uncomment =
- '/((?:(?:\\\\"|[^("])*(?:' . $quoted_string .
- ')?)*)((?<!\\\\)\((?:(?2)|.)*?(?<!\\\\)\))/';
- }
- // strip comments
- $email = preg_replace($uncomment, '$1 ', $email);
- return preg_match($address, $email);
- }
-
- /**
- * Validate an email
- *
- * @param string $email email to validate
- * @param mixed boolean (BC) $check_domain Check or not if the domain exists
- * array $options associative array of options
- * 'check_domain' boolean Check or not if the domain exists
- * 'use_rfc822' boolean Apply the full RFC822 grammar
- *
- * @return boolean true if valid email, false if not
- *
- * @access public
- */
- function email($email, $options = null)
- {
- $check_domain = false;
- $use_rfc822 = false;
- if (is_bool($options)) {
- $check_domain = $options;
- } elseif (is_array($options)) {
- extract($options);
- }
-
- // the base regexp for address
- $regex = '&^(?: # recipient:
- ("\s*(?:[^"\f\n\r\t\v\b\s]+\s*)+")| #1 quoted name
- ([-\w!\#\$%\&\'*+~/^`|{}]+(?:\.[-\w!\#\$%\&\'*+~/^`|{}]+)*)) #2 OR dot-atom
- @(((\[)? #3 domain, 4 as IPv4, 5 optionally bracketed
- (?:(?:(?:(?:25[0-5])|(?:2[0-4][0-9])|(?:[0-1]?[0-9]?[0-9]))\.){3}
- (?:(?:25[0-5])|(?:2[0-4][0-9])|(?:[0-1]?[0-9]?[0-9]))))(?(5)\])|
- ((?:[a-z0-9](?:[-a-z0-9]*[a-z0-9])?\.)*[a-z](?:[-a-z0-9]*[a-z0-9])?) #6 domain as hostname
- \.((?:([^-])[-a-z]*[-a-z])?)) #7 ICANN domain names
- $&xi';
-
- if ($use_rfc822? Validate::__emailRFC822($email, $options) :
- preg_match($regex, $email)) {
- if ($check_domain && function_exists('checkdnsrr')) {
- list (, $domain) = explode('@', $email);
- if (checkdnsrr($domain, 'MX') || checkdnsrr($domain, 'A')) {
- return true;
- }
- return false;
- }
- return true;
- }
- return false;
- }
-
- /**
- * Validate a string using the given format 'format'
- *
- * @param string $string String to validate
- * @param array $options Options array where:
- * 'format' is the format of the string
- * Ex: VALIDATE_NUM . VALIDATE_ALPHA (see constants)
- * 'min_length' minimum length
- * 'max_length' maximum length
- *
- * @return boolean true if valid string, false if not
- *
- * @access public
- */
- function string($string, $options)
- {
- $format = null;
- $min_length = $max_length = 0;
- if (is_array($options)) {
- extract($options);
- }
- if ($format && !preg_match("|^[$format]*\$|s", $string)) {
- return false;
- }
- if ($min_length && strlen($string) < $min_length) {
- return false;
- }
- if ($max_length && strlen($string) > $max_length) {
- return false;
- }
- return true;
- }
-
- /**
- * Validate an URI (RFC2396)
- * This function will validate 'foobarstring' by default, to get it to validate
- * only http, https, ftp and such you have to pass it in the allowed_schemes
- * option, like this:
- * <code>
- * $options = array('allowed_schemes' => array('http', 'https', 'ftp'))
- * var_dump(Validate::uri('http://www.example.org'), $options);
- * </code>
- *
- * NOTE 1: The rfc2396 normally allows middle '-' in the top domain
- * e.g. http://example.co-m should be valid
- * However, as '-' is not used in any known TLD, it is invalid
- * NOTE 2: As double shlashes // are allowed in the path part, only full URIs
- * including an authority can be valid, no relative URIs
- * the // are mandatory (optionally preceeded by the 'sheme:' )
- * NOTE 3: the full complience to rfc2396 is not achieved by default
- * the characters ';/?:@$,' will not be accepted in the query part
- * if not urlencoded, refer to the option "strict'"
- *
- * @param string $url URI to validate
- * @param array $options Options used by the validation method.
- * key => type
- * 'domain_check' => boolean
- * Whether to check the DNS entry or not
- * 'allowed_schemes' => array, list of protocols
- * List of allowed schemes ('http',
- * 'ssh+svn', 'mms')
- * 'strict' => string the refused chars
- * in query and fragment parts
- * default: ';/?:@$,'
- * empty: accept all rfc2396 foreseen chars
- *
- * @return boolean true if valid uri, false if not
- *
- * @access public
- */
- function uri($url, $options = null)
- {
- $strict = ';/?:@$,';
- $domain_check = false;
- $allowed_schemes = null;
- if (is_array($options)) {
- extract($options);
- }
- if (preg_match(
- '&^(?:([a-z][-+.a-z0-9]*):)? # 1. scheme
- (?:// # authority start
- (?:((?:%[0-9a-f]{2}|[-a-z0-9_.!~*\'();:\&=+$,])*)@)? # 2. authority-userinfo
- (?:((?:[a-z0-9](?:[-a-z0-9]*[a-z0-9])?\.)*[a-z](?:[a-z0-9]+)?\.?) # 3. authority-hostname OR
- |([0-9]{1,3}(?:\.[0-9]{1,3}){3})) # 4. authority-ipv4
- (?::([0-9]*))?) # 5. authority-port
- ((?:/(?:%[0-9a-f]{2}|[-a-z0-9_.!~*\'():@\&=+$,;])*)*/?)? # 6. path
- (?:\?([^#]*))? # 7. query
- (?:\#((?:%[0-9a-f]{2}|[-a-z0-9_.!~*\'();/?:@\&=+$,])*))? # 8. fragment
- $&xi', $url, $matches)) {
- $scheme = isset($matches[1]) ? $matches[1] : '';
- $authority = isset($matches[3]) ? $matches[3] : '' ;
- if (is_array($allowed_schemes) &&
- !in_array($scheme,$allowed_schemes)
- ) {
- return false;
- }
- if (!empty($matches[4])) {
- $parts = explode('.', $matches[4]);
- foreach ($parts as $part) {
- if ($part > 255) {
- return false;
- }
- }
- } elseif ($domain_check && function_exists('checkdnsrr')) {
- if (!checkdnsrr($authority, 'A')) {
- return false;
- }
- }
- if ($strict) {
- $strict = '#[' . preg_quote($strict, '#') . ']#';
- if ((!empty($matches[7]) && preg_match($strict, $matches[7]))
- || (!empty($matches[8]) && preg_match($strict, $matches[8]))) {
- return false;
- }
- }
- return true;
- }
- return false;
- }
-
- /**
- * Validate date and times. Note that this method need the Date_Calc class
- *
- * @param string $date Date to validate
- * @param array $options array options where :
- * 'format' The format of the date (%d-%m-%Y)
- * 'min' The date has to be greater
- * than this array($day, $month, $year)
- * or PEAR::Date object
- * 'max' The date has to be smaller than
- * this array($day, $month, $year)
- * or PEAR::Date object
- *
- * @return boolean true if valid date/time, false if not
- *
- * @access public
- */
- function date($date, $options)
- {
- $max = $min = false;
- $format = '';
- if (is_array($options)) {
- extract($options);
- }
-
- $date_len = strlen($format);
- for ($i = 0; $i < $date_len; $i++) {
- $c = $format{$i};
- if ($c == '%') {
- $next = $format{$i + 1};
- switch ($next) {
- case 'j':
- case 'd':
- if ($next == 'j') {
- $day = (int)Validate::_substr($date, 1, 2);
- } else {
- $day = (int)Validate::_substr($date, 2);
- }
- if ($day < 1 || $day > 31) {
- return false;
- }
- break;
- case 'm':
- case 'n':
- if ($next == 'm') {
- $month = (int)Validate::_substr($date, 2);
- } else {
- $month = (int)Validate::_substr($date, 1, 2);
- }
- if ($month < 1 || $month > 12) {
- return false;
- }
- break;
- case 'Y':
- case 'y':
- if ($next == 'Y') {
- $year = Validate::_substr($date, 4);
- $year = (int)$year?$year:'';
- } else {
- $year = (int)(substr(date('Y'), 0, 2) .
- Validate::_substr($date, 2));
- }
- if (strlen($year) != 4 || $year < 0 || $year > 9999) {
- return false;
- }
- break;
- case 'g':
- case 'h':
- if ($next == 'g') {
- $hour = Validate::_substr($date, 1, 2);
- } else {
- $hour = Validate::_substr($date, 2);
- }
- if ($hour < 0 || $hour > 12) {
- return false;
- }
- break;
- case 'G':
- case 'H':
- if ($next == 'G') {
- $hour = Validate::_substr($date, 1, 2);
- } else {
- $hour = Validate::_substr($date, 2);
- }
- if ($hour < 0 || $hour > 24) {
- return false;
- }
- break;
- case 's':
- case 'i':
- $t = Validate::_substr($date, 2);
- if ($t < 0 || $t > 59) {
- return false;
- }
- break;
- default:
- trigger_error("Not supported char `$next' after % in offset " . ($i+2), E_USER_WARNING);
- }
- $i++;
- } else {
- //literal
- if (Validate::_substr($date, 1) != $c) {
- return false;
- }
- }
- }
- // there is remaing data, we don't want it
- if (strlen($date)) {
- return false;
- }
-
- if (isset($day) && isset($month) && isset($year)) {
- if (!checkdate($month, $day, $year)) {
- return false;
- }
-
- if ($min) {
- include_once 'Date/Calc.php';
- if (is_a($min, 'Date') &&
- (Date_Calc::compareDates($day, $month, $year,
- $min->getDay(), $min->getMonth(), $min->getYear()) < 0))
- {
- return false;
- } elseif (is_array($min) &&
- (Date_Calc::compareDates($day, $month, $year,
- $min[0], $min[1], $min[2]) < 0))
- {
- return false;
- }
- }
-
- if ($max) {
- include_once 'Date/Calc.php';
- if (is_a($max, 'Date') &&
- (Date_Calc::compareDates($day, $month, $year,
- $max->getDay(), $max->getMonth(), $max->getYear()) > 0))
- {
- return false;
- } elseif (is_array($max) &&
- (Date_Calc::compareDates($day, $month, $year,
- $max[0], $max[1], $max[2]) > 0))
- {
- return false;
- }
- }
- }
-
- return true;
- }
-
- function _substr(&$date, $num, $opt = false)
- {
- if ($opt && strlen($date) >= $opt && preg_match('/^[0-9]{'.$opt.'}/', $date, $m)) {
- $ret = $m[0];
- } else {
- $ret = substr($date, 0, $num);
- }
- $date = substr($date, strlen($ret));
- return $ret;
- }
-
- function _modf($val, $div) {
- if (function_exists('bcmod')) {
- return bcmod($val, $div);
- } elseif (function_exists('fmod')) {
- return fmod($val, $div);
- }
- $r = $val / $div;
- $i = intval($r);
- return intval($val - $i * $div + .1);
- }
-
- /**
- * Calculates sum of product of number digits with weights
- *
- * @param string $number number string
- * @param array $weights reference to array of weights
- *
- * @returns int returns product of number digits with weights
- *
- * @access protected
- */
- function _multWeights($number, &$weights) {
- if (!is_array($weights)) {
- return -1;
- }
- $sum = 0;
-
- $count = min(count($weights), strlen($number));
- if ($count == 0) { // empty string or weights array
- return -1;
- }
- for ($i = 0; $i < $count; ++$i) {
- $sum += intval(substr($number, $i, 1)) * $weights[$i];
- }
-
- return $sum;
- }
-
- /**
- * Calculates control digit for a given number
- *
- * @param string $number number string
- * @param array $weights reference to array of weights
- * @param int $modulo (optionsl) number
- * @param int $subtract (optional) number
- * @param bool $allow_high (optional) true if function can return number higher than 10
- *
- * @returns int -1 calculated control number is returned
- *
- * @access protected
- */
- function _getControlNumber($number, &$weights, $modulo = 10, $subtract = 0, $allow_high = false) {
- // calc sum
- $sum = Validate::_multWeights($number, $weights);
- if ($sum == -1) {
- return -1;
- }
- $mod = Validate::_modf($sum, $modulo); // calculate control digit
-
- if ($subtract > $mod && $mod > 0) {
- $mod = $subtract - $mod;
- }
- if ($allow_high === false) {
- $mod %= 10; // change 10 to zero
- }
- return $mod;
- }
-
- /**
- * Validates a number
- *
- * @param string $number number to validate
- * @param array $weights reference to array of weights
- * @param int $modulo (optionsl) number
- * @param int $subtract (optional) numbier
- *
- * @returns bool true if valid, false if not
- *
- * @access protected
- */
- function _checkControlNumber($number, &$weights, $modulo = 10, $subtract = 0) {
- if (strlen($number) < count($weights)) {
- return false;
- }
- $target_digit = substr($number, count($weights), 1);
- $control_digit = Validate::_getControlNumber($number, $weights, $modulo, $subtract, $target_digit === 'X');
-
- if ($control_digit == -1) {
- return false;
- }
- if ($target_digit === 'X' && $control_digit == 10) {
- return true;
- }
- if ($control_digit != $target_digit) {
- return false;
- }
- return true;
- }
-
- /**
- * Bulk data validation for data introduced in the form of an
- * assoc array in the form $var_name => $value.
- * Can be used on any of Validate subpackages
- *
- * @param array $data Ex: array('name' => 'toto', 'email' => 'toto at thing.info');
- * @param array $val_type Contains the validation type and all parameters used in.
- * 'val_type' is not optional
- * others validations properties must have the same name as the function
- * parameters.
- * Ex: array('toto'=>array('type'=>'string','format'='toto at thing.info','min_length'=>5));
- * @param boolean $remove if set, the elements not listed in data will be removed
- *
- * @return array value name => true|false the value name comes from the data key
- *
- * @access public
- */
- function multiple(&$data, &$val_type, $remove = false)
- {
- $keys = array_keys($data);
- $valid = array();
- foreach ($keys as $var_name) {
- if (!isset($val_type[$var_name])) {
- if ($remove) {
- unset($data[$var_name]);
- }
- continue;
- }
- $opt = $val_type[$var_name];
- $methods = get_class_methods('Validate');
- $val2check = $data[$var_name];
- // core validation method
- if (in_array(strtolower($opt['type']), $methods)) {
- //$opt[$opt['type']] = $data[$var_name];
- $method = $opt['type'];
- unset($opt['type']);
-
- if (sizeof($opt) == 1) {
- $opt = array_pop($opt);
- }
- $valid[$var_name] = call_user_func(array('Validate', $method), $val2check, $opt);
-
- /**
- * external validation method in the form:
- * "<class name><underscore><method name>"
- * Ex: us_ssn will include class Validate/US.php and call method ssn()
- */
- } elseif (strpos($opt['type'], '_') !== false) {
- $validateType = explode('_', $opt['type']);
- $method = array_pop($validateType);
- $class = implode('_', $validateType);
- $classPath = str_replace('_', DIRECTORY_SEPARATOR, $class);
- $class = 'Validate_' . $class;
- if (!@include_once "Validate/$classPath.php") {
- trigger_error("$class isn't installed or you may have some permissoin issues", E_USER_ERROR);
- }
-
- $ce = substr(phpversion(), 0, 1) > 4 ? class_exists($class, false) : class_exists($class);
- if (!$ce ||
- !in_array($method, get_class_methods($class)))
- {
- trigger_error("Invalid validation type $class::$method", E_USER_WARNING);
- continue;
- }
- unset($opt['type']);
- if (sizeof($opt) == 1) {
- $opt = array_pop($opt);
- }
- $valid[$var_name] = call_user_func(array($class, $method), $data[$var_name], $opt);
- } else {
- trigger_error("Invalid validation type {$opt['type']}", E_USER_WARNING);
- }
- }
- return $valid;
- }
-}
-
-?>
Copied: trunk/lib/Validate/Validate.php (from rev 656, branches/sucs-site/lib/Validate/Validate.php)
===================================================================
--- trunk/lib/Validate/Validate.php (rev 0)
+++ trunk/lib/Validate/Validate.php 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,762 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4: */
+// +----------------------------------------------------------------------+
+// | Copyright (c) 1997-2005 Pierre-Alain Joye,Tomas V.V.Cox |
+// +----------------------------------------------------------------------+
+// | This source file is subject to the New BSD license, That is bundled |
+// | with this package in the file LICENSE, and is available through |
+// | the world-wide-web at |
+// | http://www.opensource.org/licenses/bsd-license.php |
+// | If you did not receive a copy of the new BSDlicense and are unable |
+// | to obtain it through the world-wide-web, please send a note to |
+// | pajoye at php.net so we can mail you a copy immediately. |
+// +----------------------------------------------------------------------+
+// | Author: Tomas V.V.Cox <cox at idecnet.com> |
+// | Pierre-Alain Joye <pajoye at php.net> |
+// +----------------------------------------------------------------------+
+//
+/**
+ * Validation class
+ *
+ * Package to validate various datas. It includes :
+ * - numbers (min/max, decimal or not)
+ * - email (syntax, domain check)
+ * - string (predifined type alpha upper and/or lowercase, numeric,...)
+ * - date (min, max)
+ * - uri (RFC2396)
+ * - possibility valid multiple data with a single method call (::multiple)
+ *
+ * @category Validate
+ * @package Validate
+ * @author Tomas V.V.Cox <cox at idecnet.com>
+ * @author Pierre-Alain Joye <pajoye at php.net>
+ * @copyright 1997-2005 Pierre-Alain Joye,Tomas V.V.Cox
+ * @license http://www.opensource.org/licenses/bsd-license.php New BSD License
+ * @version CVS: $Id: Validate.php,v 1.94 2006/07/31 11:53:22 amir Exp $
+ * @link http://pear.php.net/package/Validate
+ */
+
+/**
+ * Methods for common data validations
+ */
+define('VALIDATE_NUM', '0-9');
+define('VALIDATE_SPACE', '\s');
+define('VALIDATE_ALPHA_LOWER', 'a-z');
+define('VALIDATE_ALPHA_UPPER', 'A-Z');
+define('VALIDATE_ALPHA', VALIDATE_ALPHA_LOWER . VALIDATE_ALPHA_UPPER);
+define('VALIDATE_EALPHA_LOWER', VALIDATE_ALPHA_LOWER . 'áéíóúàèìòùäëïöüâêîôûñçþæðå');
+define('VALIDATE_EALPHA_UPPER', VALIDATE_ALPHA_UPPER . 'ÁÉÍÓÚÀÈÌÒÙÄËÏÖÜÂÊÎÔÛÑÇÞÆÐÅ');
+define('VALIDATE_EALPHA', VALIDATE_EALPHA_LOWER . VALIDATE_EALPHA_UPPER);
+define('VALIDATE_PUNCTUATION', VALIDATE_SPACE . '\.,;\:&"\'\?\!\(\)');
+define('VALIDATE_NAME', VALIDATE_EALPHA . VALIDATE_SPACE . "'");
+define('VALIDATE_STREET', VALIDATE_NAME . "/\\ºª\.");
+
+/**
+ * Validation class
+ *
+ * Package to validate various datas. It includes :
+ * - numbers (min/max, decimal or not)
+ * - email (syntax, domain check)
+ * - string (predifined type alpha upper and/or lowercase, numeric,...)
+ * - date (min, max)
+ * - uri (RFC2396)
+ * - possibility valid multiple data with a single method call (::multiple)
+ *
+ * @category Validate
+ * @package Validate
+ * @author Tomas V.V.Cox <cox at idecnet.com>
+ * @author Pierre-Alain Joye <pajoye at php.net>
+ * @copyright 1997-2005 Pierre-Alain Joye,Tomas V.V.Cox
+ * @license http://www.opensource.org/licenses/bsd-license.php New BSD License
+ * @version Release: @package_version@
+ * @link http://pear.php.net/package/Validate
+ */
+class Validate
+{
+ /**
+ * Validate a number
+ *
+ * @param string $number Number to validate
+ * @param array $options array where:
+ * 'decimal' is the decimal char or false when decimal not allowed
+ * i.e. ',.' to allow both ',' and '.'
+ * 'dec_prec' Number of allowed decimals
+ * 'min' minimum value
+ * 'max' maximum value
+ *
+ * @return boolean true if valid number, false if not
+ *
+ * @access public
+ */
+ function number($number, $options = array())
+ {
+ $decimal = $dec_prec = $min = $max = null;
+ if (is_array($options)) {
+ extract($options);
+ }
+
+ $dec_prec = $dec_prec ? "{1,$dec_prec}" : '+';
+ $dec_regex = $decimal ? "[$decimal][0-9]$dec_prec" : '';
+
+ if (!preg_match("|^[-+]?\s*[0-9]+($dec_regex)?\$|", $number)) {
+ return false;
+ }
+
+ if ($decimal != '.') {
+ $number = strtr($number, $decimal, '.');
+ }
+
+ $number = (float)str_replace(' ', '', $number);
+ if ($min !== null && $min > $number) {
+ return false;
+ }
+
+ if ($max !== null && $max < $number) {
+ return false;
+ }
+ return true;
+ }
+
+ /**
+ * Converting a string to UTF-7 (RFC 2152)
+ *
+ * @param $string string to be converted
+ *
+ * @return string converted string
+ *
+ * @access private
+ */
+ function __stringToUtf7($string) {
+ $utf7 = array(
+ 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K',
+ 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V',
+ 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g',
+ 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r',
+ 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2',
+ '3', '4', '5', '6', '7', '8', '9', '+', ','
+ );
+
+ $state = 0;
+ if (!empty($string)) {
+ $i = 0;
+ while ($i <= strlen($string)) {
+ $char = substr($string, $i, 1);
+ if ($state == 0) {
+ if ((ord($char) >= 0x7F) || (ord($char) <= 0x1F)) {
+ if ($char) {
+ $return .= '&';
+ }
+ $state = 1;
+ } elseif ($char == '&') {
+ $return .= '&-';
+ } else {
+ $return .= $char;
+ }
+ } elseif (($i == strlen($string) ||
+ !((ord($char) >= 0x7F)) || (ord($char) <= 0x1F))) {
+ if ($state != 1) {
+ $return .= $utf7[ord($char)];
+ }
+ $return .= '-';
+ $state = 0;
+ } else {
+ switch($state) {
+ case 1:
+ $return .= $utf7[ord($char) >> 2];
+ $residue = (ord($char) & 0x03) << 4;
+ $state = 2;
+ break;
+ case 2:
+ $return .= $utf7[$residue | (ord($char) >> 4)];
+ $residue = (ord($char) & 0x0F) << 2;
+ $state = 3;
+ break;
+ case 3:
+ $return .= $utf7[$residue | (ord($char) >> 6)];
+ $return .= $utf7[ord($char) & 0x3F];
+ $state = 1;
+ break;
+ }
+ }
+ $i++;
+ }
+ return $return;
+ }
+ return '';
+ }
+
+ /**
+ * Validate an email according to full RFC822 (inclusive human readable part)
+ *
+ * @param string $email email to validate,
+ * will return the address for optional dns validation
+ * @param array $options email() options
+ *
+ * @return boolean true if valid email, false if not
+ *
+ * @access private
+ */
+ function __emailRFC822(&$email, &$options)
+ {
+ if (Validate::__stringToUtf7($email) != $email) {
+ return false;
+ }
+ static $address = null;
+ static $uncomment = null;
+ if (!$address) {
+ // atom = 1*<any CHAR except specials, SPACE and CTLs>
+ $atom = '[^][()<>@,;:\\".\s\000-\037\177-\377]+\s*';
+ // qtext = <any CHAR excepting <">, ; => may be folded
+ // "\" & CR, and including linear-white-space>
+ $qtext = '[^"\\\\\r]';
+ // quoted-pair = "\" CHAR ; may quote any char
+ $quoted_pair = '\\\\.';
+ // quoted-string = <"> *(qtext/quoted-pair) <">; Regular qtext or
+ // ; quoted chars.
+ $quoted_string = '"(?:' . $qtext . '|' . $quoted_pair . ')*"\s*';
+ // word = atom / quoted-string
+ $word = '(?:' . $atom . '|' . $quoted_string . ')';
+ // local-part = word *("." word) ; uninterpreted
+ // ; case-preserved
+ $local_part = $word . '(?:\.\s*' . $word . ')*';
+ // dtext = <any CHAR excluding "[", ; => may be folded
+ // "]", "\" & CR, & including linear-white-space>
+ $dtext = '[^][\\\\\r]';
+ // domain-literal = "[" *(dtext / quoted-pair) "]"
+ $domain_literal = '\[(?:' . $dtext . '|' . $quoted_pair . ')*\]\s*';
+ // sub-domain = domain-ref / domain-literal
+ // domain-ref = atom ; symbolic reference
+ $sub_domain = '(?:' . $atom . '|' . $domain_literal . ')';
+ // domain = sub-domain *("." sub-domain)
+ $domain = $sub_domain . '(?:\.\s*' . $sub_domain . ')*';
+ // addr-spec = local-part "@" domain ; global address
+ $addr_spec = $local_part . '@\s*' . $domain;
+ // route = 1#("@" domain) ":" ; path-relative
+ $route = '@' . $domain . '(?:,@\s*' . $domain . ')*:\s*';
+ // route-addr = "<" [route] addr-spec ">"
+ $route_addr = '<\s*(?:' . $route . ')?' . $addr_spec . '>\s*';
+ // phrase = 1*word ; Sequence of words
+ $phrase = $word . '+';
+ // mailbox = addr-spec ; simple address
+ // / phrase route-addr ; name & addr-spec
+ $mailbox = '(?:' . $addr_spec . '|' . $phrase . $route_addr . ')';
+ // group = phrase ":" [#mailbox] ";"
+ $group = $phrase . ':\s*(?:' . $mailbox . '(?:,\s*' . $mailbox . ')*)?;\s*';
+ // address = mailbox ; one addressee
+ // / group ; named list
+ $address = '/^\s*(?:' . $mailbox . '|' . $group . ')$/';
+ $uncomment =
+ '/((?:(?:\\\\"|[^("])*(?:' . $quoted_string .
+ ')?)*)((?<!\\\\)\((?:(?2)|.)*?(?<!\\\\)\))/';
+ }
+ // strip comments
+ $email = preg_replace($uncomment, '$1 ', $email);
+ return preg_match($address, $email);
+ }
+
+ /**
+ * Validate an email
+ *
+ * @param string $email email to validate
+ * @param mixed boolean (BC) $check_domain Check or not if the domain exists
+ * array $options associative array of options
+ * 'check_domain' boolean Check or not if the domain exists
+ * 'use_rfc822' boolean Apply the full RFC822 grammar
+ *
+ * @return boolean true if valid email, false if not
+ *
+ * @access public
+ */
+ function email($email, $options = null)
+ {
+ $check_domain = false;
+ $use_rfc822 = false;
+ if (is_bool($options)) {
+ $check_domain = $options;
+ } elseif (is_array($options)) {
+ extract($options);
+ }
+
+ // the base regexp for address
+ $regex = '&^(?: # recipient:
+ ("\s*(?:[^"\f\n\r\t\v\b\s]+\s*)+")| #1 quoted name
+ ([-\w!\#\$%\&\'*+~/^`|{}]+(?:\.[-\w!\#\$%\&\'*+~/^`|{}]+)*)) #2 OR dot-atom
+ @(((\[)? #3 domain, 4 as IPv4, 5 optionally bracketed
+ (?:(?:(?:(?:25[0-5])|(?:2[0-4][0-9])|(?:[0-1]?[0-9]?[0-9]))\.){3}
+ (?:(?:25[0-5])|(?:2[0-4][0-9])|(?:[0-1]?[0-9]?[0-9]))))(?(5)\])|
+ ((?:[a-z0-9](?:[-a-z0-9]*[a-z0-9])?\.)*[a-z](?:[-a-z0-9]*[a-z0-9])?) #6 domain as hostname
+ \.((?:([^-])[-a-z]*[-a-z])?)) #7 ICANN domain names
+ $&xi';
+
+ if ($use_rfc822? Validate::__emailRFC822($email, $options) :
+ preg_match($regex, $email)) {
+ if ($check_domain && function_exists('checkdnsrr')) {
+ list (, $domain) = explode('@', $email);
+ if (checkdnsrr($domain, 'MX') || checkdnsrr($domain, 'A')) {
+ return true;
+ }
+ return false;
+ }
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * Validate a string using the given format 'format'
+ *
+ * @param string $string String to validate
+ * @param array $options Options array where:
+ * 'format' is the format of the string
+ * Ex: VALIDATE_NUM . VALIDATE_ALPHA (see constants)
+ * 'min_length' minimum length
+ * 'max_length' maximum length
+ *
+ * @return boolean true if valid string, false if not
+ *
+ * @access public
+ */
+ function string($string, $options)
+ {
+ $format = null;
+ $min_length = $max_length = 0;
+ if (is_array($options)) {
+ extract($options);
+ }
+ if ($format && !preg_match("|^[$format]*\$|s", $string)) {
+ return false;
+ }
+ if ($min_length && strlen($string) < $min_length) {
+ return false;
+ }
+ if ($max_length && strlen($string) > $max_length) {
+ return false;
+ }
+ return true;
+ }
+
+ /**
+ * Validate an URI (RFC2396)
+ * This function will validate 'foobarstring' by default, to get it to validate
+ * only http, https, ftp and such you have to pass it in the allowed_schemes
+ * option, like this:
+ * <code>
+ * $options = array('allowed_schemes' => array('http', 'https', 'ftp'))
+ * var_dump(Validate::uri('http://www.example.org'), $options);
+ * </code>
+ *
+ * NOTE 1: The rfc2396 normally allows middle '-' in the top domain
+ * e.g. http://example.co-m should be valid
+ * However, as '-' is not used in any known TLD, it is invalid
+ * NOTE 2: As double shlashes // are allowed in the path part, only full URIs
+ * including an authority can be valid, no relative URIs
+ * the // are mandatory (optionally preceeded by the 'sheme:' )
+ * NOTE 3: the full complience to rfc2396 is not achieved by default
+ * the characters ';/?:@$,' will not be accepted in the query part
+ * if not urlencoded, refer to the option "strict'"
+ *
+ * @param string $url URI to validate
+ * @param array $options Options used by the validation method.
+ * key => type
+ * 'domain_check' => boolean
+ * Whether to check the DNS entry or not
+ * 'allowed_schemes' => array, list of protocols
+ * List of allowed schemes ('http',
+ * 'ssh+svn', 'mms')
+ * 'strict' => string the refused chars
+ * in query and fragment parts
+ * default: ';/?:@$,'
+ * empty: accept all rfc2396 foreseen chars
+ *
+ * @return boolean true if valid uri, false if not
+ *
+ * @access public
+ */
+ function uri($url, $options = null)
+ {
+ $strict = ';/?:@$,';
+ $domain_check = false;
+ $allowed_schemes = null;
+ if (is_array($options)) {
+ extract($options);
+ }
+ if (preg_match(
+ '&^(?:([a-z][-+.a-z0-9]*):)? # 1. scheme
+ (?:// # authority start
+ (?:((?:%[0-9a-f]{2}|[-a-z0-9_.!~*\'();:\&=+$,])*)@)? # 2. authority-userinfo
+ (?:((?:[a-z0-9](?:[-a-z0-9]*[a-z0-9])?\.)*[a-z](?:[a-z0-9]+)?\.?) # 3. authority-hostname OR
+ |([0-9]{1,3}(?:\.[0-9]{1,3}){3})) # 4. authority-ipv4
+ (?::([0-9]*))?) # 5. authority-port
+ ((?:/(?:%[0-9a-f]{2}|[-a-z0-9_.!~*\'():@\&=+$,;])*)*/?)? # 6. path
+ (?:\?([^#]*))? # 7. query
+ (?:\#((?:%[0-9a-f]{2}|[-a-z0-9_.!~*\'();/?:@\&=+$,])*))? # 8. fragment
+ $&xi', $url, $matches)) {
+ $scheme = isset($matches[1]) ? $matches[1] : '';
+ $authority = isset($matches[3]) ? $matches[3] : '' ;
+ if (is_array($allowed_schemes) &&
+ !in_array($scheme,$allowed_schemes)
+ ) {
+ return false;
+ }
+ if (!empty($matches[4])) {
+ $parts = explode('.', $matches[4]);
+ foreach ($parts as $part) {
+ if ($part > 255) {
+ return false;
+ }
+ }
+ } elseif ($domain_check && function_exists('checkdnsrr')) {
+ if (!checkdnsrr($authority, 'A')) {
+ return false;
+ }
+ }
+ if ($strict) {
+ $strict = '#[' . preg_quote($strict, '#') . ']#';
+ if ((!empty($matches[7]) && preg_match($strict, $matches[7]))
+ || (!empty($matches[8]) && preg_match($strict, $matches[8]))) {
+ return false;
+ }
+ }
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * Validate date and times. Note that this method need the Date_Calc class
+ *
+ * @param string $date Date to validate
+ * @param array $options array options where :
+ * 'format' The format of the date (%d-%m-%Y)
+ * 'min' The date has to be greater
+ * than this array($day, $month, $year)
+ * or PEAR::Date object
+ * 'max' The date has to be smaller than
+ * this array($day, $month, $year)
+ * or PEAR::Date object
+ *
+ * @return boolean true if valid date/time, false if not
+ *
+ * @access public
+ */
+ function date($date, $options)
+ {
+ $max = $min = false;
+ $format = '';
+ if (is_array($options)) {
+ extract($options);
+ }
+
+ $date_len = strlen($format);
+ for ($i = 0; $i < $date_len; $i++) {
+ $c = $format{$i};
+ if ($c == '%') {
+ $next = $format{$i + 1};
+ switch ($next) {
+ case 'j':
+ case 'd':
+ if ($next == 'j') {
+ $day = (int)Validate::_substr($date, 1, 2);
+ } else {
+ $day = (int)Validate::_substr($date, 2);
+ }
+ if ($day < 1 || $day > 31) {
+ return false;
+ }
+ break;
+ case 'm':
+ case 'n':
+ if ($next == 'm') {
+ $month = (int)Validate::_substr($date, 2);
+ } else {
+ $month = (int)Validate::_substr($date, 1, 2);
+ }
+ if ($month < 1 || $month > 12) {
+ return false;
+ }
+ break;
+ case 'Y':
+ case 'y':
+ if ($next == 'Y') {
+ $year = Validate::_substr($date, 4);
+ $year = (int)$year?$year:'';
+ } else {
+ $year = (int)(substr(date('Y'), 0, 2) .
+ Validate::_substr($date, 2));
+ }
+ if (strlen($year) != 4 || $year < 0 || $year > 9999) {
+ return false;
+ }
+ break;
+ case 'g':
+ case 'h':
+ if ($next == 'g') {
+ $hour = Validate::_substr($date, 1, 2);
+ } else {
+ $hour = Validate::_substr($date, 2);
+ }
+ if ($hour < 0 || $hour > 12) {
+ return false;
+ }
+ break;
+ case 'G':
+ case 'H':
+ if ($next == 'G') {
+ $hour = Validate::_substr($date, 1, 2);
+ } else {
+ $hour = Validate::_substr($date, 2);
+ }
+ if ($hour < 0 || $hour > 24) {
+ return false;
+ }
+ break;
+ case 's':
+ case 'i':
+ $t = Validate::_substr($date, 2);
+ if ($t < 0 || $t > 59) {
+ return false;
+ }
+ break;
+ default:
+ trigger_error("Not supported char `$next' after % in offset " . ($i+2), E_USER_WARNING);
+ }
+ $i++;
+ } else {
+ //literal
+ if (Validate::_substr($date, 1) != $c) {
+ return false;
+ }
+ }
+ }
+ // there is remaing data, we don't want it
+ if (strlen($date)) {
+ return false;
+ }
+
+ if (isset($day) && isset($month) && isset($year)) {
+ if (!checkdate($month, $day, $year)) {
+ return false;
+ }
+
+ if ($min) {
+ include_once 'Date/Calc.php';
+ if (is_a($min, 'Date') &&
+ (Date_Calc::compareDates($day, $month, $year,
+ $min->getDay(), $min->getMonth(), $min->getYear()) < 0))
+ {
+ return false;
+ } elseif (is_array($min) &&
+ (Date_Calc::compareDates($day, $month, $year,
+ $min[0], $min[1], $min[2]) < 0))
+ {
+ return false;
+ }
+ }
+
+ if ($max) {
+ include_once 'Date/Calc.php';
+ if (is_a($max, 'Date') &&
+ (Date_Calc::compareDates($day, $month, $year,
+ $max->getDay(), $max->getMonth(), $max->getYear()) > 0))
+ {
+ return false;
+ } elseif (is_array($max) &&
+ (Date_Calc::compareDates($day, $month, $year,
+ $max[0], $max[1], $max[2]) > 0))
+ {
+ return false;
+ }
+ }
+ }
+
+ return true;
+ }
+
+ function _substr(&$date, $num, $opt = false)
+ {
+ if ($opt && strlen($date) >= $opt && preg_match('/^[0-9]{'.$opt.'}/', $date, $m)) {
+ $ret = $m[0];
+ } else {
+ $ret = substr($date, 0, $num);
+ }
+ $date = substr($date, strlen($ret));
+ return $ret;
+ }
+
+ function _modf($val, $div) {
+ if (function_exists('bcmod')) {
+ return bcmod($val, $div);
+ } elseif (function_exists('fmod')) {
+ return fmod($val, $div);
+ }
+ $r = $val / $div;
+ $i = intval($r);
+ return intval($val - $i * $div + .1);
+ }
+
+ /**
+ * Calculates sum of product of number digits with weights
+ *
+ * @param string $number number string
+ * @param array $weights reference to array of weights
+ *
+ * @returns int returns product of number digits with weights
+ *
+ * @access protected
+ */
+ function _multWeights($number, &$weights) {
+ if (!is_array($weights)) {
+ return -1;
+ }
+ $sum = 0;
+
+ $count = min(count($weights), strlen($number));
+ if ($count == 0) { // empty string or weights array
+ return -1;
+ }
+ for ($i = 0; $i < $count; ++$i) {
+ $sum += intval(substr($number, $i, 1)) * $weights[$i];
+ }
+
+ return $sum;
+ }
+
+ /**
+ * Calculates control digit for a given number
+ *
+ * @param string $number number string
+ * @param array $weights reference to array of weights
+ * @param int $modulo (optionsl) number
+ * @param int $subtract (optional) number
+ * @param bool $allow_high (optional) true if function can return number higher than 10
+ *
+ * @returns int -1 calculated control number is returned
+ *
+ * @access protected
+ */
+ function _getControlNumber($number, &$weights, $modulo = 10, $subtract = 0, $allow_high = false) {
+ // calc sum
+ $sum = Validate::_multWeights($number, $weights);
+ if ($sum == -1) {
+ return -1;
+ }
+ $mod = Validate::_modf($sum, $modulo); // calculate control digit
+
+ if ($subtract > $mod && $mod > 0) {
+ $mod = $subtract - $mod;
+ }
+ if ($allow_high === false) {
+ $mod %= 10; // change 10 to zero
+ }
+ return $mod;
+ }
+
+ /**
+ * Validates a number
+ *
+ * @param string $number number to validate
+ * @param array $weights reference to array of weights
+ * @param int $modulo (optionsl) number
+ * @param int $subtract (optional) numbier
+ *
+ * @returns bool true if valid, false if not
+ *
+ * @access protected
+ */
+ function _checkControlNumber($number, &$weights, $modulo = 10, $subtract = 0) {
+ if (strlen($number) < count($weights)) {
+ return false;
+ }
+ $target_digit = substr($number, count($weights), 1);
+ $control_digit = Validate::_getControlNumber($number, $weights, $modulo, $subtract, $target_digit === 'X');
+
+ if ($control_digit == -1) {
+ return false;
+ }
+ if ($target_digit === 'X' && $control_digit == 10) {
+ return true;
+ }
+ if ($control_digit != $target_digit) {
+ return false;
+ }
+ return true;
+ }
+
+ /**
+ * Bulk data validation for data introduced in the form of an
+ * assoc array in the form $var_name => $value.
+ * Can be used on any of Validate subpackages
+ *
+ * @param array $data Ex: array('name' => 'toto', 'email' => 'toto at thing.info');
+ * @param array $val_type Contains the validation type and all parameters used in.
+ * 'val_type' is not optional
+ * others validations properties must have the same name as the function
+ * parameters.
+ * Ex: array('toto'=>array('type'=>'string','format'='toto at thing.info','min_length'=>5));
+ * @param boolean $remove if set, the elements not listed in data will be removed
+ *
+ * @return array value name => true|false the value name comes from the data key
+ *
+ * @access public
+ */
+ function multiple(&$data, &$val_type, $remove = false)
+ {
+ $keys = array_keys($data);
+ $valid = array();
+ foreach ($keys as $var_name) {
+ if (!isset($val_type[$var_name])) {
+ if ($remove) {
+ unset($data[$var_name]);
+ }
+ continue;
+ }
+ $opt = $val_type[$var_name];
+ $methods = get_class_methods('Validate');
+ $val2check = $data[$var_name];
+ // core validation method
+ if (in_array(strtolower($opt['type']), $methods)) {
+ //$opt[$opt['type']] = $data[$var_name];
+ $method = $opt['type'];
+ unset($opt['type']);
+
+ if (sizeof($opt) == 1) {
+ $opt = array_pop($opt);
+ }
+ $valid[$var_name] = call_user_func(array('Validate', $method), $val2check, $opt);
+
+ /**
+ * external validation method in the form:
+ * "<class name><underscore><method name>"
+ * Ex: us_ssn will include class Validate/US.php and call method ssn()
+ */
+ } elseif (strpos($opt['type'], '_') !== false) {
+ $validateType = explode('_', $opt['type']);
+ $method = array_pop($validateType);
+ $class = implode('_', $validateType);
+ $classPath = str_replace('_', DIRECTORY_SEPARATOR, $class);
+ $class = 'Validate_' . $class;
+ if (!@include_once "Validate/$classPath.php") {
+ trigger_error("$class isn't installed or you may have some permissoin issues", E_USER_ERROR);
+ }
+
+ $ce = substr(phpversion(), 0, 1) > 4 ? class_exists($class, false) : class_exists($class);
+ if (!$ce ||
+ !in_array($method, get_class_methods($class)))
+ {
+ trigger_error("Invalid validation type $class::$method", E_USER_WARNING);
+ continue;
+ }
+ unset($opt['type']);
+ if (sizeof($opt) == 1) {
+ $opt = array_pop($opt);
+ }
+ $valid[$var_name] = call_user_func(array($class, $method), $data[$var_name], $opt);
+ } else {
+ trigger_error("Invalid validation type {$opt['type']}", E_USER_WARNING);
+ }
+ }
+ return $valid;
+ }
+}
+
+?>
Modified: trunk/lib/banana-admin.php
===================================================================
--- trunk/lib/banana-admin.php 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/lib/banana-admin.php 2015-04-05 16:42:47 UTC (rev 657)
@@ -8,6 +8,10 @@
$who = "nobody";
}
+// Adding variable to limit maximum bananas awarded at once?
+
+$maxbanana = 3;
+
// what permission does a user need to be able to award bananas?
$permission = "bananas";
@@ -21,12 +25,20 @@
if ($_REQUEST['action'] == "award") {
if (trim ($_POST['why']) !== "") {
$number = intval($_POST['number']);
+
$why = $_POST['why'];
-
- $DB->Query("INSERT INTO awards (username, score, whn, who, why) VALUES (?,?,NOW(),?,?)", array($who, $number, $session->username, $why));
- header("Location: " . $_SERVER['PHP_SELF']);
+
+ if ( abs($number) <= $maxbanana ){
+
+ $DB->Query("INSERT INTO awards (username, score, whn, who, why) VALUES (?,?,NOW(),?,?)", array($who, $number, $session->username, $why));
+ header("Location: " . $_SERVER['PHP_SELF']);
+
+ } else {
+ trigger_error("Nice try ".$session->username."! You've submitted a request with too many bananas");
+ }
+
} else {
- $smarty->assign("errormsg","No reason entered for the awarding of bananas.");
+ trigger_error("No reason entered for the awarding of bananas.", E_USER_WARNING);
}
}
} elseif ($session->loggedin) {
Modified: trunk/lib/date.php
===================================================================
--- trunk/lib/date.php 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/lib/date.php 2015-04-05 16:42:47 UTC (rev 657)
@@ -15,10 +15,10 @@
}
}
+function paidUntil($timestamp) {
+ $nextyear = academicYear($timestamp)+1;
+ $paydate = "Sept. ".$nextyear;
+ return $paydate;
+}
-
-
-
-
-
?>
Modified: trunk/lib/error.php
===================================================================
--- trunk/lib/error.php 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/lib/error.php 2015-04-05 16:42:47 UTC (rev 657)
@@ -23,6 +23,13 @@
$messages['info'][] = $message;
}
+function message_flash_postponed($message) {
+ global $session;
+ $session->data['messages']['info'][] = $message;
+ $session->save();
+}
+
+
set_error_handler("handle_messages", (E_USER_ERROR | E_USER_WARNING | E_USER_NOTICE));
// empty messages array was causing PHP to spew notices
Copied: trunk/lib/iCalcreator.class.php (from rev 656, branches/sucs-site/lib/iCalcreator.class.php)
===================================================================
--- trunk/lib/iCalcreator.class.php (rev 0)
+++ trunk/lib/iCalcreator.class.php 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,7473 @@
+<?php
+/*********************************************************************************/
+/**
+ * iCalcreator class v2.6
+ * copyright (c) 2007-2008 Kjell-Inge Gustafsson kigkonsult
+ * www.kigkonsult.se/iCalcreator/index.php
+ * ical at kigkonsult.se
+ *
+ * Description:
+ * This file is a PHP implementation of RFC 2445.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+/*********************************************************************************/
+/*********************************************************************************/
+/* A little setup */
+/*********************************************************************************/
+ /* your local language code */
+// define( 'ICAL_LANG', 'sv' );
+ // alt. autosetting
+/*
+$langstr = $_SERVER['HTTP_ACCEPT_LANGUAGE'];
+$pos = strpos( $langstr, ';' );
+if ($pos !== false) {
+ $langstr = substr( $langstr, 0, $pos );
+ $pos = strpos( $langstr, ',' );
+ if ($pos !== false) {
+ $pos = strpos( $langstr, ',' );
+ $langstr = substr( $langstr, 0, $pos );
+ }
+ define( 'ICAL_LANG', $langstr );
+}
+*/
+ /* only for phpversion 5.x, date management, default timezone setting */
+if( substr( phpversion(), 0, 1) >= '5' ) // && ( 'UTC' == date_default_timezone_get() )) {
+ date_default_timezone_set( 'Europe/Stockholm' );
+ /* version string, do NOT remove!! */
+define( 'ICALCREATOR_VERSION', 'iCalcreator 2.6' );
+/*********************************************************************************/
+/*********************************************************************************/
+/**
+ * vcalendar class
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.2.13 - 2007-12-30
+ */
+class vcalendar {
+ // calendar property variables
+ var $calscale;
+ var $method;
+ var $prodid;
+ var $version;
+ var $xprop;
+ // container for calendar components
+ var $components;
+ // component config variables
+ var $allowEmpty;
+ var $unique_id;
+ var $language;
+ var $directory;
+ var $filename;
+ var $url;
+ var $delimiter;
+ var $nl;
+ var $format;
+ // component internal variables
+ var $attributeDelimiter;
+ var $valueInit;
+ // component xCal declaration container
+ var $xcaldecl;
+/*
+ * constructor for calendar object
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.2.13 - 2007-12-30
+ * @return void
+ */
+ function vcalendar () {
+ $this->_makeVersion();
+ $this->calscale = null;
+ $this->method = null;
+ $this->_makeUnique_id();
+ $this->prodid = null;
+ $this->xprop = array();
+/**
+ * language = <Text identifying a language, as defined in [RFC 1766]>
+ */
+ if( defined( 'ICAL_LANG' ))
+ $this->setConfig( 'language', ICAL_LANG );
+ $this->setConfig( 'allowEmpty', TRUE );
+ $this->setConfig( 'nl', "\n" );
+ $this->setConfig( 'format', 'iCal');
+ $this->directory = null;
+ $this->filename = null;
+ $this->url = null;
+ $this->setConfig( 'delimiter', DIRECTORY_SEPARATOR );
+ $this->xcaldecl = array();
+ $this->components = array();
+ }
+/*********************************************************************************/
+/**
+ * Property Name: CALSCALE
+ */
+/**
+ * creates formatted output for calendar property calscale
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.4.8 - 2008-10-21
+ * @return string
+ */
+ function createCalscale() {
+ if( empty( $this->calscale )) return FALSE;
+ switch( $this->format ) {
+ case 'xcal':
+ return ' calscale="'.$this->calscale.'"'.$this->nl;
+ break;
+ default:
+ return 'CALSCALE:'.$this->calscale.$this->nl;
+ break;
+ }
+ }
+/**
+ * set calendar property calscale
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.4.8 - 2008-10-21
+ * @param string $value
+ * @return void
+ */
+ function setCalscale( $value ) {
+ if( empty( $value )) return FALSE;
+ $this->calscale = $value;
+ }
+/*********************************************************************************/
+/**
+ * Property Name: METHOD
+ */
+/**
+ * creates formatted output for calendar property method
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 0.9.7 - 2006-11-20
+ * @return string
+ */
+ function createMethod() {
+ if( empty( $this->method )) return FALSE;
+ switch( $this->format ) {
+ case 'xcal':
+ return ' method="'.$this->method.'"'.$this->nl;
+ break;
+ default:
+ return 'METHOD:'.$this->method.$this->nl;
+ break;
+ }
+ }
+/**
+ * set calendar property method
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.4.8 - 2008-20-23
+ * @param string $value
+ * @return bool
+ */
+ function setMethod( $value ) {
+ if( empty( $value )) return FALSE;
+ $this->method = $value;
+ return TRUE;
+ }
+/*********************************************************************************/
+/**
+ * Property Name: PRODID
+ *
+ * The identifier is RECOMMENDED to be the identical syntax to the
+ * [RFC 822] addr-spec. A good method to assure uniqueness is to put the
+ * domain name or a domain literal IP address of the host on which.. .
+ */
+/**
+ * creates formatted output for calendar property prodid
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 0.9.7 - 2006-11-20
+ * @return string
+ */
+ function createProdid() {
+ if( !isset( $this->prodid ))
+ $this->_makeProdid();
+ switch( $this->format ) {
+ case 'xcal':
+ return ' prodid="'.$this->prodid.'"'.$this->nl;
+ break;
+ default:
+ return 'PRODID:'.$this->prodid.$this->nl;
+ break;
+ }
+ }
+/**
+ * make default value for calendar prodid
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 0.3.0 - 2006-08-10
+ * @return void
+ */
+ function _makeProdid() {
+ $this->prodid = '-//'.$this->unique_id.'//NONSGML '.ICALCREATOR_VERSION.'//'.strtoupper( $this->language );
+ }
+/**
+ * Conformance: The property MUST be specified once in an iCalendar object.
+ * Description: The vendor of the implementation SHOULD assure that this
+ * is a globally unique identifier; using some technique such as an FPI
+ * value, as defined in [ISO 9070].
+ */
+/**
+ * make default unique_id for calendar prodid
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 0.3.0 - 2006-08-10
+ * @return void
+ */
+ function _makeUnique_id() {
+ $this->unique_id = ( isset( $_SERVER['SERVER_NAME'] )) ? gethostbyname( $_SERVER['SERVER_NAME'] ) : 'localhost';
+ }
+/*********************************************************************************/
+/**
+ * Property Name: VERSION
+ *
+ * Description: A value of "2.0" corresponds to this memo.
+ */
+/**
+ * creates formatted output for calendar property version
+
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 0.9.7 - 2006-11-20
+ * @return string
+ */
+ function createVersion() {
+ if( empty( $this->version ))
+ $this->_makeVersion();
+ switch( $this->format ) {
+ case 'xcal':
+ return ' version="'.$this->version.'"'.$this->nl;
+ break;
+ default:
+ return 'VERSION:'.$this->version.$this->nl;
+ break;
+ }
+ }
+/**
+ * set default calendar version
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 0.3.0 - 2006-08-10
+ * @return void
+ */
+ function _makeVersion() {
+ $this->version = '2.0';
+ }
+/**
+ * set calendar version
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.4.8 - 2008-10-23
+ * @param string $value
+ * @return void
+ */
+ function setVersion( $value ) {
+ if( empty( $value )) return FALSE;
+ $this->version = $value;
+ return TRUE;
+ }
+/*********************************************************************************/
+/**
+ * Property Name: x-prop
+ */
+/**
+ * creates formatted output for calendar property x-prop, iCal format only
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.4.11 - 2008-11-03
+ * @return string
+ */
+ function createXprop() {
+ if( 'xcal' == $this->format )
+ return false;
+ if( 0 >= count( $this->xprop ))
+ return;
+ $output = null;
+ $toolbox = new calendarComponent();
+ $toolbox->setConfig( 'language', $this->getConfig( 'language' ));
+ $toolbox->setConfig( 'nl', $this->getConfig( 'nl' ));
+ $toolbox->_createFormat( $this->getConfig( 'format' ));
+ foreach( $this->xprop as $label => $xpropPart ) {
+ if( empty( $xpropPart['value'] )) {
+ $output .= $toolbox->_createElement( $label );
+ continue;
+ }
+ $attributes = $toolbox->_createParams( $xpropPart['params'], array( 'LANGUAGE' ));
+ if( is_array( $xpropPart['value'] )) {
+ foreach( $xpropPart['value'] as $pix => $theXpart )
+ $xpropPart['value'][$pix] = $toolbox->_strrep( $theXpart );
+ $xpropPart['value'] = implode( ',', $xpropPart['value'] );
+ }
+ else
+ $xpropPart['value'] = $toolbox->_strrep( $xpropPart['value'] );
+ $output .= $toolbox->_createElement( $label, $attributes, $xpropPart['value'] );
+ }
+ return $output;
+ }
+/**
+ * set calendar property x-prop
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.4.11 - 2008-11-04
+ * @param string $label
+ * @param string $value
+ * @param array $params optional
+ * @return bool
+ */
+ function setXprop( $label, $value, $params=FALSE ) {
+ if( empty( $value )) if( $this->getConfig( 'allowEmpty' )) $value = null; else return FALSE;
+ if( empty( $label )) return FALSE;
+ $xprop = array( 'value' => $value );
+ $toolbox = new calendarComponent();
+ $xprop['params'] = $toolbox->_setParams( $params );
+ if( !is_array( $this->xprop )) $this->xprop = array();
+ $this->xprop[strtoupper( $label )] = $xprop;
+ return TRUE;
+ }
+/*********************************************************************************/
+/**
+ * delete calendar property value
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.4.5 - 2008-11-14
+ * @param mixed $propName, bool FALSE => X-property
+ * @param int @propix, optional, if specific property is wanted in case of multiply occurences
+ * @return bool, if successfull delete
+ */
+ function deleteProperty( $propName, $propix=FALSE ) {
+ $propName = ( $propName ) ? strtoupper( $propName ) : 'X-PROP';
+ if( !$propix )
+ $propix = ( isset( $this->propdelix[$propName] )) ? $this->propdelix[$propName] + 2 : 1;
+ $this->propdelix[$propName] = --$propix;
+ $return = FALSE;
+ switch( $propName ) {
+ case 'CALSCALE':
+ if( isset( $this->calscale )) {
+ $this->calscale = null;
+ $return = TRUE;
+ }
+ break;
+ case 'METHOD':
+ if( isset( $this->method )) {
+ $this->method = null;
+ $return = TRUE;
+ }
+ break;
+ default:
+ $reduced = array();
+ if( $propName != 'X-PROP' ) {
+ if( !isset( $this->xprop[$propName] )) return FALSE;
+ foreach( $this->xprop as $k => $a ) {
+ if(( $k != $propName ) && !empty( $a ))
+ $reduced[$k] = $a;
+ }
+ }
+ else {
+ if( count( $this->xprop ) <= $propix ) return FALSE;
+ $xpropno = 0;
+ foreach( $this->xprop as $xpropkey => $xpropvalue ) {
+ if( $propix != $xpropno )
+ $reduced[$xpropkey] = $xpropvalue;
+ $xpropno++;
+ }
+ }
+ $this->xprop = $reduced;
+ return TRUE;
+ }
+ return $return;
+ }
+/**
+ * get calendar property value/params
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.5.1 - 2008-11-02
+ * @param string $propName, optional
+ * @param int @propix, optional, if specific property is wanted in case of multiply occurences
+ * @param bool $inclParam=FALSE
+ * @return mixed
+ */
+ function getProperty( $propName=FALSE, $propix=FALSE, $inclParam=FALSE ) {
+ $propName = ( $propName ) ? strtoupper( $propName ) : 'X-PROP';
+ if( 'X-PROP' == $propName ) {
+ if( !$propix )
+ $propix = ( isset( $this->propix[$propName] )) ? $this->propix[$propName] + 2 : 1;
+ $this->propix[$propName] = --$propix;
+ }
+ switch( $propName ) {
+ case 'CALSCALE':
+ return ( !empty( $this->calscale )) ? $this->calscale : null;
+ break;
+ case 'METHOD':
+ return ( !empty( $this->method )) ? $this->method : null;
+ break;
+ case 'PRODID':
+ if( empty( $this->prodid ))
+ $this->_makeProdid();
+ return $this->prodid;
+ break;
+ case 'VERSION':
+ return ( !empty( $this->version )) ? $this->version : null;
+ break;
+ default:
+ if( $propName != 'X-PROP' ) {
+ if( !isset( $this->xprop[$propName] )) return FALSE;
+ return ( $inclParam ) ? array( $propName, $this->xprop[$propName] )
+ : array( $propName, $this->xprop[$propName]['value'] );
+ }
+ else {
+ if( empty( $this->xprop )) return FALSE;
+ $xpropno = 0;
+ foreach( $this->xprop as $xpropkey => $xpropvalue ) {
+ if( $propix == $xpropno )
+ return ( $inclParam ) ? array( $xpropkey, $this->xprop[$xpropkey] )
+ : array( $xpropkey, $this->xprop[$xpropkey]['value'] );
+ else
+ $xpropno++;
+ }
+ return FALSE; // not found ??
+ }
+ }
+ return FALSE;
+ }
+/**
+ * general vcalendar property setting
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.2.13 - 2007-11-04
+ * @param mixed $args variable number of function arguments,
+ * first argument is ALWAYS component name,
+ * second ALWAYS component value!
+ * @return bool
+ */
+ function setProperty () {
+ $numargs = func_num_args();
+ if( 1 > $numargs )
+ return FALSE;
+ $arglist = func_get_args();
+ $arglist[0] = strtoupper( $arglist[0] );
+ switch( $arglist[0] ) {
+ case 'CALSCALE':
+ return $this->setCalscale( $arglist[1] );
+ case 'METHOD':
+ return $this->setMethod( $arglist[1] );
+ case 'VERSION':
+ return $this->setVersion( $arglist[1] );
+ default:
+ if( !isset( $arglist[1] )) $arglist[1] = null;
+ if( !isset( $arglist[2] )) $arglist[2] = null;
+ return $this->setXprop( $arglist[0], $arglist[1], $arglist[2] );
+ }
+ return FALSE;
+ }
+/*********************************************************************************/
+/**
+ * get vcalendar config values or * calendar components
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.4.10 - 2008-10-23
+ * @param string $config
+ * @return value
+ */
+ function getConfig( $config ) {
+ switch( strtoupper( $config )) {
+ case 'ALLOWEMPTY':
+ return $this->allowEmpty;
+ break;
+ case 'COMPSINFO':
+ unset( $this->compix );
+ $info = array();
+ foreach( $this->components as $cix => $component ) {
+ if( empty( $component )) continue;
+ unset( $component->propix );
+ $info[$cix]['ordno'] = $cix + 1;
+ $info[$cix]['type'] = $component->objName;
+ $info[$cix]['uid'] = $component->getProperty( 'uid' );
+ $info[$cix]['props'] = $component->getConfig( 'propinfo' );
+ $info[$cix]['sub'] = $component->getConfig( 'compsinfo' );
+ unset( $component->propix );
+ }
+ return $info;
+ break;
+ case 'DELIMITER':
+ return $this->delimiter;
+ break;
+ case 'DIRECTORY':
+ if( empty( $this->directory ))
+ $this->directory = '.';
+ return $this->directory;
+ break;
+ case 'DIRFILE':
+ return $this->getConfig( 'directory' ).$this->getConfig( 'delimiter' ).$this->getConfig( 'filename' );
+ break;
+ case 'FILEINFO':
+ return array( $this->getConfig( 'directory' )
+ , $this->getConfig( 'filename' )
+ , $this->getConfig( 'filesize' ));
+ break;
+ case 'FILENAME':
+ if( empty( $this->filename )) {
+ if( 'xcal' == $this->format )
+ $this->filename = date( 'YmdHis' ).'.xml'; // recommended xcs.. .
+ else
+ $this->filename = date( 'YmdHis' ).'.ics';
+ }
+ return $this->filename;
+ break;
+ case 'FILESIZE':
+ $size = 0;
+ if( empty( $this->url )) {
+ $dirfile = $this->getConfig( 'dirfile' );
+ if( FALSE === ( $size = filesize( $dirfile )))
+ $size = 0;
+ clearstatcache();
+ }
+ return $size;
+ break;
+ case 'FORMAT':
+ return $this->format;
+ break;
+ case 'LANGUAGE':
+ /* get language for calendar component as defined in [RFC 1766] */
+ return $this->language;
+ break;
+ case 'NL':
+ case 'NEWLINECHAR':
+ return $this->nl;
+ break;
+ case 'UNIQUE_ID':
+ return $this->unique_id;
+ break;
+ case 'URL':
+ if( !empty( $this->url ))
+ return $this->url;
+ else
+ return FALSE;
+ break;
+ }
+ }
+/**
+ * general vcalendar config setting
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.4.8 - 2008-10-24
+ * @param string $config
+ * @param string $value
+ * @return void
+ */
+ function setConfig( $config, $value ) {
+ $res = FALSE;
+ switch( strtoupper( $config )) {
+ case 'ALLOWEMPTY':
+ $this->allowEmpty = $value;
+ $subcfg = array( 'ALLOWEMPTY' => $value );
+ $res = TRUE;
+ break;
+ case 'DELIMITER':
+ $this->delimiter = $value;
+ return TRUE;
+ break;
+ case 'DIRECTORY':
+ $value = trim( $value );
+ $nl = $this->getConfig('delimiter');
+ if( $nl == substr( $value, ( 0 - strlen( $nl ))))
+ $value = substr( $value, 0, ( strlen( $value ) - strlen( $nl )));
+ if( is_dir( $value )) {
+ /* local directory */
+ clearstatcache();
+ $this->directory = $value;
+ $this->url = null;
+ return TRUE;
+ }
+ else
+ return FALSE;
+ break;
+ case 'FILENAME':
+ $value = trim( $value );
+ if( !empty( $this->url )) {
+ /* remote directory+file - URL */
+ $this->filename = $value;
+ return TRUE;
+ }
+ $dirfile = $this->getConfig( 'directory' ).$this->getConfig( 'delimiter' ).$value;
+ if( file_exists( $dirfile )) {
+ /* local existing file */
+ if( is_readable( $dirfile ) || is_writable( $dirfile )) {
+ clearstatcache();
+ $this->filename = $value;
+ return TRUE;
+ }
+ else
+ return FALSE;
+ }
+ elseif( FALSE !== touch( $dirfile )) {
+ /* new local file created */
+ $this->filename = $value;
+ return TRUE;
+ }
+ else
+ return FALSE;
+ break;
+ case 'FORMAT':
+ $value = trim( $value );
+ if( 'xcal' == strtolower( $value )) {
+ $this->format = 'xcal';
+ $this->attributeDelimiter = $this->nl;
+ $this->valueInit = null;
+ }
+ else {
+ $this->format = null;
+ $this->attributeDelimiter = ';';
+ $this->valueInit = ':';
+ }
+ $subcfg = array( 'FORMAT' => $value );
+ $res = TRUE;
+ break;
+ case 'LANGUAGE':
+ // set language for calendar component as defined in [RFC 1766]
+ $value = trim( $value );
+ $this->language = $value;
+ $subcfg = array( 'LANGUAGE' => $value );
+ $res = TRUE;
+ break;
+ case 'NL':
+ case 'NEWLINECHAR':
+ $this->nl = $value;
+ $subcfg = array( 'NL' => $value );
+ $res = TRUE;
+ break;
+ case 'UNIQUE_ID':
+ $value = trim( $value );
+ $this->unique_id = $value;
+ $subcfg = array( 'UNIQUE_ID' => $value );
+ $res = TRUE;
+ break;
+ case 'URL':
+ /* remote file - URL */
+ $value = trim( $value );
+ $value = str_replace( 'HTTP://', 'http://', $value );
+ $value = str_replace( 'WEBCAL://', 'http://', $value );
+ $value = str_replace( 'webcal://', 'http://', $value );
+ $this->url = $value;
+ $this->directory = null;
+ $parts = pathinfo( $value );
+ return $this->setConfig( 'filename', $parts['basename'] );
+ break;
+ }
+ if( !$res ) return FALSE;
+ if( isset( $subcfg ) && !empty( $this->components )) {
+ foreach( $subcfg as $cfgkey => $cfgvalue ) {
+ foreach( $this->components as $cix => $component ) {
+ $res = $component->setConfig( $cfgkey, $cfgvalue );
+ if( !$res )
+ break 2;
+ $this->components[$cix] = $component->copy(); // PHP4 compliant
+ }
+ }
+ }
+ return $res;
+ }
+/*********************************************************************************/
+/**
+ * add calendar component to container
+ *
+ * alias to setComponent
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 1.x.x - 2007-04-24
+ * @param object $component calendar component
+ * @return void
+ */
+ function addComponent( $component ) {
+ $this->setComponent( $component );
+ }
+/**
+ * delete calendar component from container
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.4.10 - 2008-08-05
+ * @param mixed $arg1 ordno / component type / component uid
+ * @param mixed $arg2 optional, ordno if arg1 = component type
+ * @return void
+ */
+ function deleteComponent( $arg1, $arg2=FALSE ) {
+ $argType = $index = null;
+ if ( ctype_digit( (string) $arg1 )) {
+ $argType = 'INDEX';
+ $index = (int) $arg1 - 1;
+ }
+ elseif(( strlen( $arg1 ) <= strlen( 'vfreebusy' )) && ( FALSE === strpos( $arg1, '@' ))) {
+ $argType = strtolower( $arg1 );
+ $index = ( !empty( $arg2 ) && ctype_digit( (string) $arg2 )) ? (( int ) $arg2 - 1 ) : 0;
+ }
+ $cix1dC = 0;
+ foreach ( $this->components as $cix => $component) {
+ if( empty( $component )) continue;
+ unset( $component->propix );
+ if(( 'INDEX' == $argType ) && ( $index == $cix )) {
+ unset( $this->components[$cix] );
+ return TRUE;
+ }
+ elseif( $argType == $component->objName ) {
+ if( $index == $cix1dC ) {
+ unset( $this->components[$cix] );
+ return TRUE;
+ }
+ $cix1dC++;
+ }
+ elseif( !$argType && ($arg1 == $component->getProperty( 'uid' ))) {
+ unset( $this->components[$cix] );
+ return TRUE;
+ }
+ }
+ return FALSE;
+ }
+/**
+ * get calendar component from container
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.4.10 - 2008-08-06
+ * @param mixed $arg1 optional, ordno/component type/ component uid
+ * @param mixed $arg2 optional, ordno if arg1 = component type
+ * @return object
+ */
+ function getComponent( $arg1=FALSE, $arg2=FALSE ) {
+ $index = $argType = null;
+ if ( !$arg1 ) {
+ $argType = 'INDEX';
+ $index = $this->compix['INDEX'] =
+ ( isset( $this->compix['INDEX'] )) ? $this->compix['INDEX'] + 1 : 1;
+ }
+ elseif ( ctype_digit( (string) $arg1 )) {
+ $argType = 'INDEX';
+ $index = (int) $arg1;
+ unset( $this->compix );
+ }
+ elseif(( strlen( $arg1 ) <= strlen( 'vfreebusy' )) && ( FALSE === strpos( $arg1, '@' ))) {
+ unset( $this->compix['INDEX'] );
+ $argType = strtolower( $arg1 );
+ if( !$arg2 )
+ $index = $this->compix[$argType] =
+ ( isset( $this->compix[$argType] )) ? $this->compix[$argType] + 1 : 1;
+ else
+ $index = (int) $arg2;
+ }
+ $index -= 1;
+ $ckeys = array_keys( $this->components );
+ if( !empty( $index) && ( $index > end( $ckeys )))
+ return FALSE;
+ $cix1gC = 0;
+ foreach ( $this->components as $cix => $component) {
+ if( empty( $component )) continue;
+ unset( $component->propix );
+ if(( 'INDEX' == $argType ) && ( $index == $cix ))
+ return $component->copy();
+ elseif( $argType == $component->objName ) {
+ if( $index == $cix1gC )
+ return $component->copy();
+ $cix1gC++;
+ }
+ elseif( !$argType && ($arg1 == $component->getProperty( 'uid' ))) {
+ unset( $component->propix );
+ return $component->copy();
+ }
+ }
+ /* not found.. . */
+ unset( $this->compix );
+ return FALSE;
+ }
+/**
+ * select components from calendar on date basis
+ *
+ * Ensure DTSTART is set for every component.
+ * No date controls occurs.
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.4.16 - 2008-10-18
+ * @param int $startY optional, start Year, default current Year
+ * @param int $startM optional, start Month, default current Month
+ * @param int $startD optional, start Day, default current Day
+ * @param int $endY optional, end Year, default $startY
+ * @param int $endY optional, end Month, default $startM
+ * @param int $endY optional, end Day, default $startD
+ * @param mixed $cType optional, calendar component type(-s), default FALSE=all else string/array type(-s)
+ * @param bool $flat optional, FALSE (default) => output : array[Year][Month][Day][]
+ * TRUE => output : array[] (ignores split)
+ * @param bool $any optional, TRUE (default) - select component that take place within period
+ * FALSE - only components that starts within period
+ * @param bool $split optional, TRUE (default) - one component copy every day it take place during the
+ * period (implies flat=FALSE)
+ * FALSE - one occurance of component only in output array</tr>
+ * @return array or FALSE
+ */
+ function selectComponents( $startY=FALSE, $startM=FALSE, $startD=FALSE, $endY=FALSE, $endM=FALSE, $endD=FALSE, $cType=FALSE, $flat=FALSE, $any=TRUE, $split=TRUE ) {
+ /* check if empty calendar */
+ if( 0 >= count( $this->components )) return FALSE;
+ /* check default dates */
+ if( !$startY ) $startY = date( 'Y' );
+ if( !$startM ) $startM = date( 'm' );
+ if( !$startD ) $startD = date( 'd' );
+ $startDate = mktime( 0, 0, 0, $startM, $startD, $startY );
+ if( !$endY ) $endY = $startY;
+ if( !$endM ) $endM = $startM;
+ if( !$endD ) $endD = $startD;
+ $endDate = mktime( 23, 59, 59, $endM, $endD, $endY );
+ /* check component types */
+ $validTypes = array('vevent', 'vtodo', 'vjournal', 'vfreebusy' );
+ if( is_array( $cType )) {
+ foreach( $cType as $cix => $theType ) {
+ $cType[$cix] = $theType = strtolower( $theType );
+ if( !in_array( $theType, $validTypes ))
+ $cType[$cix] = 'vevent';
+ }
+ $cType = array_unique( $cType );
+ }
+ elseif( !empty( $cType )) {
+ $cType = strtolower( $cType );
+ if( !in_array( $cType, $validTypes ))
+ $cType = array( 'vevent' );
+ else
+ $cType = array( $cType );
+ }
+ else
+ $cType = $validTypes;
+ if( 0 >= count( $cType ))
+ $cType = $validTypes;
+ /* iterate components */
+ $result = array();
+ foreach ( $this->components as $cix => $component ) {
+ if( empty( $component )) continue;
+ unset( $component->propix, $start );
+ /* deselect unvalid type components */
+ if( !in_array( $component->objName, $cType )) continue;
+ /* deselect components without dtstart set */
+ if( FALSE === ( $start = $component->getProperty( 'dtstart' ))) continue;
+ $dtendExist = $dueExist = $durationExist = $endAllDayEvent = FALSE;
+ unset( $end, $startWdate, $endWdate, $rdurWsecs, $rdur, $exdatelist, $workstart, $workend ); // clean up
+ $startWdate = $component->_date2timestamp( $start );
+ $startDateFormat = ( isset( $start['hour'] )) ? 'Y-m-d H:i:s' : 'Y-m-d';
+ /* get end date from dtend/due/duration properties */
+ $end = $component->getProperty( 'dtend' );
+ if( !empty( $end )) {
+ $dtendExist = TRUE;
+ $endDateFormat = ( isset( $end['hour'] )) ? 'Y-m-d H:i:s' : 'Y-m-d';
+ }
+ // if( !empty($end)) echo 'selectComp 1 start='.implode('-',$start).' end='.implode('-',$end)."<br />\n"; // test ###
+ if( empty($end) && ( $component->objName == 'vtodo' )) {
+ $end = $component->getProperty( 'due' );
+ if( !empty( $end )) {
+ $dueExist = TRUE;
+ $endDateFormat = ( isset( $end['hour'] )) ? 'Y-m-d H:i:s' : 'Y-m-d';
+ }
+ // if( !empty($end)) echo 'selectComp 2 start='.implode('-',$start).' end='.implode('-',$end)."<br />\n"; // test ###
+ }
+ if( !empty( $end ) && !isset( $end['hour'] )) {
+ /* a DTEND without time part regards an event that ends the day before,
+ for an all-day event DTSTART=20071201 DTEND=20071202 (taking place 20071201!!! */
+ $endAllDayEvent = TRUE;
+ $endWdate = mktime( 23, 59, 59, $end['month'], ($end['day'] - 1), $end['year'] );
+ $end['year'] = date( 'Y', $endWdate );
+ $end['month'] = date( 'm', $endWdate );
+ $end['day'] = date( 'd', $endWdate );
+ $end['hour'] = 23;
+ $end['min'] = $end['sec'] = 59;
+ // if( !empty($end)) echo 'selectComp 3 start='.implode('-',$start).' end='.implode('-',$end)."<br />\n"; // test ###
+ }
+ if( empty( $end )) {
+ $end = $component->getProperty( 'duration', FALSE, FALSE, TRUE );// in dtend (array) format
+ if( !empty( $end ))
+ $durationExist = TRUE;
+ // if( !empty($end)) echo 'selectComp 4 start='.implode('-',$start).' end='.implode('-',$end)."<br />\n"; // test ###
+ }
+ if( empty( $end )) { // assume one day duration if missing end date
+ $end = array( 'year' => $start['year'], 'month' => $start['month'], 'day' => $start['day'], 'hour' => 23, 'min' => 59, 'sec' => 59 );
+ // if( isset($end)) echo 'selectComp 5 start='.implode('-',$start).' end='.implode('-',$end)."<br />\n"; // test ###
+ }
+ $endWdate = $component->_date2timestamp( $end );
+ if( $endWdate < $startWdate ) { // MUST be after start date!!
+ $end = array( 'year' => $start['year'], 'month' => $start['month'], 'day' => $start['day'], 'hour' => 23, 'min' => 59, 'sec' => 59 );
+ $endWdate = $component->_date2timestamp( $end );
+ }
+ $rdurWsecs = $endWdate - $startWdate; // compute component duration in seconds
+ $rdur = $component->_date2duration( $start, $end ); // compute component duration, array
+ /* make a list of optional exclude dates for component occurence from exrule and exdate */
+ $exdatelist = array();
+ $workstart = $component->_timestamp2date(( $startDate - $rdurWsecs ), 6);
+ $workend = $component->_timestamp2date(( $endDate + $rdurWsecs ), 6);
+ while( FALSE !== ( $exrule = $component->getProperty( 'exrule' ))) // check exrule
+ $component->_recur2date( $exdatelist, $exrule, $start, $workstart, $workend );
+ while( FALSE !== ( $exdate = $component->getProperty( 'exdate' ))) { // check exdate
+ foreach( $exdate as $theExdate ) {
+ $exWdate = $component->_date2timestamp( $theExdate );
+ if((( $startDate - $rdurWsecs ) <= $exWdate ) && ( $endDate >= $exWdate ))
+ $exdatelist[$exWdate] = TRUE;
+ }
+ }
+ /* if 'any' components, check repeating components, removing all excluding dates */
+ if( TRUE === $any ) {
+ /* make a list of optional repeating dates for component occurence, rrule, rdate */
+ $recurlist = array();
+ while( FALSE !== ( $rrule = $component->getProperty( 'rrule' ))) // check rrule
+ $component->_recur2date( $recurlist, $rrule, $start, $workstart, $workend );
+ foreach( $recurlist as $recurkey => $recurvalue ) // key=match date as timestamp
+ $recurlist[$recurkey] = $rdurWsecs; // add duration in seconds
+ while( FALSE !== ( $rdate = $component->getProperty( 'rdate' ))) { // check rdate
+ foreach( $rdate as $theRdate ) {
+ if( is_array( $theRdate ) && ( 2 == count( $theRdate )) && // all days within PERIOD
+ array_key_exists( '0', $theRdate ) && array_key_exists( '1', $theRdate )) {
+ $rstart = $component->_date2timestamp( $theRdate[0] );
+ if(( $rstart < ( $startDate - $rdurWsecs )) || ( $rstart > $endDate ))
+ continue;
+ if( isset( $theRdate[1]['year'] )) // date-date period
+ $rend = $component->_date2timestamp( $theRdate[1] );
+ else { // date-duration period
+ $rend = $component->duration2date( $theRdate[0], $theRdate[1] );
+ $rend = $component->_date2timestamp( $rend );
+ }
+ if((( $startDate - $rdurWsecs ) <= $rstart ) && ( $endDate >= $rstart ))
+ $recurlist[$rstart] = ( $rstart - $rend ); // set start date + rdate duration in seconds
+ } // PERIOD end
+ else { // single date
+ $theRdate = $component->_date2timestamp( $theRdate );
+ if((( $startDate - $rdurWsecs ) <= $theRdate ) && ( $endDate >= $theRdate ))
+ $recurlist[$theRdate] = $rdurWsecs; // set start date + event duration in seconds
+ }
+ }
+ }
+ if( 0 < count( $recurlist )) {
+ ksort( $recurlist );
+ foreach( $recurlist as $recurkey => $durvalue ) {
+ if((( $startDate - $rdurWsecs ) > $recurkey ) || ( $endDate < $recurkey )) // not within period
+ continue;
+ if( isset( $exdatelist[$recurkey] )) // check excluded dates
+ continue;
+ if( $startWdate >= $recurkey ) // exclude component start date
+ continue;
+ $component2 = $component->copy();
+ $rstart = $component2->_timestamp2date( $recurkey, 6);
+ $datevalue = $rstart['month'].'/'.$rstart['day'].'/'.$rstart['year'];
+ if( isset( $start['hour'] ) || isset( $start['min'] ) || isset( $start['sec'] )) {
+ $datevalue .= ( isset( $rstart['hour'] )) ? ' '.$rstart['hour'] : ' 00';
+ $datevalue .= ( isset( $rstart['min'] )) ? ':'.$rstart['min'] : ':00';
+ $datevalue .= ( isset( $rstart['sec'] )) ? ':'.$rstart['sec'] : ':00';
+ }
+ $datestring = date( $startDateFormat, strtotime( $datevalue ));
+ if( isset( $start['tz'] ))
+ $datestring .= ' '.$start['tz'];
+ $component2->setProperty( 'X-CURRENT-DTSTART', $datestring );
+ $rend = $component2->_timestamp2date(( $recurkey + $durvalue ), 6);
+ if( $dtendExist || $dueExist ) {
+ if( $endAllDayEvent ) {
+ $rend2 = mktime( 0, 0, 0, $rend['month'], ($rend['day'] + 1), $rend['year'] );
+ $datevalue = date( 'm', $rend2 ).'/'.date( 'd', $rend2 ).'/'.date( 'Y', $rend2 );
+ }
+ else {
+ $datevalue = $rend['month'].'/'.$rend['day'].'/'.$rend['year'];
+ if( isset( $end['hour'] ) || isset( $end['min'] ) || isset( $end['sec'] )) {
+ $datevalue .= ( isset( $rend['hour'] )) ? ' '.$rend['hour'] : ' 00';
+ $datevalue .= ( isset( $rend['min'] )) ? ':'.$rend['min'] : ':00';
+ $datevalue .= ( isset( $rend['sec'] )) ? ':'.$rend['sec'] : ':00';
+ }
+ }
+ $datestring = date( $endDateFormat, strtotime( $datevalue ));
+ if( isset( $end['tz'] ))
+ $datestring .= ' '.$end['tz'];
+ if( $dtendExist )
+ $component2->setProperty( 'X-CURRENT-DTEND', $datestring );
+ elseif( $dueExist )
+ $component2->setProperty( 'X-CURRENT-DUE', $datestring );
+ }
+ $rend = $component2->_date2timestamp( $rend );
+ $rstart = $recurkey;
+ /* add repeating components within valid dates to output array, only start date */
+ if( $flat )
+ $result[] = $component2->copy(); // copy to output
+ elseif( $split ) {
+ if( $rend > $endDate )
+ $rend = $endDate;
+ while( $rstart <= $rend ) { // iterate
+ $wd = getdate( $rstart );
+ if(( $rstart > $startDate ) && // date after dtstart
+ !isset( $exdatelist[$rstart] )) // check exclude date
+ $result[$wd['year']][$wd['mon']][$wd['mday']][] = $component2->copy(); // copy to output
+ $rstart += ( 24*60*60 ); // step one day
+ }
+ }
+ elseif(( $rstart >= $startDate ) && // date within period
+ !isset( $exdatelist[$rstart] )) { // check exclude date
+ $wd = getdate( $rstart );
+ $result[$wd['year']][$wd['mon']][$wd['mday']][] = $component2->copy(); // copy to output
+ }
+ }
+ }
+ /* deselect components with startdate/enddate not within period */
+ if(( $endWdate < $startDate ) || ( $startWdate > $endDate )) continue;
+ }
+ /* deselect components with startdate not within period */
+ elseif(( $startWdate < $startDate ) || ( $startWdate > $endDate )) continue;
+ /* add selected components within valid dates to output array */
+ if( $flat )
+ $result[] = $component->copy(); // copy to output;
+ elseif( $split ) {
+ if( $endWdate > $endDate )
+ $endWdate = $endDate; // use period end date
+ if( !isset( $exdatelist[$startWdate] )) { // check excluded dates
+ if( $startWdate < $startDate )
+ $startWdate = $startDate; // use period start date
+ while( $startWdate <= $endWdate ) { // iterate
+ $wd = getdate( $startWdate );
+ $result[$wd['year']][$wd['mon']][$wd['mday']][] = $component->copy(); // copy to output
+ $startWdate += ( 24*60*60 ); // step one day
+ }
+ }
+ } // use component date
+ elseif( !isset( $exdatelist[$startWdate] ) && // check excluded dates
+ ( $startWdate >= $startDate )) { // within period
+ $wd = getdate( $startWdate );
+ $result[$wd['year']][$wd['mon']][$wd['mday']][] = $component->copy(); // copy to output
+ }
+ }
+ if( 0 >= count( $result )) return FALSE;
+ elseif( !$flat ) {
+ foreach( $result as $y => $yeararr ) {
+ foreach( $yeararr as $m => $montharr ) {
+ ksort( $result[$y][$m] );
+ }
+ ksort( $result[$y] );
+ }
+ ksort( $result );
+ }
+ return $result;
+ }
+/**
+ * add calendar component to container
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.4.10 - 2008-08-06
+ * @param object $component calendar component
+ * @param mixed $arg1 optional, ordno/component type/ component uid
+ * @param mixed $arg2 optional, ordno if arg1 = component type
+ * @return void
+ */
+ function setComponent( $component, $arg1=FALSE, $arg2=FALSE ) {
+ if( '' >= $component->getConfig( 'language'))
+ $component->setConfig( 'language', $this->getConfig( 'language' ));
+ $component->setConfig( 'allowEmpty', $this->getConfig( 'allowEmpty' ));
+ $component->setConfig( 'nl', $this->getConfig( 'nl' ));
+ $component->setConfig( 'unique_id', $this->getConfig( 'unique_id' ));
+ $component->setConfig( 'format', $this->getConfig( 'format' ));
+ if( !in_array( $component->objName, array( 'valarm', 'vtimezone' ))) {
+ unset( $component->propix );
+ /* make sure dtstamp and uid is set */
+ $dummy1 = $component->getProperty( 'dtstamp' );
+ $dummy2 = $component->getProperty( 'uid' );
+ }
+ if( !$arg1 ) {
+ $this->components[] = $component->copy();
+ return TRUE;
+ }
+ $argType = $index = null;
+ if ( ctype_digit( (string) $arg1 )) {
+ $argType = 'INDEX';
+ $index = (int) $arg1 - 1;
+ }
+ elseif(( strlen( $arg1 ) <= strlen( 'vfreebusy' )) && ( FALSE === strpos( $arg1, '@' ))) {
+ $argType = strtolower( $arg1 );
+ $index = ( ctype_digit( (string) $arg2 )) ? ((int) $arg2) - 1 : 0;
+ }
+ $cix1sC = 0;
+ foreach ( $this->components as $cix => $component2) {
+ if( empty( $component2 )) continue;
+ unset( $component2->propix );
+ if(( 'INDEX' == $argType ) && ( $index == $cix )) {
+ $this->components[$cix] = $component->copy();
+ return TRUE;
+ }
+ elseif( $argType == $component2->objName ) {
+ if( $index == $cix1sC ) {
+ $this->components[$cix] = $component->copy();
+ return TRUE;
+ }
+ $cix1sC++;
+ }
+ elseif( !$argType && ( $arg1 == $component2->getProperty( 'uid' ))) {
+ $this->components[$cix] = $component->copy();
+ return TRUE;
+ }
+ }
+ /* not found.. . insert last in chain anyway .. .*/
+ $this->components[] = $component->copy();
+ return TRUE;
+ }
+/**
+ * sort iCal compoments, only local date sort
+ *
+ * ascending sort on properties (if exist) x-current-dtstart, dtstart,
+ * x-current-dtend, dtend, x-current-due, due, duration, created, dtstamp, uid
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.4.10 - 2008-09-24
+ * @return sort param
+ *
+ */
+ function sort() {
+ if( is_array( $this->components )) {
+ $this->_sortkeys = array( 'year', 'month', 'day', 'hour', 'min', 'sec' );
+ usort( $this->components, array( $this, '_cmpfcn' ));
+ }
+ }
+ function _cmpfcn( $a, $b ) {
+ if( empty( $a )) return -1;
+ if( empty( $b )) return 1;
+ if( 'vtimezone' == $a->objName) return -1;
+ if( 'vtimezone' == $b->objName) return 1;
+ $astart = ( isset( $a->xprop['X-CURRENT-DTSTART']['value'] )) ? $a->_date_time_string( $a->xprop['X-CURRENT-DTSTART']['value'] ) : null;
+ if( empty( $astart ) && isset( $a->dtstart['value'] ))
+ $astart = & $a->dtstart['value'];
+ $bstart = ( isset( $b->xprop['X-CURRENT-DTSTART']['value'] )) ? $b->_date_time_string( $b->xprop['X-CURRENT-DTSTART']['value'] ) : null;
+ if( empty( $bstart ) && isset( $b->dtstart['value'] ))
+ $bstart = & $b->dtstart['value'];
+ if( empty( $astart )) return -1;
+ elseif( empty( $bstart )) return 1;
+ foreach( $this->_sortkeys as $key ) {
+ if ( empty( $astart[$key] )) return -1;
+ elseif( empty( $bstart[$key] )) return 1;
+ if ( $astart[$key] == $bstart[$key]) continue;
+ if (( (int) $astart[$key] ) < ((int) $bstart[$key] ))
+ return -1;
+ elseif(( (int) $astart[$key] ) > ((int) $bstart[$key] ))
+ return 1;
+ }
+ $c = ( isset( $a->xprop['X-CURRENT-DTEND']['value'] )) ? $a->_date_time_string( $a->xprop['X-CURRENT-DTEND']['value'] ) : null;
+ if( empty( $c ) && !empty( $a->dtend['value'] ))
+ $c = & $a->dtend['value'];
+ if( empty( $c ) && isset( $a->xprop['X-CURRENT-DUE']['value'] ))
+ $c = $a->_date_time_string( $a->xprop['X-CURRENT-DUE']['value'] );
+ if( empty( $c ) && !empty( $a->due['value'] ))
+ $c = & $a->due['value'];
+ if( empty( $c ) && !empty( $a->duration['value'] ))
+ $c = $a->duration2date();
+ $d = ( isset( $b->xprop['X-CURRENT-DTEND']['value'] )) ? $b->_date_time_string( $b->xprop['X-CURRENT-DTEND']['value'] ) : null;
+ if( empty( $d ) && !empty( $b->dtend['value'] ))
+ $d = & $b->dtend['value'];
+ if( empty( $d ) && isset( $b->xprop['X-CURRENT-DUE']['value'] ))
+ $d = $b->_date_time_string( $b->xprop['X-CURRENT-DUE']['value'] );
+ if( empty( $d ) && !empty( $b->due['value'] ))
+ $d = & $b->due['value'];
+ if( empty( $d ) && !empty( $b->duration['value'] ))
+ $d = $b->duration2date();
+ if( empty( $c )) return -1;
+ elseif( empty( $d )) return 1;
+ foreach( $this->_sortkeys as $key ) {
+ if ( !isset( $c[$key] )) return -1;
+ elseif( !isset( $d[$key] )) return 1;
+ if ( $c[$key] == $d[$key] ) continue;
+ if (( (int) $c[$key] ) < ((int) $d[$key])) return -1;
+ elseif(( (int) $c[$key] ) > ((int) $d[$key])) return 1;
+ }
+ if( isset( $a->created['value'] ))
+ $e = & $a->created['value'];
+ else
+ $e = & $a->dtstamp['value'];
+ if( isset( $b->created['value'] ))
+ $f = & $b->created['value'];
+ else
+ $f = & $b->dtstamp['value'];
+ foreach( $this->_sortkeys as $key ) {
+ if( !isset( $e[$key] )) return -1;
+ elseif( !isset( $f[$key] )) return 1;
+ if ( $e[$key] == $f[$key] ) continue;
+ if (( (int) $e[$key] ) < ((int) $f[$key])) return -1;
+ elseif(( (int) $e[$key] ) > ((int) $f[$key])) return 1;
+ }
+ if (( $a->uid['value'] ) <
+ ( $b->uid['value'] )) return -1;
+ elseif(( $a->uid['value'] ) >
+ ( $b->uid['value'] )) return 1;
+ return 0;
+ }
+/**
+ * parse iCal file into vcalendar, components, properties and parameters
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.4.10 - 2008-08-06
+ * @param string $filename optional filname (incl. opt. directory/path) or URL
+ * @return bool FALSE if error occurs during parsing
+ *
+ */
+ function parse( $filename=FALSE ) {
+ if( !$filename ) {
+ /* directory/filename previous set via setConfig directory+filename / url */
+ if( FALSE === ( $filename = $this->getConfig( 'url' )))
+ $filename = $this->getConfig( 'dirfile' );
+ }
+ elseif(( 'http://' == strtolower( substr( $filename, 0, 7 ))) ||
+ ( 'webcal://' == strtolower( substr( $filename, 0, 9 )))) {
+ /* remote file - URL */
+ $this->setConfig( 'URL', $filename );
+ if( !$filename = $this->getConfig( 'url' ))
+ return FALSE; /* err 2 */
+ }
+ else {
+ /* local directory/filename */
+ $parts = pathinfo( $filename );
+ if( !empty( $parts['dirname'] ) && ( '.' != $parts['dirname'] )) {
+ if( !$this->setConfig( 'directory', $parts['dirname'] ))
+ return FALSE; /* err 3 */
+ }
+ if( !$this->setConfig( 'filename', $parts['basename'] ))
+ return FALSE; /* err 4 */
+ }
+ if( 'http://' != substr( $filename, 0, 7 )) {
+ /* local file error tests */
+ if( !is_file( $filename )) /* err 5 */
+ return FALSE;
+ if( !is_readable( $filename ))
+ return FALSE; /* err 6 */
+ if( !filesize( $filename ))
+ return FALSE; /* err 7 */
+ clearstatcache();
+ }
+ /* READ FILE */
+ if( FALSE === ( $rows = file( $filename )))
+ return FALSE; /* err 1 */
+ /* identify BEGIN:VCALENDAR, MUST be first row */
+ if( 'BEGIN:VCALENDAR' != strtoupper( trim( $rows[0] )))
+ return FALSE; /* err 8 */
+ /* remove empty trailing lines */
+ while( '' == trim( $rows[count( $rows ) - 1] )) {
+ unset( $rows[count( $rows ) - 1] );
+ $rows = array_values( $rows );
+ }
+ /* identify ending END:VCALENDAR row */
+ if( 'END:VCALENDAR' != strtoupper( trim( $rows[count( $rows ) - 1] ))) {
+ return FALSE; /* err 9 */
+ }
+ if( 3 > count( $rows ))
+ return FALSE; /* err 10 */
+ $comp = $subcomp = null;
+ $actcomp = & $this;
+ $nl = $this->getConfig( 'nl' );
+ $calsync = 0;
+ /* identify components and update unparsed data within component */
+ foreach( $rows as $line ) {
+ if( '' == trim( $line ))
+ continue;
+ if( $nl == substr( $line, 0 - strlen( $nl )))
+ $line = substr( $line, 0, ( strlen( $line ) - strlen( $nl ))).'\n';
+ if( 'BEGIN:VCALENDAR' == strtoupper( substr( $line, 0, 15 ))) {
+ $calsync++;
+ continue;
+ }
+ elseif( 'END:VCALENDAR' == strtoupper( substr( $line, 0, 13 ))) {
+ $calsync--;
+ continue;
+ }
+ elseif( 1 != $calsync )
+ return FALSE; /* err 20 */
+ if( 'END:' == strtoupper( substr( $line, 0, 4 ))) {
+ if( null != $subcomp ) {
+ $comp->setComponent( $subcomp );
+ $subcomp = null;
+ }
+ else {
+ $this->setComponent( $comp );
+ $comp = null;
+ }
+ $actcomp = null;
+ continue;
+ } // end - if ( 'END:' ==.. .
+ elseif( 'BEGIN:' == strtoupper( substr( $line, 0, 6 ))) {
+ $line = str_replace( '\n', '', $line );
+ $compname = trim (strtoupper( substr( $line, 6 )));
+ if( null != $comp ) {
+ if( 'VALARM' == $compname )
+ $subcomp = new valarm();
+ elseif( 'STANDARD' == $compname )
+ $subcomp = new vtimezone( 'STANDARD' );
+ elseif( 'DAYLIGHT' == $compname )
+ $subcomp = new vtimezone( 'DAYLIGHT' );
+ else
+ return FALSE; /* err 6 */
+ $actcomp = & $subcomp;
+ }
+ else {
+ switch( $compname ) {
+ case 'VALARM':
+ $comp = new valarm();
+ break;
+ case 'VEVENT':
+ $comp = new vevent();
+ break;
+ case 'VFREEBUSY';
+ $comp = new vfreebusy();
+ break;
+ case 'VJOURNAL':
+ $comp = new vjournal();
+ break;
+ case 'VTODO':
+ $comp = new vtodo();
+ break;
+ case 'VTIMEZONE':
+ $comp = new vtimezone();
+ break;
+ default:
+ return FALSE; // err 7
+ break;
+ } // end - switch
+ $actcomp = & $comp;
+ }
+ continue;
+ } // end - elsif ( 'BEGIN:'.. .
+ /* update selected component with unparsed data */
+ $actcomp->unparsed[] = $line;
+ } // end - foreach( rows.. .
+ /* parse data for calendar (this) object */
+ if( is_array( $this->unparsed ) && ( 0 < count( $this->unparsed ))) {
+ /* concatenate property values spread over several lines */
+ $lastix = -1;
+ $propnames = array( 'calscale','method','prodid','version','x-' );
+ $proprows = array();
+ foreach( $this->unparsed as $line ) {
+ $newProp = FALSE;
+ foreach ( $propnames as $propname ) {
+ if( $propname == strtolower( substr( $line, 0, strlen( $propname )))) {
+ $newProp = TRUE;
+ break;
+ }
+ }
+ if( $newProp ) {
+ $newProp = FALSE;
+ $lastix++;
+ $proprows[$lastix] = $line;
+ }
+ else {
+ /* remove line breaks */
+ if(( '\n' == substr( $proprows[$lastix], -2 )) &&
+ ( ' ' == substr( $line, 0, 1 ))) {
+ $proprows[$lastix] = substr( $proprows[$lastix], 0, strlen( $proprows[$lastix] ) - 2 );
+ $line = substr( $line, 1 );
+ }
+ $proprows[$lastix] .= $line;
+ }
+ }
+ $toolbox = new calendarComponent();
+ foreach( $proprows as $line ) {
+ if( '\n' == substr( $line, -2 ))
+ $line = substr( $line, 0, strlen( $line ) - 2 );
+ /* get propname */
+ $cix = $propname = null;
+ for( $cix=0; $cix < strlen( $line ); $cix++ ) {
+ if( in_array( $line{$cix}, array( ':', ';' )))
+ break;
+ else
+ $propname .= $line{$cix};
+ }
+ /* ignore version/prodid properties */
+ if( in_array( strtoupper( $propname ), array( 'VERSION', 'PRODID' )))
+ continue;
+ $line = substr( $line, $cix);
+ /* separate attributes from value */
+ $attr = array();
+ $attrix = -1;
+ $strlen = strlen( $line );
+ for( $cix=0; $cix < $strlen; $cix++ ) {
+ if(( ':' == $line{$cix} ) &&
+ ( '://' != substr( $line, $cix, 3 )) &&
+ ( 'mailto:' != strtolower( substr( $line, $cix - 6, 7 )))) {
+ $attrEnd = TRUE;
+ if(( $cix < ( $strlen - 4 )) &&
+ ctype_digit( substr( $line, $cix+1, 4 ))) { // an URI with a (4pos) portnr??
+ for( $c2ix = $cix; 3 < $c2ix; $c2ix-- ) {
+ if( '://' == substr( $line, $c2ix - 2, 3 )) {
+ $attrEnd = FALSE;
+ break; // an URI with a portnr!!
+ }
+ }
+ }
+ if( $attrEnd) {
+ $line = substr( $line, $cix + 1 );
+ break;
+ }
+ }
+ if( ';' == $line{$cix} )
+ $attr[++$attrix] = null;
+ else
+ $attr[$attrix] .= $line{$cix};
+ }
+
+ /* make attributes in array format */
+ $propattr = array();
+ foreach( $attr as $attribute ) {
+ $attrsplit = explode( '=', $attribute, 2 );
+ if( 1 < count( $attrsplit ))
+ $propattr[$attrsplit[0]] = $attrsplit[1];
+ else
+ $propattr[] = $attribute;
+ }
+ /* update Property */
+ if( FALSE !== strpos( $line, ',' )) {
+ $content = explode( ',', $line );
+ $clen = count( $content );
+ for( $cix = 0; $cix < $clen; $cix++ ) {
+ if( "\\" == substr( $content[$cix], -1 )) {
+ $content[$cix] .= ','.$content[$cix + 1];
+ unset( $content[$cix + 1] );
+ $cix++;
+ }
+ }
+ if( 1 < count( $content )) {
+ foreach( $content as $cix => $contentPart )
+ $content[$cix] = $toolbox->_strunrep( $contentPart );
+ $this->setProperty( $propname, $content, $propattr );
+ continue;
+ }
+ else
+ $line = reset( $content );
+ $line = $toolbox->_strunrep( $line );
+ }
+ $this->setProperty( $propname, trim( $line ), $propattr );
+ } // end - foreach( $this->unparsed.. .
+ } // end - if( is_array( $this->unparsed.. .
+ /* parse Components */
+ if( is_array( $this->components ) && ( 0 < count( $this->components ))) {
+ for( $six = 0; $six < count( $this->components ); $six++ ) {
+ if( !empty( $this->components[$six] ))
+ $this->components[$six]->parse();
+ }
+ }
+ else
+ return FALSE; /* err 91 or something.. . */
+ return TRUE;
+ }
+/*********************************************************************************/
+/**
+ * creates formatted output for calendar object instance
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.4.10 - 2008-08-06
+ * @return string
+ */
+ function createCalendar() {
+ $calendarInit1 = $calendarInit2 = $calendarxCaldecl = $calendarStart = $calendar = null;
+ switch( $this->format ) {
+ case 'xcal':
+ $calendarInit1 = '<?xml version="1.0" encoding="UTF-8"?>'.$this->nl.
+ '<!DOCTYPE iCalendar PUBLIC "-//IETF//DTD XCAL/iCalendar XML//EN"'.$this->nl.
+ '"http://www.ietf.org/internet-drafts/draft-ietf-calsch-many-xcal-01.txt"';
+ $calendarInit2 = '>'.$this->nl;
+ $calendarStart = '<vcalendar';
+ break;
+ default:
+ $calendarStart = 'BEGIN:VCALENDAR'.$this->nl;
+ break;
+ }
+ $calendarStart .= $this->createCalscale();
+ $calendarStart .= $this->createMethod();
+ $calendarStart .= $this->createProdid();
+ $calendarStart .= $this->createVersion();
+ switch( $this->format ) {
+ case 'xcal':
+ $nlstrlen = strlen( $this->nl );
+ if( $this->nl == substr( $calendarStart, ( 0 - $nlstrlen )))
+ $calendarStart = substr( $calendarStart, 0, ( strlen( $calendarStart ) - $nlstrlen ));
+ $calendarStart .= '>'.$this->nl;
+ break;
+ default:
+ break;
+ }
+ $calendar .= $this->createXprop();
+ foreach( $this->components as $component ) {
+ if( empty( $component )) continue;
+ if( '' >= $component->getConfig( 'language'))
+ $component->setConfig( 'language', $this->getConfig( 'language' ));
+ $component->setConfig( 'allowEmpty', $this->getConfig( 'allowEmpty' ));
+ $component->setConfig( 'nl', $this->getConfig( 'nl' ));
+ $component->setConfig( 'unique_id', $this->getConfig( 'unique_id' ));
+ $component->setConfig( 'format', $this->getConfig( 'format' ));
+ $calendar .= $component->createComponent( $this->xcaldecl );
+ }
+ if(( 0 < count( $this->xcaldecl )) && ( 'xcal' == $this->format )) { // xCal only
+ $calendarInit1 .= $this->nl.'['.$this->nl;
+ $old_xcaldecl = array();
+ foreach( $this->xcaldecl as $declix => $declPart ) {
+ if(( 0 < count( $old_xcaldecl)) &&
+ ( in_array( $declPart['uri'], $old_xcaldecl['uri'] )) &&
+ ( in_array( $declPart['external'], $old_xcaldecl['external'] )))
+ continue; // no duplicate uri and ext. references
+ $calendarxCaldecl .= '<!';
+ foreach( $declPart as $declKey => $declValue ) {
+ switch( $declKey ) { // index
+ case 'xmldecl': // no 1
+ $calendarxCaldecl .= $declValue.' ';
+ break;
+ case 'uri': // no 2
+ $calendarxCaldecl .= $declValue.' ';
+ $old_xcaldecl['uri'][] = $declValue;
+ break;
+ case 'ref': // no 3
+ $calendarxCaldecl .= $declValue.' ';
+ break;
+ case 'external': // no 4
+ $calendarxCaldecl .= '"'.$declValue.'" ';
+ $old_xcaldecl['external'][] = $declValue;
+ break;
+ case 'type': // no 5
+ $calendarxCaldecl .= $declValue.' ';
+ break;
+ case 'type2': // no 6
+ $calendarxCaldecl .= $declValue;
+ break;
+ }
+ }
+ $calendarxCaldecl .= '>'.$this->nl;
+ }
+ $calendarInit2 = ']'.$calendarInit2;
+ }
+ switch( $this->format ) {
+ case 'xcal':
+ $calendar .= '</vcalendar>'.$this->nl;
+ break;
+ default:
+ $calendar .= 'END:VCALENDAR'.$this->nl;
+ break;
+ }
+ return $calendarInit1.$calendarxCaldecl.$calendarInit2.$calendarStart.$calendar;
+ }
+/**
+ * a HTTP redirect header is sent with created, updated and/or parsed calendar
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.2.12 - 2007-10-23
+ * @return redirect
+ */
+ function returnCalendar() {
+ $filename = $this->getConfig( 'filename' );
+ $output = $this->createCalendar();
+ $filesize = strlen( $output );
+// if( headers_sent( $filename, $linenum ))
+// die( "Headers already sent in $filename on line $linenum\n" );
+ if( 'xcal' == $this->format )
+ header( 'Content-Type: application/calendar+xml; charset=utf-8' );
+ else
+ header( 'Content-Type: text/calendar; charset=utf-8' );
+ header( 'Content-Length: '.$filesize );
+ header( 'Content-Disposition: attachment; filename="'.$filename.'"' );
+ header( 'Cache-Control: max-age=10' );
+ echo $output;
+ die();
+ }
+/**
+ * save content in a file
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.2.12 - 2007-12-30
+ * @param string $directory optional
+ * @param string $filename optional
+ * @param string $delimiter optional
+ * @return bool
+ */
+ function saveCalendar( $directory=FALSE, $filename=FALSE, $delimiter=FALSE ) {
+ if( $directory )
+ $this->setConfig( 'directory', $directory );
+ if( $filename )
+ $this->setConfig( 'filename', $filename );
+ if( $delimiter && ($delimiter != DIRECTORY_SEPARATOR ))
+ $this->setConfig( 'delimiter', $delimiter );
+ if( FALSE === ( $dirfile = $this->getConfig( 'url' )))
+ $dirfile = $this->getConfig( 'dirfile' );
+ $iCalFile = @fopen( $dirfile, 'w' );
+ if( $iCalFile ) {
+ if( FALSE === fwrite( $iCalFile, $this->createCalendar() ))
+ return FALSE;
+ fclose( $iCalFile );
+ return TRUE;
+ }
+ else
+ return FALSE;
+ }
+/**
+ * if recent version of calendar file exists (default one hour), an HTTP redirect header is sent
+ * else FALSE is returned
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.2.12 - 2007-10-28
+ * @param string $directory optional alt. int timeout
+ * @param string $filename optional
+ * @param string $delimiter optional
+ * @param int timeout optional, default 3600 sec
+ * @return redirect/FALSE
+ */
+ function useCachedCalendar( $directory=FALSE, $filename=FALSE, $delimiter=FALSE, $timeout=3600) {
+ if ( $directory && ctype_digit( (string) $directory ) && !$filename ) {
+ $timeout = (int) $directory;
+ $directory = FALSE;
+ }
+ if( $directory )
+ $this->setConfig( 'directory', $directory );
+ if( $filename )
+ $this->setConfig( 'filename', $filename );
+ if( $delimiter && ( $delimiter != DIRECTORY_SEPARATOR ))
+ $this->setConfig( 'delimiter', $delimiter );
+ $filesize = $this->getConfig( 'filesize' );
+ if( 0 >= $filesize )
+ return FALSE;
+ $dirfile = $this->getConfig( 'dirfile' );
+ if( time() - filemtime( $dirfile ) < $timeout) {
+ clearstatcache();
+ $dirfile = $this->getConfig( 'dirfile' );
+ $filename = $this->getConfig( 'filename' );
+// if( headers_sent( $filename, $linenum ))
+// die( "Headers already sent in $filename on line $linenum\n" );
+ if( 'xcal' == $this->format )
+ header( 'Content-Type: application/calendar+xml; charset=utf-8' );
+ else
+ header( 'Content-Type: text/calendar; charset=utf-8' );
+ header( 'Content-Length: '.$filesize );
+ header( 'Content-Disposition: attachment; filename="'.$filename.'"' );
+ header( 'Cache-Control: max-age=10' );
+ $fp = @$fopen( $dirfile, 'r' );
+ if( $fp ) {
+ fpassthru( $fp );
+ fclose( $fp );
+ }
+ die();
+ }
+ else
+ return FALSE;
+ }
+}
+/*********************************************************************************/
+/*********************************************************************************/
+/**
+ * abstract class for calendar components
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.4.19 - 2008-10-12
+ */
+class calendarComponent {
+ // component property variables
+ var $uid;
+ var $dtstamp;
+
+ // component config variables
+ var $allowEmpty;
+ var $language;
+ var $nl;
+ var $unique_id;
+ var $format;
+ var $objName; // created automatically at instance creation
+ // component internal variables
+ var $componentStart1;
+ var $componentStart2;
+ var $componentEnd1;
+ var $componentEnd2;
+ var $elementStart1;
+ var $elementStart2;
+ var $elementEnd1;
+ var $elementEnd2;
+ var $intAttrDelimiter;
+ var $attributeDelimiter;
+ var $valueInit;
+ // component xCal declaration container
+ var $xcaldecl;
+/**
+ * constructor for calendar component object
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.4.19 - 2008-10-23
+ */
+ function calendarComponent() {
+ $this->objName = ( isset( $this->timezonetype )) ?
+ strtolower( $this->timezonetype ) : get_class ( $this );
+ $this->uid = array();
+ $this->dtstamp = array();
+
+ $this->language = null;
+ $this->nl = null;
+ $this->unique_id = null;
+ $this->format = null;
+ $this->allowEmpty = TRUE;
+ $this->xcaldecl = array();
+
+ $this->_createFormat();
+ $this->_makeDtstamp();
+ }
+/*********************************************************************************/
+/**
+ * Property Name: ACTION
+ */
+/**
+ * creates formatted output for calendar component property action
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.4.8 - 2008-10-22
+ * @return string
+ */
+ function createAction() {
+ if( empty( $this->action )) return FALSE;
+ if( empty( $this->action['value'] ))
+ return ( $this->getConfig( 'allowEmpty' )) ? $this->_createElement( 'ACTION' ) : FALSE;
+ $attributes = $this->_createParams( $this->action['params'] );
+ return $this->_createElement( 'ACTION', $attributes, $this->action['value'] );
+ }
+/**
+ * set calendar component property action
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.4.8 - 2008-11-04
+ * @param string $value "AUDIO" / "DISPLAY" / "EMAIL" / "PROCEDURE"
+ * @param mixed $params
+ * @return bool
+ */
+ function setAction( $value, $params=FALSE ) {
+ if( empty( $value )) if( $this->getConfig( 'allowEmpty' )) $value = null; else return FALSE;
+ $this->action = array( 'value' => $value, 'params' => $this->_setParams( $params ));
+ return TRUE;
+ }
+/*********************************************************************************/
+/**
+ * Property Name: ATTACH
+ */
+/**
+ * creates formatted output for calendar component property attach
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 0.9.7 - 2006-11-23
+ * @return string
+ */
+ function createAttach() {
+ if( empty( $this->attach )) return FALSE;
+ $output = null;
+ foreach( $this->attach as $attachPart ) {
+ if(! empty( $attachPart['value'] )) {
+ $attributes = $this->_createParams( $attachPart['params'] );
+ $output .= $this->_createElement( 'ATTACH', $attributes, $attachPart['value'] );
+ }
+ elseif( $this->getConfig( 'allowEmpty' )) $output .= $this->_createElement( 'ATTACH' );
+ }
+ return $output;
+ }
+/**
+ * set calendar component property attach
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.5.1 - 2008-11-06
+ * @param string $value
+ * @param array $params, optional
+ * @param integer $index, optional
+ * @return bool
+ */
+ function setAttach( $value, $params=FALSE, $index=FALSE ) {
+ if( empty( $value )) if( $this->getConfig( 'allowEmpty' )) $value = null; else return FALSE;
+ $this->_setMval( $this->attach, $value, $params, FALSE, $index );
+ return TRUE;
+ }
+/*********************************************************************************/
+/**
+ * Property Name: ATTENDEE
+ */
+/**
+ * creates formatted output for calendar component property attendee
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.4.8 - 2008-09-23
+ * @return string
+ */
+ function createAttendee() {
+ if( empty( $this->attendee )) return FALSE;
+ $output = null;
+ foreach( $this->attendee as $attendeePart ) { // start foreach 1
+ if( empty( $attendeePart['value'] )) {
+ if( $this->getConfig( 'allowEmpty' ))
+ $output .= $this->_createElement( 'ATTENDEE' );
+ continue;
+ }
+ $attendee1 = $attendee2 = $attendeeLANG = $attendeeCN = null;
+ foreach( $attendeePart as $paramlabel => $paramvalue ) { // start foreach 2
+ if( 'value' == $paramlabel )
+ $attendee2 .= 'MAILTO:'.$paramvalue;
+ elseif(( 'params' == $paramlabel ) && ( is_array( $paramvalue ))) { // start elseif
+ foreach( $paramvalue as $optparamlabel => $optparamvalue ) { // start foreach 3
+ $attendee11 = $attendee12 = null;
+ if( is_int( $optparamlabel )) {
+ $attendee1 .= $this->intAttrDelimiter.$optparamvalue;
+ continue;
+ }
+ switch( $optparamlabel ) { // start switch
+ case 'CUTYPE':
+ case 'PARTSTAT':
+ case 'ROLE':
+ case 'RSVP':
+ $attendee1 .= $this->intAttrDelimiter.$optparamlabel.'="'.$optparamvalue.'"';
+ break;
+ case 'SENT-BY':
+ $attendee1 .= $this->intAttrDelimiter.'SENT-BY="MAILTO:'.$optparamvalue.'"';
+ break;
+ case 'MEMBER':
+ $attendee11 = $this->intAttrDelimiter.'MEMBER=';
+ case 'DELEGATED-TO':
+ $attendee11 = ( !$attendee11 ) ? $this->intAttrDelimiter.'DELEGATED-TO=' : $attendee11;
+ case 'DELEGATED-FROM':
+ $attendee11 = ( !$attendee11 ) ? $this->intAttrDelimiter.'DELEGATED-FROM=' : $attendee11;
+ foreach( $optparamvalue as $cix => $calUserAddress ) {
+ $attendee12 .= ( $cix ) ? ',' : null;
+ $attendee12 .= '"MAILTO:'.$calUserAddress.'"';
+ }
+ $attendee1 .= $attendee11.$attendee12;
+ break;
+ case 'CN':
+ $attendeeCN .= $this->intAttrDelimiter.'CN="'.$optparamvalue.'"';
+ break;
+ case 'DIR':
+ $attendee1 .= $this->intAttrDelimiter.'DIR="'.$optparamvalue.'"';
+ break;
+ case 'LANGUAGE':
+ $attendeeLANG .= $this->intAttrDelimiter.'LANGUAGE='.$optparamvalue;
+ break;
+ default:
+ $attendee1 .= $this->intAttrDelimiter."$optparamlabel=$optparamvalue";
+ break;
+ } // end switch
+ } // end foreach 3
+ } // end elseif
+ } // end foreach 2
+ $output .= $this->_createElement( 'ATTENDEE', $attendee1.$attendeeLANG.$attendeeCN, $attendee2 );
+ } // end foreach 1
+ return $output;
+ }
+/**
+ * set calendar component property attach
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.5.1 - 2008-11-05
+ * @param string $value
+ * @param array $params, optional
+ * @param integer $index, optional
+ * @return bool
+ */
+ function setAttendee( $value, $params=FALSE, $index=FALSE ) {
+ if( empty( $value )) if( $this->getConfig( 'allowEmpty' )) $value = null; else return FALSE;
+ $value = str_replace ( 'MAILTO:', '', $value );
+ $value = str_replace ( 'mailto:', '', $value );
+ $params2 = array();
+ if( is_array($params )) {
+ $optarrays = array();
+ foreach( $params as $optparamlabel => $optparamvalue ) {
+ $optparamlabel = strtoupper( $optparamlabel );
+ switch( $optparamlabel ) {
+ case 'MEMBER':
+ case 'DELEGATED-TO':
+ case 'DELEGATED-FROM':
+ if( is_array( $optparamvalue )) {
+ foreach( $optparamvalue as $part ) {
+ $part = str_replace( 'MAILTO:', '', $part );
+ $part = str_replace( 'mailto:', '', $part );
+ if(( '"' == $part{0} ) && ( '"' == $part{strlen($part)-1} ))
+ $part = substr( $part, 1, ( strlen($part)-2 ));
+ $optarrays[$optparamlabel][] = $part;
+ }
+ }
+ else {
+ $part = str_replace( 'MAILTO:', '', $optparamvalue );
+ $part = str_replace( 'mailto:', '', $part );
+ if(( '"' == $part{0} ) && ( '"' == $part{strlen($part)-1} ))
+ $part = substr( $part, 1, ( strlen($part)-2 ));
+ $optarrays[$optparamlabel][] = $part;
+ }
+ break;
+ default:
+ if( 'SENT-BY' == $optparamlabel ) {
+ $optparamvalue = str_replace( 'MAILTO:', '', $optparamvalue );
+ $optparamvalue = str_replace( 'mailto:', '', $optparamvalue );
+ }
+ if(( '"' == substr( $optparamvalue, 0, 1 )) &&
+ ( '"' == substr( $optparamvalue, -1 )))
+ $optparamvalue = substr( $optparamvalue, 1, ( strlen( $optparamvalue ) - 2 ));
+ $params2[$optparamlabel] = $optparamvalue;
+ break;
+ } // end switch( $optparamlabel.. .
+ } // end foreach( $optparam.. .
+ foreach( $optarrays as $optparamlabel => $optparams )
+ $params2[$optparamlabel] = $optparams;
+ }
+ // remove defaults
+ $this->_existRem( $params2, 'CUTYPE', 'INDIVIDUAL' );
+ $this->_existRem( $params2, 'PARTSTAT', 'NEEDS-ACTION' );
+ $this->_existRem( $params2, 'ROLE', 'REQ-PARTICIPANT' );
+ $this->_existRem( $params2, 'RSVP', 'FALSE' );
+ // check language setting
+ if( isset( $params2['CN' ] )) {
+ $lang = $this->getConfig( 'language' );
+ if( !isset( $params2['LANGUAGE' ] ) && !empty( $lang ))
+ $params2['LANGUAGE' ] = $lang;
+ }
+ $this->_setMval( $this->attendee, $value, $params2, FALSE, $index );
+ return TRUE;
+ }
+/*********************************************************************************/
+/**
+ * Property Name: CATEGORIES
+ */
+/**
+ * creates formatted output for calendar component property categories
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.4.8 - 2008-10-22
+ * @return string
+ */
+ function createCategories() {
+ if( empty( $this->categories )) return FALSE;
+ $output = null;
+ foreach( $this->categories as $category ) {
+ if( empty( $category['value'] )) {
+ if ( $this->getConfig( 'allowEmpty' ))
+ $output .= $this->_createElement( 'CATEGORIES' );
+ continue;
+ }
+ $attributes = $this->_createParams( $category['params'], array( 'LANGUAGE' ));
+ if( is_array( $category['value'] )) {
+ foreach( $category['value'] as $cix => $categoryPart )
+ $category['value'][$cix] = $this->_strrep( $categoryPart );
+ $content = implode( ',', $category['value'] );
+ }
+ else
+ $content = $this->_strrep( $category['value'] );
+ $output .= $this->_createElement( 'CATEGORIES', $attributes, $content );
+ }
+ return $output;
+ }
+/**
+ * set calendar component property categories
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.5.1 - 2008-11-06
+ * @param mixed $value
+ * @param array $params, optional
+ * @param integer $index, optional
+ * @return bool
+ */
+ function setCategories( $value, $params=FALSE, $index=FALSE ) {
+ if( empty( $value )) if( $this->getConfig( 'allowEmpty' )) $value = null; else return FALSE;
+ $this->_setMval( $this->categories, $value, $params, FALSE, $index );
+ return TRUE;
+ }
+/*********************************************************************************/
+/**
+ * Property Name: CLASS
+ */
+/**
+ * creates formatted output for calendar component property class
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 0.9.7 - 2006-11-20
+ * @return string
+ */
+ function createClass() {
+ if( empty( $this->class )) return FALSE;
+ if( empty( $this->class['value'] ))
+ return ( $this->getConfig( 'allowEmpty' )) ? $this->_createElement( 'CLASS' ) : FALSE;
+ $attributes = $this->_createParams( $this->class['params'] );
+ return $this->_createElement( 'CLASS', $attributes, $this->class['value'] );
+ }
+/**
+ * set calendar component property class
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.4.8 - 2008-11-04
+ * @param string $value "PUBLIC" / "PRIVATE" / "CONFIDENTIAL" / iana-token / x-name
+ * @param array $params optional
+ * @return bool
+ */
+ function setClass( $value, $params=FALSE ) {
+ if( empty( $value )) if( $this->getConfig( 'allowEmpty' )) $value = null; else return FALSE;
+ $this->class = array( 'value' => $value, 'params' => $this->_setParams( $params ));
+ return TRUE;
+ }
+/*********************************************************************************/
+/**
+ * Property Name: COMMENT
+ */
+/**
+ * creates formatted output for calendar component property comment
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.4.8 - 2008-10-22
+ * @return string
+ */
+ function createComment() {
+ if( empty( $this->comment )) return FALSE;
+ $output = null;
+ foreach( $this->comment as $commentPart ) {
+ if( empty( $commentPart['value'] )) {
+ if( $this->getConfig( 'allowEmpty' )) $output .= $this->_createElement( 'COMMENT' );
+ continue;
+ }
+ $attributes = $this->_createParams( $commentPart['params'], array( 'ALTREP', 'LANGUAGE' ));
+ $content = $this->_strrep( $commentPart['value'] );
+ $output .= $this->_createElement( 'COMMENT', $attributes, $content );
+ }
+ return $output;
+ }
+/**
+ * set calendar component property comment
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.5.1 - 2008-11-06
+ * @param string $value
+ * @param array $params, optional
+ * @param integer $index, optional
+ * @return bool
+ */
+ function setComment( $value, $params=FALSE, $index=FALSE ) {
+ if( empty( $value )) if( $this->getConfig( 'allowEmpty' )) $value = null; else return FALSE;
+ $this->_setMval( $this->comment, $value, $params, FALSE, $index );
+ return TRUE;
+ }
+/*********************************************************************************/
+/**
+ * Property Name: COMPLETED
+ */
+/**
+ * creates formatted output for calendar component property completed
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.4.8 - 2008-10-22
+ * @return string
+ */
+ function createCompleted( ) {
+ if( empty( $this->completed )) return FALSE;
+ if( !isset( $this->completed['value']['year'] ) &&
+ !isset( $this->completed['value']['month'] ) &&
+ !isset( $this->completed['value']['day'] ) &&
+ !isset( $this->completed['value']['hour'] ) &&
+ !isset( $this->completed['value']['min'] ) &&
+ !isset( $this->completed['value']['sec'] ))
+ if( $this->getConfig( 'allowEmpty' ))
+ return $this->_createElement( 'COMPLETED' );
+ else return FALSE;
+ $formatted = $this->_format_date_time( $this->completed['value'], 7 );
+ $attributes = $this->_createParams( $this->completed['params'] );
+ return $this->_createElement( 'COMPLETED', $attributes, $formatted );
+ }
+/**
+ * set calendar component property completed
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.4.8 - 2008-10-23
+ * @param mixed $year
+ * @param mixed $month optional
+ * @param int $day optional
+ * @param int $hour optional
+ * @param int $min optional
+ * @param int $sec optional
+ * @param array $params optional
+ * @return bool
+ */
+ function setCompleted( $year, $month=FALSE, $day=FALSE, $hour=FALSE, $min=FALSE, $sec=FALSE, $params=FALSE ) {
+ if( empty( $year )) {
+ if( $this->getConfig( 'allowEmpty' )) {
+ $this->completed = array( 'value' => null, 'params' => $this->_setParams( $params ));
+ return TRUE;
+ }
+ else
+ return FALSE;
+ }
+ $this->completed = $this->_setDate2( $year, $month, $day, $hour, $min, $sec, $params );
+ return TRUE;
+ }
+/*********************************************************************************/
+/**
+ * Property Name: CONTACT
+ */
+/**
+ * creates formatted output for calendar component property contact
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.4.8 - 2008-10-23
+ * @return string
+ */
+ function createContact() {
+ if( empty( $this->contact )) return FALSE;
+ $output = null;
+ foreach( $this->contact as $contact ) {
+ if( !empty( $contact['value'] )) {
+ $attributes = $this->_createParams( $contact['params'], array( 'ALTREP', 'LANGUAGE' ));
+ $content = $this->_strrep( $contact['value'] );
+ $output .= $this->_createElement( 'CONTACT', $attributes, $content );
+ }
+ elseif( $this->getConfig( 'allowEmpty' )) $output .= $this->_createElement( 'CONTACT' );
+ }
+ return $output;
+ }
+/**
+ * set calendar component property contact
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.5.1 - 2008-11-05
+ * @param string $value
+ * @param array $params, optional
+ * @param integer $index, optional
+ * @return bool
+ */
+ function setContact( $value, $params=FALSE, $index=FALSE ) {
+ if( empty( $value )) if( $this->getConfig( 'allowEmpty' )) $value = null; else return FALSE;
+ $this->_setMval( $this->contact, $value, $params, FALSE, $index );
+ return TRUE;
+ }
+/*********************************************************************************/
+/**
+ * Property Name: CREATED
+ */
+/**
+ * creates formatted output for calendar component property created
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.4.8 - 2008-10-21
+ * @return string
+ */
+ function createCreated() {
+ if( empty( $this->created )) return FALSE;
+ $formatted = $this->_format_date_time( $this->created['value'], 7 );
+ $attributes = $this->_createParams( $this->created['params'] );
+ return $this->_createElement( 'CREATED', $attributes, $formatted );
+ }
+/**
+ * set calendar component property created
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.4.8 - 2008-10-23
+ * @param mixed $year optional
+ * @param mixed $month optional
+ * @param int $day optional
+ * @param int $hour optional
+ * @param int $min optional
+ * @param int $sec optional
+ * @param mixed $params optional
+ * @return bool
+ */
+ function setCreated( $year=FALSE, $month=FALSE, $day=FALSE, $hour=FALSE, $min=FALSE, $sec=FALSE, $params=FALSE ) {
+ if( !isset( $year )) {
+ $year = date('Ymd\THis', mktime( date( 'H' ), date( 'i' ), date( 's' ) - date( 'Z'), date( 'm' ), date( 'd' ), date( 'Y' )));
+ }
+ $this->created = $this->_setDate2( $year, $month, $day, $hour, $min, $sec, $params );
+ return TRUE;
+ }
+/*********************************************************************************/
+/**
+ * Property Name: DESCRIPTION
+ */
+/**
+ * creates formatted output for calendar component property description
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.4.8 - 2008-10-22
+ * @return string
+ */
+ function createDescription() {
+ if( empty( $this->description )) return FALSE;
+ $output = null;
+ foreach( $this->description as $description ) {
+ if( !empty( $description['value'] )) {
+ $attributes = $this->_createParams( $description['params'], array( 'ALTREP', 'LANGUAGE' ));
+ $content = $this->_strrep( $description['value'] );
+ $output .= $this->_createElement( 'DESCRIPTION', $attributes, $content );
+ }
+ elseif( $this->getConfig( 'allowEmpty' )) $output .= $this->_createElement( 'DESCRIPTION' );
+ }
+ return $output;
+ }
+/**
+ * set calendar component property description
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.5.1 - 2008-11-05
+ * @param string $value
+ * @param array $params, optional
+ * @param integer $index, optional
+ * @return bool
+ */
+ function setDescription( $value, $params=FALSE, $index=FALSE ) {
+ if( empty( $value )) { if( $this->getConfig( 'allowEmpty' )) $value = null; else return FALSE; }
+ $this->_setMval( $this->description, $value, $params, FALSE, $index );
+ return TRUE;
+ }
+/*********************************************************************************/
+/**
+ * Property Name: DTEND
+ */
+/**
+ * creates formatted output for calendar component property dtend
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.4.8 - 2008-10-21
+ * @return string
+ */
+ function createDtend() {
+ if( empty( $this->dtend )) return FALSE;
+ if( !isset( $this->dtend['value']['year'] ) &&
+ !isset( $this->dtend['value']['month'] ) &&
+ !isset( $this->dtend['value']['day'] ) &&
+ !isset( $this->dtend['value']['hour'] ) &&
+ !isset( $this->dtend['value']['min'] ) &&
+ !isset( $this->dtend['value']['sec'] ))
+ if( $this->getConfig( 'allowEmpty' ))
+ return $this->_createElement( 'DTEND' );
+ else return FALSE;
+ $formatted = $this->_format_date_time( $this->dtend['value'] );
+ $attributes = $this->_createParams( $this->dtend['params'] );
+ return $this->_createElement( 'DTEND', $attributes, $formatted );
+ }
+/**
+ * set calendar component property dtend
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.4.8 - 2008-10-23
+ * @param mixed $year
+ * @param mixed $month optional
+ * @param int $day optional
+ * @param int $hour optional
+ * @param int $min optional
+ * @param int $sec optional
+ * @param string $tz optional
+ * @param array params optional
+ * @return bool
+ */
+ function setDtend( $year, $month=FALSE, $day=FALSE, $hour=FALSE, $min=FALSE, $sec=FALSE, $tz=FALSE, $params=FALSE ) {
+ if( empty( $year )) {
+ if( $this->getConfig( 'allowEmpty' )) {
+ $this->dtend = array( 'value' => null, 'params' => $this->_setParams( $params ));
+ return TRUE;
+ }
+ else
+ return FALSE;
+ }
+ $this->dtend = $this->_setDate( $year, $month, $day, $hour, $min, $sec, $tz, $params );
+ return TRUE;
+ }
+/*********************************************************************************/
+/**
+ * Property Name: DTSTAMP
+ */
+/**
+ * creates formatted output for calendar component property dtstamp
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.4.4 - 2008-03-07
+ * @return string
+ */
+ function createDtstamp() {
+ if( !isset( $this->dtstamp['value']['year'] ) &&
+ !isset( $this->dtstamp['value']['month'] ) &&
+ !isset( $this->dtstamp['value']['day'] ) &&
+ !isset( $this->dtstamp['value']['hour'] ) &&
+ !isset( $this->dtstamp['value']['min'] ) &&
+ !isset( $this->dtstamp['value']['sec'] ))
+ $this->_makeDtstamp();
+ $formatted = $this->_format_date_time( $this->dtstamp['value'], 7 );
+ $attributes = $this->_createParams( $this->dtstamp['params'] );
+ return $this->_createElement( 'DTSTAMP', $attributes, $formatted );
+ }
+/**
+ * computes datestamp for calendar component object instance dtstamp
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 1.x.x - 2007-05-13
+ * @return void
+ */
+ function _makeDtstamp() {
+ $this->dtstamp['value'] = array( 'year' => date( 'Y' )
+ , 'month' => date( 'm' )
+ , 'day' => date( 'd' )
+ , 'hour' => date( 'H' )
+ , 'min' => date( 'i' )
+ , 'sec' => date( 's' ) - date( 'Z' ));
+ $this->dtstamp['params'] = null;
+ }
+/**
+ * set calendar component property dtstamp
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.4.8 - 2008-10-23
+ * @param mixed $year
+ * @param mixed $month optional
+ * @param int $day optional
+ * @param int $hour optional
+ * @param int $min optional
+ * @param int $sec optional
+ * @param array $params optional
+ * @return TRUE
+ */
+ function setDtstamp( $year, $month=FALSE, $day=FALSE, $hour=FALSE, $min=FALSE, $sec=FALSE, $params=FALSE ) {
+ if( empty( $year ))
+ $this->_makeDtstamp();
+ else
+ $this->dtstamp = $this->_setDate2( $year, $month, $day, $hour, $min, $sec, $params );
+ return TRUE;
+ }
+/*********************************************************************************/
+/**
+ * Property Name: DTSTART
+ */
+/**
+ * creates formatted output for calendar component property dtstart
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.4.16 - 2008-10-26
+ * @return string
+ */
+ function createDtstart() {
+ if( empty( $this->dtstart )) return FALSE;
+ if( !isset( $this->dtstart['value']['year'] ) &&
+ !isset( $this->dtstart['value']['month'] ) &&
+ !isset( $this->dtstart['value']['day'] ) &&
+ !isset( $this->dtstart['value']['hour'] ) &&
+ !isset( $this->dtstart['value']['min'] ) &&
+ !isset( $this->dtstart['value']['sec'] ))
+ if( $this->getConfig( 'allowEmpty' ))
+ return $this->_createElement( 'DTSTART' );
+ else return FALSE;
+ if( in_array( $this->objName, array( 'vtimezone', 'standard', 'daylight' )))
+ unset( $this->dtstart['value']['tz'], $this->dtstart['params']['TZID'] );
+ $formatted = $this->_format_date_time( $this->dtstart['value'] );
+ $attributes = $this->_createParams( $this->dtstart['params'] );
+ return $this->_createElement( 'DTSTART', $attributes, $formatted );
+ }
+/**
+ * set calendar component property dtstart
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.4.16 - 2008-11-04
+ * @param mixed $year
+ * @param mixed $month optional
+ * @param int $day optional
+ * @param int $hour optional
+ * @param int $min optional
+ * @param int $sec optional
+ * @param string $tz optional
+ * @param array $params optional
+ * @return bool
+ */
+ function setDtstart( $year, $month=FALSE, $day=FALSE, $hour=FALSE, $min=FALSE, $sec=FALSE, $tz=FALSE, $params=FALSE ) {
+ if( empty( $year )) {
+ if( $this->getConfig( 'allowEmpty' )) {
+ $this->dtstart = array( 'value' => null, 'params' => $this->_setParams( $params ));
+ return TRUE;
+ }
+ else
+ return FALSE;
+ }
+ $this->dtstart = $this->_setDate( $year, $month, $day, $hour, $min, $sec, $tz, $params, 'dtstart' );
+ return TRUE;
+ }
+/*********************************************************************************/
+/**
+ * Property Name: DUE
+ */
+/**
+ * creates formatted output for calendar component property due
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.4.8 - 2008-10-22
+ * @return string
+ */
+ function createDue() {
+ if( empty( $this->due )) return FALSE;
+ if( !isset( $this->due['value']['year'] ) &&
+ !isset( $this->due['value']['month'] ) &&
+ !isset( $this->due['value']['day'] ) &&
+ !isset( $this->due['value']['hour'] ) &&
+ !isset( $this->due['value']['min'] ) &&
+ !isset( $this->due['value']['sec'] ))
+ if( $this->getConfig( 'allowEmpty' ))
+ return $this->_createElement( 'DUE' );
+ else return FALSE;
+ $formatted = $this->_format_date_time( $this->due['value'] );
+ $attributes = $this->_createParams( $this->due['params'] );
+ return $this->_createElement( 'DUE', $attributes, $formatted );
+ }
+/**
+ * set calendar component property due
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.4.8 - 2008-11-04
+ * @param mixed $year
+ * @param mixed $month optional
+ * @param int $day optional
+ * @param int $hour optional
+ * @param int $min optional
+ * @param int $sec optional
+ * @param array $params optional
+ * @return bool
+ */
+ function setDue( $year, $month=FALSE, $day=FALSE, $hour=FALSE, $min=FALSE, $sec=FALSE, $tz=FALSE, $params=FALSE ) {
+ if( empty( $year )) {
+ if( $this->getConfig( 'allowEmpty' )) {
+ $this->due = array( 'value' => null, 'params' => $this->_setParams( $params ));
+ return TRUE;
+ }
+ else
+ return FALSE;
+ }
+ $this->due = $this->_setDate( $year, $month, $day, $hour, $min, $sec, $tz, $params );
+ return TRUE;
+ }
+/*********************************************************************************/
+/**
+ * Property Name: DURATION
+ */
+/**
+ * creates formatted output for calendar component property duration
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.4.8 - 2008-10-21
+ * @return string
+ */
+ function createDuration() {
+ if( empty( $this->duration )) return FALSE;
+ if( !isset( $this->duration['value']['week'] ) &&
+ !isset( $this->duration['value']['day'] ) &&
+ !isset( $this->duration['value']['hour'] ) &&
+ !isset( $this->duration['value']['min'] ) &&
+ !isset( $this->duration['value']['sec'] ))
+ if( $this->getConfig( 'allowEmpty' ))
+ return $this->_createElement( 'DURATION', array(), null );
+ else return FALSE;
+ $attributes = $this->_createParams( $this->duration['params'] );
+ return $this->_createElement( 'DURATION', $attributes, $this->_format_duration( $this->duration['value'] ));
+ }
+/**
+ * set calendar component property duration
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.4.8 - 2008-11-04
+ * @param mixed $week
+ * @param mixed $day optional
+ * @param int $hour optional
+ * @param int $min optional
+ * @param int $sec optional
+ * @param array $params optional
+ * @return bool
+ */
+ function setDuration( $week, $day=FALSE, $hour=FALSE, $min=FALSE, $sec=FALSE, $params=FALSE ) {
+ if( empty( $week )) if( $this->getConfig( 'allowEmpty' )) $week = null; else return FALSE;
+ if( is_array( $week ) && ( 1 <= count( $week )))
+ $this->duration = array( 'value' => $this->_duration_array( $week ), 'params' => $this->_setParams( $day ));
+ elseif( is_string( $week ) && ( 3 <= strlen( trim( $week )))) {
+ $week = trim( $week );
+ if( in_array( substr( $week, 0, 1 ), array( '+', '-' )))
+ $week = substr( $week, 1 );
+ $this->duration = array( 'value' => $this->_duration_string( $week ), 'params' => $this->_setParams( $day ));
+ }
+ elseif( empty( $week ) && empty( $day ) && empty( $hour ) && empty( $min ) && empty( $sec ))
+ return FALSE;
+ else
+ $this->duration = array( 'value' => $this->_duration_array( array( $week, $day, $hour, $min, $sec )), 'params' => $this->_setParams( $params ));
+ return TRUE;
+ }
+/*********************************************************************************/
+/**
+ * Property Name: EXDATE
+ */
+/**
+ * creates formatted output for calendar component property exdate
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.4.8 - 2008-10-22
+ * @return string
+ */
+ function createExdate() {
+ if( empty( $this->exdate )) return FALSE;
+ $output = null;
+ foreach( $this->exdate as $ex => $theExdate ) {
+ if( empty( $theExdate['value'] )) {
+ if( $this->getConfig( 'allowEmpty' )) $output .= $this->_createElement( 'EXDATE' );
+ continue;
+ }
+ $content = $attributes = null;
+ foreach( $theExdate['value'] as $eix => $exdatePart ) {
+ $parno = count( $exdatePart );
+ $formatted = $this->_format_date_time( $exdatePart, $parno );
+ if( isset( $theExdate['params']['TZID'] ))
+ $formatted = str_replace( 'Z', '', $formatted);
+ if( 0 < $eix ) {
+ if( isset( $theExdate['value'][0]['tz'] )) {
+ if( ctype_digit( substr( $theExdate['value'][0]['tz'], -4 )) ||
+ ( 'Z' == $theExdate['value'][0]['tz'] )) {
+ if( 'Z' != substr( $formatted, -1 ))
+ $formatted .= 'Z';
+ }
+ else
+ $formatted = str_replace( 'Z', '', $formatted );
+ }
+ else
+ $formatted = str_replace( 'Z', '', $formatted );
+ }
+ $content .= ( 0 < $eix ) ? ','.$formatted : $formatted;
+ }
+ $attributes .= $this->_createParams( $theExdate['params'] );
+ $output .= $this->_createElement( 'EXDATE', $attributes, $content );
+ }
+ return $output;
+ }
+/**
+ * set calendar component property exdate
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.5.1 - 2008-11-05
+ * @param array exdates
+ * @param array $params, optional
+ * @param integer $index, optional
+ * @return bool
+ */
+ function setExdate( $exdates, $params=FALSE, $index=FALSE ) {
+ if( empty( $exdates )) {
+ if( $this->getConfig( 'allowEmpty' )) {
+ $this->_setMval( $this->exdate, null, $params, FALSE, $index );
+ return TRUE;
+ }
+ else
+ return FALSE;
+ }
+ $input = array( 'params' => $this->_setParams( $params, array( 'VALUE' => 'DATE-TIME' )));
+ /* ev. check 1:st date and save ev. timezone **/
+ $this->_chkdatecfg( reset( $exdates ), $parno, $input['params'] );
+ $this->_existRem( $input['params'], 'VALUE', 'DATE-TIME' ); // remove default parameter
+ foreach( $exdates as $eix => $theExdate ) {
+ if( $this->_isArrayTimestampDate( $theExdate ))
+ $exdatea = $this->_timestamp2date( $theExdate, $parno );
+ elseif( is_array( $theExdate ))
+ $exdatea = $this->_date_time_array( $theExdate, $parno );
+ elseif( 8 <= strlen( trim( $theExdate ))) // ex. 2006-08-03 10:12:18
+ $exdatea = $this->_date_time_string( $theExdate, $parno );
+ if( 3 == $parno )
+ unset( $exdatea['hour'], $exdatea['min'], $exdatea['sec'], $exdatea['tz'] );
+ elseif( isset( $exdatea['tz'] ))
+ $exdatea['tz'] = (string) $exdatea['tz'];
+ if( isset( $input['params']['TZID'] ) ||
+ ( isset( $exdatea['tz'] ) && !$this->_isOffset( $exdatea['tz'] )) ||
+ ( isset( $input['value'][0] ) && ( !isset( $input['value'][0]['tz'] ))) ||
+ ( isset( $input['value'][0]['tz'] ) && !$this->_isOffset( $input['value'][0]['tz'] )))
+ unset( $exdatea['tz'] );
+ $input['value'][] = $exdatea;
+ }
+ if( 0 >= count( $input['value'] ))
+ return FALSE;
+ if( 3 == $parno ) {
+ $input['params']['VALUE'] = 'DATE';
+ unset( $input['params']['TZID'] );
+ }
+ $this->_setMval( $this->exdate, $input['value'], $input['params'], FALSE, $index );
+ return TRUE;
+ }
+/*********************************************************************************/
+/**
+ * Property Name: EXRULE
+ */
+/**
+ * creates formatted output for calendar component property exrule
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.4.8 - 2008-10-22
+ * @return string
+ */
+ function createExrule() {
+ if( empty( $this->exrule )) return FALSE;
+ return $this->_format_recur( 'EXRULE', $this->exrule );
+ }
+/**
+ * set calendar component property exdate
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.5.1 - 2008-11-05
+ * @param array $exruleset
+ * @param array $params, optional
+ * @param integer $index, optional
+ * @return bool
+ */
+ function setExrule( $exruleset, $params=FALSE, $index=FALSE ) {
+ if( empty( $exruleset )) if( $this->getConfig( 'allowEmpty' )) $exruleset = null; else return FALSE;
+ $this->_setMval( $this->exrule, $this->_setRexrule( $exruleset ), $params, FALSE, $index );
+ return TRUE;
+ }
+/*********************************************************************************/
+/**
+ * Property Name: FREEBUSY
+ */
+/**
+ * creates formatted output for calendar component property freebusy
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.4.8 - 2008-10-22
+ * @return string
+ */
+ function createFreebusy() {
+ if( empty( $this->freebusy )) return FALSE;
+ $output = null;
+ foreach( $this->freebusy as $freebusyPart ) {
+ if( empty( $freebusyPart['value'] )) {
+ if( $this->getConfig( 'allowEmpty' )) $output .= $this->_createElement( 'FREEBUSY' );
+ continue;
+ }
+ $attributes = $content = null;
+ if( isset( $freebusyPart['value']['fbtype'] )) {
+ $attributes .= $this->intAttrDelimiter.'FBTYPE='.$freebusyPart['value']['fbtype'];
+ unset( $freebusyPart['value']['fbtype'] );
+ $freebusyPart['value'] = array_values( $freebusyPart['value'] );
+ }
+ else
+ $attributes .= $this->intAttrDelimiter.'FBTYPE=BUSY';
+ $attributes .= $this->_createParams( $freebusyPart['params'] );
+ $fno = 1;
+ $cnt = count( $freebusyPart['value']);
+ foreach( $freebusyPart['value'] as $periodix => $freebusyPeriod ) {
+ $formatted = $this->_format_date_time( $freebusyPeriod[0] );
+ $content .= $formatted;
+ $content .= '/';
+ $cnt2 = count( $freebusyPeriod[1]);
+ if( array_key_exists( 'year', $freebusyPeriod[1] )) // date-time
+ $cnt2 = 7;
+ elseif( array_key_exists( 'week', $freebusyPeriod[1] )) // duration
+ $cnt2 = 5;
+ if(( 7 == $cnt2 ) && // period= -> date-time
+ isset( $freebusyPeriod[1]['year'] ) &&
+ isset( $freebusyPeriod[1]['month'] ) &&
+ isset( $freebusyPeriod[1]['day'] )) {
+ $content .= $this->_format_date_time( $freebusyPeriod[1] );
+ }
+ else { // period= -> dur-time
+ $content .= $this->_format_duration( $freebusyPeriod[1] );
+ }
+ if( $fno < $cnt )
+ $content .= ',';
+ $fno++;
+ }
+ $output .= $this->_createElement( 'FREEBUSY', $attributes, $content );
+ }
+ return $output;
+ }
+/**
+ * set calendar component property freebusy
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.5.1 - 2008-11-05
+ * @param string $fbType
+ * @param array $fbValues
+ * @param array $params, optional
+ * @param integer $index, optional
+ * @return bool
+ */
+ function setFreebusy( $fbType, $fbValues, $params=FALSE, $index=FALSE ) {
+ if( empty( $fbValues )) {
+ if( $this->getConfig( 'allowEmpty' )) {
+ $this->_setMval( $this->freebusy, null, $params, FALSE, $index );
+ return TRUE;
+ }
+ else
+ return FALSE;
+ }
+ $fbType = strtoupper( $fbType );
+ if(( !in_array( $fbType, array( 'FREE', 'BUSY', 'BUSY-UNAVAILABLE', 'BUSY-TENTATIVE' ))) &&
+ ( 'X-' != substr( $fbType, 0, 2 )))
+ $fbType = 'BUSY';
+ $input = array( 'fbtype' => $fbType );
+ foreach( $fbValues as $fbPeriod ) { // periods => period
+ $freebusyPeriod = array();
+ foreach( $fbPeriod as $fbMember ) { // pairs => singlepart
+ $freebusyPairMember = array();
+ if( is_array( $fbMember )) {
+ if( $this->_isArrayDate( $fbMember )) { // date-time value
+ $freebusyPairMember = $this->_date_time_array( $fbMember, 7 );
+ $freebusyPairMember['tz'] = 'Z';
+ }
+ elseif( $this->_isArrayTimestampDate( $fbMember )) { // timestamp value
+ $freebusyPairMember = $this->_timestamp2date( $fbMember['timestamp'], 7 );
+ $freebusyPairMember['tz'] = 'Z';
+ }
+ else { // array format duration
+ $freebusyPairMember = $this->_duration_array( $fbMember );
+ }
+ }
+ elseif(( 3 <= strlen( trim( $fbMember ))) && // string format duration
+ ( in_array( $fbMember{0}, array( 'P', '+', '-' )))) {
+ if( 'P' != $fbMember{0} )
+ $fbmember = substr( $fbMember, 1 );
+ $freebusyPairMember = $this->_duration_string( $fbMember );
+ }
+ elseif( 8 <= strlen( trim( $fbMember ))) { // text date ex. 2006-08-03 10:12:18
+ $freebusyPairMember = $this->_date_time_string( $fbMember, 7 );
+ $freebusyPairMember['tz'] = 'Z';
+ }
+ $freebusyPeriod[] = $freebusyPairMember;
+ }
+ $input[] = $freebusyPeriod;
+ }
+ $this->_setMval( $this->freebusy, $input, $params, FALSE, $index );
+ return TRUE;
+ }
+/*********************************************************************************/
+/**
+ * Property Name: GEO
+ */
+/**
+ * creates formatted output for calendar component property geo
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.4.8 - 2008-10-21
+ * @return string
+ */
+ function createGeo() {
+ if( empty( $this->geo )) return FALSE;
+ if( empty( $this->geo['value'] ))
+ return ( $this->getConfig( 'allowEmpty' )) ? $this->_createElement( 'GEO' ) : FALSE;
+ $attributes = $this->_createParams( $this->geo['params'] );
+ $content = null;
+ $content .= number_format( (float) $this->geo['value']['latitude'], 6, '.', '');
+ $content .= ';';
+ $content .= number_format( (float) $this->geo['value']['longitude'], 6, '.', '');
+ return $this->_createElement( 'GEO', $attributes, $content );
+ }
+/**
+ * set calendar component property geo
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.4.8 - 2008-11-04
+ * @param float $latitude
+ * @param float $longitude
+ * @param array $params optional
+ * @return bool
+ */
+ function setGeo( $latitude, $longitude, $params=FALSE ) {
+ if( !empty( $latitude ) && !empty( $longitude )) {
+ if( !is_array( $this->geo )) $this->geo = array();
+ $this->geo['value']['latitude'] = $latitude;
+ $this->geo['value']['longitude'] = $longitude;
+ $this->geo['params'] = $this->_setParams( $params );
+ }
+ elseif( $this->getConfig( 'allowEmpty' ))
+ $this->geo = array( 'value' => null, 'params' => $this->_setParams( $params ) );
+ else
+ return FALSE;
+ return TRUE;
+ }
+/*********************************************************************************/
+/**
+ * Property Name: LAST-MODIFIED
+ */
+/**
+ * creates formatted output for calendar component property last-modified
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.4.8 - 2008-10-21
+ * @return string
+ */
+ function createLastModified() {
+ if( empty( $this->lastmodified )) return FALSE;
+ $attributes = $this->_createParams( $this->lastmodified['params'] );
+ $formatted = $this->_format_date_time( $this->lastmodified['value'], 7 );
+ return $this->_createElement( 'LAST-MODIFIED', $attributes, $formatted );
+ }
+/**
+ * set calendar component property completed
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.4.8 - 2008-10-23
+ * @param mixed $year optional
+ * @param mixed $month optional
+ * @param int $day optional
+ * @param int $hour optional
+ * @param int $min optional
+ * @param int $sec optional
+ * @param array $params optional
+ * @return boll
+ */
+ function setLastModified( $year=FALSE, $month=FALSE, $day=FALSE, $hour=FALSE, $min=FALSE, $sec=FALSE, $params=FALSE ) {
+ if( empty( $year ))
+ $year = date('Ymd\THis', mktime( date( 'H' ), date( 'i' ), date( 's' ) - date( 'Z'), date( 'm' ), date( 'd' ), date( 'Y' )));
+ $this->lastmodified = $this->_setDate2( $year, $month, $day, $hour, $min, $sec, $params );
+ return TRUE;
+ }
+/*********************************************************************************/
+/**
+ * Property Name: LOCATION
+ */
+/**
+ * creates formatted output for calendar component property location
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.4.8 - 2008-10-22
+ * @return string
+ */
+ function createLocation() {
+ if( empty( $this->location )) return FALSE;
+ if( empty( $this->location['value'] ))
+ return ( $this->getConfig( 'allowEmpty' )) ? $this->_createElement( 'LOCATION' ) : FALSE;
+ $attributes = $this->_createParams( $this->location['params'], array( 'ALTREP', 'LANGUAGE' ));
+ $content = $this->_strrep( $this->location['value'] );
+ return $this->_createElement( 'LOCATION', $attributes, $content );
+ }
+/**
+ * set calendar component property location
+ '
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.4.8 - 2008-11-04
+ * @param string $value
+ * @param array params optional
+ * @return bool
+ */
+ function setLocation( $value, $params=FALSE ) {
+ if( empty( $value )) if( $this->getConfig( 'allowEmpty' )) $value = null; else return FALSE;
+ $this->location = array( 'value' => $value, 'params' => $this->_setParams( $params ));
+ return TRUE;
+ }
+/*********************************************************************************/
+/**
+ * Property Name: ORGANIZER
+ */
+/**
+ * creates formatted output for calendar component property organizer
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.4.8 - 2008-10-21
+ * @return string
+ */
+ function createOrganizer() {
+ if( empty( $this->organizer )) return FALSE;
+ if( empty( $this->organizer['value'] ))
+ return ( $this->getConfig( 'allowEmpty' )) ? $this->_createElement( 'ORGANIZER' ) : FALSE;
+ $attributes = $this->_createParams( $this->organizer['params']
+ , array( 'CN', 'DIR', 'LANGUAGE', 'SENT-BY' ));
+ $content = 'MAILTO:'.$this->organizer['value'];
+ return $this->_createElement( 'ORGANIZER', $attributes, $content );
+ }
+/**
+ * set calendar component property organizer
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.4.8 - 2008-11-04
+ * @param string $value
+ * @param array params optional
+ * @return bool
+ */
+ function setOrganizer( $value, $params=FALSE ) {
+ if( empty( $value )) if( $this->getConfig( 'allowEmpty' )) $value = null; else return FALSE;
+ $value = str_replace ( 'MAILTO:', '', $value );
+ $value = str_replace ( 'mailto:', '', $value );
+ $this->organizer = array( 'value' => $value, 'params' => $this->_setParams( $params ));
+ if( isset( $this->organizer['params']['SENT-BY'] )) {
+ if( 'MAILTO' == strtoupper( substr( $this->organizer['params']['SENT-BY'], 0, 6 )))
+ $this->organizer['params']['SENT-BY'] = substr( $this->organizer['params']['SENT-BY'], 7 );
+ }
+ return TRUE;
+ }
+/*********************************************************************************/
+/**
+ * Property Name: PERCENT-COMPLETE
+ */
+/**
+ * creates formatted output for calendar component property percent-complete
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.4.8 - 2008-10-22
+ * @return string
+ */
+ function createPercentComplete() {
+ if( empty( $this->percentcomplete )) return FALSE;
+ if( empty( $this->percentcomplete['value'] ))
+ return ( $this->getConfig( 'allowEmpty' )) ? $this->_createElement( 'PERCENT-COMPLETE' ) : FALSE;
+ $attributes = $this->_createParams( $this->percentcomplete['params'] );
+ return $this->_createElement( 'PERCENT-COMPLETE', $attributes, $this->percentcomplete['value'] );
+ }
+/**
+ * set calendar component property percent-complete
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.4.8 - 2008-11-04
+ * @param int $value
+ * @param array $params optional
+ * @return bool
+ */
+ function setPercentComplete( $value, $params=FALSE ) {
+ if( empty( $value )) if( $this->getConfig( 'allowEmpty' )) $value = null; else return FALSE;
+ $this->percentcomplete = array( 'value' => $value, 'params' => $this->_setParams( $params ));
+ return TRUE;
+ }
+/*********************************************************************************/
+/**
+ * Property Name: PRIORITY
+ */
+/**
+ * creates formatted output for calendar component property priority
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.4.8 - 2008-10-21
+ * @return string
+ */
+ function createPriority() {
+ if( empty( $this->priority )) return FALSE;
+ if( empty( $this->priority['value'] ))
+ return ( $this->getConfig( 'allowEmpty' )) ? $this->_createElement( 'PRIORITY' ) : FALSE;
+ $attributes = $this->_createParams( $this->priority['params'] );
+ return $this->_createElement( 'PRIORITY', $attributes, $this->priority['value'] );
+ }
+/**
+ * set calendar component property priority
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.4.8 - 2008-11-04
+ * @param int $value
+ * @param array $params optional
+ * @return bool
+ */
+ function setPriority( $value, $params=FALSE ) {
+ if( empty( $value )) if( $this->getConfig( 'allowEmpty' )) $value = null; else return FALSE;
+ $this->priority = array( 'value' => $value, 'params' => $this->_setParams( $params ));
+ return TRUE;
+ }
+/*********************************************************************************/
+/**
+ * Property Name: RDATE
+ */
+/**
+ * creates formatted output for calendar component property rdate
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.4.16 - 2008-10-26
+ * @return string
+ */
+ function createRdate() {
+ if( empty( $this->rdate )) return FALSE;
+ $utctime = ( in_array( $this->objName, array( 'vtimezone', 'standard', 'daylight' ))) ? TRUE : FALSE;
+ $output = null;
+ if( $utctime )
+ unset( $this->rdate['params']['TZID'] );
+ foreach( $this->rdate as $theRdate ) {
+ if( empty( $theRdate['value'] )) {
+ if( $this->getConfig( 'allowEmpty' )) $output .= $this->_createElement( 'RDATE' );
+ continue;
+ }
+ if( $utctime )
+ unset( $theRdate['params']['TZID'] );
+ $attributes = $this->_createParams( $theRdate['params'] );
+ $cnt = count( $theRdate['value'] );
+ $content = null;
+ $rno = 1;
+ foreach( $theRdate['value'] as $rpix => $rdatePart ) {
+ $contentPart = null;
+ if( is_array( $rdatePart ) &&
+ isset( $theRdate['params']['VALUE'] ) && ( 'PERIOD' == $theRdate['params']['VALUE'] )) { // PERIOD
+ if( $utctime )
+ unset( $rdatePart[0]['tz'] );
+ $formatted = $this->_format_date_time( $rdatePart[0]); // PERIOD part 1
+ if( $utctime || !empty( $theRdate['params']['TZID'] ))
+ $formatted = str_replace( 'Z', '', $formatted);
+ if( 0 < $rpix ) {
+ if( !empty( $rdatePart[0]['tz'] ) && $this->_isOffset( $rdatePart[0]['tz'] )) {
+ if( 'Z' != substr( $formatted, -1 )) $formatted .= 'Z';
+ }
+ else
+ $formatted = str_replace( 'Z', '', $formatted );
+ }
+ $contentPart .= $formatted;
+ $contentPart .= '/';
+ $cnt2 = count( $rdatePart[1]);
+ if( array_key_exists( 'year', $rdatePart[1] )) {
+ if( array_key_exists( 'hour', $rdatePart[1] ))
+ $cnt2 = 7; // date-time
+ else
+ $cnt2 = 3; // date
+ }
+ elseif( array_key_exists( 'week', $rdatePart[1] )) // duration
+ $cnt2 = 5;
+ if(( 7 == $cnt2 ) && // period= -> date-time
+ isset( $rdatePart[1]['year'] ) &&
+ isset( $rdatePart[1]['month'] ) &&
+ isset( $rdatePart[1]['day'] )) {
+ if( $utctime )
+ unset( $rdatePart[1]['tz'] );
+ $formatted = $this->_format_date_time( $rdatePart[1] ); // PERIOD part 2
+ if( $utctime || !empty( $theRdate['params']['TZID'] ))
+ $formatted = str_replace( 'Z', '', $formatted);
+ if( !empty( $rdatePart[0]['tz'] ) && $this->_isOffset( $rdatePart[0]['tz'] )) {
+ if( 'Z' != substr( $formatted, -1 )) $formatted .= 'Z';
+ }
+ else
+ $formatted = str_replace( 'Z', '', $formatted );
+ $contentPart .= $formatted;
+ }
+ else { // period= -> dur-time
+ $contentPart .= $this->_format_duration( $rdatePart[1] );
+ }
+ } // PERIOD end
+ else { // SINGLE date start
+ if( $utctime )
+ unset( $rdatePart['tz'] );
+ $formatted = $this->_format_date_time( $rdatePart);
+ if( $utctime || !empty( $theRdate['params']['TZID'] ))
+ $formatted = str_replace( 'Z', '', $formatted);
+ if( !$utctime && ( 0 < $rpix )) {
+ if( !empty( $theRdate['value'][0]['tz'] ) && $this->_isOffset( $theRdate['value'][0]['tz'] )) {
+ if( 'Z' != substr( $formatted, -1 ))
+ $formatted .= 'Z';
+ }
+ else
+ $formatted = str_replace( 'Z', '', $formatted );
+ }
+ $contentPart .= $formatted;
+ }
+ $content .= $contentPart;
+ if( $rno < $cnt )
+ $content .= ',';
+ $rno++;
+ }
+ $output .= $this->_createElement( 'RDATE', $attributes, $content );
+ }
+ return $output;
+ }
+/**
+ * set calendar component property rdate
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.5.1 - 2008-11-07
+ * @param array $rdates
+ * @param array $params, optional
+ * @param integer $index, optional
+ * @return bool
+ */
+ function setRdate( $rdates, $params=FALSE, $index=FALSE ) {
+ if( empty( $rdates )) {
+ if( $this->getConfig( 'allowEmpty' )) {
+ $this->_setMval( $this->rdate, null, $params, FALSE, $index );
+ return TRUE;
+ }
+ else
+ return FALSE;
+ }
+ $input = array( 'params' => $this->_setParams( $params, array( 'VALUE' => 'DATE-TIME' )));
+ if( in_array( $this->objName, array( 'vtimezone', 'standard', 'daylight' ))) {
+ unset( $input['params']['TZID'] );
+ $input['params']['VALUE'] = 'DATE-TIME';
+ }
+ /* check if PERIOD, if not set */
+ if((!isset( $input['params']['VALUE'] ) || !in_array( $input['params']['VALUE'], array( 'DATE', 'PERIOD' ))) &&
+ isset( $rdates[0] ) && is_array( $rdates[0] ) && ( 2 == count( $rdates[0] )) &&
+ isset( $rdates[0][0] ) && isset( $rdates[0][1] ) && !isset( $rdates[0]['timestamp'] ) &&
+ (( is_array( $rdates[0][0] ) && ( isset( $rdates[0][0]['timestamp'] ) ||
+ $this->_isArrayDate( $rdates[0][0] ))) ||
+ ( is_string( $rdates[0][0] ) && ( 8 <= strlen( trim( $rdates[0][0] ))))) &&
+ ( is_array( $rdates[0][1] ) || ( is_string( $rdates[0][1] ) && ( 3 <= strlen( trim( $rdates[0][1] ))))))
+ $input['params']['VALUE'] = 'PERIOD';
+ /* check 1:st date, upd. $parno (opt) and save ev. timezone **/
+ $date = reset( $rdates );
+ if( isset( $input['params']['VALUE'] ) && ( 'PERIOD' == $input['params']['VALUE'] )) // PERIOD
+ $date = reset( $date );
+ $this->_chkdatecfg( $date, $parno, $input['params'] );
+ if( in_array( $this->objName, array( 'vtimezone', 'standard', 'daylight' )))
+ unset( $input['params']['TZID'] );
+ $this->_existRem( $input['params'], 'VALUE', 'DATE-TIME' ); // remove default
+ foreach( $rdates as $rpix => $theRdate ) {
+ $inputa = null;
+ if( is_array( $theRdate )) {
+ if( isset( $input['params']['VALUE'] ) && ( 'PERIOD' == $input['params']['VALUE'] )) { // PERIOD
+ foreach( $theRdate as $rix => $rPeriod ) {
+ if( is_array( $rPeriod )) {
+ if( $this->_isArrayTimestampDate( $rPeriod )) // timestamp
+ $inputab = ( isset( $rPeriod['tz'] )) ? $this->_timestamp2date( $rPeriod, $parno ) : $this->_timestamp2date( $rPeriod, 6 );
+ elseif( $this->_isArrayDate( $rPeriod ))
+ $inputab = ( 3 < count ( $rPeriod )) ? $this->_date_time_array( $rPeriod, $parno ) : $this->_date_time_array( $rPeriod, 6 );
+ elseif (( 1 == count( $rPeriod )) && ( 8 <= strlen( reset( $rPeriod )))) // text-date
+ $inputab = $this->_date_time_string( reset( $rPeriod ), $parno );
+ else // array format duration
+ $inputab = $this->_duration_array( $rPeriod );
+ }
+ elseif(( 3 <= strlen( trim( $rPeriod ))) && // string format duration
+ ( in_array( $rPeriod{0}, array( 'P', '+', '-' )))) {
+ if( 'P' != $rPeriod{0} )
+ $rPeriod = substr( $rPeriod, 1 );
+ $inputab = $this->_duration_string( $rPeriod );
+ }
+ elseif( 8 <= strlen( trim( $rPeriod ))) // text date ex. 2006-08-03 10:12:18
+ $inputab = $this->_date_time_string( $rPeriod, $parno );
+ if( isset( $input['params']['TZID'] ) ||
+ ( isset( $inputab['tz'] ) && !$this->_isOffset( $inputab['tz'] )) ||
+ ( isset( $inputa[0] ) && ( !isset( $inputa[0]['tz'] ))) ||
+ ( isset( $inputa[0]['tz'] ) && !$this->_isOffset( $inputa[0]['tz'] )))
+ unset( $inputab['tz'] );
+ $inputa[] = $inputab;
+ }
+ } // PERIOD end
+ elseif ( $this->_isArrayTimestampDate( $theRdate )) // timestamp
+ $inputa = $this->_timestamp2date( $theRdate, $parno );
+ else // date[-time]
+ $inputa = $this->_date_time_array( $theRdate, $parno );
+ }
+ elseif( 8 <= strlen( trim( $theRdate ))) // text date ex. 2006-08-03 10:12:18
+ $inputa = $this->_date_time_string( $theRdate, $parno );
+ if( !isset( $input['params']['VALUE'] ) || ( 'PERIOD' != $input['params']['VALUE'] )) { // no PERIOD
+ if( 3 == $parno )
+ unset( $inputa['hour'], $inputa['min'], $inputa['sec'], $inputa['tz'] );
+ elseif( isset( $inputa['tz'] ))
+ $inputa['tz'] = (string) $inputa['tz'];
+ if( isset( $input['params']['TZID'] ) ||
+ ( isset( $inputa['tz'] ) && !$this->_isOffset( $inputa['tz'] )) ||
+ ( isset( $input['value'][0] ) && ( !isset( $input['value'][0]['tz'] ))) ||
+ ( isset( $input['value'][0]['tz'] ) && !$this->_isOffset( $input['value'][0]['tz'] )))
+ unset( $inputa['tz'] );
+ }
+ $input['value'][] = $inputa;
+ }
+ if( 3 == $parno ) {
+ $input['params']['VALUE'] = 'DATE';
+ unset( $input['params']['TZID'] );
+ }
+ $this->_setMval( $this->rdate, $input['value'], $input['params'], FALSE, $index );
+ return TRUE;
+ }
+/*********************************************************************************/
+/**
+ * Property Name: RECURRENCE-ID
+ */
+/**
+ * creates formatted output for calendar component property recurrence-id
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.4.8 - 2008-10-21
+ * @return string
+ */
+ function createRecurrenceid() {
+ if( empty( $this->recurrenceid )) return FALSE;
+ if( empty( $this->recurrenceid['value'] ))
+ return ( $this->getConfig( 'allowEmpty' )) ? $this->_createElement( 'RECURRENCE-ID' ) : FALSE;
+ $formatted = $this->_format_date_time( $this->recurrenceid['value'] );
+ $attributes = $this->_createParams( $this->recurrenceid['params'] );
+ return $this->_createElement( 'RECURRENCE-ID', $attributes, $formatted );
+ }
+/**
+ * set calendar component property recurrence-id
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.4.8 - 2008-10-23
+ * @param mixed $year
+ * @param mixed $month optional
+ * @param int $day optional
+ * @param int $hour optional
+ * @param int $min optional
+ * @param int $sec optional
+ * @param array $params optional
+ * @return bool
+ */
+ function setRecurrenceid( $year, $month=FALSE, $day=FALSE, $hour=FALSE, $min=FALSE, $sec=FALSE, $tz=FALSE, $params=FALSE ) {
+ if( empty( $year )) {
+ if( $this->getConfig( 'allowEmpty' )) {
+ $this->recurrenceid = array( 'value' => null, 'params' => null );
+ return TRUE;
+ }
+ else
+ return FALSE;
+ }
+ $this->recurrenceid = $this->_setDate( $year, $month, $day, $hour, $min, $sec, $tz, $params );
+ return TRUE;
+ }
+/*********************************************************************************/
+/**
+ * Property Name: RELATED-TO
+ */
+/**
+ * creates formatted output for calendar component property related-to
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.4.8 - 2008-10-23
+ * @return string
+ */
+ function createRelatedTo() {
+ if( empty( $this->relatedto )) return FALSE;
+ $output = null;
+ foreach( $this->relatedto as $relation ) {
+ if( empty( $relation['value'] )) {
+ if( $this->getConfig( 'allowEmpty' )) $output.= $this->_createElement( 'RELATED-TO', $this->_createParams( $relation['params'] ));
+ continue;
+ }
+ $attributes = $this->_createParams( $relation['params'] );
+ $content = ( 'xcal' != $this->format ) ? '<' : '';
+ $content .= $this->_strrep( $relation['value'] );
+ $content .= ( 'xcal' != $this->format ) ? '>' : '';
+ $output .= $this->_createElement( 'RELATED-TO', $attributes, $content );
+ }
+ return $output;
+ }
+/**
+ * set calendar component property related-to
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.5.1 - 2008-11-07
+ * @param float $relid
+ * @param array $params, optional
+ * @param index $index, optional
+ * @return bool
+ */
+ function setRelatedTo( $value, $params=FALSE, $index=FALSE ) {
+ if( empty( $value )) if( $this->getConfig( 'allowEmpty' )) $value = null; else return FALSE;
+ if(( '<' == substr( $value, 0, 1 )) && ( '>' == substr( $value, -1 )))
+ $value = substr( $value, 1, ( strlen( $value ) - 2 ));
+ $this->_existRem( $params, 'RELTYPE', 'PARENT', TRUE ); // remove default
+ $this->_setMval( $this->relatedto, $value, $params, FALSE, $index );
+ return TRUE;
+ }
+/*********************************************************************************/
+/**
+ * Property Name: REPEAT
+ */
+/**
+ * creates formatted output for calendar component property repeat
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.4.8 - 2008-10-21
+ * @return string
+ */
+ function createRepeat() {
+ if( empty( $this->repeat )) return FALSE;
+ if( empty( $this->repeat['value'] ))
+ return ( $this->getConfig( 'allowEmpty' )) ? $this->_createElement( 'REPEAT' ) : FALSE;
+ $attributes = $this->_createParams( $this->repeat['params'] );
+ return $this->_createElement( 'REPEAT', $attributes, $this->repeat['value'] );
+ }
+/**
+ * set calendar component property transp
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.4.8 - 2008-11-04
+ * @param string $value
+ * @param array $params optional
+ * @return void
+ */
+ function setRepeat( $value, $params=FALSE ) {
+ if( empty( $value )) if( $this->getConfig( 'allowEmpty' )) $value = null; else return FALSE;
+ $this->repeat = array( 'value' => $value, 'params' => $this->_setParams( $params ));
+ return TRUE;
+ }
+/*********************************************************************************/
+/**
+ * Property Name: REQUEST-STATUS
+ */
+/**
+ * creates formatted output for calendar component property request-status
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.4.8 - 2008-10-23
+ * @return string
+ */
+ function createRequestStatus() {
+ if( empty( $this->requeststatus )) return FALSE;
+ $output = null;
+ foreach( $this->requeststatus as $rstat ) {
+ if( empty( $rstat['value']['statcode'] )) {
+ if( $this->getConfig( 'allowEmpty' )) $output .= $this->_createElement( 'REQUEST-STATUS' );
+ continue;
+ }
+ $attributes = $this->_createParams( $rstat['params'], array( 'LANGUAGE' ));
+ $content = number_format( (float) $rstat['value']['statcode'], 2, '.', '');
+ $content .= ';'.$this->_strrep( $rstat['value']['text'] );
+ if( isset( $rstat['value']['extdata'] ))
+ $content .= ';'.$this->_strrep( $rstat['value']['extdata'] );
+ $output .= $this->_createElement( 'REQUEST-STATUS', $attributes, $content );
+ }
+ return $output;
+ }
+/**
+ * set calendar component property request-status
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.5.1 - 2008-11-05
+ * @param float $statcode
+ * @param string $text
+ * @param string $extdata, optional
+ * @param array $params, optional
+ * @param integer $index, optional
+ * @return bool
+ */
+ function setRequestStatus( $statcode, $text, $extdata=FALSE, $params=FALSE, $index=FALSE ) {
+ if( empty( $statcode ) || empty( $text )) if( $this->getConfig( 'allowEmpty' )) $statcode = $text = null; else return FALSE;
+ $input = array( 'statcode' => $statcode, 'text' => $text );
+ if( $extdata )
+ $input['extdata'] = $extdata;
+ $this->_setMval( $this->requeststatus, $input, $params, FALSE, $index );
+ return TRUE;
+ }
+/*********************************************************************************/
+/**
+ * Property Name: RESOURCES
+ */
+/**
+ * creates formatted output for calendar component property resources
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.4.8 - 2008-10-23
+ * @return string
+ */
+ function createResources() {
+ if( empty( $this->resources )) return FALSE;
+ $output = null;
+ foreach( $this->resources as $resource ) {
+ if( empty( $resource['value'] )) {
+ if( $this->getConfig( 'allowEmpty' )) $output .= $this->_createElement( 'RESOURCES' );
+ continue;
+ }
+ $attributes = $this->_createParams( $resource['params'], array( 'ALTREP', 'LANGUAGE' ));
+ if( is_array( $resource['value'] )) {
+ foreach( $resource['value'] as $rix => $resourcePart )
+ $resource['value'][$rix] = $this->_strrep( $resourcePart );
+ $content = implode( ',', $resource['value'] );
+ }
+ else
+ $content = $this->_strrep( $resource['value'] );
+ $output .= $this->_createElement( 'RESOURCES', $attributes, $content );
+ }
+ return $output;
+ }
+/**
+ * set calendar component property recources
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.5.1 - 2008-11-05
+ * @param mixed $value
+ * @param array $params, optional
+ * @param integer $index, optional
+ * @return bool
+ */
+ function setResources( $value, $params=FALSE, $index=FALSE ) {
+ if( empty( $value )) if( $this->getConfig( 'allowEmpty' )) $value = null; else return FALSE;
+ $this->_setMval( $this->resources, $value, $params, FALSE, $index );
+ return TRUE;
+ }
+/*********************************************************************************/
+/**
+ * Property Name: RRULE
+ */
+/**
+ * creates formatted output for calendar component property rrule
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.4.8 - 2008-10-21
+ * @return string
+ */
+ function createRrule() {
+ if( empty( $this->rrule )) return FALSE;
+ return $this->_format_recur( 'RRULE', $this->rrule );
+ }
+/**
+ * set calendar component property rrule
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.5.1 - 2008-11-05
+ * @param array $rruleset
+ * @param array $params, optional
+ * @param integer $index, optional
+ * @return void
+ */
+ function setRrule( $rruleset, $params=FALSE, $index=FALSE ) {
+ if( empty( $rruleset )) if( $this->getConfig( 'allowEmpty' )) $rruleset = null; else return FALSE;
+ $this->_setMval( $this->rrule, $this->_setRexrule( $rruleset ), $params, FALSE, $index );
+ return TRUE;
+ }
+/*********************************************************************************/
+/**
+ * Property Name: SEQUENCE
+ */
+/**
+ * creates formatted output for calendar component property sequence
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 0.9.7 - 2006-11-20
+ * @return string
+ */
+ function createSequence() {
+ if( empty( $this->sequence )) return FALSE;
+ if( empty( $this->sequence['value'] ))
+ return ( $this->getConfig( 'allowEmpty' )) ? $this->_createElement( 'SEQUENCE' ) : FALSE;
+ $attributes = $this->_createParams( $this->sequence['params'] );
+ return $this->_createElement( 'SEQUENCE', $attributes, $this->sequence['value'] );
+ }
+/**
+ * set calendar component property sequence
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.4.8 - 2008-11-04
+ * @param int $value optional
+ * @param array $params optional
+ * @return bool
+ */
+ function setSequence( $value=FALSE, $params=FALSE ) {
+ if( empty( $value ))
+ $value = ( isset( $this->sequence['value'] ) && ( 0 < $this->sequence['value'] )) ? $this->sequence['value'] + 1 : 1;
+ $this->sequence = array( 'value' => $value, 'params' => $this->_setParams( $params ));
+ return TRUE;
+ }
+/*********************************************************************************/
+/**
+ * Property Name: STATUS
+ */
+/**
+ * creates formatted output for calendar component property status
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.4.8 - 2008-10-21
+ * @return string
+ */
+ function createStatus() {
+ if( empty( $this->status )) return FALSE;
+ if( empty( $this->status['value'] ))
+ return ( $this->getConfig( 'allowEmpty' )) ? $this->_createElement( 'STATUS' ) : FALSE;
+ $attributes = $this->_createParams( $this->status['params'] );
+ return $this->_createElement( 'STATUS', $attributes, $this->status['value'] );
+ }
+/**
+ * set calendar component property status
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.4.8 - 2008-11-04
+ * @param string $value
+ * @param array $params optional
+ * @return bool
+ */
+ function setStatus( $value, $params=FALSE ) {
+ if( empty( $value )) if( $this->getConfig( 'allowEmpty' )) $value = null; else return FALSE;
+ $this->status = array( 'value' => $value, 'params' => $this->_setParams( $params ));
+ return TRUE;
+ }
+/*********************************************************************************/
+/**
+ * Property Name: SUMMARY
+ */
+/**
+ * creates formatted output for calendar component property summary
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.4.8 - 2008-10-21
+ * @return string
+ */
+ function createSummary() {
+ if( empty( $this->summary )) return FALSE;
+ if( empty( $this->summary['value'] ))
+ return ( $this->getConfig( 'allowEmpty' )) ? $this->_createElement( 'SUMMARY' ) : FALSE;
+ $attributes = $this->_createParams( $this->summary['params'], array( 'ALTREP', 'LANGUAGE' ));
+ $content = $this->_strrep( $this->summary['value'] );
+ return $this->_createElement( 'SUMMARY', $attributes, $content );
+ }
+/**
+ * set calendar component property summary
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.4.8 - 2008-11-04
+ * @param string $value
+ * @param string $params optional
+ * @return bool
+ */
+ function setSummary( $value, $params=FALSE ) {
+ if( empty( $value )) if( $this->getConfig( 'allowEmpty' )) $value = null; else return FALSE;
+ $this->summary = array( 'value' => $value, 'params' => $this->_setParams( $params ));
+ return TRUE;
+ }
+/*********************************************************************************/
+/**
+ * Property Name: TRANSP
+ */
+/**
+ * creates formatted output for calendar component property transp
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.4.8 - 2008-10-21
+ * @return string
+ */
+ function createTransp() {
+ if( empty( $this->transp )) return FALSE;
+ if( empty( $this->transp['value'] ))
+ return ( $this->getConfig( 'allowEmpty' )) ? $this->_createElement( 'TRANSP' ) : FALSE;
+ $attributes = $this->_createParams( $this->transp['params'] );
+ return $this->_createElement( 'TRANSP', $attributes, $this->transp['value'] );
+ }
+/**
+ * set calendar component property transp
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.4.8 - 2008-11-04
+ * @param string $value
+ * @param string $params optional
+ * @return bool
+ */
+ function setTransp( $value, $params=FALSE ) {
+ if( empty( $value )) if( $this->getConfig( 'allowEmpty' )) $value = null; else return FALSE;
+ $this->transp = array( 'value' => $value, 'params' => $this->_setParams( $params ));
+ return TRUE;
+ }
+/*********************************************************************************/
+/**
+ * Property Name: TRIGGER
+ */
+/**
+ * creates formatted output for calendar component property trigger
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.4.16 - 2008-10-21
+ * @return string
+ */
+ function createTrigger() {
+ if( empty( $this->trigger )) return FALSE;
+ if( empty( $this->trigger['value'] ))
+ return ( $this->getConfig( 'allowEmpty' )) ? $this->_createElement( 'TRIGGER' ) : FALSE;
+ $content = $attributes = null;
+ if( isset( $this->trigger['value']['year'] ) &&
+ isset( $this->trigger['value']['month'] ) &&
+ isset( $this->trigger['value']['day'] ))
+ $content .= $this->_format_date_time( $this->trigger['value'] );
+ else {
+ if( TRUE !== $this->trigger['value']['relatedStart'] )
+ $attributes .= $this->intAttrDelimiter.'RELATED=END';
+ if( $this->trigger['value']['before'] )
+ $content .= '-';
+ $content .= $this->_format_duration( $this->trigger['value'] );
+ }
+ $attributes .= $this->_createParams( $this->trigger['params'] );
+ return $this->_createElement( 'TRIGGER', $attributes, $content );
+ }
+/**
+ * set calendar component property trigger
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.4.16 - 2008-11-04
+ * @param mixed $year
+ * @param mixed $month optional
+ * @param int $day optional
+ * @param int $week optional
+ * @param int $hour optional
+ * @param int $min optional
+ * @param int $sec optional
+ * @param bool $relatedStart optional
+ * @param bool $before optional
+ * @param array $params optional
+ * @return bool
+ */
+ function setTrigger( $year, $month=null, $day=null, $week=FALSE, $hour=FALSE, $min=FALSE, $sec=FALSE, $relatedStart=TRUE, $before=TRUE, $params=FALSE ) {
+ if( empty( $year ) && empty( $month ) && empty( $day ) && empty( $week ) && empty( $hour ) && empty( $min ) && empty( $sec ))
+ if( $this->getConfig( 'allowEmpty' )) {
+ $this->trigger = array( 'value' => null, 'params' => $this->_setParams( $params ) );
+ return TRUE;
+ }
+ else
+ return FALSE;
+ if( $this->_isArrayTimestampDate( $year )) { // timestamp
+ $params = $this->_setParams( $month );
+ $date = $this->_timestamp2date( $year, 7 );
+ foreach( $date as $k => $v )
+ $$k = $v;
+ }
+ elseif( is_array( $year ) && ( is_array( $month ) || empty( $month ))) {
+ $params = $this->_setParams( $month );
+ if(!(array_key_exists( 'year', $year ) && // exclude date-time
+ array_key_exists( 'month', $year ) &&
+ array_key_exists( 'day', $year ))) { // so this must be a duration
+ if( isset( $params['RELATED'] ) && ( 'END' == $params['RELATED'] ))
+ $relatedStart = FALSE;
+ else
+ $relatedStart = ( array_key_exists( 'relatedStart', $year ) && ( TRUE !== $year['relatedStart'] )) ? FALSE : TRUE;
+ $before = ( array_key_exists( 'before', $year ) && ( TRUE !== $year['before'] )) ? FALSE : TRUE;
+ }
+ $SSYY = ( array_key_exists( 'year', $year )) ? $year['year'] : null;
+ $month = ( array_key_exists( 'month', $year )) ? $year['month'] : null;
+ $day = ( array_key_exists( 'day', $year )) ? $year['day'] : null;
+ $week = ( array_key_exists( 'week', $year )) ? $year['week'] : null;
+ $hour = ( array_key_exists( 'hour', $year )) ? $year['hour'] : 0; //null;
+ $min = ( array_key_exists( 'min', $year )) ? $year['min'] : 0; //null;
+ $sec = ( array_key_exists( 'sec', $year )) ? $year['sec'] : 0; //null;
+ $year = $SSYY;
+ }
+ elseif(is_string( $year ) && ( is_array( $month ) || empty( $month ))) { // duration or date in a string
+ $params = $this->_setParams( $month );
+ if( in_array( $year{0}, array( 'P', '+', '-' ))) { // duration
+ $relatedStart = ( isset( $params['RELATED'] ) && ( 'END' == $params['RELATED'] )) ? FALSE : TRUE;
+ $before = ( '-' == $year{0} ) ? TRUE : FALSE;
+ if( 'P' != $year{0} )
+ $year = substr( $year, 1 );
+ $date = $this->_duration_string( $year);
+ }
+ else // date
+ $date = $this->_date_time_string( $year, 7 );
+ unset( $year, $month, $day );
+ foreach( $date as $k => $v )
+ $$k = $v;
+ }
+ else // single values in function input parameters
+ $params = $this->_setParams( $params );
+ if( !empty( $year ) && !empty( $month ) && !empty( $day )) { // date
+ $params['VALUE'] = 'DATE-TIME';
+ $hour = ( $hour ) ? $hour : 0;
+ $min = ( $min ) ? $min : 0;
+ $sec = ( $sec ) ? $sec : 0;
+ $this->trigger = array( 'params' => $params );
+ $this->trigger['value'] = array( 'year' => $year
+ , 'month' => $month
+ , 'day' => $day
+ , 'hour' => $hour
+ , 'min' => $min
+ , 'sec' => $sec
+ , 'tz' => 'Z' );
+ return TRUE;
+ }
+ elseif(( empty( $year ) && empty( $month )) && // duration
+ (!empty( $week ) || !empty( $day ) || !empty( $hour ) || !empty( $min ) || !empty( $sec ))) {
+ unset( $params['RELATED'] ); // set at output creation (END only)
+ unset( $params['VALUE'] ); // 'DURATION' default
+ $this->trigger = array( 'params' => $params );
+ $relatedStart = ( FALSE !== $relatedStart ) ? TRUE : FALSE;
+ $before = ( FALSE !== $before ) ? TRUE : FALSE;
+ $this->trigger['value'] = array( 'relatedStart' => $relatedStart
+ , 'before' => $before );
+ if( !empty( $week )) $this->trigger['value']['week'] = $week;
+ if( !empty( $day )) $this->trigger['value']['day'] = $day;
+ if( !empty( $hour )) $this->trigger['value']['hour'] = $hour;
+ if( !empty( $min )) $this->trigger['value']['min'] = $min;
+ if( !empty( $sec )) $this->trigger['value']['sec'] = $sec;
+ return TRUE;
+ }
+ return FALSE;
+ }
+/*********************************************************************************/
+/**
+ * Property Name: TZID
+ */
+/**
+ * creates formatted output for calendar component property tzid
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.4.8 - 2008-10-21
+ * @return string
+ */
+ function createTzid() {
+ if( empty( $this->tzid )) return FALSE;
+ if( empty( $this->tzid['value'] ))
+ return ( $this->getConfig( 'allowEmpty' )) ? $this->_createElement( 'TZID' ) : FALSE;
+ $attributes = $this->_createParams( $this->tzid['params'] );
+ return $this->_createElement( 'TZID', $attributes, $this->_strrep( $this->tzid['value'] ));
+ }
+/**
+ * set calendar component property tzid
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.4.8 - 2008-11-04
+ * @param string $value
+ * @param array $params optional
+ * @return bool
+ */
+ function setTzid( $value, $params=FALSE ) {
+ if( empty( $value )) if( $this->getConfig( 'allowEmpty' )) $value = null; else return FALSE;
+ $this->tzid = array( 'value' => $value, 'params' => $this->_setParams( $params ));
+ return TRUE;
+ }
+/*********************************************************************************/
+/**
+ * .. .
+ * Property Name: TZNAME
+ */
+/**
+ * creates formatted output for calendar component property tzname
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.4.8 - 2008-10-21
+ * @return string
+ */
+ function createTzname() {
+ if( empty( $this->tzname )) return FALSE;
+ $output = null;
+ foreach( $this->tzname as $theName ) {
+ if( !empty( $theName['value'] )) {
+ $attributes = $this->_createParams( $theName['params'], array( 'LANGUAGE' ));
+ $output .= $this->_createElement( 'TZNAME', $attributes, $this->_strrep( $theName['value'] ));
+ }
+ elseif( $this->getConfig( 'allowEmpty' )) $output .= $this->_createElement( 'TZNAME' );
+ }
+ return $output;
+ }
+/**
+ * set calendar component property tzname
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.5.1 - 2008-11-05
+ * @param string $value
+ * @param string $params, optional
+ * @param integer $index, optional
+ * @return bool
+ */
+ function setTzname( $value, $params=FALSE, $index=FALSE ) {
+ if( empty( $value )) if( $this->getConfig( 'allowEmpty' )) $value = null; else return FALSE;
+ $this->_setMval( $this->tzname, $value, $params, FALSE, $index );
+ return TRUE;
+ }
+/*********************************************************************************/
+/**
+ * Property Name: TZOFFSETFROM
+ */
+/**
+ * creates formatted output for calendar component property tzoffsetfrom
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.4.8 - 2008-10-21
+ * @return string
+ */
+ function createTzoffsetfrom() {
+ if( empty( $this->tzoffsetfrom )) return FALSE;
+ if( empty( $this->tzoffsetfrom['value'] ))
+ return ( $this->getConfig( 'allowEmpty' )) ? $this->_createElement( 'TZOFFSETFROM' ) : FALSE;
+ $attributes = $this->_createParams( $this->tzoffsetfrom['params'] );
+ return $this->_createElement( 'TZOFFSETFROM', $attributes, $this->tzoffsetfrom['value'] );
+ }
+/**
+ * set calendar component property tzoffsetfrom
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.4.8 - 2008-11-04
+ * @param string $value
+ * @param string $params optional
+ * @return bool
+ */
+ function setTzoffsetfrom( $value, $params=FALSE ) {
+ if( empty( $value )) if( $this->getConfig( 'allowEmpty' )) $value = null; else return FALSE;
+ $this->tzoffsetfrom = array( 'value' => $value, 'params' => $this->_setParams( $params ));
+ return TRUE;
+ }
+/*********************************************************************************/
+/**
+ * Property Name: TZOFFSETTO
+ */
+/**
+ * creates formatted output for calendar component property tzoffsetto
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.4.8 - 2008-10-21
+ * @return string
+ */
+ function createTzoffsetto() {
+ if( empty( $this->tzoffsetto )) return FALSE;
+ if( empty( $this->tzoffsetto['value'] ))
+ return ( $this->getConfig( 'allowEmpty' )) ? $this->_createElement( 'TZOFFSETTO' ) : FALSE;
+ $attributes = $this->_createParams( $this->tzoffsetto['params'] );
+ return $this->_createElement( 'TZOFFSETTO', $attributes, $this->tzoffsetto['value'] );
+ }
+/**
+ * set calendar component property tzoffsetto
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.4.8 - 2008-11-04
+ * @param string $value
+ * @param string $params optional
+ * @return bool
+ */
+ function setTzoffsetto( $value, $params=FALSE ) {
+ if( empty( $value )) if( $this->getConfig( 'allowEmpty' )) $value = null; else return FALSE;
+ $this->tzoffsetto = array( 'value' => $value, 'params' => $this->_setParams( $params ));
+ return TRUE;
+ }
+/*********************************************************************************/
+/**
+ * Property Name: TZURL
+ */
+/**
+ * creates formatted output for calendar component property tzurl
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.4.8 - 2008-10-21
+ * @return string
+ */
+ function createTzurl() {
+ if( empty( $this->tzurl )) return FALSE;
+ if( empty( $this->tzurl['value'] ))
+ return ( $this->getConfig( 'allowEmpty' )) ? $this->_createElement( 'TZURL' ) : FALSE;
+ $attributes = $this->_createParams( $this->tzurl['params'] );
+ return $this->_createElement( 'TZURL', $attributes, $this->tzurl['value'] );
+ }
+/**
+ * set calendar component property tzurl
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.4.8 - 2008-11-04
+ * @param string $value
+ * @param string $params optional
+ * @return boll
+ */
+ function setTzurl( $value, $params=FALSE ) {
+ if( empty( $value )) if( $this->getConfig( 'allowEmpty' )) $value = null; else return FALSE;
+ $this->tzurl = array( 'value' => $value, 'params' => $this->_setParams( $params ));
+ return TRUE;
+ }
+/*********************************************************************************/
+/**
+ * Property Name: UID
+ */
+/**
+ * creates formatted output for calendar component property uid
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 0.9.7 - 2006-11-20
+ * @return string
+ */
+ function createUid() {
+ if( 0 >= count( $this->uid ))
+ $this->_makeuid();
+ $attributes = $this->_createParams( $this->uid['params'] );
+ return $this->_createElement( 'UID', $attributes, $this->uid['value'] );
+ }
+/**
+ * create an unique id for this calendar component object instance
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.2.7 - 2007-09-04
+ * @return void
+ */
+ function _makeUid() {
+ $date = date('Ymd\THisT');
+ $unique = substr(microtime(), 2, 4);
+ $base = 'aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPrRsStTuUvVxXuUvVwWzZ1234567890';
+ $start = 0;
+ $end = strlen( $base ) - 1;
+ $length = 6;
+ $str = null;
+ for( $p = 0; $p < $length; $p++ )
+ $unique .= $base{mt_rand( $start, $end )};
+ $this->uid = array( 'params' => null );
+ $this->uid['value'] = $date.'-'.$unique.'@'.$this->getConfig( 'unique_id' );
+ }
+/**
+ * set calendar component property uid
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.4.8 - 2008-11-04
+ * @param string $value
+ * @param string $params optional
+ * @return bool
+ */
+ function setUid( $value, $params=FALSE ) {
+ if( empty( $value )) return FALSE; // no allowEmpty check here !!!!
+ $this->uid = array( 'value' => $value, 'params' => $this->_setParams( $params ));
+ return TRUE;
+ }
+/*********************************************************************************/
+/**
+ * Property Name: URL
+ */
+/**
+ * creates formatted output for calendar component property url
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.4.8 - 2008-10-21
+ * @return string
+ */
+ function createUrl() {
+ if( empty( $this->url )) return FALSE;
+ if( empty( $this->url['value'] ))
+ return ( $this->getConfig( 'allowEmpty' )) ? $this->_createElement( 'URL' ) : FALSE;
+ $attributes = $this->_createParams( $this->url['params'] );
+ return $this->_createElement( 'URL', $attributes, $this->url['value'] );
+ }
+/**
+ * set calendar component property url
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.4.8 - 2008-11-04
+ * @param string $value
+ * @param string $params optional
+ * @return bool
+ */
+ function setUrl( $value, $params=FALSE ) {
+ if( empty( $value )) if( $this->getConfig( 'allowEmpty' )) $value = null; else return FALSE;
+ $this->url = array( 'value' => $value, 'params' => $this->_setParams( $params ));
+ return TRUE;
+ }
+/*********************************************************************************/
+/**
+ * Property Name: x-prop
+ */
+/**
+ * creates formatted output for calendar component property x-prop
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.4.11 - 2008-10-22
+ * @return string
+ */
+ function createXprop() {
+ if( empty( $this->xprop )) return FALSE;
+ $output = null;
+ foreach( $this->xprop as $label => $xpropPart ) {
+ if( empty( $xpropPart['value'] )) {
+ if( $this->getConfig( 'allowEmpty' )) $output .= $this->_createElement( $label );
+ continue;
+ }
+ $attributes = $this->_createParams( $xpropPart['params'], array( 'LANGUAGE' ));
+ if( is_array( $xpropPart['value'] )) {
+ foreach( $xpropPart['value'] as $pix => $theXpart )
+ $xpropPart['value'][$pix] = $this->_strrep( $theXpart );
+ $xpropPart['value'] = implode( ',', $xpropPart['value'] );
+ }
+ else
+ $xpropPart['value'] = $this->_strrep( $xpropPart['value'] );
+ $output .= $this->_createElement( $label, $attributes, $xpropPart['value'] );
+ }
+ return $output;
+ }
+/**
+ * set calendar component property x-prop
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.4.11 - 2008-11-04
+ * @param string $label
+ * @param mixed $value
+ * @param array $params optional
+ * @return bool
+ */
+ function setXprop( $label, $value, $params=FALSE ) {
+ if( empty( $label )) return;
+ if( empty( $value )) if( $this->getConfig( 'allowEmpty' )) $value = null; else return FALSE;
+ $xprop = array( 'value' => $value );
+ $toolbox = new calendarComponent();
+ $xprop['params'] = $toolbox->_setParams( $params );
+ if( !is_array( $this->xprop )) $this->xprop = array();
+ $this->xprop[strtoupper( $label )] = $xprop;
+ return TRUE;
+ }
+/*********************************************************************************/
+/*********************************************************************************/
+/**
+ * create element format parts
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.0.6 - 2006-06-20
+ * @return string
+ */
+ function _createFormat() {
+ $objectname = null;
+ switch( $this->format ) {
+ case 'xcal':
+ $objectname = ( isset( $this->timezonetype )) ?
+ strtolower( $this->timezonetype ) : strtolower( $this->objName );
+ $this->componentStart1 = $this->elementStart1 = '<';
+ $this->componentStart2 = $this->elementStart2 = '>';
+ $this->componentEnd1 = $this->elementEnd1 = '</';
+ $this->componentEnd2 = $this->elementEnd2 = '>'.$this->nl;
+ $this->intAttrDelimiter = '<!-- -->';
+ $this->attributeDelimiter = $this->nl;
+ $this->valueInit = null;
+ break;
+ default:
+ $objectname = ( isset( $this->timezonetype )) ?
+ strtoupper( $this->timezonetype ) : strtoupper( $this->objName );
+ $this->componentStart1 = 'BEGIN:';
+ $this->componentStart2 = null;
+ $this->componentEnd1 = 'END:';
+ $this->componentEnd2 = $this->nl;
+ $this->elementStart1 = null;
+ $this->elementStart2 = null;
+ $this->elementEnd1 = null;
+ $this->elementEnd2 = $this->nl;
+ $this->intAttrDelimiter = '<!-- -->';
+ $this->attributeDelimiter = ';';
+ $this->valueInit = ':';
+ break;
+ }
+ return $objectname;
+ }
+/**
+ * creates formatted output for calendar component property
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.4.8 - 2008-10-23
+ * @param string $label property name
+ * @param string $attributes property attributes
+ * @param string $content property content (optional)
+ * @return string
+ */
+ function _createElement( $label, $attributes=null, $content=FALSE ) {
+ $label = $this->_formatPropertyName( $label );
+ $output = $this->elementStart1.$label;
+ $categoriesAttrLang = null;
+ $attachInlineBinary = FALSE;
+ $attachfmttype = null;
+ if( !empty( $attributes )) {
+ $attributes = trim( $attributes );
+ if ( 'xcal' == $this->format) {
+ $attributes2 = explode( $this->intAttrDelimiter, $attributes );
+ $attributes = null;
+ foreach( $attributes2 as $attribute ) {
+ $attrKVarr = explode( '=', $attribute );
+ if( empty( $attrKVarr[0] ))
+ continue;
+ if( !isset( $attrKVarr[1] )) {
+ $attrValue = $attrKVarr[0];
+ $attrKey = null;
+ }
+ elseif( 2 == count( $attrKVarr)) {
+ $attrKey = strtolower( $attrKVarr[0] );
+ $attrValue = $attrKVarr[1];
+ }
+ else {
+ $attrKey = strtolower( $attrKVarr[0] );
+ unset( $attrKVarr[0] );
+ $attrValue = implode( '=', $attrKVarr );
+ }
+ if(( 'attach' == $label ) && ( in_array( $attrKey, array( 'fmttype', 'encoding', 'value' )))) {
+ $attachInlineBinary = TRUE;
+ if( 'fmttype' == $attrKey )
+ $attachfmttype = $attrKey.'='.$attrValue;
+ continue;
+ }
+ elseif(( 'categories' == $label ) && ( 'language' == $attrKey ))
+ $categoriesAttrLang = $attrKey.'='.$attrValue;
+ else {
+ $attributes .= ( empty( $attributes )) ? ' ' : $this->attributeDelimiter.' ';
+ $attributes .= ( !empty( $attrKey )) ? $attrKey.'=' : null;
+ if(( '"' == substr( $attrValue, 0, 1 )) && ( '"' == substr( $attrValue, -1 ))) {
+ $attrValue = substr( $attrValue, 1, ( strlen( $attrValue ) - 2 ));
+ $attrValue = str_replace( '"', '', $attrValue );
+ }
+ $attributes .= '"'.htmlspecialchars( $attrValue ).'"';
+ }
+ }
+ }
+ else {
+ $attributes = str_replace( $this->intAttrDelimiter, $this->attributeDelimiter, $attributes );
+ }
+ }
+ if(((( 'attach' == $label ) && !$attachInlineBinary ) ||
+ ( in_array( $label, array( 'tzurl', 'url' )))) && ( 'xcal' == $this->format)) {
+ $pos = strrpos($content, "/");
+ $docname = ( $pos !== false) ? substr( $content, (1 - strlen( $content ) + $pos )) : $content;
+ $this->xcaldecl[] = array( 'xmldecl' => 'ENTITY'
+ , 'uri' => $docname
+ , 'ref' => 'SYSTEM'
+ , 'external' => $content
+ , 'type' => 'NDATA'
+ , 'type2' => 'BINERY' );
+ $attributes .= ( empty( $attributes )) ? ' ' : $this->attributeDelimiter.' ';
+ $attributes .= 'uri="'.$docname.'"';
+ $content = null;
+ if( 'attach' == $label ) {
+ $attributes = str_replace( $this->attributeDelimiter, $this->intAttrDelimiter, $attributes );
+ $content = $this->_createElement( 'extref', $attributes, null );
+ $attributes = null;
+ }
+ }
+ elseif(( 'attach' == $label ) && $attachInlineBinary && ( 'xcal' == $this->format)) {
+ $content = $this->nl.$this->_createElement( 'b64bin', $attachfmttype, $content ); // max one attribute
+ }
+ $output .= $attributes;
+ if( !$content ) {
+ switch( $this->format ) {
+ case 'xcal':
+ $output .= ' /';
+ $output .= $this->elementStart2;
+ return $output;
+ break;
+ default:
+ $output .= $this->elementStart2.$this->valueInit;
+ return $this->_size75( $output );
+ break;
+ }
+ }
+ $output .= $this->elementStart2;
+ $output .= $this->valueInit.$content;
+ switch( $this->format ) {
+ case 'xcal':
+ return $output.$this->elementEnd1.$label.$this->elementEnd2;
+ break;
+ default:
+ return $this->_size75( $output );
+ break;
+ }
+ }
+/**
+ * creates formatted output for calendar component property parameters
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 0.9.22 - 2007-04-10
+ * @param array $params optional
+ * @param array $ctrKeys optional
+ * @return string
+ */
+ function _createParams( $params=array(), $ctrKeys=array() ) {
+ $attrLANG = $attr1 = $attr2 = null;
+ $CNattrKey = ( in_array( 'CN', $ctrKeys )) ? TRUE : FALSE ;
+ $LANGattrKey = ( in_array( 'LANGUAGE', $ctrKeys )) ? TRUE : FALSE ;
+ $CNattrExist = $LANGattrExist = FALSE;
+ if( is_array( $params )) {
+ foreach( $params as $paramKey => $paramValue ) {
+ if( is_int( $paramKey ))
+ $attr2 .= $this->intAttrDelimiter.$paramValue;
+ elseif(( 'LANGUAGE' == $paramKey ) && $LANGattrKey ) {
+ $attrLANG .= $this->intAttrDelimiter."LANGUAGE=$paramValue";
+ $LANGattrExist = TRUE;
+ }
+ elseif(( 'CN' == $paramKey ) && $CNattrKey ) {
+ $attr1 = $this->intAttrDelimiter.'CN="'.$paramValue.'"';
+ $CNattrExist = TRUE;
+ }
+ elseif(( 'ALTREP' == $paramKey ) && in_array( $paramKey, $ctrKeys ))
+ $attr2 .= $this->intAttrDelimiter.'ALTREP="'.$paramValue.'"';
+ elseif(( 'DIR' == $paramKey ) && in_array( $paramKey, $ctrKeys ))
+ $attr2 .= $this->intAttrDelimiter.'DIR="'.$paramValue.'"';
+ elseif(( 'SENT-BY' == $paramKey ) && in_array( $paramKey, $ctrKeys ))
+ $attr2 .= $this->intAttrDelimiter.'SENT-BY="MAILTO:'.$paramValue.'"';
+ else
+ $attr2 .= $this->intAttrDelimiter."$paramKey=$paramValue";
+ }
+ }
+ if( !$LANGattrExist ) {
+ $lang = $this->getConfig( 'language' );
+ if(( $CNattrExist || $LANGattrKey ) && $lang )
+ $attrLANG .= $this->intAttrDelimiter.'LANGUAGE='.$lang;
+ }
+ return $attrLANG.$attr1.$attr2;
+ }
+/**
+ * check a date(-time) for an opt. timezone and if it is a DATE-TIME or DATE
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.4.16 - 2008-10-25
+ * @param array $date, date to check
+ * @param int $parno, no of date parts (i.e. year, month.. .)
+ * @return array $params, property parameters
+ */
+ function _chkdatecfg( $theDate, & $parno, & $params ) {
+ if( isset( $params['TZID'] ))
+ $parno = 6;
+ elseif( isset( $params['VALUE'] ) && ( 'DATE' == $params['VALUE'] ))
+ $parno = 3;
+ else {
+ if( isset( $params['VALUE'] ) && ( 'PERIOD' == $params['VALUE'] ))
+ $parno = 7;
+ if( is_array( $theDate )) {
+ if( isset( $theDate['timestamp'] ))
+ $tzid = ( isset( $theDate['tz'] )) ? $theDate['tz'] : null;
+ else
+ $tzid = ( isset( $theDate['tz'] )) ? $theDate['tz'] : ( 7 == count( $theDate )) ? end( $theDate ) : null;
+ if( !empty( $tzid )) {
+ $parno = 7;
+ if( !$this->_isOffset( $tzid ))
+ $params['TZID'] = $tzid; // save only timezone
+ }
+ elseif( !$parno && ( 3 == count( $theDate )) &&
+ ( isset( $params['VALUE'] ) && ( 'DATE' == $params['VALUE'] )))
+ $parno = 3;
+ else
+ $parno = 6;
+ }
+ else { // string
+ $date = trim( $theDate );
+ if( 'Z' == substr( $date, -1 ))
+ $parno = 7; // UTC DATE-TIME
+ elseif((( 8 == strlen( $date ) && ctype_digit( $date )) || ( 11 >= strlen( $date ))) &&
+ ( !isset( $params['VALUE'] ) || !in_array( $params['VALUE'], array( 'DATE-TIME', 'PERIOD' ))))
+ $parno = 3; // DATE
+ $date = $this->_date_time_string( $date, $parno );
+ if( !empty( $date['tz'] )) {
+ $parno = 7;
+ if( !$this->_isOffset( $date['tz'] ))
+ $params['TZID'] = $date['tz']; // save only timezone
+ }
+ elseif( empty( $parno ))
+ $parno = 6;
+ }
+ if( isset( $params['TZID'] ))
+ $parno = 6;
+ }
+ }
+/**
+ * convert local startdate/enddate (Ymd[His]) to duration
+ *
+ * uses this component dates if missing input dates
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.2.11 - 2007-11-03
+ * @param array $startdate, optional
+ * @param array $duration, optional
+ * @return array duration
+ */
+ function _date2duration( $startdate=FALSE, $enddate=FALSE ) {
+ if( !$startdate || !$enddate ) {
+ if( FALSE === ( $startdate = $this->getProperty( 'dtstart' )))
+ return null;
+ if( FALSE === ( $enddate = $this->getProperty( 'dtend' ))) // vevent/vfreebusy
+ if( FALSE === ( $enddate = $this->getProperty( 'due' ))) // vtodo
+ return null;
+ }
+ if( !$startdate || !$enddate )
+ return null;
+ $startWdate = mktime( 0, 0, 0, $startdate['month'], $startdate['day'], $startdate['year'] );
+ $endWdate = mktime( 0, 0, 0, $enddate['month'], $enddate['day'], $enddate['year'] );
+ $wduration = $endWdate - $startWdate;
+ $dur = array();
+ $dur['week'] = (int) floor( $wduration / ( 7 * 24 * 60 * 60 ));
+ $wduration = $wduration % ( 7 * 24 * 60 * 60 );
+ $dur['day'] = (int) floor( $wduration / ( 24 * 60 * 60 ));
+ $wduration = $wduration % ( 24 * 60 * 60 );
+ $dur['hour'] = (int) floor( $wduration / ( 60 * 60 ));
+ $wduration = $wduration % ( 60 * 60 );
+ $dur['min'] = (int) floor( $wduration / ( 60 ));
+ $dur['sec'] = (int) $wduration % ( 60 );
+ return $dur;
+ }
+/**
+ * convert date/datetime to timestamp
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.4.8 - 2008-10-30
+ * @param array $datetime datetime/(date)
+ * @param string $tz timezone
+ * @return timestamp
+ */
+ function _date2timestamp( $datetime, $tz=null ) {
+ $output = null;
+ if( !isset( $datetime['hour'] )) $datetime['hour'] = '0';
+ if( !isset( $datetime['min'] )) $datetime['min'] = '0';
+ if( !isset( $datetime['sec'] )) $datetime['sec'] = '0';
+ foreach( $datetime as $dkey => $dvalue ) {
+ if( 'tz' != $dkey )
+ $datetime[$dkey] = (integer) $dvalue;
+ }
+ if( $tz )
+ $datetime['tz'] = $tz;
+ $offset = ( isset( $datetime['tz'] ) && ( '' < trim ( $datetime['tz'] ))) ? $this->_tz2offset( $datetime['tz'] ) : 0;
+ $output = mktime( $datetime['hour'], $datetime['min'], ($datetime['sec'] + $offset), $datetime['month'], $datetime['day'], $datetime['year'] );
+ return $output;
+ }
+/**
+ * ensures internal date-time/date format for input date-time/date in array format
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 0.3.0 - 2006-08-15
+ * @param array $datetime
+ * @param int $parno optional, default FALSE
+ * @return array
+ */
+ function _date_time_array( $datetime, $parno=FALSE ) {
+ $output = array();
+ foreach( $datetime as $dateKey => $datePart ) {
+ switch ( $dateKey ) {
+ case '0': case 'year': $output['year'] = $datePart; break;
+ case '1': case 'month': $output['month'] = $datePart; break;
+ case '2': case 'day': $output['day'] = $datePart; break;
+ }
+ if( 3 != $parno ) {
+ switch ( $dateKey ) {
+ case '0':
+ case '1':
+ case '2': break;
+ case '3': case 'hour': $output['hour'] = $datePart; break;
+ case '4': case 'min' : $output['min'] = $datePart; break;
+ case '5': case 'sec' : $output['sec'] = $datePart; break;
+ case '6': case 'tz' : $output['tz'] = $datePart; break;
+ }
+ }
+ }
+ if( 3 != $parno ) {
+ if( !isset( $output['hour'] ))
+ $output['hour'] = 0;
+ if( !isset( $output['min'] ))
+ $output['min'] = 0;
+ if( !isset( $output['sec'] ))
+ $output['sec'] = 0;
+ }
+ return $output;
+ }
+/**
+ * ensures internal date-time/date format for input date-time/date in string fromat
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.2.10 - 2007-10-19
+ * @param array $datetime
+ * @param int $parno optional, default FALSE
+ * @return array
+ */
+ function _date_time_string( $datetime, $parno=FALSE ) {
+ $datetime = (string) trim( $datetime );
+ $tz = null;
+ $len = strlen( $datetime ) - 1;
+ if( 'Z' == substr( $datetime, -1 )) {
+ $tz = 'Z';
+ $datetime = trim( substr( $datetime, 0, $len ));
+ }
+ elseif( ( ctype_digit( substr( $datetime, -2, 2 ))) && // time or date
+ ( '-' == substr( $datetime, -3, 1 )) ||
+ ( ':' == substr( $datetime, -3, 1 )) ||
+ ( '.' == substr( $datetime, -3, 1 ))) {
+ $continue = TRUE;
+ }
+ elseif( ( ctype_digit( substr( $datetime, -4, 4 ))) && // 4 pos offset
+ ( ' +' == substr( $datetime, -6, 2 )) ||
+ ( ' -' == substr( $datetime, -6, 2 ))) {
+ $tz = substr( $datetime, -5, 5 );
+ $datetime = substr( $datetime, 0, ($len - 5));
+ }
+ elseif( ( ctype_digit( substr( $datetime, -6, 6 ))) && // 6 pos offset
+ ( ' +' == substr( $datetime, -8, 2 )) ||
+ ( ' -' == substr( $datetime, -8, 2 ))) {
+ $tz = substr( $datetime, -7, 7 );
+ $datetime = substr( $datetime, 0, ($len - 7));
+ }
+ elseif( ( 6 < $len ) && ( ctype_digit( substr( $datetime, -6, 6 )))) {
+ $continue = TRUE;
+ }
+ elseif( 'T' == substr( $datetime, -7, 1 )) {
+ $continue = TRUE;
+ }
+ else {
+ $cx = $tx = 0; // 19970415T133000 US-Eastern
+ for( $cx = -1; $cx > ( 9 - $len ); $cx-- ) {
+ if(( ' ' == substr( $datetime, $cx, 1 )) || ctype_digit( substr( $datetime, $cx, 1 )))
+ break; // if exists, tz ends here.. . ?
+ elseif( ctype_alpha( substr( $datetime, $cx, 1 )) ||
+ ( in_array( substr( $datetime, $cx, 1 ), array( '-', '/' ))))
+ $tx--; // tz length counter
+ }
+ if( 0 > $tx ) {
+ $tz = substr( $datetime, $tx );
+ $datetime = trim( substr( $datetime, 0, $len + $tx + 1 ));
+ }
+ }
+ if( 0 < substr_count( $datetime, '-' )) {
+ $datetime = str_replace( '-', '/', $datetime );
+ }
+ elseif( ctype_digit( substr( $datetime, 0, 8 )) &&
+ ( 'T' == substr( $datetime, 8, 1 )) &&
+ ctype_digit( substr( $datetime, 9, 6 ))) {
+ $datetime = substr( $datetime, 4, 2 )
+ .'/'.substr( $datetime, 6, 2 )
+ .'/'.substr( $datetime, 0, 4 )
+ .' '.substr( $datetime, 9, 2 )
+ .':'.substr( $datetime, 11, 2 )
+ .':'.substr( $datetime, 13);
+ }
+ $datestring = date( 'Y-m-d H:i:s', strtotime( $datetime ));
+ $tz = trim( $tz );
+ $output = array();
+ $output['year'] = substr( $datestring, 0, 4 );
+ $output['month'] = substr( $datestring, 5, 2 );
+ $output['day'] = substr( $datestring, 8, 2 );
+ if(( 6 == $parno ) || ( 7 == $parno )) {
+ $output['hour'] = substr( $datestring, 11, 2 );
+ $output['min'] = substr( $datestring, 14, 2 );
+ $output['sec'] = substr( $datestring, 17, 2 );
+ if( !empty( $tz ))
+ $output['tz'] = $tz;
+ }
+ elseif( 3 != $parno ) {
+ if(( '00' < substr( $datestring, 11, 2 )) ||
+ ( '00' < substr( $datestring, 14, 2 )) ||
+ ( '00' < substr( $datestring, 17, 2 ))) {
+ $output['hour'] = substr( $datestring, 11, 2 );
+ $output['min'] = substr( $datestring, 14, 2 );
+ $output['sec'] = substr( $datestring, 17, 2 );
+ }
+ if( !empty( $tz ))
+ $output['tz'] = $tz;
+ }
+ return $output;
+ }
+/**
+ * ensures internal duration format for input in array format
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.1.1 - 2007-06-24
+ * @param array $duration
+ * @return array
+ */
+ function _duration_array( $duration ) {
+ $output = array();
+ if( is_array( $duration ) &&
+ ( 1 == count( $duration )) &&
+ isset( $duration['sec'] ) &&
+ ( 60 < $duration['sec'] )) {
+ $durseconds = $duration['sec'];
+ $output['week'] = floor( $durseconds / ( 60 * 60 * 24 * 7 ));
+ $durseconds = $durseconds % ( 60 * 60 * 24 * 7 );
+ $output['day'] = floor( $durseconds / ( 60 * 60 * 24 ));
+ $durseconds = $durseconds % ( 60 * 60 * 24 );
+ $output['hour'] = floor( $durseconds / ( 60 * 60 ));
+ $durseconds = $durseconds % ( 60 * 60 );
+ $output['min'] = floor( $durseconds / ( 60 ));
+ $output['sec'] = ( $durseconds % ( 60 ));
+ }
+ else {
+ foreach( $duration as $durKey => $durValue ) {
+ if( empty( $durValue )) continue;
+ switch ( $durKey ) {
+ case '0': case 'week': $output['week'] = $durValue; break;
+ case '1': case 'day': $output['day'] = $durValue; break;
+ case '2': case 'hour': $output['hour'] = $durValue; break;
+ case '3': case 'min': $output['min'] = $durValue; break;
+ case '4': case 'sec': $output['sec'] = $durValue; break;
+ }
+ }
+ }
+ if( isset( $output['week'] ) && ( 0 < $output['week'] )) {
+ unset( $output['day'], $output['hour'], $output['min'], $output['sec'] );
+ return $output;
+ }
+ unset( $output['week'] );
+ if( empty( $output['day'] ))
+ unset( $output['day'] );
+ if ( isset( $output['hour'] ) || isset( $output['min'] ) || isset( $output['sec'] )) {
+ if( !isset( $output['hour'] )) $output['hour'] = 0;
+ if( !isset( $output['min'] )) $output['min'] = 0;
+ if( !isset( $output['sec'] )) $output['sec'] = 0;
+ if(( 0 == $output['hour'] ) && ( 0 == $output['min'] ) && ( 0 == $output['sec'] ))
+ unset( $output['hour'], $output['min'], $output['sec'] );
+ }
+ return $output;
+ }
+/**
+ * convert duration to date in array format based on input or dtstart value
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.4.8 - 2008-10-30
+ * @param array $startdate, optional
+ * @param array $duration, optional
+ * @return array, date format
+ */
+ function duration2date( $startdate=FALSE, $duration=FALSE ) {
+ if( $startdate && $duration ) {
+ $d1 = $startdate;
+ $dur = $duration;
+ }
+ elseif( isset( $this->dtstart['value'] ) && isset( $this->duration['value'] )) {
+ $d1 = $this->dtstart['value'];
+ $dur = $this->duration['value'];
+ }
+ else
+ return null;
+ $dateOnly = ( isset( $d1['hour'] ) || isset( $d1['min'] ) || isset( $d1['sec'] )) ? FALSE : TRUE;
+ $d1['hour'] = ( isset( $d1['hour'] )) ? $d1['hour'] : 0;
+ $d1['min'] = ( isset( $d1['min'] )) ? $d1['min'] : 0;
+ $d1['sec'] = ( isset( $d1['sec'] )) ? $d1['sec'] : 0;
+ $dtend = mktime( $d1['hour'], $d1['min'], $d1['sec'], $d1['month'], $d1['day'], $d1['year'] );
+ if( isset( $dur['week'] ))
+ $dtend += ( $dur['week'] * 7 * 24 * 60 * 60 );
+ if( isset( $dur['day'] ))
+ $dtend += ( $dur['day'] * 24 * 60 * 60 );
+ if( isset( $dur['hour'] ))
+ $dtend += ( $dur['hour'] * 60 *60 );
+ if( isset( $dur['min'] ))
+ $dtend += ( $dur['min'] * 60 );
+ if( isset( $dur['sec'] ))
+ $dtend += $dur['sec'];
+ $dtend2 = array();
+ $dtend2['year'] = date('Y', $dtend );
+ $dtend2['month'] = date('m', $dtend );
+ $dtend2['day'] = date('d', $dtend );
+ $dtend2['hour'] = date('H', $dtend );
+ $dtend2['min'] = date('i', $dtend );
+ $dtend2['sec'] = date('s', $dtend );
+ if( isset( $d1['tz'] ))
+ $dtend2['tz'] = $d1['tz'];
+ if( $dateOnly && (( 0 == $dtend2['hour'] ) && ( 0 == $dtend2['min'] ) && ( 0 == $dtend2['sec'] )))
+ unset( $dtend2['hour'], $dtend2['min'], $dtend2['sec'] );
+ return $dtend2;
+ }
+/**
+ * ensures internal duration format for input in string format
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.0.5 - 2007-03-14
+ * @param string $duration
+ * @return array
+ */
+ function _duration_string( $duration ) {
+ $duration = (string) trim( $duration );
+ while( 'P' != strtoupper( substr( $duration, 0, 1 ))) {
+ if( 0 < strlen( $duration ))
+ $duration = substr( $duration, 1 );
+ else
+ return false; // no leading P !?!?
+ }
+ $duration = substr( $duration, 1 ); // skip P
+ $duration = str_replace ( 't', 'T', $duration );
+ $duration = str_replace ( 'T', '', $duration );
+ $output = array();
+ $val = null;
+ for( $ix=0; $ix < strlen( $duration ); $ix++ ) {
+ switch( strtoupper( $duration{$ix} )) {
+ case 'W':
+ $output['week'] = $val;
+ $val = null;
+ break;
+ case 'D':
+ $output['day'] = $val;
+ $val = null;
+ break;
+ case 'H':
+ $output['hour'] = $val;
+ $val = null;
+ break;
+ case 'M':
+ $output['min'] = $val;
+ $val = null;
+ break;
+ case 'S':
+ $output['sec'] = $val;
+ $val = null;
+ break;
+ default:
+ if( !ctype_digit( $duration{$ix} ))
+ return false; // unknown duration controll character !?!?
+ else
+ $val .= $duration{$ix};
+ }
+ }
+ return $this->_duration_array( $output );
+ }
+/**
+ * if not preSet, if exist, remove key with expected value from array and return hit value else return elseValue
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.4.16 - 2008-11-08
+ * @param array $array
+ * @param string $expkey, expected key
+ * @param string $expval, expected value
+ * @param int $hitVal optional, return value if found
+ * @param int $elseVal optional, return value if not found
+ * @param int $preSet optional, return value if already preset
+ * @return int
+ */
+ function _existRem( &$array, $expkey, $expval=FALSE, $hitVal=null, $elseVal=null, $preSet=null ) {
+ if( $preSet )
+ return $preSet;
+ if( !is_array( $array ) || ( 0 == count( $array )))
+ return $elseVal;
+ foreach( $array as $key => $value ) {
+ if( strtoupper( $expkey ) == strtoupper( $key )) {
+ if( !$expval || ( strtoupper( $expval ) == strtoupper( $array[$key] ))) {
+ unset( $array[$key] );
+ return $hitVal;
+ }
+ }
+ }
+ return $elseVal;
+ }
+/**
+ * creates formatted output for calendar component property data value type date/date-time
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.4.8 - 2008-10-30
+ * @param array $datetime
+ * @param int $parno, optional, default 6
+ * @return string
+ */
+ function _format_date_time( $datetime, $parno=6 ) {
+ if( !isset( $datetime['year'] ) &&
+ !isset( $datetime['month'] ) &&
+ !isset( $datetime['day'] ) &&
+ !isset( $datetime['hour'] ) &&
+ !isset( $datetime['min'] ) &&
+ !isset( $datetime['sec'] ))
+ return ;
+ $output = null;
+ // if( !isset( $datetime['day'] )) { $o=''; foreach($datetime as $k=>$v) {if(is_array($v)) $v=implode('-',$v);$o.=" $k=>$v";} echo " day SAKNAS : $o <br />\n"; }
+ foreach( $datetime as $dkey => $dvalue ) {
+ if( 'tz' != $dkey )
+ $datetime[$dkey] = (integer) $dvalue;
+ }
+ $output = date('Ymd', mktime( 0, 0, 0, $datetime['month'], $datetime['day'], $datetime['year']));
+ if( isset( $datetime['hour'] ) ||
+ isset( $datetime['min'] ) ||
+ isset( $datetime['sec'] ) ||
+ isset( $datetime['tz'] )) {
+ if( isset( $datetime['tz'] ) &&
+ !isset( $datetime['hour'] ))
+ $datetime['hour'] = 0;
+ if( isset( $datetime['hour'] ) &&
+ !isset( $datetime['min'] ))
+ $datetime['min'] = 0;
+ if( isset( $datetime['hour'] ) &&
+ isset( $datetime['min'] ) &&
+ !isset( $datetime['sec'] ))
+ $datetime['sec'] = 0;
+ $date = mktime( $datetime['hour'], $datetime['min'], $datetime['sec'], $datetime['month'], $datetime['day'], $datetime['year']);
+ $output .= date('\THis', $date );
+ if( isset( $datetime['tz'] ) && ( '' < trim ( $datetime['tz'] ))) {
+ $datetime['tz'] = trim( $datetime['tz'] );
+ if( 'Z' == $datetime['tz'] )
+ $output .= 'Z';
+ $offset = $this->_tz2offset( $datetime['tz'] );
+ if( 0 != $offset ) {
+ $date = mktime( $datetime['hour'], $datetime['min'], ($datetime['sec'] + $offset), $datetime['month'], $datetime['day'], $datetime['year']);
+ $output = date( 'Ymd\THis\Z', $date );
+ }
+ }
+ elseif( 7 == $parno )
+ $output .= 'Z';
+ }
+ return $output;
+ }
+/**
+ * creates formatted output for calendar component property data value type duration
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.4.16 - 2008-10-10
+ * @param array $duration ( week, day, hour, min, sec )
+ * @return string
+ */
+ function _format_duration( $duration ) {
+ if( !isset( $duration['week'] ) &&
+ !isset( $duration['day'] ) &&
+ !isset( $duration['hour'] ) &&
+ !isset( $duration['min'] ) &&
+ !isset( $duration['sec'] ))
+ return;
+ $output = 'P';
+ if( isset( $duration['week'] ) && ( 0 < $duration['week'] ))
+ $output .= $duration['week'].'W';
+ else {
+ if( isset($duration['day'] ) && ( 0 < $duration['day'] ))
+ $output .= $duration['day'].'D';
+ if(( isset( $duration['hour']) && ( 0 < $duration['hour'] )) ||
+ ( isset( $duration['min']) && ( 0 < $duration['min'] )) ||
+ ( isset( $duration['sec']) && ( 0 < $duration['sec'] ))) {
+ $output .= 'T';
+ $output .= ( isset( $duration['hour']) && ( 0 < $duration['hour'] )) ? $duration['hour'].'H' : '0H';
+ $output .= ( isset( $duration['min']) && ( 0 < $duration['min'] )) ? $duration['min']. 'M' : '0M';
+ $output .= ( isset( $duration['sec']) && ( 0 < $duration['sec'] )) ? $duration['sec']. 'S' : '0S';
+ }
+ }
+ return $output;
+ }
+/**
+ * creates formatted output for calendar component property data value type recur
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.4.8 - 2008-10-22
+ * @param array $recurlabel
+ * @param array $recurdata
+ * @return string
+ */
+ function _format_recur( $recurlabel, $recurdata ) {
+ $output = null;
+ foreach( $recurdata as $therule ) {
+ if( empty( $therule['value'] )) {
+ if( $this->getConfig( 'allowEmpty' )) $output .= $this->_createElement( $recurlabel );
+ continue;
+ }
+ $attributes = ( isset( $therule['params'] )) ? $this->_createParams( $therule['params'] ) : null;
+ $content1 = $content2 = null;
+ foreach( $therule['value'] as $rulelabel => $rulevalue ) {
+ switch( $rulelabel ) {
+ case 'FREQ': {
+ $content1 .= "FREQ=$rulevalue";
+ break;
+ }
+ case 'UNTIL': {
+ $content2 .= ";UNTIL=";
+ $content2 .= $this->_format_date_time( $rulevalue );
+ break;
+ }
+ case 'COUNT':
+ case 'INTERVAL':
+ case 'WKST': {
+ $content2 .= ";$rulelabel=$rulevalue";
+ break;
+ }
+ case 'BYSECOND':
+ case 'BYMINUTE':
+ case 'BYHOUR':
+ case 'BYMONTHDAY':
+ case 'BYYEARDAY':
+ case 'BYWEEKNO':
+ case 'BYMONTH':
+ case 'BYSETPOS': {
+ $content2 .= ";$rulelabel=";
+ if( is_array( $rulevalue )) {
+ foreach( $rulevalue as $vix => $valuePart ) {
+ $content2 .= ( $vix ) ? ',' : null;
+ $content2 .= $valuePart;
+ }
+ }
+ else
+ $content2 .= $rulevalue;
+ break;
+ }
+ case 'BYDAY': {
+ $content2 .= ";$rulelabel=";
+ $bydaycnt = 0;
+ foreach( $rulevalue as $vix => $valuePart ) {
+ $content21 = $content22 = null;
+ if( is_array( $valuePart )) {
+ $content2 .= ( $bydaycnt ) ? ',' : null;
+ foreach( $valuePart as $vix2 => $valuePart2 ) {
+ if( 'DAY' != strtoupper( $vix2 ))
+ $content21 .= $valuePart2;
+ else
+ $content22 .= $valuePart2;
+ }
+ $content2 .= $content21.$content22;
+ $bydaycnt++;
+ }
+ else {
+ $content2 .= ( $bydaycnt ) ? ',' : null;
+ if( 'DAY' != strtoupper( $vix ))
+ $content21 .= $valuePart;
+ else {
+ $content22 .= $valuePart;
+ $bydaycnt++;
+ }
+ $content2 .= $content21.$content22;
+ }
+ }
+ break;
+ }
+ default: {
+ $content2 .= ";$rulelabel=$rulevalue";
+ break;
+ }
+ }
+ }
+ $output .= $this->_createElement( $recurlabel, $attributes, $content1.$content2 );
+ }
+ return $output;
+ }
+/**
+ * create property name case - lower/upper
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 0.9.7 - 2006-11-20
+ * @param string $propertyName
+ * @return string
+ */
+ function _formatPropertyName( $propertyName ) {
+ switch( $this->format ) {
+ case 'xcal':
+ return strtolower( $propertyName );
+ break;
+ default:
+ return strtoupper( $propertyName );
+ break;
+ }
+ }
+/**
+ * checks if input array contains a date
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.4.16 - 2008-10-25
+ * @param array $input
+ * @return bool
+ */
+ function _isArrayDate( $input ) {
+ if( isset( $input['week'] ) || ( !in_array( count( $input ), array( 3, 6, 7 ))))
+ return FALSE;
+ if( 7 == count( $input ))
+ return TRUE;
+ if( isset( $input['year'] ) && isset( $input['month'] ) && isset( $input['day'] ))
+ return checkdate( (int) $input['month'], (int) $input['day'], (int) $input['year'] );
+ if( isset( $input['day'] ) || isset( $input['hour'] ) || isset( $input['min'] ) || isset( $input['sec'] ))
+ return FALSE;
+ if( in_array( 0, $input ))
+ return FALSE;
+ if(( 1970 > $input[0] ) || ( 12 < $input[1] ) || ( 31 < $input[2] ))
+ return FALSE;
+ if(( isset( $input[0] ) && isset( $input[1] ) && isset( $input[2] )) &&
+ checkdate( (int) $input[1], (int) $input[2], (int) $input[0] ))
+ return TRUE;
+ $input = $this->_date_time_string( $input[1].'/'.$input[2].'/'.$input[0], 3 ); // m - d - Y
+ if( isset( $input['year'] ) && isset( $input['month'] ) && isset( $input['day'] ))
+ return checkdate( (int) $input['month'], (int) $input['day'], (int) $input['year'] );
+ return FALSE;
+ }
+/**
+ * checks if input array contains a timestamp date
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.4.16 - 2008-10-18
+ * @param array $input
+ * @return bool
+ */
+ function _isArrayTimestampDate( $input ) {
+ return ( is_array( $input ) && isset( $input['timestamp'] )) ? TRUE : FALSE ;
+ }
+/**
+ * controll if input string contains traling UTC offset
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.4.16 - 2008-10-19
+ * @param string $input
+ * @return bool
+ */
+ function _isOffset( $input ) {
+ $input = trim( (string) $input );
+ if( 'Z' == substr( $input, -1 ))
+ return TRUE;
+ elseif(( 5 <= strlen( $input )) &&
+ ( in_array( substr( $input, -5, 1 ), array( '+', '-' ))) &&
+ ( '0000' < substr( $input, -4 )) && ( '9999' >= substr( $input, -4 )))
+ return TRUE;
+ elseif(( 7 <= strlen( $input )) &&
+ ( in_array( substr( $input, -7, 1 ), array( '+', '-' ))) &&
+ ( '000000' < substr( $input, -6 )) && ( '999999' >= substr( $input, -6 )))
+ return TRUE;
+ return FALSE;
+
+ }
+/**
+ * check if property not exists within component
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.5.1 - 2008-10-15
+ * @param string $propName
+ * @return bool
+ */
+ function _notExistProp( $propName ) {
+ if( empty( $propName )) return FALSE; // when deleting x-prop, an empty propName may be used=allowed
+ $propName = strtolower( $propName );
+ if( 'last-modified' == $propName ) { if( !isset( $this->lastmodified )) return TRUE; }
+ elseif( 'percent-complete' == $propName ) { if( !isset( $this->percentcomplete )) return TRUE; }
+ elseif( 'recurrence-id' == $propName ) { if( !isset( $this->recurrenceid )) return TRUE; }
+ elseif( 'related-to' == $propName ) { if( !isset( $this->relatedto )) return TRUE; }
+ elseif( 'request-status' == $propName ) { if( !isset( $this->requeststatus )) return TRUE; }
+ elseif(( 'x-' != substr($propName,0,2)) && !isset( $this->$propName )) return TRUE;
+ return FALSE;
+ }
+/**
+ * remakes a recur pattern to an array of dates
+ *
+ * if missing, UNTIL is set 1 year from startdate (emergency break)
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.4.16 - 2008-10-18
+ * @param array $result, array to update, array([timestamp] => timestamp)
+ * @param array $recur, pattern for recurrency (only value part, params ignored)
+ * @param array $wdate, component start date
+ * @param array $startdate, start date
+ * @param array $enddate, optional
+ * @return array of recurrence (start-)dates as index
+ * @todo BYHOUR, BYMINUTE, BYSECOND, ev. BYSETPOS due to ambiguity, WEEKLY at year end/start
+ */
+ function _recur2date( & $result, $recur, $wdate, $startdate, $enddate=FALSE ) {
+ foreach( $wdate as $k => $v ) if( ctype_digit( $v )) $wdate[$k] = (int) $v;
+ $wdatets = $this->_date2timestamp( $wdate );
+ $startdatets = $this->_date2timestamp( $startdate );
+ if( !$enddate ) {
+ $enddate = $startdate;
+ $enddate['year'] += 1;
+// echo "recur __in_ ".implode('-',$startdate)." period start ".implode('-',$wdate)." period end ".implode('-',$enddate)."<br />\n";print_r($recur);echo "<br />\n";//test###
+ }
+ $endDatets = $this->_date2timestamp( $enddate ); // fix break
+ if( !isset( $recur['COUNT'] ) && !isset( $recur['UNTIL'] ))
+ $recur['UNTIL'] = $enddate; // create break
+ if( isset( $recur['UNTIL'] )) {
+ $tdatets = $this->_date2timestamp( $recur['UNTIL'] );
+ if( $endDatets > $tdatets ) {
+ $endDatets = $tdatets; // emergency break
+ $enddate = $this->_timestamp2date( $endDatets, 6 );
+ }
+ else
+ $recur['UNTIL'] = $this->_timestamp2date( $endDatets, 6 );
+ }
+ if( $wdatets > $endDatets ) {
+ //echo "recur out of date ".implode('-',$this->_date_time_string(date('Y-m-d H:i:s',$wdatets),6))."<br />\n";//test
+ return array(); // nothing to do.. .
+ }
+ if( !isset( $recur['FREQ'] )) // "MUST be specified.. ."
+ $recur['FREQ'] = 'DAILY'; // ??
+ $wkst = ( isset( $recur['WKST'] ) && ( 'SU' == $recur['WKST'] )) ? 24*60*60 : 0; // ??
+ if( !isset( $recur['INTERVAL'] ))
+ $recur['INTERVAL'] = 1;
+ $countcnt = ( !isset( $recur['BYSETPOS'] )) ? 1 : 0; // DTSTART counts as the first occurrence
+ /* find out how to step up dates and set index for interval count */
+ $step = array();
+ if( 'YEARLY' == $recur['FREQ'] )
+ $step['year'] = 1;
+ elseif( 'MONTHLY' == $recur['FREQ'] )
+ $step['month'] = 1;
+ elseif( 'WEEKLY' == $recur['FREQ'] )
+ $step['day'] = 7;
+ else
+ $step['day'] = 1;
+ if( isset( $step['year'] ) && isset( $recur['BYMONTH'] ))
+ $step = array( 'month' => 1 );
+ if( empty( $step ) && isset( $recur['BYWEEKNO'] )) // ??
+ $step = array( 'day' => 7 );
+ if( isset( $recur['BYYEARDAY'] ) || isset( $recur['BYMONTHDAY'] ) || isset( $recur['BYDAY'] ))
+ $step = array( 'day' => 1 );
+ $intervalarr = array();
+ if( 1 < $recur['INTERVAL'] ) {
+ $intervalix = $this->_recurIntervalIx( $recur['FREQ'], $wdate, $wkst );
+ $intervalarr = array( $intervalix => 0 );
+ }
+ if( isset( $recur['BYSETPOS'] )) { // save start date + weekno
+ $bysetposymd1 = $bysetposymd2 = $bysetposw1 = $bysetposw2 = array();
+ $bysetposWold = (int) date( 'W', ( $wdatets + $wkst ));
+ $bysetposYold = $wdate['year'];
+ $bysetposMold = $wdate['month'];
+ $bysetposDold = $wdate['day'];
+ if( is_array( $recur['BYSETPOS'] )) {
+ foreach( $recur['BYSETPOS'] as $bix => $bval )
+ $recur['BYSETPOS'][$bix] = (int) $bval;
+ }
+ else
+ $recur['BYSETPOS'] = array( (int) $recur['BYSETPOS'] );
+ $this->_stepdate( $enddate, $endDatets, $step); // make sure to count whole last period
+ }
+ $this->_stepdate( $wdate, $wdatets, $step);
+ $year_old = null;
+ $daynames = array( 'SU', 'MO', 'TU', 'WE', 'TH', 'FR', 'SA' );
+ /* MAIN LOOP */
+ // echo "recur start ".implode('-',$wdate)." end ".implode('-',$enddate)."<br />\n";//test
+ while( TRUE ) {
+ if( isset( $endDatets ) && ( $wdatets > $endDatets ))
+ break;
+ if( isset( $recur['COUNT'] ) && ( $countcnt >= $recur['COUNT'] ))
+ break;
+ if( $year_old != $wdate['year'] ) {
+ $year_old = $wdate['year'];
+ $daycnts = array();
+ $yeardays = $weekno = 0;
+ $yeardaycnt = array();
+ for( $m = 1; $m <= 12; $m++ ) { // count up and update up-counters
+ $daycnts[$m] = array();
+ $weekdaycnt = array();
+ foreach( $daynames as $dn )
+ $yeardaycnt[$dn] = $weekdaycnt[$dn] = 0;
+ $mcnt = date( 't', mktime( 0, 0, 0, $m, 1, $wdate['year'] ));
+ for( $d = 1; $d <= $mcnt; $d++ ) {
+ $daycnts[$m][$d] = array();
+ if( isset( $recur['BYYEARDAY'] )) {
+ $yeardays++;
+ $daycnts[$m][$d]['yearcnt_up'] = $yeardays;
+ }
+ if( isset( $recur['BYDAY'] )) {
+ $day = date( 'w', mktime( 0, 0, 0, $m, $d, $wdate['year'] ));
+ $day = $daynames[$day];
+ $daycnts[$m][$d]['DAY'] = $day;
+ $weekdaycnt[$day]++;
+ $daycnts[$m][$d]['monthdayno_up'] = $weekdaycnt[$day];
+ $yeardaycnt[$day]++;
+ $daycnts[$m][$d]['yeardayno_up'] = $yeardaycnt[$day];
+ }
+ if( isset( $recur['BYWEEKNO'] ) || ( $recur['FREQ'] == 'WEEKLY' ))
+ $daycnts[$m][$d]['weekno_up'] =(int)date('W',mktime(0,0,$wkst,$m,$d,$wdate['year']));
+ }
+ }
+ $daycnt = 0;
+ $yeardaycnt = array();
+ if( isset( $recur['BYWEEKNO'] ) || ( $recur['FREQ'] == 'WEEKLY' )) {
+ $weekno = null;
+ for( $d=31; $d > 25; $d-- ) { // get last weekno for year
+ if( !$weekno )
+ $weekno = $daycnts[12][$d]['weekno_up'];
+ elseif( $weekno < $daycnts[12][$d]['weekno_up'] ) {
+ $weekno = $daycnts[12][$d]['weekno_up'];
+ break;
+ }
+ }
+ }
+ for( $m = 12; $m > 0; $m-- ) { // count down and update down-counters
+ $weekdaycnt = array();
+ foreach( $daynames as $dn )
+ $yeardaycnt[$dn] = $weekdaycnt[$dn] = 0;
+ $monthcnt = 0;
+ $mcnt = date( 't', mktime( 0, 0, 0, $m, 1, $wdate['year'] ));
+ for( $d = $mcnt; $d > 0; $d-- ) {
+ if( isset( $recur['BYYEARDAY'] )) {
+ $daycnt -= 1;
+ $daycnts[$m][$d]['yearcnt_down'] = $daycnt;
+ }
+ if( isset( $recur['BYMONTHDAY'] )) {
+ $monthcnt -= 1;
+ $daycnts[$m][$d]['monthcnt_down'] = $monthcnt;
+ }
+ if( isset( $recur['BYDAY'] )) {
+ $day = $daycnts[$m][$d]['DAY'];
+ $weekdaycnt[$day] -= 1;
+ $daycnts[$m][$d]['monthdayno_down'] = $weekdaycnt[$day];
+ $yeardaycnt[$day] -= 1;
+ $daycnts[$m][$d]['yeardayno_down'] = $yeardaycnt[$day];
+ }
+ if( isset( $recur['BYWEEKNO'] ) || ( $recur['FREQ'] == 'WEEKLY' ))
+ $daycnts[$m][$d]['weekno_down'] = ($daycnts[$m][$d]['weekno_up'] - $weekno - 1);
+ }
+ }
+ }
+ /* check interval */
+ if( 1 < $recur['INTERVAL'] ) {
+ /* create interval index */
+ $intervalix = $this->_recurIntervalIx( $recur['FREQ'], $wdate, $wkst );
+ /* check interval */
+ $currentKey = array_keys( $intervalarr );
+ $currentKey = end( $currentKey ); // get last index
+ if( $currentKey != $intervalix )
+ $intervalarr = array( $intervalix => ( $intervalarr[$currentKey] + 1 ));
+ if(( $recur['INTERVAL'] != $intervalarr[$intervalix] ) &&
+ ( 0 != $intervalarr[$intervalix] )) {
+ /* step up date */
+ //echo "skip: ".implode('-',$wdate)." ix=$intervalix old=$currentKey interval=".$intervalarr[$intervalix]."<br />\n";//test
+ $this->_stepdate( $wdate, $wdatets, $step);
+ continue;
+ }
+ else // continue within the selected interval
+ $intervalarr[$intervalix] = 0;
+ //echo "cont: ".implode('-',$wdate)." ix=$intervalix old=$currentKey interval=".$intervalarr[$intervalix]."<br />\n";//test
+ }
+ $updateOK = TRUE;
+ if( $updateOK && isset( $recur['BYMONTH'] ))
+ $updateOK = $this->_recurBYcntcheck( $recur['BYMONTH']
+ , $wdate['month']
+ ,($wdate['month'] - 13));
+ if( $updateOK && isset( $recur['BYWEEKNO'] ))
+ $updateOK = $this->_recurBYcntcheck( $recur['BYWEEKNO']
+ , $daycnts[$wdate['month']][$wdate['day']]['weekno_up']
+ , $daycnts[$wdate['month']][$wdate['day']]['weekno_down'] );
+ if( $updateOK && isset( $recur['BYYEARDAY'] ))
+ $updateOK = $this->_recurBYcntcheck( $recur['BYYEARDAY']
+ , $daycnts[$wdate['month']][$wdate['day']]['yearcnt_up']
+ , $daycnts[$wdate['month']][$wdate['day']]['yearcnt_down'] );
+ if( $updateOK && isset( $recur['BYMONTHDAY'] ))
+ $updateOK = $this->_recurBYcntcheck( $recur['BYMONTHDAY']
+ , $wdate['day']
+ , $daycnts[$wdate['month']][$wdate['day']]['monthcnt_down'] );
+ //echo "efter BYMONTHDAY: ".implode('-',$wdate).' status: '; echo ($updateOK) ? 'TRUE' : 'FALSE'; echo "<br />\n";//test###
+ if( $updateOK && isset( $recur['BYDAY'] )) {
+ $updateOK = FALSE;
+ $m = $wdate['month'];
+ $d = $wdate['day'];
+ if( isset( $recur['BYDAY']['DAY'] )) { // single day, opt with year/month day order no
+ $daynoexists = $daynosw = $daynamesw = FALSE;
+ if( $recur['BYDAY']['DAY'] == $daycnts[$m][$d]['DAY'] )
+ $daynamesw = TRUE;
+ if( isset( $recur['BYDAY'][0] )) {
+ $daynoexists = TRUE;
+ if(( isset( $recur['FREQ'] ) && ( $recur['FREQ'] == 'MONTHLY' )) || isset( $recur['BYMONTH'] ))
+ $daynosw = $this->_recurBYcntcheck( $recur['BYDAY'][0]
+ , $daycnts[$m][$d]['monthdayno_up']
+ , $daycnts[$m][$d]['monthdayno_down'] );
+ elseif( isset( $recur['FREQ'] ) && ( $recur['FREQ'] == 'YEARLY' ))
+ $daynosw = $this->_recurBYcntcheck( $recur['BYDAY'][0]
+ , $daycnts[$m][$d]['yeardayno_up']
+ , $daycnts[$m][$d]['yeardayno_down'] );
+ }
+ if(( $daynoexists && $daynosw && $daynamesw ) ||
+ ( !$daynoexists && !$daynosw && $daynamesw )) {
+ $updateOK = TRUE;
+ }
+ //echo "daynoexists:$daynoexists daynosw:$daynosw daynamesw:$daynamesw<br />\n"; // test ###
+ }
+ else {
+ foreach( $recur['BYDAY'] as $bydayvalue ) {
+ $daynoexists = $daynosw = $daynamesw = FALSE;
+ if( isset( $bydayvalue['DAY'] ) &&
+ ( $bydayvalue['DAY'] == $daycnts[$m][$d]['DAY'] ))
+ $daynamesw = TRUE;
+ if( isset( $bydayvalue[0] )) {
+ $daynoexists = TRUE;
+ if(( isset( $recur['FREQ'] ) && ( $recur['FREQ'] == 'MONTHLY' )) ||
+ isset( $recur['BYMONTH'] ))
+ $daynosw = $this->_recurBYcntcheck( $bydayvalue['0']
+ , $daycnts[$m][$d]['monthdayno_up']
+ , $daycnts[$m][$d]['monthdayno_down'] );
+ elseif( isset( $recur['FREQ'] ) && ( $recur['FREQ'] == 'YEARLY' ))
+ $daynosw = $this->_recurBYcntcheck( $bydayvalue['0']
+ , $daycnts[$m][$d]['yeardayno_up']
+ , $daycnts[$m][$d]['yeardayno_down'] );
+ }
+ //echo "daynoexists:$daynoexists daynosw:$daynosw daynamesw:$daynamesw<br />\n"; // test ###
+ if(( $daynoexists && $daynosw && $daynamesw ) ||
+ ( !$daynoexists && !$daynosw && $daynamesw )) {
+ $updateOK = TRUE;
+ break;
+ }
+ }
+ }
+ }
+ //echo "efter BYDAY: ".implode('-',$wdate).' status: '; echo ($updateOK) ? 'TRUE' : 'FALSE'; echo "<br />\n"; // test ###
+ /* check BYSETPOS */
+ if( $updateOK ) {
+ if( isset( $recur['BYSETPOS'] ) &&
+ ( in_array( $recur['FREQ'], array( 'YEARLY', 'MONTHLY', 'WEEKLY', 'DAILY' )))) {
+ if( isset( $recur['WEEKLY'] )) {
+ if( $bysetposWold == $daycnts[$wdate['month']][$wdate['day']]['weekno_up'] )
+ $bysetposw1[] = $wdatets;
+ else
+ $bysetposw2[] = $wdatets;
+ }
+ else {
+ if(( isset( $recur['FREQ'] ) && ( 'YEARLY' == $recur['FREQ'] ) &&
+ ( $bysetposYold == $wdate['year'] )) ||
+ ( isset( $recur['FREQ'] ) && ( 'MONTHLY' == $recur['FREQ'] ) &&
+ (( $bysetposYold == $wdate['year'] ) &&
+ ( $bysetposMold == $wdate['month'] ))) ||
+ ( isset( $recur['FREQ'] ) && ( 'MONTHLY' == $recur['FREQ'] ) &&
+ (( $bysetposYold == $wdate['year'] ) &&
+ ( $bysetposMold == $wdate['month']) &&
+ ( $bysetposDold == $wdate['sday'] ))))
+ $bysetposymd1[] = $wdatets;
+ else
+ $bysetposymd2[] = $wdatets;
+ }
+ }
+ else {
+ /* update result array if BYSETPOS is set */
+ $countcnt++;
+ if( $startdatets <= $wdatets ) { // only output within period
+ $result[$wdatets] = TRUE;
+ //echo "recur ".implode('-',$this->_date_time_string(date('Y-m-d H:i:s',$wdatets),6))."<br />\n";//test
+ }
+ //else echo "recur undate ".implode('-',$this->_date_time_string(date('Y-m-d H:i:s',$wdatets),6))." okdatstart ".implode('-',$this->_date_time_string(date('Y-m-d H:i:s',$startdatets),6))."<br />\n";//test
+ $updateOK = FALSE;
+ }
+ }
+ /* step up date */
+ $this->_stepdate( $wdate, $wdatets, $step);
+ /* check if BYSETPOS is set for updating result array */
+ if( $updateOK && isset( $recur['BYSETPOS'] )) {
+ $bysetpos = FALSE;
+ if( isset( $recur['FREQ'] ) && ( 'YEARLY' == $recur['FREQ'] ) &&
+ ( $bysetposYold != $wdate['year'] )) {
+ $bysetpos = TRUE;
+ $bysetposYold = $wdate['year'];
+ }
+ elseif( isset( $recur['FREQ'] ) && ( 'MONTHLY' == $recur['FREQ'] &&
+ (( $bysetposYold != $wdate['year'] ) || ( $bysetposMold != $wdate['month'] )))) {
+ $bysetpos = TRUE;
+ $bysetposYold = $wdate['year'];
+ $bysetposMold = $wdate['month'];
+ }
+ elseif( isset( $recur['FREQ'] ) && ( 'WEEKLY' == $recur['FREQ'] )) {
+ $weekno = (int) date( 'W', mktime( 0, 0, $wkst, $wdate['month'], $wdate['day'], $wdate['year']));
+ if( $bysetposWold != $weekno ) {
+ $bysetposWold = $weekno;
+ $bysetpos = TRUE;
+ }
+ }
+ elseif( isset( $recur['FREQ'] ) && ( 'DAILY' == $recur['FREQ'] ) &&
+ (( $bysetposYold != $wdate['year'] ) ||
+ ( $bysetposMold != $wdate['month'] ) ||
+ ( $bysetposDold != $wdate['sday'] ))) {
+ $bysetpos = TRUE;
+ $bysetposYold = $wdate['year'];
+ $bysetposMold = $wdate['month'];
+ $bysetposDold = $wdate['day'];
+ }
+ if( $bysetpos ) {
+ if( isset( $recur['BYWEEKNO'] )) {
+ $bysetposarr1 = & $bysetposw1;
+ $bysetposarr2 = & $bysetposw2;
+ }
+ else {
+ $bysetposarr1 = & $bysetposymd1;
+ $bysetposarr2 = & $bysetposymd2;
+ }
+ foreach( $recur['BYSETPOS'] as $ix ) {
+ if( 0 > $ix ) // both positive and negative BYSETPOS allowed
+ $ix = ( count( $bysetposarr1 ) + $ix + 1);
+ $ix--;
+ if( isset( $bysetposarr1[$ix] )) {
+ if( $startdatets <= $bysetposarr1[$ix] ) { // only output within period
+ $result[$bysetposarr1[$ix]] = TRUE;
+ //echo "recur ".implode('-',$this->_date_time_string(date('Y-m-d H:i:s',$bysetposarr1[$ix]),6))."<br />\n";//test
+ }
+ $countcnt++;
+ }
+ if( isset( $recur['COUNT'] ) && ( $countcnt >= $recur['COUNT'] ))
+ break;
+ }
+ $bysetposarr1 = $bysetposarr2;
+ $bysetposarr2 = array();
+ }
+ }
+ }
+ }
+ function _recurBYcntcheck( $BYvalue, $upValue, $downValue ) {
+ if( is_array( $BYvalue ) &&
+ ( in_array( $upValue, $BYvalue ) || in_array( $downValue, $BYvalue )))
+ return TRUE;
+ elseif(( $BYvalue == $upValue ) || ( $BYvalue == $downValue ))
+ return TRUE;
+ else
+ return FALSE;
+ }
+ function _recurIntervalIx( $freq, $date, $wkst ) {
+ /* create interval index */
+ switch( $freq ) {
+ case 'YEARLY':
+ $intervalix = $date['year'];
+ break;
+ case 'MONTHLY':
+ $intervalix = $date['year'].'-'.$date['month'];
+ break;
+ case 'WEEKLY':
+ $wdatets = $this->_date2timestamp( $date );
+ $intervalix = (int) date( 'W', ( $wdatets + $wkst ));
+ break;
+ case 'DAILY':
+ default:
+ $intervalix = $date['year'].'-'.$date['month'].'-'.$date['day'];
+ break;
+ }
+ return $intervalix;
+ }
+/**
+ * convert input format for exrule and rrule to internal format
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.4.16 - 2008-10-19
+ * @param array $rexrule
+ * @return array
+ */
+ function _setRexrule( $rexrule ) {
+ $input = array();
+ if( empty( $rexrule ))
+ return $input;
+ foreach( $rexrule as $rexrulelabel => $rexrulevalue ) {
+ $rexrulelabel = strtoupper( $rexrulelabel );
+ if( 'UNTIL' != $rexrulelabel )
+ $input[$rexrulelabel] = $rexrulevalue;
+ else {
+ if( $this->_isArrayTimestampDate( $rexrulevalue )) // timestamp date
+ $input[$rexrulelabel] = $this->_timestamp2date( $rexrulevalue, 6 );
+ elseif( $this->_isArrayDate( $rexrulevalue )) // date-time
+ $input[$rexrulelabel] = $this->_date_time_array( $rexrulevalue, 6 );
+ elseif( 8 <= strlen( trim( $rexrulevalue ))) // ex. 2006-08-03 10:12:18
+ $input[$rexrulelabel] = $this->_date_time_string( $rexrulevalue );
+ if(( 3 < count( $input[$rexrulelabel] )) && !isset( $input[$rexrulelabel]['tz'] ))
+ $input[$rexrulelabel]['tz'] = 'Z';
+ }
+ }
+ return $input;
+ }
+/**
+ * convert format for input date to internal date with parameters
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.4.17 - 2008-10-31
+ * @param mixed $year
+ * @param mixed $month optional
+ * @param int $day optional
+ * @param int $hour optional
+ * @param int $min optional
+ * @param int $sec optional
+ * @param array $params optional
+ * @param string $caller optional
+ * @return array
+ */
+ function _setDate( $year, $month=FALSE, $day=FALSE, $hour=FALSE, $min=FALSE, $sec=FALSE, $tz=FALSE, $params=FALSE, $caller=null ) {
+ $input = $parno = null;
+ $localtime = (( 'dtstart' == $caller ) && in_array( $this->objName, array( 'vtimezone', 'standard', 'daylight' ))) ? TRUE : FALSE;
+ if( $this->_isArrayDate( $year )) {
+ if( $localtime ) unset ( $month['VALUE'], $month['TZID'] );
+ $input['params'] = $this->_setParams( $month, array( 'VALUE' => 'DATE-TIME' ));
+ if( isset( $input['params']['TZID'] )) {
+ $input['params']['VALUE'] = 'DATE-TIME';
+ unset( $year['tz'] );
+ }
+ $hitval = (( !empty( $year['tz'] ) || !empty( $year[6] ))) ? 7 : 6;
+ $parno = $this->_existRem( $input['params'], 'VALUE', 'DATE-TIME', $hitval );
+ $parno = $this->_existRem( $input['params'], 'VALUE', 'DATE', 3, count( $year ), $parno );
+ $input['value'] = $this->_date_time_array( $year, $parno );
+ }
+ elseif( $this->_isArrayTimestampDate( $year )) {
+ if( $localtime ) unset ( $month['VALUE'], $month['TZID'] );
+ $input['params'] = $this->_setParams( $month, array( 'VALUE' => 'DATE-TIME' ));
+ if( isset( $input['params']['TZID'] )) {
+ $input['params']['VALUE'] = 'DATE-TIME';
+ unset( $year['tz'] );
+ }
+ $parno = $this->_existRem( $input['params'], 'VALUE', 'DATE', 3 );
+ $hitval = ( isset( $year['tz'] )) ? 7 : 6;
+ $parno = $this->_existRem( $input['params'], 'VALUE', 'DATE-TIME', $hitval, $parno );
+ $input['value'] = $this->_timestamp2date( $year, $parno );
+ }
+ elseif( 8 <= strlen( trim( $year ))) { // ex. 2006-08-03 10:12:18
+ if( $localtime ) unset ( $month['VALUE'], $month['TZID'] );
+ $input['params'] = $this->_setParams( $month, array( 'VALUE' => 'DATE-TIME' ));
+ if( isset( $input['params']['TZID'] )) {
+ $input['params']['VALUE'] = 'DATE-TIME';
+ $parno = 6;
+ }
+ $parno = $this->_existRem( $input['params'], 'VALUE', 'DATE-TIME', 7, $parno );
+ $parno = $this->_existRem( $input['params'], 'VALUE', 'DATE', 3, $parno, $parno );
+ $input['value'] = $this->_date_time_string( $year, $parno );
+ }
+ else {
+ if( is_array( $params )) {
+ if( $localtime ) unset ( $params['VALUE'], $params['TZID'] );
+ $input['params'] = $this->_setParams( $params, array( 'VALUE' => 'DATE-TIME' ));
+ }
+ elseif( is_array( $tz )) {
+ $input['params'] = $this->_setParams( $tz, array( 'VALUE' => 'DATE-TIME' ));
+ $tz = FALSE;
+ }
+ elseif( is_array( $hour )) {
+ $input['params'] = $this->_setParams( $hour, array( 'VALUE' => 'DATE-TIME' ));
+ $hour = $min = $sec = $tz = FALSE;
+ }
+ if( isset( $input['params']['TZID'] )) {
+ $tz = null;
+ $input['params']['VALUE'] = 'DATE-TIME';
+ }
+ $parno = $this->_existRem( $input['params'], 'VALUE', 'DATE', 3 );
+ $hitval = ( !empty( $tz )) ? 7 : 6;
+ $parno = $this->_existRem( $input['params'], 'VALUE', 'DATE-TIME', $hitval, $parno, $parno );
+ $input['value'] = array( 'year' => $year, 'month' => $month, 'day' => $day );
+ if( 3 != $parno ) {
+ $input['value']['hour'] = ( $hour ) ? $hour : '0';
+ $input['value']['min'] = ( $min ) ? $min : '0';
+ $input['value']['sec'] = ( $sec ) ? $sec : '0';
+ if( !empty( $tz ))
+ $input['value']['tz'] = $tz;
+ }
+ }
+ if( 3 == $parno ) {
+ $input['params']['VALUE'] = 'DATE';
+ unset( $input['value']['tz'] );
+ unset( $input['params']['TZID'] );
+ }
+ elseif( isset( $input['params']['TZID'] ))
+ unset( $input['value']['tz'] );
+ if( $localtime ) unset( $input['value']['tz'], $input['params']['TZID'] );
+ if( isset( $input['value']['tz'] ))
+ $input['value']['tz'] = (string) $input['value']['tz'];
+ if( !empty( $input['value']['tz'] ) && ( 'Z' != $input['value']['tz'] ) &&
+ ( !$this->_isOffset( $input['value']['tz'] )))
+ $input['params']['TZID'] = $input['value']['tz'];
+ return $input;
+ }
+/**
+ * convert format for input date (UTC) to internal date with parameters
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.4.17 - 2008-10-31
+ * @param mixed $year
+ * @param mixed $month optional
+ * @param int $day optional
+ * @param int $hour optional
+ * @param int $min optional
+ * @param int $sec optional
+ * @param array $params optional
+ * @return array
+ */
+ function _setDate2( $year, $month=FALSE, $day=FALSE, $hour=FALSE, $min=FALSE, $sec=FALSE, $params=FALSE ) {
+ $input = null;
+ if( $this->_isArrayDate( $year )) {
+ $input['value'] = $this->_date_time_array( $year, 7 );
+ $input['params'] = $this->_setParams( $month, array( 'VALUE' => 'DATE-TIME' ) );
+ }
+ elseif( $this->_isArrayTimestampDate( $year )) {
+ $input['value'] = $this->_timestamp2date( $year, 7 );
+ $input['params'] = $this->_setParams( $month, array( 'VALUE' => 'DATE-TIME' ) );
+ }
+ elseif( 8 <= strlen( trim( $year ))) { // ex. 2006-08-03 10:12:18
+ $input['value'] = $this->_date_time_string( $year, 7 );
+ $input['params'] = $this->_setParams( $month, array( 'VALUE' => 'DATE-TIME' ) );
+ }
+ else {
+ $input['value'] = array( 'year' => $year
+ , 'month' => $month
+ , 'day' => $day
+ , 'hour' => $hour
+ , 'min' => $min
+ , 'sec' => $sec );
+ $input['params'] = $this->_setParams( $params, array( 'VALUE' => 'DATE-TIME' ));
+ }
+ $parno = $this->_existRem( $input['params'], 'VALUE', 'DATE-TIME', 7 ); // remove default
+ if( !isset( $input['value']['hour'] ))
+ $input['value']['hour'] = 0;
+ if( !isset( $input['value']['min'] ))
+ $input['value']['min'] = 0;
+ if( !isset( $input['value']['sec'] ))
+ $input['value']['sec'] = 0;
+ if( !isset( $input['value']['tz'] ) || !$this->_isOffset( $input['value']['tz'] ))
+ $input['value']['tz'] = 'Z';
+ return $input;
+ }
+/**
+ * check index and set (an indexed) content in multiple value array
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.5.1 - 2008-11-06
+ * @param array $valArr
+ * @param mixed $value
+ * @param array $params
+ * @param array $defaults
+ * @param int $index
+ * @return void
+ */
+ function _setMval( & $valArr, $value, $params=FALSE, $defaults=FALSE, $index=FALSE ) {
+ if( !is_array( $valArr )) $valArr = array();
+ if( $index )
+ $index = $index - 1;
+ elseif( 0 < count( $valArr )) {
+ $index = end( array_keys( $valArr ));
+ $index += 1;
+ }
+ else
+ $index = 0;
+ $valArr[$index] = array( 'value' => $value, 'params' => $this->_setParams( $params, $defaults ));
+ ksort( $valArr );
+ }
+/**
+ * set input (formatted) parameters- component property attributes
+ *
+ * default parameters can be set, if missing
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 1.x.x - 2007-05-01
+ * @param array $params
+ * @param array $defaults
+ * @return array
+ */
+ function _setParams( $params, $defaults=FALSE ) {
+ if( !is_array( $params))
+ $params = array();
+ $input = array();
+ foreach( $params as $paramKey => $paramValue ) {
+ if( is_array( $paramValue )) {
+ foreach( $paramValue as $pkey => $pValue ) {
+ if(( '"' == substr( $pValue, 0, 1 )) && ( '"' == substr( $pValue, -1 )))
+ $paramValue[$pkey] = substr( $pValue, 1, ( strlen( $pValue ) - 2 ));
+ }
+ }
+ elseif(( '"' == substr( $paramValue, 0, 1 )) && ( '"' == substr( $paramValue, -1 )))
+ $paramValue = substr( $paramValue, 1, ( strlen( $paramValue ) - 2 ));
+ if( 'VALUE' == strtoupper( $paramKey ))
+ $input['VALUE'] = strtoupper( $paramValue );
+ else
+ $input[strtoupper( $paramKey )] = $paramValue;
+ }
+ if( is_array( $defaults )) {
+ foreach( $defaults as $paramKey => $paramValue ) {
+ if( !isset( $input[$paramKey] ))
+ $input[$paramKey] = $paramValue;
+ }
+ }
+ return (0 < count( $input )) ? $input : null;
+ }
+/**
+ * step date, return updated date, array and timpstamp
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.4.16 - 2008-10-18
+ * @param array $date, date to step
+ * @param int $timestamp
+ * @param array $step, default array( 'day' => 1 )
+ * @return void
+ */
+ function _stepdate( &$date, &$timestamp, $step=array( 'day' => 1 )) {
+ foreach( $step as $stepix => $stepvalue )
+ $date[$stepix] += $stepvalue;
+ $timestamp = $this->_date2timestamp( $date );
+ $date = $this->_timestamp2date( $timestamp, 6 );
+ foreach( $date as $k => $v ) {
+ if( ctype_digit( $v ))
+ $date[$k] = (int) $v;
+ }
+ }
+/**
+ * convert timestamp to date array
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.4.16 - 2008-11-01
+ * @param mixed $timestamp
+ * @param int $parno
+ * @return array
+ */
+ function _timestamp2date( $timestamp, $parno=6 ) {
+ if( is_array( $timestamp )) {
+ if(( 7 == $parno ) && !empty( $timestamp['tz'] ))
+ $tz = $timestamp['tz'];
+ $timestamp = $timestamp['timestamp'];
+ }
+ $output = array( 'year' => date( 'Y', $timestamp )
+ , 'month' => date( 'm', $timestamp )
+ , 'day' => date( 'd', $timestamp ));
+ if( 3 != $parno ) {
+ $output['hour'] = date( 'H', $timestamp );
+ $output['min'] = date( 'i', $timestamp );
+ $output['sec'] = date( 's', $timestamp );
+ if( isset( $tz ))
+ $output['tz'] = $tz;
+ }
+ return $output;
+ }
+/**
+ * convert (numeric) local time offset to seconds correcting localtime to GMT
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.4.16 - 2008-10-19
+ * @param string $offset
+ * @return integer
+ */
+ function _tz2offset( $tz ) {
+ $tz = trim( (string) $tz );
+ $offset = 0;
+ if((( 5 != strlen( $tz )) && ( 7 != strlen( $tz ))) ||
+ (( '+' != substr( $tz, 0, 1 )) && ( '-' != substr( $tz, 0, 1 ))) ||
+ (( '0000' >= substr( $tz, 1, 4 )) && ( '9999' < substr( $tz, 1, 4 ))) ||
+ (( 7 == strlen( $tz )) && ( '00' > substr( $tz, 5, 2 )) && ( '99' < substr( $tz, 5, 2 ))))
+ return $offset;
+ $hours2sec = (int) substr( $tz, 1, 2 ) * 3600;
+ $min2sec = (int) substr( $tz, 3, 2 ) * 60;
+ $sec = ( 7 == strlen( $tz )) ? (int) substr( $tz, -2 ) : '00';
+ $offset = $hours2sec + $min2sec + $sec;
+ $offset = ('-' == substr( $tz, 0, 1 )) ? $offset : -1 * $offset;
+ return $offset;
+ }
+/*********************************************************************************/
+/*********************************************************************************/
+/**
+ * get general component config variables or info about subcomponents
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.5.1 - 2008-11-02
+ * @param string $config
+ * @return value
+ */
+ function getConfig( $config ) {
+ switch( strtoupper( $config )) {
+ case 'ALLOWEMPTY':
+ return $this->allowEmpty;
+ break;
+ case 'COMPSINFO':
+ unset( $this->compix );
+ $info = array();
+ if( isset( $this->components )) {
+ foreach( $this->components as $cix => $component ) {
+ if( empty( $component )) continue;
+ unset( $component->propix );
+ $info[$cix]['ordno'] = $cix + 1;
+ $info[$cix]['type'] = $component->objName;
+ $info[$cix]['uid'] = $component->getProperty( 'uid' );
+ $info[$cix]['props'] = $component->getConfig( 'propinfo' );
+ $info[$cix]['sub'] = $component->getConfig( 'compsinfo' );
+ unset( $component->propix );
+ }
+ }
+ return $info;
+ break;
+ case 'FORMAT':
+ return $this->format;
+ break;
+ case 'LANGUAGE':
+ // get language for calendar component as defined in [RFC 1766]
+ return $this->language;
+ break;
+ case 'NL':
+ case 'NEWLINECHAR':
+ return $this->nl;
+ break;
+ case 'PROPINFO':
+ $output = array();
+ if( !in_array( $this->objName, array( 'valarm', 'vtimezone', 'standard', 'daylight' ))) {
+ if( empty( $this->uid['value'] )) $this->_makeuid();
+ $output['UID'] = 1;
+ }
+ if( !empty( $this->dtstamp )) $output['DTSTAMP'] = 1;
+ if( !empty( $this->summary )) $output['SUMMARY'] = 1;
+ if( !empty( $this->description )) $output['DESCRIPTION'] = count( $this->description );
+ if( !empty( $this->dtstart )) $output['DTSTART'] = 1;
+ if( !empty( $this->dtend )) $output['DTEND'] = 1;
+ if( !empty( $this->due )) $output['DUE'] = 1;
+ if( !empty( $this->duration )) $output['DURATION'] = 1;
+ if( !empty( $this->rrule )) $output['RRULE'] = count( $this->rrule );
+ if( !empty( $this->rdate )) $output['RDATE'] = count( $this->rdate );
+ if( !empty( $this->exdate )) $output['EXDATE'] = count( $this->exdate );
+ if( !empty( $this->exrule )) $output['EXRULE'] = count( $this->exrule );
+ if( !empty( $this->action )) $output['ACTION'] = 1;
+ if( !empty( $this->attach )) $output['ATTACH'] = count( $this->attach );
+ if( !empty( $this->attendee )) $output['ATTENDEE'] = count( $this->attendee );
+ if( !empty( $this->categories )) $output['CATEGORIES'] = count( $this->categories );
+ if( !empty( $this->class )) $output['CLASS'] = 1;
+ if( !empty( $this->comment )) $output['COMMENT'] = count( $this->comment );
+ if( !empty( $this->completed )) $output['COMPLETED'] = 1;
+ if( !empty( $this->contact )) $output['CONTACT'] = count( $this->contact );
+ if( !empty( $this->created )) $output['CREATED'] = 1;
+ if( !empty( $this->freebusy )) $output['FREEBUSY'] = count( $this->freebusy );
+ if( !empty( $this->geo )) $output['GEO'] = 1;
+ if( !empty( $this->lastmodified )) $output['LAST-MODIFIED'] = 1;
+ if( !empty( $this->location )) $output['LOCATION'] = 1;
+ if( !empty( $this->organizer )) $output['ORGANIZER'] = 1;
+ if( !empty( $this->percentcomplete )) $output['PERCENT-COMPLETE'] = 1;
+ if( !empty( $this->priority )) $output['PRIORITY'] = 1;
+ if( !empty( $this->recurrenceid )) $output['RECURRENCE-ID'] = 1;
+ if( !empty( $this->relatedto )) $output['RELATED-TO'] = count( $this->relatedto );
+ if( !empty( $this->repeat )) $output['REPEAT'] = 1;
+ if( !empty( $this->requeststatus )) $output['REQUEST-STATUS'] = count( $this->requeststatus );
+ if( !empty( $this->resources )) $output['RESOURCES'] = count( $this->resources );
+ if( !empty( $this->sequence )) $output['SEQUENCE'] = 1;
+ if( !empty( $this->status )) $output['STATUS'] = 1;
+ if( !empty( $this->transp )) $output['TRANSP'] = 1;
+ if( !empty( $this->trigger )) $output['TRIGGER'] = 1;
+ if( !empty( $this->tzid )) $output['TZID'] = 1;
+ if( !empty( $this->tzname )) $output['TZNAME'] = count( $this->tzname );
+ if( !empty( $this->tzoffsetfrom )) $output['TZOFFSETTFROM'] = 1;
+ if( !empty( $this->tzoffsetto )) $output['TZOFFSETTO'] = 1;
+ if( !empty( $this->tzurl )) $output['TZURL'] = 1;
+ if( !empty( $this->url )) $output['URL'] = 1;
+ if( !empty( $this->xprop )) $output['X-PROP'] = count( $this->xprop );
+ return $output;
+ break;
+ case 'UNIQUE_ID':
+ if( empty( $this->unique_id ))
+ $this->unique_id = ( isset( $_SERVER['SERVER_NAME'] )) ? gethostbyname( $_SERVER['SERVER_NAME'] ) : 'localhost';
+ return $this->unique_id;
+ break;
+ }
+ }
+/**
+ * general component config setting
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.4.8 - 2008-10-24
+ * @param string $config
+ * @param string $value
+ * @return void
+ */
+ function setConfig( $config, $value ) {
+ $res = FALSE;
+ switch( strtoupper( $config )) {
+ case 'ALLOWEMPTY':
+ $this->allowEmpty = $value;
+ $subcfg = array( 'ALLOWEMPTY' => $value );
+ $res = TRUE;
+ break;
+ case 'FORMAT':
+ $value = trim( $value );
+ $this->format = $value;
+ $this->_createFormat();
+ $subcfg = array( 'FORMAT' => $value );
+ $res = TRUE;
+ break;
+ case 'LANGUAGE':
+ // set language for calendar component as defined in [RFC 1766]
+ $value = trim( $value );
+ $this->language = $value;
+ $subcfg = array( 'LANGUAGE' => $value );
+ $res = TRUE;
+ break;
+ case 'NL':
+ case 'NEWLINECHAR':
+ $this->nl = $value;
+ $subcfg = array( 'NL' => $value );
+ $res = TRUE;
+ break;
+ case 'UNIQUE_ID':
+ $value = trim( $value );
+ $this->unique_id = $value;
+ $subcfg = array( 'UNIQUE_ID' => $value );
+ $res = TRUE;
+ break;
+ }
+ if( !$res ) return FALSE;
+ if( isset( $subcfg ) && !empty( $this->components )) {
+ foreach( $subcfg as $cfgkey => $cfgvalue ) {
+ foreach( $this->components as $cix => $component ) {
+ $res = $component->setConfig( $cfgkey, $cfgvalue );
+ if( !$res )
+ break 2;
+ $this->components[$cix] = $component; // PHP4 compliant
+ }
+ }
+ }
+ return $res;
+ }
+/*********************************************************************************/
+/**
+ * delete component property value
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.5.1 - 2008-11-14
+ * @param string $propName
+ * @param int @propix, optional, if specific property is wanted in case of multiply occurences
+ * @return bool, if successfull delete TRUE
+ */
+ function deleteProperty( $propName, $propix=FALSE ) {
+ if( $this->_notExistProp( $propName )) return FALSE;
+ $propName = strtoupper( $propName );
+ if( in_array( $propName, array( 'ATTACH', 'ATTENDEE', 'CATEGORIES', 'COMMENT', 'CONTACT', 'DESCRIPTION', 'EXDATE', 'EXRULE',
+ 'FREEBUSY', 'RDATE', 'RELATED-TO', 'RESOURCES', 'RRULE', 'REQUEST-STATUS', 'TZNAME', 'X-PROP' ))) {
+ if( !$propix )
+ $propix = ( isset( $this->propdelix[$propName] )) ? $this->propdelix[$propName] + 2 : 1;
+ $this->propdelix[$propName] = --$propix;
+ }
+ $return = FALSE;
+ switch( $propName ) {
+ case 'ACTION':
+ if( !empty( $this->action )) {
+ $this->action = '';
+ $return = TRUE;
+ }
+ break;
+ case 'ATTACH':
+ return $this->deletePropertyM( $this->attach, $propix );
+ break;
+ case 'ATTENDEE':
+ return $this->deletePropertyM( $this->attendee, $propix );
+ break;
+ case 'CATEGORIES':
+ return $this->deletePropertyM( $this->categories, $propix );
+ break;
+ case 'CLASS':
+ if( !empty( $this->class )) {
+ $this->class = '';
+ $return = TRUE;
+ }
+ break;
+ case 'COMMENT':
+ return $this->deletePropertyM( $this->comment, $propix );
+ break;
+ case 'COMPLETED':
+ if( !empty( $this->completed )) {
+ $this->completed = '';
+ $return = TRUE;
+ }
+ break;
+ case 'CONTACT':
+ return $this->deletePropertyM( $this->contact, $propix );
+ break;
+ case 'CREATED':
+ if( !empty( $this->created )) {
+ $this->created = '';
+ $return = TRUE;
+ }
+ break;
+ case 'DESCRIPTION':
+ return $this->deletePropertyM( $this->description, $propix );
+ break;
+ case 'DTEND':
+ if( !empty( $this->dtend )) {
+ $this->dtend = '';
+ $return = TRUE;
+ }
+ break;
+ case 'DTSTAMP':
+ if( in_array( $this->objName, array( 'valarm', 'vtimezone', 'standard', 'daylight' )))
+ return FALSE;
+ if( !empty( $this->dtstamp )) {
+ $this->dtstamp = '';
+ $return = TRUE;
+ }
+ break;
+ case 'DTSTART':
+ if( !empty( $this->dtstart )) {
+ $this->dtstart = '';
+ $return = TRUE;
+ }
+ break;
+ case 'DUE':
+ if( !empty( $this->due )) {
+ $this->due = '';
+ $return = TRUE;
+ }
+ break;
+ case 'DURATION':
+ if( !empty( $this->duration )) {
+ $this->duration = '';
+ $return = TRUE;
+ }
+ break;
+ case 'EXDATE':
+ return $this->deletePropertyM( $this->exdate, $propix );
+ break;
+ case 'EXRULE':
+ return $this->deletePropertyM( $this->exrule, $propix );
+ break;
+ case 'FREEBUSY':
+ return $this->deletePropertyM( $this->freebusy, $propix );
+ break;
+ case 'GEO':
+ if( !empty( $this->geo )) {
+ $this->geo = '';
+ $return = TRUE;
+ }
+ break;
+ case 'LAST-MODIFIED':
+ if( !empty( $this->lastmodified )) {
+ $this->lastmodified = '';
+ $return = TRUE;
+ }
+ break;
+ case 'LOCATION':
+ if( !empty( $this->location )) {
+ $this->location = '';
+ $return = TRUE;
+ }
+ break;
+ case 'ORGANIZER':
+ if( !empty( $this->organizer )) {
+ $this->organizer = '';
+ $return = TRUE;
+ }
+ break;
+ case 'PERCENT-COMPLETE':
+ if( !empty( $this->percentcomplete )) {
+ $this->percentcomplete = '';
+ $return = TRUE;
+ }
+ break;
+ case 'PRIORITY':
+ if( !empty( $this->priority )) {
+ $this->priority = '';
+ $return = TRUE;
+ }
+ break;
+ case 'RDATE':
+ return $this->deletePropertyM( $this->rdate, $propix );
+ break;
+ case 'RECURRENCE-ID':
+ if( !empty( $this->recurrenceid )) {
+ $this->recurrenceid = '';
+ $return = TRUE;
+ }
+ break;
+ case 'RELATED-TO':
+ return $this->deletePropertyM( $this->relatedto, $propix );
+ break;
+ case 'REPEAT':
+ if( !empty( $this->repeat )) {
+ $this->repeat = '';
+ $return = TRUE;
+ }
+ break;
+ case 'REQUEST-STATUS':
+ return $this->deletePropertyM( $this->requeststatus, $propix );
+ break;
+ case 'RESOURCES':
+ return $this->deletePropertyM( $this->resources, $propix );
+ break;
+ case 'RRULE':
+ return $this->deletePropertyM( $this->rrule, $propix );
+ break;
+ case 'SEQUENCE':
+ if( !empty( $this->sequence )) {
+ $this->sequence = '';
+ $return = TRUE;
+ }
+ break;
+ case 'STATUS':
+ if( !empty( $this->status )) {
+ $this->status = '';
+ $return = TRUE;
+ }
+ break;
+ case 'SUMMARY':
+ if( !empty( $this->summary )) {
+ $this->summary = '';
+ $return = TRUE;
+ }
+ break;
+ case 'TRANSP':
+ if( !empty( $this->transp )) {
+ $this->transp = '';
+ $return = TRUE;
+ }
+ break;
+ case 'TRIGGER':
+ if( !empty( $this->trigger )) {
+ $this->trigger = '';
+ $return = TRUE;
+ }
+ break;
+ case 'TZID':
+ if( !empty( $this->tzid )) {
+ $this->tzid = '';
+ $return = TRUE;
+ }
+ break;
+ case 'TZNAME':
+ return $this->deletePropertyM( $this->tzname, $propix );
+ break;
+ case 'TZOFFSETFROM':
+ if( !empty( $this->tzoffsetfrom )) {
+ $this->tzoffsetfrom = '';
+ $return = TRUE;
+ }
+ break;
+ case 'TZOFFSETTO':
+ if( !empty( $this->tzoffsetto )) {
+ $this->tzoffsetto = '';
+ $return = TRUE;
+ }
+ break;
+ case 'TZURL':
+ if( !empty( $this->tzurl )) {
+ $this->tzurl = '';
+ $return = TRUE;
+ }
+ break;
+ case 'UID':
+ if( in_array( $this->objName, array( 'valarm', 'vtimezone', 'standard', 'daylight' )))
+ return FALSE;
+ if( !empty( $this->uid )) {
+ $this->uid = '';
+ $return = TRUE;
+ }
+ break;
+ case 'URL':
+ if( !empty( $this->url )) {
+ $this->url = '';
+ $return = TRUE;
+ }
+ break;
+ default:
+ $reduced = '';
+ if( $propName != 'X-PROP' ) {
+ if( !isset( $this->xprop[$propName] )) return FALSE;
+ foreach( $this->xprop as $k => $a ) {
+ if(( $k != $propName ) && !empty( $a ))
+ $reduced[$k] = $a;
+ }
+ }
+ else {
+ if( count( $this->xprop ) <= $propix ) return FALSE;
+ $xpropno = 0;
+ foreach( $this->xprop as $xpropkey => $xpropvalue ) {
+ if( $propix != $xpropno )
+ $reduced[$xpropkey] = $xpropvalue;
+ $xpropno++;
+ }
+ }
+ $this->xprop = $reduced;
+ return TRUE;
+ }
+ return $return;
+ }
+/*********************************************************************************/
+/**
+ * delete component property value, fixing components with multiple occurencies
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.4.5 - 2008-11-07
+ * @param array $multiprop, reference to a component property
+ * @param int @propix, default 0
+ * @return bool TRUE
+ */
+ function deletePropertyM( & $multiprop, $propix=0 ) {
+ if( !isset( $multiprop[$propix])) return FALSE;
+ unset( $multiprop[$propix] );
+ if( empty( $multiprop )) $multiprop = '';
+ return ( isset( $this->multiprop[$propix] )) ? FALSE : TRUE;
+ }
+/**
+ * get component property value/params
+ *
+ * if property has multiply values, consequtive function calls are needed
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.5.1 - 2008-11-02
+ * @param string $propName, optional
+ * @param int @propix, optional, if specific property is wanted in case of multiply occurences
+ * @param bool $inclParam=FALSE
+ * @param bool $specform=FALSE
+ * @return mixed
+ */
+ function getProperty( $propName=FALSE, $propix=FALSE, $inclParam=FALSE, $specform=FALSE ) {
+ if( $this->_notExistProp( $propName )) return FALSE;
+ $propName = ( $propName ) ? strtoupper( $propName ) : 'X-PROP';
+ if( in_array( $propName, array( 'ATTACH', 'ATTENDEE', 'CATEGORIES', 'COMMENT', 'CONTACT', 'DESCRIPTION', 'EXDATE', 'EXRULE',
+ 'FREEBUSY', 'RDATE', 'RELATED-TO', 'RESOURCES', 'RRULE', 'REQUEST-STATUS', 'TZNAME', 'X-PROP' ))) {
+ if( !$propix )
+ $propix = ( isset( $this->propix[$propName] )) ? $this->propix[$propName] + 2 : 1;
+ $this->propix[$propName] = --$propix;
+ }
+ switch( $propName ) {
+ case 'ACTION':
+ if( !empty( $this->action['value'] )) return ( $inclParam ) ? $this->action : $this->action['value'];
+ break;
+ case 'ATTACH':
+ if( !isset( $this->attach[$propix] )) return FALSE;
+ return ( $inclParam ) ? $this->attach[$propix] : $this->attach[$propix]['value'];
+ break;
+ case 'ATTENDEE':
+ if( !isset( $this->attendee[$propix] )) return FALSE;
+ return ( $inclParam ) ? $this->attendee[$propix] : $this->attendee[$propix]['value'];
+ break;
+ case 'CATEGORIES':
+ if( !isset( $this->categories[$propix] )) return FALSE;
+ return ( $inclParam ) ? $this->categories[$propix] : $this->categories[$propix]['value'];
+ break;
+ case 'CLASS':
+ if( !empty( $this->class['value'] )) return ( $inclParam ) ? $this->class : $this->class['value'];
+ break;
+ case 'COMMENT':
+ if( !isset( $this->comment[$propix] )) return FALSE;
+ return ( $inclParam ) ? $this->comment[$propix] : $this->comment[$propix]['value'];
+ break;
+ case 'COMPLETED':
+ if( !empty( $this->completed['value'] )) return ( $inclParam ) ? $this->completed : $this->completed['value'];
+ break;
+ case 'CONTACT':
+ if( !isset( $this->contact[$propix] )) return FALSE;
+ return ( $inclParam ) ? $this->contact[$propix] : $this->contact[$propix]['value'];
+ break;
+ case 'CREATED':
+ if( !empty( $this->created['value'] )) return ( $inclParam ) ? $this->created : $this->created['value'];
+ break;
+ case 'DESCRIPTION':
+ if( !isset( $this->description[$propix] )) return FALSE;
+ return ( $inclParam ) ? $this->description[$propix] : $this->description[$propix]['value'];
+ break;
+ case 'DTEND':
+ if( !empty( $this->dtend['value'] )) return ( $inclParam ) ? $this->dtend : $this->dtend['value'];
+ break;
+ case 'DTSTAMP':
+ if( in_array( $this->objName, array( 'valarm', 'vtimezone', 'standard', 'daylight' )))
+ return;
+ if( !isset( $this->dtstamp['value'] ))
+ $this->_makeDtstamp();
+ return ( $inclParam ) ? $this->dtstamp : $this->dtstamp['value'];
+ break;
+ case 'DTSTART':
+ if( !empty( $this->dtstart['value'] )) return ( $inclParam ) ? $this->dtstart : $this->dtstart['value'];
+ break;
+ case 'DUE':
+ if( !empty( $this->due['value'] )) return ( $inclParam ) ? $this->due : $this->due['value'];
+ break;
+ case 'DURATION':
+ if( !isset( $this->duration['value'] )) return FALSE;
+ $value = ( $specform ) ? $this->duration2date() : $this->duration['value'];
+ return ( $inclParam ) ? array( 'value' => $value, 'params' => $this->duration['params'] ) : $value;
+ break;
+ case 'EXDATE':
+ if( !isset( $this->exdate[$propix] )) return FALSE;
+ return ( $inclParam ) ? $this->exdate[$propix] : $this->exdate[$propix]['value'];
+ break;
+ case 'EXRULE':
+ if( !isset( $this->exrule[$propix] )) return FALSE;
+ return ( $inclParam ) ? $this->exrule[$propix] : $this->exrule[$propix]['value'];
+ break;
+ case 'FREEBUSY':
+ if( !isset( $this->freebusy[$propix] )) return FALSE;
+ return ( $inclParam ) ? $this->freebusy[$propix] : $this->freebusy[$propix]['value'];
+ break;
+ case 'GEO':
+ if( !empty( $this->geo['value'] )) return ( $inclParam ) ? $this->geo : $this->geo['value'];
+ break;
+ case 'LAST-MODIFIED':
+ if( !empty( $this->lastmodified['value'] )) return ( $inclParam ) ? $this->lastmodified : $this->lastmodified['value'];
+ break;
+ case 'LOCATION':
+ if( !empty( $this->location['value'] )) return ( $inclParam ) ? $this->location : $this->location['value'];
+ break;
+ case 'ORGANIZER':
+ if( !empty( $this->organizer['value'] )) return ( $inclParam ) ? $this->organizer : $this->organizer['value'];
+ break;
+ case 'PERCENT-COMPLETE':
+ if( !empty( $this->percentcomplete['value'] )) return ( $inclParam ) ? $this->percentcomplete : $this->percentcomplete['value'];
+ break;
+ case 'PRIORITY':
+ if( !empty( $this->priority['value'] )) return ( $inclParam ) ? $this->priority : $this->priority['value'];
+ break;
+ case 'RDATE':
+ if( !isset( $this->rdate[$propix] )) return FALSE;
+ return ( $inclParam ) ? $this->rdate[$propix] : $this->rdate[$propix]['value'];
+ break;
+ case 'RECURRENCE-ID':
+ if( !empty( $this->recurrenceid['value'] )) return ( $inclParam ) ? $this->recurrenceid : $this->recurrenceid['value'];
+ break;
+ case 'RELATED-TO':
+ if( !isset( $this->relatedto[$propix] )) return FALSE;
+ return ( $inclParam ) ? $this->relatedto[$propix] : $this->relatedto[$propix]['value'];
+ break;
+ case 'REPEAT':
+ if( !empty( $this->repeat['value'] )) return ( $inclParam ) ? $this->repeat : $this->repeat['value'];
+ break;
+ case 'REQUEST-STATUS':
+ if( !isset( $this->requeststatus[$propix] )) return FALSE;
+ return ( $inclParam ) ? $this->requeststatus[$propix] : $this->requeststatus[$propix]['value'];
+ break;
+ case 'RESOURCES':
+ if( !isset( $this->resources[$propix] )) return FALSE;
+ return ( $inclParam ) ? $this->resources[$propix] : $this->resources[$propix]['value'];
+ break;
+ case 'RRULE':
+ if( !isset( $this->rrule[$propix] )) return FALSE;
+ return ( $inclParam ) ? $this->rrule[$propix] : $this->rrule[$propix]['value'];
+ break;
+ case 'SEQUENCE':
+ if( !empty( $this->sequence['value'] )) return ( $inclParam ) ? $this->sequence : $this->sequence['value'];
+ break;
+ case 'STATUS':
+ if( !empty( $this->status['value'] )) return ( $inclParam ) ? $this->status : $this->status['value'];
+ break;
+ case 'SUMMARY':
+ if( !empty( $this->summary['value'] )) return ( $inclParam ) ? $this->summary : $this->summary['value'];
+ break;
+ case 'TRANSP':
+ if( !empty( $this->transp['value'] )) return ( $inclParam ) ? $this->transp : $this->transp['value'];
+ break;
+ case 'TRIGGER':
+ if( !empty( $this->trigger['value'] )) return ( $inclParam ) ? $this->trigger : $this->trigger['value'];
+ break;
+ case 'TZID':
+ if( !empty( $this->tzid['value'] )) return ( $inclParam ) ? $this->tzid : $this->tzid['value'];
+ break;
+ case 'TZNAME':
+ if( !isset( $this->tzname[$propix] )) return FALSE;
+ return ( $inclParam ) ? $this->tzname[$propix] : $this->tzname[$propix]['value'];
+ break;
+ case 'TZOFFSETFROM':
+ if( !empty( $this->tzoffsetfrom['value'] )) return ( $inclParam ) ? $this->tzoffsetfrom : $this->tzoffsetfrom['value'];
+ break;
+ case 'TZOFFSETTO':
+ if( !empty( $this->tzoffsetto['value'] )) return ( $inclParam ) ? $this->tzoffsetto : $this->tzoffsetto['value'];
+ break;
+ case 'TZURL':
+ if( !empty( $this->tzurl['value'] )) return ( $inclParam ) ? $this->tzurl : $this->tzurl['value'];
+ break;
+ case 'UID':
+ if( in_array( $this->objName, array( 'valarm', 'vtimezone', 'standard', 'daylight' )))
+ return FALSE;
+ if( empty( $this->uid['value'] ))
+ $this->_makeuid();
+ return ( $inclParam ) ? $this->uid : $this->uid['value'];
+ break;
+ case 'URL':
+ if( !empty( $this->url['value'] )) return ( $inclParam ) ? $this->url : $this->url['value'];
+ break;
+ default:
+ if( $propName != 'X-PROP' ) {
+ if( !isset( $this->xprop[$propName] )) return FALSE;
+ return ( $inclParam ) ? array( $propName, $this->xprop[$propName] )
+ : array( $propName, $this->xprop[$propName]['value'] );
+ }
+ else {
+ if( empty( $this->xprop )) return FALSE;
+ $xpropno = 0;
+ foreach( $this->xprop as $xpropkey => $xpropvalue ) {
+ if( $propix == $xpropno )
+ return ( $inclParam ) ? array( $xpropkey, $this->xprop[$xpropkey] )
+ : array( $xpropkey, $this->xprop[$xpropkey]['value'] );
+ else
+ $xpropno++;
+ }
+ return FALSE; // not found ??
+ }
+ }
+ return FALSE;
+ }
+/**
+ * general component property setting
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.5.1 - 2008-11-05
+ * @param mixed $args variable number of function arguments,
+ * first argument is ALWAYS component name,
+ * second ALWAYS component value!
+ * @return void
+ */
+ function setProperty() {
+ $numargs = func_num_args();
+ if( 1 > $numargs ) return FALSE;
+ $arglist = func_get_args();
+ if( $this->_notExistProp( $arglist[0] )) return FALSE;
+ if( !$this->getConfig( 'allowEmpty' ) && ( !isset( $arglist[1] ) || empty( $arglist[1] )))
+ return FALSE;
+ $arglist[0] = strtoupper( $arglist[0] );
+ for( $argix=$numargs; $argix < 12; $argix++ ) {
+ if( !isset( $arglist[$argix] ))
+ $arglist[$argix] = null;
+ }
+ switch( $arglist[0] ) {
+ case 'ACTION':
+ return $this->setAction( $arglist[1], $arglist[2] );
+ case 'ATTACH':
+ return $this->setAttach( $arglist[1], $arglist[2], $arglist[3] );
+ case 'ATTENDEE':
+ return $this->setAttendee( $arglist[1], $arglist[2], $arglist[3] );
+ case 'CATEGORIES':
+ return $this->setCategories( $arglist[1], $arglist[2], $arglist[3] );
+ case 'CLASS':
+ return $this->setClass( $arglist[1], $arglist[2] );
+ case 'COMMENT':
+ return $this->setComment( $arglist[1], $arglist[2], $arglist[3] );
+ case 'COMPLETED':
+ return $this->setCompleted( $arglist[1], $arglist[2], $arglist[3], $arglist[4], $arglist[5], $arglist[6], $arglist[7] );
+ case 'CONTACT':
+ return $this->setContact( $arglist[1], $arglist[2], $arglist[3] );
+ case 'CREATED':
+ return $this->setCreated( $arglist[1], $arglist[2], $arglist[3], $arglist[4], $arglist[5], $arglist[6], $arglist[7] );
+ case 'DESCRIPTION':
+ return $this->setDescription( $arglist[1], $arglist[2], $arglist[3] );
+ case 'DTEND':
+ return $this->setDtend( $arglist[1], $arglist[2], $arglist[3], $arglist[4], $arglist[5], $arglist[6], $arglist[7], $arglist[8] );
+ case 'DTSTAMP':
+ return $this->setDtstamp( $arglist[1], $arglist[2], $arglist[3], $arglist[4], $arglist[5], $arglist[6], $arglist[7] );
+ case 'DTSTART':
+ return $this->setDtstart( $arglist[1], $arglist[2], $arglist[3], $arglist[4], $arglist[5], $arglist[6], $arglist[7], $arglist[8] );
+ case 'DUE':
+ return $this->setDue( $arglist[1], $arglist[2], $arglist[3], $arglist[4], $arglist[5], $arglist[6], $arglist[7], $arglist[8] );
+ case 'DURATION':
+ return $this->setDuration( $arglist[1], $arglist[2], $arglist[3], $arglist[4], $arglist[5], $arglist[6] );
+ case 'EXDATE':
+ return $this->setExdate( $arglist[1], $arglist[2], $arglist[3] );
+ case 'EXRULE':
+ return $this->setExrule( $arglist[1], $arglist[2], $arglist[3] );
+ case 'FREEBUSY':
+ return $this->setFreebusy( $arglist[1], $arglist[2], $arglist[3], $arglist[4] );
+ case 'GEO':
+ return $this->setGeo( $arglist[1], $arglist[2], $arglist[3] );
+ case 'LAST-MODIFIED':
+ return $this->setLastModified( $arglist[1], $arglist[2], $arglist[3], $arglist[4], $arglist[5], $arglist[6], $arglist[7] );
+ case 'LOCATION':
+ return $this->setLocation( $arglist[1], $arglist[2] );
+ case 'ORGANIZER':
+ return $this->setOrganizer( $arglist[1], $arglist[2] );
+ case 'PERCENT-COMPLETE':
+ return $this->setPercentComplete( $arglist[1], $arglist[2] );
+ case 'PRIORITY':
+ return $this->setPriority( $arglist[1], $arglist[2] );
+ case 'RDATE':
+ return $this->setRdate( $arglist[1], $arglist[2], $arglist[3] );
+ case 'RECURRENCE-ID':
+ return $this->setRecurrenceid( $arglist[1], $arglist[2], $arglist[3], $arglist[4], $arglist[5], $arglist[6], $arglist[7], $arglist[8] );
+ case 'RELATED-TO':
+ return $this->setRelatedTo( $arglist[1], $arglist[2], $arglist[3] );
+ case 'REPEAT':
+ return $this->setRepeat( $arglist[1], $arglist[2] );
+ case 'REQUEST-STATUS':
+ return $this->setRequestStatus( $arglist[1], $arglist[2], $arglist[3], $arglist[4], $arglist[5] );
+ case 'RESOURCES':
+ return $this->setResources( $arglist[1], $arglist[2], $arglist[3] );
+ case 'RRULE':
+ return $this->setRrule( $arglist[1], $arglist[2], $arglist[3] );
+ case 'SEQUENCE':
+ return $this->setSequence( $arglist[1], $arglist[2] );
+ case 'STATUS':
+ return $this->setStatus( $arglist[1], $arglist[2] );
+ case 'SUMMARY':
+ return $this->setSummary( $arglist[1], $arglist[2] );
+ case 'TRANSP':
+ return $this->setTransp( $arglist[1], $arglist[2] );
+ case 'TRIGGER':
+ return $this->setTrigger( $arglist[1], $arglist[2], $arglist[3], $arglist[4], $arglist[5], $arglist[6], $arglist[7], $arglist[8], $arglist[9], $arglist[10], $arglist[11] );
+ case 'TZID':
+ return $this->setTzid( $arglist[1], $arglist[2] );
+ case 'TZNAME':
+ return $this->setTzname( $arglist[1], $arglist[2], $arglist[3] );
+ case 'TZOFFSETFROM':
+ return $this->setTzoffsetfrom( $arglist[1], $arglist[2] );
+ case 'TZOFFSETTO':
+ return $this->setTzoffsetto( $arglist[1], $arglist[2] );
+ case 'TZURL':
+ return $this->setTzurl( $arglist[1], $arglist[2] );
+ case 'UID':
+ return $this->setUid( $arglist[1], $arglist[2] );
+ case 'URL':
+ return $this->setUrl( $arglist[1], $arglist[2] );
+ default:
+ return $this->setXprop( $arglist[0], $arglist[1], $arglist[2] );
+ }
+ return FALSE;
+ }
+/*********************************************************************************/
+/**
+ * parse component unparsed data into properties
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.5.2 - 2008-10-23
+ * @param mixed $unparsedtext, optional, strict rfc2445 formatted, single property string or array of property strings
+ * @return bool FALSE if error occurs during parsing
+ *
+ */
+ function parse( $unparsedtext=null ) {
+ if( $unparsedtext ) {
+ $this->unparsed = array();
+ if( is_array( $unparsedtext )) {
+ $comp = & $this;
+ foreach ( $unparsedtext as $line ) {
+ if( 'END:VALARM' == strtoupper( substr( $line, 0, 10 ))) {
+ $this->setComponent( $comp );
+ $comp = & $this;
+ continue;
+ }
+ elseif( 'BEGIN:VALARM' == strtoupper( substr( $line, 0, 12 ))) {
+ $comp = new valarm();
+ continue;
+ }
+ else
+ $comp->unparsed[] = $line;
+ }
+ }
+ else
+ $this->unparsed = array( trim( $unparsedtext ));
+ }
+ elseif( !isset( $this->unparsed ))
+ $this->unparsed = array();
+ /* concatenate property values spread over several lines */
+ $lastix = -1;
+ $propnames = array( 'action', 'attach', 'attendee', 'categories', 'comment', 'completed'
+ , 'contact', 'class', 'created', 'description', 'dtend', 'dtstart'
+ , 'dtstamp', 'due', 'duration', 'exdate', 'exrule', 'freebusy', 'geo'
+ , 'last-modified', 'location', 'organizer', 'percent-complete'
+ , 'priority', 'rdate', 'recurrence-id', 'related-to', 'repeat'
+ , 'request-status', 'resources', 'rrule', 'sequence', 'status'
+ , 'summary', 'transp', 'trigger', 'tzid', 'tzname', 'tzoffsetfrom'
+ , 'tzoffsetto', 'tzurl', 'uid', 'url', 'x-' );
+ $proprows = array();
+ foreach( $this->unparsed as $line ) {
+ $newProp = FALSE;
+ foreach ( $propnames as $propname ) {
+ if( $propname == strtolower( substr( $line, 0, strlen( $propname )))) {
+ $newProp = TRUE;
+ break;
+ }
+ }
+ if( $newProp ) {
+ $newProp = FALSE;
+ $lastix++;
+ $proprows[$lastix] = $line;
+ }
+ else {
+ /* remove line breaks */
+ if(( '\n' == substr( $proprows[$lastix], -2 )) &&
+ ( ' ' == substr( $line, 0, 1 ))) {
+ $proprows[$lastix] = substr( $proprows[$lastix], 0, strlen( $proprows[$lastix] ) - 2 );
+ $line = substr( $line, 1 );
+ }
+ $proprows[$lastix] .= $line;
+ }
+ }
+ /* parse each property 'line' */
+ foreach( $proprows as $line ) {
+ $line = str_replace( "\n ", '', $line );
+ if( '\n' == substr( $line, -2 ))
+ $line = substr( $line, 0, strlen( $line ) - 2 );
+ /* get propname, (problem with x-properties, otherwise in previous loop) */
+ $cix = $propname = null;
+ for( $cix=0; $cix < strlen( $line ); $cix++ ) {
+ if( in_array( $line{$cix}, array( ':', ';' )))
+ break;
+ else {
+ $propname .= $line{$cix};
+ }
+ }
+ if(( 'x-' == substr( $propname, 0, 2 )) || ( 'X-' == substr( $propname, 0, 2 ))) {
+ $propname2 = $propname;
+ $propname = 'X-';
+ }
+ /* rest of the line is opt.params and value */
+ $line = substr( $line, $cix );
+ /* separate attributes from value */
+ $attr = array();
+ $attrix = -1;
+ $strlen = strlen( $line );
+ for( $cix=0; $cix < $strlen; $cix++ ) {
+ if(( ':' == $line{$cix} ) &&
+ ( '://' != substr( $line, $cix, 3 )) &&
+ ( 'mailto:' != strtolower( substr( $line, $cix - 6, 7 )))) {
+ $attrEnd = TRUE;
+ if(( $cix < ( $strlen - 4 )) &&
+ ctype_digit( substr( $line, $cix+1, 4 ))) { // an URI with a (4pos) portnr??
+ for( $c2ix = $cix; 3 < $c2ix; $c2ix-- ) {
+ if( '://' == substr( $line, $c2ix - 2, 3 )) {
+ $attrEnd = FALSE;
+ break; // an URI with a portnr!!
+ }
+ }
+ }
+ if( $attrEnd) {
+ $line = substr( $line, $cix + 1 );
+ break;
+ }
+ }
+ if( ';' == $line{$cix} )
+ $attr[++$attrix] = null;
+ else
+ $attr[$attrix] .= $line{$cix};
+ }
+ /* make attributes in array format */
+ $propattr = array();
+ foreach( $attr as $attribute ) {
+ $attrsplit = explode( '=', $attribute, 2 );
+ if( 1 < count( $attrsplit ))
+ $propattr[$attrsplit[0]] = $attrsplit[1];
+ else
+ $propattr[] = $attribute;
+ }
+ /* call setProperty( $propname.. . */
+ switch( $propname ) {
+ case 'ATTENDEE':
+ foreach( $propattr as $pix => $attr ) {
+ $attr2 = explode( ',', $attr );
+ if( 1 < count( $attr2 ))
+ $propattr[$pix] = $attr2;
+ }
+ $this->setProperty( $propname, $line, $propattr );
+ break;
+ case 'CATEGORIES':
+ case 'RESOURCES':
+ if( FALSE !== strpos( $line, ',' )) {
+ $content = explode( ',', $line );
+ $clen = count( $content );
+ for( $cix = 0; $cix < $clen; $cix++ ) {
+ if( "\\" == substr($content[$cix], -1)) {
+ $content[$cix] .= ','.$content[$cix + 1];
+ unset($content[$cix + 1]);
+ $cix++;
+ }
+ }
+ if( 1 < count( $content )) {
+ $content = array_values( $content );
+ foreach( $content as $cix => $contentPart )
+ $content[$cix] = $this->_strunrep( $contentPart );
+ $this->setProperty( $propname, $content, $propattr );
+ break;
+ }
+ else
+ $line = reset( $content );
+ }
+ case 'X-':
+ $propname = ( isset( $propname2 )) ? $propname2 : $propname;
+ case 'COMMENT':
+ case 'CONTACT':
+ case 'DESCRIPTION':
+ case 'LOCATION':
+ case 'SUMMARY':
+ if( empty( $line ))
+ $propattr = null;
+ $this->setProperty( $propname, $this->_strunrep( $line ), $propattr );
+ unset( $propname2 );
+ break;
+ case 'REQUEST-STATUS':
+ $values = explode( ';', $line, 3 );
+ $values[1] = ( !isset( $values[1] )) ? null : $this->_strunrep( $values[1] );
+ $values[2] = ( !isset( $values[2] )) ? null : $this->_strunrep( $values[2] );
+ $this->setProperty( $propname
+ , $values[0] // statcode
+ , $values[1] // statdesc
+ , $values[2] // extdata
+ , $propattr );
+ break;
+ case 'FREEBUSY':
+ $fbtype = ( isset( $propattr['FBTYPE'] )) ? $propattr['FBTYPE'] : ''; // force setting default, if missing
+ unset( $propattr['FBTYPE'] );
+ $values = explode( ',', $line );
+ foreach( $values as $vix => $value ) {
+ $value2 = explode( '/', $value );
+ if( 1 < count( $value2 ))
+ $values[$vix] = $value2;
+ }
+ $this->setProperty( $propname, $fbtype, $values, $propattr );
+ break;
+ case 'GEO':
+ $value = explode( ';', $line, 2 );
+ if( 2 > count( $value ))
+ $value[1] = null;
+ $this->setProperty( $propname, $value[0], $value[1], $propattr );
+ break;
+ case 'EXDATE':
+ $values = ( !empty( $line )) ? explode( ',', $line ) : null;
+ $this->setProperty( $propname, $values, $propattr );
+ break;
+ case 'RDATE':
+ if( empty( $line )) {
+ $this->setProperty( $propname, $line, $propattr );
+ break;
+ }
+ $values = explode( ',', $line );
+ foreach( $values as $vix => $value ) {
+ $value2 = explode( '/', $value );
+ if( 1 < count( $value2 ))
+ $values[$vix] = $value2;
+ }
+ $this->setProperty( $propname, $values, $propattr );
+ break;
+ case 'EXRULE':
+ case 'RRULE':
+ $values = explode( ';', $line );
+ $recur = array();
+ foreach( $values as $value2 ) {
+ if( empty( $value2 ))
+ continue; // ;-char in ending position ???
+ $value3 = explode( '=', $value2, 2 );
+ $rulelabel = strtoupper( $value3[0] );
+ switch( $rulelabel ) {
+ case 'BYDAY': {
+ $value4 = explode( ',', $value3[1] );
+ if( 1 < count( $value4 )) {
+ foreach( $value4 as $v5ix => $value5 ) {
+ $value6 = array();
+ $dayno = $dayname = null;
+ $value5 = trim( (string) $value5 );
+ if(( ctype_alpha( substr( $value5, -1 ))) &&
+ ( ctype_alpha( substr( $value5, -2, 1 )))) {
+ $dayname = substr( $value5, -2, 2 );
+ if( 2 < strlen( $value5 ))
+ $dayno = substr( $value5, 0, ( strlen( $value5 ) - 2 ));
+ }
+ if( $dayno )
+ $value6[] = $dayno;
+ if( $dayname )
+ $value6['DAY'] = $dayname;
+ $value4[$v5ix] = $value6;
+ }
+ }
+ else {
+ $value4 = array();
+ $dayno = $dayname = null;
+ $value5 = trim( (string) $value3[1] );
+ if(( ctype_alpha( substr( $value5, -1 ))) &&
+ ( ctype_alpha( substr( $value5, -2, 1 )))) {
+ $dayname = substr( $value5, -2, 2 );
+ if( 2 < strlen( $value5 ))
+ $dayno = substr( $value5, 0, ( strlen( $value5 ) - 2 ));
+ }
+ if( $dayno )
+ $value4[] = $dayno;
+ if( $dayname )
+ $value4['DAY'] = $dayname;
+ }
+ $recur[$rulelabel] = $value4;
+ break;
+ }
+ default: {
+ $value4 = explode( ',', $value3[1] );
+ if( 1 < count( $value4 ))
+ $value3[1] = $value4;
+ $recur[$rulelabel] = $value3[1];
+ break;
+ }
+ } // end - switch $rulelabel
+ } // end - foreach( $values.. .
+ $this->setProperty( $propname, $recur, $propattr );
+ break;
+ default:
+ $this->setProperty( $propname, $line, $propattr );
+ break;
+ } // end switch( $propname.. .
+ } // end - foreach( $proprows.. .
+ unset( $this->unparsed, $proprows );
+ if( isset( $this->components ) && is_array( $this->components ) && ( 0 < count( $this->components ))) {
+ for( $six = 0; $six < count( $this->components ); $six++ ) {
+ if( !empty( $this->components[$six]->unparsed ))
+ $this->components[$six]->parse();
+ }
+ }
+ }
+/*********************************************************************************/
+/*********************************************************************************/
+/**
+ * return a copy of this component
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.2.16 - 2007-11-07
+ * @return object
+ */
+ function copy() {
+ $serialized_contents = serialize($this);
+ $copy = unserialize($serialized_contents);
+ unset( $copy->propix );
+ return $copy;
+ }
+/*********************************************************************************/
+/*********************************************************************************/
+/**
+ * delete calendar subcomponent from component container
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.5.1 - 2008-10-15
+ * @param mixed $arg1 ordno / component type / component uid
+ * @param mixed $arg2 optional, ordno if arg1 = component type
+ * @return void
+ */
+ function deleteComponent( $arg1, $arg2=FALSE ) {
+ if( !isset( $this->components )) return FALSE;
+ $argType = $index = null;
+ if ( ctype_digit( (string) $arg1 )) {
+ $argType = 'INDEX';
+ $index = (int) $arg1 - 1;
+ }
+ elseif(( strlen( $arg1 ) <= strlen( 'vfreebusy' )) && ( FALSE === strpos( $arg1, '@' ))) {
+ $argType = strtolower( $arg1 );
+ $index = ( !empty( $arg2 ) && ctype_digit( (string) $arg2 )) ? (( int ) $arg2 - 1 ) : 0;
+ }
+ $cix2dC = 0;
+ foreach ( $this->components as $cix => $component) {
+ if( empty( $component )) continue;
+ unset( $component->propix );
+ if(( 'INDEX' == $argType ) && ( $index == $cix )) {
+ unset( $this->components[$cix] );
+ return TRUE;
+ }
+ elseif( $argType == $component->objName ) {
+ if( $index == $cix2dC ) {
+ unset( $this->components[$cix] );
+ return TRUE;
+ }
+ $cix2dC++;
+ }
+ elseif( !$argType && ($arg1 == $component->getProperty( 'uid' ))) {
+ unset( $this->components[$cix] );
+ return TRUE;
+ }
+ }
+ return FALSE;
+ }
+/**
+ * get calendar component subcomponent from component container
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.5.1 - 2008-10-15
+ * @param mixed $arg1 optional, ordno/component type/ component uid
+ * @param mixed $arg2 optional, ordno if arg1 = component type
+ * @return object
+ */
+ function getComponent ( $arg1=FALSE, $arg2=FALSE ) {
+ if( !isset( $this->components )) return FALSE;
+ $index = $argType = null;
+ if ( !$arg1 ) {
+ $argType = 'INDEX';
+ $index = $this->compix['INDEX'] =
+ ( isset( $this->compix['INDEX'] )) ? $this->compix['INDEX'] + 1 : 1;
+ }
+ elseif ( ctype_digit( (string) $arg1 )) {
+ $argType = 'INDEX';
+ $index = (int) $arg1;
+ unset( $this->compix );
+ }
+ elseif(( strlen( $arg1 ) <= strlen( 'vfreebusy' )) && ( FALSE === strpos( $arg1, '@' ))) {
+ unset( $this->compix['INDEX'] );
+ $argType = strtolower( $arg1 );
+ if( !$arg2 )
+ $index = $this->compix[$argType] =
+ ( isset( $this->compix[$argType] )) ? $this->compix[$argType] + 1 : 1;
+ else
+ $index = (int) $arg2;
+ }
+ $index -= 1;
+ $ckeys = array_keys( $this->components );
+ if( !empty( $index) && ( $index > end( $ckeys )))
+ return FALSE;
+ $cix2gC = 0;
+ foreach( $this->components as $cix => $component ) {
+ if( empty( $component )) continue;
+ unset( $component->propix );
+ if(( 'INDEX' == $argType ) && ( $index == $cix ))
+ return $component->copy();
+ elseif( $argType == $component->objName ) {
+ if( $index == $cix2gC )
+ return $component->copy();
+ $cix2gC++;
+ }
+ elseif( !$argType && ( $arg1 == $component->getProperty( 'uid' ))) {
+ unset( $component->propix );
+ return $component->copy();
+ }
+ }
+ /* not found.. . */
+ unset( $this->compix );
+ return false;
+ }
+/**
+ * add calendar component as subcomponent to container for subcomponents
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 1.x.x - 2007-04-24
+ * @param object $component calendar component
+ * @return void
+ */
+ function addSubComponent ( $component ) {
+ $this->setComponent( $component );
+ }
+/**
+ * add calendar component as subcomponent to container for subcomponents
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.4.13 - 2008-09-24
+ * @param object $component calendar component
+ * @param mixed $arg1 optional, ordno/component type/ component uid
+ * @param mixed $arg2 optional, ordno if arg1 = component type
+ * @return bool
+ */
+ function setComponent( $component, $arg1=FALSE, $arg2=FALSE ) {
+ if( !isset( $this->components )) return FALSE;
+ if( '' >= $component->getConfig( 'language'))
+ $component->setConfig( 'language', $this->getConfig( 'language' ));
+ $component->setConfig( 'allowEmpty', $this->getConfig( 'allowEmpty' ));
+ $component->setConfig( 'nl', $this->getConfig( 'nl' ));
+ $component->setConfig( 'unique_id', $this->getConfig( 'unique_id' ));
+ $component->setConfig( 'format', $this->getConfig( 'format' ));
+ if( !in_array( $component->objName, array( 'valarm', 'vtimezone', 'standard', 'daylight' ))) {
+ unset( $component->propix );
+ /* make sure dtstamp and uid is set */
+ $dummy = $component->getProperty( 'dtstamp' );
+ $dummy = $component->getProperty( 'uid' );
+ }
+ if( !$arg1 ) {
+ $this->components[] = $component->copy();
+ return TRUE;
+ }
+ $argType = $index = null;
+ if ( ctype_digit( (string) $arg1 )) {
+ $argType = 'INDEX';
+ $index = (int) $arg1 - 1;
+ }
+ elseif(( strlen( $arg1 ) <= strlen( 'vfreebusy' )) && ( FALSE === strpos( $arg1, '@' ))) {
+ $argType = strtolower( $arg1 );
+ $index = ( ctype_digit( (string) $arg2 )) ? ((int) $arg2) - 1 : 0;
+ }
+ $cix2sC = 0;
+ foreach ( $this->components as $cix => $component2 ) {
+ if( empty( $component2 )) continue;
+ unset( $component2->propix );
+ if(( 'INDEX' == $argType ) && ( $index == $cix )) {
+ $this->components[$cix] = $component->copy();
+ return TRUE;
+ }
+ elseif( $argType == $component2->objName ) {
+ if( $index == $cix2sC ) {
+ $this->components[$cix] = $component->copy();
+ return TRUE;
+ }
+ $cix2sC++;
+ }
+ elseif( !$argType && ($arg1 == $component2->getProperty( 'uid' ))) {
+ $this->components[$cix] = $component->copy();
+ return TRUE;
+ }
+ }
+ /* not found.. . insert anyway.. .*/
+ $this->components[] = $component->copy();
+ return TRUE;
+ }
+/**
+ * creates formatted output for subcomponents
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.4.10 - 2008-08-06
+ * @return string
+ */
+ function createSubComponent() {
+ $output = null;
+ foreach( $this->components as $component ) {
+ if( empty( $component )) continue;
+ if( '' >= $component->getConfig( 'language'))
+ $component->setConfig( 'language', $this->getConfig( 'language' ));
+ $component->setConfig( 'allowEmpty', $this->getConfig( 'allowEmpty' ));
+ $component->setConfig( 'nl', $this->getConfig( 'nl' ));
+ $component->setConfig( 'unique_id', $this->getConfig( 'unique_id' ));
+ $component->setConfig( 'format', $this->getConfig( 'format' ));
+ $output .= $component->createComponent( $this->xcaldecl );
+ }
+ return $output;
+ }
+/********************************************************************************/
+/**
+ * break lines at pos 75
+ *
+ * Lines of text SHOULD NOT be longer than 75 octets, excluding the line
+ * break. Long content lines SHOULD be split into a multiple line
+ * representations using a line "folding" technique. That is, a long
+ * line can be split between any two characters by inserting a CRLF
+ * immediately followed by a single linear white space character (i.e.,
+ * SPACE, US-ASCII decimal 32 or HTAB, US-ASCII decimal 9). Any sequence
+ * of CRLF followed immediately by a single linear white space character
+ * is ignored (i.e., removed) when processing the content type.
+ *
+ * Edited 2007-08-26 by Anders Litzell, anders at litzell.se to fix bug where
+ * the reserved expression "\n" in the arg $string could be broken up by the
+ * folding of lines, causing ambiguity in the return string.
+ * Fix uses var $breakAtChar=75 and breaks the line at $breakAtChar-1 if need be.
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.2.8 - 2006-09-03
+ * @param string $value
+ * @return string
+ */
+ function _size75( $string ) {
+ $strlen = strlen( $string );
+ $tmp = $string;
+ $string = null;
+ while( $strlen > 75 ) {
+ $breakAtChar = 75;
+ if( substr( $tmp, ( $breakAtChar - 1 ), strlen( '\n' )) == '\n' )
+ $breakAtChar = $breakAtChar - 1;
+ $string .= substr( $tmp, 0, $breakAtChar );
+ $string .= $this->nl;
+ $tmp = ' '.substr( $tmp, $breakAtChar );
+ $strlen = strlen( $tmp );
+ } // while
+ $string .= rtrim( $tmp ); // the rest
+ if( $this->nl != substr( $string, ( 0 - strlen( $this->nl ))))
+ $string .= $this->nl;
+ return $string;
+ }
+/**
+ * special characters management output
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.3.3 - 2007-12-20
+ * @param string $string
+ * @return string
+ */
+ function _strrep( $string ) {
+ switch( $this->format ) {
+ case 'xcal':
+ $string = str_replace( '\n', $this->nl, $string);
+ $string = htmlspecialchars( strip_tags( stripslashes( urldecode ( $string ))));
+ break;
+ default:
+ $pos = 0;
+ while( $pos <= strlen( $string )) {
+ $pos = strpos( $string, "\\", $pos );
+ if( FALSE === $pos )
+ break;
+ if( !in_array( $string{($pos + 1)}, array( 'n', 'N', 'r', ',', ';' ))) {
+ $string = substr( $string, 0, $pos )."\\".substr( $string, ( $pos + 1 ));
+ $pos += 1;
+ }
+ $pos += 1;
+ }
+ if( FALSE !== strpos( $string, '"' ))
+ $string = str_replace('"', "'", $string);
+ if( FALSE !== strpos( $string, ',' ))
+ $string = str_replace(',', '\,', $string);
+ if( FALSE !== strpos( $string, ';' ))
+ $string = str_replace(';', '\;', $string);
+ if( FALSE !== strpos( $string, "\r\n" ))
+ $string = str_replace( "\r\n", '\n', $string);
+ elseif( FALSE !== strpos( $string, "\r" ))
+ $string = str_replace( "\r", '\n', $string);
+ if( FALSE !== strpos( $string, '\N' ))
+ $string = str_replace( '\N', '\n', $string);
+// if( FALSE !== strpos( $string, $this->nl ))
+ $string = str_replace( $this->nl, '\n', $string);
+ break;
+ }
+ return $string;
+ }
+/**
+ * special characters management input (from iCal file)
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.3.3 - 2007-11-23
+ * @param string $string
+ * @return string
+ */
+ function _strunrep( $string ) {
+ $string = str_replace( '\\\\', '\\', $string);
+ $string = str_replace( '\,', ',', $string);
+ $string = str_replace( '\;', ';', $string);
+// $string = str_replace( '\n', $this->nl, $string); // ??
+ return $string;
+ }
+}
+/*********************************************************************************/
+/*********************************************************************************/
+/**
+ * class for calendar component VEVENT
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.5.1 - 2008-10-12
+ */
+class vevent extends calendarComponent {
+ var $attach;
+ var $attendee;
+ var $categories;
+ var $comment;
+ var $contact;
+ var $class;
+ var $created;
+ var $description;
+ var $dtend;
+ var $dtstart;
+ var $duration;
+ var $exdate;
+ var $exrule;
+ var $geo;
+ var $lastmodified;
+ var $location;
+ var $organizer;
+ var $priority;
+ var $rdate;
+ var $recurrenceid;
+ var $relatedto;
+ var $requeststatus;
+ var $resources;
+ var $rrule;
+ var $sequence;
+ var $status;
+ var $summary;
+ var $transp;
+ var $url;
+ var $xprop;
+ // component subcomponents container
+ var $components;
+/**
+ * constructor for calendar component VEVENT object
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.5.1 - 2008-10-31
+ * @return void
+ */
+ function vevent() {
+ $this->calendarComponent();
+
+ $this->attach = '';
+ $this->attendee = '';
+ $this->categories = '';
+ $this->class = '';
+ $this->comment = '';
+ $this->contact = '';
+ $this->created = '';
+ $this->description = '';
+ $this->dtstart = '';
+ $this->dtend = '';
+ $this->duration = '';
+ $this->exdate = '';
+ $this->exrule = '';
+ $this->geo = '';
+ $this->lastmodified = '';
+ $this->location = '';
+ $this->organizer = '';
+ $this->priority = '';
+ $this->rdate = '';
+ $this->recurrenceid = '';
+ $this->relatedto = '';
+ $this->requeststatus = '';
+ $this->resources = '';
+ $this->rrule = '';
+ $this->sequence = '';
+ $this->status = '';
+ $this->summary = '';
+ $this->transp = '';
+ $this->url = '';
+ $this->xprop = '';
+
+ $this->components = array();
+
+ }
+/**
+ * create formatted output for calendar component VEVENT object instance
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.5.1 - 2008-11-07
+ * @param array $xcaldecl
+ * @return string
+ */
+ function createComponent( &$xcaldecl ) {
+ $objectname = $this->_createFormat();
+ $component = $this->componentStart1.$objectname.$this->componentStart2.$this->nl;
+ $component .= $this->createUid();
+ $component .= $this->createDtstamp();
+ $component .= $this->createAttach();
+ $component .= $this->createAttendee();
+ $component .= $this->createCategories();
+ $component .= $this->createComment();
+ $component .= $this->createContact();
+ $component .= $this->createClass();
+ $component .= $this->createCreated();
+ $component .= $this->createDescription();
+ $component .= $this->createDtstart();
+ $component .= $this->createDtend();
+ $component .= $this->createDuration();
+ $component .= $this->createExdate();
+ $component .= $this->createExrule();
+ $component .= $this->createGeo();
+ $component .= $this->createLastModified();
+ $component .= $this->createLocation();
+ $component .= $this->createOrganizer();
+ $component .= $this->createPriority();
+ $component .= $this->createRdate();
+ $component .= $this->createRrule();
+ $component .= $this->createRelatedTo();
+ $component .= $this->createRequestStatus();
+ $component .= $this->createRecurrenceid();
+ $component .= $this->createResources();
+ $component .= $this->createSequence();
+ $component .= $this->createStatus();
+ $component .= $this->createSummary();
+ $component .= $this->createTransp();
+ $component .= $this->createUrl();
+ $component .= $this->createXprop();
+ $component .= $this->createSubComponent();
+ $component .= $this->componentEnd1.$objectname.$this->componentEnd2;
+ if( is_array( $this->xcaldecl ) && ( 0 < count( $this->xcaldecl ))) {
+ foreach( $this->xcaldecl as $localxcaldecl )
+ $xcaldecl[] = $localxcaldecl;
+ }
+ return $component;
+ }
+}
+/*********************************************************************************/
+/*********************************************************************************/
+/**
+ * class for calendar component VTODO
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.5.1 - 2008-10-12
+ */
+class vtodo extends calendarComponent {
+ var $attach;
+ var $attendee;
+ var $categories;
+ var $comment;
+ var $completed;
+ var $contact;
+ var $class;
+ var $created;
+ var $description;
+ var $dtstart;
+ var $due;
+ var $duration;
+ var $exdate;
+ var $exrule;
+ var $geo;
+ var $lastmodified;
+ var $location;
+ var $organizer;
+ var $percentcomplete;
+ var $priority;
+ var $rdate;
+ var $recurrenceid;
+ var $relatedto;
+ var $requeststatus;
+ var $resources;
+ var $rrule;
+ var $sequence;
+ var $status;
+ var $summary;
+ var $url;
+ var $xprop;
+ // component subcomponents container
+ var $components;
+/**
+ * constructor for calendar component VTODO object
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.5.1 - 2008-10-31
+ * @return void
+ */
+ function vtodo() {
+ $this->calendarComponent();
+
+ $this->attach = '';
+ $this->attendee = '';
+ $this->categories = '';
+ $this->class = '';
+ $this->comment = '';
+ $this->completed = '';
+ $this->contact = '';
+ $this->created = '';
+ $this->description = '';
+ $this->dtstart = '';
+ $this->due = '';
+ $this->duration = '';
+ $this->exdate = '';
+ $this->exrule = '';
+ $this->geo = '';
+ $this->lastmodified = '';
+ $this->location = '';
+ $this->organizer = '';
+ $this->percentcomplete = '';
+ $this->priority = '';
+ $this->rdate = '';
+ $this->recurrenceid = '';
+ $this->relatedto = '';
+ $this->requeststatus = '';
+ $this->resources = '';
+ $this->rrule = '';
+ $this->sequence = '';
+ $this->status = '';
+ $this->summary = '';
+ $this->url = '';
+ $this->xprop = '';
+
+ $this->components = array();
+ }
+/**
+ * create formatted output for calendar component VTODO object instance
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.5.1 - 2008-11-07
+ * @param array $xcaldecl
+ * @return string
+ */
+ function createComponent( &$xcaldecl ) {
+ $objectname = $this->_createFormat();
+ $component = $this->componentStart1.$objectname.$this->componentStart2.$this->nl;
+ $component .= $this->createUid();
+ $component .= $this->createDtstamp();
+ $component .= $this->createAttach();
+ $component .= $this->createAttendee();
+ $component .= $this->createCategories();
+ $component .= $this->createClass();
+ $component .= $this->createComment();
+ $component .= $this->createCompleted();
+ $component .= $this->createContact();
+ $component .= $this->createCreated();
+ $component .= $this->createDescription();
+ $component .= $this->createDtstart();
+ $component .= $this->createDue();
+ $component .= $this->createDuration();
+ $component .= $this->createExdate();
+ $component .= $this->createExrule();
+ $component .= $this->createGeo();
+ $component .= $this->createLastModified();
+ $component .= $this->createLocation();
+ $component .= $this->createOrganizer();
+ $component .= $this->createPercentComplete();
+ $component .= $this->createPriority();
+ $component .= $this->createRdate();
+ $component .= $this->createRelatedTo();
+ $component .= $this->createRequestStatus();
+ $component .= $this->createRecurrenceid();
+ $component .= $this->createResources();
+ $component .= $this->createRrule();
+ $component .= $this->createSequence();
+ $component .= $this->createStatus();
+ $component .= $this->createSummary();
+ $component .= $this->createUrl();
+ $component .= $this->createXprop();
+ $component .= $this->createSubComponent();
+ $component .= $this->componentEnd1.$objectname.$this->componentEnd2;
+ if( is_array( $this->xcaldecl ) && ( 0 < count( $this->xcaldecl ))) {
+ foreach( $this->xcaldecl as $localxcaldecl )
+ $xcaldecl[] = $localxcaldecl;
+ }
+ return $component;
+ }
+}
+/*********************************************************************************/
+/*********************************************************************************/
+/**
+ * class for calendar component VJOURNAL
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.5.1 - 2008-10-12
+ */
+class vjournal extends calendarComponent {
+ var $attach;
+ var $attendee;
+ var $categories;
+ var $comment;
+ var $contact;
+ var $class;
+ var $created;
+ var $description;
+ var $dtstart;
+ var $exdate;
+ var $exrule;
+ var $lastmodified;
+ var $organizer;
+ var $rdate;
+ var $recurrenceid;
+ var $relatedto;
+ var $requeststatus;
+ var $rrule;
+ var $sequence;
+ var $status;
+ var $summary;
+ var $url;
+ var $xprop;
+/**
+ * constructor for calendar component VJOURNAL object
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.5.1 - 2008-10-31
+ * @return void
+ */
+ function vjournal() {
+ $this->calendarComponent();
+
+ $this->attach = '';
+ $this->attendee = '';
+ $this->categories = '';
+ $this->class = '';
+ $this->comment = '';
+ $this->contact = '';
+ $this->created = '';
+ $this->description = '';
+ $this->dtstart = '';
+ $this->exdate = '';
+ $this->exrule = '';
+ $this->lastmodified = '';
+ $this->organizer = '';
+ $this->rdate = '';
+ $this->recurrenceid = '';
+ $this->relatedto = '';
+ $this->requeststatus = '';
+ $this->rrule = '';
+ $this->sequence = '';
+ $this->status = '';
+ $this->summary = '';
+ $this->url = '';
+ $this->xprop = '';
+ }
+/**
+ * create formatted output for calendar component VJOURNAL object instance
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.5.1 - 2008-10-12
+ * @param array $xcaldecl
+ * @return string
+ */
+ function createComponent( &$xcaldecl ) {
+ $objectname = $this->_createFormat();
+ $component = $this->componentStart1.$objectname.$this->componentStart2.$this->nl;
+ $component .= $this->createUid();
+ $component .= $this->createDtstamp();
+ $component .= $this->createAttach();
+ $component .= $this->createAttendee();
+ $component .= $this->createCategories();
+ $component .= $this->createClass();
+ $component .= $this->createComment();
+ $component .= $this->createContact();
+ $component .= $this->createCreated();
+ $component .= $this->createDescription();
+ $component .= $this->createDtstart();
+ $component .= $this->createExdate();
+ $component .= $this->createExrule();
+ $component .= $this->createLastModified();
+ $component .= $this->createOrganizer();
+ $component .= $this->createRdate();
+ $component .= $this->createRequestStatus();
+ $component .= $this->createRecurrenceid();
+ $component .= $this->createRelatedTo();
+ $component .= $this->createRrule();
+ $component .= $this->createSequence();
+ $component .= $this->createStatus();
+ $component .= $this->createSummary();
+ $component .= $this->createUrl();
+ $component .= $this->createXprop();
+ $component .= $this->componentEnd1.$objectname.$this->componentEnd2;
+ if( is_array( $this->xcaldecl ) && ( 0 < count( $this->xcaldecl ))) {
+ foreach( $this->xcaldecl as $localxcaldecl )
+ $xcaldecl[] = $localxcaldecl;
+ }
+ return $component;
+ }
+}
+/*********************************************************************************/
+/*********************************************************************************/
+/**
+ * class for calendar component VFREEBUSY
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.5.1 - 2008-10-12
+ */
+class vfreebusy extends calendarComponent {
+ var $attendee;
+ var $comment;
+ var $contact;
+ var $dtend;
+ var $dtstart;
+ var $duration;
+ var $freebusy;
+ var $organizer;
+ var $requeststatus;
+ var $url;
+ var $xprop;
+ // component subcomponents container
+ var $components;
+/**
+ * constructor for calendar component VFREEBUSY object
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.5.1 - 2008-10-31
+ * @return void
+ */
+ function vfreebusy() {
+ $this->calendarComponent();
+
+ $this->attendee = '';
+ $this->comment = '';
+ $this->contact = '';
+ $this->dtend = '';
+ $this->dtstart = '';
+ $this->duration = '';
+ $this->freebusy = '';
+ $this->organizer = '';
+ $this->requeststatus = '';
+ $this->url = '';
+ $this->xprop = '';
+ }
+/**
+ * create formatted output for calendar component VFREEBUSY object instance
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.3.1 - 2007-11-19
+ * @param array $xcaldecl
+ * @return string
+ */
+ function createComponent( &$xcaldecl ) {
+ $objectname = $this->_createFormat();
+ $component = $this->componentStart1.$objectname.$this->componentStart2.$this->nl;
+ $component .= $this->createUid();
+ $component .= $this->createDtstamp();
+ $component .= $this->createAttendee();
+ $component .= $this->createComment();
+ $component .= $this->createContact();
+ $component .= $this->createDtstart();
+ $component .= $this->createDtend();
+ $component .= $this->createDuration();
+ $component .= $this->createFreebusy();
+ $component .= $this->createOrganizer();
+ $component .= $this->createRequestStatus();
+ $component .= $this->createUrl();
+ $component .= $this->createXprop();
+ $component .= $this->componentEnd1.$objectname.$this->componentEnd2;
+ if( is_array( $this->xcaldecl ) && ( 0 < count( $this->xcaldecl ))) {
+ foreach( $this->xcaldecl as $localxcaldecl )
+ $xcaldecl[] = $localxcaldecl;
+ }
+ return $component;
+ }
+}
+/*********************************************************************************/
+/*********************************************************************************/
+/**
+ * class for calendar component VALARM
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.5.1 - 2008-10-12
+ */
+class valarm extends calendarComponent {
+ var $action;
+ var $attach;
+ var $attendee;
+ var $description;
+ var $duration;
+ var $repeat;
+ var $summary;
+ var $trigger;
+ var $xprop;
+/**
+ * constructor for calendar component VALARM object
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.5.1 - 2008-10-31
+ * @return void
+ */
+ function valarm() {
+ $this->calendarComponent();
+
+ $this->action = '';
+ $this->attach = '';
+ $this->attendee = '';
+ $this->description = '';
+ $this->duration = '';
+ $this->repeat = '';
+ $this->summary = '';
+ $this->trigger = '';
+ $this->xprop = '';
+ }
+/**
+ * create formatted output for calendar component VALARM object instance
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.5.1 - 2008-10-22
+ * @param array $xcaldecl
+ * @return string
+ */
+ function createComponent( &$xcaldecl ) {
+ $objectname = $this->_createFormat();
+ $component = $this->componentStart1.$objectname.$this->componentStart2.$this->nl;
+ $component .= $this->createAction();
+ $component .= $this->createAttach();
+ $component .= $this->createAttendee();
+ $component .= $this->createDescription();
+ $component .= $this->createDuration();
+ $component .= $this->createRepeat();
+ $component .= $this->createSummary();
+ $component .= $this->createTrigger();
+ $component .= $this->createXprop();
+ $component .= $this->componentEnd1.$objectname.$this->componentEnd2;
+ return $component;
+ }
+}
+/**********************************************************************************
+/*********************************************************************************/
+/**
+ * class for calendar component VTIMEZONE
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.5.1 - 2008-10-12
+ */
+class vtimezone extends calendarComponent {
+ var $timezonetype;
+
+ var $comment;
+ var $dtstart;
+ var $lastmodified;
+ var $rdate;
+ var $rrule;
+ var $tzid;
+ var $tzname;
+ var $tzoffsetfrom;
+ var $tzoffsetto;
+ var $tzurl;
+ var $xprop;
+ // component subcomponents container
+ var $components;
+/**
+ * constructor for calendar component VTIMEZONE object
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.5.1 - 2008-10-31
+ * @param string $timezonetype optional, default FALSE ( STANDARD / DAYLIGHT )
+ * @return void
+ */
+ function vtimezone( $timezonetype=FALSE ) {
+ if( !$timezonetype )
+ $this->timezonetype = 'VTIMEZONE';
+ else
+ $this->timezonetype = strtoupper( $timezonetype );
+ $this->calendarComponent();
+
+ $this->comment = '';
+ $this->dtstart = '';
+ $this->lastmodified = '';
+ $this->rdate = '';
+ $this->rrule = '';
+ $this->tzid = '';
+ $this->tzname = '';
+ $this->tzoffsetfrom = '';
+ $this->tzoffsetto = '';
+ $this->tzurl = '';
+ $this->xprop = '';
+
+ $this->components = array();
+ }
+/**
+ * create formatted output for calendar component VTIMEZONE object instance
+ *
+ * @author Kjell-Inge Gustafsson <ical at kigkonsult.se>
+ * @since 2.5.1 - 2008-10-25
+ * @param array $xcaldecl
+ * @return string
+ */
+ function createComponent( &$xcaldecl ) {
+ $objectname = $this->_createFormat();
+ $component = $this->componentStart1.$objectname.$this->componentStart2.$this->nl;
+ $component .= $this->createTzid();
+ $component .= $this->createLastModified();
+ $component .= $this->createTzurl();
+ $component .= $this->createDtstart();
+ $component .= $this->createTzoffsetfrom();
+ $component .= $this->createTzoffsetto();
+ $component .= $this->createComment();
+ $component .= $this->createRdate();
+ $component .= $this->createRrule();
+ $component .= $this->createTzname();
+ $component .= $this->createXprop();
+ $component .= $this->createSubComponent();
+ $component .= $this->componentEnd1.$objectname.$this->componentEnd2;
+ if( is_array( $this->xcaldecl ) && ( 0 < count( $this->xcaldecl ))) {
+ foreach( $this->xcaldecl as $localxcaldecl )
+ $xcaldecl[] = $localxcaldecl;
+ }
+ return $component;
+ }
+}
+?>
\ No newline at end of file
Copied: trunk/lib/ldap-auth.php (from rev 656, branches/sucs-site/lib/ldap-auth.php)
===================================================================
--- trunk/lib/ldap-auth.php (rev 0)
+++ trunk/lib/ldap-auth.php 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,104 @@
+<?php
+
+/*
+Written by Imran Hussain ~imranh
+
+Used to auth people, will check SUCS then the uni ldap, will only check
+students on the uni ldap.
+
+will return "sucs" if the username/password passed is a sucs member
+will return "uni" if the user/pass passed has a student swan uni account
+will return "nope" if the user/pass passed is inavlid
+
+Example usage:
+
+include_once("ldap-auth.php");
+
+isAuthd = ldapAuth("usaername", "password");
+
+if (isAuthd == "sucs"){
+ //do stuff for sucs auth
+}elseif (isAuthd == "uni"){
+ //do stuff for uni auth
+}else{
+ //do stuff for not authd peeps
+}
+
+*/
+
+// we don't care about warnings, we write our own
+error_reporting(E_ERROR | E_PARSE);
+
+function ldapAuth($username, $password) {
+
+ if ($username != "" && $password != ""){
+
+ // people like to use emails to login so lets detect and strip
+ if(filter_var($username, FILTER_VALIDATE_EMAIL)){
+ //valid email, lets strip
+ // split the email into a string array "@" as a delim
+ $s = explode("@",$username);
+ // remove the last element (domain)
+ array_pop($s);
+ // put the array back togther using "@" as a seperator
+ $username = implode("@",$s);
+ }
+
+ // ldap servers
+ $sucsLDAPServer = 'silver.sucs.swan.ac.uk';
+ $lisLDAPServer = 'ccs-suld1.swan.ac.uk';
+
+ // lis auth stuffs
+ $lisUsernameOu = substr($username, -1);
+ $lisOtherOu = "Moved";
+
+ // how to bind
+ $sucsBindDn = "uid=$username,ou=People,dc=sucs,dc=org";
+ $lisBindDn1 = "cn=$username,ou=$lisUsernameOu,ou=Students,ou=SWANSEA,o=SWANUNI";
+ $lisBindDn2 = "cn=$username,ou=$lisOtherOu,ou=Students,ou=SWANSEA,o=SWANUNI";
+
+ // Main auth
+
+ // Try and connect to silver
+ $ldapconnSUCS = ldap_connect($sucsLDAPServer) or die("Could not connect to SUCS LDAP server.");
+
+ if ($ldapconnSUCS) {
+
+ //echo "Connected to $sucsLDAPServer <br>";
+
+ // try and bind to sucs ldap
+ $ldapbindSUCS = ldap_bind($ldapconnSUCS, $sucsBindDn, $password);
+
+ if ($ldapbindSUCS) {
+ //echo "Auth'd as $username using SUCS LDAP<br>";
+ return "sucs";
+ // turns out they didn't give us valid sucs creds, lets try lis now
+ } else {
+
+ // try and connect to the lis ldap server
+ $ldapconnLIS = ldap_connect($lisLDAPServer) or die("Could not connect to uni LDAP server.");
+ //echo "Connected to $lisLDAPServer <br>";
+
+ // lets try and bind to the uni ldap
+ $ldapbindLIS1 = ldap_bind($ldapconnLIS, $lisBindDn1, $password);
+ if ($ldapbindLIS1) {
+ //echo "Auth'd as $username using uni LDAP using ou=$lisUsernameOu<br>";
+ return "uni";
+ } else {
+ $ldapbindLIS2 = ldap_bind($ldapconnLIS, $lisBindDn2, $password);
+ if ($ldapbindLIS2) {
+ //echo "Auth'd as $username using uni LDAP using ou=moved<br>";
+ return "uni";
+ // shit, couldn't bind to anything
+ } else {
+ //exit("Invalid Username or Password");
+ return "nope";
+ }
+ }
+ }
+ }
+ }else {
+ return "nope";
+ }
+}
+?>
\ No newline at end of file
Copied: trunk/lib/member_functions.php (from rev 656, branches/sucs-site/lib/member_functions.php)
===================================================================
--- trunk/lib/member_functions.php (rev 0)
+++ trunk/lib/member_functions.php 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,110 @@
+<?
+function make_password($length=8)
+{
+ $vowels = "aeiouy";
+ $consonants = "bcdfghjklmnprst";
+ $password = "";
+
+ $cn = strlen($consonants)-1;
+ $vn = strlen($vowels)-1;
+
+ // Start on cons or vowel
+ $alt = mt_rand(0, 1);
+
+ // How many numbers
+ $len = mt_rand($length-3,$length);
+
+ for ($i = 0; $i < $len; $i++)
+ {
+ if ($alt == 1)
+ {
+ $password .= $consonants[ mt_rand(0,$cn) ];
+ $alt = 0;
+ }
+ else
+ {
+ $password .= $vowels[ mt_rand(0,$vn) ];
+ $alt = 1;
+ }
+ }
+ for ($i = 0; $i < $length-$len; $i++)
+ {
+ $password .= mt_rand(0,9);
+ }
+ return $password;
+}
+function findUid($start, $end) {
+ $ds=ldap_connect("localhost");
+ ldap_set_option($ds, LDAP_OPT_PROTOCOL_VERSION, 3);
+ $r=ldap_bind($ds);
+ $sr=ldap_search($ds, "dc=sucs,dc=org", "uid=*",array(uidNumber));
+ $info = ldap_get_entries($ds, $sr);
+ for ($i = 0; $i < $info[count]; $i++) {
+ $uids[$info[$i][uidnumber][0]] = true;
+ }
+ for ($i = $start; $i < $end; $i++) {
+ if(!isset($uids[$i])) {
+ $safeuid = $i;
+ break;
+ }
+ }
+
+ return $safeuid;
+}
+
+function generateLdif($uid, $password, $type, $realname, $username){
+ // explode the realname
+ $nameexplode = explode(' ', trim($realname));
+ // hash the password
+ $ldappassword = "{SHA}" . base64_encode(pack("H*", sha1($password)));
+ // compile ldif
+ $ldif = "dn: uid=".$username.",ou=People,dc=sucs,dc=org\n";
+ $ldif .= "uid: ".$username."\n";
+ $ldif .= "cn: ".$realname."\n";
+ // if only has 1 part to real name (and therefore a soc) then set it as sn otherwise set first name to given name and last name to sn
+ if(count($nameexplode)>1){
+ $ldif .= "givenName: ".$nameexplode[0]."\n";
+ $ldif .= "sn: ".$nameexplode[count($nameexplode)-1]."\n";
+ }
+ else{
+ $ldif .= "sn: ".$realname."\n";
+ }
+ $ldif .= "mail: ".$username."@sucs.org\n";
+ $ldif .= "objectClass: person\n";
+ $ldif .= "objectClass: organizationalPerson\n";
+ $ldif .= "objectClass: inetOrgPerson\n";
+ $ldif .= "objectClass: posixAccount\n";
+ $ldif .= "objectClass: top\n";
+ $ldif .= "userPassword: ".$ldappassword. "\n";
+ $ldif .= "loginShell: /bin/bash\n";
+ $ldif .= "uidNumber: ".$uid."\n";
+ // make some society specific changes
+ // More like make sure peoples home dirs get made in the right place
+ if($type==2){
+ $gid=1130;
+ $homebase="society";
+ }
+ elseif($type==5){
+ $gid=100;
+ $homebase="alumni";
+ }
+ elseif($type==3){
+ $gid=100;
+ $homebase="honorary";
+ }
+ elseif($type==4){
+ $gid=100;
+ $homebase="life";
+ }
+ else {
+ $gid=100;
+ $homebase="member";
+ }
+ $ldif .= "gidNumber: ".$gid."\n";
+ $ldif .= "homeDirectory: /home/".$homebase."/".$username."\n";
+ $ldif .= "gecos: ".$realname."\n\n";
+
+ return $ldif;
+}
+
+?>
Modified: trunk/lib/members.php
===================================================================
--- trunk/lib/members.php 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/lib/members.php 2015-04-05 16:42:47 UTC (rev 657)
@@ -10,6 +10,7 @@
{
// Connect and bind to ldap server
$this->conn = ldap_connect(_LDAP_SERVER);
+ ldap_set_option($this->conn, LDAP_OPT_PROTOCOL_VERSION, 3);
$bind = ldap_bind($this->conn);
}
Copied: trunk/lib/page-feedback.php (from rev 656, branches/sucs-site/lib/page-feedback.php)
===================================================================
--- trunk/lib/page-feedback.php (rev 0)
+++ trunk/lib/page-feedback.php 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,28 @@
+<?php
+/* mechanism for members to give us feedback about web pages */
+
+// where do website feedback mails go?
+$contact = "imranh at sucs.org";
+
+if ($session->loggedin) {
+ if ($_REQUEST["action"] == "feedback") {
+ $feedback = $_REQUEST["feedback"];
+
+ $msgbody = "{$session->username} had this to say about the page {$_SERVER['REQUEST_URI']}:\r\n\r\n";
+ $msgbody .= "\"{$feedback}\"\r\n";
+
+ mail($contact, "SUCS Website Feedback", $msgbody);
+ $smarty->assign("feedbacked", TRUE);
+ }
+ $smarty->fetch("feedback.tpl");
+}
+
+
+
+
+
+
+
+
+
+?>
Copied: trunk/lib/pieChart.php (from rev 656, branches/sucs-site/lib/pieChart.php)
===================================================================
--- trunk/lib/pieChart.php (rev 0)
+++ trunk/lib/pieChart.php 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,158 @@
+<?
+
+function piechart($title, $slice, $itemName, $fsizes=0) {
+
+ function matchset($xx)
+ {
+ $arrx = array_values($xx);
+ $i = 0;
+ while (list ($key, $val) = each ($arrx))
+ {
+ $xy[$i] = $val;
+ $i++;
+ }
+ $cnt = $i;
+ return $xy;
+ }
+ $sliced = matchset($slice);
+ $countqw = count($sliced);
+
+ $ItemNames = matchset($itemName);
+
+ // initialize some variables
+ $sum = 0;
+ $degrees = Array();
+ $diameter = 250;
+ $radius = $diameter/2;
+
+ // calculate sum of slices
+ for ($x=0; $x<$countqw ; $x++)
+ {
+ $sum += $sliced[$x];
+ }
+
+ // convert each slice into corresponding percentage of 360-degree circle
+ $degCount = 0;
+ for ($y=0; $y<$countqw; $y++)
+ {
+ if((($sliced[$y]/$sum) * 360) > '0')
+ {
+ $degrees[$degCount] = ($sliced[$y]/$sum) * 360;
+ $degCount++;
+ }
+ }
+
+
+ // set up image and colours
+ Header("Content-Type: image/png");
+ $im = ImageCreate(550, 300);
+
+ $black = ImageColorAllocateAlpha($im, 0, 0, 0, 0);
+ $white = ImageColorAllocateAlpha($im, 255, 255, 255, 127);
+ $hexCode = array("255,153,0","0,204,153","204,255,102","255,102,102","102,204,255","204,153,255","255,0,0","51,0,255","255,51,153","204,0,255","255,255,51","51,255,51","255,102,0");
+ // fill image with white
+ ImageFill($im, 0, 0, $white);
+
+ // draw baseline
+ ImageLine($im, 150,150, 225, 150, $black);
+
+ for ($z=0; $z<$countqw; $z++)
+ {
+ // calculate and draw arc corresponding to each slice
+ ImageArc($im, 150, 150, $diameter, $diameter, $last_angle,
+ ($last_angle+$degrees[$z]), $black);
+ $last_angle = $last_angle+$degrees[$z];
+
+ // calculate coordinate of end-point of each arc by obtaining
+ // length of segment and adding radius
+ // remember that cos() and sin() return value in radians
+ // and have to be converted back to degrees!
+ $end_x = round(150 + ($radius * cos($last_angle*pi()/180)));
+ $end_y = round(150 + ($radius * sin($last_angle*pi()/180)));
+
+ // demarcate slice with another line
+ ImageLine($im, 150, 150, $end_x, $end_y, $black);
+ }
+
+ // this section is meant to calculate the mid-point of each slice
+ // so that it can be filled with colour
+
+ // initialize some variables
+ $prev_angle = 0;
+ $pointer = 0;
+
+ for ($z=0; $z<$countqw; $z++)
+ {
+ // to calculate mid-point of a slice, the procedure is to use an angle
+ //bisector
+ // and then obtain the mid-point of that bisector
+ $pointer = $prev_angle + $degrees[$z];
+ $this_angle = ($prev_angle + $pointer) / 2;
+ $prev_angle = $pointer;
+
+ // get end-point of angle bisector
+ $end_x = round(150 + ($radius * cos($this_angle*pi()/180)));
+ $end_y = round(150 + ($radius * sin($this_angle*pi()/180)));
+
+ // given start point (150,150) and end-point above, mid-point can be
+ // calculated with standard mid-point formula
+ $mid_x = round((150+($end_x))/2);
+ $mid_y = round((150+($end_y))/2);
+
+ // depending on which slice, fill with appropriate colour
+ $hexCodeSplit = explode(',',$hexCode[$z]);
+ $WedgeColor = ImageColorAllocate($im, $hexCodeSplit[0],$hexCodeSplit[1],$hexCodeSplit[2]);
+
+ ImageFillToBorder($im, $mid_x, $mid_y, $black, $WedgeColor);
+ }
+
+ // write string
+ ImageString($im,5, 250, 10, "$title", $black);
+
+ $red = ImageColorAllocate($im, 255, 153, 153);
+ $blue = ImageColorAllocate($im, 0, 0, 255);
+
+ // Create Color key and slice description
+ $adjPosition = 40;
+
+ for ($z=0; $z<$degCount; $z++)
+ {
+ $percent = ($degrees[$z]/360)*100;
+ $percent = round($percent,2);
+ $adjPosition = $adjPosition + 15;
+ $hexCodeSplit = explode(',',$hexCode[$z]);
+ $percentLen = strlen($percent);
+ if($percentLen == '4'){$percent = " "."$percent";}
+ if($percentLen == '3'){$percent = " "."$percent";}
+ if($percentLen == '2'){$percent = " "."$percent";}
+ if($percentLen == '1'){$percent = " "."$percent";}
+ ImageString($im,2, 300, ($adjPosition+1), "$percent%", $black);
+
+ $WedgeColor = ImageColorAllocate($im, $hexCodeSplit[0],$hexCodeSplit[1],$hexCodeSplit[2]);
+
+ ImageFilledRectangle($im, 340, $adjPosition, 350, ($adjPosition+10), $black);
+ ImageFilledRectangle($im, 341, ($adjPosition+1), 349, ($adjPosition+9), $WedgeColor);
+ if($fsizes){
+ if($sliced[$z] >= "1000" && $sliced[$z] < "1000000")
+ {
+ $sliced[$z] = $sliced[$z]/1000;
+ $sliced[$z] = sprintf("%01.2f", "$sliced[$z]")."G";
+ }
+ else
+ $sliced[$z] = "$sliced[$z]"."M";
+ }
+ $sliceLen = strlen($sliced[$z]);
+ if($sliceLen == '5'){$sliced[$z] = " "."$sliced[$z]";}
+ if($sliceLen == '4'){$sliced[$z] = " "."$sliced[$z]";}
+ if($sliceLen == '3'){$sliced[$z] = " "."$sliced[$z]";}
+ if($sliceLen == '2'){$sliced[$z] = " "."$sliced[$z]";}
+ if($sliceLen == '1'){$sliced[$z] = " "."$sliced[$z]";}
+
+ ImageString($im,2, 360, ($adjPosition+1), "$sliced[$z]", $black);
+ ImageString($im,2, 410, ($adjPosition+1), "$ItemNames[$z]", $black);
+ }
+
+ // output to browser
+ ImagePNG($im);
+}
+?>
Copied: trunk/lib/sanitization.php (from rev 656, branches/sucs-site/lib/sanitization.php)
===================================================================
--- trunk/lib/sanitization.php (rev 0)
+++ trunk/lib/sanitization.php 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,8 @@
+<?
+function sanitizePhone($phone){
+ return preg_replace("/[ ()]/", "", $phone);
+}
+function sanitizeAddress($address){
+ return str_replace(array("\r\n","\r"),array("\n","\n"),$address);
+}
+?>
Modified: trunk/lib/session.php
===================================================================
--- trunk/lib/session.php 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/lib/session.php 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,4 +1,4 @@
-<?php
+<?
// To use:
// include_once "session.php"
// $mysession = new Session;
@@ -8,7 +8,7 @@
// other attributes are :
// username - the username they logged in with
// fullname - whatever full name we know for them
-// last - unix timestamp for their previous page access
+// lastseen - unix timestamp for their previous page access
// data - var/array for persistant data, commit by calling the 'save' method
@@ -20,36 +20,61 @@
public $email=0; // Email waiting?
public $email_forward; // Email forwarded?
public $groups =array(); // users groups
+public $printbalance; // printer balance
public $data=''; // Var/array for session persistant data
public $token=''; // session identifier
-public $last=''; // Time of last page request
-protected $table = "session"; // session storage table (const)
-protected $datahash=''; // hash of data field
+public $logintime=''; // Time which user last gave us credentials
+public $lastseen=''; // Time of last page request
+private $timeout = 2880; // Idle timeout limit in minutes (session deleted), 2880 == 48 hours
+private $anonymous_timeout = 120; // Idle timeout limit for sessions which aren't logged in (set lower to stop the session table getting swamped)
+private $secure_timeout = 30; // Idle timeout limit in minutes (consider session less secure, require reauth for sensitive ops)
+private $max_session_length = 11520; // maximum length of a session, 11520 == 8 days
+private $table = "session"; // session storage table (const)
+private $datahash=''; // hash of data field
- // Create a new session id
- protected function newsession()
+
+
+ // Create a new (insecure) session
+ private function newsession()
{
- global $DB;
- $try = 0;
+ global $DB, $preferred_hostname;
- do {
- $tt=date("D M d H:i:s Y");
- $ip = $_SERVER['REMOTE_ADDR'];
- $token = md5("$ip$tt$try");
- $old = $DB->GetAll("select hash from session where hash=?", array($token));
- }while ($old);
- $DB->Execute("insert into session (hash, time, ip) values (?,NOW(),?)", array($token, $ip));
- setcookie("session", $token, NULL, "/");
+ $token = $this->genSessionID();
+ $DB->Execute("insert into {$this->table} (hash, lastseen, ip) values (?,NOW(),?)", array($token, $_SERVER['REMOTE_ADDR']));
+ setcookie("sucssite_session", $token, NULL, "/", $preferred_hostname);
+
+ // delete loggedin cookie if it exists
+ setcookie("sucssite_loggedin", FALSE, time(), "/");
$this->token = $token;
return;
}
+ public function isSecure()
+ {
+ global $DB;
+ // is user coming from the IP address they were when they logged in?
+ if ($detail['ip'] != $_SERVER['REMOTE_ADDR']) {
+ return false;
+ } elseif (time() > ($this->logintime + $this->secure_timeout)) {
+ // has it been too long since we last asked for credentials?
+ return false;
+ }
+
+ }
+
// Public Object constructor
function __construct()
{
- global $DB;
+ global $DB, $preferred_hostname, $baseurl;
unset($token);
+ // if user requests a page via HTTP and claims to be logged in, bump them to HTTPS
+ if (!isset($_SERVER['HTTPS']) && (@$_COOKIE['sucssite_loggedin'] == "true")) {
+ header("HTTP/1.0 307 Temporary redirect");
+ header("Location: https://{$preferred_hostname}{$baseurl}{$_SERVER['PATH_INFO']}");
+ return;
+ }
+
// The possible form elements
$submit = @$_POST['Login'];
$logout = @$_POST['Logout'];
@@ -60,13 +85,12 @@
$this->loggedin = FALSE;
// Time out any old sessions
- $DB->Execute("delete from {$this->table} where time < NOW() - '{SUCS_SESSION_TIMEOUT} minutes'::reltime");
+ $DB->Execute(
+ "delete from {$this->table} where lastseen < NOW() - '{$this->timeout} minutes'::reltime ".
+ "or logintime < NOW() - '{$this->max_session_length} minutes'::reltime ".
+ "or (username IS NULL AND lastseen < NOW() - '{$this->anonymous_timeout} minutes'::reltime)"
+ );
- // Log them out if they ask
- if ($logout=="Logout") {
- $this->logout();
- return;
- }
// the possible token data passed from a form
if (isset($_REQUEST['token']))
@@ -74,11 +98,17 @@
// Check if we were handed a specific token identifier
// Otherwise use the value from the cookie we gave out
- if (!isset($token) && isset($_COOKIE['session']))
- $token=@$_COOKIE['session'];
+ if (!isset($token) && isset($_COOKIE['sucssite_session']))
+ $token=@$_COOKIE['sucssite_session'];
if (isset($token)) $this->token = $token;
+ // Log them out if they ask
+ if ($logout=="Logout") {
+ $this->logout();
+ return;
+ }
+
// Okay, so we still dont have a session id
// so issue a new one and go back to core
if (!isset($token))
@@ -97,7 +127,7 @@
$oldsess=$DB->GetAll("select * from {$this->table} where hash=?", array($this->token));
if (!$oldsess || count($oldsess) < 1) {
- $this->errormsg="Session timed out";
+ trigger_error("Session timed out", E_USER_NOTICE);
$this->newsession();
return;
}
@@ -105,32 +135,57 @@
// Extract detail of session for pass-back
$detail = $oldsess[0];
$this->data = unserialize((string)$detail['data']);
- $this->last = strtotime($detail['time']);
+ $this->lastseen = strtotime($detail['lastseen']);
+ $this->logintime = strtotime($detail['logintime']);
$this->datahash = md5(serialize($this->data));
// are we actually logged in, fill in more
if ($detail['username']) {
// Are we using HTTPS?
- if (SUCS_USE_HTTPS && !isset($_SERVER['HTTPS'])) {
- $this->errormsg = "Insecure Connection";
+ if (!isset($_SERVER['HTTPS'])) {
+ trigger_error("Insecure Connection", E_USER_NOTICE);
$this->loggedin = FALSE;
return;
}
- // User is valid but they're coming from the wrong IP
- if ($detail['ip'] != $_SERVER['REMOTE_ADDR']) {
- $this->errormsg = "Your IP address has changed - you have been logged out";
- $this->logout();
- return;
- }
$this->username=$detail['username'];
$this->fetch_detail($detail['username']);
$this->loggedin = TRUE;
}
// update time stamp
- $DB->Execute( "update {$this->table} set time=NOW() where hash=?", array($this->token));
+ $DB->Execute( "update {$this->table} set lastseen=NOW() where hash=?", array($this->token));
+
+ // check to see if there any messages stored for this user
+ if (isset($this->data['messages'])) {
+ global $messages;
+ if (is_array($messages)) {
+ $messages += $this->data['messages'];
+ } else {
+ $messages = $this->data['messages'];
+ }
+ unset($this->data['messages']);
+ $this->save();
+ }
}
+
+ // generate a string suitable to be used as a session ID
+ private function genSessionID()
+ {
+ global $DB;
+ $try = 0;
+ $tt=date("D M d H:i:s Y");
+ $ip = $_SERVER['REMOTE_ADDR'];
+ $nonce = rand(); // this should stop session IDs being (easily) guessable by someone with the algorithm
+
+ do {
+ $token = md5("$ip$tt$nonce".$try++);
+ $old = $DB->GetAll("select hash from {$this->table} where hash=?", array($token));
+ } while ($old);
+
+ return $token;
+ }
+
// Public function: Store the session data away in the database
public function save( )
{
@@ -149,138 +204,90 @@
public function logout( )
{
global $DB;
- $DB->Execute("delete from session where hash=?", array($this->token));
+ $DB->Execute("delete from {$this->table} where hash=?", array($this->token));
$this->newsession();
$this->loggedin = FALSE;
+ setcookie("sucssite_loggedin", FALSE, time(), "/");
}
- // Private function: process login form
- protected function session_init($user, $pass)
- {
- global $DB;
- // Check that this is a valid session start
- // This prevents replay attacks
- $sess = $DB->GetAll("select * from {$this->table} where hash=? and username is NULL", array($this->token));
- if (!$sess || count($sess)<1) {
- $this->errormsg = "Invalid session, login again.";
- return;
- }
-
- if (!$this->check_pass($user, $pass)) return;
- $this->username = $user;
-
- // Update the session, filling in the blanks
- $DB->Execute("update {$this->table} set username=?, time='NOW()', ip=? where hash=?", array($this->username, $_SERVER['REMOTE_ADDR'], $this->token));
-
- // Return back to normal session retrieval
- }
-
// Fill out any extra details we know about the user
- protected function fetch_detail( $user )
+ private function fetch_detail( $user )
{
- global $DB;
-
- $info = $DB->GetRow("select * from users where username=?", $user);
- if (empty($info))
- {
- $this->errormsg="Username or password Incorrect";
+ if (!($ldap = @ldap_connect("ldap://localhost"))) {
+ trigger_error("LDAP connect failed", E_USER_ERROR);
return FALSE;
}
-
- $this->fullname = $info['realname'];
-
- $groups = $DB->GetCol("select groupname from usergroup where username=?", $user);
-
- foreach ($groups as $groupitem) {
- $grouplist[$groupitem] = $groupitem;
- }
-
- $this->groups = $grouplist;
- }
-
- protected function check_pass($user, $pass)
- {
- global $DB;
-
- $dbpass = $DB->GetOne("select password from users where username=?", $user);
- if (empty($dbpass))
- {
- $this->errormsg="Username or password Incorrect";
- return FALSE;
- }
-
- // Determine the salt of the encrypted password
- if (substr($dbpass, 0, 1) == '$') {
- $i = strpos($dbpass, '$', 3);
- $salt = substr($dbpass, 0, $i+1);
- }else
- $salt = substr($dbpass, 0, 2);
-
- // Check against encrypted password
- if ( !isset($pass) || crypt($pass, $salt) != $dbpass )
- {
- $this->errormsg="Username or password Incorrect";
- unset($info);
- return FALSE;
- }
-
- return TRUE;
- }
-
-} // end of Class
-
-
-class SessionLDAP extends Session {
- // Fill out any extra details we know about the user
- protected function fetch_detail( $user )
- {
- if (!($ldap = @ldap_connect(SUCS_LDAP_SERVER))) {
- $this->errormsg="LDAP connect failed";
- return FALSE;
- }
$info = $this->ldap_getuser($ldap, $user);
if (!$info) return FALSE;
ldap_close($ldap);
// Check the user's email status
- $mailstat = @stat("/var/spool/mail/".$user);
+ /*$mailstat = @stat("/var/spool/mail/".$user);
if ($mailstat[size]>0) {
if ($mailstat[mtime]>$mailstat[atime]) $this->email = 2;
else $this->email = 1;
- }
+ }*/
+ // a sure-fire way to check to see if the user has any unread email
+ // the bash script returns 0 for no and 1 for yes, takes one arg, username
+ $this->email = shell_exec("/home/member/imranh/bin/sucsunreadmail $user");
if (file_exists($info['homedirectory'][0]."/.forward")) {
$forward = file($info['homedirectory'][0]."/.forward");
- $this->email_forward = ereg_replace("\n", "", $forward[0]);
+ $this->email_forward = preg_replace("/\n/", "", $forward[0]);
}
$this->fullname = $info['cn'][0];
$this->groups = $info['grouplist'];
+ $db = new SQLite3('/etc/pykota/pykota.db');
+ $result = $db->query("SELECT balance FROM users WHERE username='$user';");
+ $this->printbalance = $result->fetchArray()[0];
+
}
+ /* check using mod_auth_externals helper
+ private function check_pass($user, $pass)
+ {
+
+ if ($fd === FALSE) {
+ $this->errormsg = "Auth system error";
+ return FALSE;
+ }
+
+ fwrite($fd, "$user\n");
+ fwrite($fd, "$pass\n");
+ $ret = pclose($fd);
+ if ($ret == 0) return TRUE;
+
+ $this->autherror = "u='$user' p='$pass' ret=$ret";
+ $this->errormsg = "Invalid Username or Password";
+ return FALSE;
+ }
+ */
+
// Get a users full record from ldap
private function ldap_getuser($ldap, $user)
{
// publically bind to find user
- if (!($bind=@ldap_bind($ldap, "", ""))) {
- $this->errormsg="LDAP bind failed";
+ ldap_set_option($ldap, LDAP_OPT_PROTOCOL_VERSION, 3);
+ if (!($bind=@ldap_bind($ldap))) {
+ trigger_error("LDAP bind failed", E_USER_ERROR);
return NULL;
}
// find the user
- if (!($search=@ldap_search($ldap, SUCS_LDAP_SEARCH, "(&(uid=$user))"))) {
- $this->errormsg="LDAP search fail";
+ if (!($search=@ldap_search($ldap, "dc=sucs,dc=org", "(&(uid=$user))"))) {
+ trigger_error("LDAP search fail", E_USER_ERROR);
return NULL;
}
$n = ldap_count_entries($ldap, $search);
if ($n < 1) {
- $this->errormsg = "Username or Password Incorrect";
+ trigger_error("Username or Password Incorrect", E_USER_WARNING);
return NULL;
}
$info = ldap_get_entries($ldap, $search);
- if (($grpsearch=@ldap_search($ldap, "ou=Group,".SUCS_LDAP_SEARCH, "memberuid=$user"))) {
+ if (($grpsearch=@ldap_search($ldap, "ou=Group,dc=sucs,dc=org", "memberuid=$user"))) {
$gn = ldap_count_entries($ldap,$grpsearch);
$gpile = ldap_get_entries($ldap, $grpsearch);
$glist=array();
@@ -293,11 +300,11 @@
}
/* check using ldap directly */
- protected function check_pass($user, $pass)
+ public function check_pass($user, $pass)
{
// Open connection
- if (!($ldap = @ldap_connect(SUCS_LDAP_SERVER))) {
- $this->errormsg="LDAP connect failed";
+ if (!($ldap = @ldap_connect("ldap://localhost"))) {
+ trigger_error("LDAP connect failed", E_USER_ERROR);
return FALSE;
}
$info = $this->ldap_getuser($ldap, $user);
@@ -307,9 +314,41 @@
ldap_close($ldap);
if ($real) return TRUE;
- $this->errormsg="Username or Password Incorrect";
+ trigger_error("Username or Password Incorrect", E_USER_WARNING);
return FALSE;
}
-}
-?>
\ No newline at end of file
+
+ // Private function: process login form
+ private function session_init($user, $pass)
+ {
+ global $DB, $preferred_hostname;
+ // Check that this is a valid session start
+ // This prevents replay attacks
+ $sess = $DB->GetAll("select * from {$this->table} where hash=? and username is NULL", array($this->token));
+ if (!$sess || count($sess)<1) {
+ trigger_error("Invalid session, login again.", E_USER_WARNING);
+ return;
+ }
+
+ if (!$this->check_pass($user, $pass)) return;
+ $this->username = $user;
+
+ // the token has likely been used on an insecure connection
+ // so generate a new one with the secure flag set
+ $oldtoken = $this->token;
+ $this->token = $this->genSessionID();
+ setcookie("sucssite_session", $this->token, time() + $this->max_session_length * 60, "/", $preferred_hostname, TRUE);
+
+ // set a cookie as a hint that we're logged in
+ // this can be checked for to allow redirecting to SSL to get the secure cookie
+ setcookie("sucssite_loggedin", "true", time() + $this->max_session_length * 60, "/");
+
+ // Update the session, filling in the blanks
+ $DB->Execute("update {$this->table} set hash=?, username=?, logintime='NOW()', lastseen='NOW()', ip=? where hash=?",
+ array($this->token, $this->username, $_SERVER['REMOTE_ADDR'], $oldtoken));
+
+ // Return back to normal session retrieval
+ }
+
+} // end of Class
Modified: trunk/lib/validation.php
===================================================================
--- trunk/lib/validation.php 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/lib/validation.php 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,4 +1,6 @@
<?
+require_once("validationData.php");
+require_once("sanitization.php");
/* useful validation functions */
//check for a valid email address
@@ -8,7 +10,7 @@
//split user and domain
list($user,$domain) = explode("@", $email);
// check for bad characters, and check for zero length user & domain
- if(!eregi("^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$",$email) or !$user or !$domain )
+ if(!preg_match("/^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$/i",$email) or !$user or !$domain )
{
$error = 'an invalid email address (syntax)';
return false;
@@ -94,5 +96,195 @@
if ($answer == "") return("Empty password");
return $answer;
}
+// check if username is an alias
+function isAlias($username){
+ $ok=false;
+ // check its not an alias
+ $aliasesfile = file ('/etc/aliases');
+ foreach ($aliasesfile as $aliasline)
+ {
+ if(trim($aliasline) && $aliasline[0]!="#")
+ {
+ $anAlias = explode(":", trim($aliasline));
+ if($anAlias[0] && !posix_getpwnam($anAlias[0]) && ($anAlias[0] == $username)){
+ $ok=true;
+ return true;
+ }
+ }
+ }
+ return $ok;
+}
+//check if a user with a sid already exsists
+function sidUsed($sid){
+ $sucsDB = NewADOConnection('postgres8');
+ $sucsDB->Connect('dbname=sucs');
+ $sucsDB->SetFetchMode(ADODB_FETCH_ASSOC);
+ $query = "SELECT * FROM members WHERE sid=?";
+ $data = $sucsDB->GetAll($query,$sid);
+ return (sizeof($data) > 0);
+}
+
+function validUsername ($username){
+ global $error;
+ // check if uname is sytactically valid
+ $syntax = preg_match("/^[a-z][a-z0-9_]*$/", $username);
+ if(!$syntax || (strlen($username) < 2)){
+ $error = "Usernames must start with a letter, only contain lowercase letter, numbers 0-9 and underscores (_) and be at least 2 characters.";
+ return false;
+ }
+ // check if the username already exsists
+ elseif(posix_getpwnam($username))
+ {
+ $error = "Username already taken";
+ return false;
+ }
+ // check if its a mail alias
+ elseif(isAlias($username)){
+ $error ="Username is a mail alias";
+ return false;
+ }
+ else{
+ return true;
+ }
+}
+function validSID($SID,$override){
+ global $error;
+ if($override){
+ if($SID==""){
+ $error = "You MUST provide some sort of student number";
+ return false;
+ }
+ else{
+ return true;
+ }
+ }
+ else{
+ if(!preg_match("/^[0-9]*$/", $SID) || strlen($SID) != 6){
+ $error = "Invalid student ID";
+ return false;
+ }
+ elseif(sidUsed($SID)){
+ $error = "A user with that student ID already exists, email <a href=\"mailto:admin at sucs.org\">admin at sucs.org</a> if this is an error.";
+ return false;
+ }
+ elseif(lookupSID($SID)==" "){
+ $error = "Student not found, email<a href=\"mailto:admin at sucs.org\">admin at sucs.org</a> if this is an error.";
+ return false;
+ }
+ else{
+ return true;
+ }
+ }
+}
+function validRealName($realName,$override){
+ global $error;
+ if($override){
+ if($realName==""){
+ $error="You MUST provide some sort of name";
+ return false;
+ }
+ else{
+ return true;
+ }
+ }
+ else{
+ //check for enough names for real name (we insist on at least 2
+ if(count(explode(" ",$realName)) < 2)
+ {
+ $error = "Too few names given, please give at least two.";
+ return false;
+ }
+ //check for a sane realname, see comment below
+ elseif (!preg_match("/^([A-Z]([.]+ +[A-Z])*([\']+[A-Z])*[a-z]+[ -]*)+$/", $realName))
+ {
+ $error = "Name incorrectly formatted, email <a href=\"mailto:admin at sucs.org\">admin at sucs.org</a> if this is an error.";
+ return false;
+ }
+/*
+ * This should force sane real names, with capitals for the first letter of each word,
+ * Whist alowing for complex names such as Robin M. O'Leary
+ *
+ * break down of regexp
+ *
+ * (
+ * [A-Z] - start with a single capital
+ * ([.]+ +[A-Z])* - zero or more of, (at least one "." followed by at least one space then another single capital) //we dont expect people to have initals at the end of there names so this is alright
+ * ([\']+[A-Z])* - zero or more of, (at least one "'"s followed by a single capital letter)
+ * [a-z]+ - One or more lower case letters, this forces initals to be followed by a "."
+ *[ -]* - zero or more " "s or "-"s so double barreled names are supported
+ * )
+ *
+ * In its current state
+ * Robin M. O'Leary is valid
+ * Robin M O'Leary is not
+ * Robin M. OLeary is Not
+ * Robin M. O'LeaRy is valid (though its not meant to be.. bad side effect of not requireing at least one space...)
+ * BUT... this alows for McSmith's... which is rather nice :)... and of course delibrate
+ * RObin M O'Leary is not
+ *
+ */
+ else{
+ return true;
+ }
+ }
+}
+function validSocName($socname,$override){
+ global $error;
+ if($override){
+ if($socname==""){
+ $error="You MUST provide some sort of name";
+ return false;
+ }
+ else{
+ return true;
+ }
+ }
+ else{
+ if(!preg_match('/^[A-Z1-9]/',$socname) || strlen($socname) < 2){
+ $error = "Must start with a capital letter or a number and be more than 1 character";
+ return false;
+ }
+ else{
+ return true;
+ }
+ }
+}
+
+function validAddress($address){
+ global $error;
+ $address = sanitizeAddress($address);
+ $regex="/^([A-Z0-9]([[:alnum:]]|[ .\/'-])*\n)+[A-Z0-9]([[:alnum:]]|[ .\/'-])*$/";
+ if(!preg_match($regex,$address)){
+ $error = "Please supply at least two valid lines of address.";
+ return false;
+ }
+ else{
+ return true;
+ }
+}
+
+function validPhone($phone){
+ global $error;
+ $phone=sanitizePhone($phone);
+ if(!preg_match("/^\+?[0-9-]+$/",$phone)){
+ $error = "Must be all numbers";
+ return false;
+ }
+ return true;
+}
+function validSignupEmail($email){
+ global $error;
+ if(preg_match('/@sucs\.org$/',$email)){
+ $error = "SUCS email addresses are not allowed";
+ return false;
+ }
+ elseif(!validEmail($email)){
+ return false;
+ }
+ else{
+ return true;
+ }
+
+}
?>
Copied: trunk/lib/validationData.php (from rev 656, branches/sucs-site/lib/validationData.php)
===================================================================
--- trunk/lib/validationData.php (rev 0)
+++ trunk/lib/validationData.php 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,40 @@
+<?
+// lookup real names from sid's useing campus ldap
+function lookupSID($sid) {
+ $ds=ldap_connect("ccs-suld1.swan.ac.uk");
+ $ldappw = file_get_contents("/etc/unildap.secret");
+ $ldappw = trim($ldappw);
+ ldap_bind($ds, "cn=SUCS-BIND,ou=ServiceAccount,o=SWANUNI",$ldappw );
+ $sr=ldap_search($ds, "ou=students,ou=Swansea,o=swanuni", "uid=".$sid);
+ $info = ldap_get_entries($ds, $sr);
+ ldap_unbind($ds);
+ return ucwords(strtolower($info[0]['givenname'][0]." ".$info[0]['sn'][0]));
+}
+
+// lookup addresses from postcodes useing the univeritys website
+function lookup_postcode($postcode = "")
+{
+ $url = "https://intranet.swan.ac.uk/common/postcodeLookup.asp?pCode=".$postcode;
+ $referer = "https://intranet.swan.ac.uk/common/postcodeaddresslookup.asp";
+
+ $req = curl_init($url);
+ curl_setopt($req, CURLOPT_HEADER, false);
+ curl_setopt($req, CURLOPT_REFERER, $referer);
+ curl_setopt($req, CURLOPT_RETURNTRANSFER, true);
+ curl_setopt($req, CURLOPT_SSL_VERIFYPEER, false);
+ curl_setopt($req, CURLOPT_SSLVERSION, 3);
+ $page = curl_exec($req);
+ curl_close($req);
+
+ $scrape = explode("returnAddress(\"", $page);
+
+ $addresses = array();
+ for ($i = 1; $i < count($scrape); $i++) {
+ if (preg_match("/^[^,\"].+?\"/", $scrape[$i], $address)) {
+ $addr = str_replace("<BR>\"", "", $address[0]);
+ array_push($addresses, str_replace("<BR>", ", ", $addr));
+ }
+ }
+ return $addresses;
+}
+?>
Deleted: trunk/lib/venus/.htaccess
===================================================================
--- branches/sucs-site/lib/venus/.htaccess 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/lib/venus/.htaccess 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,22 +0,0 @@
-# Replace index
-
-IndexOptions DescriptionWidth=80
-IndexOptions +SuppressHTMLPreamble
-IndexIgnore header.html footer.html index.atom
-HeaderName /code/venus/header.html
-ReadmeName /code/venus/footer.html
-
-AddDefaultCharset utf-8
-
-# Redirect missing tgz and zip files to tarify.cgi
-
-RewriteEngine on
-
-RewriteCond %{REQUEST_FILENAME} !-s
-RewriteRule (.*)\.tgz$ tarify.cgi?dir=$1
-
-RewriteCond %{REQUEST_FILENAME} !-s
-RewriteRule (.*)\.zip$ tarify.cgi?dir=$1
-
-RewriteCond %{REQUEST_FILENAME} !-s
-RewriteRule (.*).atom$ bzr-feed.cgi?dir=$1
Copied: trunk/lib/venus/.htaccess (from rev 656, branches/sucs-site/lib/venus/.htaccess)
===================================================================
--- trunk/lib/venus/.htaccess (rev 0)
+++ trunk/lib/venus/.htaccess 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,22 @@
+# Replace index
+
+IndexOptions DescriptionWidth=80
+IndexOptions +SuppressHTMLPreamble
+IndexIgnore header.html footer.html index.atom
+HeaderName /code/venus/header.html
+ReadmeName /code/venus/footer.html
+
+AddDefaultCharset utf-8
+
+# Redirect missing tgz and zip files to tarify.cgi
+
+RewriteEngine on
+
+RewriteCond %{REQUEST_FILENAME} !-s
+RewriteRule (.*)\.tgz$ tarify.cgi?dir=$1
+
+RewriteCond %{REQUEST_FILENAME} !-s
+RewriteRule (.*)\.zip$ tarify.cgi?dir=$1
+
+RewriteCond %{REQUEST_FILENAME} !-s
+RewriteRule (.*).atom$ bzr-feed.cgi?dir=$1
Deleted: trunk/lib/venus/AUTHORS
===================================================================
--- branches/sucs-site/lib/venus/AUTHORS 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/lib/venus/AUTHORS 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,7 +0,0 @@
-Sam Ruby <rubys at intertwingly.net>
-
-This codebase represents a radical refactoring of Planet 2.0, which lists
-the following authors:
-
-Scott James Remnant <scott at netsplit.com>
-Jeff Waugh <jdub at perkypants.org>
Copied: trunk/lib/venus/AUTHORS (from rev 656, branches/sucs-site/lib/venus/AUTHORS)
===================================================================
--- trunk/lib/venus/AUTHORS (rev 0)
+++ trunk/lib/venus/AUTHORS 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,7 @@
+Sam Ruby <rubys at intertwingly.net>
+
+This codebase represents a radical refactoring of Planet 2.0, which lists
+the following authors:
+
+Scott James Remnant <scott at netsplit.com>
+Jeff Waugh <jdub at perkypants.org>
Deleted: trunk/lib/venus/LICENCE
===================================================================
--- branches/sucs-site/lib/venus/LICENCE 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/lib/venus/LICENCE 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,84 +0,0 @@
-Planet is released under the same licence as Python, here it is:
-
-
-A. HISTORY OF THE SOFTWARE
-==========================
-
-Python was created in the early 1990s by Guido van Rossum at Stichting Mathematisch Centrum (CWI) in the Netherlands as a successor of a language called ABC. Guido is Python's principal author, although it includes many contributions from others. The last version released from CWI was Python 1.2. In 1995, Guido continued his work on Python at the Corporation for National Research Initiatives (CNRI) in Reston, Virginia where he released several versions of the software. Python 1.6 was the last of the versions released by CNRI. In 2000, Guido and the Python core development team moved to BeOpen.com to form the BeOpen PythonLabs team. Python 2.0 was the first and only release from BeOpen.com.
-
-Following the release of Python 1.6, and after Guido van Rossum left CNRI to work with commercial software developers, it became clear that the ability to use Python with software available under the GNU Public License (GPL) was very desirable. CNRI and the Free Software Foundation (FSF) interacted to develop enabling wording changes to the Python license. Python 1.6.1 is essentially the same as Python 1.6, with a few minor bug fixes, and with a different license that enables later versions to be GPL-compatible. Python 2.1 is a derivative work of Python 1.6.1, as well as of Python 2.0.
-
-After Python 2.0 was released by BeOpen.com, Guido van Rossum and the other PythonLabs developers joined Digital Creations. All intellectual property added from this point on, starting with Python 2.1 and its alpha and beta releases, is owned by the Python Software Foundation (PSF), a non-profit modeled after the Apache Software Foundation. See http://www.python.org/psf/ for more information about the PSF.
-
-Thanks to the many outside volunteers who have worked under Guido's direction to make these releases possible.
-
-B. TERMS AND CONDITIONS FOR ACCESSING OR OTHERWISE USING PYTHON
-===============================================================
-
-PSF LICENSE AGREEMENT
----------------------
-
-1. This LICENSE AGREEMENT is between the Python Software Foundation ("PSF"), and the Individual or Organization ("Licensee") accessing and otherwise using Python 2.1.1 software in source or binary form and its associated documentation.
-
-2. Subject to the terms and conditions of this License Agreement, PSF hereby grants Licensee a nonexclusive, royalty-free, world-wide license to reproduce, analyze, test, perform and/or display publicly, prepare derivative works, distribute, and otherwise use Python 2.1.1 alone or in any derivative version, provided, however, that PSF's License Agreement and PSF's notice of copyright, i.e., "Copyright (c) 2001 Python Software Foundation; All Rights Reserved" are retained in Python 2.1.1 alone or in any derivative version prepared by Licensee.
-
-3. In the event Licensee prepares a derivative work that is based on or incorporates Python 2.1.1 or any part thereof, and wants to make the derivative work available to others as provided herein, then Licensee hereby agrees to include in any such work a brief summary of the changes made to Python 2.1.1.
-
-4. PSF is making Python 2.1.1 available to Licensee on an "AS IS" basis. PSF MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, PSF MAKES NO AND DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON 2.1.1 WILL NOT INFRINGE ANY THIRD PARTY RIGHTS.
-
-5. PSF SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON 2.1.1 FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON 2.1.1, OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.
-
-6. This License Agreement will automatically terminate upon a material breach of its terms and conditions.
-
-7. Nothing in this License Agreement shall be deemed to create any relationship of agency, partnership, or joint venture between PSF and Licensee. This License Agreement does not grant permission to use PSF trademarks or trade name in a trademark sense to endorse or promote products or services of Licensee, or any third party.
-
-8. By copying, installing or otherwise using Python 2.1.1, Licensee agrees to be bound by the terms and conditions of this License Agreement.
-
-BEOPEN.COM TERMS AND CONDITIONS FOR PYTHON 2.0
-----------------------------------------------
-
-BEOPEN PYTHON OPEN SOURCE LICENSE AGREEMENT VERSION 1
-
-1. This LICENSE AGREEMENT is between BeOpen.com ("BeOpen"), having an office at 160 Saratoga Avenue, Santa Clara, CA 95051, and the Individual or Organization ("Licensee") accessing and otherwise using this software in source or binary form and its associated documentation ("the Software").
-
-2. Subject to the terms and conditions of this BeOpen Python License Agreement, BeOpen hereby grants Licensee a non-exclusive, royalty-free, world-wide license to reproduce, analyze, test, perform and/or display publicly, prepare derivative works, distribute, and otherwise use the Software alone or in any derivative version, provided, however, that the BeOpen Python License is retained in the Software, alone or in any derivative version prepared by Licensee.
-
-3. BeOpen is making the Software available to Licensee on an "AS IS" basis. BEOPEN MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, BEOPEN MAKES NO AND DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF THE SOFTWARE WILL NOT INFRINGE ANY THIRD PARTY RIGHTS.
-
-4. BEOPEN SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF THE SOFTWARE FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THE SOFTWARE, OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.
-
-5. This License Agreement will automatically terminate upon a material breach of its terms and conditions.
-
-6. This License Agreement shall be governed by and interpreted in all respects by the law of the State of California, excluding conflict of law provisions. Nothing in this License Agreement shall be deemed to create any relationship of agency, partnership, or joint venture between BeOpen and Licensee. This License Agreement does not grant permission to use BeOpen trademarks or trade names in a trademark sense to endorse or promote products or services of Licensee, or any third party. As an exception, the "BeOpen Python" logos available at http://www.pythonlabs.com/logos.html may be used according to the permissions granted on that web page.
-
-7. By copying, installing or otherwise using the software, Licensee agrees to be bound by the terms and conditions of this License Agreement.
-
-CNRI OPEN SOURCE GPL-COMPATIBLE LICENSE AGREEMENT
--------------------------------------------------
-
-1. This LICENSE AGREEMENT is between the Corporation for National Research Initiatives, having an office at 1895 Preston White Drive, Reston, VA 20191 ("CNRI"), and the Individual or Organization ("Licensee") accessing and otherwise using Python 1.6.1 software in source or binary form and its associated documentation.
-
-2. Subject to the terms and conditions of this License Agreement, CNRI hereby grants Licensee a nonexclusive, royalty-free, world-wide license to reproduce, analyze, test, perform and/or display publicly, prepare derivative works, distribute, and otherwise use Python 1.6.1 alone or in any derivative version, provided, however, that CNRI's License Agreement and CNRI's notice of copyright, i.e., "Copyright (c) 1995-2001 Corporation for National Research Initiatives; All Rights Reserved" are retained in Python 1.6.1 alone or in any derivative version prepared by Licensee. Alternately, in lieu of CNRI's License Agreement, Licensee may substitute the following text (omitting the quotes): "Python 1.6.1 is made available subject to the terms and conditions in CNRI's License Agreement. This Agreement together with Python 1.6.1 may be located on the Internet using the following unique, persistent identifier (known as a handle): 1895.22/1013. This Agreement may also be obtained from a proxy server on the Internet using the following URL: http://hdl.handle.net/1895.22/1013".
-
-3. In the event Licensee prepares a derivative work that is based on or incorporates Python 1.6.1 or any part thereof, and wants to make the derivative work available to others as provided herein, then Licensee hereby agrees to include in any such work a brief summary of the changes made to Python 1.6.1.
-
-4. CNRI is making Python 1.6.1 available to Licensee on an "AS IS" basis. CNRI MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, CNRI MAKES NO AND DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON 1.6.1 WILL NOT INFRINGE ANY THIRD PARTY RIGHTS.
-
-5. CNRI SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON 1.6.1 FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON 1.6.1, OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.
-
-6. This License Agreement will automatically terminate upon a material breach of its terms and conditions.
-
-7. This License Agreement shall be governed by the federal intellectual property law of the United States, including without limitation the federal copyright law, and, to the extent such U.S. federal law does not apply, by the law of the Commonwealth of Virginia, excluding Virginia's conflict of law provisions. Notwithstanding the foregoing, with regard to derivative works based on Python 1.6.1 that incorporate non-separable material that was previously distributed under the GNU General Public License (GPL), the law of the Commonwealth of Virginia shall govern this License Agreement only as to issues arising under or with respect to Paragraphs 4, 5, and 7 of this License Agreement. Nothing in this License Agreement shall be deemed to create any relationship of agency, partnership, or joint venture between CNRI and Licensee. This License Agreement does not grant permission to use CNRI trademarks or trade name in a trademark sense to endorse or promote products or services of Licensee, or any third party.
-
-8. By clicking on the "ACCEPT" button where indicated, or by copying, installing or otherwise using Python 1.6.1, Licensee agrees to be bound by the terms and conditions of this License Agreement.
-
- ACCEPT
-
-CWI PERMISSIONS STATEMENT AND DISCLAIMER
-----------------------------------------
-
-Copyright (c) 1991 - 1995, Stichting Mathematisch Centrum Amsterdam, The Netherlands. All rights reserved.
-
-Permission to use, copy, modify, and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appear in all copies and that both that copyright notice and this permission notice appear in supporting documentation, and that the name of Stichting Mathematisch Centrum or CWI not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission.
-
-STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
\ No newline at end of file
Copied: trunk/lib/venus/LICENCE (from rev 656, branches/sucs-site/lib/venus/LICENCE)
===================================================================
--- trunk/lib/venus/LICENCE (rev 0)
+++ trunk/lib/venus/LICENCE 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,84 @@
+Planet is released under the same licence as Python, here it is:
+
+
+A. HISTORY OF THE SOFTWARE
+==========================
+
+Python was created in the early 1990s by Guido van Rossum at Stichting Mathematisch Centrum (CWI) in the Netherlands as a successor of a language called ABC. Guido is Python's principal author, although it includes many contributions from others. The last version released from CWI was Python 1.2. In 1995, Guido continued his work on Python at the Corporation for National Research Initiatives (CNRI) in Reston, Virginia where he released several versions of the software. Python 1.6 was the last of the versions released by CNRI. In 2000, Guido and the Python core development team moved to BeOpen.com to form the BeOpen PythonLabs team. Python 2.0 was the first and only release from BeOpen.com.
+
+Following the release of Python 1.6, and after Guido van Rossum left CNRI to work with commercial software developers, it became clear that the ability to use Python with software available under the GNU Public License (GPL) was very desirable. CNRI and the Free Software Foundation (FSF) interacted to develop enabling wording changes to the Python license. Python 1.6.1 is essentially the same as Python 1.6, with a few minor bug fixes, and with a different license that enables later versions to be GPL-compatible. Python 2.1 is a derivative work of Python 1.6.1, as well as of Python 2.0.
+
+After Python 2.0 was released by BeOpen.com, Guido van Rossum and the other PythonLabs developers joined Digital Creations. All intellectual property added from this point on, starting with Python 2.1 and its alpha and beta releases, is owned by the Python Software Foundation (PSF), a non-profit modeled after the Apache Software Foundation. See http://www.python.org/psf/ for more information about the PSF.
+
+Thanks to the many outside volunteers who have worked under Guido's direction to make these releases possible.
+
+B. TERMS AND CONDITIONS FOR ACCESSING OR OTHERWISE USING PYTHON
+===============================================================
+
+PSF LICENSE AGREEMENT
+---------------------
+
+1. This LICENSE AGREEMENT is between the Python Software Foundation ("PSF"), and the Individual or Organization ("Licensee") accessing and otherwise using Python 2.1.1 software in source or binary form and its associated documentation.
+
+2. Subject to the terms and conditions of this License Agreement, PSF hereby grants Licensee a nonexclusive, royalty-free, world-wide license to reproduce, analyze, test, perform and/or display publicly, prepare derivative works, distribute, and otherwise use Python 2.1.1 alone or in any derivative version, provided, however, that PSF's License Agreement and PSF's notice of copyright, i.e., "Copyright (c) 2001 Python Software Foundation; All Rights Reserved" are retained in Python 2.1.1 alone or in any derivative version prepared by Licensee.
+
+3. In the event Licensee prepares a derivative work that is based on or incorporates Python 2.1.1 or any part thereof, and wants to make the derivative work available to others as provided herein, then Licensee hereby agrees to include in any such work a brief summary of the changes made to Python 2.1.1.
+
+4. PSF is making Python 2.1.1 available to Licensee on an "AS IS" basis. PSF MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, PSF MAKES NO AND DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON 2.1.1 WILL NOT INFRINGE ANY THIRD PARTY RIGHTS.
+
+5. PSF SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON 2.1.1 FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON 2.1.1, OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.
+
+6. This License Agreement will automatically terminate upon a material breach of its terms and conditions.
+
+7. Nothing in this License Agreement shall be deemed to create any relationship of agency, partnership, or joint venture between PSF and Licensee. This License Agreement does not grant permission to use PSF trademarks or trade name in a trademark sense to endorse or promote products or services of Licensee, or any third party.
+
+8. By copying, installing or otherwise using Python 2.1.1, Licensee agrees to be bound by the terms and conditions of this License Agreement.
+
+BEOPEN.COM TERMS AND CONDITIONS FOR PYTHON 2.0
+----------------------------------------------
+
+BEOPEN PYTHON OPEN SOURCE LICENSE AGREEMENT VERSION 1
+
+1. This LICENSE AGREEMENT is between BeOpen.com ("BeOpen"), having an office at 160 Saratoga Avenue, Santa Clara, CA 95051, and the Individual or Organization ("Licensee") accessing and otherwise using this software in source or binary form and its associated documentation ("the Software").
+
+2. Subject to the terms and conditions of this BeOpen Python License Agreement, BeOpen hereby grants Licensee a non-exclusive, royalty-free, world-wide license to reproduce, analyze, test, perform and/or display publicly, prepare derivative works, distribute, and otherwise use the Software alone or in any derivative version, provided, however, that the BeOpen Python License is retained in the Software, alone or in any derivative version prepared by Licensee.
+
+3. BeOpen is making the Software available to Licensee on an "AS IS" basis. BEOPEN MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, BEOPEN MAKES NO AND DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF THE SOFTWARE WILL NOT INFRINGE ANY THIRD PARTY RIGHTS.
+
+4. BEOPEN SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF THE SOFTWARE FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THE SOFTWARE, OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.
+
+5. This License Agreement will automatically terminate upon a material breach of its terms and conditions.
+
+6. This License Agreement shall be governed by and interpreted in all respects by the law of the State of California, excluding conflict of law provisions. Nothing in this License Agreement shall be deemed to create any relationship of agency, partnership, or joint venture between BeOpen and Licensee. This License Agreement does not grant permission to use BeOpen trademarks or trade names in a trademark sense to endorse or promote products or services of Licensee, or any third party. As an exception, the "BeOpen Python" logos available at http://www.pythonlabs.com/logos.html may be used according to the permissions granted on that web page.
+
+7. By copying, installing or otherwise using the software, Licensee agrees to be bound by the terms and conditions of this License Agreement.
+
+CNRI OPEN SOURCE GPL-COMPATIBLE LICENSE AGREEMENT
+-------------------------------------------------
+
+1. This LICENSE AGREEMENT is between the Corporation for National Research Initiatives, having an office at 1895 Preston White Drive, Reston, VA 20191 ("CNRI"), and the Individual or Organization ("Licensee") accessing and otherwise using Python 1.6.1 software in source or binary form and its associated documentation.
+
+2. Subject to the terms and conditions of this License Agreement, CNRI hereby grants Licensee a nonexclusive, royalty-free, world-wide license to reproduce, analyze, test, perform and/or display publicly, prepare derivative works, distribute, and otherwise use Python 1.6.1 alone or in any derivative version, provided, however, that CNRI's License Agreement and CNRI's notice of copyright, i.e., "Copyright (c) 1995-2001 Corporation for National Research Initiatives; All Rights Reserved" are retained in Python 1.6.1 alone or in any derivative version prepared by Licensee. Alternately, in lieu of CNRI's License Agreement, Licensee may substitute the following text (omitting the quotes): "Python 1.6.1 is made available subject to the terms and conditions in CNRI's License Agreement. This Agreement together with Python 1.6.1 may be located on the Internet using the following unique, persistent identifier (known as a handle): 1895.22/1013. This Agreement may also be obtained from a proxy server on the Internet using the following URL: http://hdl.handle.net/1895.22/1013".
+
+3. In the event Licensee prepares a derivative work that is based on or incorporates Python 1.6.1 or any part thereof, and wants to make the derivative work available to others as provided herein, then Licensee hereby agrees to include in any such work a brief summary of the changes made to Python 1.6.1.
+
+4. CNRI is making Python 1.6.1 available to Licensee on an "AS IS" basis. CNRI MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, CNRI MAKES NO AND DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON 1.6.1 WILL NOT INFRINGE ANY THIRD PARTY RIGHTS.
+
+5. CNRI SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON 1.6.1 FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON 1.6.1, OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.
+
+6. This License Agreement will automatically terminate upon a material breach of its terms and conditions.
+
+7. This License Agreement shall be governed by the federal intellectual property law of the United States, including without limitation the federal copyright law, and, to the extent such U.S. federal law does not apply, by the law of the Commonwealth of Virginia, excluding Virginia's conflict of law provisions. Notwithstanding the foregoing, with regard to derivative works based on Python 1.6.1 that incorporate non-separable material that was previously distributed under the GNU General Public License (GPL), the law of the Commonwealth of Virginia shall govern this License Agreement only as to issues arising under or with respect to Paragraphs 4, 5, and 7 of this License Agreement. Nothing in this License Agreement shall be deemed to create any relationship of agency, partnership, or joint venture between CNRI and Licensee. This License Agreement does not grant permission to use CNRI trademarks or trade name in a trademark sense to endorse or promote products or services of Licensee, or any third party.
+
+8. By clicking on the "ACCEPT" button where indicated, or by copying, installing or otherwise using Python 1.6.1, Licensee agrees to be bound by the terms and conditions of this License Agreement.
+
+ ACCEPT
+
+CWI PERMISSIONS STATEMENT AND DISCLAIMER
+----------------------------------------
+
+Copyright (c) 1991 - 1995, Stichting Mathematisch Centrum Amsterdam, The Netherlands. All rights reserved.
+
+Permission to use, copy, modify, and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appear in all copies and that both that copyright notice and this permission notice appear in supporting documentation, and that the name of Stichting Mathematisch Centrum or CWI not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission.
+
+STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
\ No newline at end of file
Deleted: trunk/lib/venus/README
===================================================================
--- branches/sucs-site/lib/venus/README 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/lib/venus/README 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,20 +0,0 @@
-Planet
-------
-
-Planet is a flexible feed aggregator. It downloads news feeds published by
-web sites and aggregates their content together into a single combined feed,
-latest news first. This version of Planet is named Venus as it is the
-second major version. The first version is still in wide use and is
-also actively being maintained.
-
-It uses Mark Pilgrim's Universal Feed Parser to read from CDF, RDF, RSS and
-Atom feeds; Leonard Richardson's Beautiful Soup to correct markup issues;
-and either Tomas Styblo's templating engine or Daniel Viellard's implementation
-of XSLT to output static files in any format you can dream up.
-
-To get started, check out the documentation in the docs directory. If you have
-any questions or comments, please don't hesitate to use the planet mailing list:
-
- http://lists.planetplanet.org/mailman/listinfo/devel
-
-Keywords: feed, blog, aggregator, RSS, RDF, Atom, OPML, Python
Copied: trunk/lib/venus/README (from rev 656, branches/sucs-site/lib/venus/README)
===================================================================
--- trunk/lib/venus/README (rev 0)
+++ trunk/lib/venus/README 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,20 @@
+Planet
+------
+
+Planet is a flexible feed aggregator. It downloads news feeds published by
+web sites and aggregates their content together into a single combined feed,
+latest news first. This version of Planet is named Venus as it is the
+second major version. The first version is still in wide use and is
+also actively being maintained.
+
+It uses Mark Pilgrim's Universal Feed Parser to read from CDF, RDF, RSS and
+Atom feeds; Leonard Richardson's Beautiful Soup to correct markup issues;
+and either Tomas Styblo's templating engine or Daniel Viellard's implementation
+of XSLT to output static files in any format you can dream up.
+
+To get started, check out the documentation in the docs directory. If you have
+any questions or comments, please don't hesitate to use the planet mailing list:
+
+ http://lists.planetplanet.org/mailman/listinfo/devel
+
+Keywords: feed, blog, aggregator, RSS, RDF, Atom, OPML, Python
Deleted: trunk/lib/venus/THANKS
===================================================================
--- branches/sucs-site/lib/venus/THANKS 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/lib/venus/THANKS 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,41 +0,0 @@
-DeWitt Clinton - Mac OSX
-Mary Gardiner - PythonPath
-Elias Torres - FOAF OnlineAccounts
-Jacques Distler - Template patches
-Michael Koziarski - HTTP Auth fix
-Brian Ewins - Win32 / Portalocker
-Joe Gregorio - python versioning for filters, verbose tests, spider_threads
-Harry Fuecks - Pipe characters in file names, filter bug
-Eric van der Vlist - Filters to add language, category information
-Chris Dolan - mkdir cache; default template_dirs; fix xsltproc
-David Sifry - rss 2.0 xslt template based on http://atom.geekhood.net/
-Morten Frederiksen - Support WordPress LinkManager OPML
-Harry Fuecks - default item date to feed date
-Antonio Cavedoni - Django templates
-Morten Frederiksen - expungeCache
-Lenny Domnitser - Coral CDN support for URLs with non-standard ports
-Amit Chakradeo - Allow read-only files to be overwritten
-Matt Brubeck - fix new_channel
-Aristotle Pagaltzis - ensure byline_author filter doesn't drop foreign markup
-
-This codebase represents a radical refactoring of Planet 2.0, which lists
-the following contributors:
-
-Patches and Bug Fixes
----------------------
-
-Chris Dolan - fixes, exclude filtering, duplicate culling
-David Edmondson - filtering
-Lucas Nussbaum - locale configuration
-David Pashley - cache code profiling and recursion fixing
-Gediminas Paulauskas - days per page
-
-
-Spycyroll Maintainers
----------------------
-
-Vattekkat Satheesh Babu
-Richard Jones
-Garth Kidd
-Eliot Landrum
-Bryan Richard
Copied: trunk/lib/venus/THANKS (from rev 656, branches/sucs-site/lib/venus/THANKS)
===================================================================
--- trunk/lib/venus/THANKS (rev 0)
+++ trunk/lib/venus/THANKS 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,41 @@
+DeWitt Clinton - Mac OSX
+Mary Gardiner - PythonPath
+Elias Torres - FOAF OnlineAccounts
+Jacques Distler - Template patches
+Michael Koziarski - HTTP Auth fix
+Brian Ewins - Win32 / Portalocker
+Joe Gregorio - python versioning for filters, verbose tests, spider_threads
+Harry Fuecks - Pipe characters in file names, filter bug
+Eric van der Vlist - Filters to add language, category information
+Chris Dolan - mkdir cache; default template_dirs; fix xsltproc
+David Sifry - rss 2.0 xslt template based on http://atom.geekhood.net/
+Morten Frederiksen - Support WordPress LinkManager OPML
+Harry Fuecks - default item date to feed date
+Antonio Cavedoni - Django templates
+Morten Frederiksen - expungeCache
+Lenny Domnitser - Coral CDN support for URLs with non-standard ports
+Amit Chakradeo - Allow read-only files to be overwritten
+Matt Brubeck - fix new_channel
+Aristotle Pagaltzis - ensure byline_author filter doesn't drop foreign markup
+
+This codebase represents a radical refactoring of Planet 2.0, which lists
+the following contributors:
+
+Patches and Bug Fixes
+---------------------
+
+Chris Dolan - fixes, exclude filtering, duplicate culling
+David Edmondson - filtering
+Lucas Nussbaum - locale configuration
+David Pashley - cache code profiling and recursion fixing
+Gediminas Paulauskas - days per page
+
+
+Spycyroll Maintainers
+---------------------
+
+Vattekkat Satheesh Babu
+Richard Jones
+Garth Kidd
+Eliot Landrum
+Bryan Richard
Deleted: trunk/lib/venus/TODO
===================================================================
--- branches/sucs-site/lib/venus/TODO 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/lib/venus/TODO 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,7 +0,0 @@
-TODO
-====
-
- * Allow display normalisation to specified timezone
-
- Some Planet admins would like their feed to be displayed in the local
- timezone, instead of UTC.
Copied: trunk/lib/venus/TODO (from rev 656, branches/sucs-site/lib/venus/TODO)
===================================================================
--- trunk/lib/venus/TODO (rev 0)
+++ trunk/lib/venus/TODO 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,7 @@
+TODO
+====
+
+ * Allow display normalisation to specified timezone
+
+ Some Planet admins would like their feed to be displayed in the local
+ timezone, instead of UTC.
Deleted: trunk/lib/venus/docs/config.html
===================================================================
--- branches/sucs-site/lib/venus/docs/config.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/lib/venus/docs/config.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,164 +0,0 @@
-<!DOCTYPE html PUBLIC
- "-//W3C//DTD XHTML 1.1 plus MathML 2.0 plus SVG 1.1//EN"
- "http://www.w3.org/2002/04/xhtml-math-svg/xhtml-math-svg.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<script type="text/javascript" src="docs.js"></script>
-<link rel="stylesheet" type="text/css" href="docs.css"/>
-<title>Venus Configuration</title>
-</head>
-<body>
-
-<h2>Configuration</h2>
-<p>Configuration files are in <a href="http://docs.python.org/lib/module-
-ConfigParser.html">ConfigParser</a> format which basically means the same
-format as INI files, i.e., they consist of a series of
-<code>[sections]</code>, in square brackets, with each section containing a
-list of <code>name:value</code> pairs (or <code>name=value</code> pairs, if
-you prefer).</p>
-<p>You are welcome to place your entire configuration into one file.
-Alternately, you may factor out the templating into a "theme", and
-the list of subscriptions into one or more "reading lists".</p>
-<h3 id="planet"><code>[planet]</code></h3>
-<p>This is the only required section, which is a bit odd as none of the
-parameters listed below are required. Even so, you really do want to
-provide many of these, especially ones that identify your planet and
-either (or both) of <code>template_files</code> and <code>theme</code>.</p>
-<p>Below is a complete list of predefined planet configuration parameters,
-including <del>ones not (yet) implemented by Venus</del> and <ins>ones that
-are either new or implemented differently by Venus</ins>.</p>
-
-<blockquote>
-<dl class="compact code">
-<dt>name</dt>
-<dd>Your planet's name</dd>
-<dt>link</dt>
-<dd>Link to the main page</dd>
-<dt>owner_name</dt>
-<dd>Your name</dd>
-<dt>owner_email</dt>
-<dd>Your e-mail address</dd>
-
-</dl>
-<dl class="compact code">
-
-<dt>cache_directory</dt>
-<dd>Where cached feeds are stored</dd>
-<dt>output_dir</dt>
-<dd>Directory to place output files</dd>
-
-</dl>
-<dl class="compact code">
-
-<dt><ins>output_theme</ins></dt>
-<dd>Directory containing a <code>config.ini</code> file which is merged
-with this one. This is typically used to specify templating and bill of
-material information.</dd>
-<dt>template_files</dt>
-<dd>Space-separated list of output template files</dd>
-<dt><ins>template_directories</ins></dt>
-<dd>Space-separated list of directories in which <code>template_files</code>
-can be found</dd>
-<dt><ins>bill_of_materials</ins></dt>
-<dd>Space-separated list of files to be copied as is directly from the <code>template_directories</code> to the <code>output_dir</code></dd>
-<dt>filter</dt>
-<dd>Regular expression that must be found in the textual portion of the entry</dd>
-<dt>exclude</dt>
-<dd>Regular expression that must <b>not</b> be found in the textual portion of the entry</dd>
-<dt><ins>filters</ins></dt>
-<dd>Space-separated list of <a href="filters.html">filters</a> to apply to
-each entry</dd>
-<dt><ins>filter_directories</ins></dt>
-<dd>Space-separated list of directories in which <code>filters</code>
-can be found</dd>
-
-</dl>
-<dl class="compact code">
-
-<dt>items_per_page</dt>
-<dd>How many items to put on each page. <ins>Whereas Planet 2.0 allows this to
-be overridden on a per template basis, Venus currently takes the maximum value
-for this across all templates.</ins></dd>
-<dt><del>days_per_page</del></dt>
-<dd>How many complete days of posts to put on each page This is the absolute, hard limit (over the item limit)</dd>
-<dt>date_format</dt>
-<dd><a href="http://docs.python.org/lib/module-time.html#l2h-2816">strftime</a> format for the default 'date' template variable</dd>
-<dt>new_date_format</dt>
-<dd><a href="http://docs.python.org/lib/module-time.html#l2h-2816">strftime</a> format for the 'new_date' template variable <ins>only applies to htmltmpl templates</ins></dd>
-<dt><del>encoding</del></dt>
-<dd>Output encoding for the file, Python 2.3+ users can use the special "xml" value to output ASCII with XML character references</dd>
-<dt><del>locale</del></dt>
-<dd>Locale to use for (e.g.) strings in dates, default is taken from your system</dd>
-<dt>activity_threshold</dt>
-<dd>If non-zero, all feeds which have not been updated in the indicated
-number of days will be marked as inactive</dd>
-
-</dl>
-<dl class="compact code">
-
-<dt>log_level</dt>
-<dd>One of <code>DEBUG</code>, <code>INFO</code>, <code>WARNING</code>, <code>ERROR</code> or <code>CRITICAL</code></dd>
-<dt><ins>log_format</ins></dt>
-<dd><a href="http://docs.python.org/lib/node422.html">format string</a> to
-use for logging output. Note: this configuration value is processed
-<a href="http://docs.python.org/lib/ConfigParser-objects.html">raw</a></dd>
-<dt>feed_timeout</dt>
-<dd>Number of seconds to wait for any given feed</dd>
-<dt>new_feed_items</dt>
-<dd>Maximum number of items to include in the output from any one feed</dd>
-<dt><ins>spider_threads</ins></dt>
-<dd>The number of threads to use when spidering. When set to 0, the default,
-no threads are used and spidering follows the traditional algorithm.</dd>
-<dt><ins>http_cache_directory</ins></dt>
-<dd>If <code>spider_threads</code> is specified, you can also specify a
-directory to be used for an additional HTTP cache to front end the Venus
-cache. If specified as a relative path, it is evaluated relative to the
-<code>cache_directory</code>.</dd>
-<dt><ins>cache_keep_entries</ins></dt>
-<dd>Used by <code>expunge</code> to determine how many entries should be
-kept for each source when expunging old entries from the cache directory.
-This may be overriden on a per subscription feed basis.</dd>
-</dl>
-<p>Additional options can be found in
-<a href="normalization.html#overrides">normalization level overrides</a>.</p>
-</blockquote>
-
-<h3 id="default"><code>[DEFAULT]</code></h3>
-<p>Values placed in this section are used as default values for all sections.
-While it is true that few values make sense in all sections; in most cases
-unused parameters cause few problems.</p>
-
-<h3 id="subscription"><code>[</code><em>subscription</em><code>]</code></h3>
-<p>All sections other than <code>planet</code>, <code>DEFAULT</code>, or are
-named in <code>[planet]</code>'s <code>filters</code> or
-<code>templatefiles</code> parameters
-are treated as subscriptions and typically take the form of a
-<acronym title="Uniform Resource Identifier">URI</acronym>.</p>
-<p>Parameters placed in this section are passed to templates. While
-you are free to include as few or as many parameters as you like, most of
-the predefined themes presume that at least <code>name</code> is defined.</p>
-<p>The <code>content_type</code> parameter can be defined to indicate that
-this subscription is a <em>reading list</em>, i.e., is an external list
-of subscriptions. At the moment, three formats of reading lists are supported:
-<code>opml</code>, <code>foaf</code>, <code>csv</code>, and
-<code>config</code>. In the future,
-support for formats like <code>xoxo</code> could be added.</p>
-<p><a href="normalization.html#overrides">Normalization overrides</a> can
-also be defined here.</p>
-
-<h3 id="template"><code>[</code><em>template</em><code>]</code></h3>
-<p>Sections which are listed in <code>[planet] template_files</code> are
-processed as <a href="templates.html">templates</a>. With Planet 2.0,
-it is possible to override parameters like <code>items_per_page</code>
-on a per template basis, but at the current time Planet Venus doesn't
-implement this.</p>
-<p><ins><a href="filters.html">Filters</a> can be defined on a per-template basis, and will be used to post-process the output of the template.</ins></p>
-
-<h3 id="filter"><code>[</code><em>filter</em><code>]</code></h3>
-<p>Sections which are listed in <code>[planet] filters</code> are
-processed as <a href="filters.html">filters</a>.</p>
-<p>Parameters which are listed in this section are passed to the filter
-in a language specific manner. Given the way defaults work, filters
-should be prepared to ignore parameters that they didn't expect.</p>
-</body>
-</html>
Copied: trunk/lib/venus/docs/config.html (from rev 656, branches/sucs-site/lib/venus/docs/config.html)
===================================================================
--- trunk/lib/venus/docs/config.html (rev 0)
+++ trunk/lib/venus/docs/config.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,164 @@
+<!DOCTYPE html PUBLIC
+ "-//W3C//DTD XHTML 1.1 plus MathML 2.0 plus SVG 1.1//EN"
+ "http://www.w3.org/2002/04/xhtml-math-svg/xhtml-math-svg.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<script type="text/javascript" src="docs.js"></script>
+<link rel="stylesheet" type="text/css" href="docs.css"/>
+<title>Venus Configuration</title>
+</head>
+<body>
+
+<h2>Configuration</h2>
+<p>Configuration files are in <a href="http://docs.python.org/lib/module-
+ConfigParser.html">ConfigParser</a> format which basically means the same
+format as INI files, i.e., they consist of a series of
+<code>[sections]</code>, in square brackets, with each section containing a
+list of <code>name:value</code> pairs (or <code>name=value</code> pairs, if
+you prefer).</p>
+<p>You are welcome to place your entire configuration into one file.
+Alternately, you may factor out the templating into a "theme", and
+the list of subscriptions into one or more "reading lists".</p>
+<h3 id="planet"><code>[planet]</code></h3>
+<p>This is the only required section, which is a bit odd as none of the
+parameters listed below are required. Even so, you really do want to
+provide many of these, especially ones that identify your planet and
+either (or both) of <code>template_files</code> and <code>theme</code>.</p>
+<p>Below is a complete list of predefined planet configuration parameters,
+including <del>ones not (yet) implemented by Venus</del> and <ins>ones that
+are either new or implemented differently by Venus</ins>.</p>
+
+<blockquote>
+<dl class="compact code">
+<dt>name</dt>
+<dd>Your planet's name</dd>
+<dt>link</dt>
+<dd>Link to the main page</dd>
+<dt>owner_name</dt>
+<dd>Your name</dd>
+<dt>owner_email</dt>
+<dd>Your e-mail address</dd>
+
+</dl>
+<dl class="compact code">
+
+<dt>cache_directory</dt>
+<dd>Where cached feeds are stored</dd>
+<dt>output_dir</dt>
+<dd>Directory to place output files</dd>
+
+</dl>
+<dl class="compact code">
+
+<dt><ins>output_theme</ins></dt>
+<dd>Directory containing a <code>config.ini</code> file which is merged
+with this one. This is typically used to specify templating and bill of
+material information.</dd>
+<dt>template_files</dt>
+<dd>Space-separated list of output template files</dd>
+<dt><ins>template_directories</ins></dt>
+<dd>Space-separated list of directories in which <code>template_files</code>
+can be found</dd>
+<dt><ins>bill_of_materials</ins></dt>
+<dd>Space-separated list of files to be copied as is directly from the <code>template_directories</code> to the <code>output_dir</code></dd>
+<dt>filter</dt>
+<dd>Regular expression that must be found in the textual portion of the entry</dd>
+<dt>exclude</dt>
+<dd>Regular expression that must <b>not</b> be found in the textual portion of the entry</dd>
+<dt><ins>filters</ins></dt>
+<dd>Space-separated list of <a href="filters.html">filters</a> to apply to
+each entry</dd>
+<dt><ins>filter_directories</ins></dt>
+<dd>Space-separated list of directories in which <code>filters</code>
+can be found</dd>
+
+</dl>
+<dl class="compact code">
+
+<dt>items_per_page</dt>
+<dd>How many items to put on each page. <ins>Whereas Planet 2.0 allows this to
+be overridden on a per template basis, Venus currently takes the maximum value
+for this across all templates.</ins></dd>
+<dt><del>days_per_page</del></dt>
+<dd>How many complete days of posts to put on each page This is the absolute, hard limit (over the item limit)</dd>
+<dt>date_format</dt>
+<dd><a href="http://docs.python.org/lib/module-time.html#l2h-2816">strftime</a> format for the default 'date' template variable</dd>
+<dt>new_date_format</dt>
+<dd><a href="http://docs.python.org/lib/module-time.html#l2h-2816">strftime</a> format for the 'new_date' template variable <ins>only applies to htmltmpl templates</ins></dd>
+<dt><del>encoding</del></dt>
+<dd>Output encoding for the file, Python 2.3+ users can use the special "xml" value to output ASCII with XML character references</dd>
+<dt><del>locale</del></dt>
+<dd>Locale to use for (e.g.) strings in dates, default is taken from your system</dd>
+<dt>activity_threshold</dt>
+<dd>If non-zero, all feeds which have not been updated in the indicated
+number of days will be marked as inactive</dd>
+
+</dl>
+<dl class="compact code">
+
+<dt>log_level</dt>
+<dd>One of <code>DEBUG</code>, <code>INFO</code>, <code>WARNING</code>, <code>ERROR</code> or <code>CRITICAL</code></dd>
+<dt><ins>log_format</ins></dt>
+<dd><a href="http://docs.python.org/lib/node422.html">format string</a> to
+use for logging output. Note: this configuration value is processed
+<a href="http://docs.python.org/lib/ConfigParser-objects.html">raw</a></dd>
+<dt>feed_timeout</dt>
+<dd>Number of seconds to wait for any given feed</dd>
+<dt>new_feed_items</dt>
+<dd>Maximum number of items to include in the output from any one feed</dd>
+<dt><ins>spider_threads</ins></dt>
+<dd>The number of threads to use when spidering. When set to 0, the default,
+no threads are used and spidering follows the traditional algorithm.</dd>
+<dt><ins>http_cache_directory</ins></dt>
+<dd>If <code>spider_threads</code> is specified, you can also specify a
+directory to be used for an additional HTTP cache to front end the Venus
+cache. If specified as a relative path, it is evaluated relative to the
+<code>cache_directory</code>.</dd>
+<dt><ins>cache_keep_entries</ins></dt>
+<dd>Used by <code>expunge</code> to determine how many entries should be
+kept for each source when expunging old entries from the cache directory.
+This may be overriden on a per subscription feed basis.</dd>
+</dl>
+<p>Additional options can be found in
+<a href="normalization.html#overrides">normalization level overrides</a>.</p>
+</blockquote>
+
+<h3 id="default"><code>[DEFAULT]</code></h3>
+<p>Values placed in this section are used as default values for all sections.
+While it is true that few values make sense in all sections; in most cases
+unused parameters cause few problems.</p>
+
+<h3 id="subscription"><code>[</code><em>subscription</em><code>]</code></h3>
+<p>All sections other than <code>planet</code>, <code>DEFAULT</code>, or are
+named in <code>[planet]</code>'s <code>filters</code> or
+<code>templatefiles</code> parameters
+are treated as subscriptions and typically take the form of a
+<acronym title="Uniform Resource Identifier">URI</acronym>.</p>
+<p>Parameters placed in this section are passed to templates. While
+you are free to include as few or as many parameters as you like, most of
+the predefined themes presume that at least <code>name</code> is defined.</p>
+<p>The <code>content_type</code> parameter can be defined to indicate that
+this subscription is a <em>reading list</em>, i.e., is an external list
+of subscriptions. At the moment, three formats of reading lists are supported:
+<code>opml</code>, <code>foaf</code>, <code>csv</code>, and
+<code>config</code>. In the future,
+support for formats like <code>xoxo</code> could be added.</p>
+<p><a href="normalization.html#overrides">Normalization overrides</a> can
+also be defined here.</p>
+
+<h3 id="template"><code>[</code><em>template</em><code>]</code></h3>
+<p>Sections which are listed in <code>[planet] template_files</code> are
+processed as <a href="templates.html">templates</a>. With Planet 2.0,
+it is possible to override parameters like <code>items_per_page</code>
+on a per template basis, but at the current time Planet Venus doesn't
+implement this.</p>
+<p><ins><a href="filters.html">Filters</a> can be defined on a per-template basis, and will be used to post-process the output of the template.</ins></p>
+
+<h3 id="filter"><code>[</code><em>filter</em><code>]</code></h3>
+<p>Sections which are listed in <code>[planet] filters</code> are
+processed as <a href="filters.html">filters</a>.</p>
+<p>Parameters which are listed in this section are passed to the filter
+in a language specific manner. Given the way defaults work, filters
+should be prepared to ignore parameters that they didn't expect.</p>
+</body>
+</html>
Deleted: trunk/lib/venus/docs/contributing.html
===================================================================
--- branches/sucs-site/lib/venus/docs/contributing.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/lib/venus/docs/contributing.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,67 +0,0 @@
-<!DOCTYPE html PUBLIC
- "-//W3C//DTD XHTML 1.1 plus MathML 2.0 plus SVG 1.1//EN"
- "http://www.w3.org/2002/04/xhtml-math-svg/xhtml-math-svg.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<script type="text/javascript" src="docs.js"></script>
-<link rel="stylesheet" type="text/css" href="docs.css"/>
-<title>Contributing</title>
-</head>
-<body>
-<h2>Contributing</h2>
-<p>If you make changes to Venus, you have no obligation to share them.
-And unlike systems based on <code>CVS</code> or <code>subversion</code>,
-there is no notion of “committers” — everybody is
-a peer.</p>
-<p>If you should chose to share your changes, the steps outlined below may
-increase your changes of your code being picked up.</p>
-
-<h3>Documentation and Tests</h3>
-<p>For best results, include both documentation and tests in your
-contribution.</p>
-<p>Documentation can be found in the <code>docs</code> directory. It is
-straight XHTML.</p>
-<p>Test cases can be found in the
-<a href="http://localhost/~rubys/venus/tests/">tests</a> directory, and
-make use of the
-<a href="http://docs.python.org/lib/module-unittest.html">Python Unit testing framework</a>. To run them, simply enter:</p>
-<blockquote><pre>python runtests.py</pre></blockquote>
-
-<h3>Bzr</h3>
-<p>If you have done a <a href="index.html">bzr get</a>, you have already set up
-a repository. The only additional step you might need to do is to introduce
-yourself to <a href="http://bazaar-vcs.org/">bzr</a>. Type in the following,
-after replacing the <b>bold text</b> with your information:</p>
-
-<blockquote><pre>bzr whoami '<b>Your Name</b> <<b>youremail</b>@<b>example.com</b>>'</pre></blockquote>
-
-<p>Then, simply make the changes you like. When you are done, type:</p>
-
-<blockquote><pre>bzr st</pre></blockquote>
-
-<p>This will tell you which files you have modified, and which ones you may
-have added. If you add files and you want them to be included, simply do a:</p>
-
-<blockquote><pre>bzr add file1 file2...</pre></blockquote>
-
-<p>You can also do a <code>bzr diff</code> to see if there are any changes
-which you made that you don't want included. I can't tell you how many
-debug print statements I have caught this way.</p>
-
-<p>Next, type:</p>
-
-<blockquote><pre>bzr commit</pre></blockquote>
-
-<p>This will allow you to enter a comment describing your change. If your
-repository is already on your web server, simple let others know where they
-can find it. If not, you can simply ftp or scp the files to your web server
-— no additional software needs to be installed on that machine.</p>
-
-<h3>Telling others</h3>
-<p>Once you have a change worth sharing, post a message on the
-<a href="http://lists.planetplanet.org/mailman/listinfo/devel">mailing list</a>.</p>
-<p>Also, consider setting up a <a href="http://bzr.mfd-consult.dk/bzr-feed/">bzr-feed</a> for your repository, so people who wish to do so can automatically
-be notified of every change.</p>
-<p>There now is even an nascent <a href="http://planet.intertwingly.net/venus/">planet</a> being formed which combines these feeds of changes. You can <a href="http://planet.intertwingly.net/venus/atom.xml">subscribe</a> to it too.</p>
-</body>
-</html>
Copied: trunk/lib/venus/docs/contributing.html (from rev 656, branches/sucs-site/lib/venus/docs/contributing.html)
===================================================================
--- trunk/lib/venus/docs/contributing.html (rev 0)
+++ trunk/lib/venus/docs/contributing.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,67 @@
+<!DOCTYPE html PUBLIC
+ "-//W3C//DTD XHTML 1.1 plus MathML 2.0 plus SVG 1.1//EN"
+ "http://www.w3.org/2002/04/xhtml-math-svg/xhtml-math-svg.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<script type="text/javascript" src="docs.js"></script>
+<link rel="stylesheet" type="text/css" href="docs.css"/>
+<title>Contributing</title>
+</head>
+<body>
+<h2>Contributing</h2>
+<p>If you make changes to Venus, you have no obligation to share them.
+And unlike systems based on <code>CVS</code> or <code>subversion</code>,
+there is no notion of “committers” — everybody is
+a peer.</p>
+<p>If you should chose to share your changes, the steps outlined below may
+increase your changes of your code being picked up.</p>
+
+<h3>Documentation and Tests</h3>
+<p>For best results, include both documentation and tests in your
+contribution.</p>
+<p>Documentation can be found in the <code>docs</code> directory. It is
+straight XHTML.</p>
+<p>Test cases can be found in the
+<a href="http://localhost/~rubys/venus/tests/">tests</a> directory, and
+make use of the
+<a href="http://docs.python.org/lib/module-unittest.html">Python Unit testing framework</a>. To run them, simply enter:</p>
+<blockquote><pre>python runtests.py</pre></blockquote>
+
+<h3>Bzr</h3>
+<p>If you have done a <a href="index.html">bzr get</a>, you have already set up
+a repository. The only additional step you might need to do is to introduce
+yourself to <a href="http://bazaar-vcs.org/">bzr</a>. Type in the following,
+after replacing the <b>bold text</b> with your information:</p>
+
+<blockquote><pre>bzr whoami '<b>Your Name</b> <<b>youremail</b>@<b>example.com</b>>'</pre></blockquote>
+
+<p>Then, simply make the changes you like. When you are done, type:</p>
+
+<blockquote><pre>bzr st</pre></blockquote>
+
+<p>This will tell you which files you have modified, and which ones you may
+have added. If you add files and you want them to be included, simply do a:</p>
+
+<blockquote><pre>bzr add file1 file2...</pre></blockquote>
+
+<p>You can also do a <code>bzr diff</code> to see if there are any changes
+which you made that you don't want included. I can't tell you how many
+debug print statements I have caught this way.</p>
+
+<p>Next, type:</p>
+
+<blockquote><pre>bzr commit</pre></blockquote>
+
+<p>This will allow you to enter a comment describing your change. If your
+repository is already on your web server, simple let others know where they
+can find it. If not, you can simply ftp or scp the files to your web server
+— no additional software needs to be installed on that machine.</p>
+
+<h3>Telling others</h3>
+<p>Once you have a change worth sharing, post a message on the
+<a href="http://lists.planetplanet.org/mailman/listinfo/devel">mailing list</a>.</p>
+<p>Also, consider setting up a <a href="http://bzr.mfd-consult.dk/bzr-feed/">bzr-feed</a> for your repository, so people who wish to do so can automatically
+be notified of every change.</p>
+<p>There now is even an nascent <a href="http://planet.intertwingly.net/venus/">planet</a> being formed which combines these feeds of changes. You can <a href="http://planet.intertwingly.net/venus/atom.xml">subscribe</a> to it too.</p>
+</body>
+</html>
Deleted: trunk/lib/venus/docs/docs.css
===================================================================
--- branches/sucs-site/lib/venus/docs/docs.css 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/lib/venus/docs/docs.css 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,100 +0,0 @@
-body {
- background-color: #fff;
- color: #333;
- font-family: 'Lucida Grande', Verdana, Geneva, Lucida, Helvetica, sans-serif;
- font-size: small;
- margin: 40px;
- padding: 0;
-}
-
-a:link, a:visited {
- background-color: transparent;
- color: #333;
- text-decoration: none !important;
- border-bottom: 1px dotted #333 !important;
-}
-
-a:hover {
- background-color: transparent;
- color: #934;
- text-decoration: none !important;
- border-bottom: 1px dotted #993344 !important;
-}
-
-pre, code {
- background-color: #FFF;
- color: #00F;
- font-size: large
-}
-
-h1 {
- margin: 8px 0 10px 20px;
- padding: 0;
- font-variant: small-caps;
- letter-spacing: 0.1em;
- font-family: "Book Antiqua", Georgia, Palatino, Times, "Times New Roman", serif;
-}
-
-h2 {
- clear: both;
-}
-
-ul, ul.outer > li {
- margin: 14px 0 10px 0;
-}
-
-.z {
- float:left;
- background: url(img/shadowAlpha.png) no-repeat bottom right !important;
- margin: -15px 0 20px -15px !important;
-}
-
-.z .logo {
- color: magenta;
-}
-
-.z p {
- margin: 14px 0 10px 15px !important;
-}
-
-.z .sectionInner {
- width: 730px;
- background: none !important;
- padding: 0 !important;
- }
-
-.z .sectionInner .sectionInner2 {
- border: 1px solid #a9a9a9;
- padding: 4px;
- margin: -6px 6px 6px -6px !important;
-}
-
-ins {
- background-color: #FFF;
- color: #F0F;
- text-decoration: none;
-}
-
-dl.compact {
- margin-bottom: 1em;
- margin-top: 1em;
-}
-
-dl.compact > dt {
- clear: left;
- float: left;
- margin-bottom: 0;
- padding-right: 8px;
- margin-top: 0;
- list-style-type: none;
-}
-
-dl.compact > dd {
- margin-bottom: 0;
- margin-top: 0;
- margin-left: 10em;
-}
-
-th, td {
- font-size: small;
-}
Copied: trunk/lib/venus/docs/docs.css (from rev 656, branches/sucs-site/lib/venus/docs/docs.css)
===================================================================
--- trunk/lib/venus/docs/docs.css (rev 0)
+++ trunk/lib/venus/docs/docs.css 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,100 @@
+body {
+ background-color: #fff;
+ color: #333;
+ font-family: 'Lucida Grande', Verdana, Geneva, Lucida, Helvetica, sans-serif;
+ font-size: small;
+ margin: 40px;
+ padding: 0;
+}
+
+a:link, a:visited {
+ background-color: transparent;
+ color: #333;
+ text-decoration: none !important;
+ border-bottom: 1px dotted #333 !important;
+}
+
+a:hover {
+ background-color: transparent;
+ color: #934;
+ text-decoration: none !important;
+ border-bottom: 1px dotted #993344 !important;
+}
+
+pre, code {
+ background-color: #FFF;
+ color: #00F;
+ font-size: large
+}
+
+h1 {
+ margin: 8px 0 10px 20px;
+ padding: 0;
+ font-variant: small-caps;
+ letter-spacing: 0.1em;
+ font-family: "Book Antiqua", Georgia, Palatino, Times, "Times New Roman", serif;
+}
+
+h2 {
+ clear: both;
+}
+
+ul, ul.outer > li {
+ margin: 14px 0 10px 0;
+}
+
+.z {
+ float:left;
+ background: url(img/shadowAlpha.png) no-repeat bottom right !important;
+ margin: -15px 0 20px -15px !important;
+}
+
+.z .logo {
+ color: magenta;
+}
+
+.z p {
+ margin: 14px 0 10px 15px !important;
+}
+
+.z .sectionInner {
+ width: 730px;
+ background: none !important;
+ padding: 0 !important;
+ }
+
+.z .sectionInner .sectionInner2 {
+ border: 1px solid #a9a9a9;
+ padding: 4px;
+ margin: -6px 6px 6px -6px !important;
+}
+
+ins {
+ background-color: #FFF;
+ color: #F0F;
+ text-decoration: none;
+}
+
+dl.compact {
+ margin-bottom: 1em;
+ margin-top: 1em;
+}
+
+dl.compact > dt {
+ clear: left;
+ float: left;
+ margin-bottom: 0;
+ padding-right: 8px;
+ margin-top: 0;
+ list-style-type: none;
+}
+
+dl.compact > dd {
+ margin-bottom: 0;
+ margin-top: 0;
+ margin-left: 10em;
+}
+
+th, td {
+ font-size: small;
+}
Deleted: trunk/lib/venus/docs/docs.js
===================================================================
--- branches/sucs-site/lib/venus/docs/docs.js 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/lib/venus/docs/docs.js 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,54 +0,0 @@
-window.onload=function() {
- var vindex = document.URL.lastIndexOf('venus/');
- if (vindex<0) vindex = document.URL.lastIndexOf('planet/');
- var base = document.URL.substring(0,vindex+6);
-
- var body = document.getElementsByTagName('body')[0];
- var div = document.createElement('div');
- div.setAttribute('class','z');
- var h1 = document.createElement('h1');
- var span = document.createElement('span');
- span.appendChild(document.createTextNode('\u2640'));
- span.setAttribute('class','logo');
- h1.appendChild(span);
- h1.appendChild(document.createTextNode(' Planet Venus'));
-
- var inner2=document.createElement('div');
- inner2.setAttribute('class','sectionInner2');
- inner2.appendChild(h1);
-
- var p = document.createElement('p');
- p.appendChild(document.createTextNode("Planet Venus is an awesome \u2018river of news\u2019 feed reader. It downloads news feeds published by web sites and aggregates their content together into a single combined feed, latest news first."));
- inner2.appendChild(p);
-
- p = document.createElement('p');
- var a = document.createElement('a');
- a.setAttribute('href',base);
- a.appendChild(document.createTextNode('Download'));
- p.appendChild(a);
- p.appendChild(document.createTextNode(" \u00b7 "));
- a = document.createElement('a');
- a.setAttribute('href',base+'docs/index.html');
- a.appendChild(document.createTextNode('Documentation'));
- p.appendChild(a);
- p.appendChild(document.createTextNode(" \u00b7 "));
- a = document.createElement('a');
- a.setAttribute('href',base+'tests/');
- a.appendChild(document.createTextNode('Unit tests'));
- p.appendChild(a);
- p.appendChild(document.createTextNode(" \u00b7 "));
- a = document.createElement('a');
- a.setAttribute('href','http://lists.planetplanet.org/mailman/listinfo/devel');
- a.appendChild(document.createTextNode('Mailing list'));
- p.appendChild(a);
- inner2.appendChild(p);
-
- var inner1=document.createElement('div');
- inner1.setAttribute('class','sectionInner');
- inner1.setAttribute('id','inner1');
- inner1.appendChild(inner2);
-
- div.appendChild(inner1);
-
- body.insertBefore(div, body.firstChild);
-}
Copied: trunk/lib/venus/docs/docs.js (from rev 656, branches/sucs-site/lib/venus/docs/docs.js)
===================================================================
--- trunk/lib/venus/docs/docs.js (rev 0)
+++ trunk/lib/venus/docs/docs.js 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,54 @@
+window.onload=function() {
+ var vindex = document.URL.lastIndexOf('venus/');
+ if (vindex<0) vindex = document.URL.lastIndexOf('planet/');
+ var base = document.URL.substring(0,vindex+6);
+
+ var body = document.getElementsByTagName('body')[0];
+ var div = document.createElement('div');
+ div.setAttribute('class','z');
+ var h1 = document.createElement('h1');
+ var span = document.createElement('span');
+ span.appendChild(document.createTextNode('\u2640'));
+ span.setAttribute('class','logo');
+ h1.appendChild(span);
+ h1.appendChild(document.createTextNode(' Planet Venus'));
+
+ var inner2=document.createElement('div');
+ inner2.setAttribute('class','sectionInner2');
+ inner2.appendChild(h1);
+
+ var p = document.createElement('p');
+ p.appendChild(document.createTextNode("Planet Venus is an awesome \u2018river of news\u2019 feed reader. It downloads news feeds published by web sites and aggregates their content together into a single combined feed, latest news first."));
+ inner2.appendChild(p);
+
+ p = document.createElement('p');
+ var a = document.createElement('a');
+ a.setAttribute('href',base);
+ a.appendChild(document.createTextNode('Download'));
+ p.appendChild(a);
+ p.appendChild(document.createTextNode(" \u00b7 "));
+ a = document.createElement('a');
+ a.setAttribute('href',base+'docs/index.html');
+ a.appendChild(document.createTextNode('Documentation'));
+ p.appendChild(a);
+ p.appendChild(document.createTextNode(" \u00b7 "));
+ a = document.createElement('a');
+ a.setAttribute('href',base+'tests/');
+ a.appendChild(document.createTextNode('Unit tests'));
+ p.appendChild(a);
+ p.appendChild(document.createTextNode(" \u00b7 "));
+ a = document.createElement('a');
+ a.setAttribute('href','http://lists.planetplanet.org/mailman/listinfo/devel');
+ a.appendChild(document.createTextNode('Mailing list'));
+ p.appendChild(a);
+ inner2.appendChild(p);
+
+ var inner1=document.createElement('div');
+ inner1.setAttribute('class','sectionInner');
+ inner1.setAttribute('id','inner1');
+ inner1.appendChild(inner2);
+
+ div.appendChild(inner1);
+
+ body.insertBefore(div, body.firstChild);
+}
Deleted: trunk/lib/venus/docs/etiquette.html
===================================================================
--- branches/sucs-site/lib/venus/docs/etiquette.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/lib/venus/docs/etiquette.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,48 +0,0 @@
-<!DOCTYPE html PUBLIC
- "-//W3C//DTD XHTML 1.1 plus MathML 2.0 plus SVG 1.1//EN"
- "http://www.w3.org/2002/04/xhtml-math-svg/xhtml-math-svg.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<script type="text/javascript" src="docs.js"></script>
-<link rel="stylesheet" type="text/css" href="docs.css"/>
-<title>Etiquette</title>
-</head>
-<body>
-<h2>Etiquette</h2>
-<p>You would think that people who publish syndication feeds do it with the
-intent to be syndicated. But the truth is that we live in a world where
-<a href="http://en.wikipedia.org/wiki/Deep_linking">deep linking</a> can
-cause people to complain. Nothing is safe. But that doesn’t
-stop us from doing links.</p>
-
-<p>These concerns tend to increase when you profit, either directly via ads or
-indirectly via search engine rankings, from the content of others.</p>
-
-<p>While there are no hard and fast rules that apply here, here’s are a
-few things you can do to mitigate the concern:</p>
-
-<ul>
-<li>Aggressively use robots.txt, meta tags, and the google/livejournal
-atom namespace to mark your pages as not to be indexed by search
-engines.</li>
-<blockquote><p><dl>
-<dt><a href="http://www.robotstxt.org/">robots.txt</a>:</dt>
-<dd><p><code>User-agent: *<br/>
-Disallow: /</code></p></dd>
-<dt>index.html:</dt>
-<dd><p><code><<a href="http://www.robotstxt.org/wc/meta-user.html">meta name="robots"</a> content="noindex,nofollow"/></code></p></dd>
-<dt>atom.xml:</dt>
-<dd><p><code><feed xmlns:indexing="<a href="http://community.livejournal.com/lj_dev/696793.html">urn:atom-extension:indexing</a>" indexing:index="no"></code></p>
-<p><code><access:restriction xmlns:access="<a href="http://www.bloglines.com/about/specs/fac-1.0">http://www.bloglines.com/about/specs/fac-1.0</a>" relationship="deny"/></code></p></dd>
-</dl></p></blockquote>
-<li><p>Ensure that all <a href="http://nightly.feedparser.org/docs/reference-entry-source.html#reference.entry.source.rights">copyright</a> and <a href="http://nightly.feedparser.org/docs/reference-entry-license.html">licensing</a> information is propagated to the
-combined feed(s) that you produce.</p></li>
-
-<li><p>Add no advertising. Consider filtering out ads, lest you
-be accused of using someone’s content to help your friends profit.</p></li>
-
-<li><p>Most importantly, if anyone does object to their content being included,
-quickly and without any complaint, remove them.</p></li>
-</ul>
-</body>
-</html>
Copied: trunk/lib/venus/docs/etiquette.html (from rev 656, branches/sucs-site/lib/venus/docs/etiquette.html)
===================================================================
--- trunk/lib/venus/docs/etiquette.html (rev 0)
+++ trunk/lib/venus/docs/etiquette.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,48 @@
+<!DOCTYPE html PUBLIC
+ "-//W3C//DTD XHTML 1.1 plus MathML 2.0 plus SVG 1.1//EN"
+ "http://www.w3.org/2002/04/xhtml-math-svg/xhtml-math-svg.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<script type="text/javascript" src="docs.js"></script>
+<link rel="stylesheet" type="text/css" href="docs.css"/>
+<title>Etiquette</title>
+</head>
+<body>
+<h2>Etiquette</h2>
+<p>You would think that people who publish syndication feeds do it with the
+intent to be syndicated. But the truth is that we live in a world where
+<a href="http://en.wikipedia.org/wiki/Deep_linking">deep linking</a> can
+cause people to complain. Nothing is safe. But that doesn’t
+stop us from doing links.</p>
+
+<p>These concerns tend to increase when you profit, either directly via ads or
+indirectly via search engine rankings, from the content of others.</p>
+
+<p>While there are no hard and fast rules that apply here, here’s are a
+few things you can do to mitigate the concern:</p>
+
+<ul>
+<li>Aggressively use robots.txt, meta tags, and the google/livejournal
+atom namespace to mark your pages as not to be indexed by search
+engines.</li>
+<blockquote><p><dl>
+<dt><a href="http://www.robotstxt.org/">robots.txt</a>:</dt>
+<dd><p><code>User-agent: *<br/>
+Disallow: /</code></p></dd>
+<dt>index.html:</dt>
+<dd><p><code><<a href="http://www.robotstxt.org/wc/meta-user.html">meta name="robots"</a> content="noindex,nofollow"/></code></p></dd>
+<dt>atom.xml:</dt>
+<dd><p><code><feed xmlns:indexing="<a href="http://community.livejournal.com/lj_dev/696793.html">urn:atom-extension:indexing</a>" indexing:index="no"></code></p>
+<p><code><access:restriction xmlns:access="<a href="http://www.bloglines.com/about/specs/fac-1.0">http://www.bloglines.com/about/specs/fac-1.0</a>" relationship="deny"/></code></p></dd>
+</dl></p></blockquote>
+<li><p>Ensure that all <a href="http://nightly.feedparser.org/docs/reference-entry-source.html#reference.entry.source.rights">copyright</a> and <a href="http://nightly.feedparser.org/docs/reference-entry-license.html">licensing</a> information is propagated to the
+combined feed(s) that you produce.</p></li>
+
+<li><p>Add no advertising. Consider filtering out ads, lest you
+be accused of using someone’s content to help your friends profit.</p></li>
+
+<li><p>Most importantly, if anyone does object to their content being included,
+quickly and without any complaint, remove them.</p></li>
+</ul>
+</body>
+</html>
Deleted: trunk/lib/venus/docs/filters.html
===================================================================
--- branches/sucs-site/lib/venus/docs/filters.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/lib/venus/docs/filters.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,105 +0,0 @@
-<!DOCTYPE html PUBLIC
- "-//W3C//DTD XHTML 1.1 plus MathML 2.0 plus SVG 1.1//EN"
- "http://www.w3.org/2002/04/xhtml-math-svg/xhtml-math-svg.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<script type="text/javascript" src="docs.js"></script>
-<link rel="stylesheet" type="text/css" href="docs.css"/>
-<title>Venus Filters</title>
-</head>
-<body>
-<h2>Filters and Plugins</h2>
-<p>Filters and plugins are simple Unix pipes. Input comes in
-<code>stdin</code>, parameters come from the config file, and output goes to
-<code>stdout</code>. Anything written to <code>stderr</code> is logged as an
-ERROR message. If no <code>stdout</code> is produced, the entry is not written
-to the cache or processed further; in fact, if the entry had previously been
-written to the cache, it will be removed.</p>
-
-<p>There are two types of filters supported by Venus, input and template.</p>
-<p>Input to an input filter is a aggressively
-<a href="normalization.html">normalized</a> entry. For
-example, if a feed is RSS 1.0 with 10 items, the filter will be called ten
-times, each with a single Atom 1.0 entry, with all textConstructs
-expressed as XHTML, and everything encoded as UTF-8.</p>
-<p>Input to a template filter will be the output produced by the template.</p>
-
-<p>You will find a small set of example filters in the <a
-href="../filters">filters</a> directory. The <a
-href="../filters/coral_cdn_filter.py">coral cdn filter</a> will change links
-to images in the entry itself. The filters in the <a
-href="../filters/stripAd/">stripAd</a> subdirectory will strip specific
-types of advertisements that you may find in feeds.</p>
-
-<p>The <a href="../filters/excerpt.py">excerpt</a> filter adds metadata (in
-the form of a <code>planet:excerpt</code> element) to the feed itself. You
-can see examples of how parameters are passed to this program in either
-<a href="../tests/data/filter/excerpt-images.ini">excerpt-images</a> or
-<a href="../examples/opml-top100.ini">opml-top100.ini</a>.
-Alternately parameters may be passed
-<abbr title="Uniform Resource Identifier">URI</abbr> style, for example:
-<a href="../tests/data/filter/excerpt-images2.ini">excerpt-images2</a>.
-</p>
-
-<p>The <a href="../filters/xpath_sifter.py">xpath sifter</a> is a variation of
-the above, including or excluding feeds based on the presence (or absence) of
-data specified by <a href="http://www.w3.org/TR/xpath20/">xpath</a>
-expressions. Again, parameters can be passed as
-<a href="../tests/data/filter/xpath-sifter.ini">config options</a> or
-<a href="../tests/data/filter/xpath-sifter2.ini">URI style</a>.
-</p>
-
-<p>The <a href="../filters/regexp_sifter.py">regexp sifter</a> operates just
-like the xpath sifter, except it uses
-<a href="http://docs.python.org/lib/re-syntax.html">regular expressions</a>
-instead of XPath expressions.</p>
-
-<h3>Notes</h3>
-
-<ul>
-<li>Any filters listed in the <code>[planet]</code> section of your config.ini
-will be invoked on all feeds. Filters listed in individual
-<code>[feed]</code> sections will only be invoked on those feeds.
-Filters listed in <code>[template]</code> sections will be invoked on the
-output of that template.</li>
-
-<li>Input filters are executed when a feed is fetched, and the results are
-placed into the cache. Changing a configuration file alone is not sufficient to
-change the contents of the cache — typically that only occurs after
-a feed is modified.</li>
-
-<li>Filters are simply invoked in the order they are listed in the
-configuration file (think unix pipes). Planet wide filters are executed before
-feed specific filters.</li>
-
-<li>The file extension of the filter is significant. <code>.py</code> invokes
-python. <code>.xslt</code> involkes XSLT. <code>.sed</code> and
-<code>.tmpl</code> (a.k.a. htmltmp) are also options. Other languages, like
-perl or ruby or class/jar (java), aren't supported at the moment, but these
-would be easy to add.</li>
-
-<li>If the filter name contains a redirection character (<code>></code>),
-then the output stream is
-<a href="http://en.wikipedia.org/wiki/Tee_(Unix)">tee</a>d; one branch flows
-through the specified filter and the output is planced into the named file; the
-other unmodified branch continues onto the next filter, if any.
-One use case for this function is to use
-<a href="../filters/xhtml2html.plugin">xhtml2html</a> to produce both an XHTML
-and an HTML output stream from one source.</li>
-
-<li>Templates written using htmltmpl or django currently only have access to a
-fixed set of fields, whereas XSLT and genshi templates have access to
-everything.</li>
-
-<li>Plugins differ from filters in that while filters are forked, plugins are
-<a href="http://docs.python.org/lib/module-imp.html">imported</a>. This
-means that plugins are limited to Python and are run in-process. Plugins
-therefore have direct access to planet internals like configuration and
-logging facitilies, as well as access to the bundled libraries like the
-<a href="http://feedparser.org/docs/">Universal Feed Parser</a> and
-<a href="http://code.google.com/p/html5lib/">html5lib</a>; but it also
-means that functions like <code>os.abort()</code> can't be recovered
-from.</li>
-</ul>
-</body>
-</html>
Copied: trunk/lib/venus/docs/filters.html (from rev 656, branches/sucs-site/lib/venus/docs/filters.html)
===================================================================
--- trunk/lib/venus/docs/filters.html (rev 0)
+++ trunk/lib/venus/docs/filters.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,105 @@
+<!DOCTYPE html PUBLIC
+ "-//W3C//DTD XHTML 1.1 plus MathML 2.0 plus SVG 1.1//EN"
+ "http://www.w3.org/2002/04/xhtml-math-svg/xhtml-math-svg.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<script type="text/javascript" src="docs.js"></script>
+<link rel="stylesheet" type="text/css" href="docs.css"/>
+<title>Venus Filters</title>
+</head>
+<body>
+<h2>Filters and Plugins</h2>
+<p>Filters and plugins are simple Unix pipes. Input comes in
+<code>stdin</code>, parameters come from the config file, and output goes to
+<code>stdout</code>. Anything written to <code>stderr</code> is logged as an
+ERROR message. If no <code>stdout</code> is produced, the entry is not written
+to the cache or processed further; in fact, if the entry had previously been
+written to the cache, it will be removed.</p>
+
+<p>There are two types of filters supported by Venus, input and template.</p>
+<p>Input to an input filter is a aggressively
+<a href="normalization.html">normalized</a> entry. For
+example, if a feed is RSS 1.0 with 10 items, the filter will be called ten
+times, each with a single Atom 1.0 entry, with all textConstructs
+expressed as XHTML, and everything encoded as UTF-8.</p>
+<p>Input to a template filter will be the output produced by the template.</p>
+
+<p>You will find a small set of example filters in the <a
+href="../filters">filters</a> directory. The <a
+href="../filters/coral_cdn_filter.py">coral cdn filter</a> will change links
+to images in the entry itself. The filters in the <a
+href="../filters/stripAd/">stripAd</a> subdirectory will strip specific
+types of advertisements that you may find in feeds.</p>
+
+<p>The <a href="../filters/excerpt.py">excerpt</a> filter adds metadata (in
+the form of a <code>planet:excerpt</code> element) to the feed itself. You
+can see examples of how parameters are passed to this program in either
+<a href="../tests/data/filter/excerpt-images.ini">excerpt-images</a> or
+<a href="../examples/opml-top100.ini">opml-top100.ini</a>.
+Alternately parameters may be passed
+<abbr title="Uniform Resource Identifier">URI</abbr> style, for example:
+<a href="../tests/data/filter/excerpt-images2.ini">excerpt-images2</a>.
+</p>
+
+<p>The <a href="../filters/xpath_sifter.py">xpath sifter</a> is a variation of
+the above, including or excluding feeds based on the presence (or absence) of
+data specified by <a href="http://www.w3.org/TR/xpath20/">xpath</a>
+expressions. Again, parameters can be passed as
+<a href="../tests/data/filter/xpath-sifter.ini">config options</a> or
+<a href="../tests/data/filter/xpath-sifter2.ini">URI style</a>.
+</p>
+
+<p>The <a href="../filters/regexp_sifter.py">regexp sifter</a> operates just
+like the xpath sifter, except it uses
+<a href="http://docs.python.org/lib/re-syntax.html">regular expressions</a>
+instead of XPath expressions.</p>
+
+<h3>Notes</h3>
+
+<ul>
+<li>Any filters listed in the <code>[planet]</code> section of your config.ini
+will be invoked on all feeds. Filters listed in individual
+<code>[feed]</code> sections will only be invoked on those feeds.
+Filters listed in <code>[template]</code> sections will be invoked on the
+output of that template.</li>
+
+<li>Input filters are executed when a feed is fetched, and the results are
+placed into the cache. Changing a configuration file alone is not sufficient to
+change the contents of the cache — typically that only occurs after
+a feed is modified.</li>
+
+<li>Filters are simply invoked in the order they are listed in the
+configuration file (think unix pipes). Planet wide filters are executed before
+feed specific filters.</li>
+
+<li>The file extension of the filter is significant. <code>.py</code> invokes
+python. <code>.xslt</code> involkes XSLT. <code>.sed</code> and
+<code>.tmpl</code> (a.k.a. htmltmp) are also options. Other languages, like
+perl or ruby or class/jar (java), aren't supported at the moment, but these
+would be easy to add.</li>
+
+<li>If the filter name contains a redirection character (<code>></code>),
+then the output stream is
+<a href="http://en.wikipedia.org/wiki/Tee_(Unix)">tee</a>d; one branch flows
+through the specified filter and the output is planced into the named file; the
+other unmodified branch continues onto the next filter, if any.
+One use case for this function is to use
+<a href="../filters/xhtml2html.plugin">xhtml2html</a> to produce both an XHTML
+and an HTML output stream from one source.</li>
+
+<li>Templates written using htmltmpl or django currently only have access to a
+fixed set of fields, whereas XSLT and genshi templates have access to
+everything.</li>
+
+<li>Plugins differ from filters in that while filters are forked, plugins are
+<a href="http://docs.python.org/lib/module-imp.html">imported</a>. This
+means that plugins are limited to Python and are run in-process. Plugins
+therefore have direct access to planet internals like configuration and
+logging facitilies, as well as access to the bundled libraries like the
+<a href="http://feedparser.org/docs/">Universal Feed Parser</a> and
+<a href="http://code.google.com/p/html5lib/">html5lib</a>; but it also
+means that functions like <code>os.abort()</code> can't be recovered
+from.</li>
+</ul>
+</body>
+</html>
Deleted: trunk/lib/venus/docs/img/shadowAlpha.png
===================================================================
(Binary files differ)
Copied: trunk/lib/venus/docs/img/shadowAlpha.png (from rev 656, branches/sucs-site/lib/venus/docs/img/shadowAlpha.png)
===================================================================
(Binary files differ)
Deleted: trunk/lib/venus/docs/index.html
===================================================================
--- branches/sucs-site/lib/venus/docs/index.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/lib/venus/docs/index.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,55 +0,0 @@
-<!DOCTYPE html PUBLIC
- "-//W3C//DTD XHTML 1.1 plus MathML 2.0 plus SVG 1.1//EN"
- "http://www.w3.org/2002/04/xhtml-math-svg/xhtml-math-svg.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<script type="text/javascript" src="docs.js"></script>
-<link rel="stylesheet" type="text/css" href="docs.css"/>
-<title>Venus Documentation</title>
-</head>
-<body>
-<h2>Table of Contents</h2>
-<ul class="outer">
-<li><a href="installation.html">Getting started</a></li>
-<li>Basic Features
-<ul>
-<li><a href="config.html">Configuration</a></li>
-<li><a href="templates.html">Templates</a></li>
-</ul>
-</li>
-<li>Advanced Features
-<ul>
-<li><a href="venus.svg">Architecture</a></li>
-<li><a href="normalization.html">Normalization</a></li>
-<li><a href="filters.html">Filters and Plugins</a></li>
-</ul>
-</li>
-<li>Other
-<ul>
-<li><a href="migration.html">Migration from Planet 2.0</a></li>
-<li><a href="contributing.html">Contributing</a></li>
-<li><a href="etiquette.html">Etiquette</a></li>
-</ul>
-</li>
-<li>Reference
-<ul>
-<li><a href="http://www.planetplanet.org/">Planet</a></li>
-<li><a href="http://feedparser.org/docs/">Universal Feed Parser</a></li>
-<li><a href="http://code.google.com/p/html5lib/">html5lib</a></li>
-<li><a href="http://htmltmpl.sourceforge.net/">htmltmpl</a></li>
-<li><a href="http://bitworking.org/projects/httplib2/">httplib2</a></li>
-<li><a href="http://www.w3.org/TR/xslt">XSLT</a></li>
-<li><a href="http://www.gnu.org/software/sed/manual/html_mono/sed.html">sed</a></li>
-<li><a href="http://www.djangoproject.com/documentation/templates/">Django templates</a></li>
-</ul>
-</li>
-<li>Credits and License
-<ul>
-<li><a href="../AUTHORS">Authors</a></li>
-<li><a href="../THANKS">Contributors</a></li>
-<li><a href="../LICENCE">License</a></li>
-</ul>
-</li>
-</ul>
-</body>
-</html>
Copied: trunk/lib/venus/docs/index.html (from rev 656, branches/sucs-site/lib/venus/docs/index.html)
===================================================================
--- trunk/lib/venus/docs/index.html (rev 0)
+++ trunk/lib/venus/docs/index.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,55 @@
+<!DOCTYPE html PUBLIC
+ "-//W3C//DTD XHTML 1.1 plus MathML 2.0 plus SVG 1.1//EN"
+ "http://www.w3.org/2002/04/xhtml-math-svg/xhtml-math-svg.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<script type="text/javascript" src="docs.js"></script>
+<link rel="stylesheet" type="text/css" href="docs.css"/>
+<title>Venus Documentation</title>
+</head>
+<body>
+<h2>Table of Contents</h2>
+<ul class="outer">
+<li><a href="installation.html">Getting started</a></li>
+<li>Basic Features
+<ul>
+<li><a href="config.html">Configuration</a></li>
+<li><a href="templates.html">Templates</a></li>
+</ul>
+</li>
+<li>Advanced Features
+<ul>
+<li><a href="venus.svg">Architecture</a></li>
+<li><a href="normalization.html">Normalization</a></li>
+<li><a href="filters.html">Filters and Plugins</a></li>
+</ul>
+</li>
+<li>Other
+<ul>
+<li><a href="migration.html">Migration from Planet 2.0</a></li>
+<li><a href="contributing.html">Contributing</a></li>
+<li><a href="etiquette.html">Etiquette</a></li>
+</ul>
+</li>
+<li>Reference
+<ul>
+<li><a href="http://www.planetplanet.org/">Planet</a></li>
+<li><a href="http://feedparser.org/docs/">Universal Feed Parser</a></li>
+<li><a href="http://code.google.com/p/html5lib/">html5lib</a></li>
+<li><a href="http://htmltmpl.sourceforge.net/">htmltmpl</a></li>
+<li><a href="http://bitworking.org/projects/httplib2/">httplib2</a></li>
+<li><a href="http://www.w3.org/TR/xslt">XSLT</a></li>
+<li><a href="http://www.gnu.org/software/sed/manual/html_mono/sed.html">sed</a></li>
+<li><a href="http://www.djangoproject.com/documentation/templates/">Django templates</a></li>
+</ul>
+</li>
+<li>Credits and License
+<ul>
+<li><a href="../AUTHORS">Authors</a></li>
+<li><a href="../THANKS">Contributors</a></li>
+<li><a href="../LICENCE">License</a></li>
+</ul>
+</li>
+</ul>
+</body>
+</html>
Deleted: trunk/lib/venus/docs/installation.html
===================================================================
--- branches/sucs-site/lib/venus/docs/installation.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/lib/venus/docs/installation.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,129 +0,0 @@
-<!DOCTYPE html PUBLIC
- "-//W3C//DTD XHTML 1.1 plus MathML 2.0 plus SVG 1.1//EN"
- "http://www.w3.org/2002/04/xhtml-math-svg/xhtml-math-svg.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<script type="text/javascript" src="docs.js"></script>
-<link rel="stylesheet" type="text/css" href="docs.css"/>
-<title>Venus Installation</title>
-</head>
-<body>
-<h2>Installation</h2>
-<p>Venus has been tested on Linux, and Mac OSX, and Windows.</p>
-
-<p>You'll need at least Python 2.2 installed on your system, we recommend
-Python 2.4 though as there may be bugs with the earlier libraries.</p>
-
-<p>Everything Pythonesque Planet needs to provide basic operation should be
-included in the distribution. Some optional features may require
-additional libraries, for example:</p>
-<ul>
-<li>Usage of XSLT requires either
-<a href="http://xmlsoft.org/XSLT/xsltproc2.html">xsltproc</a>
-or <a href="http://xmlsoft.org/XSLT/python.html">python-libxslt</a>.</li>
-<li>The current interface to filters written in non-templating languages
-(e.g., python) uses the
-<a href="http://docs.python.org/lib/module-subprocess.html">subprocess</a>
-module which was introduced in Python 2.4.</li>
-<li>Usage of FOAF as a reading list requires
-<a href="http://librdf.org/">librdf</a>.</li>
-</ul>
-
-<h3>General Instructions</h3>
-
-<p>
-These instructions apply to any platform. Check the instructions
-below for more specific instructions for your platform.
-</p>
-
-<ol>
-<li><p>If you are reading this online, you will need to
-<a href="../index.html">download</a> and extract the files into a folder somewhere.
-You can place this wherever you like, <code>~/planet</code>
-and <code>~/venus</code> are good
-choices, but so's anywhere else you prefer.</p></li>
-<li><p>This is very important: from within that directory, type the following
-command:</p>
-<blockquote><code>python runtests.py</code></blockquote>
-<p>This should take anywhere from a one to ten seconds to execute. No network
-connection is required, and the script cleans up after itself. If the
-script completes with an "OK", you are good to go. Otherwise stopping here
-and inquiring on the
-<a href="http://lists.planetplanet.org/mailman/listinfo/devel">mailing list</a>
- is a good idea as it can save you lots of frustration down the road.</p></li>
-<li><p>Make a copy of one of the <code>ini</code> the files in the
-<a href="../examples">examples</a> subdirectory,
-and put it wherever you like; I like to use the Planet's name (so
-<code>~/planet/debian</code>), but it's really up to you.</p></li>
-<li><p>Edit the <code>config.ini</code> file in this directory to taste,
-it's pretty well documented so you shouldn't have any problems here. Pay
-particular attention to the <code>output_dir</code> option, which should be
-readable by your web server. If the directory you specify in your
-<code>cache_dir</code> exists; make sure that it is empty.</p></li>
-<li><p>Run it: <code>python planet.py pathto/config.ini</code></p>
-<p>You'll want to add this to cron, make sure you run it from the
-right directory.</p></li>
-<li><p>(Optional)</p>
-<p>Tell us about it! We'd love to link to you on planetplanet.org :-)</p></li>
-<li><p>(Optional)</p>
-<p>Build your own themes, templates, or filters! And share!</p></li>
-</ol>
-
-<h3 id="macosx">Mac OS X and Fink Instructions</h3>
-
-<p>
-The <a href="http://fink.sourceforge.net/">Fink Project</a> packages
-various open source software for MacOS. This makes it a little easier
-to get started with projects like Planet Venus.
-</p>
-
-<p>
-Note: in the following, we recommend explicitly
-using <code>python2.4</code>. As of this writing, Fink is starting to
-support <code>python2.5</code> but the XML libraries, for example, are
-not yet ported to the newer python so Venus will be less featureful.
-</p>
-
-<ol>
- <li><p>Install the XCode development tools from your Mac OS X install
- disks</p></li>
- <li><p><a href="http://fink.sourceforge.net/download/">Download</a>
- and install Fink</p></li>
- <li><p>Tell fink to install the Planet Venus prerequisites:<br />
- <code>fink install python24 celementtree-py24 bzr-py24 libxslt-py24
- libxml2-py24</code></p></li>
- <li><p><a href="../index.html">Download</a> and extract the Venus files into a
- folder somewhere</p></li>
- <li><p>Run the tests: <code>python2.4 runtests.py</code><br /> This
- will warn you that the RDF library is missing, but that's
- OK.</p></li>
- <li><p>Continue with the general steps above, starting with Step 3. You
- may want to explicitly specify <code>python2.4</code>.</p></li>
-</ol>
-
-<h3 id="ubuntu">Ubuntu Linux (Edgy Eft) instructions</h3>
-
-<p>Before starting, issue the following command:</p>
-
-<blockquote><pre>sudo apt-get install bzr python2.4-librdf</pre></blockquote>
-
-<h3 id="windows">Windows instructions</h3>
-
-<p>
- htmltmpl templates (and Django too, since it currently piggybacks on
- the htmltmpl implementation) on Windows require
- the <a href="http://sourceforge.net/projects/pywin32/">pywin32</a>
- module.
-</p>
-
-<h3 id="python22">Python 2.2 instructions</h3>
-
-<p>If you are running Python 2.2, you may also need to install <a href="http://pyxml.sourceforge.net/">pyxml</a>. If the
-following runs without error, you do <b>not</b> have the problem.</p>
-<blockquote><pre>python -c "__import__('xml.dom.minidom').dom.minidom.parseString('<entry xml:lang=\"en\"/>')"</pre></blockquote>
-<p>Installation of pyxml varies by platform. For Ubuntu Linux (Dapper Drake), issue the following command:</p>
-
-<blockquote><pre>sudo apt-get install python2.2-xml</pre></blockquote>
-
-</body>
-</html>
Copied: trunk/lib/venus/docs/installation.html (from rev 656, branches/sucs-site/lib/venus/docs/installation.html)
===================================================================
--- trunk/lib/venus/docs/installation.html (rev 0)
+++ trunk/lib/venus/docs/installation.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,129 @@
+<!DOCTYPE html PUBLIC
+ "-//W3C//DTD XHTML 1.1 plus MathML 2.0 plus SVG 1.1//EN"
+ "http://www.w3.org/2002/04/xhtml-math-svg/xhtml-math-svg.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<script type="text/javascript" src="docs.js"></script>
+<link rel="stylesheet" type="text/css" href="docs.css"/>
+<title>Venus Installation</title>
+</head>
+<body>
+<h2>Installation</h2>
+<p>Venus has been tested on Linux, and Mac OSX, and Windows.</p>
+
+<p>You'll need at least Python 2.2 installed on your system, we recommend
+Python 2.4 though as there may be bugs with the earlier libraries.</p>
+
+<p>Everything Pythonesque Planet needs to provide basic operation should be
+included in the distribution. Some optional features may require
+additional libraries, for example:</p>
+<ul>
+<li>Usage of XSLT requires either
+<a href="http://xmlsoft.org/XSLT/xsltproc2.html">xsltproc</a>
+or <a href="http://xmlsoft.org/XSLT/python.html">python-libxslt</a>.</li>
+<li>The current interface to filters written in non-templating languages
+(e.g., python) uses the
+<a href="http://docs.python.org/lib/module-subprocess.html">subprocess</a>
+module which was introduced in Python 2.4.</li>
+<li>Usage of FOAF as a reading list requires
+<a href="http://librdf.org/">librdf</a>.</li>
+</ul>
+
+<h3>General Instructions</h3>
+
+<p>
+These instructions apply to any platform. Check the instructions
+below for more specific instructions for your platform.
+</p>
+
+<ol>
+<li><p>If you are reading this online, you will need to
+<a href="../index.html">download</a> and extract the files into a folder somewhere.
+You can place this wherever you like, <code>~/planet</code>
+and <code>~/venus</code> are good
+choices, but so's anywhere else you prefer.</p></li>
+<li><p>This is very important: from within that directory, type the following
+command:</p>
+<blockquote><code>python runtests.py</code></blockquote>
+<p>This should take anywhere from a one to ten seconds to execute. No network
+connection is required, and the script cleans up after itself. If the
+script completes with an "OK", you are good to go. Otherwise stopping here
+and inquiring on the
+<a href="http://lists.planetplanet.org/mailman/listinfo/devel">mailing list</a>
+ is a good idea as it can save you lots of frustration down the road.</p></li>
+<li><p>Make a copy of one of the <code>ini</code> the files in the
+<a href="../examples">examples</a> subdirectory,
+and put it wherever you like; I like to use the Planet's name (so
+<code>~/planet/debian</code>), but it's really up to you.</p></li>
+<li><p>Edit the <code>config.ini</code> file in this directory to taste,
+it's pretty well documented so you shouldn't have any problems here. Pay
+particular attention to the <code>output_dir</code> option, which should be
+readable by your web server. If the directory you specify in your
+<code>cache_dir</code> exists; make sure that it is empty.</p></li>
+<li><p>Run it: <code>python planet.py pathto/config.ini</code></p>
+<p>You'll want to add this to cron, make sure you run it from the
+right directory.</p></li>
+<li><p>(Optional)</p>
+<p>Tell us about it! We'd love to link to you on planetplanet.org :-)</p></li>
+<li><p>(Optional)</p>
+<p>Build your own themes, templates, or filters! And share!</p></li>
+</ol>
+
+<h3 id="macosx">Mac OS X and Fink Instructions</h3>
+
+<p>
+The <a href="http://fink.sourceforge.net/">Fink Project</a> packages
+various open source software for MacOS. This makes it a little easier
+to get started with projects like Planet Venus.
+</p>
+
+<p>
+Note: in the following, we recommend explicitly
+using <code>python2.4</code>. As of this writing, Fink is starting to
+support <code>python2.5</code> but the XML libraries, for example, are
+not yet ported to the newer python so Venus will be less featureful.
+</p>
+
+<ol>
+ <li><p>Install the XCode development tools from your Mac OS X install
+ disks</p></li>
+ <li><p><a href="http://fink.sourceforge.net/download/">Download</a>
+ and install Fink</p></li>
+ <li><p>Tell fink to install the Planet Venus prerequisites:<br />
+ <code>fink install python24 celementtree-py24 bzr-py24 libxslt-py24
+ libxml2-py24</code></p></li>
+ <li><p><a href="../index.html">Download</a> and extract the Venus files into a
+ folder somewhere</p></li>
+ <li><p>Run the tests: <code>python2.4 runtests.py</code><br /> This
+ will warn you that the RDF library is missing, but that's
+ OK.</p></li>
+ <li><p>Continue with the general steps above, starting with Step 3. You
+ may want to explicitly specify <code>python2.4</code>.</p></li>
+</ol>
+
+<h3 id="ubuntu">Ubuntu Linux (Edgy Eft) instructions</h3>
+
+<p>Before starting, issue the following command:</p>
+
+<blockquote><pre>sudo apt-get install bzr python2.4-librdf</pre></blockquote>
+
+<h3 id="windows">Windows instructions</h3>
+
+<p>
+ htmltmpl templates (and Django too, since it currently piggybacks on
+ the htmltmpl implementation) on Windows require
+ the <a href="http://sourceforge.net/projects/pywin32/">pywin32</a>
+ module.
+</p>
+
+<h3 id="python22">Python 2.2 instructions</h3>
+
+<p>If you are running Python 2.2, you may also need to install <a href="http://pyxml.sourceforge.net/">pyxml</a>. If the
+following runs without error, you do <b>not</b> have the problem.</p>
+<blockquote><pre>python -c "__import__('xml.dom.minidom').dom.minidom.parseString('<entry xml:lang=\"en\"/>')"</pre></blockquote>
+<p>Installation of pyxml varies by platform. For Ubuntu Linux (Dapper Drake), issue the following command:</p>
+
+<blockquote><pre>sudo apt-get install python2.2-xml</pre></blockquote>
+
+</body>
+</html>
Deleted: trunk/lib/venus/docs/migration.html
===================================================================
--- branches/sucs-site/lib/venus/docs/migration.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/lib/venus/docs/migration.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,42 +0,0 @@
-<!DOCTYPE html PUBLIC
- "-//W3C//DTD XHTML 1.1 plus MathML 2.0 plus SVG 1.1//EN"
- "http://www.w3.org/2002/04/xhtml-math-svg/xhtml-math-svg.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<script type="text/javascript" src="docs.js"></script>
-<link rel="stylesheet" type="text/css" href="docs.css"/>
-<title>Venus Migration</title>
-</head>
-<body>
-<h2>Migration from Planet 2.0</h2>
-<p>The intent is that existing Planet 2.0 users should be able to reuse
-their existing <code>config.ini</code> and <code>.tmpl</code> files,
-but the reality is that users will need to be aware of the following:</p>
-<ul>
-<li>You will need to start over with a new cache directory as the format
-of the cache has changed dramatically.</li>
-<li>Existing <code>.tmpl</code> and <code>.ini</code> files should work,
-though some <a href="config.html">configuration</a> options (e.g.,
-<code>days_per_page</code>) have not yet been implemented</li>
-<li>No testing has been done on Python 2.1, and it is presumed not to work.</li>
-<li>To take advantage of all features, you should install the optional
-XML and RDF libraries described on
-the <a href="installation.html">Installation</a> page.</li>
-</ul>
-
-<p>
-Common changes to config.ini include:
-</p>
-<ul>
- <li><p>Filename changes:</p>
-<pre>
-examples/fancy/index.html.tmpl => themes/classic_fancy/index.html.tmpl
-examples/atom.xml.tmpl => themes/common/atom.xml.xslt
-examples/rss20.xml.tmpl => themes/common/rss20.xml.tmpl
-examples/rss10.xml.tmpl => themes/common/rss10.xml.tmpl
-examples/opml.xml.tmpl => themes/common/opml.xml.xslt
-examples/foafroll.xml.tmpl => themes/common/foafroll.xml.xslt
-</pre></li>
-</ul>
-</body>
-</html>
Copied: trunk/lib/venus/docs/migration.html (from rev 656, branches/sucs-site/lib/venus/docs/migration.html)
===================================================================
--- trunk/lib/venus/docs/migration.html (rev 0)
+++ trunk/lib/venus/docs/migration.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,42 @@
+<!DOCTYPE html PUBLIC
+ "-//W3C//DTD XHTML 1.1 plus MathML 2.0 plus SVG 1.1//EN"
+ "http://www.w3.org/2002/04/xhtml-math-svg/xhtml-math-svg.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<script type="text/javascript" src="docs.js"></script>
+<link rel="stylesheet" type="text/css" href="docs.css"/>
+<title>Venus Migration</title>
+</head>
+<body>
+<h2>Migration from Planet 2.0</h2>
+<p>The intent is that existing Planet 2.0 users should be able to reuse
+their existing <code>config.ini</code> and <code>.tmpl</code> files,
+but the reality is that users will need to be aware of the following:</p>
+<ul>
+<li>You will need to start over with a new cache directory as the format
+of the cache has changed dramatically.</li>
+<li>Existing <code>.tmpl</code> and <code>.ini</code> files should work,
+though some <a href="config.html">configuration</a> options (e.g.,
+<code>days_per_page</code>) have not yet been implemented</li>
+<li>No testing has been done on Python 2.1, and it is presumed not to work.</li>
+<li>To take advantage of all features, you should install the optional
+XML and RDF libraries described on
+the <a href="installation.html">Installation</a> page.</li>
+</ul>
+
+<p>
+Common changes to config.ini include:
+</p>
+<ul>
+ <li><p>Filename changes:</p>
+<pre>
+examples/fancy/index.html.tmpl => themes/classic_fancy/index.html.tmpl
+examples/atom.xml.tmpl => themes/common/atom.xml.xslt
+examples/rss20.xml.tmpl => themes/common/rss20.xml.tmpl
+examples/rss10.xml.tmpl => themes/common/rss10.xml.tmpl
+examples/opml.xml.tmpl => themes/common/opml.xml.xslt
+examples/foafroll.xml.tmpl => themes/common/foafroll.xml.xslt
+</pre></li>
+</ul>
+</body>
+</html>
Deleted: trunk/lib/venus/docs/normalization.html
===================================================================
--- branches/sucs-site/lib/venus/docs/normalization.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/lib/venus/docs/normalization.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,107 +0,0 @@
-<!DOCTYPE html PUBLIC
- "-//W3C//DTD XHTML 1.1 plus MathML 2.0 plus SVG 1.1//EN"
- "http://www.w3.org/2002/04/xhtml-math-svg/xhtml-math-svg.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<script type="text/javascript" src="docs.js"></script>
-<link rel="stylesheet" type="text/css" href="docs.css"/>
-<title>Venus Normalization</title>
-</head>
-<body>
-<h2>Normalization</h2>
-<p>Venus builds on, and extends, the <a
-href="http://www.feedparser.org/">Universal Feed Parser</a> and <a
-href="http://code.google.com/p/html5lib/">html5lib</a> to
-convert all feeds into Atom 1.0, with well formed XHTML, and encoded as UTF-8,
-meaning that you don't have to worry about funky feeds, tag soup, or character
-encoding.</p>
-<h3>Encoding</h3>
-<p>Input data in feeds may be encoded in a variety of formats, most commonly
-ASCII, ISO-8859-1, WIN-1252, AND UTF-8. Additionally, many feeds make use of
-the wide range of
-<a href="http://www.w3.org/TR/html401/sgml/entities.html">character entity
-references</a> provided by HTML. Each is converted to UTF-8, an encoding
-which is a proper superset of ASCII, supports the entire range of Unicode
-characters, and is one of
-<a href="http://www.w3.org/TR/2006/REC-xml-20060816/#charsets">only two</a>
-encodings required to be supported by all conformant XML processors.</p>
-<p>Encoding problems are one of the more common feed errors, and every
-attempt is made to correct common errors, such as the inclusion of
-the so-called
-<a href="http://www.fourmilab.ch/webtools/demoroniser/">moronic</a> versions
-of smart-quotes. In rare cases where individual characters can not be
-converted to valid UTF-8 or into
-<a href="http://www.w3.org/TR/xml/#charsets">characters allowed in XML 1.0
-documents</a>, such characters will be replaced with the Unicode
-<a href="http://www.fileformat.info/info/unicode/char/fffd/index.htm">Replacement character</a>, with a title that describes the original character whenever possible.</p>
-<p>In order to support the widest range of inputs, use of Python 2.3 or later,
-as well as the installation of the python <code>iconvcodec</code>, is
-recommended.</p>
-<h3>HTML</h3>
-<p>A number of different normalizations of HTML are performed. For starters,
-the HTML is
-<a href="http://www.feedparser.org/docs/html-sanitization.html">sanitized</a>,
-meaning that HTML tags and attributes that could introduce javascript or
-other security risks are removed.</p>
-<p>Then,
-<a href="http://www.feedparser.org/docs/resolving-relative-links.html">relative
-links are resolved</a> within the HTML. This is also done for links
-in other areas in the feed too.</p>
-<p>Finally, unmatched tags are closed. This is done with a
-<a href="http://code.google.com/p/html5lib/">knowledge of the semantics of HTML</a>. Additionally, a
-<a href="http://golem.ph.utexas.edu/~distler/blog/archives/000165.html#sanitizespec">large
-subset of MathML</a>, as well as a
-<a href="http://www.w3.org/TR/SVGMobile/">tiny profile of SVG</a>
-is also supported.</p>
-<h3>Atom 1.0</h3>
-<p>The Universal Feed Parser also
-<a href="http://www.feedparser.org/docs/content-normalization.html">normalizes the content of feeds</a>. This involves a
-<a href="http://www.feedparser.org/docs/reference.html">large number of elements</a>; the best place to start is to look at
-<a href="http://www.feedparser.org/docs/annotated-examples.html">annotated examples</a>. Among other things a wide variety of
-<a href="http://www.feedparser.org/docs/date-parsing.html">date formats</a>
-are converted into
-<a href="http://www.ietf.org/rfc/rfc3339.txt">RFC 3339</a> formatted dates.</p>
-<p>If no <a href="http://www.feedparser.org/docs/reference-entry-id.html">ids</a> are found in entries, attempts are made to synthesize one using (in order):</p>
-<ul>
-<li><a href="http://www.feedparser.org/docs/reference-entry-link.html">link</a></li>
-<li><a href="http://www.feedparser.org/docs/reference-entry-title.html">title</a></li>
-<li><a href="http://www.feedparser.org/docs/reference-entry-summary.html">summary</a></li>
-<li><a href="http://www.feedparser.org/docs/reference-entry-content.html">content</a></li>
-</ul>
-<p>If no <a href="http://www.feedparser.org/docs/reference-feed-
-updated.html">updated</a> dates are found in an entry, the updated date from
-the feed is used. If no updated date is found in either the feed or
-the entry, the current time is substituted.</p>
-<h3 id="overrides">Overrides</h3>
-<p>All of the above describes what Venus does automatically, either directly
-or through its dependencies. There are a number of errors which can not
-be corrected automatically, and for these, there are configuration parameters
-that can be used to help.</p>
-<ul>
-<li><code>ignore_in_feed</code> allows you to list any number of elements
-or attributes which are to be ignored in feeds. This is often handy in the
-case of feeds where the <code>author</code>, <code>id</code>,
-<code>updated</code> or <code>xml:lang</code> values can't be trusted.</li>
-<li><code>title_type</code>, <code>summary_type</code>,
-<code>content_type</code> allow you to override the
-<a href="http://www.feedparser.org/docs/reference-entry-title_detail.html#reference.entry.title_detail.type"><code>type</code></a>
-attributes on these elements.</li>
-<li><code>name_type</code> does something similar for
-<a href="http://www.feedparser.org/docs/reference-entry-author_detail.html#reference.entry.author_detail.name">author names</a></li>
-<li><code>future_dates</code> allows you to specify how to deal with dates which are in the future.
-<ul style="margin:0">
-<li><code>ignore_date</code> will cause the date to be ignored (and will therefore default to the time the entry was first seen) until the feed is updated and the time indicated is past, at which point the entry will be updated with the new date.</li>
-<li><code>ignore_entry</code> will cause the entire entry containing the future date to be ignored until the date is past.</li>
-<li>Anything else (i.e.. the default) will leave the date as is, causing the entries that contain these dates sort to the top of the planet until the time passes.</li>
-</ul>
-</li>
-<li><code>xml_base</code> will adjust the <code>xml:base</code> values in effect for each of the text constructs in the feed (things like <code>title</code>, <code>summary</code>, and <code>content</code>). Other elements in the feed (most notably, <code>link</code> are not affected by this value.
-<ul style="margin:0">
-<li><code>feed_alternate</code> will replace the <code>xml:base</code> in effect with the value of the <code>alternate</code> <code>link</code> found either in the enclosed <code>source</code> or enclosing <code>feed</code> element.</li>
-<li><code>entry_alternate</code> will replace the <code>xml:base</code> in effect with the value of the <code>alternate</code> <code>link</code> found in this entry.</li>
-<li>Any other value will be treated as a <a href="http://www.ietf.org/rfc/rfc3986.txt">URI reference</a>. These values may be relative or absolute. If relative, the <code>xml:base</code> values in each text construct will each be adjusted separately using to the specified value.</li>
-</ul>
-</li>
-</ul>
-</body>
-</html>
Copied: trunk/lib/venus/docs/normalization.html (from rev 656, branches/sucs-site/lib/venus/docs/normalization.html)
===================================================================
--- trunk/lib/venus/docs/normalization.html (rev 0)
+++ trunk/lib/venus/docs/normalization.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,107 @@
+<!DOCTYPE html PUBLIC
+ "-//W3C//DTD XHTML 1.1 plus MathML 2.0 plus SVG 1.1//EN"
+ "http://www.w3.org/2002/04/xhtml-math-svg/xhtml-math-svg.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<script type="text/javascript" src="docs.js"></script>
+<link rel="stylesheet" type="text/css" href="docs.css"/>
+<title>Venus Normalization</title>
+</head>
+<body>
+<h2>Normalization</h2>
+<p>Venus builds on, and extends, the <a
+href="http://www.feedparser.org/">Universal Feed Parser</a> and <a
+href="http://code.google.com/p/html5lib/">html5lib</a> to
+convert all feeds into Atom 1.0, with well formed XHTML, and encoded as UTF-8,
+meaning that you don't have to worry about funky feeds, tag soup, or character
+encoding.</p>
+<h3>Encoding</h3>
+<p>Input data in feeds may be encoded in a variety of formats, most commonly
+ASCII, ISO-8859-1, WIN-1252, AND UTF-8. Additionally, many feeds make use of
+the wide range of
+<a href="http://www.w3.org/TR/html401/sgml/entities.html">character entity
+references</a> provided by HTML. Each is converted to UTF-8, an encoding
+which is a proper superset of ASCII, supports the entire range of Unicode
+characters, and is one of
+<a href="http://www.w3.org/TR/2006/REC-xml-20060816/#charsets">only two</a>
+encodings required to be supported by all conformant XML processors.</p>
+<p>Encoding problems are one of the more common feed errors, and every
+attempt is made to correct common errors, such as the inclusion of
+the so-called
+<a href="http://www.fourmilab.ch/webtools/demoroniser/">moronic</a> versions
+of smart-quotes. In rare cases where individual characters can not be
+converted to valid UTF-8 or into
+<a href="http://www.w3.org/TR/xml/#charsets">characters allowed in XML 1.0
+documents</a>, such characters will be replaced with the Unicode
+<a href="http://www.fileformat.info/info/unicode/char/fffd/index.htm">Replacement character</a>, with a title that describes the original character whenever possible.</p>
+<p>In order to support the widest range of inputs, use of Python 2.3 or later,
+as well as the installation of the python <code>iconvcodec</code>, is
+recommended.</p>
+<h3>HTML</h3>
+<p>A number of different normalizations of HTML are performed. For starters,
+the HTML is
+<a href="http://www.feedparser.org/docs/html-sanitization.html">sanitized</a>,
+meaning that HTML tags and attributes that could introduce javascript or
+other security risks are removed.</p>
+<p>Then,
+<a href="http://www.feedparser.org/docs/resolving-relative-links.html">relative
+links are resolved</a> within the HTML. This is also done for links
+in other areas in the feed too.</p>
+<p>Finally, unmatched tags are closed. This is done with a
+<a href="http://code.google.com/p/html5lib/">knowledge of the semantics of HTML</a>. Additionally, a
+<a href="http://golem.ph.utexas.edu/~distler/blog/archives/000165.html#sanitizespec">large
+subset of MathML</a>, as well as a
+<a href="http://www.w3.org/TR/SVGMobile/">tiny profile of SVG</a>
+is also supported.</p>
+<h3>Atom 1.0</h3>
+<p>The Universal Feed Parser also
+<a href="http://www.feedparser.org/docs/content-normalization.html">normalizes the content of feeds</a>. This involves a
+<a href="http://www.feedparser.org/docs/reference.html">large number of elements</a>; the best place to start is to look at
+<a href="http://www.feedparser.org/docs/annotated-examples.html">annotated examples</a>. Among other things a wide variety of
+<a href="http://www.feedparser.org/docs/date-parsing.html">date formats</a>
+are converted into
+<a href="http://www.ietf.org/rfc/rfc3339.txt">RFC 3339</a> formatted dates.</p>
+<p>If no <a href="http://www.feedparser.org/docs/reference-entry-id.html">ids</a> are found in entries, attempts are made to synthesize one using (in order):</p>
+<ul>
+<li><a href="http://www.feedparser.org/docs/reference-entry-link.html">link</a></li>
+<li><a href="http://www.feedparser.org/docs/reference-entry-title.html">title</a></li>
+<li><a href="http://www.feedparser.org/docs/reference-entry-summary.html">summary</a></li>
+<li><a href="http://www.feedparser.org/docs/reference-entry-content.html">content</a></li>
+</ul>
+<p>If no <a href="http://www.feedparser.org/docs/reference-feed-
+updated.html">updated</a> dates are found in an entry, the updated date from
+the feed is used. If no updated date is found in either the feed or
+the entry, the current time is substituted.</p>
+<h3 id="overrides">Overrides</h3>
+<p>All of the above describes what Venus does automatically, either directly
+or through its dependencies. There are a number of errors which can not
+be corrected automatically, and for these, there are configuration parameters
+that can be used to help.</p>
+<ul>
+<li><code>ignore_in_feed</code> allows you to list any number of elements
+or attributes which are to be ignored in feeds. This is often handy in the
+case of feeds where the <code>author</code>, <code>id</code>,
+<code>updated</code> or <code>xml:lang</code> values can't be trusted.</li>
+<li><code>title_type</code>, <code>summary_type</code>,
+<code>content_type</code> allow you to override the
+<a href="http://www.feedparser.org/docs/reference-entry-title_detail.html#reference.entry.title_detail.type"><code>type</code></a>
+attributes on these elements.</li>
+<li><code>name_type</code> does something similar for
+<a href="http://www.feedparser.org/docs/reference-entry-author_detail.html#reference.entry.author_detail.name">author names</a></li>
+<li><code>future_dates</code> allows you to specify how to deal with dates which are in the future.
+<ul style="margin:0">
+<li><code>ignore_date</code> will cause the date to be ignored (and will therefore default to the time the entry was first seen) until the feed is updated and the time indicated is past, at which point the entry will be updated with the new date.</li>
+<li><code>ignore_entry</code> will cause the entire entry containing the future date to be ignored until the date is past.</li>
+<li>Anything else (i.e.. the default) will leave the date as is, causing the entries that contain these dates sort to the top of the planet until the time passes.</li>
+</ul>
+</li>
+<li><code>xml_base</code> will adjust the <code>xml:base</code> values in effect for each of the text constructs in the feed (things like <code>title</code>, <code>summary</code>, and <code>content</code>). Other elements in the feed (most notably, <code>link</code> are not affected by this value.
+<ul style="margin:0">
+<li><code>feed_alternate</code> will replace the <code>xml:base</code> in effect with the value of the <code>alternate</code> <code>link</code> found either in the enclosed <code>source</code> or enclosing <code>feed</code> element.</li>
+<li><code>entry_alternate</code> will replace the <code>xml:base</code> in effect with the value of the <code>alternate</code> <code>link</code> found in this entry.</li>
+<li>Any other value will be treated as a <a href="http://www.ietf.org/rfc/rfc3986.txt">URI reference</a>. These values may be relative or absolute. If relative, the <code>xml:base</code> values in each text construct will each be adjusted separately using to the specified value.</li>
+</ul>
+</li>
+</ul>
+</body>
+</html>
Deleted: trunk/lib/venus/docs/templates.html
===================================================================
--- branches/sucs-site/lib/venus/docs/templates.html 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/lib/venus/docs/templates.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,184 +0,0 @@
-<!DOCTYPE html PUBLIC
- "-//W3C//DTD XHTML 1.1 plus MathML 2.0 plus SVG 1.1//EN"
- "http://www.w3.org/2002/04/xhtml-math-svg/xhtml-math-svg.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<script type="text/javascript" src="docs.js"></script>
-<link rel="stylesheet" type="text/css" href="docs.css"/>
-<title>Venus Templates</title>
-</head>
-<body>
-<h2>Templates</h2>
-<p>Template names take the form
-<em>name</em><code>.</code><em>ext</em><code>.</code><em>type</em>, where
-<em>name</em><code>.</code><em>ext</em> identifies the name of the output file
-to be created in the <code>output_directory</code>, and <em>type</em>
-indicates which language processor to use for the template.</p>
-<p>Like with <a href="filter.html">filters</a>, templates may be written
-in a variety of languages and are based on the standard Unix pipe convention
-of producing <code>stdout</code> from <code>stdin</code>, but in practice
-two languages are used more than others:</p>
-<h3>htmltmpl</h3>
-<p>Many find <a href="http://htmltmpl.sourceforge.net/">htmltmpl</a>
-easier to get started with as you can take a simple example of your
-output file, sprinkle in a few <code><TMPL_VAR></code>s and
-<code><TMPL_LOOP></code>s and you are done. Eventually, however,
-you may find that your template involves <code><TMPL_IF></code>
-blocks inside of attribute values, and you may find the result difficult
-to read and create correctly.</p>
-<p>It is also important to note that htmltmpl based templates do not
-have access to the full set of information available in the feed, just
-the following (rather substantial) subset:</p>
-
-<blockquote>
-<table border="1" cellpadding="5" cellspacing="0">
-<tr><th>VAR</th><th>type</th><th>source</th></tr>
-<tr><td>author</td><td>String</td><td><a href="http://feedparser.org/docs/reference-feed-author.html">author</a></td></tr>
-<tr><td>author_name</td><td>String</td><td><a href="http://feedparser.org/docs/reference-feed-author_detail.html#reference.feed.author_detail.name">author_detail.name</a></td></tr>
-<tr><td>generator</td><td>String</td><td><a href="http://feedparser.org/docs/reference-feed-generator.html">generator</a></td></tr>
-<tr><td>id</td><td>String</td><td><a href="http://feedparser.org/docs/reference-feed-id.html">id</a></td></tr>
-<tr><td>icon</td><td>String</td><td><a href="http://feedparser.org/docs/reference-feed-icon.html">icon</a></td></tr>
-<tr><td>last_updated_822</td><td>Rfc822</td><td><a href="http://feedparser.org/docs/reference-feed-icon.html">updated_parsed</a></td></tr>
-<tr><td>last_updated_iso</td><td>Rfc3399</td><td><a href="http://feedparser.org/docs/reference-feed-icon.html">updated_parsed</a></td></tr>
-<tr><td>last_updated</td><td>PlanetDate</td><td><a href="http://feedparser.org/docs/reference-feed-icon.html">updated_parsed</a></td></tr>
-<tr><td>link</td><td>String</td><td><a href="http://feedparser.org/docs/reference-feed-link.html">link</a></td></tr>
-<tr><td>logo</td><td>String</td><td><a href="http://feedparser.org/docs/reference-feed-logo.html">logo</a></td></tr>
-<tr><td>rights</td><td>String</td><td><a href="http://feedparser.org/docs/reference-feed-rights_detail.html#reference.feed.rights_detail.value">rights_detail.value</a></td></tr>
-<tr><td>subtitle</td><td>String</td><td><a href="http://feedparser.org/docs/reference-feed-subtitle_detail.html#reference.feed.subtitle_detail.value">subtitle_detail.value</a></td></tr>
-<tr><td>title</td><td>String</td><td><a href="http://feedparser.org/docs/reference-feed-title_detail.html#reference.feed.title_detail.value">title_detail.value</a></td></tr>
-<tr><td>title_plain</td><td>Plain</td><td><a href="http://feedparser.org/docs/reference-feed-title_detail.html#reference.feed.title_detail.value">title_detail.value</a></td></tr>
-<tr><td rowspan="2">url</td><td rowspan="2">String</td><td><a href="http://feedparser.org/docs/reference-feed-links.html#reference.feed.links.href">links[rel='self'].href</a></td></tr>
-<tr><td><a href="http://feedparser.org/docs/reference-headers.html">headers['location']</a></td></tr>
-</table>
-</blockquote>
-
-<p>Note: when multiple sources are listed, the last one wins</p>
-<p>In addition to these variables, Planet Venus makes available two
-arrays, <code>Channels</code> and <code>Items</code>, with one entry
-per subscription and per output entry respectively. The data values
-within the <code>Channels</code> array exactly match the above list.
-The data values within the <code>Items</code> array are as follows:</p>
-
-<blockquote>
-<table border="1" cellpadding="5" cellspacing="0">
-<tr><th>VAR</th><th>type</th><th>source</th></tr>
-<tr><td>author</td><td>String</td><td><a href="http://feedparser.org/docs/reference-entry-author.html">author</a></td></tr>
-<tr><td>author_email</td><td>String</td><td><a href="http://feedparser.org/docs/reference-entry-author_detail.html#reference.entry.author_detail.email">author_detail.email</a></td></tr>
-<tr><td>author_name</td><td>String</td><td><a href="http://feedparser.org/docs/reference-entry-author_detail.html#reference.entry.author_detail.name">author_detail.name</a></td></tr>
-<tr><td>author_uri</td><td>String</td><td><a href="http://feedparser.org/docs/reference-entry-author_detail.html#reference.entry.author_detail.href">author_detail.href</a></td></tr>
-<tr><td>content_language</td><td>String</td><td><a href="http://feedparser.org/docs/reference-entry-content.html#reference.entry.content.language">content[0].language</a></td></tr>
-<tr><td rowspan="2">content</td><td rowspan="2">String</td><td><a href="http://feedparser.org/docs/reference-entry-summary_detail.html#reference.entry.summary_detail.value">summary_detail.value</a></td></tr>
-<tr><td><a href="http://feedparser.org/docs/reference-entry-content.html#reference.entry.content.value">content[0].value</a></td></tr>
-<tr><td rowspan="2">date</td><td rowspan="2">PlanetDate</td><td><a href="http://feedparser.org/docs/reference-entry-published_parsed.html">published_parsed</a></td></tr>
-<tr><td><a href="http://feedparser.org/docs/reference-entry-updated_parsed.html">updated_parsed</a></td></tr>
-<tr><td rowspan="2">date_822</td><td rowspan="2">Rfc822</td><td><a href="http://feedparser.org/docs/reference-entry-published_parsed.html">published_parsed</a></td></tr>
-<tr><td><a href="http://feedparser.org/docs/reference-entry-updated_parsed.html">updated_parsed</a></td></tr>
-<tr><td rowspan="2">date_iso</td><td rowspan="2">Rfc3399</td><td><a href="http://feedparser.org/docs/reference-entry-published_parsed.html">published_parsed</a></td></tr>
-<tr><td><a href="http://feedparser.org/docs/reference-entry-updated_parsed.html">updated_parsed</a></td></tr>
-<tr><td><ins>enclosure_href</ins></td><td>String</td><td><a href="http://feedparser.org/docs/reference-entry-enclosures.html#reference.entry.enclosures.href">enclosures[0].href</a></td></tr>
-<tr><td><ins>enclosure_length</ins></td><td>String</td><td><a href="http://feedparser.org/docs/reference-entry-enclosures.html#reference.entry.enclosures.length">enclosures[0].length</a></td></tr>
-<tr><td><ins>enclosure_type</ins></td><td>String</td><td><a href="http://feedparser.org/docs/reference-entry-enclosures.html#reference.entry.enclosures.type">enclosures[0].type</a></td></tr>
-<tr><td><ins>guid_isPermaLink</ins></td><td>String</td><td><a href="http://blogs.law.harvard.edu/tech/rss#ltguidgtSubelementOfLtitemgt">isPermaLink</a></td></tr>
-<tr><td>id</td><td>String</td><td><a href="http://feedparser.org/docs/reference-entry-id.html">id</a></td></tr>
-<tr><td>link</td><td>String</td><td><a href="http://feedparser.org/docs/reference-entry-links.html#reference.entry.links.href">links[rel='alternate'].href</a></td></tr>
-<tr><td>new_channel</td><td>String</td><td><a href="http://feedparser.org/docs/reference-entry-id.html">id</a></td></tr>
-<tr><td rowspan="2">new_date</td><td rowspan="2">NewDate</td><td><a href="http://feedparser.org/docs/reference-entry-published_parsed.html">published_parsed</a></td></tr>
-<tr><td><a href="http://feedparser.org/docs/reference-entry-updated_parsed.html">updated_parsed</a></td></tr>
-<tr><td>rights</td><td>String</td><td><a href="http://feedparser.org/docs/reference-entry-rights_detail.html#reference.entry.rights_detail.value">rights_detail.value</a></td></tr>
-<tr><td>title_language</td><td>String</td><td><a href="http://feedparser.org/docs/reference-entry-title_detail.html#reference.entry.title_detail.language">title_detail.language</a></td></tr>
-<tr><td>title_plain</td><td>Plain</td><td><a href="http://feedparser.org/docs/reference-entry-title_detail.html#reference.entry.title_detail.value">title_detail.value</a></td></tr>
-<tr><td>title</td><td>String</td><td><a href="http://feedparser.org/docs/reference-entry-title_detail.html#reference.entry.title_detail.value">title_detail.value</a></td></tr>
-<tr><td>summary_language</td><td>String</td><td><a href="http://feedparser.org/docs/reference-entry-summary_detail.html#reference.entry.summary_detail.language">summary_detail.language</a></td></tr>
-<tr><td>updated</td><td>PlanetDate</td><td><a href="http://feedparser.org/docs/reference-entry-updated_parsed.html">updated_parsed</a></td></tr>
-<tr><td>updated_822</td><td>Rfc822</td><td><a href="http://feedparser.org/docs/reference-entry-updated_parsed.html">updated_parsed</a></td></tr>
-<tr><td>updated_iso</td><td>Rfc3399</td><td><a href="http://feedparser.org/docs/reference-entry-updated_parsed.html">updated_parsed</a></td></tr>
-<tr><td>published</td><td>PlanetDate</td><td><a href="http://feedparser.org/docs/reference-entry-published_parsed.html">published_parsed</a></td></tr>
-<tr><td>published_822</td><td>Rfc822</td><td><a href="http://feedparser.org/docs/reference-entry-published_parsed.html">published_parsed</a></td></tr>
-<tr><td>published_iso</td><td>Rfc3399</td><td><a href="http://feedparser.org/docs/reference-entry-published_parsed.html">published_parsed</a></td></tr>
-</table>
-</blockquote>
-<p>Note: variables above which start with
-<code>new_</code> are only set if their values differ from the previous
-Item.</p>
-
-<h3>django</h3>
-
-<p>
- If you have the <a href="http://www.djangoproject.com/">Django</a>
- framework installed,
- <a href="http://www.djangoproject.com/documentation/templates/"
- >Django templates</a> are automatically available to Venus
- projects. You will have to save them with a <code>.html.dj</code>
- extension in your themes. The variable set is the same as the one
- from htmltmpl, above. In the Django template context you'll have
- access to <code>Channels</code> and <code>Items</code> and you'll be
- able to iterate through them.
-</p>
-
-<p>
- You also have access to the <code>Config</code> dictionary, which contains
- the Venus configuration variables from your <code>.ini</code> file.
-</p>
-
-<p>
- If you lose your way and want to introspect all the variable in the
- context, there's the useful <code>{% debug %}</code> template tag.
-</p>
-
-<p>
- In the <code>themes/django/</code> you'll find a sample Venus theme
- that uses the Django templates that might be a starting point for
- your own custom themes.
-</p>
-
-<p>
- All the standard Django template tags and filter are supposed to
- work, with the notable exception of the <code>date</code> filter on
- the updated and published dates of an item (it works on the main
- <code>{{ date }}</code> variable).
-</p>
-
-<p>
- Please note that Django, and therefore Venus' Django support,
- requires at least Python 2.3.
-</p>
-
-<h3>xslt</h3>
-<p><a href="http://www.w3.org/TR/xslt">XSLT</a> is a paradox: it actually
-makes some simple things easier to do than htmltmpl, and certainly can
-make more difficult things possible; but it is fair to say that many
-find XSLT less approachable than htmltmpl.</p>
-<p>But in any case, the XSLT support is easier to document as the
-input is a <a href="normalization.html">highly normalized</a> feed,
-with a few extension elements.</p>
-<ul>
-<li><code>atom:feed</code> will have the following child elements:
-<ul>
-<li>A <code>planet:source</code> element per subscription, with the same child elements as <a href="http://www.atomenabled.org/developers/syndication/atom-format-spec.php#element.source"><code>atom:source</code></a>, as well as
-an additional child element in the planet namespace for each
-<a href="config.html#subscription">configuration parameter</a> that applies to
-this subscription.</li>
-<li><a href="http://www.feedparser.org/docs/reference-version.html"><code>planet:format</code></a> indicating the format and version of the source feed.</li>
-<li><a href="http://www.feedparser.org/docs/reference-bozo.html"><code>planet:bozo</code></a> which is either <code>true</code> or <code>false</code>.</li>
-</ul>
-</li>
-<li><code>atom:updated</code> and <code>atom:published</code> will have
-a <code>planet:format</code> attribute containing the referenced date
-formatted according to the <code>[planet] date_format</code> specified
-in the configuration</li>
-</ul>
-
-<h3>genshi</h3>
-<p>Genshi approaches the power of XSLT, but with a syntax that many Python
-programmers find more natural, succinct and expressive. Genshi templates
-have access to the full range of <a href="http://feedparser.org/docs/reference.html">feedparser</a> values, with the following additions:</p>
-<ul>
-<li>In addition to a <code>feed</code> element which describes the feed
-for your planet, there is also a <code>feeds</code> element which contains
-the description for each subscription.</li>
-<li>All <code>feed</code>, <code>feeds</code>, and <code>source</code> elements have a child <code>config</code> element which contains the config.ini entries associated with that feed.</li>
-<li>All text construct detail elements (<code>subtitle</code>, <code>rights</code>, <code>title</code>, <code>summary</code>, <code>content</code>) also contain a <code>stream</code> element which contains the value as a Genshi stream.</li>
-<li>Each of the <code>entries</code> has a <code>new_date</code> and <code>new_feed</code> value which indicates if this entry's date or feed differs from the preceeding entry.</li>
-</ul>
-</body>
-</html>
Copied: trunk/lib/venus/docs/templates.html (from rev 656, branches/sucs-site/lib/venus/docs/templates.html)
===================================================================
--- trunk/lib/venus/docs/templates.html (rev 0)
+++ trunk/lib/venus/docs/templates.html 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,184 @@
+<!DOCTYPE html PUBLIC
+ "-//W3C//DTD XHTML 1.1 plus MathML 2.0 plus SVG 1.1//EN"
+ "http://www.w3.org/2002/04/xhtml-math-svg/xhtml-math-svg.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<script type="text/javascript" src="docs.js"></script>
+<link rel="stylesheet" type="text/css" href="docs.css"/>
+<title>Venus Templates</title>
+</head>
+<body>
+<h2>Templates</h2>
+<p>Template names take the form
+<em>name</em><code>.</code><em>ext</em><code>.</code><em>type</em>, where
+<em>name</em><code>.</code><em>ext</em> identifies the name of the output file
+to be created in the <code>output_directory</code>, and <em>type</em>
+indicates which language processor to use for the template.</p>
+<p>Like with <a href="filter.html">filters</a>, templates may be written
+in a variety of languages and are based on the standard Unix pipe convention
+of producing <code>stdout</code> from <code>stdin</code>, but in practice
+two languages are used more than others:</p>
+<h3>htmltmpl</h3>
+<p>Many find <a href="http://htmltmpl.sourceforge.net/">htmltmpl</a>
+easier to get started with as you can take a simple example of your
+output file, sprinkle in a few <code><TMPL_VAR></code>s and
+<code><TMPL_LOOP></code>s and you are done. Eventually, however,
+you may find that your template involves <code><TMPL_IF></code>
+blocks inside of attribute values, and you may find the result difficult
+to read and create correctly.</p>
+<p>It is also important to note that htmltmpl based templates do not
+have access to the full set of information available in the feed, just
+the following (rather substantial) subset:</p>
+
+<blockquote>
+<table border="1" cellpadding="5" cellspacing="0">
+<tr><th>VAR</th><th>type</th><th>source</th></tr>
+<tr><td>author</td><td>String</td><td><a href="http://feedparser.org/docs/reference-feed-author.html">author</a></td></tr>
+<tr><td>author_name</td><td>String</td><td><a href="http://feedparser.org/docs/reference-feed-author_detail.html#reference.feed.author_detail.name">author_detail.name</a></td></tr>
+<tr><td>generator</td><td>String</td><td><a href="http://feedparser.org/docs/reference-feed-generator.html">generator</a></td></tr>
+<tr><td>id</td><td>String</td><td><a href="http://feedparser.org/docs/reference-feed-id.html">id</a></td></tr>
+<tr><td>icon</td><td>String</td><td><a href="http://feedparser.org/docs/reference-feed-icon.html">icon</a></td></tr>
+<tr><td>last_updated_822</td><td>Rfc822</td><td><a href="http://feedparser.org/docs/reference-feed-icon.html">updated_parsed</a></td></tr>
+<tr><td>last_updated_iso</td><td>Rfc3399</td><td><a href="http://feedparser.org/docs/reference-feed-icon.html">updated_parsed</a></td></tr>
+<tr><td>last_updated</td><td>PlanetDate</td><td><a href="http://feedparser.org/docs/reference-feed-icon.html">updated_parsed</a></td></tr>
+<tr><td>link</td><td>String</td><td><a href="http://feedparser.org/docs/reference-feed-link.html">link</a></td></tr>
+<tr><td>logo</td><td>String</td><td><a href="http://feedparser.org/docs/reference-feed-logo.html">logo</a></td></tr>
+<tr><td>rights</td><td>String</td><td><a href="http://feedparser.org/docs/reference-feed-rights_detail.html#reference.feed.rights_detail.value">rights_detail.value</a></td></tr>
+<tr><td>subtitle</td><td>String</td><td><a href="http://feedparser.org/docs/reference-feed-subtitle_detail.html#reference.feed.subtitle_detail.value">subtitle_detail.value</a></td></tr>
+<tr><td>title</td><td>String</td><td><a href="http://feedparser.org/docs/reference-feed-title_detail.html#reference.feed.title_detail.value">title_detail.value</a></td></tr>
+<tr><td>title_plain</td><td>Plain</td><td><a href="http://feedparser.org/docs/reference-feed-title_detail.html#reference.feed.title_detail.value">title_detail.value</a></td></tr>
+<tr><td rowspan="2">url</td><td rowspan="2">String</td><td><a href="http://feedparser.org/docs/reference-feed-links.html#reference.feed.links.href">links[rel='self'].href</a></td></tr>
+<tr><td><a href="http://feedparser.org/docs/reference-headers.html">headers['location']</a></td></tr>
+</table>
+</blockquote>
+
+<p>Note: when multiple sources are listed, the last one wins</p>
+<p>In addition to these variables, Planet Venus makes available two
+arrays, <code>Channels</code> and <code>Items</code>, with one entry
+per subscription and per output entry respectively. The data values
+within the <code>Channels</code> array exactly match the above list.
+The data values within the <code>Items</code> array are as follows:</p>
+
+<blockquote>
+<table border="1" cellpadding="5" cellspacing="0">
+<tr><th>VAR</th><th>type</th><th>source</th></tr>
+<tr><td>author</td><td>String</td><td><a href="http://feedparser.org/docs/reference-entry-author.html">author</a></td></tr>
+<tr><td>author_email</td><td>String</td><td><a href="http://feedparser.org/docs/reference-entry-author_detail.html#reference.entry.author_detail.email">author_detail.email</a></td></tr>
+<tr><td>author_name</td><td>String</td><td><a href="http://feedparser.org/docs/reference-entry-author_detail.html#reference.entry.author_detail.name">author_detail.name</a></td></tr>
+<tr><td>author_uri</td><td>String</td><td><a href="http://feedparser.org/docs/reference-entry-author_detail.html#reference.entry.author_detail.href">author_detail.href</a></td></tr>
+<tr><td>content_language</td><td>String</td><td><a href="http://feedparser.org/docs/reference-entry-content.html#reference.entry.content.language">content[0].language</a></td></tr>
+<tr><td rowspan="2">content</td><td rowspan="2">String</td><td><a href="http://feedparser.org/docs/reference-entry-summary_detail.html#reference.entry.summary_detail.value">summary_detail.value</a></td></tr>
+<tr><td><a href="http://feedparser.org/docs/reference-entry-content.html#reference.entry.content.value">content[0].value</a></td></tr>
+<tr><td rowspan="2">date</td><td rowspan="2">PlanetDate</td><td><a href="http://feedparser.org/docs/reference-entry-published_parsed.html">published_parsed</a></td></tr>
+<tr><td><a href="http://feedparser.org/docs/reference-entry-updated_parsed.html">updated_parsed</a></td></tr>
+<tr><td rowspan="2">date_822</td><td rowspan="2">Rfc822</td><td><a href="http://feedparser.org/docs/reference-entry-published_parsed.html">published_parsed</a></td></tr>
+<tr><td><a href="http://feedparser.org/docs/reference-entry-updated_parsed.html">updated_parsed</a></td></tr>
+<tr><td rowspan="2">date_iso</td><td rowspan="2">Rfc3399</td><td><a href="http://feedparser.org/docs/reference-entry-published_parsed.html">published_parsed</a></td></tr>
+<tr><td><a href="http://feedparser.org/docs/reference-entry-updated_parsed.html">updated_parsed</a></td></tr>
+<tr><td><ins>enclosure_href</ins></td><td>String</td><td><a href="http://feedparser.org/docs/reference-entry-enclosures.html#reference.entry.enclosures.href">enclosures[0].href</a></td></tr>
+<tr><td><ins>enclosure_length</ins></td><td>String</td><td><a href="http://feedparser.org/docs/reference-entry-enclosures.html#reference.entry.enclosures.length">enclosures[0].length</a></td></tr>
+<tr><td><ins>enclosure_type</ins></td><td>String</td><td><a href="http://feedparser.org/docs/reference-entry-enclosures.html#reference.entry.enclosures.type">enclosures[0].type</a></td></tr>
+<tr><td><ins>guid_isPermaLink</ins></td><td>String</td><td><a href="http://blogs.law.harvard.edu/tech/rss#ltguidgtSubelementOfLtitemgt">isPermaLink</a></td></tr>
+<tr><td>id</td><td>String</td><td><a href="http://feedparser.org/docs/reference-entry-id.html">id</a></td></tr>
+<tr><td>link</td><td>String</td><td><a href="http://feedparser.org/docs/reference-entry-links.html#reference.entry.links.href">links[rel='alternate'].href</a></td></tr>
+<tr><td>new_channel</td><td>String</td><td><a href="http://feedparser.org/docs/reference-entry-id.html">id</a></td></tr>
+<tr><td rowspan="2">new_date</td><td rowspan="2">NewDate</td><td><a href="http://feedparser.org/docs/reference-entry-published_parsed.html">published_parsed</a></td></tr>
+<tr><td><a href="http://feedparser.org/docs/reference-entry-updated_parsed.html">updated_parsed</a></td></tr>
+<tr><td>rights</td><td>String</td><td><a href="http://feedparser.org/docs/reference-entry-rights_detail.html#reference.entry.rights_detail.value">rights_detail.value</a></td></tr>
+<tr><td>title_language</td><td>String</td><td><a href="http://feedparser.org/docs/reference-entry-title_detail.html#reference.entry.title_detail.language">title_detail.language</a></td></tr>
+<tr><td>title_plain</td><td>Plain</td><td><a href="http://feedparser.org/docs/reference-entry-title_detail.html#reference.entry.title_detail.value">title_detail.value</a></td></tr>
+<tr><td>title</td><td>String</td><td><a href="http://feedparser.org/docs/reference-entry-title_detail.html#reference.entry.title_detail.value">title_detail.value</a></td></tr>
+<tr><td>summary_language</td><td>String</td><td><a href="http://feedparser.org/docs/reference-entry-summary_detail.html#reference.entry.summary_detail.language">summary_detail.language</a></td></tr>
+<tr><td>updated</td><td>PlanetDate</td><td><a href="http://feedparser.org/docs/reference-entry-updated_parsed.html">updated_parsed</a></td></tr>
+<tr><td>updated_822</td><td>Rfc822</td><td><a href="http://feedparser.org/docs/reference-entry-updated_parsed.html">updated_parsed</a></td></tr>
+<tr><td>updated_iso</td><td>Rfc3399</td><td><a href="http://feedparser.org/docs/reference-entry-updated_parsed.html">updated_parsed</a></td></tr>
+<tr><td>published</td><td>PlanetDate</td><td><a href="http://feedparser.org/docs/reference-entry-published_parsed.html">published_parsed</a></td></tr>
+<tr><td>published_822</td><td>Rfc822</td><td><a href="http://feedparser.org/docs/reference-entry-published_parsed.html">published_parsed</a></td></tr>
+<tr><td>published_iso</td><td>Rfc3399</td><td><a href="http://feedparser.org/docs/reference-entry-published_parsed.html">published_parsed</a></td></tr>
+</table>
+</blockquote>
+<p>Note: variables above which start with
+<code>new_</code> are only set if their values differ from the previous
+Item.</p>
+
+<h3>django</h3>
+
+<p>
+ If you have the <a href="http://www.djangoproject.com/">Django</a>
+ framework installed,
+ <a href="http://www.djangoproject.com/documentation/templates/"
+ >Django templates</a> are automatically available to Venus
+ projects. You will have to save them with a <code>.html.dj</code>
+ extension in your themes. The variable set is the same as the one
+ from htmltmpl, above. In the Django template context you'll have
+ access to <code>Channels</code> and <code>Items</code> and you'll be
+ able to iterate through them.
+</p>
+
+<p>
+ You also have access to the <code>Config</code> dictionary, which contains
+ the Venus configuration variables from your <code>.ini</code> file.
+</p>
+
+<p>
+ If you lose your way and want to introspect all the variable in the
+ context, there's the useful <code>{% debug %}</code> template tag.
+</p>
+
+<p>
+ In the <code>themes/django/</code> you'll find a sample Venus theme
+ that uses the Django templates that might be a starting point for
+ your own custom themes.
+</p>
+
+<p>
+ All the standard Django template tags and filter are supposed to
+ work, with the notable exception of the <code>date</code> filter on
+ the updated and published dates of an item (it works on the main
+ <code>{{ date }}</code> variable).
+</p>
+
+<p>
+ Please note that Django, and therefore Venus' Django support,
+ requires at least Python 2.3.
+</p>
+
+<h3>xslt</h3>
+<p><a href="http://www.w3.org/TR/xslt">XSLT</a> is a paradox: it actually
+makes some simple things easier to do than htmltmpl, and certainly can
+make more difficult things possible; but it is fair to say that many
+find XSLT less approachable than htmltmpl.</p>
+<p>But in any case, the XSLT support is easier to document as the
+input is a <a href="normalization.html">highly normalized</a> feed,
+with a few extension elements.</p>
+<ul>
+<li><code>atom:feed</code> will have the following child elements:
+<ul>
+<li>A <code>planet:source</code> element per subscription, with the same child elements as <a href="http://www.atomenabled.org/developers/syndication/atom-format-spec.php#element.source"><code>atom:source</code></a>, as well as
+an additional child element in the planet namespace for each
+<a href="config.html#subscription">configuration parameter</a> that applies to
+this subscription.</li>
+<li><a href="http://www.feedparser.org/docs/reference-version.html"><code>planet:format</code></a> indicating the format and version of the source feed.</li>
+<li><a href="http://www.feedparser.org/docs/reference-bozo.html"><code>planet:bozo</code></a> which is either <code>true</code> or <code>false</code>.</li>
+</ul>
+</li>
+<li><code>atom:updated</code> and <code>atom:published</code> will have
+a <code>planet:format</code> attribute containing the referenced date
+formatted according to the <code>[planet] date_format</code> specified
+in the configuration</li>
+</ul>
+
+<h3>genshi</h3>
+<p>Genshi approaches the power of XSLT, but with a syntax that many Python
+programmers find more natural, succinct and expressive. Genshi templates
+have access to the full range of <a href="http://feedparser.org/docs/reference.html">feedparser</a> values, with the following additions:</p>
+<ul>
+<li>In addition to a <code>feed</code> element which describes the feed
+for your planet, there is also a <code>feeds</code> element which contains
+the description for each subscription.</li>
+<li>All <code>feed</code>, <code>feeds</code>, and <code>source</code> elements have a child <code>config</code> element which contains the config.ini entries associated with that feed.</li>
+<li>All text construct detail elements (<code>subtitle</code>, <code>rights</code>, <code>title</code>, <code>summary</code>, <code>content</code>) also contain a <code>stream</code> element which contains the value as a Genshi stream.</li>
+<li>Each of the <code>entries</code> has a <code>new_date</code> and <code>new_feed</code> value which indicates if this entry's date or feed differs from the preceeding entry.</li>
+</ul>
+</body>
+</html>
Deleted: trunk/lib/venus/docs/venus.svg
===================================================================
--- branches/sucs-site/lib/venus/docs/venus.svg 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/lib/venus/docs/venus.svg 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,109 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1280 1024" xmlns:xlink="http://www.w3.org/1999/xlink">>
- <defs>
- <g id="feed">
- <path d="M10,15l75,0l0,75l-75,0z" fill="#F80"
- stroke-linejoin="round" stroke-width="20" stroke="#F80"/>
- <circle cx="15" cy="82" r="6" fill="#FFF"/>
- <path d="M35,82s0-20-20-20 M55,82s0-40-40-40 M75,82s0-60-60-60"
- stroke-linecap="round" stroke-width="12" stroke="#FFF" fill="none"/>
- </g>
-
- <g id="entry">
- <g fill="none">
- <ellipse stroke="#689" rx="3" ry="22"/>
- <ellipse stroke="#eb4" rx="3" ry="22" transform="rotate(-66)"/>
- <ellipse stroke="#8ac" rx="3" ry="22" transform="rotate(66)"/>
- <circle stroke="#451" r="22"/>
- </g>
- <g fill="#689" stroke="#FFF">
- <circle fill="#8ac" r="6.5"/>
- <circle cy="-22" r="4.5"/>
- <circle cx="-20" cy="9" r="4.5"/>
- <circle cx="20" cy="9" r="4.5"/>
- </g>
- </g>
- <g id="node" stroke="none">
- <circle r="18" fill="#049"/>
- <path d="M-14,7a16,16,0,0,1,22-21a15,15,0,0,0-14,2a3,3,0,1,1-5,5
- a15,15,0,0,0-3,14" fill="#FFF"/>
- </g>
- <path d="M-14-6a44,62,0,0,0,28,0l0,12a44,62,0,0,0-28,0z"
- fill="#049" id="arc"/>
- </defs>
-
- <rect height="1024" width="1280" fill="#0D0"/>
-
- <use xlink:href="#feed" x="220" y="30"/>
- <use xlink:href="#feed" x="150" y="60"/>
- <use xlink:href="#feed" x="100" y="100"/>
- <use xlink:href="#feed" x="60" y="150"/>
- <use xlink:href="#feed" x="30" y="220"/>
-
- <g fill="#F00" stroke-linejoin="round" stroke-width="12" stroke="#F88">
- <path d="M50,800l0,180l1000,0l0-180z" fill="#FFF"/>
- <path d="M150,330l400,0l0,300l-400,0z"/>
- <path d="M750,200l200,0 l0,110l100,0l0,60l-100,0 l0,40l100,0l0,60l-100,0
- l0,40l100,0l0,60l-100,0 l0,130l70,70l-340,0l70,-70z"/>
- </g>
-
- <path d="M1080,360l100,0l0,-70l-30,-30l-70,0z" fill="#FFF"/>
- <path d="M1180,290l-30,0l0,-30" fill="none" stroke="#000"/>
- <use xlink:href="#feed" x="1080" y="380"/>
-
- <g transform="translate(1080,500)">
- <use xlink:href="#arc" transform="translate(76,50) rotate(90)"/>
- <use xlink:href="#arc" transform="translate(50,35) rotate(-30)"/>
- <use xlink:href="#arc" transform="translate(50,65) rotate(30)"/>
- <use xlink:href="#node" transform="translate(24,50)"/>
- <use xlink:href="#node" transform="translate(76,80)"/>
- <use xlink:href="#node" transform="translate(76,20)"/>
- </g>
-
- <path d="M260,150s100,60,90,280 M170,270s150,0,180,120
- M200,200s150,0,150,200l0,450m-100,-70l100,70l100,-70
- M850,807l0,-200m-70,70l70,-70l70,70"
- stroke="#000" fill="none" stroke-width="40"/>
-
- <ellipse cx="350" cy="368" fill="#FFF" rx="80" ry="30"/>
- <ellipse cx="850" cy="238" fill="#FFF" rx="80" ry="30"/>
- <g font-size="32" fill="#FFF" text-anchor="middle">
- <text x="350" y="380" fill="#F00">Spider</text>
- <text x="350" y="460">Universal Feed Parser</text>
- <text x="350" y="530">html5lib</text>
- <text x="350" y="600">Reconstitute</text>
- <text x="350" y="750">Filter(s)</text>
- <text x="850" y="250" fill="#F00">Splice</text>
- <text x="950" y="350">Template</text>
- <text x="950" y="450">Template</text>
- <text x="950" y="550">Template</text>
- <text x="1126" y="330" fill="#000">HTML</text>
- </g>
-
-
- <use xlink:href="#entry" x="100" y="900"/>
- <use xlink:href="#entry" x="180" y="950"/>
- <use xlink:href="#entry" x="200" y="850"/>
- <use xlink:href="#entry" x="290" y="920"/>
- <use xlink:href="#entry" x="400" y="900"/>
- <use xlink:href="#entry" x="470" y="840"/>
- <use xlink:href="#entry" x="500" y="930"/>
- <use xlink:href="#entry" x="570" y="870"/>
- <use xlink:href="#entry" x="620" y="935"/>
- <use xlink:href="#entry" x="650" y="835"/>
- <use xlink:href="#entry" x="690" y="900"/>
- <use xlink:href="#entry" x="720" y="835"/>
- <use xlink:href="#entry" x="730" y="950"/>
- <use xlink:href="#entry" x="760" y="900"/>
- <use xlink:href="#entry" x="790" y="835"/>
- <use xlink:href="#entry" x="800" y="950"/>
- <use xlink:href="#entry" x="830" y="900"/>
- <use xlink:href="#entry" x="860" y="835"/>
- <use xlink:href="#entry" x="870" y="950"/>
- <use xlink:href="#entry" x="900" y="900"/>
- <use xlink:href="#entry" x="930" y="835"/>
- <use xlink:href="#entry" x="940" y="950"/>
- <use xlink:href="#entry" x="970" y="900"/>
- <use xlink:href="#entry" x="1000" y="835"/>
- <use xlink:href="#entry" x="1010" y="950"/>
-
-</svg>
Copied: trunk/lib/venus/docs/venus.svg (from rev 656, branches/sucs-site/lib/venus/docs/venus.svg)
===================================================================
--- trunk/lib/venus/docs/venus.svg (rev 0)
+++ trunk/lib/venus/docs/venus.svg 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,109 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1280 1024" xmlns:xlink="http://www.w3.org/1999/xlink">>
+ <defs>
+ <g id="feed">
+ <path d="M10,15l75,0l0,75l-75,0z" fill="#F80"
+ stroke-linejoin="round" stroke-width="20" stroke="#F80"/>
+ <circle cx="15" cy="82" r="6" fill="#FFF"/>
+ <path d="M35,82s0-20-20-20 M55,82s0-40-40-40 M75,82s0-60-60-60"
+ stroke-linecap="round" stroke-width="12" stroke="#FFF" fill="none"/>
+ </g>
+
+ <g id="entry">
+ <g fill="none">
+ <ellipse stroke="#689" rx="3" ry="22"/>
+ <ellipse stroke="#eb4" rx="3" ry="22" transform="rotate(-66)"/>
+ <ellipse stroke="#8ac" rx="3" ry="22" transform="rotate(66)"/>
+ <circle stroke="#451" r="22"/>
+ </g>
+ <g fill="#689" stroke="#FFF">
+ <circle fill="#8ac" r="6.5"/>
+ <circle cy="-22" r="4.5"/>
+ <circle cx="-20" cy="9" r="4.5"/>
+ <circle cx="20" cy="9" r="4.5"/>
+ </g>
+ </g>
+ <g id="node" stroke="none">
+ <circle r="18" fill="#049"/>
+ <path d="M-14,7a16,16,0,0,1,22-21a15,15,0,0,0-14,2a3,3,0,1,1-5,5
+ a15,15,0,0,0-3,14" fill="#FFF"/>
+ </g>
+ <path d="M-14-6a44,62,0,0,0,28,0l0,12a44,62,0,0,0-28,0z"
+ fill="#049" id="arc"/>
+ </defs>
+
+ <rect height="1024" width="1280" fill="#0D0"/>
+
+ <use xlink:href="#feed" x="220" y="30"/>
+ <use xlink:href="#feed" x="150" y="60"/>
+ <use xlink:href="#feed" x="100" y="100"/>
+ <use xlink:href="#feed" x="60" y="150"/>
+ <use xlink:href="#feed" x="30" y="220"/>
+
+ <g fill="#F00" stroke-linejoin="round" stroke-width="12" stroke="#F88">
+ <path d="M50,800l0,180l1000,0l0-180z" fill="#FFF"/>
+ <path d="M150,330l400,0l0,300l-400,0z"/>
+ <path d="M750,200l200,0 l0,110l100,0l0,60l-100,0 l0,40l100,0l0,60l-100,0
+ l0,40l100,0l0,60l-100,0 l0,130l70,70l-340,0l70,-70z"/>
+ </g>
+
+ <path d="M1080,360l100,0l0,-70l-30,-30l-70,0z" fill="#FFF"/>
+ <path d="M1180,290l-30,0l0,-30" fill="none" stroke="#000"/>
+ <use xlink:href="#feed" x="1080" y="380"/>
+
+ <g transform="translate(1080,500)">
+ <use xlink:href="#arc" transform="translate(76,50) rotate(90)"/>
+ <use xlink:href="#arc" transform="translate(50,35) rotate(-30)"/>
+ <use xlink:href="#arc" transform="translate(50,65) rotate(30)"/>
+ <use xlink:href="#node" transform="translate(24,50)"/>
+ <use xlink:href="#node" transform="translate(76,80)"/>
+ <use xlink:href="#node" transform="translate(76,20)"/>
+ </g>
+
+ <path d="M260,150s100,60,90,280 M170,270s150,0,180,120
+ M200,200s150,0,150,200l0,450m-100,-70l100,70l100,-70
+ M850,807l0,-200m-70,70l70,-70l70,70"
+ stroke="#000" fill="none" stroke-width="40"/>
+
+ <ellipse cx="350" cy="368" fill="#FFF" rx="80" ry="30"/>
+ <ellipse cx="850" cy="238" fill="#FFF" rx="80" ry="30"/>
+ <g font-size="32" fill="#FFF" text-anchor="middle">
+ <text x="350" y="380" fill="#F00">Spider</text>
+ <text x="350" y="460">Universal Feed Parser</text>
+ <text x="350" y="530">html5lib</text>
+ <text x="350" y="600">Reconstitute</text>
+ <text x="350" y="750">Filter(s)</text>
+ <text x="850" y="250" fill="#F00">Splice</text>
+ <text x="950" y="350">Template</text>
+ <text x="950" y="450">Template</text>
+ <text x="950" y="550">Template</text>
+ <text x="1126" y="330" fill="#000">HTML</text>
+ </g>
+
+
+ <use xlink:href="#entry" x="100" y="900"/>
+ <use xlink:href="#entry" x="180" y="950"/>
+ <use xlink:href="#entry" x="200" y="850"/>
+ <use xlink:href="#entry" x="290" y="920"/>
+ <use xlink:href="#entry" x="400" y="900"/>
+ <use xlink:href="#entry" x="470" y="840"/>
+ <use xlink:href="#entry" x="500" y="930"/>
+ <use xlink:href="#entry" x="570" y="870"/>
+ <use xlink:href="#entry" x="620" y="935"/>
+ <use xlink:href="#entry" x="650" y="835"/>
+ <use xlink:href="#entry" x="690" y="900"/>
+ <use xlink:href="#entry" x="720" y="835"/>
+ <use xlink:href="#entry" x="730" y="950"/>
+ <use xlink:href="#entry" x="760" y="900"/>
+ <use xlink:href="#entry" x="790" y="835"/>
+ <use xlink:href="#entry" x="800" y="950"/>
+ <use xlink:href="#entry" x="830" y="900"/>
+ <use xlink:href="#entry" x="860" y="835"/>
+ <use xlink:href="#entry" x="870" y="950"/>
+ <use xlink:href="#entry" x="900" y="900"/>
+ <use xlink:href="#entry" x="930" y="835"/>
+ <use xlink:href="#entry" x="940" y="950"/>
+ <use xlink:href="#entry" x="970" y="900"/>
+ <use xlink:href="#entry" x="1000" y="835"/>
+ <use xlink:href="#entry" x="1010" y="950"/>
+
+</svg>
Deleted: trunk/lib/venus/examples/filters/categories/categories.xslt
===================================================================
--- branches/sucs-site/lib/venus/examples/filters/categories/categories.xslt 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/lib/venus/examples/filters/categories/categories.xslt 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,82 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE xsl:stylesheet [
-<!ENTITY categoryTerm "WebSemantique">
-]>
-<!--
-
- This transformation is released under the same licence as Python
- see http://www.intertwingly.net/code/venus/LICENCE.
-
- Author: Eric van der Vlist <vdv at dyomedea.com>
-
- This transformation is meant to be used as a filter that determines if
- Atom entries are relevant to a specific topic and adds the corresonding
- <category/> element when it is the case.
-
- This is done by a simple keyword matching mechanism.
-
- To customize this filter to your needs:
-
- 1) Replace WebSemantique by your own category name in the definition of
- the categoryTerm entity above.
- 2) Review the "upper" and "lower" variables that are used to convert text
- nodes to lower case and replace common ponctuation signs into spaces
- to check that they meet your needs.
- 3) Define your own list of keywords in <d:keyword/> elements. Note that
- the leading and trailing spaces are significant: "> rdf <" will match rdf
- as en entier word while ">rdf<" would match the substring "rdf" and
- "> rdf<" would match words starting by rdf. Also note that the test is done
- after conversion to lowercase.
-
- To use it with venus, just add this filter to the list of filters, for instance:
-
-filters= categories.xslt guess_language.py
-
--->
-<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
- xmlns:atom="http://www.w3.org/2005/Atom" xmlns="http://www.w3.org/2005/Atom"
- xmlns:d="http://ns.websemantique.org/data/" exclude-result-prefixes="d atom" version="1.0">
- <xsl:variable name="upper"
- >,.;AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZzÃà ÃáÃâÃãÃäÃ
Ã¥ÃæÃçÃèÃéÃêÃëÃìÃÃÃîÃïÃðÃñÃòÃóÃôÃõÃöÃøÃùÃúÃûÃüÃýÃþ</xsl:variable>
- <xsl:variable name="lower"
- > aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzzaaaaaaaaaaaaææcceeeeeeeeiiiiiiiiððnnooooooooooøøuuuuuuuuyyþþ</xsl:variable>
- <d:keywords>
- <d:keyword> wiki semantique </d:keyword>
- <d:keyword> wikis semantiques </d:keyword>
- <d:keyword> web semantique </d:keyword>
- <d:keyword> websemantique </d:keyword>
- <d:keyword> semantic web</d:keyword>
- <d:keyword> semweb</d:keyword>
- <d:keyword> rdf</d:keyword>
- <d:keyword> owl </d:keyword>
- <d:keyword> sparql </d:keyword>
- <d:keyword> topic map</d:keyword>
- <d:keyword> doap </d:keyword>
- <d:keyword> foaf </d:keyword>
- <d:keyword> sioc </d:keyword>
- <d:keyword> ontology </d:keyword>
- <d:keyword> ontologie</d:keyword>
- <d:keyword> dublin core </d:keyword>
- </d:keywords>
- <xsl:template match="@*|node()">
- <xsl:copy>
- <xsl:apply-templates select="@*|node()"/>
- </xsl:copy>
- </xsl:template>
- <xsl:template match="atom:entry/atom:updated">
- <xsl:copy>
- <xsl:apply-templates select="@*|node()"/>
- </xsl:copy>
- <xsl:variable name="concatenatedText">
- <xsl:for-each select="../atom:title|../atom:summary|../atom:content|../atom:category/@term">
- <xsl:text> </xsl:text>
- <xsl:value-of select="translate(., $upper, $lower)"/>
- </xsl:for-each>
- <xsl:text> </xsl:text>
- </xsl:variable>
- <xsl:if test="document('')/*/d:keywords/d:keyword[contains($concatenatedText, .)]">
- <category term="WebSemantique"/>
- </xsl:if>
- </xsl:template>
- <xsl:template match="atom:category[@term='&categoryTerm;']"/>
-</xsl:stylesheet>
Copied: trunk/lib/venus/examples/filters/categories/categories.xslt (from rev 656, branches/sucs-site/lib/venus/examples/filters/categories/categories.xslt)
===================================================================
--- trunk/lib/venus/examples/filters/categories/categories.xslt (rev 0)
+++ trunk/lib/venus/examples/filters/categories/categories.xslt 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE xsl:stylesheet [
+<!ENTITY categoryTerm "WebSemantique">
+]>
+<!--
+
+ This transformation is released under the same licence as Python
+ see http://www.intertwingly.net/code/venus/LICENCE.
+
+ Author: Eric van der Vlist <vdv at dyomedea.com>
+
+ This transformation is meant to be used as a filter that determines if
+ Atom entries are relevant to a specific topic and adds the corresonding
+ <category/> element when it is the case.
+
+ This is done by a simple keyword matching mechanism.
+
+ To customize this filter to your needs:
+
+ 1) Replace WebSemantique by your own category name in the definition of
+ the categoryTerm entity above.
+ 2) Review the "upper" and "lower" variables that are used to convert text
+ nodes to lower case and replace common ponctuation signs into spaces
+ to check that they meet your needs.
+ 3) Define your own list of keywords in <d:keyword/> elements. Note that
+ the leading and trailing spaces are significant: "> rdf <" will match rdf
+ as en entier word while ">rdf<" would match the substring "rdf" and
+ "> rdf<" would match words starting by rdf. Also note that the test is done
+ after conversion to lowercase.
+
+ To use it with venus, just add this filter to the list of filters, for instance:
+
+filters= categories.xslt guess_language.py
+
+-->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:atom="http://www.w3.org/2005/Atom" xmlns="http://www.w3.org/2005/Atom"
+ xmlns:d="http://ns.websemantique.org/data/" exclude-result-prefixes="d atom" version="1.0">
+ <xsl:variable name="upper"
+ >,.;AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZzÃà ÃáÃâÃãÃäÃ
Ã¥ÃæÃçÃèÃéÃêÃëÃìÃÃÃîÃïÃðÃñÃòÃóÃôÃõÃöÃøÃùÃúÃûÃüÃýÃþ</xsl:variable>
+ <xsl:variable name="lower"
+ > aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzzaaaaaaaaaaaaææcceeeeeeeeiiiiiiiiððnnooooooooooøøuuuuuuuuyyþþ</xsl:variable>
+ <d:keywords>
+ <d:keyword> wiki semantique </d:keyword>
+ <d:keyword> wikis semantiques </d:keyword>
+ <d:keyword> web semantique </d:keyword>
+ <d:keyword> websemantique </d:keyword>
+ <d:keyword> semantic web</d:keyword>
+ <d:keyword> semweb</d:keyword>
+ <d:keyword> rdf</d:keyword>
+ <d:keyword> owl </d:keyword>
+ <d:keyword> sparql </d:keyword>
+ <d:keyword> topic map</d:keyword>
+ <d:keyword> doap </d:keyword>
+ <d:keyword> foaf </d:keyword>
+ <d:keyword> sioc </d:keyword>
+ <d:keyword> ontology </d:keyword>
+ <d:keyword> ontologie</d:keyword>
+ <d:keyword> dublin core </d:keyword>
+ </d:keywords>
+ <xsl:template match="@*|node()">
+ <xsl:copy>
+ <xsl:apply-templates select="@*|node()"/>
+ </xsl:copy>
+ </xsl:template>
+ <xsl:template match="atom:entry/atom:updated">
+ <xsl:copy>
+ <xsl:apply-templates select="@*|node()"/>
+ </xsl:copy>
+ <xsl:variable name="concatenatedText">
+ <xsl:for-each select="../atom:title|../atom:summary|../atom:content|../atom:category/@term">
+ <xsl:text> </xsl:text>
+ <xsl:value-of select="translate(., $upper, $lower)"/>
+ </xsl:for-each>
+ <xsl:text> </xsl:text>
+ </xsl:variable>
+ <xsl:if test="document('')/*/d:keywords/d:keyword[contains($concatenatedText, .)]">
+ <category term="WebSemantique"/>
+ </xsl:if>
+ </xsl:template>
+ <xsl:template match="atom:category[@term='&categoryTerm;']"/>
+</xsl:stylesheet>
Deleted: trunk/lib/venus/examples/filters/guess-language/README
===================================================================
--- branches/sucs-site/lib/venus/examples/filters/guess-language/README 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/lib/venus/examples/filters/guess-language/README 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,37 +0,0 @@
-This filter is released under the same licence as Python
-see http://www.intertwingly.net/code/venus/LICENCE.
-
-Author: Eric van der Vlist <vdv at dyomedea.com>
-
-This filter guesses whether an Atom entry is written
-in English or French. It should be trivial to chose between
-two other languages, easy to extend to more than two languages
-and useful to pass these languages as Venus configuration
-parameters.
-
-The code used to guess the language is the one that has been
-described by Douglas Bagnall as the Python recipe titled
-"Language detection using character trigrams"
-http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/326576.
-
-To add support for a new language, this language must first be
-"learned" using learn-language.py. This learning phase is nothing
-more than saving a pickled version of the Trigram object for this
-language.
-
-To learn Finnish, you would execute:
-
-$ ./learn-language.py http://gutenberg.net/dirs/1/0/4/9/10492/10492-8.txt fi.data
-
-where http://gutenberg.net/dirs/1/0/4/9/10492/10492-8.txt is a text
-representative of the Finnish language and "fi.data" is the name of the
-data file for "fi" (ISO code for Finnish).
-
-To install this filter, copy this directory under the Venus
-filter directory and declare it in your filters list, for instance:
-
-filters= categories.xslt guess-language/guess-language.py
-
-NOTE: this filter depends on Amara
-(http://uche.ogbuji.net/tech/4suite/amara/)
-
Copied: trunk/lib/venus/examples/filters/guess-language/README (from rev 656, branches/sucs-site/lib/venus/examples/filters/guess-language/README)
===================================================================
--- trunk/lib/venus/examples/filters/guess-language/README (rev 0)
+++ trunk/lib/venus/examples/filters/guess-language/README 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,37 @@
+This filter is released under the same licence as Python
+see http://www.intertwingly.net/code/venus/LICENCE.
+
+Author: Eric van der Vlist <vdv at dyomedea.com>
+
+This filter guesses whether an Atom entry is written
+in English or French. It should be trivial to chose between
+two other languages, easy to extend to more than two languages
+and useful to pass these languages as Venus configuration
+parameters.
+
+The code used to guess the language is the one that has been
+described by Douglas Bagnall as the Python recipe titled
+"Language detection using character trigrams"
+http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/326576.
+
+To add support for a new language, this language must first be
+"learned" using learn-language.py. This learning phase is nothing
+more than saving a pickled version of the Trigram object for this
+language.
+
+To learn Finnish, you would execute:
+
+$ ./learn-language.py http://gutenberg.net/dirs/1/0/4/9/10492/10492-8.txt fi.data
+
+where http://gutenberg.net/dirs/1/0/4/9/10492/10492-8.txt is a text
+representative of the Finnish language and "fi.data" is the name of the
+data file for "fi" (ISO code for Finnish).
+
+To install this filter, copy this directory under the Venus
+filter directory and declare it in your filters list, for instance:
+
+filters= categories.xslt guess-language/guess-language.py
+
+NOTE: this filter depends on Amara
+(http://uche.ogbuji.net/tech/4suite/amara/)
+
Deleted: trunk/lib/venus/examples/filters/guess-language/en.data
===================================================================
--- branches/sucs-site/lib/venus/examples/filters/guess-language/en.data 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/lib/venus/examples/filters/guess-language/en.data 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,15131 +0,0 @@
-(itrigram
-Trigram
-p1
-(dp2
-S'length'
-p3
-F5471.4726536829185
-sS'lut'
-p4
-(dp5
-V b
-p6
-(dp7
-Va
-I7
-sVe
-I568
-sVi
-I11
-sVl
-I17
-sVo
-I20
-sVr
-I56
-sVu
-I188
-sVy
-I148
-ssV c
-p8
-(dp9
-Va
-I189
-sVe
-I20
-sVd
-I2
-sVi
-I12
-sVh
-I74
-sVl
-I16
-sVo
-I463
-sVr
-I22
-sVu
-I2
-ssVgu
-p10
-(dp11
-Va
-I9
-sVe
-I5
-sVi
-I9
-sVm
-I1
-sVl
-I2
-sVn
-I3
-sVr
-I1
-sVt
-I1
-ssV a
-p12
-(dp13
-V
-I330
-sVc
-I85
-sVb
-I70
-sVd
-I47
-sVg
-I73
-sVf
-I83
-sVi
-I3
-sVm
-I148
-sVl
-I216
-sVn
-I858
-sVp
-I48
-sVs
-I282
-sVr
-I101
-sVu
-I15
-sVt
-I203
-sVw
-I28
-sVv
-I7
-ssV f
-p14
-(dp15
-Va
-I109
-sVe
-I95
-sVi
-I76
-sVl
-I16
-sVo
-I371
-sVr
-I155
-sVu
-I23
-sVt
-I2
-ssV g
-p16
-(dp17
-Va
-I16
-sVe
-I45
-sVi
-I68
-sVl
-I8
-sVo
-I89
-sVr
-I81
-sVu
-I11
-ssV d
-p18
-(dp19
-Va
-I90
-sVe
-I275
-sVi
-I178
-sVo
-I142
-sVr
-I24
-sVu
-I18
-sVw
-I1
-ssV e
-p20
-(dp21
-Va
-I48
-sVc
-I3
-sVd
-I12
-sVf
-I12
-sVi
-I7
-sVm
-I13
-sVl
-I14
-sVn
-I107
-sVq
-I17
-sVp
-I1
-sVs
-I26
-sVr
-I5
-sVt
-I31
-sVv
-I132
-sVy
-I10
-sVx
-I117
-ssV j
-p22
-(dp23
-Ve
-I11
-sVu
-I41
-sVo
-I11
-ssV k
-p24
-(dp25
-Vi
-I22
-sVe
-I14
-sVn
-I90
-ssV h
-p26
-(dp27
-Va
-I525
-sVe
-I739
-sVi
-I320
-sVo
-I168
-sVu
-I33
-sVy
-I2
-ssV i
-p28
-(dp29
-Vd
-I17
-sVg
-I3
-sVf
-I62
-sVm
-I87
-sVl
-I14
-sVn
-I599
-sVs
-I287
-sVr
-I3
-sVt
-I254
-ssV n
-p30
-(dp31
-Va
-I19
-sVu
-I5
-sVe
-I98
-sVi
-I10
-sVo
-I438
-ssV o
-p32
-(dp33
-Vc
-I14
-sVb
-I32
-sVd
-I2
-sVf
-I741
-sVl
-I9
-sVn
-I225
-sVp
-I36
-sVs
-I1
-sVr
-I90
-sVu
-I70
-sVt
-I44
-sVw
-I47
-sVv
-I20
-ssV l
-p34
-(dp35
-Va
-I80
-sVe
-I154
-sVi
-I107
-sVo
-I115
-sVs
-I4
-sVu
-I1
-ssV m
-p36
-(dp37
-Va
-I319
-sVe
-I281
-sVg
-I1
-sVi
-I107
-sVo
-I229
-sVu
-I149
-sVy
-I347
-ssV r
-p38
-(dp39
-Vi
-I18
-sVu
-I12
-sVe
-I378
-sVa
-I20
-sVo
-I25
-ssV s
-p40
-(dp41
-Va
-I111
-sVc
-I31
-sVe
-I206
-sVi
-I105
-sVh
-I339
-sVm
-I7
-sVl
-I7
-sVo
-I297
-sVp
-I70
-sVu
-I197
-sVt
-I85
-sVw
-I6
-sVy
-I5
-ssV p
-p42
-(dp43
-Va
-I102
-sVe
-I104
-sVi
-I7
-sVh
-I2
-sVl
-I63
-sVo
-I84
-sVr
-I205
-sVu
-I22
-ssV q
-p44
-(dp45
-Vu
-I40
-ssV v
-p46
-(dp47
-Va
-I23
-sVi
-I40
-sVe
-I95
-sVo
-I4
-ssV w
-p48
-(dp49
-Va
-I243
-sVe
-I172
-sVi
-I425
-sVh
-I382
-sVo
-I157
-sVr
-I39
-ssV t
-p50
-(dp51
-Va
-I56
-sVe
-I60
-sVi
-I69
-sVh
-I1425
-sVm
-I1
-sVo
-I997
-sVr
-I66
-sVu
-I4
-sVw
-I21
-ssV u
-p52
-(dp53
-Vg
-I1
-sVi
-I1
-sVn
-I132
-sVp
-I26
-sVs
-I50
-sVr
-I10
-sVt
-I4
-ssV z
-p54
-(dp55
-Vi
-I1
-ssVgn
-p56
-(dp57
-Va
-I2
-sV
-I7
-sVe
-I3
-sVi
-I6
-sV,
-I2
-sVo
-I4
-sVs
-I1
-ssV x
-p58
-(dp59
-V
-I1
-ssV y
-p60
-(dp61
-Vi
-I2
-sVe
-I38
-sVo
-I469
-ssV-Y
-p62
-(dp63
-Vo
-I3
-ssVlk
-p64
-(dp65
-Vi
-I5
-sV
-I2
-sVs
-I3
-sVe
-I3
-ssVgi
-p66
-(dp67
-Vb
-I1
-sVe
-I4
-sVn
-I111
-sVr
-I29
-sVt
-I5
-sVv
-I45
-sVz
-I2
-ssVgh
-p68
-(dp69
-V
-I61
-sVb
-I1
-sVe
-I3
-sVi
-I2
-sV,
-I7
-sVl
-I11
-sVt
-I170
-sV;
-I2
-ssV B
-p70
-(dp71
-Va
-I5
-sVE
-I1
-sVi
-I1
-sVo
-I2
-sVR
-I2
-sVu
-I12
-sVy
-I6
-sVU
-I2
-sVe
-I6
-ssV C
-p72
-(dp73
-Va
-I15
-sVA
-I8
-sVe
-I1
-sVh
-I58
-sVl
-I2
-sVO
-I31
-sV.
-I6
-sVr
-I2
-sVo
-I33
-ssV-g
-p74
-(dp75
-Vr
-I1
-ssV A
-p76
-(dp77
-V
-I3
-sVr
-I1
-sVB
-I1
-sVd
-I8
-sVg
-I1
-sVf
-I3
-sVS
-I3
-sVm
-I4
-sVl
-I14
-sVN
-I2
-sVs
-I11
-sVR
-I2
-sVu
-I6
-sVT
-I1
-sVw
-I1
-sVn
-I5
-sVL
-I5
-sVt
-I11
-ssV F
-p78
-(dp79
-Va
-I2
-sVo
-I7
-sVi
-I1
-sVl
-I1
-sVO
-I4
-sV.
-I1
-sVI
-I1
-sVr
-I89
-sVT
-I2
-sVR
-I2
-ssV G
-p80
-(dp81
-VE
-I2
-sVi
-I1
-sVo
-I4
-sVI
-I1
-sVu
-I17
-sVU
-I9
-sVe
-I1
-ssV D
-p82
-(dp83
-VA
-I3
-sVe
-I32
-sVi
-I3
-sVO
-I3
-sVI
-I3
-sVu
-I2
-sVo
-I7
-sVE
-I29
-ssV E
-p84
-(dp85
-VB
-I2
-sVD
-I1
-sVv
-I4
-sVl
-I1
-sVn
-I4
-sVd
-I9
-sVT
-I6
-sVX
-I1
-sVV
-I2
-sVx
-I2
-sVN
-I1
-sVt
-I9
-ssV J
-p86
-(dp87
-Va
-I60
-sVu
-I1
-sVo
-I18
-sVO
-I17
-ssVtw
-p88
-(dp89
-Vi
-I1
-sVa
-I2
-sVe
-I18
-sVo
-I17
-ssVtt
-p90
-(dp91
-Va
-I28
-sVe
-I129
-sVi
-I11
-sVl
-I36
-sVr
-I6
-sVy
-I4
-ssV I
-p92
-(dp93
-V
-I766
-sVF
-I3
-sVI
-I2
-sVs
-I2
-sVf
-I25
-sVM
-I1
-sVL
-I1
-sVN
-I7
-sVS
-I1
-sVt
-I27
-sVV
-I1
-sVX
-I1
-sV;
-I1
-sVn
-I12
-sV,
-I5
-sVT
-I1
-ssVtr
-p94
-(dp95
-Va
-I39
-sVe
-I58
-sVi
-I31
-sVo
-I23
-sVu
-I33
-sVy
-I18
-ssVts
-p96
-(dp97
-V
-I63
-sV"
-I1
-sVe
-I4
-sV*
-I1
-sV,
-I20
-sV.
-I10
-sV;
-I3
-ssV L
-p98
-(dp99
-Va
-I96
-sVA
-I35
-sVE
-I1
-sVI
-I5
-sVo
-I22
-sVi
-I1
-sVe
-I6
-ssV M
-p100
-(dp101
-Va
-I62
-sVA
-I2
-sVC
-I1
-sVe
-I1
-sVG
-I1
-sVi
-I32
-sVO
-I1
-sV.
-I2
-sVy
-I35
-sVR
-I40
-sVu
-I2
-sVo
-I12
-sVY
-I1
-sVE
-I4
-sVr
-I96
-sVU
-I1
-sVI
-I1
-ssV R
-p102
-(dp103
-VE
-I5
-sVe
-I81
-sVo
-I1
-sV.
-I4
-ssV S
-p104
-(dp105
-VO
-I1
-sVA
-I4
-sVE
-I1
-sV
-I1
-sVi
-I64
-sVh
-I42
-sVM
-I2
-sVm
-I6
-sVo
-I5
-sV.
-I20
-sVp
-I1
-sVu
-I90
-sVt
-I24
-sVH
-I3
-sVI
-I2
-sVU
-I24
-sVe
-I10
-sVT
-I1
-ssV P
-p106
-(dp107
-Va
-I7
-sVA
-I1
-sVe
-I1
-sVl
-I3
-sVO
-I1
-sV.
-I1
-sVR
-I9
-sVU
-I4
-sVo
-I7
-sVr
-I29
-ssVtm
-p108
-(dp109
-Va
-I2
-sV
-I4
-sV"
-I1
-sVe
-I12
-sVo
-I3
-ssV V
-p110
-(dp111
-Va
-I1
-sV
-I1
-sVe
-I66
-sVI
-I3
-sVo
-I1
-sV.
-I4
-sVE
-I50
-ssV W
-p112
-(dp113
-VA
-I4
-sVe
-I27
-sVi
-I11
-sVh
-I33
-sVo
-I1
-sVH
-I1
-ssVth
-p114
-(dp115
-Va
-I378
-sV
-I240
-sVe
-I1023
-sV'
-I4
-sVf
-I4
-sVi
-I255
-sVh
-I1
-sVl
-I3
-sVo
-I105
-sV.
-I9
-sVs
-I10
-sVr
-I15
-sV!
-I1
-sVy
-I5
-sVu
-I1
-sV;
-I2
-sV:
-I1
-sV,
-I10
-ssVti
-p116
-(dp117
-Va
-I6
-sVc
-I42
-sVb
-I4
-sVe
-I29
-sVf
-I21
-sVm
-I71
-sVl
-I41
-sVo
-I338
-sVn
-I114
-sVs
-I18
-sVr
-I16
-sVt
-I9
-sVv
-I27
-ssVtf
-p118
-(dp119
-Vu
-I18
-ssV [
-p120
-(dp121
-VE
-I1
-sVD
-I1
-sVg
-I1
-sV*
-I3
-sVM
-I1
-sV1
-I4
-sV3
-I2
-sV2
-I3
-sVt
-I3
-sVx
-I1
-ssVG-
-p122
-(dp123
-V
-I1
-sVt
-I4
-sVT
-I1
-ssVte
-p124
-(dp125
-Va
-I11
-sV
-I126
-sVc
-I5
-sVe
-I11
-sVd
-I149
-sVg
-I2
-sVf
-I5
-sVm
-I28
-sVl
-I69
-sVp
-I1
-sVn
-I150
-sV.
-I8
-sVs
-I24
-sVr
-I287
-sVv
-I8
-sVx
-I46
-sV;
-I1
-sV:
-I1
-sV,
-I13
-sV?
-I1
-ssV-y
-p126
-(dp127
-Vo
-I2
-ssVtc
-p128
-(dp129
-Vh
-I29
-sV.
-I1
-ssVta
-p130
-(dp131
-Vc
-I31
-sVb
-I19
-sVg
-I12
-sVf
-I3
-sVi
-I30
-sVk
-I50
-sVl
-I27
-sVn
-I61
-sVs
-I1
-sVr
-I3
-sVu
-I2
-sVt
-I57
-sVy
-I9
-sVx
-I3
-sV,
-I1
-ssV "
-p132
-(dp133
-VA
-I3
-sVC
-I2
-sVB
-I2
-sVD
-I2
-sVG
-I1
-sVF
-I3
-sVI
-I22
-sVH
-I3
-sVM
-I3
-sVO
-I2
-sVN
-I4
-sVP
-I6
-sVS
-I6
-sVR
-I1
-sVW
-I2
-sVY
-I2
-sVa
-I1
-sVb
-I4
-sVd
-I1
-sVi
-I2
-sVh
-I2
-sVo
-I2
-sVp
-I1
-sVs
-I1
-sVr
-I1
-sVt
-I2
-sVw
-I2
-sVy
-I2
-ssV #
-p134
-(dp135
-V9
-I1
-sV6
-I1
-ssS' '
-p136
-(dp137
-V
-I606
-sV#
-I1
-sV"
-I9
-sV&
-I1
-sV(
-I4
-sV*
-I12
-sV-
-I3
-sV2
-I2
-sVA
-I19
-sVC
-I47
-sVB
-I4
-sVE
-I8
-sVD
-I8
-sVG
-I2
-sVF
-I17
-sVI
-I68
-sVH
-I6
-sVJ
-I7
-sVM
-I56
-sVL
-I34
-sVO
-I3
-sVN
-I2
-sVP
-I12
-sVS
-I37
-sVR
-I15
-sVU
-I9
-sVT
-I26
-sVW
-I20
-sVV
-I18
-sVY
-I33
-sVX
-I32
-sV[
-I12
-sVa
-I172
-sVc
-I92
-sVb
-I78
-sVe
-I62
-sVd
-I78
-sVg
-I25
-sVf
-I67
-sVi
-I107
-sVh
-I118
-sVk
-I7
-sVj
-I8
-sVm
-I103
-sVl
-I35
-sVo
-I81
-sVn
-I40
-sVq
-I4
-sVp
-I65
-sVs
-I128
-sVr
-I49
-sVu
-I25
-sVt
-I140
-sVw
-I108
-sVv
-I11
-sVy
-I34
-ssV &
-p138
-(dp139
-Vc
-I20
-ssV $
-p140
-(dp141
-V2
-I1
-ssV *
-p142
-(dp143
-VB
-I1
-sVE
-I2
-sV*
-I8
-sVn
-I1
-sVT
-I1
-sVW
-I1
-sVe
-I1
-ssV:
-p144
-(dp145
-Va
-I4
-sV
-I4
-sVb
-I3
-sVF
-I1
-sVi
-I3
-sVh
-I2
-sVM
-I3
-sVl
-I1
-sVo
-I1
-sVm
-I2
-sVI
-I3
-sVS
-I1
-sV"
-I3
-sVt
-I3
-sVw
-I1
-sVy
-I1
-sVs
-I1
-ssV (
-p146
-(dp147
-Va
-I7
-sVC
-I1
-sVI
-I2
-sVh
-I1
-sV*
-I1
-sVo
-I5
-sVi
-I2
-sVs
-I1
-sVT
-I1
-sV~
-I1
-sV_
-I1
-sVt
-I1
-ssV .
-p148
-(dp149
-V
-I2
-sVs
-I1
-sVt
-I1
-ssV /
-p150
-(dp151
-V
-I1
-sVe
-I1
-ssV -
-p152
-(dp153
-Va
-I1
-sV-
-I2
-ssV 2
-p154
-(dp155
-V8
-I1
-sV7
-I1
-sV0
-I5
-ssV 3
-p156
-(dp157
-V1
-I1
-sV0
-I1
-ssVGE
-p158
-(dp159
-VS
-I3
-sVT
-I3
-sVN
-I1
-ssV 1
-p160
-(dp161
-V9
-I3
-sV0
-I4
-ssV 6
-p162
-(dp163
-V1
-I1
-sV0
-I1
-ssVWI
-p164
-(dp165
-VS
-I1
-ssV 4
-p166
-(dp167
-V0
-I1
-ssVg
-p168
-(dp169
-V(
-I1
-sVA
-I2
-sVC
-I2
-sVE
-I4
-sVD
-I1
-sVF
-I1
-sVI
-I1
-sVH
-I1
-sVM
-I5
-sVL
-I5
-sVP
-I1
-sVS
-I2
-sVR
-I3
-sVV
-I1
-sVa
-I60
-sVc
-I12
-sVb
-I25
-sVe
-I14
-sVd
-I10
-sVg
-I4
-sVf
-I16
-sVi
-I48
-sVh
-I50
-sVm
-I57
-sVl
-I11
-sVo
-I35
-sVn
-I7
-sVq
-I1
-sVp
-I9
-sVs
-I26
-sVr
-I4
-sVu
-I6
-sVt
-I113
-sVw
-I33
-sVv
-I5
-sVy
-I8
-ssVg/
-p170
-(dp171
-VC
-I1
-ssVg.
-p172
-(dp173
-V
-I22
-ssV 8
-p174
-(dp175
-V0
-I2
-ssVGL
-p176
-(dp177
-VI
-I1
-ssV <
-p178
-(dp179
-Vh
-I1
-ssV =
-p180
-(dp181
-V
-I1
-ssVAS
-p182
-(dp183
-V
-I1
-sVC
-I2
-sV-
-I1
-ssVgg
-p184
-(dp185
-Ve
-I8
-sVl
-I1
-ssVGu
-p186
-(dp187
-Ve
-I2
-sVt
-I15
-ssVt:
-p188
-(dp189
-V
-I2
-ssVt;
-p190
-(dp191
-V
-I32
-ssVt9
-p192
-(dp193
-V0
-I1
-sV6
-I1
-ssV--
-p194
-(dp195
-V
-I2
-sV"
-I1
-sV-
-I3
-sVF
-I1
-sVI
-I14
-sVM
-I2
-sVS
-I1
-sVU
-I1
-sVT
-I2
-sVY
-I3
-sVa
-I2
-sVb
-I2
-sVe
-I1
-sVd
-I1
-sVg
-I1
-sVf
-I1
-sVi
-I2
-sVh
-I2
-sVm
-I1
-sVn
-I1
-sVp
-I1
-sVs
-I4
-sVt
-I5
-sVw
-I1
-sVv
-I1
-sVy
-I2
-ssVCl
-p196
-(dp197
-Va
-I2
-ssVge
-p198
-(dp199
-V!
-I1
-sV
-I49
-sVd
-I32
-sVf
-I1
-sV)
-I1
-sVm
-I8
-sV,
-I7
-sVo
-I1
-sVn
-I37
-sVs
-I7
-sVr
-I35
-sVt
-I44
-sV;
-I5
-sV.
-I8
-ssVt.
-p200
-(dp201
-V
-I99
-sV"
-I2
-ssVt/
-p202
-(dp203
-Va
-I1
-sVe
-I1
-ssVt,
-p204
-(dp205
-V
-I187
-sV"
-I5
-ssV-I
-p206
-(dp207
-V
-I14
-sVS
-I1
-ssVt*
-p208
-(dp209
-V
-I1
-ssVVO
-p210
-(dp211
-VU
-I1
-ssVt)
-p212
-(dp213
-V
-I2
-sV,
-I1
-ssVGo
-p214
-(dp215
-Va
-I1
-sVd
-I2
-sVo
-I2
-ssVt'
-p216
-(dp217
-Vs
-I3
-ssVt"
-p218
-(dp219
-V)
-I1
-ssVt
-p220
-(dp221
-V#
-I1
-sV(
-I3
-sV1
-I2
-sV<
-I1
-sVA
-I1
-sVC
-I10
-sVB
-I1
-sVE
-I1
-sVD
-I1
-sVG
-I15
-sVF
-I18
-sVI
-I114
-sVH
-I3
-sVM
-I18
-sVL
-I10
-sVO
-I1
-sVP
-I2
-sVS
-I10
-sVR
-I10
-sVT
-I3
-sVW
-I1
-sVY
-I1
-sV[
-I1
-sVa
-I170
-sVc
-I46
-sVb
-I98
-sVe
-I35
-sVd
-I44
-sVg
-I21
-sVf
-I69
-sVi
-I167
-sVh
-I180
-sVk
-I18
-sVj
-I3
-sVm
-I104
-sVl
-I50
-sVo
-I179
-sVn
-I42
-sVq
-I6
-sVp
-I50
-sVs
-I123
-sVr
-I35
-sVu
-I17
-sVt
-I253
-sVw
-I153
-sVv
-I10
-sVy
-I60
-ssVt!
-p222
-(dp223
-V
-I6
-sV"
-I7
-ssVEM
-p224
-(dp225
-VE
-I1
-sVN
-I1
-ssVzi
-p226
-(dp227
-Vp
-I2
-sVn
-I3
-ssV3]
-p228
-(dp229
-V
-I2
-ssVze
-p230
-(dp231
-V
-I5
-sVs
-I1
-sVm
-I1
-sVd
-I6
-sV.
-I1
-ssVM.
-p232
-(dp233
-V
-I3
-ssVza
-p234
-(dp235
-V
-I2
-sVr
-I1
-ssVgo
-p236
-(dp237
-V
-I12
-sV:
-I1
-sVe
-I1
-sVi
-I18
-sV,
-I4
-sVo
-I30
-sVn
-I12
-sVu
-I8
-sVt
-I9
-sVv
-I5
-sV.
-I3
-ssVaw
-p238
-(dp239
-Va
-I25
-sV
-I11
-sVe
-I1
-sV'
-I4
-sVi
-I4
-sVk
-I2
-sV,
-I2
-sV.
-I1
-sVs
-I2
-sVy
-I1
-sVn
-I5
-ssVEN
-p240
-(dp241
-V
-I2
-sVC
-I1
-sVB
-I7
-sVE
-I1
-sVD
-I4
-sVT
-I3
-ssVlw
-p242
-(dp243
-Va
-I27
-ssVEI
-p244
-(dp245
-VT
-I1
-ssVyw
-p246
-(dp247
-Vh
-I2
-ssVgm
-p248
-(dp249
-Ve
-I8
-sVo
-I3
-ssVF
-p250
-(dp251
-VA
-I1
-sVD
-I1
-sVM
-I1
-sVS
-I1
-sVT
-I1
-sVW
-I1
-sVY
-I3
-ssVgl
-p252
-(dp253
-Va
-I9
-sVy
-I6
-sVe
-I7
-sVi
-I2
-sVo
-I2
-ssVbh
-p254
-(dp255
-Vo
-I3
-ssVmt
-p256
-(dp257
-Vh
-I4
-ssVmf
-p258
-(dp259
-Vo
-I11
-ssV at l
-p260
-(dp261
-Vo
-I1
-ssV at p
-p262
-(dp263
-Vo
-I1
-ssVt@
-p264
-(dp265
-Vp
-I1
-ssVg,
-p266
-(dp267
-V
-I40
-ssVrd
-p268
-(dp269
-Va
-I4
-sV
-I51
-sVe
-I13
-sVi
-I13
-sV,
-I5
-sVo
-I1
-sV.
-I5
-sV)
-I1
-sVs
-I19
-sVn
-I1
-sV!
-I3
-sV;
-I4
-sV:
-I2
-sVl
-I7
-ssVe'
-p270
-(dp271
-Vs
-I8
-ssVMe
-p272
-(dp273
-Vl
-I4
-ssV-e
-p274
-(dp275
-Vn
-I1
-ssVMa
-p276
-(dp277
-Vi
-I46
-sVc
-I1
-sVr
-I15
-sVm
-I2
-ssVms
-p278
-(dp279
-V
-I18
-sV,
-I1
-sVe
-I13
-sVt
-I9
-sVp
-I1
-ssV-d
-p280
-(dp281
-Vi
-I1
-sVa
-I3
-sVo
-I1
-ssVe!
-p282
-(dp283
-V
-I16
-sV"
-I2
-ssVMo
-p284
-(dp285
-Vt
-I10
-sVn
-I2
-ssVMi
-p286
-(dp287
-Vs
-I29
-sVc
-I2
-sVd
-I1
-ssVSp
-p288
-(dp289
-Ve
-I1
-ssVMu
-p290
-(dp291
-Vc
-I2
-ssV-f
-p292
-(dp293
-Va
-I1
-sVi
-I1
-sVo
-I1
-ssVbj
-p294
-(dp295
-Vu
-I1
-sVe
-I21
-ssVMr
-p296
-(dp297
-Vs
-I31
-sV.
-I67
-ssV-a
-p298
-(dp299
-V
-I1
-sVn
-I2
-ssVEB
-p300
-(dp301
-VC
-I2
-ssVMy
-p302
-(dp303
-V
-I37
-ssVO
-p304
-(dp305
-Vw
-I1
-sVI
-I1
-sVH
-I1
-sVM
-I21
-sVL
-I16
-sVO
-I1
-sVS
-I2
-sVR
-I2
-sVT
-I3
-sVW
-I1
-sVY
-I2
-ssVME
-p306
-(dp307
-V
-I5
-sVR
-I2
-sVD
-I2
-sV,
-I1
-ssVMG
-p308
-(dp309
-VE
-I1
-ssVMA
-p310
-(dp311
-VI
-I3
-sVY
-I1
-sVL
-I2
-sVG
-I3
-sVD
-I1
-ssVtx
-p312
-(dp313
-Vt
-I3
-ssVMC
-p314
-(dp315
-VI
-I1
-ssVMB
-p316
-(dp317
-VE
-I1
-ssV31
-p318
-(dp319
-V,
-I1
-ssVty
-p320
-(dp321
-V
-I101
-sV"
-I2
-sVi
-I1
-sV)
-I1
-sV-
-I2
-sV,
-I21
-sVl
-I2
-sVp
-I1
-sV;
-I5
-sV.
-I7
-ssVMI
-p322
-(dp323
-VS
-I1
-sVT
-I3
-ssVMU
-p324
-(dp325
-V
-I1
-sVS
-I1
-sV"
-I1
-ssV3*
-p326
-(dp327
-VE
-I1
-ssV;
-p328
-(dp329
-Va
-I90
-sVo
-I3
-sVb
-I62
-sVe
-I1
-sVD
-I1
-sVf
-I12
-sVI
-I27
-sVh
-I21
-sVm
-I2
-sVL
-I1
-sVO
-I1
-sVn
-I9
-sVi
-I9
-sVs
-I8
-sV"
-I7
-sVt
-I9
-sVw
-I9
-sVy
-I11
-sVR
-I1
-sVd
-I1
-ssVMP
-p330
-(dp331
-VL
-I1
-ssV K
-p332
-(dp333
-VI
-I1
-sVi
-I1
-sVe
-I3
-sVn
-I1
-ssVf;
-p334
-(dp335
-V
-I7
-ssVp-
-p336
-(dp337
-V-
-I1
-ssVMY
-p338
-(dp339
-V
-I1
-ssV H
-p340
-(dp341
-Va
-I7
-sVA
-I3
-sVe
-I64
-sVi
-I7
-sVo
-I10
-sVI
-I7
-sVu
-I4
-sVE
-I4
-ssV"d
-p342
-(dp343
-Vo
-I1
-ssVFR
-p344
-(dp345
-VO
-I2
-ssVtu
-p346
-(dp347
-Va
-I25
-sVb
-I1
-sVd
-I5
-sVi
-I1
-sVl
-I8
-sVo
-I1
-sVn
-I20
-sVp
-I3
-sVr
-I64
-sVt
-I3
-ssVFT
-p348
-(dp349
-VP
-I2
-ssVix
-p350
-(dp351
-Vi
-I2
-sV
-I4
-sVe
-I10
-sVt
-I4
-ssV N
-p352
-(dp353
-Va
-I1
-sVE
-I2
-sVo
-I9
-sVU
-I1
-sVO
-I7
-sVe
-I2
-ssVg?
-p354
-(dp355
-V
-I1
-sV"
-I2
-ssV'
-p356
-(dp357
-Vp
-I1
-ssV O
-p358
-(dp359
-V
-I1
-sVC
-I1
-sVF
-I6
-sVh
-I1
-sVf
-I1
-sVN
-I1
-sVR
-I10
-sVu
-I4
-sVT
-I2
-sVn
-I5
-sV.
-I1
-ssVS*
-p360
-(dp361
-V*
-I1
-sVV
-I1
-ssVtp
-p362
-(dp363
-V
-I2
-ssVS-
-p364
-(dp365
-VI
-I1
-ssVS,
-p366
-(dp367
-V
-I1
-ssVS"
-p368
-(dp369
-V.
-I1
-ssVS
-p370
-(dp371
-Vc
-I1
-sVb
-I1
-sVe
-I1
-sVd
-I1
-sVF
-I2
-sVf
-I1
-sVv
-I1
-sVO
-I4
-sVS
-I1
-sVo
-I1
-sVV
-I2
-sVE
-I2
-ssV't
-p372
-(dp373
-V
-I1
-ssVFO
-p374
-(dp375
-VR
-I6
-ssVtn
-p376
-(dp377
-Vi
-I4
-sVe
-I6
-ssVFr
-p378
-(dp379
-Vi
-I4
-sVe
-I87
-sVo
-I2
-ssV"N
-p380
-(dp381
-Vo
-I4
-ssVm!
-p382
-(dp383
-V
-I2
-ssVm
-p384
-(dp385
-V(
-I3
-sVC
-I3
-sVI
-I12
-sVM
-I6
-sVL
-I4
-sVS
-I1
-sVW
-I1
-sVa
-I57
-sVc
-I6
-sVb
-I9
-sVe
-I15
-sVd
-I6
-sVg
-I14
-sVf
-I19
-sVi
-I17
-sVh
-I26
-sVk
-I2
-sVm
-I14
-sVl
-I3
-sVo
-I15
-sVn
-I14
-sVp
-I8
-sVs
-I43
-sVr
-I7
-sVu
-I3
-sVt
-I53
-sVw
-I14
-sVv
-I5
-sVy
-I10
-ssVto
-p386
-(dp387
-V
-I900
-sVg
-I12
-sVf
-I2
-sVm
-I2
-sV-
-I5
-sVl
-I18
-sVo
-I54
-sV.
-I1
-sVp
-I2
-sVr
-I31
-sVu
-I1
-sVt
-I6
-sVw
-I35
-sVn
-I18
-sV;
-I1
-sV:
-I1
-sV,
-I1
-sV?
-I1
-ssVm-
-p388
-(dp389
-V
-I1
-sV-
-I2
-ssVm,
-p390
-(dp391
-V
-I52
-ssVO.
-p392
-(dp393
-V
-I1
-ssVm.
-p394
-(dp395
-V
-I28
-sV"
-I1
-ssVm)
-p396
-(dp397
-V.
-I1
-ssVtl
-p398
-(dp399
-Vy
-I53
-sVe
-I53
-ssVFa
-p400
-(dp401
-Vc
-I1
-sVr
-I1
-ssVd!
-p402
-(dp403
-V
-I7
-sV"
-I2
-ssV-v
-p404
-(dp405
-Ve
-I1
-ssVvi
-p406
-(dp407
-Vc
-I15
-sVe
-I9
-sVd
-I7
-sVg
-I1
-sVl
-I8
-sVo
-I25
-sVn
-I71
-sVs
-I26
-sVr
-I1
-sVt
-I14
-sVv
-I2
-ssVFi
-p408
-(dp409
-Vl
-I1
-ssVu?
-p410
-(dp411
-V
-I1
-ssVm>
-p412
-(dp413
-V
-I1
-ssVFl
-p414
-(dp415
-Ve
-I1
-ssVm;
-p416
-(dp417
-V
-I6
-ssVFo
-p418
-(dp419
-Vr
-I7
-ssVoq
-p420
-(dp421
-Vu
-I6
-ssVir
-p422
-(dp423
-Va
-I9
-sV
-I81
-sVc
-I11
-sVe
-I64
-sVi
-I15
-sVm
-I8
-sVl
-I29
-sVo
-I2
-sV,
-I6
-sVs
-I31
-sVr
-I3
-sVu
-I1
-sVt
-I11
-sVy
-I2
-sV;
-I1
-sV.
-I1
-ssV T
-p424
-(dp425
-Ve
-I2
-sVi
-I1
-sVh
-I69
-sVo
-I12
-sVr
-I1
-sVu
-I2
-sVO
-I49
-sVH
-I11
-ssV9.
-p426
-(dp427
-V9
-I1
-ssViu
-p428
-(dp429
-Vc
-I1
-sVm
-I8
-sVs
-I1
-ssV U
-p430
-(dp431
-Vp
-I9
-sVS
-I1
-sVN
-I2
-sVn
-I8
-ssVSu
-p432
-(dp433
-Vs
-I79
-sVr
-I1
-sVm
-I8
-sVc
-I2
-ssVSt
-p434
-(dp435
-Va
-I6
-sVr
-I18
-ssV99
-p436
-(dp437
-V7
-I1
-sV6
-I1
-ssVSi
-p438
-(dp439
-Vs
-I1
-sVr
-I59
-sVl
-I2
-sVn
-I3
-ssVSh
-p440
-(dp441
-Ve
-I42
-ssVSo
-p442
-(dp443
-Vm
-I3
-sV,
-I1
-sVl
-I1
-ssVSm
-p444
-(dp445
-Va
-I5
-sVi
-I6
-ssVG.
-p446
-(dp447
-V;
-I1
-ssV90
-p448
-(dp449
-V
-I2
-ssV93
-p450
-(dp451
-V*
-I1
-ssVvo
-p452
-(dp453
-Vc
-I3
-sVi
-I7
-sVk
-I7
-sVl
-I3
-sVu
-I23
-sVt
-I4
-sVw
-I2
-ssV94
-p454
-(dp455
-V6
-I1
-ssV97
-p456
-(dp457
-V1
-I1
-sV
-I1
-ssV96
-p458
-(dp459
-V
-I2
-ssVme
-p460
-(dp461
-Va
-I34
-sV
-I265
-sVe
-I9
-sVd
-I39
-sVf
-I1
-sV-
-I2
-sVm
-I12
-sV,
-I52
-sVo
-I1
-sVn
-I143
-sVs
-I75
-sVr
-I26
-sV!
-I4
-sVt
-I30
-sVw
-I3
-sV;
-I11
-sV.
-I37
-sV?
-I3
-sVl
-I5
-ssV-r
-p462
-(dp463
-Vo
-I7
-ssVmg
-p464
-(dp465
-Ve
-I1
-ssV Y
-p466
-(dp467
-Ve
-I3
-sVO
-I8
-sVo
-I56
-ssVma
-p468
-(dp469
-V
-I3
-sVc
-I7
-sVz
-I1
-sVd
-I28
-sVg
-I13
-sVi
-I23
-sVk
-I53
-sV'
-I1
-sVm
-I4
-sVl
-I14
-sVn
-I115
-sVs
-I6
-sVr
-I52
-sVt
-I48
-sVy
-I75
-sV.
-I1
-sV,
-I1
-ssVmb
-p470
-(dp471
-Vi
-I1
-sVa
-I3
-sVr
-I1
-sVe
-I14
-sVl
-I7
-ssVmm
-p472
-(dp473
-Va
-I12
-sVu
-I3
-sVe
-I34
-sVi
-I4
-sVo
-I12
-ssVml
-p474
-(dp475
-Vy
-I6
-sVe
-I1
-ssVmo
-p476
-(dp477
-Vd
-I4
-sVm
-I15
-sVo
-I1
-sVn
-I45
-sVs
-I50
-sVr
-I91
-sVu
-I13
-sVt
-I69
-sVv
-I13
-ssVmn
-p478
-(dp479
-Vi
-I3
-sV
-I2
-sVs
-I1
-sVe
-I1
-ssVmi
-p480
-(dp481
-Va
-I7
-sVe
-I1
-sVd
-I5
-sVg
-I31
-sVl
-I40
-sVn
-I72
-sVs
-I49
-sVr
-I10
-sVt
-I24
-sVx
-I5
-ssVvr
-p482
-(dp483
-Ve
-I1
-ssVSU
-p484
-(dp485
-VC
-I1
-sVS
-I23
-ssVST
-p486
-(dp487
-VA
-I2
-sV
-I1
-sVR
-I2
-sVE
-I1
-ssVmu
-p488
-(dp489
-Vc
-I54
-sVs
-I100
-sVl
-I2
-sVn
-I3
-ssVRW
-p490
-(dp491
-VI
-I1
-ssVSI
-p492
-(dp493
-VR
-I2
-sVB
-I1
-sVO
-I2
-ssVSH
-p494
-(dp495
-VE
-I3
-ssVSO
-p496
-(dp497
-VN
-I18
-ssVmp
-p498
-(dp499
-Va
-I28
-sVe
-I16
-sVh
-I3
-sVl
-I31
-sVo
-I23
-sVr
-I18
-sVu
-I13
-sVt
-I17
-ssVSM
-p500
-(dp501
-VA
-I2
-ssVUT
-p502
-(dp503
-VI
-I1
-sV
-I5
-sV*
-I1
-sVE
-I7
-ssVSC
-p504
-(dp505
-VI
-I2
-sVL
-I1
-ssV"p
-p506
-(dp507
-Vu
-I1
-ssVSA
-p508
-(dp509
-VM
-I4
-sVN
-I23
-ssVmy
-p510
-(dp511
-V
-I292
-sVs
-I56
-sV;
-I1
-ssV.9
-p512
-(dp513
-V3
-I1
-ssVSE
-p514
-(dp515
-VQ
-I1
-sV
-I2
-sVN
-I2
-sV.
-I1
-ssVLe
-p516
-(dp517
-Va
-I1
-sVt
-I5
-ssV"r
-p518
-(dp519
-Ve
-I1
-ssVYO
-p520
-(dp521
-VU
-I8
-ssVLa
-p522
-(dp523
-Vk
-I1
-sVd
-I76
-sVn
-I19
-ssVLo
-p524
-(dp525
-Vn
-I22
-ssVf:
-p526
-(dp527
-V
-I1
-ssV"s
-p528
-(dp529
-Vm
-I1
-ssVGU
-p530
-(dp531
-VT
-I10
-ssVRP
-p532
-(dp533
-VO
-I1
-ssVf
-p534
-(dp535
-V2
-I1
-sV8
-I1
-sVD
-I1
-sVF
-I15
-sVI
-I14
-sVH
-I1
-sVM
-I17
-sVL
-I12
-sVP
-I1
-sVS
-I5
-sVR
-I6
-sVT
-I1
-sVV
-I1
-sVa
-I75
-sVc
-I28
-sVb
-I11
-sVe
-I14
-sVd
-I9
-sVg
-I10
-sVf
-I16
-sVi
-I49
-sVh
-I134
-sVk
-I1
-sVj
-I1
-sVm
-I70
-sVl
-I16
-sVo
-I18
-sVn
-I9
-sVq
-I3
-sVp
-I15
-sVs
-I45
-sVr
-I17
-sVu
-I5
-sVt
-I119
-sVw
-I22
-sVv
-I6
-sVy
-I55
-ssVf!
-p536
-(dp537
-V
-I1
-ssVdm
-p538
-(dp539
-Vi
-I14
-ssVUS
-p540
-(dp541
-VA
-I23
-sVI
-I1
-sVE
-I1
-sVT
-I1
-ssV 9
-p542
-(dp543
-V0
-I1
-ssVf,
-p544
-(dp545
-V
-I22
-ssVf-
-p546
-(dp547
-Vc
-I1
-sVw
-I1
-ssVf.
-p548
-(dp549
-V
-I11
-ssVs;
-p550
-(dp551
-V
-I34
-ssVs:
-p552
-(dp553
-V
-I6
-ssVLD
-p554
-(dp555
-V
-I3
-ssVLE
-p556
-(dp557
-VT
-I1
-ssV,"
-p558
-(dp559
-V
-I22
-ssVe"
-p560
-(dp561
-V
-I1
-ssV,
-p562
-(dp563
-V"
-I19
-sV&
-I19
-sV1
-I1
-sV2
-I2
-sVA
-I2
-sVC
-I4
-sVB
-I1
-sVE
-I3
-sVD
-I2
-sVF
-I4
-sVI
-I121
-sVH
-I1
-sVM
-I3
-sVL
-I2
-sVO
-I2
-sVP
-I1
-sVS
-I3
-sVR
-I3
-sVT
-I1
-sV[
-I1
-sVa
-I430
-sVc
-I26
-sVb
-I111
-sVe
-I16
-sVd
-I15
-sVg
-I4
-sVf
-I56
-sVi
-I96
-sVh
-I73
-sVk
-I3
-sVj
-I2
-sVm
-I59
-sVl
-I12
-sVo
-I53
-sVn
-I18
-sVq
-I1
-sVp
-I11
-sVs
-I46
-sVr
-I3
-sVu
-I2
-sVt
-I180
-sVw
-I142
-sVv
-I3
-sVy
-I28
-ssVLA
-p564
-(dp565
-VI
-I1
-sVR
-I1
-sVD
-I35
-ssVLL
-p566
-(dp567
-V
-I2
-ssV,-
-p568
-(dp569
-V-
-I19
-ssVYe
-p570
-(dp571
-Vt
-I3
-ssVLI
-p572
-(dp573
-VA
-I1
-sV
-I1
-sVC
-I7
-sVE
-I1
-sVG
-I1
-sVM
-I3
-sVS
-I1
-sVT
-I3
-ssVs*
-p574
-(dp575
-V
-I1
-sV*
-I1
-ssVs)
-p576
-(dp577
-V
-I1
-sV;
-I1
-ssVLU
-p578
-(dp579
-VS
-I1
-sVD
-I2
-ssVs.
-p580
-(dp581
-V
-I119
-sV"
-I3
-ssV,0
-p582
-(dp583
-V0
-I3
-ssVs,
-p584
-(dp585
-V
-I191
-sV"
-I1
-ssVs"
-p586
-(dp587
-V.
-I1
-ssVs!
-p588
-(dp589
-V!
-I1
-sV
-I10
-ssVs
-p590
-(dp591
-V"
-I5
-sV(
-I1
-sV*
-I1
-sVC
-I2
-sVD
-I1
-sVF
-I5
-sVI
-I40
-sVM
-I21
-sVL
-I8
-sVP
-I3
-sVS
-I12
-sVR
-I4
-sVV
-I7
-sV[
-I1
-sVa
-I235
-sVc
-I71
-sVb
-I62
-sVe
-I62
-sVd
-I53
-sVg
-I31
-sVf
-I62
-sVi
-I126
-sVh
-I96
-sVk
-I3
-sVj
-I15
-sVm
-I111
-sVl
-I32
-sVo
-I127
-sVn
-I85
-sVq
-I6
-sVp
-I53
-sVs
-I129
-sVr
-I36
-sVu
-I17
-sVt
-I181
-sVw
-I87
-sVv
-I24
-sVy
-I28
-ssVs'
-p592
-(dp593
-V
-I1
-sVs
-I6
-ssVr!
-p594
-(dp595
-V
-I6
-ssVfr
-p596
-(dp597
-Vi
-I36
-sVa
-I11
-sVe
-I11
-sVo
-I110
-ssVo?
-p598
-(dp599
-V
-I1
-sV"
-I1
-ssVft
-p600
-(dp601
-Vy
-I1
-sVp
-I2
-sVe
-I36
-sVw
-I2
-sV
-I12
-ssVfu
-p602
-(dp603
-Vs
-I12
-sVr
-I8
-sVt
-I4
-sVl
-I58
-sVn
-I4
-ssVL
-p604
-(dp605
-VP
-I2
-sVD
-I1
-sVo
-I1
-sV6
-I1
-ssVu!
-p606
-(dp607
-V)
-I1
-sV
-I3
-ssVfy
-p608
-(dp609
-Vi
-I4
-sV
-I9
-sV,
-I1
-ssVL,
-p610
-(dp611
-V
-I1
-ssVI;
-p612
-(dp613
-V
-I1
-ssV?0
-p614
-(dp615
-V0
-I1
-ssVfa
-p616
-(dp617
-Vc
-I16
-sVi
-I19
-sVm
-I24
-sVl
-I4
-sVn
-I7
-sVs
-I10
-sVr
-I18
-sVu
-I6
-sVt
-I20
-sVv
-I14
-ssVSS
-p618
-(dp619
-VI
-I1
-sV
-I3
-ssVr?
-p620
-(dp621
-V
-I3
-sV"
-I4
-ssVfe
-p622
-(dp623
-Va
-I20
-sV
-I14
-sVc
-I72
-sVe
-I47
-sV'
-I3
-sVm
-I1
-sV,
-I10
-sV.
-I5
-sVs
-I9
-sVr
-I41
-sV!
-I1
-sVt
-I4
-sVw
-I15
-sV?
-I1
-sVl
-I10
-ssVff
-p624
-(dp625
-Va
-I10
-sV
-I9
-sVe
-I73
-sVi
-I14
-sV,
-I1
-sVo
-I9
-ssVUD
-p626
-(dp627
-VI
-I2
-ssVfi
-p628
-(dp629
-Va
-I1
-sVc
-I25
-sVe
-I22
-sVd
-I4
-sVg
-I1
-sVf
-I2
-sVl
-I10
-sVn
-I30
-sVs
-I2
-sVr
-I31
-sVt
-I10
-sVv
-I2
-sVx
-I10
-ssVfl
-p630
-(dp631
-Vi
-I10
-sVe
-I3
-sVu
-I11
-sVa
-I6
-sVo
-I1
-ssVH
-p632
-(dp633
-VD
-I1
-sVO
-I1
-ssVfo
-p634
-(dp635
-Vr
-I454
-sVu
-I20
-sVl
-I13
-sVo
-I3
-sVn
-I3
-ssVCY
-p636
-(dp637
-V
-I23
-sV.
-I5
-ssVg'
-p638
-(dp639
-Vs
-I7
-ssVsy
-p640
-(dp641
-V
-I13
-sVm
-I2
-sVl
-I3
-sV,
-I3
-sV;
-I1
-sV.
-I3
-ssVEv
-p642
-(dp643
-Ve
-I4
-ssVYo
-p644
-(dp645
-Vu
-I61
-ssVY.
-p646
-(dp647
-V
-I5
-ssVss
-p648
-(dp649
-Va
-I14
-sV
-I133
-sV:
-I1
-sVe
-I40
-sVi
-I87
-sVm
-I3
-sV,
-I17
-sVo
-I5
-sV.
-I10
-sV!
-I3
-sVu
-I19
-sVw
-I1
-sV;
-I8
-sVn
-I1
-sVl
-I2
-ssVY
-p650
-(dp651
-VB
-I1
-sVE
-I1
-sVD
-I12
-sVK
-I1
-sVM
-I1
-sVO
-I3
-sVS
-I24
-sVT
-I7
-ssVsp
-p652
-(dp653
-Va
-I5
-sVe
-I67
-sVi
-I31
-sVl
-I8
-sVo
-I34
-sVr
-I1
-sVu
-I2
-ssVsw
-p654
-(dp655
-Va
-I1
-sVe
-I11
-sVo
-I1
-ssVsu
-p656
-(dp657
-Va
-I18
-sVc
-I70
-sVb
-I30
-sVe
-I2
-sVd
-I5
-sVg
-I2
-sVf
-I11
-sVi
-I6
-sVm
-I1
-sVl
-I3
-sVn
-I3
-sVp
-I31
-sVs
-I13
-sVr
-I89
-ssVst
-p658
-(dp659
-Va
-I98
-sV
-I307
-sV:
-I1
-sVe
-I75
-sV!
-I1
-sVi
-I61
-sV-
-I2
-sVm
-I2
-sV,
-I24
-sVo
-I42
-sV.
-I5
-sVs
-I2
-sVr
-I52
-sVu
-I7
-sVy
-I5
-sV;
-I5
-sVn
-I2
-sVl
-I6
-ssVsk
-p660
-(dp661
-V
-I8
-sVe
-I2
-sV)
-I1
-sV,
-I2
-sV.
-I1
-sVi
-I3
-ssVsi
-p662
-(dp663
-Vc
-I5
-sVb
-I39
-sVd
-I31
-sVg
-I19
-sVm
-I3
-sVl
-I19
-sVo
-I56
-sVn
-I82
-sVp
-I3
-sVs
-I40
-sVr
-I17
-sVt
-I64
-sVv
-I10
-sVx
-I5
-sVz
-I2
-ssVsh
-p664
-(dp665
-Va
-I65
-sV
-I45
-sVe
-I214
-sVi
-I34
-sVm
-I10
-sV,
-I3
-sVo
-I83
-sVn
-I1
-sVr
-I3
-sVu
-I2
-sVy
-I4
-sVl
-I1
-ssVso
-p666
-(dp667
-V
-I139
-sVc
-I9
-sVb
-I1
-sVf
-I7
-sVm
-I81
-sVl
-I44
-sVo
-I38
-sVn
-I73
-sVr
-I23
-sVu
-I4
-sV.
-I5
-sV,
-I4
-ssVsn
-p668
-(dp669
-V1
-I4
-sVe
-I7
-ssVsm
-p670
-(dp671
-Va
-I7
-sVi
-I7
-sVe
-I3
-sVo
-I1
-ssVsl
-p672
-(dp673
-Vi
-I13
-sVy
-I9
-sVe
-I2
-sVa
-I3
-ssVsc
-p674
-(dp675
-Va
-I18
-sVe
-I3
-sVi
-I9
-sVh
-I12
-sVl
-I5
-sVo
-I17
-sVr
-I13
-sVu
-I1
-ssVsb
-p676
-(dp677
-Va
-I17
-sVe
-I1
-ssVsa
-p678
-(dp679
-Vc
-I5
-sVb
-I7
-sVd
-I8
-sVg
-I5
-sVf
-I3
-sVi
-I25
-sVk
-I3
-sVm
-I12
-sVl
-I5
-sVn
-I82
-sVp
-I6
-sVr
-I12
-sVu
-I1
-sVt
-I34
-sVw
-I10
-sVv
-I4
-sVy
-I28
-ssVUB
-p680
-(dp681
-VL
-I2
-ssVsg
-p682
-(dp683
-Va
-I1
-sVu
-I1
-ssVsf
-p684
-(dp685
-Vy
-I2
-sVi
-I10
-sVe
-I1
-sVa
-I6
-ssVse
-p686
-(dp687
-V!
-I2
-sV
-I179
-sV)
-I1
-sV,
-I32
-sV.
-I15
-sV;
-I3
-sV:
-I2
-sV?
-I2
-sVa
-I3
-sVc
-I12
-sVe
-I85
-sVd
-I68
-sVf
-I1
-sVm
-I6
-sVl
-I126
-sVn
-I99
-sVq
-I8
-sVp
-I10
-sVs
-I23
-sVr
-I54
-sVt
-I12
-sVw
-I1
-sVv
-I14
-sVx
-I2
-ssVsd
-p688
-(dp689
-Va
-I8
-ssVy)
-p690
-(dp691
-V
-I2
-sV.
-I1
-ssVh:
-p692
-(dp693
-V
-I1
-ssVy-
-p694
-(dp695
-V-
-I2
-sVm
-I1
-sVt
-I2
-ssVy,
-p696
-(dp697
-V
-I106
-sV"
-I2
-ssVy.
-p698
-(dp699
-V
-I56
-sV"
-I2
-ssVy!
-p700
-(dp701
-V
-I3
-sV"
-I1
-ssVy
-p702
-(dp703
-V(
-I4
-sV1
-I1
-sVC
-I2
-sVB
-I1
-sVD
-I2
-sVF
-I1
-sVI
-I9
-sVH
-I3
-sVJ
-I5
-sVM
-I3
-sVL
-I1
-sVO
-I1
-sVP
-I1
-sVS
-I72
-sVR
-I2
-sVT
-I1
-sVV
-I1
-sVa
-I136
-sVc
-I51
-sVb
-I72
-sVe
-I40
-sVd
-I128
-sVg
-I26
-sVf
-I64
-sVi
-I69
-sVh
-I79
-sVk
-I7
-sVj
-I5
-sVm
-I49
-sVl
-I35
-sVo
-I106
-sVn
-I21
-sVp
-I53
-sVs
-I94
-sVr
-I46
-sVu
-I22
-sVt
-I158
-sVw
-I76
-sVv
-I10
-sVy
-I17
-ssV 5
-p704
-(dp705
-V%
-I1
-ssVGI
-p706
-(dp707
-VN
-I3
-sVV
-I1
-ssV%
-p708
-(dp709
-Vo
-I4
-ssVy'
-p710
-(dp711
-Vs
-I2
-ssVRe
-p712
-(dp713
-Va
-I1
-sVp
-I1
-sVg
-I78
-sVf
-I1
-ssVy;
-p714
-(dp715
-V
-I29
-ssV!"
-p716
-(dp717
-V
-I14
-ssVV.
-p718
-(dp719
-V
-I4
-ssVy?
-p720
-(dp721
-V
-I1
-ssVRo
-p722
-(dp723
-Vy
-I1
-ssVSa
-p724
-(dp725
-Vy
-I1
-ssVRi
-p726
-(dp727
-Vg
-I1
-ssVRT
-p728
-(dp729
-VI
-I1
-sV*
-I2
-ssV25
-p730
-(dp731
-V
-I1
-ssVld
-p732
-(dp733
-V
-I277
-sVe
-I5
-sV'
-I7
-sVi
-I3
-sV-
-I1
-sV,
-I30
-sVo
-I3
-sV.
-I11
-sVr
-I8
-sVn
-I1
-sV;
-I2
-sV:
-I1
-sV?
-I1
-ssVle
-p734
-(dp735
-V!
-I4
-sV
-I203
-sV"
-I1
-sV'
-I2
-sV,
-I36
-sV.
-I14
-sV;
-I4
-sV:
-I1
-sVa
-I92
-sVc
-I19
-sVb
-I1
-sVe
-I1
-sVd
-I31
-sVg
-I8
-sVf
-I12
-sVi
-I3
-sVm
-I7
-sVn
-I49
-sVs
-I59
-sVr
-I6
-sVt
-I54
-sVv
-I7
-sVx
-I4
-ssV20
-p736
-(dp737
-V0
-I4
-sV%
-I1
-ssVlc
-p738
-(dp739
-Vu
-I3
-sVo
-I3
-ssVRR
-p740
-(dp741
-VA
-I4
-ssVla
-p742
-(dp743
-V
-I1
-sVc
-I24
-sVb
-I3
-sVd
-I27
-sVg
-I4
-sVi
-I23
-sVm
-I15
-sVn
-I36
-sVp
-I1
-sVs
-I25
-sVr
-I46
-sVu
-I9
-sVt
-I36
-sVw
-I12
-sVv
-I2
-sVy
-I11
-sVx
-I1
-ssVln
-p744
-(dp745
-Ve
-I3
-ssVlo
-p746
-(dp747
-Vd
-I3
-sVg
-I5
-sVi
-I1
-sVm
-I1
-sVo
-I34
-sVn
-I56
-sVq
-I1
-sVp
-I2
-sVs
-I13
-sVr
-I1
-sVu
-I24
-sVt
-I2
-sVw
-I39
-sVv
-I30
-sVy
-I2
-ssVll
-p748
-(dp749
-Va
-I9
-sV
-I379
-sV:
-I1
-sVe
-I23
-sVi
-I28
-sV-
-I11
-sV,
-I23
-sVo
-I32
-sVn
-I1
-sV)
-I1
-sVs
-I3
-sV!
-I1
-sVu
-I3
-sVy
-I84
-sV;
-I6
-sV.
-I34
-sV?
-I1
-ssVlm
-p750
-(dp751
-V
-I2
-sVe
-I1
-sVl
-I2
-sVo
-I7
-sVn
-I1
-ssV28
-p752
-(dp753
-V,
-I1
-ssV29
-p754
-(dp755
-V.
-I1
-ssVli
-p756
-(dp757
-Va
-I20
-sVc
-I35
-sVb
-I12
-sVe
-I49
-sVd
-I1
-sVg
-I37
-sVf
-I15
-sVh
-I1
-sVk
-I30
-sVm
-I4
-sVo
-I8
-sVn
-I57
-sVp
-I3
-sVs
-I21
-sVr
-I8
-sVt
-I58
-sVv
-I11
-ssVlv
-p758
-(dp759
-Ve
-I18
-ssVRE
-p760
-(dp761
-V!
-I1
-sVA
-I2
-sVC
-I1
-sVG
-I3
-sV
-I3
-sVM
-I1
-sVS
-I2
-ssVlt
-p762
-(dp763
-Va
-I1
-sV
-I9
-sVe
-I15
-sVi
-I4
-sVh
-I5
-sV,
-I1
-sVo
-I4
-sV.
-I3
-sVs
-I3
-sVy
-I6
-ssVlu
-p764
-(dp765
-Vc
-I7
-sVe
-I14
-sVd
-I17
-sVn
-I1
-sVs
-I7
-sVr
-I1
-sVt
-I19
-ssVlr
-p766
-(dp767
-Ve
-I8
-ssVls
-p768
-(dp769
-V
-I9
-sVu
-I4
-sVe
-I6
-sVo
-I9
-sVt
-I1
-ssVlp
-p770
-(dp771
-Vi
-I1
-sV
-I10
-sV-
-I1
-ssVRC
-p772
-(dp773
-VY
-I28
-sVH
-I1
-ssV-"
-p774
-(dp775
-V
-I1
-ssVRN
-p776
-(dp777
-VO
-I49
-ssVRO
-p778
-(dp779
-VJ
-I7
-sVM
-I2
-sVT
-I1
-sVV
-I1
-ssVRI
-p780
-(dp781
-VC
-I1
-sVB
-I1
-sVN
-I9
-ssVly
-p782
-(dp783
-V
-I398
-sVi
-I4
-sV-
-I1
-sV,
-I29
-sV.
-I17
-sV;
-I9
-sVz
-I1
-ssVyi
-p784
-(dp785
-Vs
-I1
-sVe
-I2
-sVn
-I38
-ssVym
-p786
-(dp787
-Ve
-I3
-sVm
-I1
-sVo
-I9
-sVp
-I1
-ssVyl
-p788
-(dp789
-Ve
-I2
-sVl
-I3
-ssVyo
-p790
-(dp791
-Vu
-I473
-sVn
-I18
-ssVt?
-p792
-(dp793
-V
-I3
-sV"
-I1
-ssVya
-p794
-(dp795
-Vb
-I1
-sVl
-I4
-ssV2]
-p796
-(dp797
-V
-I4
-ssVyb
-p798
-(dp799
-Vo
-I2
-ssVye
-p800
-(dp801
-Va
-I13
-sVd
-I7
-sVl
-I1
-sV,
-I1
-sVs
-I13
-sVr
-I1
-sVt
-I21
-ssV.0
-p802
-(dp803
-V4
-I1
-ssVyz
-p804
-(dp805
-Ve
-I1
-ssVR
-p806
-(dp807
-VA
-I2
-sVC
-I1
-sVB
-I2
-sVD
-I1
-sVF
-I2
-sVI
-I2
-sVi
-I1
-sVs
-I1
-sVO
-I1
-sVN
-I1
-sVP
-I3
-sVS
-I1
-sVR
-I3
-sVt
-I2
-sVv
-I1
-sV"
-I1
-ssVR,
-p808
-(dp809
-V
-I2
-sV-
-I1
-ssVyp
-p810
-(dp811
-Ve
-I3
-ssVys
-p812
-(dp813
-V
-I37
-sVe
-I55
-sVi
-I2
-sVh
-I12
-sV-
-I1
-sV,
-I2
-sV.
-I4
-sVt
-I1
-ssVyr
-p814
-(dp815
-Vi
-I8
-ssVyt
-p816
-(dp817
-Vh
-I27
-sVe
-I1
-ssVm"
-p818
-(dp819
-V
-I1
-ssVCr
-p820
-(dp821
-Ve
-I1
-sVu
-I1
-ssVl'
-p822
-(dp823
-Vs
-I1
-ssVl
-p824
-(dp825
-V(
-I1
-sVE
-I1
-sVF
-I1
-sVI
-I6
-sVM
-I1
-sVN
-I1
-sVP
-I6
-sVS
-I2
-sVT
-I1
-sVW
-I1
-sVa
-I48
-sVc
-I14
-sVb
-I43
-sVe
-I10
-sVd
-I14
-sVg
-I8
-sVf
-I26
-sVi
-I26
-sVh
-I24
-sVk
-I7
-sVj
-I1
-sVm
-I23
-sVl
-I11
-sVo
-I29
-sVn
-I31
-sVq
-I2
-sVp
-I13
-sVs
-I32
-sVr
-I13
-sVu
-I4
-sVt
-I74
-sVw
-I13
-sVv
-I3
-sVy
-I16
-ssVl!
-p826
-(dp827
-V
-I4
-ssVl.
-p828
-(dp829
-V
-I48
-ssVl,
-p830
-(dp831
-V
-I48
-ssVl-
-p832
-(dp833
-Vb
-I1
-sVd
-I1
-sVf
-I2
-sV-
-I1
-sVo
-I2
-sVn
-I2
-sVu
-I1
-sVt
-I1
-ssVl)
-p834
-(dp835
-V
-I1
-sV.
-I1
-ssVAs
-p836
-(dp837
-V
-I7
-sVs
-I3
-sVk
-I1
-ssV-M
-p838
-(dp839
-Vr
-I2
-sVe
-I3
-ssVl?
-p840
-(dp841
-V"
-I1
-ssVl:
-p842
-(dp843
-V
-I2
-ssVl;
-p844
-(dp845
-V
-I8
-ssVem
-p846
-(dp847
-Va
-I28
-sV
-I27
-sVb
-I17
-sVe
-I60
-sVi
-I4
-sV-
-I1
-sV,
-I3
-sVo
-I21
-sVn
-I6
-sVp
-I26
-sVs
-I12
-sVu
-I1
-sVy
-I1
-sV;
-I1
-sV.
-I4
-ssVel
-p848
-(dp849
-Va
-I11
-sV
-I23
-sVc
-I3
-sVe
-I16
-sVd
-I7
-sVf
-I116
-sVi
-I95
-sVl
-I78
-sVo
-I8
-sV.
-I1
-sVp
-I12
-sVs
-I5
-sVt
-I9
-sVv
-I7
-sVy
-I111
-ssVeo
-p850
-(dp851
-Vp
-I2
-sVv
-I2
-sVu
-I3
-sVn
-I1
-ssVen
-p852
-(dp853
-V!
-I1
-sV
-I287
-sV*
-I2
-sV-
-I1
-sV,
-I23
-sV.
-I6
-sV;
-I3
-sV:
-I1
-sV?
-I1
-sVa
-I11
-sVc
-I94
-sVb
-I15
-sVe
-I47
-sVd
-I140
-sVg
-I26
-sVi
-I21
-sVj
-I5
-sVl
-I1
-sVo
-I20
-sVn
-I2
-sVq
-I2
-sVs
-I57
-sVr
-I3
-sVu
-I1
-sVt
-I388
-sVv
-I1
-sVy
-I1
-sVz
-I2
-ssVei
-p854
-(dp855
-Vg
-I5
-sVn
-I51
-sVp
-I1
-sVs
-I3
-sVr
-I18
-sVt
-I17
-sVv
-I38
-ssVh,
-p856
-(dp857
-V
-I30
-ssV8,
-p858
-(dp859
-V
-I1
-ssVej
-p860
-(dp861
-Ve
-I2
-sVu
-I5
-sVo
-I5
-ssVee
-p862
-(dp863
-Va
-I11
-sV
-I62
-sVc
-I2
-sVd
-I37
-sVi
-I15
-sVk
-I14
-sVm
-I29
-sV,
-I1
-sVn
-I106
-sVp
-I21
-sVs
-I4
-sVr
-I5
-sVt
-I35
-sVl
-I43
-ssVed
-p864
-(dp865
-V!
-I5
-sV
-I663
-sVe
-I91
-sVd
-I1
-sVg
-I6
-sVi
-I43
-sV-
-I2
-sV,
-I94
-sVo
-I1
-sVn
-I4
-sV.
-I34
-sVs
-I1
-sVu
-I13
-sVy
-I2
-sV;
-I14
-sV:
-I2
-sV]
-I1
-sV?
-I1
-sVl
-I4
-ssVeg
-p866
-(dp867
-Va
-I20
-sV
-I1
-sVe
-I1
-sVg
-I3
-sVi
-I84
-sVl
-I5
-sVr
-I20
-sVu
-I5
-ssVef
-p868
-(dp869
-Va
-I2
-sV
-I4
-sVe
-I13
-sVf
-I12
-sVi
-I6
-sV,
-I1
-sVo
-I59
-sVl
-I3
-sVr
-I1
-sVu
-I19
-sVt
-I12
-sVy
-I2
-ssVea
-p870
-(dp871
-V
-I12
-sVc
-I24
-sVb
-I11
-sVd
-I49
-sVg
-I9
-sVk
-I31
-sVl
-I55
-sVn
-I30
-sVs
-I119
-sVr
-I216
-sVu
-I5
-sVt
-I81
-sVv
-I48
-sV;
-I1
-sVz
-I2
-sV,
-I1
-ssVec
-p872
-(dp873
-Va
-I8
-sVe
-I70
-sVi
-I17
-sVh
-I2
-sVk
-I2
-sVl
-I14
-sVo
-I17
-sV.
-I1
-sVr
-I1
-sVu
-I13
-sVt
-I216
-ssVeb
-p874
-(dp875
-Vy
-I1
-sVa
-I1
-sVr
-I1
-sVe
-I1
-sVt
-I3
-ssVEx
-p876
-(dp877
-Vc
-I1
-sVe
-I1
-ssVex
-p878
-(dp879
-Va
-I14
-sVc
-I35
-sVe
-I9
-sVi
-I9
-sV,
-I2
-sVq
-I1
-sVp
-I55
-sVu
-I1
-sVt
-I69
-ssV82
-p880
-(dp881
-V
-I1
-sV5
-I1
-ssVet
-p882
-(dp883
-Va
-I7
-sV
-I86
-sVc
-I14
-sVe
-I69
-sVi
-I16
-sVh
-I38
-sV,
-I14
-sVo
-I5
-sV.
-I16
-sVs
-I3
-sVr
-I8
-sVu
-I27
-sVt
-I72
-sVw
-I14
-sVy
-I20
-sV;
-I2
-sVn
-I1
-sVl
-I2
-ssVew
-p884
-(dp885
-Va
-I3
-sV
-I28
-sVe
-I1
-sVi
-I2
-sVh
-I4
-sV.
-I1
-sVs
-I8
-sV;
-I1
-ssVev
-p886
-(dp887
-Vi
-I18
-sVa
-I3
-sVe
-I293
-sVo
-I7
-ssVeq
-p888
-(dp889
-Vu
-I47
-ssVep
-p890
-(dp891
-Va
-I22
-sV
-I10
-sVe
-I16
-sVi
-I5
-sVl
-I16
-sVo
-I6
-sVs
-I1
-sVr
-I17
-sVu
-I2
-sVt
-I21
-ssVes
-p892
-(dp893
-V!
-I2
-sV
-I212
-sV'
-I5
-sV)
-I1
-sV-
-I1
-sV,
-I45
-sV.
-I16
-sV;
-I7
-sV:
-I2
-sV?
-I2
-sV]
-I2
-sVa
-I1
-sVc
-I12
-sVe
-I63
-sVd
-I4
-sVi
-I32
-sVh
-I1
-sVo
-I23
-sVp
-I29
-sVs
-I204
-sVu
-I2
-sVt
-I127
-ssVer
-p894
-(dp895
-V!
-I5
-sV
-I839
-sV'
-I31
-sV-
-I9
-sV,
-I166
-sV.
-I84
-sV;
-I30
-sV:
-I3
-sV?
-I7
-sVa
-I51
-sVc
-I17
-sVe
-I240
-sVd
-I4
-sVg
-I17
-sVf
-I28
-sVi
-I142
-sVh
-I15
-sVj
-I1
-sVm
-I23
-sVl
-I9
-sVo
-I9
-sVn
-I91
-sVp
-I4
-sVs
-I184
-sVr
-I11
-sVt
-I46
-sVw
-I10
-sVv
-I33
-sVy
-I142
-ssVrt
-p896
-(dp897
-Va
-I38
-sV@
-I1
-sVe
-I19
-sV
-I62
-sVi
-I62
-sVh
-I20
-sVf
-I4
-sVm
-I4
-sV,
-I13
-sVo
-I3
-sVn
-I4
-sVs
-I8
-sVu
-I24
-sVy
-I18
-sV;
-I2
-sV.
-I2
-sVl
-I4
-ssVru
-p898
-(dp899
-Vc
-I4
-sVb
-I3
-sVe
-I15
-sVd
-I6
-sVg
-I1
-sVi
-I1
-sVm
-I1
-sVl
-I4
-sVn
-I7
-sVp
-I5
-sVs
-I9
-sVt
-I7
-ssVrv
-p900
-(dp901
-Va
-I6
-sVi
-I6
-sVe
-I22
-ssVE.
-p902
-(dp903
-V
-I1
-ssVrp
-p904
-(dp905
-Vr
-I11
-sVe
-I1
-sVl
-I1
-sVo
-I4
-ssVs]
-p906
-(dp907
-V
-I2
-ssVrr
-p908
-(dp909
-Va
-I7
-sVe
-I18
-sVi
-I48
-sVo
-I8
-sVu
-I4
-sVy
-I35
-ssVrs
-p910
-(dp911
-Va
-I13
-sV
-I92
-sVe
-I81
-sVd
-I4
-sV'
-I1
-sVi
-I11
-sVh
-I1
-sV,
-I39
-sVo
-I18
-sV.
-I42
-sV)
-I1
-sVu
-I17
-sVt
-I44
-sV;
-I4
-sV?
-I1
-ssVE!
-p912
-(dp913
-V*
-I1
-ssVry
-p914
-(dp915
-V
-I191
-sVb
-I1
-sVi
-I20
-sV,
-I13
-sVo
-I1
-sV.
-I7
-sVt
-I15
-sVw
-I1
-sV;
-I2
-sV?
-I1
-ssVe]
-p916
-(dp917
-V
-I1
-ssVre
-p918
-(dp919
-V!
-I3
-sV
-I363
-sV)
-I1
-sV,
-I66
-sV.
-I23
-sV;
-I13
-sV?
-I2
-sVa
-I183
-sVc
-I68
-sVb
-I2
-sVe
-I64
-sVd
-I194
-sVg
-I19
-sVf
-I49
-sVi
-I1
-sVh
-I7
-sVj
-I10
-sVm
-I50
-sVl
-I54
-sVo
-I2
-sVn
-I43
-sVq
-I21
-sVp
-I44
-sVs
-I183
-sVr
-I2
-sVt
-I63
-sVw
-I4
-sVv
-I35
-sVy
-I1
-ssVey
-p920
-(dp921
-V
-I39
-sVe
-I10
-sVm
-I8
-sV,
-I3
-sVo
-I10
-sV.
-I2
-sV;
-I1
-ssVrg
-p922
-(dp923
-V
-I13
-sVe
-I21
-sVi
-I9
-sV,
-I1
-sV/
-I1
-sVu
-I1
-sVo
-I4
-sVy
-I1
-ssVra
-p924
-(dp925
-Vc
-I29
-sVb
-I34
-sVd
-I7
-sVg
-I13
-sVi
-I18
-sVm
-I4
-sVl
-I23
-sVo
-I4
-sVn
-I36
-sVp
-I2
-sVs
-I5
-sVr
-I5
-sVu
-I1
-sVt
-I64
-sVw
-I8
-sVv
-I3
-sVy
-I4
-ssVrb
-p926
-(dp927
-Vi
-I5
-sVa
-I3
-sVe
-I2
-sVo
-I1
-ssVrc
-p928
-(dp929
-Ve
-I25
-sVi
-I4
-sVh
-I52
-sVo
-I7
-sVu
-I10
-sVy
-I27
-ssVrl
-p930
-(dp931
-V!
-I2
-sV
-I12
-sVe
-I9
-sVd
-I21
-sV'
-I1
-sVi
-I2
-sV,
-I8
-sVo
-I5
-sV.
-I3
-sVs
-I1
-sVa
-I1
-sVy
-I21
-sV;
-I1
-ssVrm
-p932
-(dp933
-Va
-I12
-sV
-I17
-sVe
-I13
-sVi
-I28
-sV,
-I8
-sVl
-I5
-sV)
-I1
-sVs
-I6
-sVt
-I4
-sV.
-I1
-ssVrn
-p934
-(dp935
-Va
-I8
-sV
-I20
-sVe
-I35
-sVi
-I16
-sV,
-I1
-sVo
-I65
-sV.
-I3
-sVs
-I1
-sVt
-I3
-ssVro
-p936
-(dp937
-V-
-I1
-sVa
-I5
-sVc
-I6
-sVb
-I13
-sVd
-I8
-sVg
-I5
-sVf
-I8
-sVi
-I1
-sVh
-I1
-sVk
-I1
-sVj
-I28
-sVm
-I124
-sVl
-I5
-sVo
-I27
-sVn
-I18
-sVp
-I21
-sVs
-I9
-sVr
-I4
-sVu
-I38
-sVt
-I35
-sVw
-I12
-sVv
-I20
-sVy
-I5
-ssVrh
-p938
-(dp939
-Va
-I15
-sVo
-I1
-ssVri
-p940
-(dp941
-Va
-I25
-sVc
-I94
-sVb
-I19
-sVe
-I56
-sVd
-I10
-sVg
-I28
-sVf
-I5
-sVk
-I2
-sVm
-I4
-sVl
-I6
-sVo
-I28
-sVn
-I98
-sVp
-I4
-sVs
-I12
-sVu
-I3
-sVt
-I52
-sVv
-I34
-sVz
-I9
-ssVrj
-p942
-(dp943
-Vo
-I1
-ssVrk
-p944
-(dp945
-Va
-I1
-sV
-I7
-sVe
-I6
-sV-
-I1
-sVl
-I5
-sV,
-I2
-sVs
-I2
-sV.
-I2
-ssVe-
-p946
-(dp947
-V-
-I7
-sV
-I1
-sVb
-I1
-sVM
-I3
-ssVe,
-p948
-(dp949
-V
-I318
-sV"
-I6
-sV-
-I3
-ssVe.
-p950
-(dp951
-V
-I157
-sVc
-I1
-sV"
-I4
-ssVe)
-p952
-(dp953
-V
-I3
-sV;
-I1
-ssVED
-p954
-(dp955
-VI
-I3
-sV
-I5
-sV,
-I1
-ssVEG
-p956
-(dp957
-VI
-I3
-sVL
-I1
-ssVEF
-p958
-(dp959
-VO
-I1
-ssVEA
-p960
-(dp961
-VC
-I1
-sVR
-I1
-sVD
-I1
-sVV
-I1
-ssVe
-p962
-(dp963
-V"
-I2
-sV$
-I1
-sV(
-I3
-sV1
-I1
-sV6
-I1
-sVA
-I8
-sVC
-I25
-sVB
-I1
-sVE
-I2
-sVD
-I2
-sVG
-I1
-sVF
-I4
-sVI
-I36
-sVH
-I3
-sVM
-I10
-sVL
-I3
-sVP
-I16
-sVS
-I5
-sVR
-I4
-sVU
-I1
-sVT
-I3
-sVW
-I1
-sVV
-I4
-sV[
-I1
-sVa
-I268
-sVc
-I141
-sVb
-I100
-sVe
-I83
-sVd
-I102
-sVg
-I56
-sVf
-I115
-sVi
-I245
-sVh
-I238
-sVk
-I17
-sVj
-I8
-sVm
-I209
-sVl
-I70
-sVo
-I254
-sVn
-I89
-sVq
-I7
-sVp
-I109
-sVs
-I234
-sVr
-I68
-sVu
-I29
-sVt
-I380
-sVw
-I233
-sVv
-I28
-sVy
-I59
-ssVEC
-p964
-(dp965
-VT
-I8
-ssV")
-p966
-(dp967
-V.
-I1
-ssVAn
-p968
-(dp969
-Vd
-I6
-ssVe?
-p970
-(dp971
-V
-I13
-sV"
-I1
-ssVEY
-p972
-(dp973
-V
-I1
-ssVEX
-p974
-(dp975
-VP
-I1
-sVT
-I6
-sV?
-I1
-ssVe;
-p976
-(dp977
-V
-I55
-ssVe:
-p978
-(dp979
-V
-I5
-ssVET
-p980
-(dp981
-V
-I3
-sVE
-I6
-sVT
-I1
-ssVEW
-p982
-(dp983
-V
-I1
-ssVEV
-p984
-(dp985
-VE
-I2
-ssVEQ
-p986
-(dp987
-VU
-I1
-ssVES
-p988
-(dp989
-V
-I4
-sVS
-I2
-sVE
-I1
-sV,
-I1
-sV.
-I1
-ssVER
-p990
-(dp991
-V
-I7
-sVC
-I1
-sVE
-I1
-sVG
-I7
-sVI
-I7
-sV*
-I1
-sV,
-I3
-sVN
-I49
-sVS
-I1
-sVW
-I1
-ssVEl
-p992
-(dp993
-Ve
-I1
-ssVEn
-p994
-(dp995
-Vd
-I1
-sVg
-I3
-ssVEd
-p996
-(dp997
-Vw
-I9
-ssVNO
-p998
-(dp999
-V
-I2
-sVT
-I5
-sVN
-I49
-ssVr:
-p1000
-(dp1001
-V
-I6
-ssVr;
-p1002
-(dp1003
-V
-I36
-ssVr'
-p1004
-(dp1005
-Vs
-I31
-ssVr
-p1006
-(dp1007
-V(
-I1
-sV3
-I1
-sV4
-I1
-sVA
-I8
-sVC
-I6
-sVB
-I1
-sVE
-I1
-sVF
-I8
-sVI
-I21
-sVH
-I1
-sVJ
-I49
-sVM
-I15
-sVL
-I7
-sVS
-I20
-sVR
-I9
-sV[
-I2
-sVa
-I152
-sVc
-I53
-sVb
-I42
-sVe
-I46
-sVd
-I55
-sVg
-I19
-sVf
-I75
-sVi
-I59
-sVh
-I104
-sVk
-I8
-sVj
-I3
-sVm
-I116
-sVl
-I47
-sVo
-I88
-sVn
-I20
-sVq
-I1
-sVp
-I47
-sVs
-I100
-sVr
-I34
-sVu
-I21
-sVt
-I189
-sVw
-I79
-sVv
-I8
-sVy
-I15
-sVz
-I1
-ssVGi
-p1008
-(dp1009
-Vv
-I1
-ssVr,
-p1010
-(dp1011
-V
-I181
-sV"
-I2
-sV-
-I9
-ssVEt
-p1012
-(dp1013
-Ve
-I11
-ssVr.
-p1014
-(dp1015
-V
-I158
-sV"
-I3
-sV0
-I1
-ssVr@
-p1016
-(dp1017
-Vl
-I1
-ssVr)
-p1018
-(dp1019
-V,
-I1
-ssVr*
-p1020
-(dp1021
-V*
-I1
-ssVw'
-p1022
-(dp1023
-Vs
-I5
-ssVNC
-p1024
-(dp1025
-VI
-I1
-sVE
-I1
-sVL
-I3
-sVO
-I1
-ssVxc
-p1026
-(dp1027
-Vi
-I2
-sVu
-I13
-sVe
-I17
-sVl
-I3
-sVh
-I1
-ssVxa
-p1028
-(dp1029
-Vc
-I5
-sVm
-I4
-sVt
-I4
-sVg
-I1
-ssV1]
-p1030
-(dp1031
-V
-I3
-ssVUE
-p1032
-(dp1033
-VN
-I1
-ssVxe
-p1034
-(dp1035
-Vc
-I2
-sVr
-I5
-sVm
-I1
-sVs
-I2
-sVd
-I12
-ssVxx
-p1036
-(dp1037
-V1
-I1
-sVx
-I4
-sV]
-I1
-ssVjo
-p1038
-(dp1039
-Vi
-I9
-sVy
-I8
-sVk
-I1
-sVu
-I4
-ssVxp
-p1040
-(dp1041
-Vr
-I10
-sVe
-I27
-sVl
-I16
-sVo
-I2
-ssVxq
-p1042
-(dp1043
-Vu
-I1
-ssVxt
-p1044
-(dp1045
-V
-I31
-sVe
-I8
-sV)
-I1
-sV,
-I6
-sV/
-I2
-sV.
-I2
-sVs
-I12
-sVr
-I10
-sVu
-I1
-sVo
-I1
-sV9
-I2
-ssVM
-p1046
-(dp1047
-VI
-I1
-sVE
-I1
-sVT
-I2
-ssVu,
-p1048
-(dp1049
-V
-I42
-sV"
-I3
-ssVIE
-p1050
-(dp1051
-VS
-I3
-sVD
-I1
-ssVeu
-p1052
-(dp1053
-V!
-I2
-sVv
-I1
-sV,
-I5
-sV.
-I2
-ssV-F
-p1054
-(dp1055
-Vr
-I1
-ssV?"
-p1056
-(dp1057
-V
-I13
-ssV0%
-p1058
-(dp1059
-V
-I3
-ssV.;
-p1060
-(dp1061
-V
-I1
-ssV<h
-p1062
-(dp1063
-Va
-I1
-ssVx]
-p1064
-(dp1065
-V
-I1
-ssV-i
-p1066
-(dp1067
-Vs
-I1
-sVn
-I8
-ssV?
-p1068
-(dp1069
-VA
-I3
-sV
-I1
-sVB
-I1
-sVF
-I1
-sVI
-I4
-sVH
-I1
-sVa
-I1
-sVM
-I3
-sVN
-I1
-sVS
-I2
-sVR
-I1
-sVU
-I1
-sVT
-I2
-sVW
-I6
-sVY
-I2
-ssV"h
-p1070
-(dp1071
-Ve
-I2
-ssVX?
-p1072
-(dp1073
-V0
-I1
-ssVc,
-p1074
-(dp1075
-V
-I3
-ssVXI
-p1076
-(dp1077
-VI
-I6
-sV
-I3
-sVX
-I3
-sVV
-I3
-ssVx.
-p1078
-(dp1079
-Vx
-I1
-sVc
-I1
-ssVKe
-p1080
-(dp1081
-Ve
-I2
-sVn
-I1
-ssVx
-p1082
-(dp1083
-Va
-I1
-sV
-I1
-sVd
-I1
-sVh
-I1
-sV1
-I1
-sVr
-I1
-sVw
-I1
-sVy
-I1
-ssVKn
-p1084
-(dp1085
-Vo
-I1
-ssVPo
-p1086
-(dp1087
-Vs
-I1
-sVo
-I6
-ssVRG
-p1088
-(dp1089
-V"
-I1
-sV-
-I6
-ssVXX
-p1090
-(dp1091
-VI
-I10
-sV
-I2
-sVX
-I10
-sVV
-I8
-ssVXP
-p1092
-(dp1093
-VR
-I1
-ssVx1
-p1094
-(dp1095
-V0
-I1
-ssV$2
-p1096
-(dp1097
-V
-I1
-ssVXT
-p1098
-(dp1099
-V
-I3
-sVS
-I3
-ssVY,
-p1100
-(dp1101
-V
-I1
-ssV11
-p1102
-(dp1103
-V.
-I1
-ssV10
-p1104
-(dp1105
-Va
-I1
-sV
-I1
-sV%
-I2
-sV,
-I1
-sV.
-I2
-sV0
-I1
-sVx
-I1
-ssVOf
-p1106
-(dp1107
-V
-I1
-sVf
-I1
-ssV-U
-p1108
-(dp1109
-Vn
-I1
-ssV19
-p1110
-(dp1111
-V9
-I2
-sV7
-I1
-ssV18
-p1112
-(dp1113
-V2
-I1
-ssVKI
-p1114
-(dp1115
-VN
-I1
-ssVu
-p1116
-(dp1117
-VM
-I1
-sVR
-I1
-sVa
-I33
-sVc
-I19
-sVb
-I2
-sVe
-I4
-sVd
-I12
-sVg
-I3
-sVf
-I3
-sVi
-I3
-sVh
-I18
-sVk
-I11
-sVm
-I30
-sVl
-I3
-sVo
-I8
-sVn
-I4
-sVp
-I4
-sVs
-I12
-sVr
-I7
-sVu
-I2
-sVt
-I21
-sVw
-I42
-sVv
-I1
-ssV&c
-p1118
-(dp1119
-V,
-I1
-sV.
-I19
-ssVAg
-p1120
-(dp1121
-Va
-I1
-ssV1*
-p1122
-(dp1123
-V*
-I1
-ssV1,
-p1124
-(dp1125
-V
-I1
-ssV1.
-p1126
-(dp1127
-V
-I2
-sVt
-I1
-ssVDO
-p1128
-(dp1129
-VM
-I2
-sVN
-I1
-ssV-T
-p1130
-(dp1131
-Vh
-I2
-sVM
-I1
-ssV-p
-p1132
-(dp1133
-Vr
-I1
-ssVDI
-p1134
-(dp1135
-VC
-I2
-sVE
-I1
-sVD
-I1
-sVN
-I2
-sVS
-I2
-sVR
-I1
-sVU
-I1
-sVT
-I1
-ssVDE
-p1136
-(dp1137
-VA
-I2
-sV
-I29
-sVD
-I1
-sVM
-I1
-sVN
-I1
-sVR
-I2
-sVX
-I1
-ssVRA
-p1138
-(dp1139
-VC
-I1
-sVN
-I4
-ssVDA
-p1140
-(dp1141
-VM
-I3
-ssVw:
-p1142
-(dp1143
-V
-I1
-ssV*n
-p1144
-(dp1145
-Vo
-I1
-ssVF.
-p1146
-(dp1147
-V
-I1
-ssVDY
-p1148
-(dp1149
-V
-I35
-ssV*e
-p1150
-(dp1151
-Vx
-I1
-ssV/
-p1152
-(dp1153
-VC
-I1
-ssVDo
-p1154
-(dp1155
-V
-I6
-sVn
-I1
-ssVk
-p1156
-(dp1157
-Va
-I13
-sVc
-I1
-sVb
-I2
-sVe
-I3
-sVd
-I1
-sVf
-I10
-sVI
-I4
-sV(
-I1
-sVH
-I1
-sVm
-I9
-sVl
-I1
-sVo
-I13
-sVq
-I1
-sVp
-I2
-sVs
-I2
-sVu
-I1
-sVt
-I14
-sVw
-I6
-sVh
-I3
-sVy
-I5
-sVi
-I5
-ssVx,
-p1158
-(dp1159
-V
-I2
-ssVDi
-p1160
-(dp1161
-Vs
-I1
-sVr
-I1
-sVd
-I2
-ssV*T
-p1162
-(dp1163
-Vh
-I4
-sVH
-I2
-ssVk)
-p1164
-(dp1165
-V,
-I1
-ssV*W
-p1166
-(dp1167
-VA
-I1
-sVe
-I1
-ssVk.
-p1168
-(dp1169
-V
-I6
-ssVk-
-p1170
-(dp1171
-Vu
-I1
-ssVDa
-p1172
-(dp1173
-Vt
-I1
-ssVN
-p1174
-(dp1175
-VI
-I2
-sVU
-I1
-sVE
-I2
-sVT
-I32
-sVV
-I8
-ssV*I
-p1176
-(dp1177
-Vn
-I1
-ssVxi
-p1178
-(dp1179
-Vb
-I1
-sVe
-I6
-sVl
-I1
-sVo
-I8
-sVn
-I2
-sVs
-I4
-sVt
-I1
-ssV*E
-p1180
-(dp1181
-VI
-I1
-sVt
-I1
-sVN
-I2
-ssV*F
-p1182
-(dp1183
-VO
-I1
-ssVDu
-p1184
-(dp1185
-Vr
-I2
-ssVKi
-p1186
-(dp1187
-Vs
-I1
-ssV*B
-p1188
-(dp1189
-VE
-I1
-ssVPR
-p1190
-(dp1191
-VI
-I2
-sVE
-I2
-sVO
-I8
-ssVN'
-p1192
-(dp1193
-VT
-I1
-ssV*:
-p1194
-(dp1195
-V
-I1
-ssV7
-p1196
-(dp1197
-V
-I1
-ssV-h
-p1198
-(dp1199
-Vu
-I2
-sVe
-I4
-sVo
-I2
-ssV~)
-p1200
-(dp1201
-V,
-I1
-ssV*)
-p1202
-(dp1203
-V
-I1
-ssV71
-p1204
-(dp1205
-V*
-I1
-ssVMN
-p1206
-(dp1207
-VI
-I1
-ssV.G
-p1208
-(dp1209
-VU
-I1
-ssV*
-p1210
-(dp1211
-VY
-I1
-sVc
-I1
-sVT
-I1
-sVf
-I1
-ssV78
-p1212
-(dp1213
-V2
-I1
-ssVD,
-p1214
-(dp1215
-V
-I3
-ssVQU
-p1216
-(dp1217
-VE
-I1
-ssVkf
-p1218
-(dp1219
-Va
-I5
-sVu
-I1
-ssVke
-p1220
-(dp1221
-V!
-I1
-sV
-I91
-sVe
-I11
-sVd
-I27
-sV-
-I1
-sVl
-I6
-sVn
-I22
-sVp
-I3
-sVs
-I11
-sVr
-I1
-sV;
-I2
-sV.
-I2
-sV,
-I4
-ssVki
-p1222
-(dp1223
-Vl
-I3
-sVn
-I63
-ssVkn
-p1224
-(dp1225
-Ve
-I8
-sVo
-I86
-ssVD
-p1226
-(dp1227
-VD
-I2
-sVM
-I1
-sVT
-I4
-sVW
-I1
-sVt
-I2
-ssVkl
-p1228
-(dp1229
-Va
-I5
-ssVks
-p1230
-(dp1231
-V
-I20
-sV;
-I2
-sV,
-I2
-sV'
-I1
-sV.
-I2
-ssVSe
-p1232
-(dp1233
-Vy
-I8
-sVn
-I2
-ssVkw
-p1234
-(dp1235
-Va
-I2
-ssVky
-p1236
-(dp1237
-V
-I3
-ssVs-
-p1238
-(dp1239
-V-
-I5
-ssVd.
-p1240
-(dp1241
-V
-I61
-sV"
-I1
-ssVd,
-p1242
-(dp1243
-V
-I171
-sV"
-I2
-sV-
-I3
-ssVgf
-p1244
-(dp1245
-Vo
-I19
-ssVWA
-p1246
-(dp1247
-VR
-I4
-sVN
-I1
-ssVBE
-p1248
-(dp1249
-V
-I1
-sVR
-I8
-sVF
-I1
-ssVd'
-p1250
-(dp1251
-Vs
-I12
-ssVd"
-p1252
-(dp1253
-V
-I1
-ssVd
-p1254
-(dp1255
-V"
-I1
-sV(
-I2
-sVB
-I2
-sVE
-I1
-sVD
-I5
-sVG
-I2
-sVF
-I5
-sVI
-I62
-sVH
-I1
-sVJ
-I1
-sVM
-I18
-sVL
-I5
-sVS
-I17
-sVR
-I4
-sVW
-I2
-sV[
-I1
-sVa
-I166
-sVc
-I41
-sVb
-I122
-sVe
-I45
-sVd
-I32
-sVg
-I15
-sVf
-I71
-sVi
-I115
-sVh
-I168
-sVk
-I4
-sVj
-I5
-sVm
-I109
-sVl
-I17
-sVo
-I97
-sVn
-I91
-sVq
-I4
-sVp
-I29
-sVs
-I101
-sVr
-I18
-sVu
-I20
-sVt
-I300
-sVw
-I107
-sVv
-I7
-sVy
-I42
-ssVWH
-p1256
-(dp1257
-VA
-I1
-ssVd?
-p1258
-(dp1259
-V
-I2
-sV"
-I1
-ssVJO
-p1260
-(dp1261
-VH
-I17
-ssVd:
-p1262
-(dp1263
-V
-I7
-ssVd;
-p1264
-(dp1265
-V
-I28
-ssVJE
-p1266
-(dp1267
-VC
-I7
-ssV-S
-p1268
-(dp1269
-Vi
-I1
-ssVn-
-p1270
-(dp1271
-Vh
-I1
-sV-
-I4
-sVl
-I7
-ssV=T
-p1272
-(dp1273
-Vr
-I1
-ssVWe
-p1274
-(dp1275
-V
-I21
-sVr
-I2
-sVl
-I3
-sVd
-I2
-ssVFI
-p1276
-(dp1277
-VT
-I1
-ssVWo
-p1278
-(dp1279
-Vr
-I1
-ssVJu
-p1280
-(dp1281
-Vn
-I1
-ssVWi
-p1282
-(dp1283
-Vl
-I5
-sVg
-I3
-sVt
-I3
-ssVWh
-p1284
-(dp1285
-Vy
-I5
-sVa
-I10
-sVe
-I19
-sVo
-I1
-ssVJo
-p1286
-(dp1287
-Vh
-I18
-ssVJa
-p1288
-(dp1289
-Vm
-I54
-sVn
-I6
-ssVMR
-p1290
-(dp1291
-V
-I1
-sVS
-I30
-sV.
-I9
-ssVAr
-p1292
-(dp1293
-Ve
-I1
-sVt
-I1
-ssVdn
-p1294
-(dp1295
-Vi
-I2
-sVe
-I18
-ssVdo
-p1296
-(dp1297
-V!
-I1
-sV
-I51
-sVe
-I20
-sVi
-I3
-sVm
-I9
-sVl
-I3
-sVo
-I6
-sV,
-I4
-sVp
-I2
-sVu
-I23
-sVw
-I11
-sV.
-I1
-sV;
-I2
-sVn
-I44
-sV?
-I1
-ssVdl
-p1298
-(dp1299
-Vy
-I15
-sVe
-I3
-ssVy"
-p1300
-(dp1301
-V
-I1
-sV.
-I1
-ssVIG
-p1302
-(dp1303
-VE
-I1
-ssVA.
-p1304
-(dp1305
-V
-I5
-ssVdi
-p1306
-(dp1307
-Va
-I24
-sVc
-I17
-sVe
-I15
-sVd
-I24
-sVg
-I4
-sVf
-I14
-sVl
-I3
-sVn
-I49
-sVs
-I128
-sVr
-I12
-sVu
-I5
-sVt
-I19
-sVv
-I1
-ssVdf
-p1308
-(dp1309
-Vu
-I5
-ssVdg
-p1310
-(dp1311
-Vi
-I4
-sVe
-I11
-sVm
-I8
-ssVdd
-p1312
-(dp1313
-Vi
-I5
-sV
-I2
-sVr
-I6
-sVe
-I11
-sV,
-I1
-ssVde
-p1314
-(dp1315
-Va
-I104
-sV
-I49
-sVc
-I25
-sVb
-I4
-sVe
-I25
-sVd
-I69
-sVg
-I12
-sVf
-I11
-sVi
-I1
-sVj
-I2
-sVm
-I8
-sVl
-I30
-sVn
-I34
-sVp
-I16
-sVs
-I58
-sVr
-I180
-sVt
-I29
-sVv
-I5
-sV.
-I2
-sV,
-I7
-ssVda
-p1316
-(dp1317
-Vb
-I5
-sVm
-I5
-sVl
-I2
-sVn
-I11
-sVr
-I10
-sVu
-I38
-sVt
-I9
-sVy
-I40
-ssVf?
-p1318
-(dp1319
-V
-I2
-ssV=
-p1320
-(dp1321
-VC
-I1
-ssVdy
-p1322
-(dp1323
-V
-I98
-sVs
-I12
-sV,
-I3
-sV.
-I1
-ssVdv
-p1324
-(dp1325
-Va
-I12
-sVi
-I10
-sVo
-I1
-ssVdw
-p1326
-(dp1327
-Va
-I9
-sVe
-I1
-ssVdu
-p1328
-(dp1329
-Va
-I1
-sV
-I1
-sVc
-I37
-sVe
-I7
-sVi
-I1
-sVl
-I9
-sVp
-I1
-sVr
-I7
-sVt
-I8
-ssVdr
-p1330
-(dp1331
-Va
-I8
-sVe
-I31
-sVo
-I2
-ssVds
-p1332
-(dp1333
-V
-I30
-sVh
-I11
-sV,
-I7
-sVo
-I6
-sV.
-I8
-sV;
-I3
-ssVnm
-p1334
-(dp1335
-Vi
-I1
-ssVqu
-p1336
-(dp1337
-Vi
-I54
-sVa
-I35
-sVe
-I32
-ssVGe
-p1338
-(dp1339
-Vr
-I1
-ssVW
-p1340
-(dp1341
-VG
-I1
-ssV(h
-p1342
-(dp1343
-Vi
-I1
-ssVm:
-p1344
-(dp1345
-V
-I1
-ssVE
-p1346
-(dp1347
-Vo
-I1
-sVC
-I28
-sVE
-I1
-sVM
-I1
-sVs
-I1
-sVO
-I4
-sVN
-I2
-sVP
-I1
-sVS
-I6
-sVT
-I4
-sVw
-I1
-sVV
-I7
-sVt
-I3
-ssVd]
-p1348
-(dp1349
-V
-I1
-ssVPL
-p1350
-(dp1351
-VI
-I1
-ssVPr
-p1352
-(dp1353
-Vi
-I5
-sVa
-I1
-sVe
-I2
-sVo
-I25
-ssVuv
-p1354
-(dp1355
-Vr
-I1
-ssVUL
-p1356
-(dp1357
-VA
-I1
-ssVw!
-p1358
-(dp1359
-V
-I1
-ssVw
-p1360
-(dp1361
-VI
-I3
-sVL
-I1
-sVN
-I1
-sVa
-I17
-sVc
-I4
-sVb
-I7
-sVe
-I2
-sVd
-I15
-sVg
-I4
-sVf
-I5
-sVi
-I12
-sVh
-I20
-sVm
-I12
-sVl
-I5
-sVo
-I5
-sVn
-I12
-sVq
-I1
-sVp
-I2
-sVs
-I9
-sVu
-I2
-sVt
-I25
-sVw
-I11
-sVv
-I1
-sVy
-I6
-ssVw.
-p1362
-(dp1363
-V
-I5
-ssVw,
-p1364
-(dp1365
-V
-I26
-ssV.e
-p1366
-(dp1367
-Vd
-I1
-ssV#9
-p1368
-(dp1369
-V4
-I1
-ssVPa
-p1370
-(dp1371
-Vy
-I1
-sVr
-I5
-sVg
-I1
-ssVrf
-p1372
-(dp1373
-Vi
-I1
-sVe
-I22
-sVu
-I7
-ssVPe
-p1374
-(dp1375
-Vr
-I1
-ssVBe
-p1376
-(dp1377
-V
-I3
-sVs
-I2
-sVl
-I1
-ssVw;
-p1378
-(dp1379
-V
-I3
-ssV#6
-p1380
-(dp1381
-V
-I1
-ssVPl
-p1382
-(dp1383
-Va
-I1
-sVe
-I2
-ssV02
-p1384
-(dp1385
-V]
-I1
-ssV.x
-p1386
-(dp1387
-Vx
-I1
-ssV00
-p1388
-(dp1389
-V
-I2
-sV,
-I2
-sV.
-I2
-sV1
-I3
-sV0
-I3
-sV2
-I1
-sV=
-I1
-ssV01
-p1390
-(dp1391
-V
-I1
-sV.
-I2
-ssV."
-p1392
-(dp1393
-V
-I23
-ssV04
-p1394
-(dp1395
-V.
-I1
-ssVPU
-p1396
-(dp1397
-VR
-I1
-sVB
-I2
-sVN
-I1
-ssV-
-p1398
-(dp1399
-VH
-I2
-ssVuo
-p1400
-(dp1401
-Vs
-I1
-ssV0=
-p1402
-(dp1403
-VT
-I1
-ssV0
-p1404
-(dp1405
-Vx
-I1
-sVb
-I1
-sVm
-I1
-sVt
-I1
-sVd
-I3
-ssVPA
-p1406
-(dp1407
-VR
-I1
-ssVju
-p1408
-(dp1409
-Vs
-I28
-sVr
-I8
-sVd
-I19
-ssVXL
-p1410
-(dp1411
-VI
-I1
-sV
-I1
-ssV0.
-p1412
-(dp1413
-V
-I1
-sVz
-I1
-sVt
-I1
-sVG
-I1
-ssVPO
-p1414
-(dp1415
-VS
-I2
-ssV0,
-p1416
-(dp1417
-V0
-I3
-ssVlf
-p1418
-(dp1419
-Va
-I3
-sV
-I80
-sVi
-I2
-sV-
-I2
-sV,
-I19
-sVo
-I1
-sV.
-I8
-sV!
-I1
-sV;
-I6
-sV:
-I1
-sV?
-I2
-ssVwe
-p1420
-(dp1421
-Va
-I10
-sV
-I78
-sVe
-I29
-sVd
-I10
-sVl
-I41
-sVn
-I7
-sVr
-I71
-sVv
-I36
-ssVwa
-p1422
-(dp1423
-Vb
-I1
-sVi
-I7
-sVk
-I2
-sVl
-I4
-sVn
-I21
-sVs
-I186
-sVr
-I100
-sVt
-I5
-sVy
-I55
-ssVlg
-p1424
-(dp1425
-Vi
-I1
-sVe
-I4
-ssVwo
-p1426
-(dp1427
-V
-I17
-sVr
-I57
-sVu
-I70
-sVm
-I25
-sVn
-I7
-ssVwn
-p1428
-(dp1429
-V
-I68
-sV,
-I11
-sV.
-I10
-sVs
-I2
-sVr
-I1
-sV;
-I3
-ssVwl
-p1430
-(dp1431
-Ve
-I6
-ssVwk
-p1432
-(dp1433
-Vw
-I2
-ssVwi
-p1434
-(dp1435
-Vc
-I1
-sVd
-I4
-sVf
-I19
-sVl
-I114
-sVn
-I27
-sVs
-I49
-sVt
-I240
-ssVwh
-p1436
-(dp1437
-Vi
-I144
-sVa
-I69
-sVe
-I85
-sVy
-I3
-sVo
-I92
-ssVP
-p1438
-(dp1439
-Vp
-I1
-sVd
-I1
-ssV27
-p1440
-(dp1441
-V8
-I1
-ssVws
-p1442
-(dp1443
-V!
-I1
-sV
-I10
-sVl
-I1
-sV,
-I3
-ssVwr
-p1444
-(dp1445
-Vi
-I20
-sVe
-I9
-sVo
-I10
-ssV[*
-p1446
-(dp1447
-V]
-I3
-ssVje
-p1448
-(dp1449
-Va
-I10
-sVc
-I53
-sVs
-I1
-ssVP.
-p1450
-(dp1451
-V
-I1
-ssVwy
-p1452
-(dp1453
-Ve
-I1
-ssVBa
-p1454
-(dp1455
-Vt
-I5
-ssV".
-p1456
-(dp1457
-V
-I3
-ssVuf
-p1458
-(dp1459
-Vf
-I11
-ssVua
-p1460
-(dp1461
-Vd
-I14
-sVg
-I3
-sVi
-I13
-sVl
-I31
-sVn
-I1
-sVr
-I14
-sVt
-I17
-ssV0x
-p1462
-(dp1463
-V.
-I1
-ssVRS
-p1464
-(dp1465
-VI
-I1
-sV.
-I30
-ssV0a
-p1466
-(dp1467
-V.
-I1
-ssV]
-p1468
-(dp1469
-Va
-I3
-sV
-I6
-sVd
-I1
-sVp
-I1
-sVt
-I1
-sVY
-I1
-ssVck
-p1470
-(dp1471
-V
-I12
-sVe
-I3
-sVi
-I4
-sVn
-I3
-sVy
-I3
-sV.
-I1
-ssVci
-p1472
-(dp1473
-Va
-I21
-sVe
-I20
-sVd
-I7
-sVf
-I1
-sVl
-I5
-sVo
-I9
-sVn
-I9
-sVp
-I5
-sVs
-I5
-sVr
-I10
-sVt
-I7
-sVv
-I2
-ssVch
-p1474
-(dp1475
-Va
-I40
-sV
-I269
-sVe
-I43
-sVi
-I26
-sVh
-I46
-sV-
-I1
-sVm
-I9
-sV,
-I9
-sVo
-I22
-sV.
-I5
-sVu
-I3
-sV;
-I1
-ssVco
-p1476
-(dp1477
-Vd
-I1
-sVm
-I128
-sVl
-I8
-sVo
-I4
-sVn
-I233
-sVq
-I5
-sVp
-I16
-sVs
-I3
-sVr
-I14
-sVu
-I134
-sVv
-I8
-ssVcl
-p1478
-(dp1479
-Vi
-I7
-sVe
-I23
-sVu
-I20
-sVa
-I19
-sVo
-I6
-ssVcc
-p1480
-(dp1481
-Va
-I12
-sVe
-I13
-sVi
-I1
-sVo
-I27
-sVr
-I1
-sVu
-I10
-ssVca
-p1482
-(dp1483
-V
-I54
-sVc
-I6
-sVb
-I2
-sVd
-I1
-sV'
-I12
-sVm
-I18
-sVl
-I25
-sVn
-I117
-sVp
-I11
-sVs
-I20
-sVr
-I21
-sVu
-I21
-sVt
-I27
-sV"
-I1
-sV;
-I2
-sV.
-I1
-sV,
-I14
-ssVce
-p1484
-(dp1485
-Va
-I7
-sV
-I178
-sV:
-I1
-sVe
-I7
-sVd
-I34
-sV'
-I1
-sV)
-I1
-sVi
-I43
-sV-
-I1
-sVm
-I5
-sV,
-I36
-sVn
-I10
-sVp
-I18
-sVs
-I49
-sVr
-I30
-sV!
-I1
-sVt
-I1
-sV;
-I7
-sV.
-I26
-sV?
-I2
-sVl
-I17
-ssVcd
-p1486
-(dp1487
-V
-I2
-ssV60
-p1488
-(dp1489
-V
-I1
-ssV61
-p1490
-(dp1491
-V8
-I1
-ssVcy
-p1492
-(dp1493
-V!
-I3
-sV
-I29
-sV'
-I1
-sVi
-I1
-sV-
-I1
-sV,
-I11
-sV.
-I3
-sVs
-I1
-sV;
-I2
-ssVA
-p1494
-(dp1495
-Vg
-I1
-ssV),
-p1496
-(dp1497
-V
-I5
-ssV).
-p1498
-(dp1499
-V
-I4
-ssVcs
-p1500
-(dp1501
-V
-I1
-sVo
-I1
-ssVcr
-p1502
-(dp1503
-Va
-I1
-sVi
-I13
-sVe
-I30
-sVu
-I3
-sVy
-I2
-ssVcq
-p1504
-(dp1505
-Vu
-I16
-ssVcu
-p1506
-(dp1507
-Vm
-I12
-sVl
-I31
-sVn
-I1
-sVs
-I21
-sVr
-I15
-sVt
-I5
-ssVct
-p1508
-(dp1509
-Va
-I10
-sV
-I88
-sV"
-I1
-sVe
-I42
-sV'
-I2
-sVi
-I97
-sVl
-I19
-sVo
-I6
-sV,
-I13
-sVs
-I5
-sVr
-I5
-sVu
-I15
-sV;
-I2
-sV.
-I9
-ssVpr
-p1510
-(dp1511
-Vi
-I37
-sVa
-I8
-sVe
-I122
-sVu
-I6
-sVo
-I110
-ssVps
-p1512
-(dp1513
-V
-I14
-sV-
-I1
-sVe
-I1
-sV,
-I3
-sVt
-I2
-ssVpp
-p1514
-(dp1515
-Ve
-I33
-sVi
-I13
-sVl
-I12
-sVo
-I37
-sVr
-I8
-sVy
-I18
-ssVC.
-p1516
-(dp1517
-V
-I6
-ssVpt
-p1518
-(dp1519
-Va
-I1
-sV
-I20
-sVe
-I6
-sVi
-I21
-sV,
-I1
-sVo
-I1
-sVs
-I2
-sVu
-I1
-sV;
-I1
-ssVpu
-p1520
-(dp1521
-Vb
-I3
-sVd
-I3
-sVl
-I3
-sVn
-I7
-sVs
-I1
-sVr
-I8
-sVt
-I17
-ssVpy
-p1522
-(dp1523
-V!
-I1
-sV
-I16
-sV,
-I1
-sV.
-I5
-sVr
-I8
-sV:
-I1
-ssVY;
-p1524
-(dp1525
-V
-I1
-ssV"y
-p1526
-(dp1527
-Vo
-I2
-ssVpa
-p1528
-(dp1529
-Vc
-I3
-sVb
-I2
-sVg
-I1
-sVi
-I15
-sVl
-I1
-sVn
-I10
-sVs
-I18
-sVr
-I92
-sVt
-I18
-sVy
-I5
-ssVpd
-p1530
-(dp1531
-Va
-I1
-ssVpe
-p1532
-(dp1533
-Va
-I49
-sV
-I22
-sVc
-I50
-sVe
-I5
-sVd
-I8
-sVm
-I1
-sV,
-I4
-sVo
-I2
-sVn
-I49
-sVs
-I4
-sVr
-I128
-sVt
-I2
-sV;
-I1
-sV.
-I1
-sV]
-I1
-sVl
-I3
-ssVph
-p1534
-(dp1535
-Vy
-I2
-sVi
-I1
-sVa
-I1
-sV
-I1
-ssVpi
-p1536
-(dp1537
-Va
-I1
-sVc
-I1
-sVe
-I5
-sVd
-I6
-sVl
-I2
-sVn
-I32
-sVs
-I7
-sVr
-I17
-sVt
-I13
-ssVh;
-p1538
-(dp1539
-V
-I5
-ssVpo
-p1540
-(dp1541
-Vb
-I1
-sVi
-I21
-sVk
-I9
-sVl
-I5
-sVo
-I11
-sVn
-I10
-sVp
-I1
-sVs
-I94
-sVr
-I26
-sVu
-I2
-sVt
-I3
-sVw
-I22
-sVv
-I1
-ssVpl
-p1542
-(dp1543
-Vy
-I14
-sVa
-I69
-sVe
-I50
-sVi
-I19
-sVo
-I3
-ssVpm
-p1544
-(dp1545
-Ve
-I1
-ssVCI
-p1546
-(dp1547
-VI
-I2
-sVA
-I5
-sVm
-I1
-sVD
-I1
-ssVCH
-p1548
-(dp1549
-VA
-I1
-sV
-I2
-ssVCO
-p1550
-(dp1551
-VU
-I28
-sVG
-I1
-sVN
-I3
-ssVc.
-p1552
-(dp1553
-V
-I3
-sVe
-I1
-sV,
-I18
-ssVCM
-p1554
-(dp1555
-VU
-I2
-ssVCL
-p1556
-(dp1557
-VA
-I1
-sVU
-I3
-ssVTr
-p1558
-(dp1559
-Vi
-I2
-ssVCA
-p1560
-(dp1561
-VT
-I8
-ssVc
-p1562
-(dp1563
-Vd
-I3
-sVi
-I1
-sVn
-I1
-sVp
-I1
-sVr
-I1
-sVu
-I1
-sVT
-I1
-sVt
-I1
-ssVCE
-p1564
-(dp1565
-V
-I2
-ssVCD
-p1566
-(dp1567
-VI
-I2
-ssV*V
-p1568
-(dp1569
-Ve
-I1
-ssVCR
-p1570
-(dp1571
-V
-I1
-ssV40
-p1572
-(dp1573
-V0
-I1
-ssVCU
-p1574
-(dp1575
-VL
-I1
-ssVCT
-p1576
-(dp1577
-V
-I8
-sV,
-I2
-ssVCh
-p1578
-(dp1579
-Va
-I10
-sVr
-I2
-sVu
-I46
-ssVCo
-p1580
-(dp1581
-Vp
-I1
-sVr
-I1
-sVm
-I3
-sVu
-I26
-sVn
-I2
-ssVap
-p1582
-(dp1583
-Va
-I5
-sV
-I1
-sVe
-I3
-sVi
-I3
-sVo
-I3
-sVp
-I78
-sVs
-I15
-sVr
-I2
-sVt
-I5
-ssVp;
-p1584
-(dp1585
-V
-I1
-ssVCa
-p1586
-(dp1587
-Vs
-I1
-sVr
-I4
-sVt
-I9
-sVn
-I3
-ssVCe
-p1588
-(dp1589
-Vr
-I1
-sVn
-I1
-ssVt-
-p1590
-(dp1591
-Vr
-I1
-sV-
-I2
-ssVp
-p1592
-(dp1593
-Va
-I4
-sVc
-I1
-sVb
-I1
-sVe
-I1
-sVg
-I1
-sVf
-I5
-sVi
-I3
-sVh
-I7
-sVm
-I3
-sVl
-I1
-sVo
-I2
-sVp
-I3
-sVs
-I3
-sVu
-I4
-sVt
-I8
-sVw
-I3
-sVv
-I1
-ssVp'
-p1594
-(dp1595
-Vs
-I2
-ssVp*
-p1596
-(dp1597
-V*
-I1
-ssVG
-p1598
-(dp1599
-VB
-I2
-ssVp.
-p1600
-(dp1601
-V
-I3
-ssV6]
-p1602
-(dp1603
-V
-I1
-ssVp,
-p1604
-(dp1605
-V
-I6
-ssVn]
-p1606
-(dp1607
-V
-I2
-ssVd-
-p1608
-(dp1609
-Vh
-I3
-sVc
-I1
-sV-
-I4
-ssVva
-p1610
-(dp1611
-Vg
-I1
-sVi
-I11
-sVl
-I23
-sVn
-I22
-sVs
-I2
-sVr
-I6
-sVt
-I8
-ssViz
-p1612
-(dp1613
-Vi
-I1
-sVe
-I12
-ssVve
-p1614
-(dp1615
-V
-I384
-sVd
-I68
-sV-
-I1
-sVm
-I4
-sV,
-I18
-sVn
-I97
-sVs
-I24
-sVr
-I360
-sVy
-I1
-sVx
-I6
-sV;
-I1
-sV.
-I5
-sVl
-I14
-ssV"b
-p1616
-(dp1617
-Vy
-I1
-sVu
-I3
-ssVip
-p1618
-(dp1619
-Va
-I3
-sV
-I13
-sV'
-I2
-sVi
-I2
-sV*
-I1
-sVm
-I1
-sV,
-I3
-sVl
-I3
-sVs
-I3
-sVt
-I5
-sV;
-I1
-sV.
-I2
-ssVis
-p1620
-(dp1621
-V
-I557
-sV-
-I1
-sV,
-I13
-sV.
-I3
-sV;
-I1
-sV:
-I1
-sV?
-I1
-sVa
-I17
-sVc
-I23
-sVb
-I1
-sVe
-I50
-sVg
-I2
-sVf
-I18
-sVi
-I25
-sVh
-I90
-sVk
-I7
-sVm
-I7
-sVl
-I9
-sVo
-I6
-sVp
-I27
-sVs
-I47
-sVu
-I5
-sVt
-I106
-ssVav
-p1622
-(dp1623
-Vi
-I45
-sVy
-I3
-sVe
-I294
-sVa
-I2
-sVo
-I28
-ssV/C
-p1624
-(dp1625
-Va
-I1
-sVM
-I1
-ssVit
-p1626
-(dp1627
-Va
-I21
-sV
-I234
-sVc
-I1
-sV:
-I1
-sVe
-I58
-sVi
-I43
-sVh
-I271
-sV-
-I1
-sVl
-I3
-sVo
-I3
-sVn
-I3
-sV)
-I1
-sVs
-I28
-sV!
-I3
-sVu
-I20
-sVt
-I51
-sVy
-I70
-sV;
-I4
-sV.
-I27
-sV,
-I27
-sV?
-I3
-ssViv
-p1628
-(dp1629
-Vi
-I15
-sVa
-I19
-sVe
-I149
-sVo
-I1
-ssV-u
-p1630
-(dp1631
-Vp
-I1
-sVs
-I1
-ssVih
-p1632
-(dp1633
-Vo
-I1
-ssVik
-p1634
-(dp1635
-Ve
-I32
-ssV X
-p1636
-(dp1637
-VI
-I5
-sV
-I1
-sVL
-I2
-sVX
-I20
-sVV
-I4
-ssVim
-p1638
-(dp1639
-Va
-I21
-sV
-I96
-sVe
-I65
-sVi
-I5
-sV-
-I2
-sVm
-I18
-sV,
-I25
-sVo
-I2
-sV.
-I13
-sVp
-I63
-sVs
-I14
-sV!
-I2
-sVu
-I1
-sV;
-I5
-sV:
-I1
-ssVil
-p1640
-(dp1641
-V
-I10
-sVe
-I46
-sVd
-I22
-sVf
-I1
-sV)
-I1
-sVk
-I1
-sVl
-I234
-sV,
-I1
-sVi
-I32
-sVs
-I5
-sVt
-I4
-sVy
-I42
-ssVio
-p1642
-(dp1643
-Vd
-I3
-sVl
-I7
-sVn
-I430
-sVs
-I1
-sVr
-I9
-sVu
-I51
-ssVin
-p1644
-(dp1645
-V!
-I1
-sV
-I394
-sV"
-I1
-sV'
-I1
-sV-
-I8
-sV,
-I11
-sV.
-I11
-sV;
-I3
-sV:
-I2
-sVa
-I103
-sVc
-I76
-sVe
-I98
-sVd
-I111
-sVg
-I703
-sVf
-I33
-sVi
-I32
-sVh
-I1
-sVk
-I36
-sVj
-I8
-sVl
-I15
-sVn
-I6
-sVq
-I1
-sVs
-I73
-sVu
-I22
-sVt
-I137
-sVw
-I46
-sVv
-I16
-sVy
-I1
-ssVia
-p1646
-(dp1647
-V
-I3
-sVb
-I13
-sVg
-I18
-sV,
-I9
-sVl
-I22
-sVs
-I1
-sVr
-I6
-sVt
-I26
-sVn
-I11
-ssVvy
-p1648
-(dp1649
-V
-I4
-ssVic
-p1650
-(dp1651
-Va
-I113
-sV
-I11
-sVe
-I51
-sVi
-I27
-sVh
-I122
-sVk
-I5
-sVl
-I3
-sV,
-I2
-sV)
-I1
-sVs
-I1
-sVu
-I26
-sVt
-I16
-sVy
-I1
-ssVib
-p1652
-(dp1653
-Vi
-I6
-sVe
-I16
-sVu
-I13
-sVl
-I42
-ssVie
-p1654
-(dp1655
-V
-I1
-sVc
-I6
-sVd
-I37
-sVf
-I5
-sV-
-I4
-sVl
-I3
-sVn
-I70
-sVs
-I34
-sVr
-I2
-sVu
-I9
-sVt
-I24
-sVw
-I9
-sVv
-I38
-sV.
-I1
-ssVid
-p1656
-(dp1657
-Va
-I2
-sV
-I70
-sV:
-I2
-sVe
-I68
-sVd
-I5
-sVi
-I5
-sV,
-I6
-sVo
-I4
-sVn
-I2
-sV;
-I2
-sV.
-I1
-sVl
-I3
-ssVig
-p1658
-(dp1659
-Va
-I1
-sVe
-I13
-sVi
-I7
-sVh
-I107
-sVm
-I3
-sVo
-I1
-sVn
-I24
-sVu
-I1
-ssVif
-p1660
-(dp1661
-V
-I65
-sVe
-I33
-sVf
-I12
-sVi
-I20
-sVl
-I1
-sVu
-I1
-sVt
-I2
-sVy
-I10
-ssV"D
-p1662
-(dp1663
-Vi
-I1
-sVe
-I1
-ssV"F
-p1664
-(dp1665
-Vr
-I3
-ssVaz
-p1666
-(dp1667
-Vi
-I2
-sVa
-I1
-sVe
-I1
-ssV"A
-p1668
-(dp1669
-VS
-I1
-sVr
-I1
-sVn
-I1
-ssV"B
-p1670
-(dp1671
-Vu
-I2
-ssV"C
-p1672
-(dp1673
-Va
-I1
-sVe
-I1
-ssV"w
-p1674
-(dp1675
-Va
-I1
-sVh
-I1
-ssV"M
-p1676
-(dp1677
-Va
-I1
-sVy
-I2
-ssV/e
-p1678
-(dp1679
-Vt
-I2
-ssV"O
-p1680
-(dp1681
-Vh
-I1
-sVf
-I1
-ssV"H
-p1682
-(dp1683
-Vi
-I1
-sVe
-I2
-ssV"I
-p1684
-(dp1685
-V
-I17
-sVt
-I4
-sVn
-I1
-ssV/a
-p1686
-(dp1687
-Vr
-I1
-ssV"W
-p1688
-(dp1689
-Vh
-I2
-ssV"P
-p1690
-(dp1691
-VR
-I2
-sVr
-I4
-ssVI,
-p1692
-(dp1693
-V
-I6
-ssV"R
-p1694
-(dp1695
-Vi
-I1
-ssV"S
-p1696
-(dp1697
-Va
-I1
-sVm
-I5
-ssV"i
-p1698
-(dp1699
-Vf
-I1
-sVn
-I1
-ssVI
-p1700
-(dp1701
-VD
-I1
-sVK
-I1
-sVa
-I128
-sVc
-I79
-sVb
-I19
-sVe
-I8
-sVd
-I33
-sVg
-I4
-sVf
-I22
-sVi
-I4
-sVh
-I121
-sVk
-I18
-sVm
-I39
-sVl
-I17
-sVo
-I9
-sVn
-I22
-sVp
-I4
-sVs
-I73
-sVr
-I23
-sVu
-I1
-sVt
-I25
-sVw
-I78
-sVv
-I1
-sVy
-I2
-ssVnh
-p1702
-(dp1703
-Va
-I10
-sVe
-I1
-ssV"Y
-p1704
-(dp1705
-Vo
-I2
-ssVIX
-p1706
-(dp1707
-V
-I4
-ssV"
-p1708
-(dp1709
-Va
-I1
-sVA
-I2
-sVc
-I2
-sVB
-I1
-sVd
-I1
-sVi
-I1
-sVh
-I4
-sVS
-I3
-sVW
-I3
-sVI
-I6
-sVs
-I19
-sV"
-I19
-sVt
-I1
-sVw
-I2
-sVH
-I3
-sVr
-I2
-sVb
-I1
-sVT
-I1
-ssVVE
-p1710
-(dp1711
-V
-I4
-sVR
-I50
-sVN
-I2
-ssV*]
-p1712
-(dp1713
-V
-I3
-ssVVI
-p1714
-(dp1715
-VI
-I8
-sV
-I3
-sVD
-I1
-ssVIS
-p1716
-(dp1717
-V
-I9
-sVC
-I1
-sV"
-I1
-sVE
-I1
-sVS
-I1
-sVT
-I2
-ssVIR
-p1718
-(dp1719
-V
-I2
-sVE
-I1
-ssVIU
-p1720
-(dp1721
-VM
-I1
-ssVIT
-p1722
-(dp1723
-V
-I1
-sVE
-I3
-sVI
-I2
-sVH
-I1
-sVN
-I1
-sVY
-I4
-ssVIV
-p1724
-(dp1725
-V
-I4
-sVE
-I2
-ssVII
-p1726
-(dp1727
-VI
-I8
-sV
-I17
-sV,
-I1
-ssVIM
-p1728
-(dp1729
-VI
-I3
-sVP
-I1
-sVE
-I1
-sV.
-I1
-ssVIL
-p1730
-(dp1731
-VI
-I3
-sV
-I2
-ssVIO
-p1732
-(dp1733
-VN
-I4
-ssVIN
-p1734
-(dp1735
-VA
-I3
-sV
-I2
-sVC
-I4
-sVE
-I7
-sVD
-I4
-sVG
-I2
-sVT
-I2
-ssVIA
-p1736
-(dp1737
-VB
-I1
-sVL
-I1
-sV.
-I5
-ssVIC
-p1738
-(dp1739
-VI
-I5
-sV
-I4
-sVU
-I1
-sVE
-I1
-sVT
-I1
-ssVIB
-p1740
-(dp1741
-VI
-I1
-sVU
-I1
-ssVHE
-p1742
-(dp1743
-V
-I11
-sVR
-I15
-sV,
-I1
-ssVID
-p1744
-(dp1745
-V
-I1
-sVE
-I2
-ssV":
-p1746
-(dp1747
-V
-I1
-ssVIF
-p1748
-(dp1749
-V
-I3
-ssVVa
-p1750
-(dp1751
-Vn
-I1
-ssVnx
-p1752
-(dp1753
-Vi
-I12
-ssVVe
-p1754
-(dp1755
-Vr
-I67
-ssVIs
-p1756
-(dp1757
-V
-I2
-ssVTY
-p1758
-(dp1759
-V
-I4
-sV;
-I1
-sV,
-I1
-ssVVl
-p1760
-(dp1761
-V
-I1
-ssVIt
-p1762
-(dp1763
-Va
-I1
-sV
-I29
-sVs
-I1
-ssVVo
-p1764
-(dp1765
-Vl
-I1
-ssVIm
-p1766
-(dp1767
-Va
-I1
-ssVIn
-p1768
-(dp1769
-Vd
-I1
-sV
-I10
-sVt
-I1
-sVf
-I3
-ssVd)
-p1770
-(dp1771
-V,
-I1
-ssV-c
-p1772
-(dp1773
-Vh
-I1
-sVo
-I1
-ssVTT
-p1774
-(dp1775
-VM
-I1
-sVE
-I1
-ssVIf
-p1776
-(dp1777
-V
-I25
-ssV6
-p1778
-(dp1779
-Vi
-I1
-sVf
-I1
-ssVUp
-p1780
-(dp1781
-Vp
-I8
-sVo
-I1
-ssVDe
-p1782
-(dp1783
-V
-I25
-sVc
-I2
-sVs
-I1
-sVp
-I1
-sVf
-I4
-ssV(~
-p1784
-(dp1785
-V)
-I1
-ssVBC
-p1786
-(dp1787
-VD
-I2
-ssVBL
-p1788
-(dp1789
-VI
-I2
-ssV(s
-p1790
-(dp1791
-Vu
-I1
-ssVBO
-p1792
-(dp1793
-VU
-I1
-ssVBI
-p1794
-(dp1795
-VL
-I3
-ssV(t
-p1796
-(dp1797
-Vh
-I1
-ssVTS
-p1798
-(dp1799
-V
-I1
-sV*
-I2
-ssVO?
-p1800
-(dp1801
-V
-I1
-ssVBU
-p1802
-(dp1803
-VT
-I3
-ssV"t
-p1804
-(dp1805
-Vh
-I2
-ssV(i
-p1806
-(dp1807
-Vf
-I2
-ssV(o
-p1808
-(dp1809
-Vr
-I4
-sVn
-I1
-ssVBR
-p1810
-(dp1811
-VE
-I1
-sVO
-I1
-ssV-b
-p1812
-(dp1813
-Vy
-I1
-sVr
-I1
-sVu
-I2
-ssVk,
-p1814
-(dp1815
-V
-I13
-ssVR.
-p1816
-(dp1817
-V
-I13
-ssVgt
-p1818
-(dp1819
-Vh
-I11
-ssV4.
-p1820
-(dp1821
-V2
-I1
-ssVa"
-p1822
-(dp1823
-V
-I1
-ssV(_
-p1824
-(dp1825
-V)
-I1
-ssVTO
-p1826
-(dp1827
-V
-I47
-sVO
-I1
-sV?
-I1
-ssVBo
-p1828
-(dp1829
-Vx
-I1
-sVt
-I1
-ssVBi
-p1830
-(dp1831
-Vt
-I1
-ssV(T
-p1832
-(dp1833
-Vh
-I1
-ssVBu
-p1834
-(dp1835
-Vt
-I14
-ssV(I
-p1836
-(dp1837
-V
-I1
-sVn
-I1
-ssVR*
-p1838
-(dp1839
-V:
-I1
-ssV-m
-p1840
-(dp1841
-Vi
-I2
-sVo
-I2
-ssVr-
-p1842
-(dp1843
-Vi
-I7
-sVh
-I1
-sVs
-I1
-ssV(C
-p1844
-(dp1845
-VM
-I1
-ssVBy
-p1846
-(dp1847
-V
-I6
-ssVgs
-p1848
-(dp1849
-V!
-I2
-sV
-I26
-sV,
-I12
-sV.
-I5
-sVt
-I1
-sV;
-I1
-ssVOn
-p1850
-(dp1851
-V
-I1
-sVe
-I3
-sVl
-I1
-ssVOh
-p1852
-(dp1853
-V!
-I1
-sV,
-I1
-ssV"G
-p1854
-(dp1855
-Vo
-I1
-ssVHo
-p1856
-(dp1857
-Vt
-I2
-sVw
-I7
-sVn
-I1
-ssV(*
-p1858
-(dp1859
-V)
-I1
-ssV-l
-p1860
-(dp1861
-Va
-I7
-ssV30
-p1862
-(dp1863
-V
-I1
-ssV);
-p1864
-(dp1865
-V
-I2
-ssVOu
-p1866
-(dp1867
-Vr
-I3
-sVg
-I1
-ssVgr
-p1868
-(dp1869
-Va
-I29
-sVi
-I6
-sVe
-I87
-sVy
-I6
-sVo
-I10
-ssVOO
-p1870
-(dp1871
-V
-I1
-ssVON
-p1872
-(dp1873
-V
-I50
-sVC
-I1
-sVE
-I1
-sV'
-I1
-sV,
-I1
-sV.
-I19
-sVS
-I3
-sVT
-I1
-ssVOM
-p1874
-(dp1875
-VA
-I2
-sV
-I2
-ssVns
-p1876
-(dp1877
-Va
-I4
-sV
-I80
-sVc
-I8
-sVe
-I41
-sVf
-I1
-sVi
-I50
-sV*
-I1
-sV-
-I1
-sV,
-I11
-sVo
-I24
-sV.
-I14
-sVp
-I5
-sV!
-I2
-sVu
-I10
-sVt
-I44
-sVw
-I6
-sV;
-I3
-sV:
-I2
-sVl
-I1
-ssVOJ
-p1878
-(dp1879
-VE
-I7
-ssVOH
-p1880
-(dp1881
-VN
-I17
-ssVOG
-p1882
-(dp1883
-V.
-I1
-ssVOF
-p1884
-(dp1885
-V
-I6
-ssVOC
-p1886
-(dp1887
-VR
-I1
-ssVnu
-p1888
-(dp1889
-Va
-I5
-sVe
-I12
-sVi
-I2
-sVm
-I2
-sVs
-I1
-sVr
-I3
-sVt
-I5
-ssV-o
-p1890
-(dp1891
-Vp
-I1
-sVf
-I1
-ssV5%
-p1892
-(dp1893
-V
-I1
-ssVOV
-p1894
-(dp1895
-VI
-I1
-ssVOU
-p1896
-(dp1897
-V
-I8
-sVR
-I29
-sVT
-I1
-ssVOT
-p1898
-(dp1899
-VI
-I1
-sV
-I4
-sVH
-I3
-ssVOS
-p1900
-(dp1901
-VS
-I1
-sVE
-I1
-ssVOR
-p1902
-(dp1903
-V
-I15
-sVE
-I1
-ssVS.
-p1904
-(dp1905
-V
-I51
-ssVb
-p1906
-(dp1907
-Vh
-I1
-ssV-n
-p1908
-(dp1909
-Va
-I2
-sVo
-I1
-ssVHI
-p1910
-(dp1911
-VS
-I8
-sVM
-I1
-ssVHN
-p1912
-(dp1913
-VS
-I17
-ssV)
-p1914
-(dp1915
-Va
-I1
-sVc
-I2
-sVd
-I1
-sVt
-I2
-sVw
-I1
-sVy
-I2
-ssVT:
-p1916
-(dp1917
-V
-I1
-ssVHA
-p1918
-(dp1919
-VN
-I1
-sVT
-I3
-sVD
-I1
-sVV
-I2
-ssVU
-p1920
-(dp1921
-VA
-I1
-sVc
-I1
-sV"
-I1
-sVD
-I1
-sVG
-I1
-sVH
-I1
-sV*
-I1
-sVU
-I1
-sV=
-I1
-ssVU"
-p1922
-(dp1923
-V:
-I1
-ssVo.
-p1924
-(dp1925
-V
-I8
-sV"
-I3
-sVu
-I1
-ssVo-
-p1926
-(dp1927
-V
-I1
-sVm
-I2
-sV-
-I1
-sVd
-I3
-ssVo,
-p1928
-(dp1929
-V
-I31
-ssVa'
-p1930
-(dp1931
-Vs
-I13
-ssVo!
-p1932
-(dp1933
-V
-I2
-ssVo
-p1934
-(dp1935
-V"
-I3
-sV*
-I1
-sVC
-I10
-sVB
-I2
-sVE
-I2
-sVD
-I1
-sVG
-I1
-sVI
-I5
-sVH
-I1
-sVM
-I16
-sVL
-I14
-sVN
-I1
-sVP
-I4
-sVS
-I6
-sVR
-I5
-sVT
-I1
-sVY
-I1
-sVa
-I69
-sVc
-I42
-sVb
-I75
-sVe
-I34
-sVd
-I47
-sVg
-I30
-sVf
-I36
-sVi
-I35
-sVh
-I102
-sVk
-I10
-sVj
-I5
-sVm
-I127
-sVl
-I39
-sVo
-I31
-sVn
-I33
-sVq
-I2
-sVp
-I42
-sVs
-I90
-sVr
-I41
-sVu
-I16
-sVt
-I103
-sVw
-I49
-sVv
-I12
-sVy
-I40
-ssVg;
-p1936
-(dp1937
-V
-I10
-ssVHi
-p1938
-(dp1939
-Vs
-I8
-ssVo;
-p1940
-(dp1941
-V
-I4
-ssVo:
-p1942
-(dp1943
-V
-I2
-ssVHa
-p1944
-(dp1945
-Vr
-I2
-sVm
-I1
-sVv
-I4
-ssVHe
-p1946
-(dp1947
-Va
-I5
-sV
-I38
-sVr
-I23
-ssVbd
-p1948
-(dp1949
-Vu
-I5
-ssVbe
-p1950
-(dp1951
-Va
-I14
-sV
-I262
-sVc
-I9
-sVe
-I76
-sVd
-I3
-sVg
-I11
-sVf
-I29
-sVi
-I36
-sVh
-I20
-sV-
-I2
-sVl
-I40
-sVn
-I6
-sVs
-I19
-sVr
-I43
-sV!
-I1
-sVt
-I35
-sVw
-I2
-sVy
-I11
-sV;
-I1
-sV.
-I2
-sV,
-I1
-ssV_)
-p1952
-(dp1953
-V
-I1
-ssVba
-p1954
-(dp1955
-Vc
-I2
-sVb
-I8
-sVd
-I3
-sVn
-I19
-sVs
-I1
-sVr
-I4
-sVt
-I5
-ssVbb
-p1956
-(dp1957
-Ve
-I4
-sVo
-I1
-ssVbl
-p1958
-(dp1959
-Va
-I10
-sVe
-I156
-sVi
-I21
-sVo
-I1
-sVu
-I2
-sVy
-I25
-ssVbm
-p1960
-(dp1961
-Vi
-I9
-ssVbo
-p1962
-(dp1963
-Vd
-I3
-sVm
-I1
-sVl
-I1
-sVo
-I6
-sVr
-I3
-sVu
-I32
-sVt
-I10
-sVv
-I2
-sVy
-I1
-sVx
-I1
-ssVc)
-p1964
-(dp1965
-V
-I1
-ssVbi
-p1966
-(dp1967
-Va
-I1
-sVd
-I8
-sVl
-I21
-sVn
-I3
-sVr
-I1
-sVt
-I5
-ssVg:
-p1968
-(dp1969
-V
-I4
-ssVa,
-p1970
-(dp1971
-V
-I23
-sV-
-I3
-ssVbt
-p1972
-(dp1973
-Va
-I3
-sV
-I12
-sVe
-I5
-sVf
-I6
-sVl
-I1
-sV,
-I1
-ssVbu
-p1974
-(dp1975
-Vg
-I1
-sVn
-I1
-sVs
-I9
-sVr
-I1
-sVt
-I194
-sVy
-I1
-ssVUn
-p1976
-(dp1977
-Vi
-I6
-sVd
-I1
-sVl
-I1
-sVf
-I1
-ssVLi
-p1978
-(dp1979
-Vt
-I1
-ssVbr
-p1980
-(dp1981
-Va
-I2
-sVi
-I10
-sVe
-I9
-sVo
-I38
-ssVbs
-p1982
-(dp1983
-Vi
-I2
-sVe
-I12
-sVt
-I2
-sVo
-I11
-ssVyf
-p1984
-(dp1985
-Vu
-I1
-ssVAN
-p1986
-(dp1987
-VY
-I2
-sV
-I23
-sVT
-I6
-ssVby
-p1988
-(dp1989
-Ve
-I1
-sV
-I147
-sV-
-I1
-sVt
-I1
-sV,
-I1
-ssVoo
-p1990
-(dp1991
-V!
-I1
-sV
-I32
-sVd
-I37
-sVf
-I5
-sVk
-I45
-sVm
-I24
-sVl
-I14
-sVn
-I38
-sVp
-I2
-sVs
-I6
-sVr
-I23
-sVt
-I1
-sV.
-I2
-sV,
-I7
-ssVon
-p1992
-(dp1993
-V!
-I5
-sV
-I482
-sV'
-I9
-sV-
-I3
-sV,
-I100
-sV/
-I1
-sV.
-I31
-sV;
-I23
-sV?
-I2
-sV]
-I2
-sVa
-I43
-sVc
-I41
-sVe
-I120
-sVd
-I67
-sVg
-I63
-sVf
-I23
-sVi
-I23
-sVj
-I2
-sVl
-I39
-sVo
-I9
-sVn
-I11
-sVq
-I3
-sVp
-I1
-sVs
-I127
-sVt
-I59
-sVv
-I50
-sVy
-I2
-ssVom
-p1994
-(dp1995
-Va
-I31
-sV
-I145
-sVe
-I140
-sVf
-I11
-sVi
-I21
-sVm
-I31
-sV,
-I5
-sVo
-I3
-sV.
-I11
-sVp
-I49
-sVy
-I1
-sV>
-I1
-ssVol
-p1996
-(dp1997
-Va
-I1
-sV
-I8
-sVe
-I39
-sVd
-I24
-sVi
-I9
-sVl
-I25
-sVo
-I11
-sV,
-I2
-sVs
-I1
-sVn
-I1
-sVu
-I20
-sVt
-I1
-sVv
-I11
-sVy
-I1
-sV:
-I1
-ssVok
-p1998
-(dp1999
-Vi
-I4
-sV
-I25
-sVs
-I9
-sVe
-I24
-sV.
-I1
-ssVoj
-p2000
-(dp2001
-Ve
-I28
-ssVoi
-p2002
-(dp2003
-Vc
-I13
-sVd
-I4
-sVg
-I1
-sVl
-I1
-sVn
-I44
-sVs
-I2
-sVt
-I1
-ssVoh
-p2004
-(dp2005
-Vi
-I1
-sVn
-I18
-ssVog
-p2006
-(dp2007
-Vi
-I4
-sVy
-I1
-sVr
-I4
-sVe
-I12
-sVn
-I1
-ssVof
-p2008
-(dp2009
-V
-I710
-sVe
-I4
-sVf
-I21
-sVi
-I4
-sV,
-I1
-sVo
-I3
-sV.
-I3
-sVr
-I2
-sVt
-I16
-sV;
-I1
-ssVoe
-p2010
-(dp2011
-Vs
-I21
-sVu
-I1
-sVv
-I1
-ssVod
-p2012
-(dp2013
-V!
-I1
-sV
-I31
-sVe
-I2
-sVd
-I2
-sVg
-I3
-sVi
-I3
-sV-
-I2
-sV,
-I3
-sVn
-I3
-sVu
-I8
-sVa
-I1
-sVy
-I3
-sV.
-I2
-ssVoc
-p2014
-(dp2015
-Va
-I3
-sVc
-I14
-sVe
-I6
-sVi
-I9
-sVk
-I2
-sVu
-I1
-ssVob
-p2016
-(dp2017
-Va
-I11
-sV
-I1
-sVb
-I1
-sVe
-I2
-sVj
-I8
-sVl
-I11
-sVo
-I2
-sVs
-I9
-sVt
-I3
-ssVoa
-p2018
-(dp2019
-Vc
-I5
-sVl
-I1
-ssVUR
-p2020
-(dp2021
-VP
-I1
-sVC
-I28
-sV
-I1
-ssVUM
-p2022
-(dp2023
-V
-I1
-sVB
-I1
-ssVga
-p2024
-(dp2025
-Vg
-I11
-sVi
-I44
-sVl
-I6
-sVn
-I5
-sVr
-I11
-sVt
-I3
-sVv
-I8
-sVy
-I1
-ssVUN
-p2026
-(dp2027
-VI
-I1
-sVD
-I2
-ssVH.
-p2028
-(dp2029
-V
-I1
-ssVoy
-p2030
-(dp2031
-Va
-I4
-sV
-I5
-sVe
-I2
-sVf
-I1
-sVi
-I2
-sVm
-I3
-ssVox
-p2032
-(dp2033
-V
-I1
-sV.
-I1
-ssVow
-p2034
-(dp2035
-Va
-I6
-sV
-I158
-sVe
-I75
-sV'
-I1
-sVi
-I16
-sV,
-I24
-sV.
-I3
-sVs
-I5
-sVn
-I90
-sV!
-I1
-sV;
-I2
-sV:
-I1
-sVl
-I6
-ssVov
-p2036
-(dp2037
-Vi
-I6
-sVa
-I6
-sVe
-I81
-sVo
-I8
-ssVou
-p2038
-(dp2039
-V!
-I2
-sV
-I271
-sVb
-I29
-sVd
-I2
-sVg
-I102
-sVl
-I199
-sVn
-I86
-sVs
-I92
-sVr
-I374
-sVt
-I80
-sV;
-I4
-sV.
-I11
-sV,
-I40
-sV?
-I1
-ssVot
-p2040
-(dp2041
-Va
-I6
-sV
-I297
-sVe
-I22
-sVi
-I17
-sVh
-I183
-sV*
-I1
-sV,
-I12
-sVo
-I1
-sV.
-I3
-sV)
-I1
-sVt
-I2
-sV;
-I1
-ssVos
-p2042
-(dp2043
-Va
-I2
-sVe
-I80
-sVi
-I21
-sVp
-I6
-sVs
-I43
-sVu
-I2
-sVt
-I63
-ssVor
-p2044
-(dp2045
-V
-I382
-sV)
-I1
-sV*
-I1
-sV,
-I11
-sV.
-I2
-sV;
-I2
-sV:
-I3
-sVa
-I4
-sVc
-I7
-sVb
-I8
-sVe
-I142
-sVd
-I56
-sVg
-I18
-sVi
-I10
-sVk
-I10
-sVm
-I43
-sVl
-I21
-sVo
-I4
-sVn
-I12
-sVs
-I13
-sVr
-I21
-sVt
-I100
-sVw
-I8
-sVy
-I15
-ssVUC
-p2046
-(dp2047
-VH
-I1
-ssVop
-p2048
-(dp2049
-V
-I2
-sVe
-I48
-sVi
-I19
-sVl
-I2
-sVo
-I6
-sVp
-I14
-sVr
-I7
-sVu
-I1
-sVt
-I2
-sVy
-I14
-ssV!!
-p2050
-(dp2051
-V
-I1
-ssV!
-p2052
-(dp2053
-VA
-I1
-sVC
-I2
-sVB
-I1
-sVD
-I1
-sVG
-I2
-sVF
-I3
-sVI
-I17
-sVH
-I5
-sVK
-I1
-sVM
-I3
-sVL
-I1
-sVO
-I1
-sVN
-I1
-sVP
-I1
-sVT
-I4
-sVW
-I3
-sVa
-I3
-sVb
-I4
-sVf
-I1
-sVi
-I1
-sVh
-I2
-sVj
-I1
-sVt
-I5
-ssVC
-p2054
-(dp2055
-VD
-I2
-sVo
-I1
-ssV**
-p2056
-(dp2057
-V
-I8
-sVE
-I1
-sVF
-I1
-sVI
-I1
-sV*
-I17
-sVS
-I2
-sVT
-I4
-sVW
-I1
-ssVh-
-p2058
-(dp2059
-V-
-I1
-ssVNo
-p2060
-(dp2061
-V
-I3
-sV;
-I1
-sVt
-I5
-sVw
-I1
-sV,
-I3
-ssV!)
-p2062
-(dp2063
-V
-I1
-ssVNa
-p2064
-(dp2065
-Vy
-I1
-ssV!*
-p2066
-(dp2067
-V
-I1
-sV*
-I1
-ssVNe
-p2068
-(dp2069
-Vi
-I1
-sVv
-I1
-ssVh.
-p2070
-(dp2071
-V
-I13
-sV"
-I1
-ssV[E
-p2072
-(dp2073
-Vt
-I1
-ssV[D
-p2074
-(dp2075
-Va
-I1
-ssVh
-p2076
-(dp2077
-V/
-I1
-sV2
-I1
-sV8
-I1
-sVC
-I2
-sVF
-I2
-sVI
-I35
-sVH
-I1
-sVM
-I9
-sVL
-I6
-sVS
-I2
-sVR
-I8
-sVa
-I100
-sVc
-I10
-sVb
-I6
-sVe
-I8
-sVd
-I6
-sVg
-I7
-sVf
-I12
-sVi
-I25
-sVh
-I68
-sVk
-I2
-sVj
-I2
-sVm
-I51
-sVl
-I7
-sVo
-I35
-sVn
-I4
-sVp
-I15
-sVs
-I28
-sVr
-I6
-sVu
-I4
-sVt
-I65
-sVw
-I26
-sVv
-I1
-sVy
-I19
-ssVh!
-p2078
-(dp2079
-V
-I1
-sV"
-I1
-ssVh'
-p2080
-(dp2081
-Vs
-I4
-ssV[M
-p2082
-(dp2083
-Va
-I1
-ssVeh
-p2084
-(dp2085
-Va
-I19
-sVi
-I1
-sVe
-I7
-ssVNI
-p2086
-(dp2087
-VT
-I2
-ssV"a
-p2088
-(dp2089
-Vs
-I1
-ssV.,
-p2090
-(dp2091
-V
-I18
-ssVek
-p2092
-(dp2093
-V
-I5
-sVs
-I6
-sV,
-I2
-sV.
-I1
-ssVu;
-p2094
-(dp2095
-V
-I4
-ssV[t
-p2096
-(dp2097
-Vr
-I1
-sVo
-I2
-ssV.
-p2098
-(dp2099
-V
-I27
-sV"
-I13
-sV.
-I4
-sVA
-I30
-sVC
-I10
-sVB
-I16
-sVE
-I4
-sVD
-I33
-sVG
-I2
-sVF
-I16
-sVI
-I209
-sVH
-I69
-sVK
-I2
-sVJ
-I34
-sVM
-I51
-sVL
-I21
-sVO
-I9
-sVN
-I9
-sVP
-I7
-sVS
-I61
-sVR
-I7
-sVU
-I2
-sVT
-I45
-sVW
-I33
-sVV
-I73
-sVY
-I23
-sVa
-I2
-sVb
-I1
-sVi
-I1
-sVw
-I2
-ssVNA
-p2100
-(dp2101
-VL
-I3
-ssVNB
-p2102
-(dp2103
-VE
-I7
-ssV[x
-p2104
-(dp2105
-Vx
-I1
-ssVND
-p2106
-(dp2107
-VI
-I1
-sV
-I1
-sV*
-I2
-sVE
-I5
-sV,
-I1
-ssVNE
-p2108
-(dp2109
-V
-I7
-sVD
-I1
-sVG
-I1
-sVS
-I1
-sVW
-I1
-sVY
-I1
-ssVNG
-p2110
-(dp2111
-V
-I2
-ssVNY
-p2112
-(dp2113
-V
-I2
-ssVu.
-p2114
-(dp2115
-V
-I13
-ssV[g
-p2116
-(dp2117
-Ve
-I1
-ssVrw
-p2118
-(dp2119
-Va
-I14
-sVi
-I4
-ssVMO
-p2120
-(dp2121
-VN
-I1
-ssV.2
-p2122
-(dp2123
-V9
-I1
-ssVNS
-p2124
-(dp2125
-V
-I2
-sVE
-I1
-sVO
-I17
-ssVNT
-p2126
-(dp2127
-V!
-I2
-sVA
-I2
-sV
-I1
-sVI
-I3
-sV*
-I1
-sVR
-I1
-sVY
-I2
-ssVNU
-p2128
-(dp2129
-VM
-I1
-ssVhy
-p2130
-(dp2131
-V
-I13
-sVs
-I2
-sV,
-I4
-sVp
-I2
-ssVN,
-p2132
-(dp2133
-V
-I1
-ssV-t
-p2134
-(dp2135
-Vi
-I2
-sVh
-I4
-sVm
-I4
-sVo
-I1
-sVw
-I1
-ssVN.
-p2136
-(dp2137
-V
-I19
-ssVhr
-p2138
-(dp2139
-Vi
-I2
-sVu
-I3
-sVe
-I9
-sVo
-I8
-ssVhs
-p2140
-(dp2141
-V
-I9
-sV,
-I1
-ssVg-
-p2142
-(dp2143
-Vh
-I1
-sVr
-I6
-sV-
-I4
-ssVka
-p2144
-(dp2145
-Vb
-I2
-ssVht
-p2146
-(dp2147
-V
-I90
-sVe
-I50
-sVf
-I7
-sVi
-I1
-sV,
-I12
-sV.
-I3
-sVs
-I5
-sV;
-I1
-sVl
-I1
-ssVhu
-p2148
-(dp2149
-Vs
-I21
-sVr
-I54
-sVm
-I9
-sVt
-I2
-sVn
-I5
-ssVTP
-p2150
-(dp2151
-V
-I2
-ssVhh
-p2152
-(dp2153
-Vi
-I46
-sVe
-I1
-ssVhi
-p2154
-(dp2155
-Vc
-I117
-sVb
-I1
-sVe
-I3
-sVg
-I13
-sVm
-I153
-sVl
-I85
-sVo
-I3
-sVn
-I149
-sVp
-I20
-sVs
-I283
-sVr
-I5
-sVt
-I13
-sVv
-I2
-ssVhn
-p2156
-(dp2157
-Vs
-I18
-sVe
-I1
-ssVho
-p2158
-(dp2159
-V
-I30
-sVc
-I1
-sVe
-I1
-sVd
-I1
-sVi
-I5
-sVm
-I30
-sVl
-I23
-sVo
-I15
-sVn
-I10
-sVp
-I29
-sVs
-I37
-sVr
-I30
-sVu
-I184
-sVw
-I78
-sV,
-I7
-ssVhl
-p2160
-(dp2161
-Vy
-I14
-sVe
-I1
-ssVhm
-p2162
-(dp2163
-Ve
-I19
-ssVhb
-p2164
-(dp2165
-Vo
-I1
-ssVD*
-p2166
-(dp2167
-V
-I1
-sVT
-I1
-ssVha
-p2168
-(dp2169
-Ve
-I2
-sVd
-I97
-sVk
-I1
-sVm
-I3
-sVl
-I67
-sVn
-I85
-sVp
-I47
-sVs
-I113
-sVr
-I47
-sVt
-I403
-sVv
-I281
-sVz
-I1
-ssVhf
-p2170
-(dp2171
-Vu
-I4
-ssVs?
-p2172
-(dp2173
-V
-I2
-sV"
-I2
-ssVhe
-p2174
-(dp2175
-Va
-I67
-sV
-I1028
-sVc
-I2
-sVe
-I4
-sVd
-I53
-sVi
-I20
-sV-
-I1
-sVm
-I35
-sVl
-I13
-sVn
-I102
-sVs
-I28
-sVr
-I827
-sVt
-I9
-sVy
-I29
-sV;
-I1
-sV.
-I1
-sV,
-I10
-ssV[3
-p2176
-(dp2177
-V]
-I2
-ssV[2
-p2178
-(dp2179
-V]
-I3
-ssV[1
-p2180
-(dp2181
-V0
-I1
-sV]
-I3
-ssV-w
-p2182
-(dp2183
-Va
-I1
-sVe
-I1
-ssVuy
-p2184
-(dp2185
-V
-I1
-ssV*S
-p2186
-(dp2187
-VT
-I2
-ssVXV
-p2188
-(dp2189
-VI
-I8
-sV
-I3
-sVl
-I1
-ssVut
-p2190
-(dp2191
-Va
-I3
-sV
-I265
-sVe
-I51
-sVi
-I22
-sVh
-I13
-sVm
-I3
-sV,
-I11
-sV.
-I1
-sVu
-I4
-sVt
-I2
-sVy
-I14
-sV;
-I1
-ssVgy
-p2192
-(dp2193
-V
-I1
-sV,
-I1
-ssV.c
-p2194
-(dp2195
-Vs
-I1
-sVo
-I1
-ssVup
-p2196
-(dp2197
-V
-I14
-sVe
-I11
-sVd
-I1
-sVi
-I3
-sV,
-I3
-sVo
-I5
-sV.
-I1
-sVp
-I21
-sVs
-I2
-sVr
-I1
-sVu
-I1
-sVt
-I4
-ssVus
-p2198
-(dp2199
-Va
-I84
-sV
-I70
-sVb
-I17
-sVe
-I79
-sVi
-I27
-sVh
-I3
-sV,
-I10
-sVn
-I10
-sVp
-I9
-sVs
-I2
-sVu
-I4
-sVt
-I136
-sVy
-I7
-sV;
-I1
-sV.
-I5
-sVl
-I7
-ssVur
-p2200
-(dp2201
-Va
-I32
-sV
-I238
-sVc
-I75
-sVb
-I2
-sVe
-I122
-sVg
-I10
-sV@
-I1
-sVi
-I14
-sVh
-I1
-sV,
-I5
-sVn
-I33
-sVp
-I13
-sVs
-I79
-sVr
-I5
-sV!
-I1
-sVt
-I9
-sVv
-I1
-sVy
-I1
-sV;
-I2
-sV.
-I6
-ssVum
-p2202
-(dp2203
-Va
-I2
-sV
-I3
-sVb
-I7
-sVe
-I2
-sVi
-I3
-sVm
-I9
-sV,
-I2
-sVo
-I3
-sVp
-I3
-sVs
-I10
-ssVul
-p2204
-(dp2205
-Va
-I37
-sV
-I33
-sVe
-I3
-sVd
-I198
-sVg
-I5
-sVi
-I3
-sVl
-I18
-sVo
-I5
-sV.
-I5
-sVs
-I1
-sV!
-I1
-sVt
-I12
-sVy
-I1
-sV;
-I1
-sVn
-I1
-sV,
-I2
-ssV.z
-p2206
-(dp2207
-Vi
-I1
-ssVun
-p2208
-(dp2209
-Va
-I16
-sV
-I5
-sVc
-I24
-sVe
-I23
-sVd
-I66
-sVg
-I29
-sVf
-I5
-sVi
-I27
-sVh
-I10
-sVk
-I6
-sVm
-I1
-sVl
-I6
-sVn
-I5
-sVp
-I4
-sVs
-I3
-sVr
-I1
-sVu
-I1
-sVt
-I47
-sVw
-I5
-sV.
-I1
-ssVui
-p2210
-(dp2211
-Va
-I1
-sVc
-I1
-sVe
-I4
-sVl
-I6
-sVn
-I6
-sVp
-I1
-sVs
-I9
-sVr
-I15
-sVu
-I1
-sVt
-I28
-sVv
-I4
-ssVue
-p2212
-(dp2213
-V
-I21
-sVd
-I12
-sVl
-I2
-sV.
-I1
-sVs
-I24
-sVt
-I5
-sVn
-I22
-sV,
-I4
-ssVud
-p2214
-(dp2215
-V
-I1
-sVe
-I29
-sVd
-I5
-sVg
-I14
-sVi
-I9
-sV.
-I1
-ssVug
-p2216
-(dp2217
-V
-I1
-sVl
-I1
-sVg
-I3
-sVh
-I150
-ssV.s
-p2218
-(dp2219
-Ve
-I1
-ssV.t
-p2220
-(dp2221
-Vy
-I1
-sVx
-I3
-ssV.u
-p2222
-(dp2223
-Vi
-I1
-ssVuc
-p2224
-(dp2225
-Va
-I8
-sVc
-I5
-sVe
-I10
-sVi
-I1
-sVh
-I123
-sVk
-I9
-sV.
-I1
-sVt
-I21
-ssVub
-p2226
-(dp2227
-Vb
-I4
-sVd
-I5
-sVj
-I13
-sVm
-I9
-sVl
-I10
-sVs
-I3
-sVt
-I22
-ssVac
-p2228
-(dp2229
-Va
-I2
-sV
-I1
-sVc
-I45
-sVe
-I37
-sVi
-I4
-sVh
-I55
-sVk
-I8
-sVq
-I16
-sVr
-I5
-sVu
-I2
-sVt
-I59
-sVy
-I12
-ssVab
-p2230
-(dp2231
-Vi
-I16
-sVh
-I3
-sVj
-I1
-sVl
-I128
-sVo
-I33
-sVs
-I15
-sVu
-I1
-ssVae
-p2232
-(dp2233
-Vl
-I2
-ssVad
-p2234
-(dp2235
-Va
-I4
-sV
-I117
-sVe
-I50
-sVd
-I12
-sVf
-I5
-sVi
-I12
-sVm
-I14
-sV,
-I3
-sVo
-I2
-sVn
-I1
-sVs
-I2
-sVu
-I2
-sVv
-I23
-sVy
-I109
-sV.
-I1
-sVl
-I1
-ssVag
-p2236
-(dp2237
-Va
-I38
-sVe
-I79
-sVg
-I3
-sVi
-I16
-sVo
-I8
-sVr
-I18
-sVu
-I3
-ssVaf
-p2238
-(dp2239
-Vr
-I9
-sVe
-I3
-sVt
-I18
-sVf
-I59
-ssVai
-p2240
-(dp2241
-Vd
-I39
-sVg
-I1
-sVm
-I10
-sVl
-I11
-sVn
-I178
-sVs
-I6
-sVr
-I22
-sVt
-I10
-ssVak
-p2242
-(dp2243
-Va
-I1
-sV
-I15
-sVe
-I97
-sVf
-I5
-sVi
-I19
-sVn
-I1
-sVs
-I3
-ssVTu
-p2244
-(dp2245
-Ve
-I2
-ssVam
-p2246
-(dp2247
-Va
-I5
-sV
-I121
-sVb
-I2
-sVe
-I110
-sVi
-I33
-sVm
-I6
-sV,
-I9
-sVo
-I3
-sVp
-I7
-sVu
-I5
-ssVal
-p2248
-(dp2249
-Va
-I5
-sV
-I91
-sVc
-I3
-sVe
-I15
-sVd
-I78
-sVf
-I8
-sVi
-I12
-sVk
-I12
-sVm
-I13
-sVl
-I277
-sVo
-I24
-sV.
-I5
-sVs
-I9
-sVr
-I8
-sVu
-I4
-sVt
-I25
-sVw
-I27
-sVy
-I1
-sV,
-I12
-ssVao
-p2250
-(dp2251
-Vr
-I4
-ssVan
-p2252
-(dp2253
-V!
-I2
-sV
-I307
-sV'
-I17
-sV,
-I35
-sV.
-I9
-sV;
-I7
-sV:
-I1
-sVa
-I12
-sVc
-I83
-sVe
-I8
-sVd
-I717
-sVg
-I50
-sVi
-I17
-sVk
-I7
-sVl
-I2
-sVo
-I13
-sVn
-I67
-sVq
-I5
-sVs
-I25
-sVt
-I68
-sVw
-I4
-sVv
-I1
-sVy
-I103
-sVx
-I12
-ssVTo
-p2254
-(dp2255
-V
-I11
-sV-
-I1
-ssVas
-p2256
-(dp2257
-Va
-I3
-sV
-I521
-sVc
-I4
-sVe
-I28
-sVi
-I32
-sVh
-I7
-sVk
-I9
-sV,
-I3
-sVo
-I28
-sV.
-I1
-sVp
-I1
-sVs
-I45
-sV!
-I1
-sVu
-I21
-sVt
-I76
-sVy
-I13
-sV;
-I1
-ssVar
-p2258
-(dp2259
-Va
-I35
-sV
-I114
-sVc
-I15
-sVb
-I1
-sVe
-I138
-sVd
-I69
-sVg
-I6
-sVf
-I2
-sVi
-I67
-sVk
-I16
-sVm
-I21
-sVl
-I28
-sVo
-I2
-sVn
-I16
-sVs
-I31
-sVr
-I80
-sVt
-I121
-sVy
-I31
-sV;
-I1
-sV.
-I2
-sV,
-I4
-ssVau
-p2260
-(dp2261
-Vc
-I1
-sVd
-I2
-sVg
-I47
-sVl
-I6
-sVn
-I10
-sVs
-I20
-sVt
-I12
-ssVat
-p2262
-(dp2263
-Va
-I1
-sV
-I560
-sVc
-I15
-sVe
-I176
-sV'
-I1
-sVi
-I215
-sVh
-I45
-sV,
-I12
-sVo
-I3
-sVl
-I4
-sVr
-I2
-sVu
-I27
-sVt
-I87
-sVy
-I1
-sV;
-I1
-sV.
-I1
-ssVTh
-p2264
-(dp2265
-Va
-I4
-sVe
-I47
-sVi
-I16
-sVo
-I3
-sVr
-I2
-sVu
-I4
-ssVTi
-p2266
-(dp2267
-Vm
-I1
-ssVay
-p2268
-(dp2269
-Va
-I1
-sV
-I140
-sVe
-I5
-sV'
-I1
-sVi
-I7
-sV,
-I16
-sV.
-I11
-sVs
-I43
-sV;
-I8
-ssVax
-p2270
-(dp2271
-V
-I2
-sVe
-I2
-ssVTe
-p2272
-(dp2273
-Vx
-I1
-sVl
-I1
-ssV80
-p2274
-(dp2275
-V0
-I1
-sV
-I1
-ssVAf
-p2276
-(dp2277
-Vt
-I3
-ssV(a
-p2278
-(dp2279
-V
-I1
-sVs
-I3
-sVt
-I1
-sVn
-I2
-ssVni
-p2280
-(dp2281
-Va
-I2
-sVc
-I11
-sVe
-I18
-sVg
-I9
-sVf
-I2
-sVl
-I1
-sVo
-I26
-sVn
-I50
-sVs
-I24
-sVu
-I1
-sVt
-I24
-sVv
-I5
-ssVnj
-p2282
-(dp2283
-Vu
-I8
-sVe
-I2
-sVo
-I5
-ssVnk
-p2284
-(dp2285
-V
-I27
-sVe
-I1
-sVf
-I1
-sVi
-I9
-sV,
-I7
-sVs
-I4
-ssVnl
-p2286
-(dp2287
-Vy
-I56
-sVa
-I1
-sVi
-I1
-sVu
-I5
-sVe
-I2
-ssVnw
-p2288
-(dp2289
-Va
-I46
-sVh
-I4
-sVe
-I2
-sVi
-I2
-sVo
-I1
-ssVnn
-p2290
-(dp2291
-Vi
-I6
-sVe
-I42
-sVu
-I1
-sVo
-I42
-ssVno
-p2292
-(dp2293
-V
-I72
-sVc
-I2
-sVb
-I1
-sVe
-I1
-sVf
-I1
-sVi
-I1
-sVm
-I3
-sVn
-I70
-sVs
-I1
-sVr
-I20
-sVu
-I29
-sVt
-I345
-sVw
-I134
-ssV46
-p2294
-(dp2295
-V]
-I1
-ssVna
-p2296
-(dp2297
-Vc
-I2
-sVb
-I19
-sVd
-I1
-sVm
-I7
-sVl
-I99
-sVn
-I12
-sVr
-I7
-sVt
-I67
-sVv
-I1
-sVy
-I1
-ssVnb
-p2298
-(dp2299
-Ve
-I15
-ssVnc
-p2300
-(dp2301
-Ve
-I223
-sVi
-I15
-sVh
-I3
-sVl
-I34
-sVo
-I18
-sVr
-I7
-sVu
-I4
-sVt
-I2
-sVy
-I12
-ssVnd
-p2302
-(dp2303
-Va
-I7
-sV
-I775
-sV"
-I1
-sVe
-I127
-sV'
-I5
-sVi
-I35
-sV-
-I3
-sV,
-I34
-sVo
-I26
-sVn
-I8
-sVs
-I43
-sVr
-I3
-sVu
-I26
-sV;
-I6
-sV.
-I7
-sV?
-I1
-sVl
-I3
-ssVne
-p2304
-(dp2305
-V
-I94
-sV'
-I2
-sV,
-I25
-sV.
-I10
-sV;
-I5
-sV?
-I3
-sVa
-I11
-sVc
-I31
-sVe
-I9
-sVd
-I71
-sVg
-I9
-sVf
-I3
-sVi
-I6
-sVm
-I3
-sVo
-I2
-sVn
-I4
-sVq
-I1
-sVs
-I91
-sVr
-I47
-sVt
-I5
-sVw
-I14
-sVv
-I44
-sVy
-I13
-sVx
-I18
-ssVnf
-p2306
-(dp2307
-Va
-I2
-sVe
-I9
-sVi
-I16
-sVl
-I11
-sVo
-I19
-sVr
-I1
-sVu
-I7
-ssVng
-p2308
-(dp2309
-Va
-I12
-sV
-I609
-sV!
-I1
-sVe
-I40
-sV'
-I7
-sVf
-I19
-sVi
-I4
-sV-
-I11
-sVl
-I11
-sVo
-I1
-sV.
-I22
-sVs
-I47
-sVr
-I14
-sVu
-I9
-sVt
-I11
-sV;
-I10
-sV:
-I4
-sV,
-I39
-sV?
-I3
-ssVTN
-p2310
-(dp2311
-VE
-I1
-ssVny
-p2312
-(dp2313
-V
-I80
-sVb
-I1
-sV)
-I2
-sVm
-I1
-sV,
-I1
-sVo
-I7
-sV.
-I2
-sVt
-I12
-sVw
-I1
-ssVnz
-p2314
-(dp2315
-Va
-I2
-ssVTM
-p2316
-(dp2317
-VA
-I1
-sV
-I1
-ssVTH
-p2318
-(dp2319
-VI
-I2
-sVA
-I2
-sVE
-I20
-sV.
-I1
-ssVTI
-p2320
-(dp2321
-VA
-I1
-sVC
-I2
-sVE
-I2
-sVO
-I2
-sVV
-I1
-ssVnp
-p2322
-(dp2323
-Vr
-I2
-sVl
-I3
-ssVnq
-p2324
-(dp2325
-Vu
-I11
-ssVnr
-p2326
-(dp2327
-Va
-I3
-sVi
-I1
-sVe
-I1
-ssVTE
-p2328
-(dp2329
-VX
-I6
-sVR
-I1
-sVD
-I3
-sVN
-I8
-ssVnt
-p2330
-(dp2331
-Va
-I29
-sV
-I220
-sVe
-I113
-sVf
-I1
-sVi
-I95
-sVh
-I18
-sVm
-I8
-sV,
-I45
-sVo
-I22
-sV.
-I29
-sVs
-I33
-sVr
-I34
-sV!
-I9
-sVy
-I3
-sVu
-I1
-sV;
-I12
-sV?
-I1
-sVl
-I30
-ssVHu
-p2332
-(dp2333
-Vr
-I1
-sVm
-I2
-sVn
-I1
-ssVnv
-p2334
-(dp2335
-Vi
-I39
-sVa
-I2
-sVe
-I26
-sVy
-I1
-ssVTA
-p2336
-(dp2337
-VB
-I1
-sVR
-I2
-sVL
-I1
-ssVa
-p2338
-(dp2339
-V"
-I1
-sVE
-I1
-sVD
-I1
-sVM
-I1
-sVP
-I1
-sVU
-I1
-sVV
-I2
-sVa
-I4
-sVc
-I25
-sVb
-I6
-sVe
-I1
-sVd
-I28
-sVg
-I16
-sVf
-I29
-sVi
-I9
-sVh
-I18
-sVk
-I3
-sVj
-I1
-sVm
-I41
-sVl
-I29
-sVo
-I7
-sVn
-I4
-sVq
-I1
-sVp
-I18
-sVs
-I41
-sVr
-I18
-sVu
-I1
-sVt
-I14
-sVw
-I30
-sVv
-I13
-sVy
-I9
-ssVAC
-p2340
-(dp2341
-VH
-I1
-sVT
-I1
-ssVAB
-p2342
-(dp2343
-VI
-I2
-sVO
-I1
-ssV's
-p2344
-(dp2345
-V
-I115
-sV,
-I3
-sV.
-I2
-ssVAD
-p2346
-(dp2347
-VY
-I35
-sV
-I1
-sVE
-I1
-sV,
-I1
-ssVAG
-p2348
-(dp2349
-VE
-I3
-ssVE,
-p2350
-(dp2351
-V
-I2
-ssVAI
-p2352
-(dp2353
-VM
-I1
-sVL
-I1
-sVN
-I2
-ssVxu
-p2354
-(dp2355
-Vl
-I1
-ssVAM
-p2356
-(dp2357
-VA
-I3
-sVE
-I4
-ssVAL
-p2358
-(dp2359
-VI
-I5
-sV
-I1
-sVL
-I2
-sVD
-I3
-sV,
-I1
-ssVa.
-p2360
-(dp2361
-V
-I2
-sVt
-I1
-ssVy:
-p2362
-(dp2363
-V
-I1
-ssVT,
-p2364
-(dp2365
-V
-I2
-ssVAR
-p2366
-(dp2367
-V
-I2
-sVR
-I4
-sVE
-I2
-sVT
-I3
-ssVT*
-p2368
-(dp2369
-V
-I2
-sV*
-I2
-ssVAT
-p2370
-(dp2371
-V
-I2
-sV:
-I1
-sVT
-I1
-sVH
-I8
-ssVAV
-p2372
-(dp2373
-VE
-I2
-sVO
-I1
-ssVAY
-p2374
-(dp2375
-V
-I1
-ssVa;
-p2376
-(dp2377
-V
-I3
-ssV-s
-p2378
-(dp2379
-Vi
-I1
-sVa
-I1
-sVu
-I2
-sVh
-I1
-ssVg!
-p2380
-(dp2381
-V
-I1
-ssVT
-p2382
-(dp2383
-VG
-I8
-sVP
-I1
-sVf
-I1
-sVI
-I3
-sVH
-I1
-sVM
-I1
-sVL
-I2
-sVO
-I1
-sVN
-I3
-sVp
-I2
-sVm
-I1
-sVi
-I1
-sVd
-I1
-ssVT!
-p2384
-(dp2385
-V
-I1
-sV*
-I1
-ssV"o
-p2386
-(dp2387
-Vr
-I1
-sVn
-I1
-ssVn*
-p2388
-(dp2389
-V*
-I2
-ssV'T
-p2390
-(dp2391
-V
-I1
-ssVn,
-p2392
-(dp2393
-V
-I182
-sV"
-I1
-ssVAd
-p2394
-(dp2395
-Vi
-I8
-ssVn.
-p2396
-(dp2397
-V
-I68
-sV"
-I3
-ssVn/
-p2398
-(dp2399
-VC
-I1
-ssVn
-p2400
-(dp2401
-V"
-I1
-sV/
-I1
-sV1
-I1
-sV3
-I1
-sV2
-I1
-sV5
-I1
-sV9
-I1
-sVA
-I2
-sVE
-I7
-sVF
-I4
-sVI
-I30
-sVK
-I1
-sVM
-I8
-sVL
-I13
-sVS
-I5
-sVR
-I3
-sVU
-I4
-sVT
-I3
-sVW
-I3
-sVV
-I2
-sV[
-I1
-sVa
-I154
-sVc
-I31
-sVb
-I51
-sVe
-I50
-sVd
-I26
-sVg
-I19
-sVf
-I52
-sVi
-I87
-sVh
-I109
-sVk
-I5
-sVj
-I3
-sVm
-I91
-sVl
-I19
-sVo
-I127
-sVn
-I14
-sVp
-I31
-sVs
-I77
-sVr
-I24
-sVu
-I21
-sVt
-I254
-sVw
-I88
-sVv
-I10
-sVy
-I41
-ssVn!
-p2402
-(dp2403
-V
-I8
-sV"
-I1
-ssVn"
-p2404
-(dp2405
-V
-I1
-ssVTR
-p2406
-(dp2407
-VI
-I2
-sVA
-I1
-ssVAm
-p2408
-(dp2409
-V
-I1
-sVo
-I3
-ssVAl
-p2410
-(dp2411
-Vi
-I9
-sVl
-I5
-ssVn'
-p2412
-(dp2413
-Vs
-I26
-sVt
-I1
-ssVn:
-p2414
-(dp2415
-V
-I4
-ssVn;
-p2416
-(dp2417
-V
-I39
-ssVAu
-p2418
-(dp2419
-Vs
-I6
-ssVAt
-p2420
-(dp2421
-V
-I11
-ssVAw
-p2422
-(dp2423
-Va
-I1
-ssVn?
-p2424
-(dp2425
-V
-I3
-ssVn1
-p2426
-(dp2427
-V1
-I1
-sV0
-I3
-ssVG"
-p2428
-(dp2429
-V
-I1
-sssb.
\ No newline at end of file
Copied: trunk/lib/venus/examples/filters/guess-language/en.data (from rev 656, branches/sucs-site/lib/venus/examples/filters/guess-language/en.data)
===================================================================
--- trunk/lib/venus/examples/filters/guess-language/en.data (rev 0)
+++ trunk/lib/venus/examples/filters/guess-language/en.data 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,15131 @@
+(itrigram
+Trigram
+p1
+(dp2
+S'length'
+p3
+F5471.4726536829185
+sS'lut'
+p4
+(dp5
+V b
+p6
+(dp7
+Va
+I7
+sVe
+I568
+sVi
+I11
+sVl
+I17
+sVo
+I20
+sVr
+I56
+sVu
+I188
+sVy
+I148
+ssV c
+p8
+(dp9
+Va
+I189
+sVe
+I20
+sVd
+I2
+sVi
+I12
+sVh
+I74
+sVl
+I16
+sVo
+I463
+sVr
+I22
+sVu
+I2
+ssVgu
+p10
+(dp11
+Va
+I9
+sVe
+I5
+sVi
+I9
+sVm
+I1
+sVl
+I2
+sVn
+I3
+sVr
+I1
+sVt
+I1
+ssV a
+p12
+(dp13
+V
+I330
+sVc
+I85
+sVb
+I70
+sVd
+I47
+sVg
+I73
+sVf
+I83
+sVi
+I3
+sVm
+I148
+sVl
+I216
+sVn
+I858
+sVp
+I48
+sVs
+I282
+sVr
+I101
+sVu
+I15
+sVt
+I203
+sVw
+I28
+sVv
+I7
+ssV f
+p14
+(dp15
+Va
+I109
+sVe
+I95
+sVi
+I76
+sVl
+I16
+sVo
+I371
+sVr
+I155
+sVu
+I23
+sVt
+I2
+ssV g
+p16
+(dp17
+Va
+I16
+sVe
+I45
+sVi
+I68
+sVl
+I8
+sVo
+I89
+sVr
+I81
+sVu
+I11
+ssV d
+p18
+(dp19
+Va
+I90
+sVe
+I275
+sVi
+I178
+sVo
+I142
+sVr
+I24
+sVu
+I18
+sVw
+I1
+ssV e
+p20
+(dp21
+Va
+I48
+sVc
+I3
+sVd
+I12
+sVf
+I12
+sVi
+I7
+sVm
+I13
+sVl
+I14
+sVn
+I107
+sVq
+I17
+sVp
+I1
+sVs
+I26
+sVr
+I5
+sVt
+I31
+sVv
+I132
+sVy
+I10
+sVx
+I117
+ssV j
+p22
+(dp23
+Ve
+I11
+sVu
+I41
+sVo
+I11
+ssV k
+p24
+(dp25
+Vi
+I22
+sVe
+I14
+sVn
+I90
+ssV h
+p26
+(dp27
+Va
+I525
+sVe
+I739
+sVi
+I320
+sVo
+I168
+sVu
+I33
+sVy
+I2
+ssV i
+p28
+(dp29
+Vd
+I17
+sVg
+I3
+sVf
+I62
+sVm
+I87
+sVl
+I14
+sVn
+I599
+sVs
+I287
+sVr
+I3
+sVt
+I254
+ssV n
+p30
+(dp31
+Va
+I19
+sVu
+I5
+sVe
+I98
+sVi
+I10
+sVo
+I438
+ssV o
+p32
+(dp33
+Vc
+I14
+sVb
+I32
+sVd
+I2
+sVf
+I741
+sVl
+I9
+sVn
+I225
+sVp
+I36
+sVs
+I1
+sVr
+I90
+sVu
+I70
+sVt
+I44
+sVw
+I47
+sVv
+I20
+ssV l
+p34
+(dp35
+Va
+I80
+sVe
+I154
+sVi
+I107
+sVo
+I115
+sVs
+I4
+sVu
+I1
+ssV m
+p36
+(dp37
+Va
+I319
+sVe
+I281
+sVg
+I1
+sVi
+I107
+sVo
+I229
+sVu
+I149
+sVy
+I347
+ssV r
+p38
+(dp39
+Vi
+I18
+sVu
+I12
+sVe
+I378
+sVa
+I20
+sVo
+I25
+ssV s
+p40
+(dp41
+Va
+I111
+sVc
+I31
+sVe
+I206
+sVi
+I105
+sVh
+I339
+sVm
+I7
+sVl
+I7
+sVo
+I297
+sVp
+I70
+sVu
+I197
+sVt
+I85
+sVw
+I6
+sVy
+I5
+ssV p
+p42
+(dp43
+Va
+I102
+sVe
+I104
+sVi
+I7
+sVh
+I2
+sVl
+I63
+sVo
+I84
+sVr
+I205
+sVu
+I22
+ssV q
+p44
+(dp45
+Vu
+I40
+ssV v
+p46
+(dp47
+Va
+I23
+sVi
+I40
+sVe
+I95
+sVo
+I4
+ssV w
+p48
+(dp49
+Va
+I243
+sVe
+I172
+sVi
+I425
+sVh
+I382
+sVo
+I157
+sVr
+I39
+ssV t
+p50
+(dp51
+Va
+I56
+sVe
+I60
+sVi
+I69
+sVh
+I1425
+sVm
+I1
+sVo
+I997
+sVr
+I66
+sVu
+I4
+sVw
+I21
+ssV u
+p52
+(dp53
+Vg
+I1
+sVi
+I1
+sVn
+I132
+sVp
+I26
+sVs
+I50
+sVr
+I10
+sVt
+I4
+ssV z
+p54
+(dp55
+Vi
+I1
+ssVgn
+p56
+(dp57
+Va
+I2
+sV
+I7
+sVe
+I3
+sVi
+I6
+sV,
+I2
+sVo
+I4
+sVs
+I1
+ssV x
+p58
+(dp59
+V
+I1
+ssV y
+p60
+(dp61
+Vi
+I2
+sVe
+I38
+sVo
+I469
+ssV-Y
+p62
+(dp63
+Vo
+I3
+ssVlk
+p64
+(dp65
+Vi
+I5
+sV
+I2
+sVs
+I3
+sVe
+I3
+ssVgi
+p66
+(dp67
+Vb
+I1
+sVe
+I4
+sVn
+I111
+sVr
+I29
+sVt
+I5
+sVv
+I45
+sVz
+I2
+ssVgh
+p68
+(dp69
+V
+I61
+sVb
+I1
+sVe
+I3
+sVi
+I2
+sV,
+I7
+sVl
+I11
+sVt
+I170
+sV;
+I2
+ssV B
+p70
+(dp71
+Va
+I5
+sVE
+I1
+sVi
+I1
+sVo
+I2
+sVR
+I2
+sVu
+I12
+sVy
+I6
+sVU
+I2
+sVe
+I6
+ssV C
+p72
+(dp73
+Va
+I15
+sVA
+I8
+sVe
+I1
+sVh
+I58
+sVl
+I2
+sVO
+I31
+sV.
+I6
+sVr
+I2
+sVo
+I33
+ssV-g
+p74
+(dp75
+Vr
+I1
+ssV A
+p76
+(dp77
+V
+I3
+sVr
+I1
+sVB
+I1
+sVd
+I8
+sVg
+I1
+sVf
+I3
+sVS
+I3
+sVm
+I4
+sVl
+I14
+sVN
+I2
+sVs
+I11
+sVR
+I2
+sVu
+I6
+sVT
+I1
+sVw
+I1
+sVn
+I5
+sVL
+I5
+sVt
+I11
+ssV F
+p78
+(dp79
+Va
+I2
+sVo
+I7
+sVi
+I1
+sVl
+I1
+sVO
+I4
+sV.
+I1
+sVI
+I1
+sVr
+I89
+sVT
+I2
+sVR
+I2
+ssV G
+p80
+(dp81
+VE
+I2
+sVi
+I1
+sVo
+I4
+sVI
+I1
+sVu
+I17
+sVU
+I9
+sVe
+I1
+ssV D
+p82
+(dp83
+VA
+I3
+sVe
+I32
+sVi
+I3
+sVO
+I3
+sVI
+I3
+sVu
+I2
+sVo
+I7
+sVE
+I29
+ssV E
+p84
+(dp85
+VB
+I2
+sVD
+I1
+sVv
+I4
+sVl
+I1
+sVn
+I4
+sVd
+I9
+sVT
+I6
+sVX
+I1
+sVV
+I2
+sVx
+I2
+sVN
+I1
+sVt
+I9
+ssV J
+p86
+(dp87
+Va
+I60
+sVu
+I1
+sVo
+I18
+sVO
+I17
+ssVtw
+p88
+(dp89
+Vi
+I1
+sVa
+I2
+sVe
+I18
+sVo
+I17
+ssVtt
+p90
+(dp91
+Va
+I28
+sVe
+I129
+sVi
+I11
+sVl
+I36
+sVr
+I6
+sVy
+I4
+ssV I
+p92
+(dp93
+V
+I766
+sVF
+I3
+sVI
+I2
+sVs
+I2
+sVf
+I25
+sVM
+I1
+sVL
+I1
+sVN
+I7
+sVS
+I1
+sVt
+I27
+sVV
+I1
+sVX
+I1
+sV;
+I1
+sVn
+I12
+sV,
+I5
+sVT
+I1
+ssVtr
+p94
+(dp95
+Va
+I39
+sVe
+I58
+sVi
+I31
+sVo
+I23
+sVu
+I33
+sVy
+I18
+ssVts
+p96
+(dp97
+V
+I63
+sV"
+I1
+sVe
+I4
+sV*
+I1
+sV,
+I20
+sV.
+I10
+sV;
+I3
+ssV L
+p98
+(dp99
+Va
+I96
+sVA
+I35
+sVE
+I1
+sVI
+I5
+sVo
+I22
+sVi
+I1
+sVe
+I6
+ssV M
+p100
+(dp101
+Va
+I62
+sVA
+I2
+sVC
+I1
+sVe
+I1
+sVG
+I1
+sVi
+I32
+sVO
+I1
+sV.
+I2
+sVy
+I35
+sVR
+I40
+sVu
+I2
+sVo
+I12
+sVY
+I1
+sVE
+I4
+sVr
+I96
+sVU
+I1
+sVI
+I1
+ssV R
+p102
+(dp103
+VE
+I5
+sVe
+I81
+sVo
+I1
+sV.
+I4
+ssV S
+p104
+(dp105
+VO
+I1
+sVA
+I4
+sVE
+I1
+sV
+I1
+sVi
+I64
+sVh
+I42
+sVM
+I2
+sVm
+I6
+sVo
+I5
+sV.
+I20
+sVp
+I1
+sVu
+I90
+sVt
+I24
+sVH
+I3
+sVI
+I2
+sVU
+I24
+sVe
+I10
+sVT
+I1
+ssV P
+p106
+(dp107
+Va
+I7
+sVA
+I1
+sVe
+I1
+sVl
+I3
+sVO
+I1
+sV.
+I1
+sVR
+I9
+sVU
+I4
+sVo
+I7
+sVr
+I29
+ssVtm
+p108
+(dp109
+Va
+I2
+sV
+I4
+sV"
+I1
+sVe
+I12
+sVo
+I3
+ssV V
+p110
+(dp111
+Va
+I1
+sV
+I1
+sVe
+I66
+sVI
+I3
+sVo
+I1
+sV.
+I4
+sVE
+I50
+ssV W
+p112
+(dp113
+VA
+I4
+sVe
+I27
+sVi
+I11
+sVh
+I33
+sVo
+I1
+sVH
+I1
+ssVth
+p114
+(dp115
+Va
+I378
+sV
+I240
+sVe
+I1023
+sV'
+I4
+sVf
+I4
+sVi
+I255
+sVh
+I1
+sVl
+I3
+sVo
+I105
+sV.
+I9
+sVs
+I10
+sVr
+I15
+sV!
+I1
+sVy
+I5
+sVu
+I1
+sV;
+I2
+sV:
+I1
+sV,
+I10
+ssVti
+p116
+(dp117
+Va
+I6
+sVc
+I42
+sVb
+I4
+sVe
+I29
+sVf
+I21
+sVm
+I71
+sVl
+I41
+sVo
+I338
+sVn
+I114
+sVs
+I18
+sVr
+I16
+sVt
+I9
+sVv
+I27
+ssVtf
+p118
+(dp119
+Vu
+I18
+ssV [
+p120
+(dp121
+VE
+I1
+sVD
+I1
+sVg
+I1
+sV*
+I3
+sVM
+I1
+sV1
+I4
+sV3
+I2
+sV2
+I3
+sVt
+I3
+sVx
+I1
+ssVG-
+p122
+(dp123
+V
+I1
+sVt
+I4
+sVT
+I1
+ssVte
+p124
+(dp125
+Va
+I11
+sV
+I126
+sVc
+I5
+sVe
+I11
+sVd
+I149
+sVg
+I2
+sVf
+I5
+sVm
+I28
+sVl
+I69
+sVp
+I1
+sVn
+I150
+sV.
+I8
+sVs
+I24
+sVr
+I287
+sVv
+I8
+sVx
+I46
+sV;
+I1
+sV:
+I1
+sV,
+I13
+sV?
+I1
+ssV-y
+p126
+(dp127
+Vo
+I2
+ssVtc
+p128
+(dp129
+Vh
+I29
+sV.
+I1
+ssVta
+p130
+(dp131
+Vc
+I31
+sVb
+I19
+sVg
+I12
+sVf
+I3
+sVi
+I30
+sVk
+I50
+sVl
+I27
+sVn
+I61
+sVs
+I1
+sVr
+I3
+sVu
+I2
+sVt
+I57
+sVy
+I9
+sVx
+I3
+sV,
+I1
+ssV "
+p132
+(dp133
+VA
+I3
+sVC
+I2
+sVB
+I2
+sVD
+I2
+sVG
+I1
+sVF
+I3
+sVI
+I22
+sVH
+I3
+sVM
+I3
+sVO
+I2
+sVN
+I4
+sVP
+I6
+sVS
+I6
+sVR
+I1
+sVW
+I2
+sVY
+I2
+sVa
+I1
+sVb
+I4
+sVd
+I1
+sVi
+I2
+sVh
+I2
+sVo
+I2
+sVp
+I1
+sVs
+I1
+sVr
+I1
+sVt
+I2
+sVw
+I2
+sVy
+I2
+ssV #
+p134
+(dp135
+V9
+I1
+sV6
+I1
+ssS' '
+p136
+(dp137
+V
+I606
+sV#
+I1
+sV"
+I9
+sV&
+I1
+sV(
+I4
+sV*
+I12
+sV-
+I3
+sV2
+I2
+sVA
+I19
+sVC
+I47
+sVB
+I4
+sVE
+I8
+sVD
+I8
+sVG
+I2
+sVF
+I17
+sVI
+I68
+sVH
+I6
+sVJ
+I7
+sVM
+I56
+sVL
+I34
+sVO
+I3
+sVN
+I2
+sVP
+I12
+sVS
+I37
+sVR
+I15
+sVU
+I9
+sVT
+I26
+sVW
+I20
+sVV
+I18
+sVY
+I33
+sVX
+I32
+sV[
+I12
+sVa
+I172
+sVc
+I92
+sVb
+I78
+sVe
+I62
+sVd
+I78
+sVg
+I25
+sVf
+I67
+sVi
+I107
+sVh
+I118
+sVk
+I7
+sVj
+I8
+sVm
+I103
+sVl
+I35
+sVo
+I81
+sVn
+I40
+sVq
+I4
+sVp
+I65
+sVs
+I128
+sVr
+I49
+sVu
+I25
+sVt
+I140
+sVw
+I108
+sVv
+I11
+sVy
+I34
+ssV &
+p138
+(dp139
+Vc
+I20
+ssV $
+p140
+(dp141
+V2
+I1
+ssV *
+p142
+(dp143
+VB
+I1
+sVE
+I2
+sV*
+I8
+sVn
+I1
+sVT
+I1
+sVW
+I1
+sVe
+I1
+ssV:
+p144
+(dp145
+Va
+I4
+sV
+I4
+sVb
+I3
+sVF
+I1
+sVi
+I3
+sVh
+I2
+sVM
+I3
+sVl
+I1
+sVo
+I1
+sVm
+I2
+sVI
+I3
+sVS
+I1
+sV"
+I3
+sVt
+I3
+sVw
+I1
+sVy
+I1
+sVs
+I1
+ssV (
+p146
+(dp147
+Va
+I7
+sVC
+I1
+sVI
+I2
+sVh
+I1
+sV*
+I1
+sVo
+I5
+sVi
+I2
+sVs
+I1
+sVT
+I1
+sV~
+I1
+sV_
+I1
+sVt
+I1
+ssV .
+p148
+(dp149
+V
+I2
+sVs
+I1
+sVt
+I1
+ssV /
+p150
+(dp151
+V
+I1
+sVe
+I1
+ssV -
+p152
+(dp153
+Va
+I1
+sV-
+I2
+ssV 2
+p154
+(dp155
+V8
+I1
+sV7
+I1
+sV0
+I5
+ssV 3
+p156
+(dp157
+V1
+I1
+sV0
+I1
+ssVGE
+p158
+(dp159
+VS
+I3
+sVT
+I3
+sVN
+I1
+ssV 1
+p160
+(dp161
+V9
+I3
+sV0
+I4
+ssV 6
+p162
+(dp163
+V1
+I1
+sV0
+I1
+ssVWI
+p164
+(dp165
+VS
+I1
+ssV 4
+p166
+(dp167
+V0
+I1
+ssVg
+p168
+(dp169
+V(
+I1
+sVA
+I2
+sVC
+I2
+sVE
+I4
+sVD
+I1
+sVF
+I1
+sVI
+I1
+sVH
+I1
+sVM
+I5
+sVL
+I5
+sVP
+I1
+sVS
+I2
+sVR
+I3
+sVV
+I1
+sVa
+I60
+sVc
+I12
+sVb
+I25
+sVe
+I14
+sVd
+I10
+sVg
+I4
+sVf
+I16
+sVi
+I48
+sVh
+I50
+sVm
+I57
+sVl
+I11
+sVo
+I35
+sVn
+I7
+sVq
+I1
+sVp
+I9
+sVs
+I26
+sVr
+I4
+sVu
+I6
+sVt
+I113
+sVw
+I33
+sVv
+I5
+sVy
+I8
+ssVg/
+p170
+(dp171
+VC
+I1
+ssVg.
+p172
+(dp173
+V
+I22
+ssV 8
+p174
+(dp175
+V0
+I2
+ssVGL
+p176
+(dp177
+VI
+I1
+ssV <
+p178
+(dp179
+Vh
+I1
+ssV =
+p180
+(dp181
+V
+I1
+ssVAS
+p182
+(dp183
+V
+I1
+sVC
+I2
+sV-
+I1
+ssVgg
+p184
+(dp185
+Ve
+I8
+sVl
+I1
+ssVGu
+p186
+(dp187
+Ve
+I2
+sVt
+I15
+ssVt:
+p188
+(dp189
+V
+I2
+ssVt;
+p190
+(dp191
+V
+I32
+ssVt9
+p192
+(dp193
+V0
+I1
+sV6
+I1
+ssV--
+p194
+(dp195
+V
+I2
+sV"
+I1
+sV-
+I3
+sVF
+I1
+sVI
+I14
+sVM
+I2
+sVS
+I1
+sVU
+I1
+sVT
+I2
+sVY
+I3
+sVa
+I2
+sVb
+I2
+sVe
+I1
+sVd
+I1
+sVg
+I1
+sVf
+I1
+sVi
+I2
+sVh
+I2
+sVm
+I1
+sVn
+I1
+sVp
+I1
+sVs
+I4
+sVt
+I5
+sVw
+I1
+sVv
+I1
+sVy
+I2
+ssVCl
+p196
+(dp197
+Va
+I2
+ssVge
+p198
+(dp199
+V!
+I1
+sV
+I49
+sVd
+I32
+sVf
+I1
+sV)
+I1
+sVm
+I8
+sV,
+I7
+sVo
+I1
+sVn
+I37
+sVs
+I7
+sVr
+I35
+sVt
+I44
+sV;
+I5
+sV.
+I8
+ssVt.
+p200
+(dp201
+V
+I99
+sV"
+I2
+ssVt/
+p202
+(dp203
+Va
+I1
+sVe
+I1
+ssVt,
+p204
+(dp205
+V
+I187
+sV"
+I5
+ssV-I
+p206
+(dp207
+V
+I14
+sVS
+I1
+ssVt*
+p208
+(dp209
+V
+I1
+ssVVO
+p210
+(dp211
+VU
+I1
+ssVt)
+p212
+(dp213
+V
+I2
+sV,
+I1
+ssVGo
+p214
+(dp215
+Va
+I1
+sVd
+I2
+sVo
+I2
+ssVt'
+p216
+(dp217
+Vs
+I3
+ssVt"
+p218
+(dp219
+V)
+I1
+ssVt
+p220
+(dp221
+V#
+I1
+sV(
+I3
+sV1
+I2
+sV<
+I1
+sVA
+I1
+sVC
+I10
+sVB
+I1
+sVE
+I1
+sVD
+I1
+sVG
+I15
+sVF
+I18
+sVI
+I114
+sVH
+I3
+sVM
+I18
+sVL
+I10
+sVO
+I1
+sVP
+I2
+sVS
+I10
+sVR
+I10
+sVT
+I3
+sVW
+I1
+sVY
+I1
+sV[
+I1
+sVa
+I170
+sVc
+I46
+sVb
+I98
+sVe
+I35
+sVd
+I44
+sVg
+I21
+sVf
+I69
+sVi
+I167
+sVh
+I180
+sVk
+I18
+sVj
+I3
+sVm
+I104
+sVl
+I50
+sVo
+I179
+sVn
+I42
+sVq
+I6
+sVp
+I50
+sVs
+I123
+sVr
+I35
+sVu
+I17
+sVt
+I253
+sVw
+I153
+sVv
+I10
+sVy
+I60
+ssVt!
+p222
+(dp223
+V
+I6
+sV"
+I7
+ssVEM
+p224
+(dp225
+VE
+I1
+sVN
+I1
+ssVzi
+p226
+(dp227
+Vp
+I2
+sVn
+I3
+ssV3]
+p228
+(dp229
+V
+I2
+ssVze
+p230
+(dp231
+V
+I5
+sVs
+I1
+sVm
+I1
+sVd
+I6
+sV.
+I1
+ssVM.
+p232
+(dp233
+V
+I3
+ssVza
+p234
+(dp235
+V
+I2
+sVr
+I1
+ssVgo
+p236
+(dp237
+V
+I12
+sV:
+I1
+sVe
+I1
+sVi
+I18
+sV,
+I4
+sVo
+I30
+sVn
+I12
+sVu
+I8
+sVt
+I9
+sVv
+I5
+sV.
+I3
+ssVaw
+p238
+(dp239
+Va
+I25
+sV
+I11
+sVe
+I1
+sV'
+I4
+sVi
+I4
+sVk
+I2
+sV,
+I2
+sV.
+I1
+sVs
+I2
+sVy
+I1
+sVn
+I5
+ssVEN
+p240
+(dp241
+V
+I2
+sVC
+I1
+sVB
+I7
+sVE
+I1
+sVD
+I4
+sVT
+I3
+ssVlw
+p242
+(dp243
+Va
+I27
+ssVEI
+p244
+(dp245
+VT
+I1
+ssVyw
+p246
+(dp247
+Vh
+I2
+ssVgm
+p248
+(dp249
+Ve
+I8
+sVo
+I3
+ssVF
+p250
+(dp251
+VA
+I1
+sVD
+I1
+sVM
+I1
+sVS
+I1
+sVT
+I1
+sVW
+I1
+sVY
+I3
+ssVgl
+p252
+(dp253
+Va
+I9
+sVy
+I6
+sVe
+I7
+sVi
+I2
+sVo
+I2
+ssVbh
+p254
+(dp255
+Vo
+I3
+ssVmt
+p256
+(dp257
+Vh
+I4
+ssVmf
+p258
+(dp259
+Vo
+I11
+ssV at l
+p260
+(dp261
+Vo
+I1
+ssV at p
+p262
+(dp263
+Vo
+I1
+ssVt@
+p264
+(dp265
+Vp
+I1
+ssVg,
+p266
+(dp267
+V
+I40
+ssVrd
+p268
+(dp269
+Va
+I4
+sV
+I51
+sVe
+I13
+sVi
+I13
+sV,
+I5
+sVo
+I1
+sV.
+I5
+sV)
+I1
+sVs
+I19
+sVn
+I1
+sV!
+I3
+sV;
+I4
+sV:
+I2
+sVl
+I7
+ssVe'
+p270
+(dp271
+Vs
+I8
+ssVMe
+p272
+(dp273
+Vl
+I4
+ssV-e
+p274
+(dp275
+Vn
+I1
+ssVMa
+p276
+(dp277
+Vi
+I46
+sVc
+I1
+sVr
+I15
+sVm
+I2
+ssVms
+p278
+(dp279
+V
+I18
+sV,
+I1
+sVe
+I13
+sVt
+I9
+sVp
+I1
+ssV-d
+p280
+(dp281
+Vi
+I1
+sVa
+I3
+sVo
+I1
+ssVe!
+p282
+(dp283
+V
+I16
+sV"
+I2
+ssVMo
+p284
+(dp285
+Vt
+I10
+sVn
+I2
+ssVMi
+p286
+(dp287
+Vs
+I29
+sVc
+I2
+sVd
+I1
+ssVSp
+p288
+(dp289
+Ve
+I1
+ssVMu
+p290
+(dp291
+Vc
+I2
+ssV-f
+p292
+(dp293
+Va
+I1
+sVi
+I1
+sVo
+I1
+ssVbj
+p294
+(dp295
+Vu
+I1
+sVe
+I21
+ssVMr
+p296
+(dp297
+Vs
+I31
+sV.
+I67
+ssV-a
+p298
+(dp299
+V
+I1
+sVn
+I2
+ssVEB
+p300
+(dp301
+VC
+I2
+ssVMy
+p302
+(dp303
+V
+I37
+ssVO
+p304
+(dp305
+Vw
+I1
+sVI
+I1
+sVH
+I1
+sVM
+I21
+sVL
+I16
+sVO
+I1
+sVS
+I2
+sVR
+I2
+sVT
+I3
+sVW
+I1
+sVY
+I2
+ssVME
+p306
+(dp307
+V
+I5
+sVR
+I2
+sVD
+I2
+sV,
+I1
+ssVMG
+p308
+(dp309
+VE
+I1
+ssVMA
+p310
+(dp311
+VI
+I3
+sVY
+I1
+sVL
+I2
+sVG
+I3
+sVD
+I1
+ssVtx
+p312
+(dp313
+Vt
+I3
+ssVMC
+p314
+(dp315
+VI
+I1
+ssVMB
+p316
+(dp317
+VE
+I1
+ssV31
+p318
+(dp319
+V,
+I1
+ssVty
+p320
+(dp321
+V
+I101
+sV"
+I2
+sVi
+I1
+sV)
+I1
+sV-
+I2
+sV,
+I21
+sVl
+I2
+sVp
+I1
+sV;
+I5
+sV.
+I7
+ssVMI
+p322
+(dp323
+VS
+I1
+sVT
+I3
+ssVMU
+p324
+(dp325
+V
+I1
+sVS
+I1
+sV"
+I1
+ssV3*
+p326
+(dp327
+VE
+I1
+ssV;
+p328
+(dp329
+Va
+I90
+sVo
+I3
+sVb
+I62
+sVe
+I1
+sVD
+I1
+sVf
+I12
+sVI
+I27
+sVh
+I21
+sVm
+I2
+sVL
+I1
+sVO
+I1
+sVn
+I9
+sVi
+I9
+sVs
+I8
+sV"
+I7
+sVt
+I9
+sVw
+I9
+sVy
+I11
+sVR
+I1
+sVd
+I1
+ssVMP
+p330
+(dp331
+VL
+I1
+ssV K
+p332
+(dp333
+VI
+I1
+sVi
+I1
+sVe
+I3
+sVn
+I1
+ssVf;
+p334
+(dp335
+V
+I7
+ssVp-
+p336
+(dp337
+V-
+I1
+ssVMY
+p338
+(dp339
+V
+I1
+ssV H
+p340
+(dp341
+Va
+I7
+sVA
+I3
+sVe
+I64
+sVi
+I7
+sVo
+I10
+sVI
+I7
+sVu
+I4
+sVE
+I4
+ssV"d
+p342
+(dp343
+Vo
+I1
+ssVFR
+p344
+(dp345
+VO
+I2
+ssVtu
+p346
+(dp347
+Va
+I25
+sVb
+I1
+sVd
+I5
+sVi
+I1
+sVl
+I8
+sVo
+I1
+sVn
+I20
+sVp
+I3
+sVr
+I64
+sVt
+I3
+ssVFT
+p348
+(dp349
+VP
+I2
+ssVix
+p350
+(dp351
+Vi
+I2
+sV
+I4
+sVe
+I10
+sVt
+I4
+ssV N
+p352
+(dp353
+Va
+I1
+sVE
+I2
+sVo
+I9
+sVU
+I1
+sVO
+I7
+sVe
+I2
+ssVg?
+p354
+(dp355
+V
+I1
+sV"
+I2
+ssV'
+p356
+(dp357
+Vp
+I1
+ssV O
+p358
+(dp359
+V
+I1
+sVC
+I1
+sVF
+I6
+sVh
+I1
+sVf
+I1
+sVN
+I1
+sVR
+I10
+sVu
+I4
+sVT
+I2
+sVn
+I5
+sV.
+I1
+ssVS*
+p360
+(dp361
+V*
+I1
+sVV
+I1
+ssVtp
+p362
+(dp363
+V
+I2
+ssVS-
+p364
+(dp365
+VI
+I1
+ssVS,
+p366
+(dp367
+V
+I1
+ssVS"
+p368
+(dp369
+V.
+I1
+ssVS
+p370
+(dp371
+Vc
+I1
+sVb
+I1
+sVe
+I1
+sVd
+I1
+sVF
+I2
+sVf
+I1
+sVv
+I1
+sVO
+I4
+sVS
+I1
+sVo
+I1
+sVV
+I2
+sVE
+I2
+ssV't
+p372
+(dp373
+V
+I1
+ssVFO
+p374
+(dp375
+VR
+I6
+ssVtn
+p376
+(dp377
+Vi
+I4
+sVe
+I6
+ssVFr
+p378
+(dp379
+Vi
+I4
+sVe
+I87
+sVo
+I2
+ssV"N
+p380
+(dp381
+Vo
+I4
+ssVm!
+p382
+(dp383
+V
+I2
+ssVm
+p384
+(dp385
+V(
+I3
+sVC
+I3
+sVI
+I12
+sVM
+I6
+sVL
+I4
+sVS
+I1
+sVW
+I1
+sVa
+I57
+sVc
+I6
+sVb
+I9
+sVe
+I15
+sVd
+I6
+sVg
+I14
+sVf
+I19
+sVi
+I17
+sVh
+I26
+sVk
+I2
+sVm
+I14
+sVl
+I3
+sVo
+I15
+sVn
+I14
+sVp
+I8
+sVs
+I43
+sVr
+I7
+sVu
+I3
+sVt
+I53
+sVw
+I14
+sVv
+I5
+sVy
+I10
+ssVto
+p386
+(dp387
+V
+I900
+sVg
+I12
+sVf
+I2
+sVm
+I2
+sV-
+I5
+sVl
+I18
+sVo
+I54
+sV.
+I1
+sVp
+I2
+sVr
+I31
+sVu
+I1
+sVt
+I6
+sVw
+I35
+sVn
+I18
+sV;
+I1
+sV:
+I1
+sV,
+I1
+sV?
+I1
+ssVm-
+p388
+(dp389
+V
+I1
+sV-
+I2
+ssVm,
+p390
+(dp391
+V
+I52
+ssVO.
+p392
+(dp393
+V
+I1
+ssVm.
+p394
+(dp395
+V
+I28
+sV"
+I1
+ssVm)
+p396
+(dp397
+V.
+I1
+ssVtl
+p398
+(dp399
+Vy
+I53
+sVe
+I53
+ssVFa
+p400
+(dp401
+Vc
+I1
+sVr
+I1
+ssVd!
+p402
+(dp403
+V
+I7
+sV"
+I2
+ssV-v
+p404
+(dp405
+Ve
+I1
+ssVvi
+p406
+(dp407
+Vc
+I15
+sVe
+I9
+sVd
+I7
+sVg
+I1
+sVl
+I8
+sVo
+I25
+sVn
+I71
+sVs
+I26
+sVr
+I1
+sVt
+I14
+sVv
+I2
+ssVFi
+p408
+(dp409
+Vl
+I1
+ssVu?
+p410
+(dp411
+V
+I1
+ssVm>
+p412
+(dp413
+V
+I1
+ssVFl
+p414
+(dp415
+Ve
+I1
+ssVm;
+p416
+(dp417
+V
+I6
+ssVFo
+p418
+(dp419
+Vr
+I7
+ssVoq
+p420
+(dp421
+Vu
+I6
+ssVir
+p422
+(dp423
+Va
+I9
+sV
+I81
+sVc
+I11
+sVe
+I64
+sVi
+I15
+sVm
+I8
+sVl
+I29
+sVo
+I2
+sV,
+I6
+sVs
+I31
+sVr
+I3
+sVu
+I1
+sVt
+I11
+sVy
+I2
+sV;
+I1
+sV.
+I1
+ssV T
+p424
+(dp425
+Ve
+I2
+sVi
+I1
+sVh
+I69
+sVo
+I12
+sVr
+I1
+sVu
+I2
+sVO
+I49
+sVH
+I11
+ssV9.
+p426
+(dp427
+V9
+I1
+ssViu
+p428
+(dp429
+Vc
+I1
+sVm
+I8
+sVs
+I1
+ssV U
+p430
+(dp431
+Vp
+I9
+sVS
+I1
+sVN
+I2
+sVn
+I8
+ssVSu
+p432
+(dp433
+Vs
+I79
+sVr
+I1
+sVm
+I8
+sVc
+I2
+ssVSt
+p434
+(dp435
+Va
+I6
+sVr
+I18
+ssV99
+p436
+(dp437
+V7
+I1
+sV6
+I1
+ssVSi
+p438
+(dp439
+Vs
+I1
+sVr
+I59
+sVl
+I2
+sVn
+I3
+ssVSh
+p440
+(dp441
+Ve
+I42
+ssVSo
+p442
+(dp443
+Vm
+I3
+sV,
+I1
+sVl
+I1
+ssVSm
+p444
+(dp445
+Va
+I5
+sVi
+I6
+ssVG.
+p446
+(dp447
+V;
+I1
+ssV90
+p448
+(dp449
+V
+I2
+ssV93
+p450
+(dp451
+V*
+I1
+ssVvo
+p452
+(dp453
+Vc
+I3
+sVi
+I7
+sVk
+I7
+sVl
+I3
+sVu
+I23
+sVt
+I4
+sVw
+I2
+ssV94
+p454
+(dp455
+V6
+I1
+ssV97
+p456
+(dp457
+V1
+I1
+sV
+I1
+ssV96
+p458
+(dp459
+V
+I2
+ssVme
+p460
+(dp461
+Va
+I34
+sV
+I265
+sVe
+I9
+sVd
+I39
+sVf
+I1
+sV-
+I2
+sVm
+I12
+sV,
+I52
+sVo
+I1
+sVn
+I143
+sVs
+I75
+sVr
+I26
+sV!
+I4
+sVt
+I30
+sVw
+I3
+sV;
+I11
+sV.
+I37
+sV?
+I3
+sVl
+I5
+ssV-r
+p462
+(dp463
+Vo
+I7
+ssVmg
+p464
+(dp465
+Ve
+I1
+ssV Y
+p466
+(dp467
+Ve
+I3
+sVO
+I8
+sVo
+I56
+ssVma
+p468
+(dp469
+V
+I3
+sVc
+I7
+sVz
+I1
+sVd
+I28
+sVg
+I13
+sVi
+I23
+sVk
+I53
+sV'
+I1
+sVm
+I4
+sVl
+I14
+sVn
+I115
+sVs
+I6
+sVr
+I52
+sVt
+I48
+sVy
+I75
+sV.
+I1
+sV,
+I1
+ssVmb
+p470
+(dp471
+Vi
+I1
+sVa
+I3
+sVr
+I1
+sVe
+I14
+sVl
+I7
+ssVmm
+p472
+(dp473
+Va
+I12
+sVu
+I3
+sVe
+I34
+sVi
+I4
+sVo
+I12
+ssVml
+p474
+(dp475
+Vy
+I6
+sVe
+I1
+ssVmo
+p476
+(dp477
+Vd
+I4
+sVm
+I15
+sVo
+I1
+sVn
+I45
+sVs
+I50
+sVr
+I91
+sVu
+I13
+sVt
+I69
+sVv
+I13
+ssVmn
+p478
+(dp479
+Vi
+I3
+sV
+I2
+sVs
+I1
+sVe
+I1
+ssVmi
+p480
+(dp481
+Va
+I7
+sVe
+I1
+sVd
+I5
+sVg
+I31
+sVl
+I40
+sVn
+I72
+sVs
+I49
+sVr
+I10
+sVt
+I24
+sVx
+I5
+ssVvr
+p482
+(dp483
+Ve
+I1
+ssVSU
+p484
+(dp485
+VC
+I1
+sVS
+I23
+ssVST
+p486
+(dp487
+VA
+I2
+sV
+I1
+sVR
+I2
+sVE
+I1
+ssVmu
+p488
+(dp489
+Vc
+I54
+sVs
+I100
+sVl
+I2
+sVn
+I3
+ssVRW
+p490
+(dp491
+VI
+I1
+ssVSI
+p492
+(dp493
+VR
+I2
+sVB
+I1
+sVO
+I2
+ssVSH
+p494
+(dp495
+VE
+I3
+ssVSO
+p496
+(dp497
+VN
+I18
+ssVmp
+p498
+(dp499
+Va
+I28
+sVe
+I16
+sVh
+I3
+sVl
+I31
+sVo
+I23
+sVr
+I18
+sVu
+I13
+sVt
+I17
+ssVSM
+p500
+(dp501
+VA
+I2
+ssVUT
+p502
+(dp503
+VI
+I1
+sV
+I5
+sV*
+I1
+sVE
+I7
+ssVSC
+p504
+(dp505
+VI
+I2
+sVL
+I1
+ssV"p
+p506
+(dp507
+Vu
+I1
+ssVSA
+p508
+(dp509
+VM
+I4
+sVN
+I23
+ssVmy
+p510
+(dp511
+V
+I292
+sVs
+I56
+sV;
+I1
+ssV.9
+p512
+(dp513
+V3
+I1
+ssVSE
+p514
+(dp515
+VQ
+I1
+sV
+I2
+sVN
+I2
+sV.
+I1
+ssVLe
+p516
+(dp517
+Va
+I1
+sVt
+I5
+ssV"r
+p518
+(dp519
+Ve
+I1
+ssVYO
+p520
+(dp521
+VU
+I8
+ssVLa
+p522
+(dp523
+Vk
+I1
+sVd
+I76
+sVn
+I19
+ssVLo
+p524
+(dp525
+Vn
+I22
+ssVf:
+p526
+(dp527
+V
+I1
+ssV"s
+p528
+(dp529
+Vm
+I1
+ssVGU
+p530
+(dp531
+VT
+I10
+ssVRP
+p532
+(dp533
+VO
+I1
+ssVf
+p534
+(dp535
+V2
+I1
+sV8
+I1
+sVD
+I1
+sVF
+I15
+sVI
+I14
+sVH
+I1
+sVM
+I17
+sVL
+I12
+sVP
+I1
+sVS
+I5
+sVR
+I6
+sVT
+I1
+sVV
+I1
+sVa
+I75
+sVc
+I28
+sVb
+I11
+sVe
+I14
+sVd
+I9
+sVg
+I10
+sVf
+I16
+sVi
+I49
+sVh
+I134
+sVk
+I1
+sVj
+I1
+sVm
+I70
+sVl
+I16
+sVo
+I18
+sVn
+I9
+sVq
+I3
+sVp
+I15
+sVs
+I45
+sVr
+I17
+sVu
+I5
+sVt
+I119
+sVw
+I22
+sVv
+I6
+sVy
+I55
+ssVf!
+p536
+(dp537
+V
+I1
+ssVdm
+p538
+(dp539
+Vi
+I14
+ssVUS
+p540
+(dp541
+VA
+I23
+sVI
+I1
+sVE
+I1
+sVT
+I1
+ssV 9
+p542
+(dp543
+V0
+I1
+ssVf,
+p544
+(dp545
+V
+I22
+ssVf-
+p546
+(dp547
+Vc
+I1
+sVw
+I1
+ssVf.
+p548
+(dp549
+V
+I11
+ssVs;
+p550
+(dp551
+V
+I34
+ssVs:
+p552
+(dp553
+V
+I6
+ssVLD
+p554
+(dp555
+V
+I3
+ssVLE
+p556
+(dp557
+VT
+I1
+ssV,"
+p558
+(dp559
+V
+I22
+ssVe"
+p560
+(dp561
+V
+I1
+ssV,
+p562
+(dp563
+V"
+I19
+sV&
+I19
+sV1
+I1
+sV2
+I2
+sVA
+I2
+sVC
+I4
+sVB
+I1
+sVE
+I3
+sVD
+I2
+sVF
+I4
+sVI
+I121
+sVH
+I1
+sVM
+I3
+sVL
+I2
+sVO
+I2
+sVP
+I1
+sVS
+I3
+sVR
+I3
+sVT
+I1
+sV[
+I1
+sVa
+I430
+sVc
+I26
+sVb
+I111
+sVe
+I16
+sVd
+I15
+sVg
+I4
+sVf
+I56
+sVi
+I96
+sVh
+I73
+sVk
+I3
+sVj
+I2
+sVm
+I59
+sVl
+I12
+sVo
+I53
+sVn
+I18
+sVq
+I1
+sVp
+I11
+sVs
+I46
+sVr
+I3
+sVu
+I2
+sVt
+I180
+sVw
+I142
+sVv
+I3
+sVy
+I28
+ssVLA
+p564
+(dp565
+VI
+I1
+sVR
+I1
+sVD
+I35
+ssVLL
+p566
+(dp567
+V
+I2
+ssV,-
+p568
+(dp569
+V-
+I19
+ssVYe
+p570
+(dp571
+Vt
+I3
+ssVLI
+p572
+(dp573
+VA
+I1
+sV
+I1
+sVC
+I7
+sVE
+I1
+sVG
+I1
+sVM
+I3
+sVS
+I1
+sVT
+I3
+ssVs*
+p574
+(dp575
+V
+I1
+sV*
+I1
+ssVs)
+p576
+(dp577
+V
+I1
+sV;
+I1
+ssVLU
+p578
+(dp579
+VS
+I1
+sVD
+I2
+ssVs.
+p580
+(dp581
+V
+I119
+sV"
+I3
+ssV,0
+p582
+(dp583
+V0
+I3
+ssVs,
+p584
+(dp585
+V
+I191
+sV"
+I1
+ssVs"
+p586
+(dp587
+V.
+I1
+ssVs!
+p588
+(dp589
+V!
+I1
+sV
+I10
+ssVs
+p590
+(dp591
+V"
+I5
+sV(
+I1
+sV*
+I1
+sVC
+I2
+sVD
+I1
+sVF
+I5
+sVI
+I40
+sVM
+I21
+sVL
+I8
+sVP
+I3
+sVS
+I12
+sVR
+I4
+sVV
+I7
+sV[
+I1
+sVa
+I235
+sVc
+I71
+sVb
+I62
+sVe
+I62
+sVd
+I53
+sVg
+I31
+sVf
+I62
+sVi
+I126
+sVh
+I96
+sVk
+I3
+sVj
+I15
+sVm
+I111
+sVl
+I32
+sVo
+I127
+sVn
+I85
+sVq
+I6
+sVp
+I53
+sVs
+I129
+sVr
+I36
+sVu
+I17
+sVt
+I181
+sVw
+I87
+sVv
+I24
+sVy
+I28
+ssVs'
+p592
+(dp593
+V
+I1
+sVs
+I6
+ssVr!
+p594
+(dp595
+V
+I6
+ssVfr
+p596
+(dp597
+Vi
+I36
+sVa
+I11
+sVe
+I11
+sVo
+I110
+ssVo?
+p598
+(dp599
+V
+I1
+sV"
+I1
+ssVft
+p600
+(dp601
+Vy
+I1
+sVp
+I2
+sVe
+I36
+sVw
+I2
+sV
+I12
+ssVfu
+p602
+(dp603
+Vs
+I12
+sVr
+I8
+sVt
+I4
+sVl
+I58
+sVn
+I4
+ssVL
+p604
+(dp605
+VP
+I2
+sVD
+I1
+sVo
+I1
+sV6
+I1
+ssVu!
+p606
+(dp607
+V)
+I1
+sV
+I3
+ssVfy
+p608
+(dp609
+Vi
+I4
+sV
+I9
+sV,
+I1
+ssVL,
+p610
+(dp611
+V
+I1
+ssVI;
+p612
+(dp613
+V
+I1
+ssV?0
+p614
+(dp615
+V0
+I1
+ssVfa
+p616
+(dp617
+Vc
+I16
+sVi
+I19
+sVm
+I24
+sVl
+I4
+sVn
+I7
+sVs
+I10
+sVr
+I18
+sVu
+I6
+sVt
+I20
+sVv
+I14
+ssVSS
+p618
+(dp619
+VI
+I1
+sV
+I3
+ssVr?
+p620
+(dp621
+V
+I3
+sV"
+I4
+ssVfe
+p622
+(dp623
+Va
+I20
+sV
+I14
+sVc
+I72
+sVe
+I47
+sV'
+I3
+sVm
+I1
+sV,
+I10
+sV.
+I5
+sVs
+I9
+sVr
+I41
+sV!
+I1
+sVt
+I4
+sVw
+I15
+sV?
+I1
+sVl
+I10
+ssVff
+p624
+(dp625
+Va
+I10
+sV
+I9
+sVe
+I73
+sVi
+I14
+sV,
+I1
+sVo
+I9
+ssVUD
+p626
+(dp627
+VI
+I2
+ssVfi
+p628
+(dp629
+Va
+I1
+sVc
+I25
+sVe
+I22
+sVd
+I4
+sVg
+I1
+sVf
+I2
+sVl
+I10
+sVn
+I30
+sVs
+I2
+sVr
+I31
+sVt
+I10
+sVv
+I2
+sVx
+I10
+ssVfl
+p630
+(dp631
+Vi
+I10
+sVe
+I3
+sVu
+I11
+sVa
+I6
+sVo
+I1
+ssVH
+p632
+(dp633
+VD
+I1
+sVO
+I1
+ssVfo
+p634
+(dp635
+Vr
+I454
+sVu
+I20
+sVl
+I13
+sVo
+I3
+sVn
+I3
+ssVCY
+p636
+(dp637
+V
+I23
+sV.
+I5
+ssVg'
+p638
+(dp639
+Vs
+I7
+ssVsy
+p640
+(dp641
+V
+I13
+sVm
+I2
+sVl
+I3
+sV,
+I3
+sV;
+I1
+sV.
+I3
+ssVEv
+p642
+(dp643
+Ve
+I4
+ssVYo
+p644
+(dp645
+Vu
+I61
+ssVY.
+p646
+(dp647
+V
+I5
+ssVss
+p648
+(dp649
+Va
+I14
+sV
+I133
+sV:
+I1
+sVe
+I40
+sVi
+I87
+sVm
+I3
+sV,
+I17
+sVo
+I5
+sV.
+I10
+sV!
+I3
+sVu
+I19
+sVw
+I1
+sV;
+I8
+sVn
+I1
+sVl
+I2
+ssVY
+p650
+(dp651
+VB
+I1
+sVE
+I1
+sVD
+I12
+sVK
+I1
+sVM
+I1
+sVO
+I3
+sVS
+I24
+sVT
+I7
+ssVsp
+p652
+(dp653
+Va
+I5
+sVe
+I67
+sVi
+I31
+sVl
+I8
+sVo
+I34
+sVr
+I1
+sVu
+I2
+ssVsw
+p654
+(dp655
+Va
+I1
+sVe
+I11
+sVo
+I1
+ssVsu
+p656
+(dp657
+Va
+I18
+sVc
+I70
+sVb
+I30
+sVe
+I2
+sVd
+I5
+sVg
+I2
+sVf
+I11
+sVi
+I6
+sVm
+I1
+sVl
+I3
+sVn
+I3
+sVp
+I31
+sVs
+I13
+sVr
+I89
+ssVst
+p658
+(dp659
+Va
+I98
+sV
+I307
+sV:
+I1
+sVe
+I75
+sV!
+I1
+sVi
+I61
+sV-
+I2
+sVm
+I2
+sV,
+I24
+sVo
+I42
+sV.
+I5
+sVs
+I2
+sVr
+I52
+sVu
+I7
+sVy
+I5
+sV;
+I5
+sVn
+I2
+sVl
+I6
+ssVsk
+p660
+(dp661
+V
+I8
+sVe
+I2
+sV)
+I1
+sV,
+I2
+sV.
+I1
+sVi
+I3
+ssVsi
+p662
+(dp663
+Vc
+I5
+sVb
+I39
+sVd
+I31
+sVg
+I19
+sVm
+I3
+sVl
+I19
+sVo
+I56
+sVn
+I82
+sVp
+I3
+sVs
+I40
+sVr
+I17
+sVt
+I64
+sVv
+I10
+sVx
+I5
+sVz
+I2
+ssVsh
+p664
+(dp665
+Va
+I65
+sV
+I45
+sVe
+I214
+sVi
+I34
+sVm
+I10
+sV,
+I3
+sVo
+I83
+sVn
+I1
+sVr
+I3
+sVu
+I2
+sVy
+I4
+sVl
+I1
+ssVso
+p666
+(dp667
+V
+I139
+sVc
+I9
+sVb
+I1
+sVf
+I7
+sVm
+I81
+sVl
+I44
+sVo
+I38
+sVn
+I73
+sVr
+I23
+sVu
+I4
+sV.
+I5
+sV,
+I4
+ssVsn
+p668
+(dp669
+V1
+I4
+sVe
+I7
+ssVsm
+p670
+(dp671
+Va
+I7
+sVi
+I7
+sVe
+I3
+sVo
+I1
+ssVsl
+p672
+(dp673
+Vi
+I13
+sVy
+I9
+sVe
+I2
+sVa
+I3
+ssVsc
+p674
+(dp675
+Va
+I18
+sVe
+I3
+sVi
+I9
+sVh
+I12
+sVl
+I5
+sVo
+I17
+sVr
+I13
+sVu
+I1
+ssVsb
+p676
+(dp677
+Va
+I17
+sVe
+I1
+ssVsa
+p678
+(dp679
+Vc
+I5
+sVb
+I7
+sVd
+I8
+sVg
+I5
+sVf
+I3
+sVi
+I25
+sVk
+I3
+sVm
+I12
+sVl
+I5
+sVn
+I82
+sVp
+I6
+sVr
+I12
+sVu
+I1
+sVt
+I34
+sVw
+I10
+sVv
+I4
+sVy
+I28
+ssVUB
+p680
+(dp681
+VL
+I2
+ssVsg
+p682
+(dp683
+Va
+I1
+sVu
+I1
+ssVsf
+p684
+(dp685
+Vy
+I2
+sVi
+I10
+sVe
+I1
+sVa
+I6
+ssVse
+p686
+(dp687
+V!
+I2
+sV
+I179
+sV)
+I1
+sV,
+I32
+sV.
+I15
+sV;
+I3
+sV:
+I2
+sV?
+I2
+sVa
+I3
+sVc
+I12
+sVe
+I85
+sVd
+I68
+sVf
+I1
+sVm
+I6
+sVl
+I126
+sVn
+I99
+sVq
+I8
+sVp
+I10
+sVs
+I23
+sVr
+I54
+sVt
+I12
+sVw
+I1
+sVv
+I14
+sVx
+I2
+ssVsd
+p688
+(dp689
+Va
+I8
+ssVy)
+p690
+(dp691
+V
+I2
+sV.
+I1
+ssVh:
+p692
+(dp693
+V
+I1
+ssVy-
+p694
+(dp695
+V-
+I2
+sVm
+I1
+sVt
+I2
+ssVy,
+p696
+(dp697
+V
+I106
+sV"
+I2
+ssVy.
+p698
+(dp699
+V
+I56
+sV"
+I2
+ssVy!
+p700
+(dp701
+V
+I3
+sV"
+I1
+ssVy
+p702
+(dp703
+V(
+I4
+sV1
+I1
+sVC
+I2
+sVB
+I1
+sVD
+I2
+sVF
+I1
+sVI
+I9
+sVH
+I3
+sVJ
+I5
+sVM
+I3
+sVL
+I1
+sVO
+I1
+sVP
+I1
+sVS
+I72
+sVR
+I2
+sVT
+I1
+sVV
+I1
+sVa
+I136
+sVc
+I51
+sVb
+I72
+sVe
+I40
+sVd
+I128
+sVg
+I26
+sVf
+I64
+sVi
+I69
+sVh
+I79
+sVk
+I7
+sVj
+I5
+sVm
+I49
+sVl
+I35
+sVo
+I106
+sVn
+I21
+sVp
+I53
+sVs
+I94
+sVr
+I46
+sVu
+I22
+sVt
+I158
+sVw
+I76
+sVv
+I10
+sVy
+I17
+ssV 5
+p704
+(dp705
+V%
+I1
+ssVGI
+p706
+(dp707
+VN
+I3
+sVV
+I1
+ssV%
+p708
+(dp709
+Vo
+I4
+ssVy'
+p710
+(dp711
+Vs
+I2
+ssVRe
+p712
+(dp713
+Va
+I1
+sVp
+I1
+sVg
+I78
+sVf
+I1
+ssVy;
+p714
+(dp715
+V
+I29
+ssV!"
+p716
+(dp717
+V
+I14
+ssVV.
+p718
+(dp719
+V
+I4
+ssVy?
+p720
+(dp721
+V
+I1
+ssVRo
+p722
+(dp723
+Vy
+I1
+ssVSa
+p724
+(dp725
+Vy
+I1
+ssVRi
+p726
+(dp727
+Vg
+I1
+ssVRT
+p728
+(dp729
+VI
+I1
+sV*
+I2
+ssV25
+p730
+(dp731
+V
+I1
+ssVld
+p732
+(dp733
+V
+I277
+sVe
+I5
+sV'
+I7
+sVi
+I3
+sV-
+I1
+sV,
+I30
+sVo
+I3
+sV.
+I11
+sVr
+I8
+sVn
+I1
+sV;
+I2
+sV:
+I1
+sV?
+I1
+ssVle
+p734
+(dp735
+V!
+I4
+sV
+I203
+sV"
+I1
+sV'
+I2
+sV,
+I36
+sV.
+I14
+sV;
+I4
+sV:
+I1
+sVa
+I92
+sVc
+I19
+sVb
+I1
+sVe
+I1
+sVd
+I31
+sVg
+I8
+sVf
+I12
+sVi
+I3
+sVm
+I7
+sVn
+I49
+sVs
+I59
+sVr
+I6
+sVt
+I54
+sVv
+I7
+sVx
+I4
+ssV20
+p736
+(dp737
+V0
+I4
+sV%
+I1
+ssVlc
+p738
+(dp739
+Vu
+I3
+sVo
+I3
+ssVRR
+p740
+(dp741
+VA
+I4
+ssVla
+p742
+(dp743
+V
+I1
+sVc
+I24
+sVb
+I3
+sVd
+I27
+sVg
+I4
+sVi
+I23
+sVm
+I15
+sVn
+I36
+sVp
+I1
+sVs
+I25
+sVr
+I46
+sVu
+I9
+sVt
+I36
+sVw
+I12
+sVv
+I2
+sVy
+I11
+sVx
+I1
+ssVln
+p744
+(dp745
+Ve
+I3
+ssVlo
+p746
+(dp747
+Vd
+I3
+sVg
+I5
+sVi
+I1
+sVm
+I1
+sVo
+I34
+sVn
+I56
+sVq
+I1
+sVp
+I2
+sVs
+I13
+sVr
+I1
+sVu
+I24
+sVt
+I2
+sVw
+I39
+sVv
+I30
+sVy
+I2
+ssVll
+p748
+(dp749
+Va
+I9
+sV
+I379
+sV:
+I1
+sVe
+I23
+sVi
+I28
+sV-
+I11
+sV,
+I23
+sVo
+I32
+sVn
+I1
+sV)
+I1
+sVs
+I3
+sV!
+I1
+sVu
+I3
+sVy
+I84
+sV;
+I6
+sV.
+I34
+sV?
+I1
+ssVlm
+p750
+(dp751
+V
+I2
+sVe
+I1
+sVl
+I2
+sVo
+I7
+sVn
+I1
+ssV28
+p752
+(dp753
+V,
+I1
+ssV29
+p754
+(dp755
+V.
+I1
+ssVli
+p756
+(dp757
+Va
+I20
+sVc
+I35
+sVb
+I12
+sVe
+I49
+sVd
+I1
+sVg
+I37
+sVf
+I15
+sVh
+I1
+sVk
+I30
+sVm
+I4
+sVo
+I8
+sVn
+I57
+sVp
+I3
+sVs
+I21
+sVr
+I8
+sVt
+I58
+sVv
+I11
+ssVlv
+p758
+(dp759
+Ve
+I18
+ssVRE
+p760
+(dp761
+V!
+I1
+sVA
+I2
+sVC
+I1
+sVG
+I3
+sV
+I3
+sVM
+I1
+sVS
+I2
+ssVlt
+p762
+(dp763
+Va
+I1
+sV
+I9
+sVe
+I15
+sVi
+I4
+sVh
+I5
+sV,
+I1
+sVo
+I4
+sV.
+I3
+sVs
+I3
+sVy
+I6
+ssVlu
+p764
+(dp765
+Vc
+I7
+sVe
+I14
+sVd
+I17
+sVn
+I1
+sVs
+I7
+sVr
+I1
+sVt
+I19
+ssVlr
+p766
+(dp767
+Ve
+I8
+ssVls
+p768
+(dp769
+V
+I9
+sVu
+I4
+sVe
+I6
+sVo
+I9
+sVt
+I1
+ssVlp
+p770
+(dp771
+Vi
+I1
+sV
+I10
+sV-
+I1
+ssVRC
+p772
+(dp773
+VY
+I28
+sVH
+I1
+ssV-"
+p774
+(dp775
+V
+I1
+ssVRN
+p776
+(dp777
+VO
+I49
+ssVRO
+p778
+(dp779
+VJ
+I7
+sVM
+I2
+sVT
+I1
+sVV
+I1
+ssVRI
+p780
+(dp781
+VC
+I1
+sVB
+I1
+sVN
+I9
+ssVly
+p782
+(dp783
+V
+I398
+sVi
+I4
+sV-
+I1
+sV,
+I29
+sV.
+I17
+sV;
+I9
+sVz
+I1
+ssVyi
+p784
+(dp785
+Vs
+I1
+sVe
+I2
+sVn
+I38
+ssVym
+p786
+(dp787
+Ve
+I3
+sVm
+I1
+sVo
+I9
+sVp
+I1
+ssVyl
+p788
+(dp789
+Ve
+I2
+sVl
+I3
+ssVyo
+p790
+(dp791
+Vu
+I473
+sVn
+I18
+ssVt?
+p792
+(dp793
+V
+I3
+sV"
+I1
+ssVya
+p794
+(dp795
+Vb
+I1
+sVl
+I4
+ssV2]
+p796
+(dp797
+V
+I4
+ssVyb
+p798
+(dp799
+Vo
+I2
+ssVye
+p800
+(dp801
+Va
+I13
+sVd
+I7
+sVl
+I1
+sV,
+I1
+sVs
+I13
+sVr
+I1
+sVt
+I21
+ssV.0
+p802
+(dp803
+V4
+I1
+ssVyz
+p804
+(dp805
+Ve
+I1
+ssVR
+p806
+(dp807
+VA
+I2
+sVC
+I1
+sVB
+I2
+sVD
+I1
+sVF
+I2
+sVI
+I2
+sVi
+I1
+sVs
+I1
+sVO
+I1
+sVN
+I1
+sVP
+I3
+sVS
+I1
+sVR
+I3
+sVt
+I2
+sVv
+I1
+sV"
+I1
+ssVR,
+p808
+(dp809
+V
+I2
+sV-
+I1
+ssVyp
+p810
+(dp811
+Ve
+I3
+ssVys
+p812
+(dp813
+V
+I37
+sVe
+I55
+sVi
+I2
+sVh
+I12
+sV-
+I1
+sV,
+I2
+sV.
+I4
+sVt
+I1
+ssVyr
+p814
+(dp815
+Vi
+I8
+ssVyt
+p816
+(dp817
+Vh
+I27
+sVe
+I1
+ssVm"
+p818
+(dp819
+V
+I1
+ssVCr
+p820
+(dp821
+Ve
+I1
+sVu
+I1
+ssVl'
+p822
+(dp823
+Vs
+I1
+ssVl
+p824
+(dp825
+V(
+I1
+sVE
+I1
+sVF
+I1
+sVI
+I6
+sVM
+I1
+sVN
+I1
+sVP
+I6
+sVS
+I2
+sVT
+I1
+sVW
+I1
+sVa
+I48
+sVc
+I14
+sVb
+I43
+sVe
+I10
+sVd
+I14
+sVg
+I8
+sVf
+I26
+sVi
+I26
+sVh
+I24
+sVk
+I7
+sVj
+I1
+sVm
+I23
+sVl
+I11
+sVo
+I29
+sVn
+I31
+sVq
+I2
+sVp
+I13
+sVs
+I32
+sVr
+I13
+sVu
+I4
+sVt
+I74
+sVw
+I13
+sVv
+I3
+sVy
+I16
+ssVl!
+p826
+(dp827
+V
+I4
+ssVl.
+p828
+(dp829
+V
+I48
+ssVl,
+p830
+(dp831
+V
+I48
+ssVl-
+p832
+(dp833
+Vb
+I1
+sVd
+I1
+sVf
+I2
+sV-
+I1
+sVo
+I2
+sVn
+I2
+sVu
+I1
+sVt
+I1
+ssVl)
+p834
+(dp835
+V
+I1
+sV.
+I1
+ssVAs
+p836
+(dp837
+V
+I7
+sVs
+I3
+sVk
+I1
+ssV-M
+p838
+(dp839
+Vr
+I2
+sVe
+I3
+ssVl?
+p840
+(dp841
+V"
+I1
+ssVl:
+p842
+(dp843
+V
+I2
+ssVl;
+p844
+(dp845
+V
+I8
+ssVem
+p846
+(dp847
+Va
+I28
+sV
+I27
+sVb
+I17
+sVe
+I60
+sVi
+I4
+sV-
+I1
+sV,
+I3
+sVo
+I21
+sVn
+I6
+sVp
+I26
+sVs
+I12
+sVu
+I1
+sVy
+I1
+sV;
+I1
+sV.
+I4
+ssVel
+p848
+(dp849
+Va
+I11
+sV
+I23
+sVc
+I3
+sVe
+I16
+sVd
+I7
+sVf
+I116
+sVi
+I95
+sVl
+I78
+sVo
+I8
+sV.
+I1
+sVp
+I12
+sVs
+I5
+sVt
+I9
+sVv
+I7
+sVy
+I111
+ssVeo
+p850
+(dp851
+Vp
+I2
+sVv
+I2
+sVu
+I3
+sVn
+I1
+ssVen
+p852
+(dp853
+V!
+I1
+sV
+I287
+sV*
+I2
+sV-
+I1
+sV,
+I23
+sV.
+I6
+sV;
+I3
+sV:
+I1
+sV?
+I1
+sVa
+I11
+sVc
+I94
+sVb
+I15
+sVe
+I47
+sVd
+I140
+sVg
+I26
+sVi
+I21
+sVj
+I5
+sVl
+I1
+sVo
+I20
+sVn
+I2
+sVq
+I2
+sVs
+I57
+sVr
+I3
+sVu
+I1
+sVt
+I388
+sVv
+I1
+sVy
+I1
+sVz
+I2
+ssVei
+p854
+(dp855
+Vg
+I5
+sVn
+I51
+sVp
+I1
+sVs
+I3
+sVr
+I18
+sVt
+I17
+sVv
+I38
+ssVh,
+p856
+(dp857
+V
+I30
+ssV8,
+p858
+(dp859
+V
+I1
+ssVej
+p860
+(dp861
+Ve
+I2
+sVu
+I5
+sVo
+I5
+ssVee
+p862
+(dp863
+Va
+I11
+sV
+I62
+sVc
+I2
+sVd
+I37
+sVi
+I15
+sVk
+I14
+sVm
+I29
+sV,
+I1
+sVn
+I106
+sVp
+I21
+sVs
+I4
+sVr
+I5
+sVt
+I35
+sVl
+I43
+ssVed
+p864
+(dp865
+V!
+I5
+sV
+I663
+sVe
+I91
+sVd
+I1
+sVg
+I6
+sVi
+I43
+sV-
+I2
+sV,
+I94
+sVo
+I1
+sVn
+I4
+sV.
+I34
+sVs
+I1
+sVu
+I13
+sVy
+I2
+sV;
+I14
+sV:
+I2
+sV]
+I1
+sV?
+I1
+sVl
+I4
+ssVeg
+p866
+(dp867
+Va
+I20
+sV
+I1
+sVe
+I1
+sVg
+I3
+sVi
+I84
+sVl
+I5
+sVr
+I20
+sVu
+I5
+ssVef
+p868
+(dp869
+Va
+I2
+sV
+I4
+sVe
+I13
+sVf
+I12
+sVi
+I6
+sV,
+I1
+sVo
+I59
+sVl
+I3
+sVr
+I1
+sVu
+I19
+sVt
+I12
+sVy
+I2
+ssVea
+p870
+(dp871
+V
+I12
+sVc
+I24
+sVb
+I11
+sVd
+I49
+sVg
+I9
+sVk
+I31
+sVl
+I55
+sVn
+I30
+sVs
+I119
+sVr
+I216
+sVu
+I5
+sVt
+I81
+sVv
+I48
+sV;
+I1
+sVz
+I2
+sV,
+I1
+ssVec
+p872
+(dp873
+Va
+I8
+sVe
+I70
+sVi
+I17
+sVh
+I2
+sVk
+I2
+sVl
+I14
+sVo
+I17
+sV.
+I1
+sVr
+I1
+sVu
+I13
+sVt
+I216
+ssVeb
+p874
+(dp875
+Vy
+I1
+sVa
+I1
+sVr
+I1
+sVe
+I1
+sVt
+I3
+ssVEx
+p876
+(dp877
+Vc
+I1
+sVe
+I1
+ssVex
+p878
+(dp879
+Va
+I14
+sVc
+I35
+sVe
+I9
+sVi
+I9
+sV,
+I2
+sVq
+I1
+sVp
+I55
+sVu
+I1
+sVt
+I69
+ssV82
+p880
+(dp881
+V
+I1
+sV5
+I1
+ssVet
+p882
+(dp883
+Va
+I7
+sV
+I86
+sVc
+I14
+sVe
+I69
+sVi
+I16
+sVh
+I38
+sV,
+I14
+sVo
+I5
+sV.
+I16
+sVs
+I3
+sVr
+I8
+sVu
+I27
+sVt
+I72
+sVw
+I14
+sVy
+I20
+sV;
+I2
+sVn
+I1
+sVl
+I2
+ssVew
+p884
+(dp885
+Va
+I3
+sV
+I28
+sVe
+I1
+sVi
+I2
+sVh
+I4
+sV.
+I1
+sVs
+I8
+sV;
+I1
+ssVev
+p886
+(dp887
+Vi
+I18
+sVa
+I3
+sVe
+I293
+sVo
+I7
+ssVeq
+p888
+(dp889
+Vu
+I47
+ssVep
+p890
+(dp891
+Va
+I22
+sV
+I10
+sVe
+I16
+sVi
+I5
+sVl
+I16
+sVo
+I6
+sVs
+I1
+sVr
+I17
+sVu
+I2
+sVt
+I21
+ssVes
+p892
+(dp893
+V!
+I2
+sV
+I212
+sV'
+I5
+sV)
+I1
+sV-
+I1
+sV,
+I45
+sV.
+I16
+sV;
+I7
+sV:
+I2
+sV?
+I2
+sV]
+I2
+sVa
+I1
+sVc
+I12
+sVe
+I63
+sVd
+I4
+sVi
+I32
+sVh
+I1
+sVo
+I23
+sVp
+I29
+sVs
+I204
+sVu
+I2
+sVt
+I127
+ssVer
+p894
+(dp895
+V!
+I5
+sV
+I839
+sV'
+I31
+sV-
+I9
+sV,
+I166
+sV.
+I84
+sV;
+I30
+sV:
+I3
+sV?
+I7
+sVa
+I51
+sVc
+I17
+sVe
+I240
+sVd
+I4
+sVg
+I17
+sVf
+I28
+sVi
+I142
+sVh
+I15
+sVj
+I1
+sVm
+I23
+sVl
+I9
+sVo
+I9
+sVn
+I91
+sVp
+I4
+sVs
+I184
+sVr
+I11
+sVt
+I46
+sVw
+I10
+sVv
+I33
+sVy
+I142
+ssVrt
+p896
+(dp897
+Va
+I38
+sV@
+I1
+sVe
+I19
+sV
+I62
+sVi
+I62
+sVh
+I20
+sVf
+I4
+sVm
+I4
+sV,
+I13
+sVo
+I3
+sVn
+I4
+sVs
+I8
+sVu
+I24
+sVy
+I18
+sV;
+I2
+sV.
+I2
+sVl
+I4
+ssVru
+p898
+(dp899
+Vc
+I4
+sVb
+I3
+sVe
+I15
+sVd
+I6
+sVg
+I1
+sVi
+I1
+sVm
+I1
+sVl
+I4
+sVn
+I7
+sVp
+I5
+sVs
+I9
+sVt
+I7
+ssVrv
+p900
+(dp901
+Va
+I6
+sVi
+I6
+sVe
+I22
+ssVE.
+p902
+(dp903
+V
+I1
+ssVrp
+p904
+(dp905
+Vr
+I11
+sVe
+I1
+sVl
+I1
+sVo
+I4
+ssVs]
+p906
+(dp907
+V
+I2
+ssVrr
+p908
+(dp909
+Va
+I7
+sVe
+I18
+sVi
+I48
+sVo
+I8
+sVu
+I4
+sVy
+I35
+ssVrs
+p910
+(dp911
+Va
+I13
+sV
+I92
+sVe
+I81
+sVd
+I4
+sV'
+I1
+sVi
+I11
+sVh
+I1
+sV,
+I39
+sVo
+I18
+sV.
+I42
+sV)
+I1
+sVu
+I17
+sVt
+I44
+sV;
+I4
+sV?
+I1
+ssVE!
+p912
+(dp913
+V*
+I1
+ssVry
+p914
+(dp915
+V
+I191
+sVb
+I1
+sVi
+I20
+sV,
+I13
+sVo
+I1
+sV.
+I7
+sVt
+I15
+sVw
+I1
+sV;
+I2
+sV?
+I1
+ssVe]
+p916
+(dp917
+V
+I1
+ssVre
+p918
+(dp919
+V!
+I3
+sV
+I363
+sV)
+I1
+sV,
+I66
+sV.
+I23
+sV;
+I13
+sV?
+I2
+sVa
+I183
+sVc
+I68
+sVb
+I2
+sVe
+I64
+sVd
+I194
+sVg
+I19
+sVf
+I49
+sVi
+I1
+sVh
+I7
+sVj
+I10
+sVm
+I50
+sVl
+I54
+sVo
+I2
+sVn
+I43
+sVq
+I21
+sVp
+I44
+sVs
+I183
+sVr
+I2
+sVt
+I63
+sVw
+I4
+sVv
+I35
+sVy
+I1
+ssVey
+p920
+(dp921
+V
+I39
+sVe
+I10
+sVm
+I8
+sV,
+I3
+sVo
+I10
+sV.
+I2
+sV;
+I1
+ssVrg
+p922
+(dp923
+V
+I13
+sVe
+I21
+sVi
+I9
+sV,
+I1
+sV/
+I1
+sVu
+I1
+sVo
+I4
+sVy
+I1
+ssVra
+p924
+(dp925
+Vc
+I29
+sVb
+I34
+sVd
+I7
+sVg
+I13
+sVi
+I18
+sVm
+I4
+sVl
+I23
+sVo
+I4
+sVn
+I36
+sVp
+I2
+sVs
+I5
+sVr
+I5
+sVu
+I1
+sVt
+I64
+sVw
+I8
+sVv
+I3
+sVy
+I4
+ssVrb
+p926
+(dp927
+Vi
+I5
+sVa
+I3
+sVe
+I2
+sVo
+I1
+ssVrc
+p928
+(dp929
+Ve
+I25
+sVi
+I4
+sVh
+I52
+sVo
+I7
+sVu
+I10
+sVy
+I27
+ssVrl
+p930
+(dp931
+V!
+I2
+sV
+I12
+sVe
+I9
+sVd
+I21
+sV'
+I1
+sVi
+I2
+sV,
+I8
+sVo
+I5
+sV.
+I3
+sVs
+I1
+sVa
+I1
+sVy
+I21
+sV;
+I1
+ssVrm
+p932
+(dp933
+Va
+I12
+sV
+I17
+sVe
+I13
+sVi
+I28
+sV,
+I8
+sVl
+I5
+sV)
+I1
+sVs
+I6
+sVt
+I4
+sV.
+I1
+ssVrn
+p934
+(dp935
+Va
+I8
+sV
+I20
+sVe
+I35
+sVi
+I16
+sV,
+I1
+sVo
+I65
+sV.
+I3
+sVs
+I1
+sVt
+I3
+ssVro
+p936
+(dp937
+V-
+I1
+sVa
+I5
+sVc
+I6
+sVb
+I13
+sVd
+I8
+sVg
+I5
+sVf
+I8
+sVi
+I1
+sVh
+I1
+sVk
+I1
+sVj
+I28
+sVm
+I124
+sVl
+I5
+sVo
+I27
+sVn
+I18
+sVp
+I21
+sVs
+I9
+sVr
+I4
+sVu
+I38
+sVt
+I35
+sVw
+I12
+sVv
+I20
+sVy
+I5
+ssVrh
+p938
+(dp939
+Va
+I15
+sVo
+I1
+ssVri
+p940
+(dp941
+Va
+I25
+sVc
+I94
+sVb
+I19
+sVe
+I56
+sVd
+I10
+sVg
+I28
+sVf
+I5
+sVk
+I2
+sVm
+I4
+sVl
+I6
+sVo
+I28
+sVn
+I98
+sVp
+I4
+sVs
+I12
+sVu
+I3
+sVt
+I52
+sVv
+I34
+sVz
+I9
+ssVrj
+p942
+(dp943
+Vo
+I1
+ssVrk
+p944
+(dp945
+Va
+I1
+sV
+I7
+sVe
+I6
+sV-
+I1
+sVl
+I5
+sV,
+I2
+sVs
+I2
+sV.
+I2
+ssVe-
+p946
+(dp947
+V-
+I7
+sV
+I1
+sVb
+I1
+sVM
+I3
+ssVe,
+p948
+(dp949
+V
+I318
+sV"
+I6
+sV-
+I3
+ssVe.
+p950
+(dp951
+V
+I157
+sVc
+I1
+sV"
+I4
+ssVe)
+p952
+(dp953
+V
+I3
+sV;
+I1
+ssVED
+p954
+(dp955
+VI
+I3
+sV
+I5
+sV,
+I1
+ssVEG
+p956
+(dp957
+VI
+I3
+sVL
+I1
+ssVEF
+p958
+(dp959
+VO
+I1
+ssVEA
+p960
+(dp961
+VC
+I1
+sVR
+I1
+sVD
+I1
+sVV
+I1
+ssVe
+p962
+(dp963
+V"
+I2
+sV$
+I1
+sV(
+I3
+sV1
+I1
+sV6
+I1
+sVA
+I8
+sVC
+I25
+sVB
+I1
+sVE
+I2
+sVD
+I2
+sVG
+I1
+sVF
+I4
+sVI
+I36
+sVH
+I3
+sVM
+I10
+sVL
+I3
+sVP
+I16
+sVS
+I5
+sVR
+I4
+sVU
+I1
+sVT
+I3
+sVW
+I1
+sVV
+I4
+sV[
+I1
+sVa
+I268
+sVc
+I141
+sVb
+I100
+sVe
+I83
+sVd
+I102
+sVg
+I56
+sVf
+I115
+sVi
+I245
+sVh
+I238
+sVk
+I17
+sVj
+I8
+sVm
+I209
+sVl
+I70
+sVo
+I254
+sVn
+I89
+sVq
+I7
+sVp
+I109
+sVs
+I234
+sVr
+I68
+sVu
+I29
+sVt
+I380
+sVw
+I233
+sVv
+I28
+sVy
+I59
+ssVEC
+p964
+(dp965
+VT
+I8
+ssV")
+p966
+(dp967
+V.
+I1
+ssVAn
+p968
+(dp969
+Vd
+I6
+ssVe?
+p970
+(dp971
+V
+I13
+sV"
+I1
+ssVEY
+p972
+(dp973
+V
+I1
+ssVEX
+p974
+(dp975
+VP
+I1
+sVT
+I6
+sV?
+I1
+ssVe;
+p976
+(dp977
+V
+I55
+ssVe:
+p978
+(dp979
+V
+I5
+ssVET
+p980
+(dp981
+V
+I3
+sVE
+I6
+sVT
+I1
+ssVEW
+p982
+(dp983
+V
+I1
+ssVEV
+p984
+(dp985
+VE
+I2
+ssVEQ
+p986
+(dp987
+VU
+I1
+ssVES
+p988
+(dp989
+V
+I4
+sVS
+I2
+sVE
+I1
+sV,
+I1
+sV.
+I1
+ssVER
+p990
+(dp991
+V
+I7
+sVC
+I1
+sVE
+I1
+sVG
+I7
+sVI
+I7
+sV*
+I1
+sV,
+I3
+sVN
+I49
+sVS
+I1
+sVW
+I1
+ssVEl
+p992
+(dp993
+Ve
+I1
+ssVEn
+p994
+(dp995
+Vd
+I1
+sVg
+I3
+ssVEd
+p996
+(dp997
+Vw
+I9
+ssVNO
+p998
+(dp999
+V
+I2
+sVT
+I5
+sVN
+I49
+ssVr:
+p1000
+(dp1001
+V
+I6
+ssVr;
+p1002
+(dp1003
+V
+I36
+ssVr'
+p1004
+(dp1005
+Vs
+I31
+ssVr
+p1006
+(dp1007
+V(
+I1
+sV3
+I1
+sV4
+I1
+sVA
+I8
+sVC
+I6
+sVB
+I1
+sVE
+I1
+sVF
+I8
+sVI
+I21
+sVH
+I1
+sVJ
+I49
+sVM
+I15
+sVL
+I7
+sVS
+I20
+sVR
+I9
+sV[
+I2
+sVa
+I152
+sVc
+I53
+sVb
+I42
+sVe
+I46
+sVd
+I55
+sVg
+I19
+sVf
+I75
+sVi
+I59
+sVh
+I104
+sVk
+I8
+sVj
+I3
+sVm
+I116
+sVl
+I47
+sVo
+I88
+sVn
+I20
+sVq
+I1
+sVp
+I47
+sVs
+I100
+sVr
+I34
+sVu
+I21
+sVt
+I189
+sVw
+I79
+sVv
+I8
+sVy
+I15
+sVz
+I1
+ssVGi
+p1008
+(dp1009
+Vv
+I1
+ssVr,
+p1010
+(dp1011
+V
+I181
+sV"
+I2
+sV-
+I9
+ssVEt
+p1012
+(dp1013
+Ve
+I11
+ssVr.
+p1014
+(dp1015
+V
+I158
+sV"
+I3
+sV0
+I1
+ssVr@
+p1016
+(dp1017
+Vl
+I1
+ssVr)
+p1018
+(dp1019
+V,
+I1
+ssVr*
+p1020
+(dp1021
+V*
+I1
+ssVw'
+p1022
+(dp1023
+Vs
+I5
+ssVNC
+p1024
+(dp1025
+VI
+I1
+sVE
+I1
+sVL
+I3
+sVO
+I1
+ssVxc
+p1026
+(dp1027
+Vi
+I2
+sVu
+I13
+sVe
+I17
+sVl
+I3
+sVh
+I1
+ssVxa
+p1028
+(dp1029
+Vc
+I5
+sVm
+I4
+sVt
+I4
+sVg
+I1
+ssV1]
+p1030
+(dp1031
+V
+I3
+ssVUE
+p1032
+(dp1033
+VN
+I1
+ssVxe
+p1034
+(dp1035
+Vc
+I2
+sVr
+I5
+sVm
+I1
+sVs
+I2
+sVd
+I12
+ssVxx
+p1036
+(dp1037
+V1
+I1
+sVx
+I4
+sV]
+I1
+ssVjo
+p1038
+(dp1039
+Vi
+I9
+sVy
+I8
+sVk
+I1
+sVu
+I4
+ssVxp
+p1040
+(dp1041
+Vr
+I10
+sVe
+I27
+sVl
+I16
+sVo
+I2
+ssVxq
+p1042
+(dp1043
+Vu
+I1
+ssVxt
+p1044
+(dp1045
+V
+I31
+sVe
+I8
+sV)
+I1
+sV,
+I6
+sV/
+I2
+sV.
+I2
+sVs
+I12
+sVr
+I10
+sVu
+I1
+sVo
+I1
+sV9
+I2
+ssVM
+p1046
+(dp1047
+VI
+I1
+sVE
+I1
+sVT
+I2
+ssVu,
+p1048
+(dp1049
+V
+I42
+sV"
+I3
+ssVIE
+p1050
+(dp1051
+VS
+I3
+sVD
+I1
+ssVeu
+p1052
+(dp1053
+V!
+I2
+sVv
+I1
+sV,
+I5
+sV.
+I2
+ssV-F
+p1054
+(dp1055
+Vr
+I1
+ssV?"
+p1056
+(dp1057
+V
+I13
+ssV0%
+p1058
+(dp1059
+V
+I3
+ssV.;
+p1060
+(dp1061
+V
+I1
+ssV<h
+p1062
+(dp1063
+Va
+I1
+ssVx]
+p1064
+(dp1065
+V
+I1
+ssV-i
+p1066
+(dp1067
+Vs
+I1
+sVn
+I8
+ssV?
+p1068
+(dp1069
+VA
+I3
+sV
+I1
+sVB
+I1
+sVF
+I1
+sVI
+I4
+sVH
+I1
+sVa
+I1
+sVM
+I3
+sVN
+I1
+sVS
+I2
+sVR
+I1
+sVU
+I1
+sVT
+I2
+sVW
+I6
+sVY
+I2
+ssV"h
+p1070
+(dp1071
+Ve
+I2
+ssVX?
+p1072
+(dp1073
+V0
+I1
+ssVc,
+p1074
+(dp1075
+V
+I3
+ssVXI
+p1076
+(dp1077
+VI
+I6
+sV
+I3
+sVX
+I3
+sVV
+I3
+ssVx.
+p1078
+(dp1079
+Vx
+I1
+sVc
+I1
+ssVKe
+p1080
+(dp1081
+Ve
+I2
+sVn
+I1
+ssVx
+p1082
+(dp1083
+Va
+I1
+sV
+I1
+sVd
+I1
+sVh
+I1
+sV1
+I1
+sVr
+I1
+sVw
+I1
+sVy
+I1
+ssVKn
+p1084
+(dp1085
+Vo
+I1
+ssVPo
+p1086
+(dp1087
+Vs
+I1
+sVo
+I6
+ssVRG
+p1088
+(dp1089
+V"
+I1
+sV-
+I6
+ssVXX
+p1090
+(dp1091
+VI
+I10
+sV
+I2
+sVX
+I10
+sVV
+I8
+ssVXP
+p1092
+(dp1093
+VR
+I1
+ssVx1
+p1094
+(dp1095
+V0
+I1
+ssV$2
+p1096
+(dp1097
+V
+I1
+ssVXT
+p1098
+(dp1099
+V
+I3
+sVS
+I3
+ssVY,
+p1100
+(dp1101
+V
+I1
+ssV11
+p1102
+(dp1103
+V.
+I1
+ssV10
+p1104
+(dp1105
+Va
+I1
+sV
+I1
+sV%
+I2
+sV,
+I1
+sV.
+I2
+sV0
+I1
+sVx
+I1
+ssVOf
+p1106
+(dp1107
+V
+I1
+sVf
+I1
+ssV-U
+p1108
+(dp1109
+Vn
+I1
+ssV19
+p1110
+(dp1111
+V9
+I2
+sV7
+I1
+ssV18
+p1112
+(dp1113
+V2
+I1
+ssVKI
+p1114
+(dp1115
+VN
+I1
+ssVu
+p1116
+(dp1117
+VM
+I1
+sVR
+I1
+sVa
+I33
+sVc
+I19
+sVb
+I2
+sVe
+I4
+sVd
+I12
+sVg
+I3
+sVf
+I3
+sVi
+I3
+sVh
+I18
+sVk
+I11
+sVm
+I30
+sVl
+I3
+sVo
+I8
+sVn
+I4
+sVp
+I4
+sVs
+I12
+sVr
+I7
+sVu
+I2
+sVt
+I21
+sVw
+I42
+sVv
+I1
+ssV&c
+p1118
+(dp1119
+V,
+I1
+sV.
+I19
+ssVAg
+p1120
+(dp1121
+Va
+I1
+ssV1*
+p1122
+(dp1123
+V*
+I1
+ssV1,
+p1124
+(dp1125
+V
+I1
+ssV1.
+p1126
+(dp1127
+V
+I2
+sVt
+I1
+ssVDO
+p1128
+(dp1129
+VM
+I2
+sVN
+I1
+ssV-T
+p1130
+(dp1131
+Vh
+I2
+sVM
+I1
+ssV-p
+p1132
+(dp1133
+Vr
+I1
+ssVDI
+p1134
+(dp1135
+VC
+I2
+sVE
+I1
+sVD
+I1
+sVN
+I2
+sVS
+I2
+sVR
+I1
+sVU
+I1
+sVT
+I1
+ssVDE
+p1136
+(dp1137
+VA
+I2
+sV
+I29
+sVD
+I1
+sVM
+I1
+sVN
+I1
+sVR
+I2
+sVX
+I1
+ssVRA
+p1138
+(dp1139
+VC
+I1
+sVN
+I4
+ssVDA
+p1140
+(dp1141
+VM
+I3
+ssVw:
+p1142
+(dp1143
+V
+I1
+ssV*n
+p1144
+(dp1145
+Vo
+I1
+ssVF.
+p1146
+(dp1147
+V
+I1
+ssVDY
+p1148
+(dp1149
+V
+I35
+ssV*e
+p1150
+(dp1151
+Vx
+I1
+ssV/
+p1152
+(dp1153
+VC
+I1
+ssVDo
+p1154
+(dp1155
+V
+I6
+sVn
+I1
+ssVk
+p1156
+(dp1157
+Va
+I13
+sVc
+I1
+sVb
+I2
+sVe
+I3
+sVd
+I1
+sVf
+I10
+sVI
+I4
+sV(
+I1
+sVH
+I1
+sVm
+I9
+sVl
+I1
+sVo
+I13
+sVq
+I1
+sVp
+I2
+sVs
+I2
+sVu
+I1
+sVt
+I14
+sVw
+I6
+sVh
+I3
+sVy
+I5
+sVi
+I5
+ssVx,
+p1158
+(dp1159
+V
+I2
+ssVDi
+p1160
+(dp1161
+Vs
+I1
+sVr
+I1
+sVd
+I2
+ssV*T
+p1162
+(dp1163
+Vh
+I4
+sVH
+I2
+ssVk)
+p1164
+(dp1165
+V,
+I1
+ssV*W
+p1166
+(dp1167
+VA
+I1
+sVe
+I1
+ssVk.
+p1168
+(dp1169
+V
+I6
+ssVk-
+p1170
+(dp1171
+Vu
+I1
+ssVDa
+p1172
+(dp1173
+Vt
+I1
+ssVN
+p1174
+(dp1175
+VI
+I2
+sVU
+I1
+sVE
+I2
+sVT
+I32
+sVV
+I8
+ssV*I
+p1176
+(dp1177
+Vn
+I1
+ssVxi
+p1178
+(dp1179
+Vb
+I1
+sVe
+I6
+sVl
+I1
+sVo
+I8
+sVn
+I2
+sVs
+I4
+sVt
+I1
+ssV*E
+p1180
+(dp1181
+VI
+I1
+sVt
+I1
+sVN
+I2
+ssV*F
+p1182
+(dp1183
+VO
+I1
+ssVDu
+p1184
+(dp1185
+Vr
+I2
+ssVKi
+p1186
+(dp1187
+Vs
+I1
+ssV*B
+p1188
+(dp1189
+VE
+I1
+ssVPR
+p1190
+(dp1191
+VI
+I2
+sVE
+I2
+sVO
+I8
+ssVN'
+p1192
+(dp1193
+VT
+I1
+ssV*:
+p1194
+(dp1195
+V
+I1
+ssV7
+p1196
+(dp1197
+V
+I1
+ssV-h
+p1198
+(dp1199
+Vu
+I2
+sVe
+I4
+sVo
+I2
+ssV~)
+p1200
+(dp1201
+V,
+I1
+ssV*)
+p1202
+(dp1203
+V
+I1
+ssV71
+p1204
+(dp1205
+V*
+I1
+ssVMN
+p1206
+(dp1207
+VI
+I1
+ssV.G
+p1208
+(dp1209
+VU
+I1
+ssV*
+p1210
+(dp1211
+VY
+I1
+sVc
+I1
+sVT
+I1
+sVf
+I1
+ssV78
+p1212
+(dp1213
+V2
+I1
+ssVD,
+p1214
+(dp1215
+V
+I3
+ssVQU
+p1216
+(dp1217
+VE
+I1
+ssVkf
+p1218
+(dp1219
+Va
+I5
+sVu
+I1
+ssVke
+p1220
+(dp1221
+V!
+I1
+sV
+I91
+sVe
+I11
+sVd
+I27
+sV-
+I1
+sVl
+I6
+sVn
+I22
+sVp
+I3
+sVs
+I11
+sVr
+I1
+sV;
+I2
+sV.
+I2
+sV,
+I4
+ssVki
+p1222
+(dp1223
+Vl
+I3
+sVn
+I63
+ssVkn
+p1224
+(dp1225
+Ve
+I8
+sVo
+I86
+ssVD
+p1226
+(dp1227
+VD
+I2
+sVM
+I1
+sVT
+I4
+sVW
+I1
+sVt
+I2
+ssVkl
+p1228
+(dp1229
+Va
+I5
+ssVks
+p1230
+(dp1231
+V
+I20
+sV;
+I2
+sV,
+I2
+sV'
+I1
+sV.
+I2
+ssVSe
+p1232
+(dp1233
+Vy
+I8
+sVn
+I2
+ssVkw
+p1234
+(dp1235
+Va
+I2
+ssVky
+p1236
+(dp1237
+V
+I3
+ssVs-
+p1238
+(dp1239
+V-
+I5
+ssVd.
+p1240
+(dp1241
+V
+I61
+sV"
+I1
+ssVd,
+p1242
+(dp1243
+V
+I171
+sV"
+I2
+sV-
+I3
+ssVgf
+p1244
+(dp1245
+Vo
+I19
+ssVWA
+p1246
+(dp1247
+VR
+I4
+sVN
+I1
+ssVBE
+p1248
+(dp1249
+V
+I1
+sVR
+I8
+sVF
+I1
+ssVd'
+p1250
+(dp1251
+Vs
+I12
+ssVd"
+p1252
+(dp1253
+V
+I1
+ssVd
+p1254
+(dp1255
+V"
+I1
+sV(
+I2
+sVB
+I2
+sVE
+I1
+sVD
+I5
+sVG
+I2
+sVF
+I5
+sVI
+I62
+sVH
+I1
+sVJ
+I1
+sVM
+I18
+sVL
+I5
+sVS
+I17
+sVR
+I4
+sVW
+I2
+sV[
+I1
+sVa
+I166
+sVc
+I41
+sVb
+I122
+sVe
+I45
+sVd
+I32
+sVg
+I15
+sVf
+I71
+sVi
+I115
+sVh
+I168
+sVk
+I4
+sVj
+I5
+sVm
+I109
+sVl
+I17
+sVo
+I97
+sVn
+I91
+sVq
+I4
+sVp
+I29
+sVs
+I101
+sVr
+I18
+sVu
+I20
+sVt
+I300
+sVw
+I107
+sVv
+I7
+sVy
+I42
+ssVWH
+p1256
+(dp1257
+VA
+I1
+ssVd?
+p1258
+(dp1259
+V
+I2
+sV"
+I1
+ssVJO
+p1260
+(dp1261
+VH
+I17
+ssVd:
+p1262
+(dp1263
+V
+I7
+ssVd;
+p1264
+(dp1265
+V
+I28
+ssVJE
+p1266
+(dp1267
+VC
+I7
+ssV-S
+p1268
+(dp1269
+Vi
+I1
+ssVn-
+p1270
+(dp1271
+Vh
+I1
+sV-
+I4
+sVl
+I7
+ssV=T
+p1272
+(dp1273
+Vr
+I1
+ssVWe
+p1274
+(dp1275
+V
+I21
+sVr
+I2
+sVl
+I3
+sVd
+I2
+ssVFI
+p1276
+(dp1277
+VT
+I1
+ssVWo
+p1278
+(dp1279
+Vr
+I1
+ssVJu
+p1280
+(dp1281
+Vn
+I1
+ssVWi
+p1282
+(dp1283
+Vl
+I5
+sVg
+I3
+sVt
+I3
+ssVWh
+p1284
+(dp1285
+Vy
+I5
+sVa
+I10
+sVe
+I19
+sVo
+I1
+ssVJo
+p1286
+(dp1287
+Vh
+I18
+ssVJa
+p1288
+(dp1289
+Vm
+I54
+sVn
+I6
+ssVMR
+p1290
+(dp1291
+V
+I1
+sVS
+I30
+sV.
+I9
+ssVAr
+p1292
+(dp1293
+Ve
+I1
+sVt
+I1
+ssVdn
+p1294
+(dp1295
+Vi
+I2
+sVe
+I18
+ssVdo
+p1296
+(dp1297
+V!
+I1
+sV
+I51
+sVe
+I20
+sVi
+I3
+sVm
+I9
+sVl
+I3
+sVo
+I6
+sV,
+I4
+sVp
+I2
+sVu
+I23
+sVw
+I11
+sV.
+I1
+sV;
+I2
+sVn
+I44
+sV?
+I1
+ssVdl
+p1298
+(dp1299
+Vy
+I15
+sVe
+I3
+ssVy"
+p1300
+(dp1301
+V
+I1
+sV.
+I1
+ssVIG
+p1302
+(dp1303
+VE
+I1
+ssVA.
+p1304
+(dp1305
+V
+I5
+ssVdi
+p1306
+(dp1307
+Va
+I24
+sVc
+I17
+sVe
+I15
+sVd
+I24
+sVg
+I4
+sVf
+I14
+sVl
+I3
+sVn
+I49
+sVs
+I128
+sVr
+I12
+sVu
+I5
+sVt
+I19
+sVv
+I1
+ssVdf
+p1308
+(dp1309
+Vu
+I5
+ssVdg
+p1310
+(dp1311
+Vi
+I4
+sVe
+I11
+sVm
+I8
+ssVdd
+p1312
+(dp1313
+Vi
+I5
+sV
+I2
+sVr
+I6
+sVe
+I11
+sV,
+I1
+ssVde
+p1314
+(dp1315
+Va
+I104
+sV
+I49
+sVc
+I25
+sVb
+I4
+sVe
+I25
+sVd
+I69
+sVg
+I12
+sVf
+I11
+sVi
+I1
+sVj
+I2
+sVm
+I8
+sVl
+I30
+sVn
+I34
+sVp
+I16
+sVs
+I58
+sVr
+I180
+sVt
+I29
+sVv
+I5
+sV.
+I2
+sV,
+I7
+ssVda
+p1316
+(dp1317
+Vb
+I5
+sVm
+I5
+sVl
+I2
+sVn
+I11
+sVr
+I10
+sVu
+I38
+sVt
+I9
+sVy
+I40
+ssVf?
+p1318
+(dp1319
+V
+I2
+ssV=
+p1320
+(dp1321
+VC
+I1
+ssVdy
+p1322
+(dp1323
+V
+I98
+sVs
+I12
+sV,
+I3
+sV.
+I1
+ssVdv
+p1324
+(dp1325
+Va
+I12
+sVi
+I10
+sVo
+I1
+ssVdw
+p1326
+(dp1327
+Va
+I9
+sVe
+I1
+ssVdu
+p1328
+(dp1329
+Va
+I1
+sV
+I1
+sVc
+I37
+sVe
+I7
+sVi
+I1
+sVl
+I9
+sVp
+I1
+sVr
+I7
+sVt
+I8
+ssVdr
+p1330
+(dp1331
+Va
+I8
+sVe
+I31
+sVo
+I2
+ssVds
+p1332
+(dp1333
+V
+I30
+sVh
+I11
+sV,
+I7
+sVo
+I6
+sV.
+I8
+sV;
+I3
+ssVnm
+p1334
+(dp1335
+Vi
+I1
+ssVqu
+p1336
+(dp1337
+Vi
+I54
+sVa
+I35
+sVe
+I32
+ssVGe
+p1338
+(dp1339
+Vr
+I1
+ssVW
+p1340
+(dp1341
+VG
+I1
+ssV(h
+p1342
+(dp1343
+Vi
+I1
+ssVm:
+p1344
+(dp1345
+V
+I1
+ssVE
+p1346
+(dp1347
+Vo
+I1
+sVC
+I28
+sVE
+I1
+sVM
+I1
+sVs
+I1
+sVO
+I4
+sVN
+I2
+sVP
+I1
+sVS
+I6
+sVT
+I4
+sVw
+I1
+sVV
+I7
+sVt
+I3
+ssVd]
+p1348
+(dp1349
+V
+I1
+ssVPL
+p1350
+(dp1351
+VI
+I1
+ssVPr
+p1352
+(dp1353
+Vi
+I5
+sVa
+I1
+sVe
+I2
+sVo
+I25
+ssVuv
+p1354
+(dp1355
+Vr
+I1
+ssVUL
+p1356
+(dp1357
+VA
+I1
+ssVw!
+p1358
+(dp1359
+V
+I1
+ssVw
+p1360
+(dp1361
+VI
+I3
+sVL
+I1
+sVN
+I1
+sVa
+I17
+sVc
+I4
+sVb
+I7
+sVe
+I2
+sVd
+I15
+sVg
+I4
+sVf
+I5
+sVi
+I12
+sVh
+I20
+sVm
+I12
+sVl
+I5
+sVo
+I5
+sVn
+I12
+sVq
+I1
+sVp
+I2
+sVs
+I9
+sVu
+I2
+sVt
+I25
+sVw
+I11
+sVv
+I1
+sVy
+I6
+ssVw.
+p1362
+(dp1363
+V
+I5
+ssVw,
+p1364
+(dp1365
+V
+I26
+ssV.e
+p1366
+(dp1367
+Vd
+I1
+ssV#9
+p1368
+(dp1369
+V4
+I1
+ssVPa
+p1370
+(dp1371
+Vy
+I1
+sVr
+I5
+sVg
+I1
+ssVrf
+p1372
+(dp1373
+Vi
+I1
+sVe
+I22
+sVu
+I7
+ssVPe
+p1374
+(dp1375
+Vr
+I1
+ssVBe
+p1376
+(dp1377
+V
+I3
+sVs
+I2
+sVl
+I1
+ssVw;
+p1378
+(dp1379
+V
+I3
+ssV#6
+p1380
+(dp1381
+V
+I1
+ssVPl
+p1382
+(dp1383
+Va
+I1
+sVe
+I2
+ssV02
+p1384
+(dp1385
+V]
+I1
+ssV.x
+p1386
+(dp1387
+Vx
+I1
+ssV00
+p1388
+(dp1389
+V
+I2
+sV,
+I2
+sV.
+I2
+sV1
+I3
+sV0
+I3
+sV2
+I1
+sV=
+I1
+ssV01
+p1390
+(dp1391
+V
+I1
+sV.
+I2
+ssV."
+p1392
+(dp1393
+V
+I23
+ssV04
+p1394
+(dp1395
+V.
+I1
+ssVPU
+p1396
+(dp1397
+VR
+I1
+sVB
+I2
+sVN
+I1
+ssV-
+p1398
+(dp1399
+VH
+I2
+ssVuo
+p1400
+(dp1401
+Vs
+I1
+ssV0=
+p1402
+(dp1403
+VT
+I1
+ssV0
+p1404
+(dp1405
+Vx
+I1
+sVb
+I1
+sVm
+I1
+sVt
+I1
+sVd
+I3
+ssVPA
+p1406
+(dp1407
+VR
+I1
+ssVju
+p1408
+(dp1409
+Vs
+I28
+sVr
+I8
+sVd
+I19
+ssVXL
+p1410
+(dp1411
+VI
+I1
+sV
+I1
+ssV0.
+p1412
+(dp1413
+V
+I1
+sVz
+I1
+sVt
+I1
+sVG
+I1
+ssVPO
+p1414
+(dp1415
+VS
+I2
+ssV0,
+p1416
+(dp1417
+V0
+I3
+ssVlf
+p1418
+(dp1419
+Va
+I3
+sV
+I80
+sVi
+I2
+sV-
+I2
+sV,
+I19
+sVo
+I1
+sV.
+I8
+sV!
+I1
+sV;
+I6
+sV:
+I1
+sV?
+I2
+ssVwe
+p1420
+(dp1421
+Va
+I10
+sV
+I78
+sVe
+I29
+sVd
+I10
+sVl
+I41
+sVn
+I7
+sVr
+I71
+sVv
+I36
+ssVwa
+p1422
+(dp1423
+Vb
+I1
+sVi
+I7
+sVk
+I2
+sVl
+I4
+sVn
+I21
+sVs
+I186
+sVr
+I100
+sVt
+I5
+sVy
+I55
+ssVlg
+p1424
+(dp1425
+Vi
+I1
+sVe
+I4
+ssVwo
+p1426
+(dp1427
+V
+I17
+sVr
+I57
+sVu
+I70
+sVm
+I25
+sVn
+I7
+ssVwn
+p1428
+(dp1429
+V
+I68
+sV,
+I11
+sV.
+I10
+sVs
+I2
+sVr
+I1
+sV;
+I3
+ssVwl
+p1430
+(dp1431
+Ve
+I6
+ssVwk
+p1432
+(dp1433
+Vw
+I2
+ssVwi
+p1434
+(dp1435
+Vc
+I1
+sVd
+I4
+sVf
+I19
+sVl
+I114
+sVn
+I27
+sVs
+I49
+sVt
+I240
+ssVwh
+p1436
+(dp1437
+Vi
+I144
+sVa
+I69
+sVe
+I85
+sVy
+I3
+sVo
+I92
+ssVP
+p1438
+(dp1439
+Vp
+I1
+sVd
+I1
+ssV27
+p1440
+(dp1441
+V8
+I1
+ssVws
+p1442
+(dp1443
+V!
+I1
+sV
+I10
+sVl
+I1
+sV,
+I3
+ssVwr
+p1444
+(dp1445
+Vi
+I20
+sVe
+I9
+sVo
+I10
+ssV[*
+p1446
+(dp1447
+V]
+I3
+ssVje
+p1448
+(dp1449
+Va
+I10
+sVc
+I53
+sVs
+I1
+ssVP.
+p1450
+(dp1451
+V
+I1
+ssVwy
+p1452
+(dp1453
+Ve
+I1
+ssVBa
+p1454
+(dp1455
+Vt
+I5
+ssV".
+p1456
+(dp1457
+V
+I3
+ssVuf
+p1458
+(dp1459
+Vf
+I11
+ssVua
+p1460
+(dp1461
+Vd
+I14
+sVg
+I3
+sVi
+I13
+sVl
+I31
+sVn
+I1
+sVr
+I14
+sVt
+I17
+ssV0x
+p1462
+(dp1463
+V.
+I1
+ssVRS
+p1464
+(dp1465
+VI
+I1
+sV.
+I30
+ssV0a
+p1466
+(dp1467
+V.
+I1
+ssV]
+p1468
+(dp1469
+Va
+I3
+sV
+I6
+sVd
+I1
+sVp
+I1
+sVt
+I1
+sVY
+I1
+ssVck
+p1470
+(dp1471
+V
+I12
+sVe
+I3
+sVi
+I4
+sVn
+I3
+sVy
+I3
+sV.
+I1
+ssVci
+p1472
+(dp1473
+Va
+I21
+sVe
+I20
+sVd
+I7
+sVf
+I1
+sVl
+I5
+sVo
+I9
+sVn
+I9
+sVp
+I5
+sVs
+I5
+sVr
+I10
+sVt
+I7
+sVv
+I2
+ssVch
+p1474
+(dp1475
+Va
+I40
+sV
+I269
+sVe
+I43
+sVi
+I26
+sVh
+I46
+sV-
+I1
+sVm
+I9
+sV,
+I9
+sVo
+I22
+sV.
+I5
+sVu
+I3
+sV;
+I1
+ssVco
+p1476
+(dp1477
+Vd
+I1
+sVm
+I128
+sVl
+I8
+sVo
+I4
+sVn
+I233
+sVq
+I5
+sVp
+I16
+sVs
+I3
+sVr
+I14
+sVu
+I134
+sVv
+I8
+ssVcl
+p1478
+(dp1479
+Vi
+I7
+sVe
+I23
+sVu
+I20
+sVa
+I19
+sVo
+I6
+ssVcc
+p1480
+(dp1481
+Va
+I12
+sVe
+I13
+sVi
+I1
+sVo
+I27
+sVr
+I1
+sVu
+I10
+ssVca
+p1482
+(dp1483
+V
+I54
+sVc
+I6
+sVb
+I2
+sVd
+I1
+sV'
+I12
+sVm
+I18
+sVl
+I25
+sVn
+I117
+sVp
+I11
+sVs
+I20
+sVr
+I21
+sVu
+I21
+sVt
+I27
+sV"
+I1
+sV;
+I2
+sV.
+I1
+sV,
+I14
+ssVce
+p1484
+(dp1485
+Va
+I7
+sV
+I178
+sV:
+I1
+sVe
+I7
+sVd
+I34
+sV'
+I1
+sV)
+I1
+sVi
+I43
+sV-
+I1
+sVm
+I5
+sV,
+I36
+sVn
+I10
+sVp
+I18
+sVs
+I49
+sVr
+I30
+sV!
+I1
+sVt
+I1
+sV;
+I7
+sV.
+I26
+sV?
+I2
+sVl
+I17
+ssVcd
+p1486
+(dp1487
+V
+I2
+ssV60
+p1488
+(dp1489
+V
+I1
+ssV61
+p1490
+(dp1491
+V8
+I1
+ssVcy
+p1492
+(dp1493
+V!
+I3
+sV
+I29
+sV'
+I1
+sVi
+I1
+sV-
+I1
+sV,
+I11
+sV.
+I3
+sVs
+I1
+sV;
+I2
+ssVA
+p1494
+(dp1495
+Vg
+I1
+ssV),
+p1496
+(dp1497
+V
+I5
+ssV).
+p1498
+(dp1499
+V
+I4
+ssVcs
+p1500
+(dp1501
+V
+I1
+sVo
+I1
+ssVcr
+p1502
+(dp1503
+Va
+I1
+sVi
+I13
+sVe
+I30
+sVu
+I3
+sVy
+I2
+ssVcq
+p1504
+(dp1505
+Vu
+I16
+ssVcu
+p1506
+(dp1507
+Vm
+I12
+sVl
+I31
+sVn
+I1
+sVs
+I21
+sVr
+I15
+sVt
+I5
+ssVct
+p1508
+(dp1509
+Va
+I10
+sV
+I88
+sV"
+I1
+sVe
+I42
+sV'
+I2
+sVi
+I97
+sVl
+I19
+sVo
+I6
+sV,
+I13
+sVs
+I5
+sVr
+I5
+sVu
+I15
+sV;
+I2
+sV.
+I9
+ssVpr
+p1510
+(dp1511
+Vi
+I37
+sVa
+I8
+sVe
+I122
+sVu
+I6
+sVo
+I110
+ssVps
+p1512
+(dp1513
+V
+I14
+sV-
+I1
+sVe
+I1
+sV,
+I3
+sVt
+I2
+ssVpp
+p1514
+(dp1515
+Ve
+I33
+sVi
+I13
+sVl
+I12
+sVo
+I37
+sVr
+I8
+sVy
+I18
+ssVC.
+p1516
+(dp1517
+V
+I6
+ssVpt
+p1518
+(dp1519
+Va
+I1
+sV
+I20
+sVe
+I6
+sVi
+I21
+sV,
+I1
+sVo
+I1
+sVs
+I2
+sVu
+I1
+sV;
+I1
+ssVpu
+p1520
+(dp1521
+Vb
+I3
+sVd
+I3
+sVl
+I3
+sVn
+I7
+sVs
+I1
+sVr
+I8
+sVt
+I17
+ssVpy
+p1522
+(dp1523
+V!
+I1
+sV
+I16
+sV,
+I1
+sV.
+I5
+sVr
+I8
+sV:
+I1
+ssVY;
+p1524
+(dp1525
+V
+I1
+ssV"y
+p1526
+(dp1527
+Vo
+I2
+ssVpa
+p1528
+(dp1529
+Vc
+I3
+sVb
+I2
+sVg
+I1
+sVi
+I15
+sVl
+I1
+sVn
+I10
+sVs
+I18
+sVr
+I92
+sVt
+I18
+sVy
+I5
+ssVpd
+p1530
+(dp1531
+Va
+I1
+ssVpe
+p1532
+(dp1533
+Va
+I49
+sV
+I22
+sVc
+I50
+sVe
+I5
+sVd
+I8
+sVm
+I1
+sV,
+I4
+sVo
+I2
+sVn
+I49
+sVs
+I4
+sVr
+I128
+sVt
+I2
+sV;
+I1
+sV.
+I1
+sV]
+I1
+sVl
+I3
+ssVph
+p1534
+(dp1535
+Vy
+I2
+sVi
+I1
+sVa
+I1
+sV
+I1
+ssVpi
+p1536
+(dp1537
+Va
+I1
+sVc
+I1
+sVe
+I5
+sVd
+I6
+sVl
+I2
+sVn
+I32
+sVs
+I7
+sVr
+I17
+sVt
+I13
+ssVh;
+p1538
+(dp1539
+V
+I5
+ssVpo
+p1540
+(dp1541
+Vb
+I1
+sVi
+I21
+sVk
+I9
+sVl
+I5
+sVo
+I11
+sVn
+I10
+sVp
+I1
+sVs
+I94
+sVr
+I26
+sVu
+I2
+sVt
+I3
+sVw
+I22
+sVv
+I1
+ssVpl
+p1542
+(dp1543
+Vy
+I14
+sVa
+I69
+sVe
+I50
+sVi
+I19
+sVo
+I3
+ssVpm
+p1544
+(dp1545
+Ve
+I1
+ssVCI
+p1546
+(dp1547
+VI
+I2
+sVA
+I5
+sVm
+I1
+sVD
+I1
+ssVCH
+p1548
+(dp1549
+VA
+I1
+sV
+I2
+ssVCO
+p1550
+(dp1551
+VU
+I28
+sVG
+I1
+sVN
+I3
+ssVc.
+p1552
+(dp1553
+V
+I3
+sVe
+I1
+sV,
+I18
+ssVCM
+p1554
+(dp1555
+VU
+I2
+ssVCL
+p1556
+(dp1557
+VA
+I1
+sVU
+I3
+ssVTr
+p1558
+(dp1559
+Vi
+I2
+ssVCA
+p1560
+(dp1561
+VT
+I8
+ssVc
+p1562
+(dp1563
+Vd
+I3
+sVi
+I1
+sVn
+I1
+sVp
+I1
+sVr
+I1
+sVu
+I1
+sVT
+I1
+sVt
+I1
+ssVCE
+p1564
+(dp1565
+V
+I2
+ssVCD
+p1566
+(dp1567
+VI
+I2
+ssV*V
+p1568
+(dp1569
+Ve
+I1
+ssVCR
+p1570
+(dp1571
+V
+I1
+ssV40
+p1572
+(dp1573
+V0
+I1
+ssVCU
+p1574
+(dp1575
+VL
+I1
+ssVCT
+p1576
+(dp1577
+V
+I8
+sV,
+I2
+ssVCh
+p1578
+(dp1579
+Va
+I10
+sVr
+I2
+sVu
+I46
+ssVCo
+p1580
+(dp1581
+Vp
+I1
+sVr
+I1
+sVm
+I3
+sVu
+I26
+sVn
+I2
+ssVap
+p1582
+(dp1583
+Va
+I5
+sV
+I1
+sVe
+I3
+sVi
+I3
+sVo
+I3
+sVp
+I78
+sVs
+I15
+sVr
+I2
+sVt
+I5
+ssVp;
+p1584
+(dp1585
+V
+I1
+ssVCa
+p1586
+(dp1587
+Vs
+I1
+sVr
+I4
+sVt
+I9
+sVn
+I3
+ssVCe
+p1588
+(dp1589
+Vr
+I1
+sVn
+I1
+ssVt-
+p1590
+(dp1591
+Vr
+I1
+sV-
+I2
+ssVp
+p1592
+(dp1593
+Va
+I4
+sVc
+I1
+sVb
+I1
+sVe
+I1
+sVg
+I1
+sVf
+I5
+sVi
+I3
+sVh
+I7
+sVm
+I3
+sVl
+I1
+sVo
+I2
+sVp
+I3
+sVs
+I3
+sVu
+I4
+sVt
+I8
+sVw
+I3
+sVv
+I1
+ssVp'
+p1594
+(dp1595
+Vs
+I2
+ssVp*
+p1596
+(dp1597
+V*
+I1
+ssVG
+p1598
+(dp1599
+VB
+I2
+ssVp.
+p1600
+(dp1601
+V
+I3
+ssV6]
+p1602
+(dp1603
+V
+I1
+ssVp,
+p1604
+(dp1605
+V
+I6
+ssVn]
+p1606
+(dp1607
+V
+I2
+ssVd-
+p1608
+(dp1609
+Vh
+I3
+sVc
+I1
+sV-
+I4
+ssVva
+p1610
+(dp1611
+Vg
+I1
+sVi
+I11
+sVl
+I23
+sVn
+I22
+sVs
+I2
+sVr
+I6
+sVt
+I8
+ssViz
+p1612
+(dp1613
+Vi
+I1
+sVe
+I12
+ssVve
+p1614
+(dp1615
+V
+I384
+sVd
+I68
+sV-
+I1
+sVm
+I4
+sV,
+I18
+sVn
+I97
+sVs
+I24
+sVr
+I360
+sVy
+I1
+sVx
+I6
+sV;
+I1
+sV.
+I5
+sVl
+I14
+ssV"b
+p1616
+(dp1617
+Vy
+I1
+sVu
+I3
+ssVip
+p1618
+(dp1619
+Va
+I3
+sV
+I13
+sV'
+I2
+sVi
+I2
+sV*
+I1
+sVm
+I1
+sV,
+I3
+sVl
+I3
+sVs
+I3
+sVt
+I5
+sV;
+I1
+sV.
+I2
+ssVis
+p1620
+(dp1621
+V
+I557
+sV-
+I1
+sV,
+I13
+sV.
+I3
+sV;
+I1
+sV:
+I1
+sV?
+I1
+sVa
+I17
+sVc
+I23
+sVb
+I1
+sVe
+I50
+sVg
+I2
+sVf
+I18
+sVi
+I25
+sVh
+I90
+sVk
+I7
+sVm
+I7
+sVl
+I9
+sVo
+I6
+sVp
+I27
+sVs
+I47
+sVu
+I5
+sVt
+I106
+ssVav
+p1622
+(dp1623
+Vi
+I45
+sVy
+I3
+sVe
+I294
+sVa
+I2
+sVo
+I28
+ssV/C
+p1624
+(dp1625
+Va
+I1
+sVM
+I1
+ssVit
+p1626
+(dp1627
+Va
+I21
+sV
+I234
+sVc
+I1
+sV:
+I1
+sVe
+I58
+sVi
+I43
+sVh
+I271
+sV-
+I1
+sVl
+I3
+sVo
+I3
+sVn
+I3
+sV)
+I1
+sVs
+I28
+sV!
+I3
+sVu
+I20
+sVt
+I51
+sVy
+I70
+sV;
+I4
+sV.
+I27
+sV,
+I27
+sV?
+I3
+ssViv
+p1628
+(dp1629
+Vi
+I15
+sVa
+I19
+sVe
+I149
+sVo
+I1
+ssV-u
+p1630
+(dp1631
+Vp
+I1
+sVs
+I1
+ssVih
+p1632
+(dp1633
+Vo
+I1
+ssVik
+p1634
+(dp1635
+Ve
+I32
+ssV X
+p1636
+(dp1637
+VI
+I5
+sV
+I1
+sVL
+I2
+sVX
+I20
+sVV
+I4
+ssVim
+p1638
+(dp1639
+Va
+I21
+sV
+I96
+sVe
+I65
+sVi
+I5
+sV-
+I2
+sVm
+I18
+sV,
+I25
+sVo
+I2
+sV.
+I13
+sVp
+I63
+sVs
+I14
+sV!
+I2
+sVu
+I1
+sV;
+I5
+sV:
+I1
+ssVil
+p1640
+(dp1641
+V
+I10
+sVe
+I46
+sVd
+I22
+sVf
+I1
+sV)
+I1
+sVk
+I1
+sVl
+I234
+sV,
+I1
+sVi
+I32
+sVs
+I5
+sVt
+I4
+sVy
+I42
+ssVio
+p1642
+(dp1643
+Vd
+I3
+sVl
+I7
+sVn
+I430
+sVs
+I1
+sVr
+I9
+sVu
+I51
+ssVin
+p1644
+(dp1645
+V!
+I1
+sV
+I394
+sV"
+I1
+sV'
+I1
+sV-
+I8
+sV,
+I11
+sV.
+I11
+sV;
+I3
+sV:
+I2
+sVa
+I103
+sVc
+I76
+sVe
+I98
+sVd
+I111
+sVg
+I703
+sVf
+I33
+sVi
+I32
+sVh
+I1
+sVk
+I36
+sVj
+I8
+sVl
+I15
+sVn
+I6
+sVq
+I1
+sVs
+I73
+sVu
+I22
+sVt
+I137
+sVw
+I46
+sVv
+I16
+sVy
+I1
+ssVia
+p1646
+(dp1647
+V
+I3
+sVb
+I13
+sVg
+I18
+sV,
+I9
+sVl
+I22
+sVs
+I1
+sVr
+I6
+sVt
+I26
+sVn
+I11
+ssVvy
+p1648
+(dp1649
+V
+I4
+ssVic
+p1650
+(dp1651
+Va
+I113
+sV
+I11
+sVe
+I51
+sVi
+I27
+sVh
+I122
+sVk
+I5
+sVl
+I3
+sV,
+I2
+sV)
+I1
+sVs
+I1
+sVu
+I26
+sVt
+I16
+sVy
+I1
+ssVib
+p1652
+(dp1653
+Vi
+I6
+sVe
+I16
+sVu
+I13
+sVl
+I42
+ssVie
+p1654
+(dp1655
+V
+I1
+sVc
+I6
+sVd
+I37
+sVf
+I5
+sV-
+I4
+sVl
+I3
+sVn
+I70
+sVs
+I34
+sVr
+I2
+sVu
+I9
+sVt
+I24
+sVw
+I9
+sVv
+I38
+sV.
+I1
+ssVid
+p1656
+(dp1657
+Va
+I2
+sV
+I70
+sV:
+I2
+sVe
+I68
+sVd
+I5
+sVi
+I5
+sV,
+I6
+sVo
+I4
+sVn
+I2
+sV;
+I2
+sV.
+I1
+sVl
+I3
+ssVig
+p1658
+(dp1659
+Va
+I1
+sVe
+I13
+sVi
+I7
+sVh
+I107
+sVm
+I3
+sVo
+I1
+sVn
+I24
+sVu
+I1
+ssVif
+p1660
+(dp1661
+V
+I65
+sVe
+I33
+sVf
+I12
+sVi
+I20
+sVl
+I1
+sVu
+I1
+sVt
+I2
+sVy
+I10
+ssV"D
+p1662
+(dp1663
+Vi
+I1
+sVe
+I1
+ssV"F
+p1664
+(dp1665
+Vr
+I3
+ssVaz
+p1666
+(dp1667
+Vi
+I2
+sVa
+I1
+sVe
+I1
+ssV"A
+p1668
+(dp1669
+VS
+I1
+sVr
+I1
+sVn
+I1
+ssV"B
+p1670
+(dp1671
+Vu
+I2
+ssV"C
+p1672
+(dp1673
+Va
+I1
+sVe
+I1
+ssV"w
+p1674
+(dp1675
+Va
+I1
+sVh
+I1
+ssV"M
+p1676
+(dp1677
+Va
+I1
+sVy
+I2
+ssV/e
+p1678
+(dp1679
+Vt
+I2
+ssV"O
+p1680
+(dp1681
+Vh
+I1
+sVf
+I1
+ssV"H
+p1682
+(dp1683
+Vi
+I1
+sVe
+I2
+ssV"I
+p1684
+(dp1685
+V
+I17
+sVt
+I4
+sVn
+I1
+ssV/a
+p1686
+(dp1687
+Vr
+I1
+ssV"W
+p1688
+(dp1689
+Vh
+I2
+ssV"P
+p1690
+(dp1691
+VR
+I2
+sVr
+I4
+ssVI,
+p1692
+(dp1693
+V
+I6
+ssV"R
+p1694
+(dp1695
+Vi
+I1
+ssV"S
+p1696
+(dp1697
+Va
+I1
+sVm
+I5
+ssV"i
+p1698
+(dp1699
+Vf
+I1
+sVn
+I1
+ssVI
+p1700
+(dp1701
+VD
+I1
+sVK
+I1
+sVa
+I128
+sVc
+I79
+sVb
+I19
+sVe
+I8
+sVd
+I33
+sVg
+I4
+sVf
+I22
+sVi
+I4
+sVh
+I121
+sVk
+I18
+sVm
+I39
+sVl
+I17
+sVo
+I9
+sVn
+I22
+sVp
+I4
+sVs
+I73
+sVr
+I23
+sVu
+I1
+sVt
+I25
+sVw
+I78
+sVv
+I1
+sVy
+I2
+ssVnh
+p1702
+(dp1703
+Va
+I10
+sVe
+I1
+ssV"Y
+p1704
+(dp1705
+Vo
+I2
+ssVIX
+p1706
+(dp1707
+V
+I4
+ssV"
+p1708
+(dp1709
+Va
+I1
+sVA
+I2
+sVc
+I2
+sVB
+I1
+sVd
+I1
+sVi
+I1
+sVh
+I4
+sVS
+I3
+sVW
+I3
+sVI
+I6
+sVs
+I19
+sV"
+I19
+sVt
+I1
+sVw
+I2
+sVH
+I3
+sVr
+I2
+sVb
+I1
+sVT
+I1
+ssVVE
+p1710
+(dp1711
+V
+I4
+sVR
+I50
+sVN
+I2
+ssV*]
+p1712
+(dp1713
+V
+I3
+ssVVI
+p1714
+(dp1715
+VI
+I8
+sV
+I3
+sVD
+I1
+ssVIS
+p1716
+(dp1717
+V
+I9
+sVC
+I1
+sV"
+I1
+sVE
+I1
+sVS
+I1
+sVT
+I2
+ssVIR
+p1718
+(dp1719
+V
+I2
+sVE
+I1
+ssVIU
+p1720
+(dp1721
+VM
+I1
+ssVIT
+p1722
+(dp1723
+V
+I1
+sVE
+I3
+sVI
+I2
+sVH
+I1
+sVN
+I1
+sVY
+I4
+ssVIV
+p1724
+(dp1725
+V
+I4
+sVE
+I2
+ssVII
+p1726
+(dp1727
+VI
+I8
+sV
+I17
+sV,
+I1
+ssVIM
+p1728
+(dp1729
+VI
+I3
+sVP
+I1
+sVE
+I1
+sV.
+I1
+ssVIL
+p1730
+(dp1731
+VI
+I3
+sV
+I2
+ssVIO
+p1732
+(dp1733
+VN
+I4
+ssVIN
+p1734
+(dp1735
+VA
+I3
+sV
+I2
+sVC
+I4
+sVE
+I7
+sVD
+I4
+sVG
+I2
+sVT
+I2
+ssVIA
+p1736
+(dp1737
+VB
+I1
+sVL
+I1
+sV.
+I5
+ssVIC
+p1738
+(dp1739
+VI
+I5
+sV
+I4
+sVU
+I1
+sVE
+I1
+sVT
+I1
+ssVIB
+p1740
+(dp1741
+VI
+I1
+sVU
+I1
+ssVHE
+p1742
+(dp1743
+V
+I11
+sVR
+I15
+sV,
+I1
+ssVID
+p1744
+(dp1745
+V
+I1
+sVE
+I2
+ssV":
+p1746
+(dp1747
+V
+I1
+ssVIF
+p1748
+(dp1749
+V
+I3
+ssVVa
+p1750
+(dp1751
+Vn
+I1
+ssVnx
+p1752
+(dp1753
+Vi
+I12
+ssVVe
+p1754
+(dp1755
+Vr
+I67
+ssVIs
+p1756
+(dp1757
+V
+I2
+ssVTY
+p1758
+(dp1759
+V
+I4
+sV;
+I1
+sV,
+I1
+ssVVl
+p1760
+(dp1761
+V
+I1
+ssVIt
+p1762
+(dp1763
+Va
+I1
+sV
+I29
+sVs
+I1
+ssVVo
+p1764
+(dp1765
+Vl
+I1
+ssVIm
+p1766
+(dp1767
+Va
+I1
+ssVIn
+p1768
+(dp1769
+Vd
+I1
+sV
+I10
+sVt
+I1
+sVf
+I3
+ssVd)
+p1770
+(dp1771
+V,
+I1
+ssV-c
+p1772
+(dp1773
+Vh
+I1
+sVo
+I1
+ssVTT
+p1774
+(dp1775
+VM
+I1
+sVE
+I1
+ssVIf
+p1776
+(dp1777
+V
+I25
+ssV6
+p1778
+(dp1779
+Vi
+I1
+sVf
+I1
+ssVUp
+p1780
+(dp1781
+Vp
+I8
+sVo
+I1
+ssVDe
+p1782
+(dp1783
+V
+I25
+sVc
+I2
+sVs
+I1
+sVp
+I1
+sVf
+I4
+ssV(~
+p1784
+(dp1785
+V)
+I1
+ssVBC
+p1786
+(dp1787
+VD
+I2
+ssVBL
+p1788
+(dp1789
+VI
+I2
+ssV(s
+p1790
+(dp1791
+Vu
+I1
+ssVBO
+p1792
+(dp1793
+VU
+I1
+ssVBI
+p1794
+(dp1795
+VL
+I3
+ssV(t
+p1796
+(dp1797
+Vh
+I1
+ssVTS
+p1798
+(dp1799
+V
+I1
+sV*
+I2
+ssVO?
+p1800
+(dp1801
+V
+I1
+ssVBU
+p1802
+(dp1803
+VT
+I3
+ssV"t
+p1804
+(dp1805
+Vh
+I2
+ssV(i
+p1806
+(dp1807
+Vf
+I2
+ssV(o
+p1808
+(dp1809
+Vr
+I4
+sVn
+I1
+ssVBR
+p1810
+(dp1811
+VE
+I1
+sVO
+I1
+ssV-b
+p1812
+(dp1813
+Vy
+I1
+sVr
+I1
+sVu
+I2
+ssVk,
+p1814
+(dp1815
+V
+I13
+ssVR.
+p1816
+(dp1817
+V
+I13
+ssVgt
+p1818
+(dp1819
+Vh
+I11
+ssV4.
+p1820
+(dp1821
+V2
+I1
+ssVa"
+p1822
+(dp1823
+V
+I1
+ssV(_
+p1824
+(dp1825
+V)
+I1
+ssVTO
+p1826
+(dp1827
+V
+I47
+sVO
+I1
+sV?
+I1
+ssVBo
+p1828
+(dp1829
+Vx
+I1
+sVt
+I1
+ssVBi
+p1830
+(dp1831
+Vt
+I1
+ssV(T
+p1832
+(dp1833
+Vh
+I1
+ssVBu
+p1834
+(dp1835
+Vt
+I14
+ssV(I
+p1836
+(dp1837
+V
+I1
+sVn
+I1
+ssVR*
+p1838
+(dp1839
+V:
+I1
+ssV-m
+p1840
+(dp1841
+Vi
+I2
+sVo
+I2
+ssVr-
+p1842
+(dp1843
+Vi
+I7
+sVh
+I1
+sVs
+I1
+ssV(C
+p1844
+(dp1845
+VM
+I1
+ssVBy
+p1846
+(dp1847
+V
+I6
+ssVgs
+p1848
+(dp1849
+V!
+I2
+sV
+I26
+sV,
+I12
+sV.
+I5
+sVt
+I1
+sV;
+I1
+ssVOn
+p1850
+(dp1851
+V
+I1
+sVe
+I3
+sVl
+I1
+ssVOh
+p1852
+(dp1853
+V!
+I1
+sV,
+I1
+ssV"G
+p1854
+(dp1855
+Vo
+I1
+ssVHo
+p1856
+(dp1857
+Vt
+I2
+sVw
+I7
+sVn
+I1
+ssV(*
+p1858
+(dp1859
+V)
+I1
+ssV-l
+p1860
+(dp1861
+Va
+I7
+ssV30
+p1862
+(dp1863
+V
+I1
+ssV);
+p1864
+(dp1865
+V
+I2
+ssVOu
+p1866
+(dp1867
+Vr
+I3
+sVg
+I1
+ssVgr
+p1868
+(dp1869
+Va
+I29
+sVi
+I6
+sVe
+I87
+sVy
+I6
+sVo
+I10
+ssVOO
+p1870
+(dp1871
+V
+I1
+ssVON
+p1872
+(dp1873
+V
+I50
+sVC
+I1
+sVE
+I1
+sV'
+I1
+sV,
+I1
+sV.
+I19
+sVS
+I3
+sVT
+I1
+ssVOM
+p1874
+(dp1875
+VA
+I2
+sV
+I2
+ssVns
+p1876
+(dp1877
+Va
+I4
+sV
+I80
+sVc
+I8
+sVe
+I41
+sVf
+I1
+sVi
+I50
+sV*
+I1
+sV-
+I1
+sV,
+I11
+sVo
+I24
+sV.
+I14
+sVp
+I5
+sV!
+I2
+sVu
+I10
+sVt
+I44
+sVw
+I6
+sV;
+I3
+sV:
+I2
+sVl
+I1
+ssVOJ
+p1878
+(dp1879
+VE
+I7
+ssVOH
+p1880
+(dp1881
+VN
+I17
+ssVOG
+p1882
+(dp1883
+V.
+I1
+ssVOF
+p1884
+(dp1885
+V
+I6
+ssVOC
+p1886
+(dp1887
+VR
+I1
+ssVnu
+p1888
+(dp1889
+Va
+I5
+sVe
+I12
+sVi
+I2
+sVm
+I2
+sVs
+I1
+sVr
+I3
+sVt
+I5
+ssV-o
+p1890
+(dp1891
+Vp
+I1
+sVf
+I1
+ssV5%
+p1892
+(dp1893
+V
+I1
+ssVOV
+p1894
+(dp1895
+VI
+I1
+ssVOU
+p1896
+(dp1897
+V
+I8
+sVR
+I29
+sVT
+I1
+ssVOT
+p1898
+(dp1899
+VI
+I1
+sV
+I4
+sVH
+I3
+ssVOS
+p1900
+(dp1901
+VS
+I1
+sVE
+I1
+ssVOR
+p1902
+(dp1903
+V
+I15
+sVE
+I1
+ssVS.
+p1904
+(dp1905
+V
+I51
+ssVb
+p1906
+(dp1907
+Vh
+I1
+ssV-n
+p1908
+(dp1909
+Va
+I2
+sVo
+I1
+ssVHI
+p1910
+(dp1911
+VS
+I8
+sVM
+I1
+ssVHN
+p1912
+(dp1913
+VS
+I17
+ssV)
+p1914
+(dp1915
+Va
+I1
+sVc
+I2
+sVd
+I1
+sVt
+I2
+sVw
+I1
+sVy
+I2
+ssVT:
+p1916
+(dp1917
+V
+I1
+ssVHA
+p1918
+(dp1919
+VN
+I1
+sVT
+I3
+sVD
+I1
+sVV
+I2
+ssVU
+p1920
+(dp1921
+VA
+I1
+sVc
+I1
+sV"
+I1
+sVD
+I1
+sVG
+I1
+sVH
+I1
+sV*
+I1
+sVU
+I1
+sV=
+I1
+ssVU"
+p1922
+(dp1923
+V:
+I1
+ssVo.
+p1924
+(dp1925
+V
+I8
+sV"
+I3
+sVu
+I1
+ssVo-
+p1926
+(dp1927
+V
+I1
+sVm
+I2
+sV-
+I1
+sVd
+I3
+ssVo,
+p1928
+(dp1929
+V
+I31
+ssVa'
+p1930
+(dp1931
+Vs
+I13
+ssVo!
+p1932
+(dp1933
+V
+I2
+ssVo
+p1934
+(dp1935
+V"
+I3
+sV*
+I1
+sVC
+I10
+sVB
+I2
+sVE
+I2
+sVD
+I1
+sVG
+I1
+sVI
+I5
+sVH
+I1
+sVM
+I16
+sVL
+I14
+sVN
+I1
+sVP
+I4
+sVS
+I6
+sVR
+I5
+sVT
+I1
+sVY
+I1
+sVa
+I69
+sVc
+I42
+sVb
+I75
+sVe
+I34
+sVd
+I47
+sVg
+I30
+sVf
+I36
+sVi
+I35
+sVh
+I102
+sVk
+I10
+sVj
+I5
+sVm
+I127
+sVl
+I39
+sVo
+I31
+sVn
+I33
+sVq
+I2
+sVp
+I42
+sVs
+I90
+sVr
+I41
+sVu
+I16
+sVt
+I103
+sVw
+I49
+sVv
+I12
+sVy
+I40
+ssVg;
+p1936
+(dp1937
+V
+I10
+ssVHi
+p1938
+(dp1939
+Vs
+I8
+ssVo;
+p1940
+(dp1941
+V
+I4
+ssVo:
+p1942
+(dp1943
+V
+I2
+ssVHa
+p1944
+(dp1945
+Vr
+I2
+sVm
+I1
+sVv
+I4
+ssVHe
+p1946
+(dp1947
+Va
+I5
+sV
+I38
+sVr
+I23
+ssVbd
+p1948
+(dp1949
+Vu
+I5
+ssVbe
+p1950
+(dp1951
+Va
+I14
+sV
+I262
+sVc
+I9
+sVe
+I76
+sVd
+I3
+sVg
+I11
+sVf
+I29
+sVi
+I36
+sVh
+I20
+sV-
+I2
+sVl
+I40
+sVn
+I6
+sVs
+I19
+sVr
+I43
+sV!
+I1
+sVt
+I35
+sVw
+I2
+sVy
+I11
+sV;
+I1
+sV.
+I2
+sV,
+I1
+ssV_)
+p1952
+(dp1953
+V
+I1
+ssVba
+p1954
+(dp1955
+Vc
+I2
+sVb
+I8
+sVd
+I3
+sVn
+I19
+sVs
+I1
+sVr
+I4
+sVt
+I5
+ssVbb
+p1956
+(dp1957
+Ve
+I4
+sVo
+I1
+ssVbl
+p1958
+(dp1959
+Va
+I10
+sVe
+I156
+sVi
+I21
+sVo
+I1
+sVu
+I2
+sVy
+I25
+ssVbm
+p1960
+(dp1961
+Vi
+I9
+ssVbo
+p1962
+(dp1963
+Vd
+I3
+sVm
+I1
+sVl
+I1
+sVo
+I6
+sVr
+I3
+sVu
+I32
+sVt
+I10
+sVv
+I2
+sVy
+I1
+sVx
+I1
+ssVc)
+p1964
+(dp1965
+V
+I1
+ssVbi
+p1966
+(dp1967
+Va
+I1
+sVd
+I8
+sVl
+I21
+sVn
+I3
+sVr
+I1
+sVt
+I5
+ssVg:
+p1968
+(dp1969
+V
+I4
+ssVa,
+p1970
+(dp1971
+V
+I23
+sV-
+I3
+ssVbt
+p1972
+(dp1973
+Va
+I3
+sV
+I12
+sVe
+I5
+sVf
+I6
+sVl
+I1
+sV,
+I1
+ssVbu
+p1974
+(dp1975
+Vg
+I1
+sVn
+I1
+sVs
+I9
+sVr
+I1
+sVt
+I194
+sVy
+I1
+ssVUn
+p1976
+(dp1977
+Vi
+I6
+sVd
+I1
+sVl
+I1
+sVf
+I1
+ssVLi
+p1978
+(dp1979
+Vt
+I1
+ssVbr
+p1980
+(dp1981
+Va
+I2
+sVi
+I10
+sVe
+I9
+sVo
+I38
+ssVbs
+p1982
+(dp1983
+Vi
+I2
+sVe
+I12
+sVt
+I2
+sVo
+I11
+ssVyf
+p1984
+(dp1985
+Vu
+I1
+ssVAN
+p1986
+(dp1987
+VY
+I2
+sV
+I23
+sVT
+I6
+ssVby
+p1988
+(dp1989
+Ve
+I1
+sV
+I147
+sV-
+I1
+sVt
+I1
+sV,
+I1
+ssVoo
+p1990
+(dp1991
+V!
+I1
+sV
+I32
+sVd
+I37
+sVf
+I5
+sVk
+I45
+sVm
+I24
+sVl
+I14
+sVn
+I38
+sVp
+I2
+sVs
+I6
+sVr
+I23
+sVt
+I1
+sV.
+I2
+sV,
+I7
+ssVon
+p1992
+(dp1993
+V!
+I5
+sV
+I482
+sV'
+I9
+sV-
+I3
+sV,
+I100
+sV/
+I1
+sV.
+I31
+sV;
+I23
+sV?
+I2
+sV]
+I2
+sVa
+I43
+sVc
+I41
+sVe
+I120
+sVd
+I67
+sVg
+I63
+sVf
+I23
+sVi
+I23
+sVj
+I2
+sVl
+I39
+sVo
+I9
+sVn
+I11
+sVq
+I3
+sVp
+I1
+sVs
+I127
+sVt
+I59
+sVv
+I50
+sVy
+I2
+ssVom
+p1994
+(dp1995
+Va
+I31
+sV
+I145
+sVe
+I140
+sVf
+I11
+sVi
+I21
+sVm
+I31
+sV,
+I5
+sVo
+I3
+sV.
+I11
+sVp
+I49
+sVy
+I1
+sV>
+I1
+ssVol
+p1996
+(dp1997
+Va
+I1
+sV
+I8
+sVe
+I39
+sVd
+I24
+sVi
+I9
+sVl
+I25
+sVo
+I11
+sV,
+I2
+sVs
+I1
+sVn
+I1
+sVu
+I20
+sVt
+I1
+sVv
+I11
+sVy
+I1
+sV:
+I1
+ssVok
+p1998
+(dp1999
+Vi
+I4
+sV
+I25
+sVs
+I9
+sVe
+I24
+sV.
+I1
+ssVoj
+p2000
+(dp2001
+Ve
+I28
+ssVoi
+p2002
+(dp2003
+Vc
+I13
+sVd
+I4
+sVg
+I1
+sVl
+I1
+sVn
+I44
+sVs
+I2
+sVt
+I1
+ssVoh
+p2004
+(dp2005
+Vi
+I1
+sVn
+I18
+ssVog
+p2006
+(dp2007
+Vi
+I4
+sVy
+I1
+sVr
+I4
+sVe
+I12
+sVn
+I1
+ssVof
+p2008
+(dp2009
+V
+I710
+sVe
+I4
+sVf
+I21
+sVi
+I4
+sV,
+I1
+sVo
+I3
+sV.
+I3
+sVr
+I2
+sVt
+I16
+sV;
+I1
+ssVoe
+p2010
+(dp2011
+Vs
+I21
+sVu
+I1
+sVv
+I1
+ssVod
+p2012
+(dp2013
+V!
+I1
+sV
+I31
+sVe
+I2
+sVd
+I2
+sVg
+I3
+sVi
+I3
+sV-
+I2
+sV,
+I3
+sVn
+I3
+sVu
+I8
+sVa
+I1
+sVy
+I3
+sV.
+I2
+ssVoc
+p2014
+(dp2015
+Va
+I3
+sVc
+I14
+sVe
+I6
+sVi
+I9
+sVk
+I2
+sVu
+I1
+ssVob
+p2016
+(dp2017
+Va
+I11
+sV
+I1
+sVb
+I1
+sVe
+I2
+sVj
+I8
+sVl
+I11
+sVo
+I2
+sVs
+I9
+sVt
+I3
+ssVoa
+p2018
+(dp2019
+Vc
+I5
+sVl
+I1
+ssVUR
+p2020
+(dp2021
+VP
+I1
+sVC
+I28
+sV
+I1
+ssVUM
+p2022
+(dp2023
+V
+I1
+sVB
+I1
+ssVga
+p2024
+(dp2025
+Vg
+I11
+sVi
+I44
+sVl
+I6
+sVn
+I5
+sVr
+I11
+sVt
+I3
+sVv
+I8
+sVy
+I1
+ssVUN
+p2026
+(dp2027
+VI
+I1
+sVD
+I2
+ssVH.
+p2028
+(dp2029
+V
+I1
+ssVoy
+p2030
+(dp2031
+Va
+I4
+sV
+I5
+sVe
+I2
+sVf
+I1
+sVi
+I2
+sVm
+I3
+ssVox
+p2032
+(dp2033
+V
+I1
+sV.
+I1
+ssVow
+p2034
+(dp2035
+Va
+I6
+sV
+I158
+sVe
+I75
+sV'
+I1
+sVi
+I16
+sV,
+I24
+sV.
+I3
+sVs
+I5
+sVn
+I90
+sV!
+I1
+sV;
+I2
+sV:
+I1
+sVl
+I6
+ssVov
+p2036
+(dp2037
+Vi
+I6
+sVa
+I6
+sVe
+I81
+sVo
+I8
+ssVou
+p2038
+(dp2039
+V!
+I2
+sV
+I271
+sVb
+I29
+sVd
+I2
+sVg
+I102
+sVl
+I199
+sVn
+I86
+sVs
+I92
+sVr
+I374
+sVt
+I80
+sV;
+I4
+sV.
+I11
+sV,
+I40
+sV?
+I1
+ssVot
+p2040
+(dp2041
+Va
+I6
+sV
+I297
+sVe
+I22
+sVi
+I17
+sVh
+I183
+sV*
+I1
+sV,
+I12
+sVo
+I1
+sV.
+I3
+sV)
+I1
+sVt
+I2
+sV;
+I1
+ssVos
+p2042
+(dp2043
+Va
+I2
+sVe
+I80
+sVi
+I21
+sVp
+I6
+sVs
+I43
+sVu
+I2
+sVt
+I63
+ssVor
+p2044
+(dp2045
+V
+I382
+sV)
+I1
+sV*
+I1
+sV,
+I11
+sV.
+I2
+sV;
+I2
+sV:
+I3
+sVa
+I4
+sVc
+I7
+sVb
+I8
+sVe
+I142
+sVd
+I56
+sVg
+I18
+sVi
+I10
+sVk
+I10
+sVm
+I43
+sVl
+I21
+sVo
+I4
+sVn
+I12
+sVs
+I13
+sVr
+I21
+sVt
+I100
+sVw
+I8
+sVy
+I15
+ssVUC
+p2046
+(dp2047
+VH
+I1
+ssVop
+p2048
+(dp2049
+V
+I2
+sVe
+I48
+sVi
+I19
+sVl
+I2
+sVo
+I6
+sVp
+I14
+sVr
+I7
+sVu
+I1
+sVt
+I2
+sVy
+I14
+ssV!!
+p2050
+(dp2051
+V
+I1
+ssV!
+p2052
+(dp2053
+VA
+I1
+sVC
+I2
+sVB
+I1
+sVD
+I1
+sVG
+I2
+sVF
+I3
+sVI
+I17
+sVH
+I5
+sVK
+I1
+sVM
+I3
+sVL
+I1
+sVO
+I1
+sVN
+I1
+sVP
+I1
+sVT
+I4
+sVW
+I3
+sVa
+I3
+sVb
+I4
+sVf
+I1
+sVi
+I1
+sVh
+I2
+sVj
+I1
+sVt
+I5
+ssVC
+p2054
+(dp2055
+VD
+I2
+sVo
+I1
+ssV**
+p2056
+(dp2057
+V
+I8
+sVE
+I1
+sVF
+I1
+sVI
+I1
+sV*
+I17
+sVS
+I2
+sVT
+I4
+sVW
+I1
+ssVh-
+p2058
+(dp2059
+V-
+I1
+ssVNo
+p2060
+(dp2061
+V
+I3
+sV;
+I1
+sVt
+I5
+sVw
+I1
+sV,
+I3
+ssV!)
+p2062
+(dp2063
+V
+I1
+ssVNa
+p2064
+(dp2065
+Vy
+I1
+ssV!*
+p2066
+(dp2067
+V
+I1
+sV*
+I1
+ssVNe
+p2068
+(dp2069
+Vi
+I1
+sVv
+I1
+ssVh.
+p2070
+(dp2071
+V
+I13
+sV"
+I1
+ssV[E
+p2072
+(dp2073
+Vt
+I1
+ssV[D
+p2074
+(dp2075
+Va
+I1
+ssVh
+p2076
+(dp2077
+V/
+I1
+sV2
+I1
+sV8
+I1
+sVC
+I2
+sVF
+I2
+sVI
+I35
+sVH
+I1
+sVM
+I9
+sVL
+I6
+sVS
+I2
+sVR
+I8
+sVa
+I100
+sVc
+I10
+sVb
+I6
+sVe
+I8
+sVd
+I6
+sVg
+I7
+sVf
+I12
+sVi
+I25
+sVh
+I68
+sVk
+I2
+sVj
+I2
+sVm
+I51
+sVl
+I7
+sVo
+I35
+sVn
+I4
+sVp
+I15
+sVs
+I28
+sVr
+I6
+sVu
+I4
+sVt
+I65
+sVw
+I26
+sVv
+I1
+sVy
+I19
+ssVh!
+p2078
+(dp2079
+V
+I1
+sV"
+I1
+ssVh'
+p2080
+(dp2081
+Vs
+I4
+ssV[M
+p2082
+(dp2083
+Va
+I1
+ssVeh
+p2084
+(dp2085
+Va
+I19
+sVi
+I1
+sVe
+I7
+ssVNI
+p2086
+(dp2087
+VT
+I2
+ssV"a
+p2088
+(dp2089
+Vs
+I1
+ssV.,
+p2090
+(dp2091
+V
+I18
+ssVek
+p2092
+(dp2093
+V
+I5
+sVs
+I6
+sV,
+I2
+sV.
+I1
+ssVu;
+p2094
+(dp2095
+V
+I4
+ssV[t
+p2096
+(dp2097
+Vr
+I1
+sVo
+I2
+ssV.
+p2098
+(dp2099
+V
+I27
+sV"
+I13
+sV.
+I4
+sVA
+I30
+sVC
+I10
+sVB
+I16
+sVE
+I4
+sVD
+I33
+sVG
+I2
+sVF
+I16
+sVI
+I209
+sVH
+I69
+sVK
+I2
+sVJ
+I34
+sVM
+I51
+sVL
+I21
+sVO
+I9
+sVN
+I9
+sVP
+I7
+sVS
+I61
+sVR
+I7
+sVU
+I2
+sVT
+I45
+sVW
+I33
+sVV
+I73
+sVY
+I23
+sVa
+I2
+sVb
+I1
+sVi
+I1
+sVw
+I2
+ssVNA
+p2100
+(dp2101
+VL
+I3
+ssVNB
+p2102
+(dp2103
+VE
+I7
+ssV[x
+p2104
+(dp2105
+Vx
+I1
+ssVND
+p2106
+(dp2107
+VI
+I1
+sV
+I1
+sV*
+I2
+sVE
+I5
+sV,
+I1
+ssVNE
+p2108
+(dp2109
+V
+I7
+sVD
+I1
+sVG
+I1
+sVS
+I1
+sVW
+I1
+sVY
+I1
+ssVNG
+p2110
+(dp2111
+V
+I2
+ssVNY
+p2112
+(dp2113
+V
+I2
+ssVu.
+p2114
+(dp2115
+V
+I13
+ssV[g
+p2116
+(dp2117
+Ve
+I1
+ssVrw
+p2118
+(dp2119
+Va
+I14
+sVi
+I4
+ssVMO
+p2120
+(dp2121
+VN
+I1
+ssV.2
+p2122
+(dp2123
+V9
+I1
+ssVNS
+p2124
+(dp2125
+V
+I2
+sVE
+I1
+sVO
+I17
+ssVNT
+p2126
+(dp2127
+V!
+I2
+sVA
+I2
+sV
+I1
+sVI
+I3
+sV*
+I1
+sVR
+I1
+sVY
+I2
+ssVNU
+p2128
+(dp2129
+VM
+I1
+ssVhy
+p2130
+(dp2131
+V
+I13
+sVs
+I2
+sV,
+I4
+sVp
+I2
+ssVN,
+p2132
+(dp2133
+V
+I1
+ssV-t
+p2134
+(dp2135
+Vi
+I2
+sVh
+I4
+sVm
+I4
+sVo
+I1
+sVw
+I1
+ssVN.
+p2136
+(dp2137
+V
+I19
+ssVhr
+p2138
+(dp2139
+Vi
+I2
+sVu
+I3
+sVe
+I9
+sVo
+I8
+ssVhs
+p2140
+(dp2141
+V
+I9
+sV,
+I1
+ssVg-
+p2142
+(dp2143
+Vh
+I1
+sVr
+I6
+sV-
+I4
+ssVka
+p2144
+(dp2145
+Vb
+I2
+ssVht
+p2146
+(dp2147
+V
+I90
+sVe
+I50
+sVf
+I7
+sVi
+I1
+sV,
+I12
+sV.
+I3
+sVs
+I5
+sV;
+I1
+sVl
+I1
+ssVhu
+p2148
+(dp2149
+Vs
+I21
+sVr
+I54
+sVm
+I9
+sVt
+I2
+sVn
+I5
+ssVTP
+p2150
+(dp2151
+V
+I2
+ssVhh
+p2152
+(dp2153
+Vi
+I46
+sVe
+I1
+ssVhi
+p2154
+(dp2155
+Vc
+I117
+sVb
+I1
+sVe
+I3
+sVg
+I13
+sVm
+I153
+sVl
+I85
+sVo
+I3
+sVn
+I149
+sVp
+I20
+sVs
+I283
+sVr
+I5
+sVt
+I13
+sVv
+I2
+ssVhn
+p2156
+(dp2157
+Vs
+I18
+sVe
+I1
+ssVho
+p2158
+(dp2159
+V
+I30
+sVc
+I1
+sVe
+I1
+sVd
+I1
+sVi
+I5
+sVm
+I30
+sVl
+I23
+sVo
+I15
+sVn
+I10
+sVp
+I29
+sVs
+I37
+sVr
+I30
+sVu
+I184
+sVw
+I78
+sV,
+I7
+ssVhl
+p2160
+(dp2161
+Vy
+I14
+sVe
+I1
+ssVhm
+p2162
+(dp2163
+Ve
+I19
+ssVhb
+p2164
+(dp2165
+Vo
+I1
+ssVD*
+p2166
+(dp2167
+V
+I1
+sVT
+I1
+ssVha
+p2168
+(dp2169
+Ve
+I2
+sVd
+I97
+sVk
+I1
+sVm
+I3
+sVl
+I67
+sVn
+I85
+sVp
+I47
+sVs
+I113
+sVr
+I47
+sVt
+I403
+sVv
+I281
+sVz
+I1
+ssVhf
+p2170
+(dp2171
+Vu
+I4
+ssVs?
+p2172
+(dp2173
+V
+I2
+sV"
+I2
+ssVhe
+p2174
+(dp2175
+Va
+I67
+sV
+I1028
+sVc
+I2
+sVe
+I4
+sVd
+I53
+sVi
+I20
+sV-
+I1
+sVm
+I35
+sVl
+I13
+sVn
+I102
+sVs
+I28
+sVr
+I827
+sVt
+I9
+sVy
+I29
+sV;
+I1
+sV.
+I1
+sV,
+I10
+ssV[3
+p2176
+(dp2177
+V]
+I2
+ssV[2
+p2178
+(dp2179
+V]
+I3
+ssV[1
+p2180
+(dp2181
+V0
+I1
+sV]
+I3
+ssV-w
+p2182
+(dp2183
+Va
+I1
+sVe
+I1
+ssVuy
+p2184
+(dp2185
+V
+I1
+ssV*S
+p2186
+(dp2187
+VT
+I2
+ssVXV
+p2188
+(dp2189
+VI
+I8
+sV
+I3
+sVl
+I1
+ssVut
+p2190
+(dp2191
+Va
+I3
+sV
+I265
+sVe
+I51
+sVi
+I22
+sVh
+I13
+sVm
+I3
+sV,
+I11
+sV.
+I1
+sVu
+I4
+sVt
+I2
+sVy
+I14
+sV;
+I1
+ssVgy
+p2192
+(dp2193
+V
+I1
+sV,
+I1
+ssV.c
+p2194
+(dp2195
+Vs
+I1
+sVo
+I1
+ssVup
+p2196
+(dp2197
+V
+I14
+sVe
+I11
+sVd
+I1
+sVi
+I3
+sV,
+I3
+sVo
+I5
+sV.
+I1
+sVp
+I21
+sVs
+I2
+sVr
+I1
+sVu
+I1
+sVt
+I4
+ssVus
+p2198
+(dp2199
+Va
+I84
+sV
+I70
+sVb
+I17
+sVe
+I79
+sVi
+I27
+sVh
+I3
+sV,
+I10
+sVn
+I10
+sVp
+I9
+sVs
+I2
+sVu
+I4
+sVt
+I136
+sVy
+I7
+sV;
+I1
+sV.
+I5
+sVl
+I7
+ssVur
+p2200
+(dp2201
+Va
+I32
+sV
+I238
+sVc
+I75
+sVb
+I2
+sVe
+I122
+sVg
+I10
+sV@
+I1
+sVi
+I14
+sVh
+I1
+sV,
+I5
+sVn
+I33
+sVp
+I13
+sVs
+I79
+sVr
+I5
+sV!
+I1
+sVt
+I9
+sVv
+I1
+sVy
+I1
+sV;
+I2
+sV.
+I6
+ssVum
+p2202
+(dp2203
+Va
+I2
+sV
+I3
+sVb
+I7
+sVe
+I2
+sVi
+I3
+sVm
+I9
+sV,
+I2
+sVo
+I3
+sVp
+I3
+sVs
+I10
+ssVul
+p2204
+(dp2205
+Va
+I37
+sV
+I33
+sVe
+I3
+sVd
+I198
+sVg
+I5
+sVi
+I3
+sVl
+I18
+sVo
+I5
+sV.
+I5
+sVs
+I1
+sV!
+I1
+sVt
+I12
+sVy
+I1
+sV;
+I1
+sVn
+I1
+sV,
+I2
+ssV.z
+p2206
+(dp2207
+Vi
+I1
+ssVun
+p2208
+(dp2209
+Va
+I16
+sV
+I5
+sVc
+I24
+sVe
+I23
+sVd
+I66
+sVg
+I29
+sVf
+I5
+sVi
+I27
+sVh
+I10
+sVk
+I6
+sVm
+I1
+sVl
+I6
+sVn
+I5
+sVp
+I4
+sVs
+I3
+sVr
+I1
+sVu
+I1
+sVt
+I47
+sVw
+I5
+sV.
+I1
+ssVui
+p2210
+(dp2211
+Va
+I1
+sVc
+I1
+sVe
+I4
+sVl
+I6
+sVn
+I6
+sVp
+I1
+sVs
+I9
+sVr
+I15
+sVu
+I1
+sVt
+I28
+sVv
+I4
+ssVue
+p2212
+(dp2213
+V
+I21
+sVd
+I12
+sVl
+I2
+sV.
+I1
+sVs
+I24
+sVt
+I5
+sVn
+I22
+sV,
+I4
+ssVud
+p2214
+(dp2215
+V
+I1
+sVe
+I29
+sVd
+I5
+sVg
+I14
+sVi
+I9
+sV.
+I1
+ssVug
+p2216
+(dp2217
+V
+I1
+sVl
+I1
+sVg
+I3
+sVh
+I150
+ssV.s
+p2218
+(dp2219
+Ve
+I1
+ssV.t
+p2220
+(dp2221
+Vy
+I1
+sVx
+I3
+ssV.u
+p2222
+(dp2223
+Vi
+I1
+ssVuc
+p2224
+(dp2225
+Va
+I8
+sVc
+I5
+sVe
+I10
+sVi
+I1
+sVh
+I123
+sVk
+I9
+sV.
+I1
+sVt
+I21
+ssVub
+p2226
+(dp2227
+Vb
+I4
+sVd
+I5
+sVj
+I13
+sVm
+I9
+sVl
+I10
+sVs
+I3
+sVt
+I22
+ssVac
+p2228
+(dp2229
+Va
+I2
+sV
+I1
+sVc
+I45
+sVe
+I37
+sVi
+I4
+sVh
+I55
+sVk
+I8
+sVq
+I16
+sVr
+I5
+sVu
+I2
+sVt
+I59
+sVy
+I12
+ssVab
+p2230
+(dp2231
+Vi
+I16
+sVh
+I3
+sVj
+I1
+sVl
+I128
+sVo
+I33
+sVs
+I15
+sVu
+I1
+ssVae
+p2232
+(dp2233
+Vl
+I2
+ssVad
+p2234
+(dp2235
+Va
+I4
+sV
+I117
+sVe
+I50
+sVd
+I12
+sVf
+I5
+sVi
+I12
+sVm
+I14
+sV,
+I3
+sVo
+I2
+sVn
+I1
+sVs
+I2
+sVu
+I2
+sVv
+I23
+sVy
+I109
+sV.
+I1
+sVl
+I1
+ssVag
+p2236
+(dp2237
+Va
+I38
+sVe
+I79
+sVg
+I3
+sVi
+I16
+sVo
+I8
+sVr
+I18
+sVu
+I3
+ssVaf
+p2238
+(dp2239
+Vr
+I9
+sVe
+I3
+sVt
+I18
+sVf
+I59
+ssVai
+p2240
+(dp2241
+Vd
+I39
+sVg
+I1
+sVm
+I10
+sVl
+I11
+sVn
+I178
+sVs
+I6
+sVr
+I22
+sVt
+I10
+ssVak
+p2242
+(dp2243
+Va
+I1
+sV
+I15
+sVe
+I97
+sVf
+I5
+sVi
+I19
+sVn
+I1
+sVs
+I3
+ssVTu
+p2244
+(dp2245
+Ve
+I2
+ssVam
+p2246
+(dp2247
+Va
+I5
+sV
+I121
+sVb
+I2
+sVe
+I110
+sVi
+I33
+sVm
+I6
+sV,
+I9
+sVo
+I3
+sVp
+I7
+sVu
+I5
+ssVal
+p2248
+(dp2249
+Va
+I5
+sV
+I91
+sVc
+I3
+sVe
+I15
+sVd
+I78
+sVf
+I8
+sVi
+I12
+sVk
+I12
+sVm
+I13
+sVl
+I277
+sVo
+I24
+sV.
+I5
+sVs
+I9
+sVr
+I8
+sVu
+I4
+sVt
+I25
+sVw
+I27
+sVy
+I1
+sV,
+I12
+ssVao
+p2250
+(dp2251
+Vr
+I4
+ssVan
+p2252
+(dp2253
+V!
+I2
+sV
+I307
+sV'
+I17
+sV,
+I35
+sV.
+I9
+sV;
+I7
+sV:
+I1
+sVa
+I12
+sVc
+I83
+sVe
+I8
+sVd
+I717
+sVg
+I50
+sVi
+I17
+sVk
+I7
+sVl
+I2
+sVo
+I13
+sVn
+I67
+sVq
+I5
+sVs
+I25
+sVt
+I68
+sVw
+I4
+sVv
+I1
+sVy
+I103
+sVx
+I12
+ssVTo
+p2254
+(dp2255
+V
+I11
+sV-
+I1
+ssVas
+p2256
+(dp2257
+Va
+I3
+sV
+I521
+sVc
+I4
+sVe
+I28
+sVi
+I32
+sVh
+I7
+sVk
+I9
+sV,
+I3
+sVo
+I28
+sV.
+I1
+sVp
+I1
+sVs
+I45
+sV!
+I1
+sVu
+I21
+sVt
+I76
+sVy
+I13
+sV;
+I1
+ssVar
+p2258
+(dp2259
+Va
+I35
+sV
+I114
+sVc
+I15
+sVb
+I1
+sVe
+I138
+sVd
+I69
+sVg
+I6
+sVf
+I2
+sVi
+I67
+sVk
+I16
+sVm
+I21
+sVl
+I28
+sVo
+I2
+sVn
+I16
+sVs
+I31
+sVr
+I80
+sVt
+I121
+sVy
+I31
+sV;
+I1
+sV.
+I2
+sV,
+I4
+ssVau
+p2260
+(dp2261
+Vc
+I1
+sVd
+I2
+sVg
+I47
+sVl
+I6
+sVn
+I10
+sVs
+I20
+sVt
+I12
+ssVat
+p2262
+(dp2263
+Va
+I1
+sV
+I560
+sVc
+I15
+sVe
+I176
+sV'
+I1
+sVi
+I215
+sVh
+I45
+sV,
+I12
+sVo
+I3
+sVl
+I4
+sVr
+I2
+sVu
+I27
+sVt
+I87
+sVy
+I1
+sV;
+I1
+sV.
+I1
+ssVTh
+p2264
+(dp2265
+Va
+I4
+sVe
+I47
+sVi
+I16
+sVo
+I3
+sVr
+I2
+sVu
+I4
+ssVTi
+p2266
+(dp2267
+Vm
+I1
+ssVay
+p2268
+(dp2269
+Va
+I1
+sV
+I140
+sVe
+I5
+sV'
+I1
+sVi
+I7
+sV,
+I16
+sV.
+I11
+sVs
+I43
+sV;
+I8
+ssVax
+p2270
+(dp2271
+V
+I2
+sVe
+I2
+ssVTe
+p2272
+(dp2273
+Vx
+I1
+sVl
+I1
+ssV80
+p2274
+(dp2275
+V0
+I1
+sV
+I1
+ssVAf
+p2276
+(dp2277
+Vt
+I3
+ssV(a
+p2278
+(dp2279
+V
+I1
+sVs
+I3
+sVt
+I1
+sVn
+I2
+ssVni
+p2280
+(dp2281
+Va
+I2
+sVc
+I11
+sVe
+I18
+sVg
+I9
+sVf
+I2
+sVl
+I1
+sVo
+I26
+sVn
+I50
+sVs
+I24
+sVu
+I1
+sVt
+I24
+sVv
+I5
+ssVnj
+p2282
+(dp2283
+Vu
+I8
+sVe
+I2
+sVo
+I5
+ssVnk
+p2284
+(dp2285
+V
+I27
+sVe
+I1
+sVf
+I1
+sVi
+I9
+sV,
+I7
+sVs
+I4
+ssVnl
+p2286
+(dp2287
+Vy
+I56
+sVa
+I1
+sVi
+I1
+sVu
+I5
+sVe
+I2
+ssVnw
+p2288
+(dp2289
+Va
+I46
+sVh
+I4
+sVe
+I2
+sVi
+I2
+sVo
+I1
+ssVnn
+p2290
+(dp2291
+Vi
+I6
+sVe
+I42
+sVu
+I1
+sVo
+I42
+ssVno
+p2292
+(dp2293
+V
+I72
+sVc
+I2
+sVb
+I1
+sVe
+I1
+sVf
+I1
+sVi
+I1
+sVm
+I3
+sVn
+I70
+sVs
+I1
+sVr
+I20
+sVu
+I29
+sVt
+I345
+sVw
+I134
+ssV46
+p2294
+(dp2295
+V]
+I1
+ssVna
+p2296
+(dp2297
+Vc
+I2
+sVb
+I19
+sVd
+I1
+sVm
+I7
+sVl
+I99
+sVn
+I12
+sVr
+I7
+sVt
+I67
+sVv
+I1
+sVy
+I1
+ssVnb
+p2298
+(dp2299
+Ve
+I15
+ssVnc
+p2300
+(dp2301
+Ve
+I223
+sVi
+I15
+sVh
+I3
+sVl
+I34
+sVo
+I18
+sVr
+I7
+sVu
+I4
+sVt
+I2
+sVy
+I12
+ssVnd
+p2302
+(dp2303
+Va
+I7
+sV
+I775
+sV"
+I1
+sVe
+I127
+sV'
+I5
+sVi
+I35
+sV-
+I3
+sV,
+I34
+sVo
+I26
+sVn
+I8
+sVs
+I43
+sVr
+I3
+sVu
+I26
+sV;
+I6
+sV.
+I7
+sV?
+I1
+sVl
+I3
+ssVne
+p2304
+(dp2305
+V
+I94
+sV'
+I2
+sV,
+I25
+sV.
+I10
+sV;
+I5
+sV?
+I3
+sVa
+I11
+sVc
+I31
+sVe
+I9
+sVd
+I71
+sVg
+I9
+sVf
+I3
+sVi
+I6
+sVm
+I3
+sVo
+I2
+sVn
+I4
+sVq
+I1
+sVs
+I91
+sVr
+I47
+sVt
+I5
+sVw
+I14
+sVv
+I44
+sVy
+I13
+sVx
+I18
+ssVnf
+p2306
+(dp2307
+Va
+I2
+sVe
+I9
+sVi
+I16
+sVl
+I11
+sVo
+I19
+sVr
+I1
+sVu
+I7
+ssVng
+p2308
+(dp2309
+Va
+I12
+sV
+I609
+sV!
+I1
+sVe
+I40
+sV'
+I7
+sVf
+I19
+sVi
+I4
+sV-
+I11
+sVl
+I11
+sVo
+I1
+sV.
+I22
+sVs
+I47
+sVr
+I14
+sVu
+I9
+sVt
+I11
+sV;
+I10
+sV:
+I4
+sV,
+I39
+sV?
+I3
+ssVTN
+p2310
+(dp2311
+VE
+I1
+ssVny
+p2312
+(dp2313
+V
+I80
+sVb
+I1
+sV)
+I2
+sVm
+I1
+sV,
+I1
+sVo
+I7
+sV.
+I2
+sVt
+I12
+sVw
+I1
+ssVnz
+p2314
+(dp2315
+Va
+I2
+ssVTM
+p2316
+(dp2317
+VA
+I1
+sV
+I1
+ssVTH
+p2318
+(dp2319
+VI
+I2
+sVA
+I2
+sVE
+I20
+sV.
+I1
+ssVTI
+p2320
+(dp2321
+VA
+I1
+sVC
+I2
+sVE
+I2
+sVO
+I2
+sVV
+I1
+ssVnp
+p2322
+(dp2323
+Vr
+I2
+sVl
+I3
+ssVnq
+p2324
+(dp2325
+Vu
+I11
+ssVnr
+p2326
+(dp2327
+Va
+I3
+sVi
+I1
+sVe
+I1
+ssVTE
+p2328
+(dp2329
+VX
+I6
+sVR
+I1
+sVD
+I3
+sVN
+I8
+ssVnt
+p2330
+(dp2331
+Va
+I29
+sV
+I220
+sVe
+I113
+sVf
+I1
+sVi
+I95
+sVh
+I18
+sVm
+I8
+sV,
+I45
+sVo
+I22
+sV.
+I29
+sVs
+I33
+sVr
+I34
+sV!
+I9
+sVy
+I3
+sVu
+I1
+sV;
+I12
+sV?
+I1
+sVl
+I30
+ssVHu
+p2332
+(dp2333
+Vr
+I1
+sVm
+I2
+sVn
+I1
+ssVnv
+p2334
+(dp2335
+Vi
+I39
+sVa
+I2
+sVe
+I26
+sVy
+I1
+ssVTA
+p2336
+(dp2337
+VB
+I1
+sVR
+I2
+sVL
+I1
+ssVa
+p2338
+(dp2339
+V"
+I1
+sVE
+I1
+sVD
+I1
+sVM
+I1
+sVP
+I1
+sVU
+I1
+sVV
+I2
+sVa
+I4
+sVc
+I25
+sVb
+I6
+sVe
+I1
+sVd
+I28
+sVg
+I16
+sVf
+I29
+sVi
+I9
+sVh
+I18
+sVk
+I3
+sVj
+I1
+sVm
+I41
+sVl
+I29
+sVo
+I7
+sVn
+I4
+sVq
+I1
+sVp
+I18
+sVs
+I41
+sVr
+I18
+sVu
+I1
+sVt
+I14
+sVw
+I30
+sVv
+I13
+sVy
+I9
+ssVAC
+p2340
+(dp2341
+VH
+I1
+sVT
+I1
+ssVAB
+p2342
+(dp2343
+VI
+I2
+sVO
+I1
+ssV's
+p2344
+(dp2345
+V
+I115
+sV,
+I3
+sV.
+I2
+ssVAD
+p2346
+(dp2347
+VY
+I35
+sV
+I1
+sVE
+I1
+sV,
+I1
+ssVAG
+p2348
+(dp2349
+VE
+I3
+ssVE,
+p2350
+(dp2351
+V
+I2
+ssVAI
+p2352
+(dp2353
+VM
+I1
+sVL
+I1
+sVN
+I2
+ssVxu
+p2354
+(dp2355
+Vl
+I1
+ssVAM
+p2356
+(dp2357
+VA
+I3
+sVE
+I4
+ssVAL
+p2358
+(dp2359
+VI
+I5
+sV
+I1
+sVL
+I2
+sVD
+I3
+sV,
+I1
+ssVa.
+p2360
+(dp2361
+V
+I2
+sVt
+I1
+ssVy:
+p2362
+(dp2363
+V
+I1
+ssVT,
+p2364
+(dp2365
+V
+I2
+ssVAR
+p2366
+(dp2367
+V
+I2
+sVR
+I4
+sVE
+I2
+sVT
+I3
+ssVT*
+p2368
+(dp2369
+V
+I2
+sV*
+I2
+ssVAT
+p2370
+(dp2371
+V
+I2
+sV:
+I1
+sVT
+I1
+sVH
+I8
+ssVAV
+p2372
+(dp2373
+VE
+I2
+sVO
+I1
+ssVAY
+p2374
+(dp2375
+V
+I1
+ssVa;
+p2376
+(dp2377
+V
+I3
+ssV-s
+p2378
+(dp2379
+Vi
+I1
+sVa
+I1
+sVu
+I2
+sVh
+I1
+ssVg!
+p2380
+(dp2381
+V
+I1
+ssVT
+p2382
+(dp2383
+VG
+I8
+sVP
+I1
+sVf
+I1
+sVI
+I3
+sVH
+I1
+sVM
+I1
+sVL
+I2
+sVO
+I1
+sVN
+I3
+sVp
+I2
+sVm
+I1
+sVi
+I1
+sVd
+I1
+ssVT!
+p2384
+(dp2385
+V
+I1
+sV*
+I1
+ssV"o
+p2386
+(dp2387
+Vr
+I1
+sVn
+I1
+ssVn*
+p2388
+(dp2389
+V*
+I2
+ssV'T
+p2390
+(dp2391
+V
+I1
+ssVn,
+p2392
+(dp2393
+V
+I182
+sV"
+I1
+ssVAd
+p2394
+(dp2395
+Vi
+I8
+ssVn.
+p2396
+(dp2397
+V
+I68
+sV"
+I3
+ssVn/
+p2398
+(dp2399
+VC
+I1
+ssVn
+p2400
+(dp2401
+V"
+I1
+sV/
+I1
+sV1
+I1
+sV3
+I1
+sV2
+I1
+sV5
+I1
+sV9
+I1
+sVA
+I2
+sVE
+I7
+sVF
+I4
+sVI
+I30
+sVK
+I1
+sVM
+I8
+sVL
+I13
+sVS
+I5
+sVR
+I3
+sVU
+I4
+sVT
+I3
+sVW
+I3
+sVV
+I2
+sV[
+I1
+sVa
+I154
+sVc
+I31
+sVb
+I51
+sVe
+I50
+sVd
+I26
+sVg
+I19
+sVf
+I52
+sVi
+I87
+sVh
+I109
+sVk
+I5
+sVj
+I3
+sVm
+I91
+sVl
+I19
+sVo
+I127
+sVn
+I14
+sVp
+I31
+sVs
+I77
+sVr
+I24
+sVu
+I21
+sVt
+I254
+sVw
+I88
+sVv
+I10
+sVy
+I41
+ssVn!
+p2402
+(dp2403
+V
+I8
+sV"
+I1
+ssVn"
+p2404
+(dp2405
+V
+I1
+ssVTR
+p2406
+(dp2407
+VI
+I2
+sVA
+I1
+ssVAm
+p2408
+(dp2409
+V
+I1
+sVo
+I3
+ssVAl
+p2410
+(dp2411
+Vi
+I9
+sVl
+I5
+ssVn'
+p2412
+(dp2413
+Vs
+I26
+sVt
+I1
+ssVn:
+p2414
+(dp2415
+V
+I4
+ssVn;
+p2416
+(dp2417
+V
+I39
+ssVAu
+p2418
+(dp2419
+Vs
+I6
+ssVAt
+p2420
+(dp2421
+V
+I11
+ssVAw
+p2422
+(dp2423
+Va
+I1
+ssVn?
+p2424
+(dp2425
+V
+I3
+ssVn1
+p2426
+(dp2427
+V1
+I1
+sV0
+I3
+ssVG"
+p2428
+(dp2429
+V
+I1
+sssb.
\ No newline at end of file
Deleted: trunk/lib/venus/examples/filters/guess-language/fr.data
===================================================================
--- branches/sucs-site/lib/venus/examples/filters/guess-language/fr.data 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/lib/venus/examples/filters/guess-language/fr.data 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,22710 +0,0 @@
-(itrigram
-Trigram
-p1
-(dp2
-S'length'
-p3
-F8394.978022603751
-sS'lut'
-p4
-(dp5
-V-D
-p6
-(dp7
-Va
-I3
-ssVG"
-p8
-(dp9
-V
-I2
-ssVG
-p10
-(dp11
-Va
-I1
-sVB
-I2
-ssVG-
-p12
-(dp13
-Vt
-I5
-sVT
-I1
-ssVGU
-p14
-(dp15
-VT
-I8
-ssVGR
-p16
-(dp17
-VÂ
-I1
-ssVGE
-p18
-(dp19
-VS
-I3
-sVN
-I1
-ssVGL
-p20
-(dp21
-VI
-I1
-ssVGI
-p22
-(dp23
-VV
-I1
-ssVGu
-p24
-(dp25
-Vi
-I1
-sVt
-I26
-ssVGr
-p26
-(dp27
-Va
-I5
-sVe
-I1
-ssVGe
-p28
-(dp29
-Vr
-I1
-sVo
-I1
-sVn
-I3
-ssVGa
-p30
-(dp31
-Vr
-I1
-sVu
-I2
-sVl
-I1
-sVï
-I1
-ssVGo
-p32
-(dp33
-Va
-I1
-ssVGi
-p34
-(dp35
-Vr
-I9
-sVv
-I1
-ssVZ,
-p36
-(dp37
-V
-I1
-ssVZ
-p38
-(dp39
-VL
-I1
-ssVèr
-p40
-(dp41
-Ve
-I319
-ssVès
-p42
-(dp43
-V
-I148
-sVe
-I2
-sV-
-I2
-sV,
-I3
-sV;
-I1
-sV_
-I1
-ssVèq
-p44
-(dp45
-Vu
-I4
-ssVèv
-p46
-(dp47
-Vr
-I2
-sVe
-I4
-ssVèt
-p48
-(dp49
-Vr
-I1
-sVe
-I9
-ssVèn
-p50
-(dp51
-Ve
-I24
-ssVèl
-p52
-(dp53
-Ve
-I7
-ssVèm
-p54
-(dp55
-Ve
-I30
-ssVèc
-p56
-(dp57
-Vh
-I2
-sVe
-I23
-sVl
-I14
-ssVèg
-p58
-(dp59
-Vr
-I8
-sVe
-I7
-sVl
-I1
-ssVèd
-p60
-(dp61
-Ve
-I4
-ssV-c
-p62
-(dp63
-Vi
-I14
-sVh
-I6
-sVe
-I16
-sVo
-I2
-ssVty
-p64
-(dp65
-Va
-I1
-sV
-I9
-sVr
-I2
-sVl
-I1
-sV,
-I1
-ssVZa
-p66
-(dp67
-Vm
-I1
-ssVtw
-p68
-(dp69
-Va
-I3
-sVo
-I1
-ssV-o
-p70
-(dp71
-Vf
-I1
-sVn
-I7
-ssV-n
-p72
-(dp73
-Ve
-I1
-sVo
-I15
-ssVàt
-p74
-(dp75
-Ve
-I1
-ssV-i
-p76
-(dp77
-V8
-I1
-sVl
-I83
-sVn
-I5
-ssV«M
-p78
-(dp79
-Vo
-I1
-ssV-h
-p80
-(dp81
-Ve
-I1
-sVu
-I1
-sVo
-I3
-ssVtq
-p82
-(dp83
-Vu
-I1
-ssVm'
-p84
-(dp85
-Va
-I46
-sVe
-I12
-sVé
-I7
-sVh
-I1
-sVo
-I6
-sVi
-I2
-sVy
-I1
-ssVm
-p86
-(dp87
-Va
-I7
-sVà
-I1
-sVc
-I2
-sVb
-I1
-sVe
-I6
-sVd
-I10
-sVi
-I2
-sV(
-I2
-sVl
-I1
-sVo
-I3
-sVq
-I1
-sVp
-I2
-sVs
-I1
-sVr
-I1
-sVt
-I3
-ssV-t
-p88
-(dp89
-Ve
-I23
-sVh
-I1
-sV-
-I20
-sVm
-I6
-sVr
-I12
-sVu
-I4
-ssVm,
-p90
-(dp91
-V
-I9
-ssVm.
-p92
-(dp93
-V
-I9
-ssVm)
-p94
-(dp95
-V,
-I1
-sV.
-I1
-ssV-w
-p96
-(dp97
-Vi
-I1
-ssV"l
-p98
-(dp99
-Ve
-I1
-ssVtm
-p100
-(dp101
-V
-I5
-sV"
-I1
-sVl
-I2
-ssV9]
-p102
-(dp103
-V
-I2
-ssVm>
-p104
-(dp105
-V
-I1
-ssVm:
-p106
-(dp107
-V
-I2
-ssV9,
-p108
-(dp109
-V
-I8
-ssV9.
-p110
-(dp111
-V
-I5
-ssV9
-p112
-(dp113
-VU
-I1
-sVD
-I1
-ssV-r
-p114
-(dp115
-Va
-I2
-sVo
-I1
-ssV99
-p116
-(dp117
-V
-I1
-sV,
-I1
-sV1
-I1
-sV4
-I1
-sV7
-I1
-sV9
-I1
-sV8
-I1
-ssV98
-p118
-(dp119
-V
-I1
-sV,
-I1
-ssV9:
-p120
-(dp121
-V
-I1
-ssV91
-p122
-(dp123
-V
-I2
-ssV90
-p124
-(dp125
-V
-I2
-sV0
-I1
-ssVm_
-p126
-(dp127
-V,
-I2
-sV.
-I1
-ssV92
-p128
-(dp129
-V,
-I2
-ssV95
-p130
-(dp131
-V,
-I1
-ssV94
-p132
-(dp133
-V
-I2
-sV,
-I2
-ssV97
-p134
-(dp135
-V1
-I2
-sV
-I1
-sV;
-I1
-sV,
-I1
-ssV96
-p136
-(dp137
-V,
-I3
-ssVme
-p138
-(dp139
-V!
-I1
-sV
-I462
-sV-
-I4
-sV,
-I44
-sV.
-I16
-sV;
-I11
-sV:
-I5
-sV?
-I1
-sV[
-I3
-sV_
-I4
-sVa
-I2
-sVd
-I11
-sVi
-I20
-sVm
-I4
-sVl
-I1
-sVo
-I1
-sVn
-I379
-sVs
-I187
-sVr
-I54
-sVu
-I27
-sVt
-I48
-sVz
-I6
-ssV«
-p140
-(dp141
-VQ
-I1
-sV.
-I1
-ssVma
-p142
-(dp143
-Vî
-I46
-sV
-I59
-sV-
-I1
-sV,
-I3
-sVc
-I7
-sVb
-I4
-sVe
-I2
-sVd
-I67
-sVg
-I25
-sVi
-I262
-sVk
-I3
-sVj
-I14
-sVm
-I1
-sVl
-I72
-sVï
-I1
-sVn
-I185
-sVs
-I17
-sVr
-I70
-sVu
-I22
-sVt
-I39
-sVy
-I23
-sVx
-I3
-ssVmb
-p144
-(dp145
-Va
-I34
-sV
-I2
-sVe
-I25
-sVi
-I11
-sVè
-I1
-sVl
-I39
-sVo
-I88
-sV.
-I1
-sVé
-I1
-sVr
-I40
-ssVmm
-p146
-(dp147
-Va
-I26
-sVe
-I313
-sVé
-I9
-sVè
-I4
-sVo
-I9
-sVi
-I5
-sVu
-I13
-ssVml
-p148
-(dp149
-V
-I2
-sVe
-I1
-ssVmo
-p150
-(dp151
-Ve
-I7
-sVd
-I17
-sVi
-I197
-sVm
-I16
-sVl
-I4
-sVn
-I286
-sVq
-I3
-sVs
-I8
-sVr
-I57
-sVu
-I77
-sVt
-I20
-sVv
-I3
-sVy
-I4
-sV.
-I1
-ssVmn
-p152
-(dp153
-Vé
-I2
-sVi
-I2
-sVa
-I1
-sVo
-I1
-ssVmi
-p154
-(dp155
-V
-I15
-sVe
-I53
-sVd
-I4
-sVg
-I1
-sVè
-I20
-sV-
-I1
-sVl
-I85
-sVn
-I36
-sVq
-I1
-sVs
-I75
-sVr
-I27
-sVt
-I39
-sV.
-I1
-sV,
-I8
-ssVmu
-p156
-(dp157
-V
-I2
-sVe
-I2
-sVm
-I1
-sVl
-I5
-sVn
-I13
-sVp
-I3
-sVs
-I16
-sVr
-I2
-sVt
-I2
-ssVmt
-p158
-(dp159
-Ve
-I2
-ssV 9
-p160
-(dp161
-V1
-I1
-sV0
-I3
-sV3
-I1
-sV2
-I2
-sV5
-I1
-sV4
-I1
-sV7
-I1
-sV6
-I1
-sV9
-I1
-sV8
-I1
-ssVmp
-p162
-(dp163
-Va
-I30
-sV
-I5
-sVe
-I17
-sVi
-I11
-sVh
-I1
-sVê
-I9
-sVl
-I25
-sVo
-I32
-sV,
-I2
-sVé
-I3
-sVs
-I48
-sVr
-I16
-sVu
-I8
-sVt
-I15
-sV.
-I1
-ssVms
-p164
-(dp165
-V
-I3
-sV,
-I1
-sVt
-I1
-sV.
-I1
-ssV"p
-p166
-(dp167
-Vu
-I1
-ssVmy
-p168
-(dp169
-Vs
-I1
-sVr
-I2
-ssVLe
-p170
-(dp171
-V
-I87
-sVc
-I4
-sVb
-I1
-sVg
-I1
-sVi
-I3
-sVm
-I3
-sVs
-I48
-sVu
-I4
-sVt
-I6
-sVy
-I1
-ssVLa
-p172
-(dp173
-V
-I42
-sVv
-I1
-sVm
-I3
-sVt
-I2
-sVn
-I1
-ssVLo
-p174
-(dp175
-Vi
-I1
-sVm
-I1
-sVs
-I1
-sVu
-I13
-sVn
-I1
-ssV"s
-p176
-(dp177
-Vm
-I1
-ssVLi
-p178
-(dp179
-Vs
-I11
-sVm
-I2
-sVt
-I6
-sVn
-I2
-ssVLu
-p180
-(dp181
-Vc
-I2
-ssVLE
-p182
-(dp183
-V
-I1
-sVF
-I1
-sVM
-I1
-sVQ
-I1
-sVS
-I1
-sVT
-I2
-ssVLA
-p184
-(dp185
-VI
-I1
-sV
-I1
-sVR
-I1
-ssVLO
-p186
-(dp187
-VR
-I1
-ssVLL
-p188
-(dp189
-V
-I2
-sVE
-I1
-ssVLI
-p190
-(dp191
-VA
-I1
-sVC
-I2
-sVB
-I1
-sVE
-I1
-sVG
-I1
-sVI
-I1
-sVM
-I3
-sVT
-I3
-ssVLT
-p192
-(dp193
-VA
-I2
-ssVLU
-p194
-(dp195
-VD
-I2
-ssVLS
-p196
-(dp197
-V,
-I1
-ssVLP
-p198
-(dp199
-VH
-I1
-ssVL'
-p200
-(dp201
-Va
-I16
-sV
-I1
-sVE
-I1
-sVi
-I1
-sVÉ
-I1
-sVh
-I1
-sVo
-I2
-sVé
-I1
-sVA
-I2
-sVO
-I2
-sVu
-I4
-sVe
-I2
-ssVL
-p202
-(dp203
-VP
-I2
-sVM
-I1
-sVd
-I1
-sVD
-I1
-ssVL,
-p204
-(dp205
-V
-I1
-ssVmâ
-p206
-(dp207
-Vt
-I2
-ssVmé
-p208
-(dp209
-V
-I15
-sVc
-I4
-sVe
-I11
-sVd
-I14
-sVm
-I4
-sVl
-I5
-sVn
-I1
-sVp
-I5
-sVs
-I8
-sVr
-I17
-sVt
-I22
-sV.
-I2
-sV?
-I1
-ssVmè
-p210
-(dp211
-Vr
-I28
-sVt
-I1
-sVn
-I17
-ssVmê
-p212
-(dp213
-Vm
-I66
-sVl
-I5
-ssVmô
-p214
-(dp215
-Vn
-I4
-ssV_[
-p216
-(dp217
-V2
-I1
-ssV_V
-p218
-(dp219
-Va
-I1
-sVo
-I2
-ssV_T
-p220
-(dp221
-Ve
-I3
-ssV_S
-p222
-(dp223
-Vi
-I4
-sVe
-I2
-ssV_R
-p224
-(dp225
-Ve
-I1
-ssV_P
-p226
-(dp227
-Va
-I1
-sVr
-I8
-ssV_O
-p228
-(dp229
-V
-I1
-sVe
-I1
-ssV_N
-p230
-(dp231
-Vo
-I1
-ssV_M
-p232
-(dp233
-Vé
-I10
-sVa
-I2
-sVo
-I2
-ssV_L
-p234
-(dp235
-Va
-I1
-sVe
-I7
-sV'
-I1
-ssV_J
-p236
-(dp237
-Vo
-I2
-ssV_I
-p238
-(dp239
-Vt
-I1
-ssV_H
-p240
-(dp241
-Vi
-I3
-sVe
-I1
-sVo
-I1
-ssV_E
-p242
-(dp243
-Vx
-I1
-sVl
-I1
-ssV_D
-p244
-(dp245
-Vi
-I3
-ssV_C
-p246
-(dp247
-Va
-I9
-sVr
-I1
-sVo
-I2
-ssV_A
-p248
-(dp249
-Vr
-I1
-sVn
-I1
-ssVrô
-p250
-(dp251
-Vl
-I3
-sVt
-I3
-sVn
-I12
-ssV_u
-p252
-(dp253
-Vt
-I1
-sVn
-I1
-ssVrû
-p254
-(dp255
-Vl
-I13
-ssV_m
-p256
-(dp257
-Vê
-I1
-ssVrç
-p258
-(dp259
-Va
-I4
-sVu
-I11
-sVo
-I6
-ssV_i
-p260
-(dp261
-Vn
-I1
-ssV_h
-p262
-(dp263
-Vo
-I1
-ssV_g
-p264
-(dp265
-Vl
-I1
-ssVrî
-p266
-(dp267
-Vt
-I1
-ssVrè
-p268
-(dp269
-Vs
-I139
-sVr
-I38
-sVt
-I3
-sVg
-I1
-ssVré
-p270
-(dp271
-Vé
-I2
-sV
-I22
-sV,
-I5
-sV;
-I2
-sV?
-I1
-sVa
-I17
-sVc
-I33
-sVb
-I1
-sVe
-I25
-sVd
-I10
-sVg
-I6
-sVf
-I11
-sVi
-I2
-sVm
-I15
-sVl
-I1
-sVn
-I1
-sVp
-I77
-sVs
-I61
-sVr
-I1
-sVu
-I1
-sVt
-I23
-sVv
-I26
-ssVrê
-p272
-(dp273
-Vc
-I3
-sVm
-I13
-sVt
-I27
-sVv
-I4
-ssVxf
-p274
-(dp275
-Vo
-I1
-ssV_;
-p276
-(dp277
-V
-I10
-ssV_:
-p278
-(dp279
-V
-I1
-ssV_.
-p280
-(dp281
-V
-I27
-sV,
-I1
-ssV_,
-p282
-(dp283
-V
-I43
-ssV_)
-p284
-(dp285
-V
-I1
-ssV_
-p286
-(dp287
-Va
-I2
-sVE
-I1
-sVd
-I4
-sV(
-I1
-sVj
-I1
-sVq
-I1
-sVp
-I1
-sVe
-I1
-ssVr]
-p288
-(dp289
-V
-I2
-ssVr_
-p290
-(dp291
-V
-I1
-sV;
-I1
-sV.
-I1
-ssV_É
-p292
-(dp293
-Vp
-I1
-sVl
-I1
-ssVrt
-p294
-(dp295
-Va
-I43
-sV
-I103
-sVe
-I78
-sV@
-I2
-sVi
-I188
-sVh
-I4
-sV,
-I10
-sVo
-I23
-sV.
-I8
-sVé
-I17
-sVs
-I21
-sV!
-I1
-sVu
-I32
-sVî
-I1
-sVy
-I2
-sV;
-I4
-sVr
-I2
-sV_
-I1
-ssVru
-p296
-(dp297
-Va
-I3
-sV
-I7
-sVc
-I5
-sVb
-I5
-sVe
-I10
-sVd
-I9
-sVi
-I28
-sVm
-I1
-sV,
-I2
-sVn
-I5
-sVp
-I2
-sVs
-I9
-sVr
-I9
-sVt
-I17
-sVv
-I1
-sV.
-I1
-sVl
-I1
-ssVrv
-p298
-(dp299
-Va
-I11
-sVe
-I10
-sVi
-I30
-sVo
-I2
-sVé
-I2
-sVu
-I2
-ssVrw
-p300
-(dp301
-Va
-I1
-sVo
-I1
-ssVrp
-p302
-(dp303
-Vé
-I1
-sVa
-I1
-sVs
-I11
-sVr
-I15
-sVe
-I5
-ssVrq
-p304
-(dp305
-Vu
-I52
-ssVrr
-p306
-(dp307
-Va
-I42
-sVe
-I106
-sVi
-I76
-sVh
-I1
-sVê
-I10
-sVo
-I24
-sVé
-I4
-sVu
-I1
-ssVrs
-p308
-(dp309
-V!
-I4
-sV
-I324
-sV)
-I1
-sVe
-I18
-sVp
-I1
-sVé
-I6
-sVè
-I1
-sV,
-I60
-sVo
-I37
-sV.
-I24
-sVq
-I8
-sVi
-I6
-sVu
-I5
-sVt
-I5
-sVa
-I19
-sV[
-I1
-sV:
-I2
-sV;
-I14
-sV?
-I3
-ssVry
-p310
-(dp311
-Vi
-I2
-sV
-I14
-sV*
-I1
-sVm
-I1
-sV,
-I2
-ssVrz
-p312
-(dp313
-Ve
-I2
-ssVrd
-p314
-(dp315
-Va
-I30
-sV
-I40
-sVe
-I47
-sV'
-I8
-sVi
-I44
-sVè
-I3
-sV-
-I1
-sV,
-I8
-sVo
-I19
-sV.
-I3
-sVé
-I7
-sVs
-I8
-sVr
-I11
-sVu
-I19
-sVw
-I1
-sV;
-I2
-sV:
-I1
-sV[
-I1
-ssVre
-p316
-(dp317
-V!
-I8
-sV
-I911
-sV)
-I2
-sV-
-I8
-sV,
-I162
-sV.
-I75
-sV;
-I64
-sV:
-I22
-sV?
-I19
-sVg
-I28
-sV[
-I2
-sV_
-I9
-sVa
-I22
-sVc
-I52
-sVb
-I3
-sVe
-I10
-sVd
-I17
-sVç
-I19
-sVf
-I15
-sVi
-I24
-sVh
-I1
-sVj
-I1
-sVm
-I115
-sVl
-I30
-sVn
-I335
-sVq
-I9
-sVp
-I44
-sVs
-I370
-sVr
-I50
-sVu
-I59
-sVt
-I62
-sVv
-I38
-sVz
-I32
-ssVrf
-p318
-(dp319
-Va
-I6
-sV
-I3
-sVf
-I1
-sVi
-I1
-sVo
-I1
-sVs
-I2
-sVu
-I2
-ssVrg
-p320
-(dp321
-Va
-I3
-sV
-I24
-sVe
-I36
-sVi
-I14
-sVh
-I1
-sV-
-I1
-sV,
-I4
-sVo
-I2
-sVn
-I2
-sVé
-I14
-sVu
-I3
-sV/
-I4
-sVè
-I1
-sV;
-I1
-sV.
-I3
-ssVra
-p322
-(dp323
-Vî
-I17
-sV
-I74
-sVp
-I21
-sV-
-I2
-sV,
-I15
-sV.
-I2
-sV:
-I1
-sVa
-I3
-sVc
-I32
-sVb
-I20
-sVe
-I1
-sVd
-I39
-sVg
-I41
-sVf
-I3
-sVi
-I267
-sVh
-I2
-sVë
-I1
-sVm
-I21
-sVl
-I27
-sVo
-I6
-sVn
-I224
-sVé
-I2
-sVs
-I42
-sVr
-I12
-sVu
-I3
-sVt
-I36
-sVv
-I45
-sVy
-I2
-ssVrb
-p324
-(dp325
-Vi
-I4
-sVa
-I9
-sVk
-I1
-sVr
-I6
-sVe
-I4
-ssVrc
-p326
-(dp327
-V
-I4
-sVc
-I1
-sVe
-I45
-sVi
-I18
-sVh
-I45
-sVk
-I1
-sV,
-I4
-sVo
-I7
-sVî
-I1
-sVé
-I1
-sVs
-I3
-sVr
-I1
-sVè
-I1
-sV;
-I1
-sV.
-I3
-sVl
-I1
-ssVrl
-p328
-(dp329
-Va
-I22
-sVe
-I37
-sVd
-I3
-sVé
-I6
-sVo
-I3
-sVi
-I3
-sVy
-I1
-ssVrm
-p330
-(dp331
-Va
-I33
-sV
-I4
-sV)
-I1
-sVe
-I58
-sVi
-I27
-sVl
-I1
-sVo
-I11
-sV,
-I1
-sVé
-I14
-sV.
-I1
-ssVrn
-p332
-(dp333
-Va
-I44
-sV
-I2
-sVe
-I39
-sVé
-I12
-sVo
-I3
-sV.
-I1
-sVi
-I10
-sVu
-I1
-ssVro
-p334
-(dp335
-Vï
-I1
-sVa
-I1
-sVc
-I57
-sVb
-I17
-sVd
-I28
-sVg
-I7
-sVf
-I30
-sVi
-I164
-sVh
-I1
-sVj
-I32
-sVm
-I35
-sVl
-I25
-sVo
-I2
-sVn
-I157
-sVq
-I3
-sVp
-I49
-sVs
-I30
-sVr
-I2
-sVu
-I138
-sVt
-I6
-sVv
-I28
-sVy
-I34
-ssVrh
-p336
-(dp337
-Vu
-I2
-ssVri
-p338
-(dp339
-V
-I8
-sV,
-I6
-sV;
-I2
-sV?
-I1
-sVâ
-I2
-sV_
-I1
-sVa
-I35
-sVc
-I16
-sVb
-I36
-sVe
-I146
-sVd
-I16
-sVg
-I34
-sVf
-I5
-sVé
-I1
-sVè
-I24
-sVm
-I15
-sVl
-I15
-sVo
-I19
-sVn
-I53
-sVq
-I12
-sVp
-I12
-sVs
-I102
-sVr
-I38
-sVu
-I2
-sVt
-I110
-sVv
-I63
-sVx
-I9
-sVz
-I3
-ssV_à
-p340
-(dp341
-V
-I1
-ssVr?
-p342
-(dp343
-V
-I10
-sV-
-I1
-ssVr:
-p344
-(dp345
-V
-I11
-ssVr;
-p346
-(dp347
-V
-I48
-ssVr'
-p348
-(dp349
-Va
-I1
-sVs
-I1
-sVo
-I2
-ssVr
-p350
-(dp351
-Vj
-I13
-sVR
-I2
-sVi
-I28
-sV(
-I1
-sV/
-I1
-sV1
-I2
-sV2
-I1
-sV9
-I1
-sVA
-I4
-sVC
-I24
-sVB
-I2
-sVD
-I2
-sVG
-I1
-sVI
-I2
-sVH
-I1
-sVJ
-I2
-sVM
-I12
-sVL
-I3
-sVN
-I3
-sVP
-I22
-sVâ
-I1
-sVW
-I1
-sV[
-I1
-sVZ
-I2
-sVa
-I84
-sVà
-I45
-sVc
-I66
-sVb
-I11
-sVe
-I85
-sVd
-I242
-sVg
-I4
-sVf
-I25
-sVé
-I10
-sVh
-I7
-sVê
-I5
-sVm
-I64
-sVl
-I302
-sVo
-I27
-sVn
-I25
-sVq
-I53
-sVp
-I71
-sVs
-I88
-sVr
-I17
-sVu
-I63
-sVt
-I56
-sVw
-I3
-sVv
-I26
-sVy
-I2
-ssVr!
-p352
-(dp353
-V
-I6
-ssVr,
-p354
-(dp355
-V
-I204
-ssVr-
-p356
-(dp357
-Vd
-I3
-sVt
-I11
-sVl
-I5
-ssVr.
-p358
-(dp359
-VA
-I1
-sV
-I92
-sV»
-I1
-sV-
-I1
-sV0
-I1
-ssVr/
-p360
-(dp361
-VN
-I1
-ssVr*
-p362
-(dp363
-V
-I2
-ssVù,
-p364
-(dp365
-V
-I1
-ssVQu
-p366
-(dp367
-Va
-I12
-sVi
-I5
-sVe
-I26
-sVo
-I8
-sV'
-I6
-ssVQU
-p368
-(dp369
-VI
-I1
-sVE
-I1
-sV'
-I2
-ssVd.
-p370
-(dp371
-V
-I11
-ssVd,
-p372
-(dp373
-V
-I31
-ssVd-
-p374
-(dp375
-Va
-I1
-sVi
-I6
-sVo
-I1
-sVp
-I1
-sVs
-I2
-sVr
-I2
-sVT
-I1
-sVw
-I1
-ssVd)
-p376
-(dp377
-V:
-I1
-ssVéq
-p378
-(dp379
-Vu
-I14
-ssVd'
-p380
-(dp381
-Va
-I91
-sVA
-I18
-sVâ
-I1
-sVE
-I20
-sVi
-I16
-sVh
-I27
-sVê
-I30
-sVo
-I21
-sVÉ
-I1
-sVé
-I26
-sVs
-I1
-sVu
-I109
-sVO
-I3
-sVy
-I2
-sVe
-I53
-sVU
-I1
-sVI
-I3
-ssVés
-p382
-(dp383
-Va
-I8
-sV
-I81
-sVe
-I47
-sVi
-I13
-sVh
-I2
-sV,
-I37
-sVo
-I11
-sV.
-I11
-sVu
-I36
-sV;
-I5
-sV?
-I3
-ssVér
-p384
-(dp385
-Va
-I48
-sVe
-I31
-sVé
-I15
-sVê
-I2
-sVo
-I15
-sVi
-I75
-sVu
-I1
-ssVéu
-p386
-(dp387
-Vs
-I1
-sVo
-I1
-ssVét
-p388
-(dp389
-Va
-I276
-sVe
-I34
-sVé
-I80
-sVh
-I1
-sVo
-I21
-sVi
-I34
-sVr
-I51
-sVu
-I5
-ssVd
-p390
-(dp391
-VC
-I1
-sVB
-I4
-sVE
-I2
-sVI
-I3
-sVJ
-I1
-sVM
-I1
-sVP
-I3
-sVS
-I2
-sVW
-I1
-sVV
-I1
-sV[
-I1
-sV_
-I1
-sVa
-I22
-sVà
-I4
-sVc
-I9
-sVb
-I20
-sVe
-I13
-sVd
-I24
-sVg
-I2
-sVf
-I9
-sVi
-I26
-sVh
-I7
-sVj
-I10
-sVm
-I15
-sVl
-I16
-sVo
-I29
-sVn
-I5
-sVq
-I5
-sVp
-I26
-sVs
-I14
-sVr
-I7
-sVu
-I6
-sVt
-I16
-sVw
-I4
-sVv
-I6
-sVy
-I8
-ssVév
-p392
-(dp393
-Va
-I4
-sVe
-I6
-sVé
-I20
-sVè
-I1
-sVo
-I15
-sVi
-I2
-sVu
-I1
-ssVéi
-p394
-(dp395
-Vs
-I1
-sVm
-I1
-sVt
-I3
-sVd
-I1
-ssVd?
-p396
-(dp397
-V
-I2
-ssVéj
-p398
-(dp399
-Và
-I17
-sVe
-I4
-sVo
-I3
-ssVd:
-p400
-(dp401
-V
-I2
-ssVél
-p402
-(dp403
-Va
-I36
-sVe
-I13
-sVi
-I21
-sVè
-I3
-sVo
-I4
-sVé
-I3
-sVu
-I1
-ssVéo
-p404
-(dp405
-Vd
-I3
-sVl
-I6
-sVt
-I1
-ssVén
-p406
-(dp407
-Va
-I7
-sVe
-I5
-sVi
-I16
-sVè
-I1
-sVo
-I15
-sVé
-I16
-sVu
-I1
-ssVéa
-p408
-(dp409
-Vt
-I16
-sVb
-I9
-sVu
-I2
-sVl
-I3
-sVn
-I3
-ssVéc
-p410
-(dp411
-Va
-I2
-sVe
-I20
-sVi
-I28
-sVh
-I19
-sVl
-I9
-sVo
-I27
-sVr
-I37
-sVu
-I22
-ssVéb
-p412
-(dp413
-Va
-I8
-sVi
-I1
-sVr
-I4
-ssVée
-p414
-(dp415
-V
-I106
-sV,
-I28
-sV.
-I16
-sVs
-I57
-sVn
-I6
-sV;
-I9
-sV:
-I3
-sV[
-I1
-sV?
-I2
-ssVéd
-p416
-(dp417
-Va
-I2
-sVe
-I12
-sVi
-I47
-sVé
-I6
-sVr
-I2
-sVu
-I8
-ssVég
-p418
-(dp419
-Va
-I8
-sVe
-I1
-sVi
-I4
-sVè
-I4
-sVl
-I3
-sVo
-I140
-sVn
-I2
-sVé
-I1
-sVr
-I2
-sVu
-I2
-sVy
-I1
-ssVéf
-p420
-(dp421
-Va
-I5
-sVe
-I5
-sVi
-I4
-sVl
-I4
-sVé
-I3
-sVr
-I1
-sVu
-I3
-ssVé[
-p422
-(dp423
-V1
-I1
-ssVé_
-p424
-(dp425
-V,
-I3
-ssVdn
-p426
-(dp427
-Vi
-I2
-ssVdo
-p428
-(dp429
-V
-I13
-sVc
-I16
-sVe
-I1
-sVg
-I2
-sVi
-I14
-sVm
-I13
-sV,
-I11
-sVn
-I203
-sVs
-I5
-sVr
-I37
-sVu
-I64
-sVw
-I4
-sV[
-I2
-sV.
-I5
-sV_
-I1
-sVl
-I9
-ssVé;
-p430
-(dp431
-V
-I17
-ssVé:
-p432
-(dp433
-V
-I8
-ssVdj
-p434
-(dp435
-Vu
-I1
-ssVé?
-p436
-(dp437
-V
-I8
-ssVdi
-p438
-(dp439
-V
-I3
-sV,
-I1
-sV1
-I8
-sVa
-I43
-sVc
-I13
-sVe
-I34
-sVd
-I393
-sVg
-I13
-sVf
-I13
-sVé
-I1
-sVè
-I2
-sVk
-I1
-sVm
-I3
-sVl
-I3
-sVo
-I2
-sVn
-I41
-sVq
-I6
-sVp
-I1
-sVs
-I151
-sVr
-I50
-sVu
-I5
-sVt
-I434
-sVv
-I5
-sVx
-I25
-ssVdd
-p440
-(dp441
-Vi
-I8
-sVe
-I1
-ssVde
-p442
-(dp443
-V!
-I12
-sV
-I1745
-sV-
-I1
-sV,
-I177
-sV.
-I85
-sV;
-I49
-sV:
-I18
-sV?
-I7
-sVM
-I1
-sV_
-I8
-sVa
-I11
-sVc
-I9
-sVb
-I1
-sVd
-I11
-sVg
-I1
-sVf
-I1
-sVm
-I130
-sVl
-I8
-sVn
-I34
-sVp
-I9
-sVs
-I430
-sVr
-I84
-sVu
-I155
-sVt
-I1
-sVv
-I40
-sVy
-I3
-sVx
-I1
-sVz
-I9
-ssVdb
-p444
-(dp445
-Ve
-I1
-ssVda
-p446
-(dp447
-V
-I25
-sVb
-I6
-sVd
-I1
-sVg
-I1
-sVi
-I54
-sV-
-I9
-sVj
-I2
-sVm
-I46
-sVl
-I10
-sVn
-I401
-sVy
-I5
-sVs
-I2
-sVr
-I1
-sVt
-I33
-sVv
-I9
-sV[
-I1
-sV;
-I3
-sV:
-I1
-sV,
-I3
-sV_
-I1
-ssVé,
-p448
-(dp449
-V
-I78
-ssVé.
-p450
-(dp451
-V
-I31
-sV-
-I2
-ssVdv
-p452
-(dp453
-Vi
-I4
-sVa
-I1
-sVe
-I1
-ssVé
-p454
-(dp455
-Vp
-I47
-sVC
-I4
-sVM
-I1
-sVR
-I2
-sVU
-I1
-sV_
-I2
-sVa
-I27
-sVà
-I27
-sVc
-I17
-sVb
-I5
-sVe
-I29
-sVd
-I124
-sVg
-I2
-sVf
-I7
-sVi
-I6
-sVh
-I2
-sVj
-I4
-sVm
-I14
-sVl
-I32
-sVo
-I2
-sVn
-I8
-sVq
-I23
-sVé
-I5
-sVs
-I15
-sVr
-I5
-sVu
-I9
-sVt
-I11
-sVv
-I6
-ssVdu
-p456
-(dp457
-V!
-I1
-sV
-I315
-sVc
-I14
-sVe
-I11
-sVi
-I30
-sVm
-I1
-sVl
-I1
-sV,
-I8
-sVq
-I1
-sVs
-I2
-sVr
-I12
-sVt
-I1
-sVv
-I1
-sV_
-I1
-sV?
-I1
-ssVdr
-p458
-(dp459
-Va
-I31
-sVi
-I9
-sVe
-I108
-sVô
-I2
-sVo
-I24
-ssVds
-p460
-(dp461
-V
-I42
-sV;
-I1
-sV-
-I1
-sV,
-I11
-sV.
-I4
-ssVd_
-p462
-(dp463
-V,
-I2
-sV.
-I1
-ssVd[
-p464
-(dp465
-V3
-I1
-ssVw
-p466
-(dp467
-VA
-I1
-sVb
-I1
-sVd
-I1
-sVi
-I1
-sVJ
-I1
-sVM
-I1
-sVL
-I2
-sVo
-I1
-sVN
-I2
-sVy
-I1
-sVt
-I9
-sVY
-I1
-ssVw.
-p468
-(dp469
-Vi
-I1
-sV
-I2
-sVg
-I2
-ssVw,
-p470
-(dp471
-V
-I3
-ssVéé
-p472
-(dp473
-Vt
-I2
-ssVéâ
-p474
-(dp475
-Vt
-I4
-ssV93
-p476
-(dp477
-V,
-I1
-ssVw:
-p478
-(dp479
-V
-I1
-sV/
-I2
-ssV02
-p480
-(dp481
-V
-I3
-sV*
-I1
-sV]
-I1
-sV,
-I3
-sV/
-I1
-ssV03
-p482
-(dp483
-V
-I4
-sV,
-I1
-ssV00
-p484
-(dp485
-V
-I13
-sV+
-I1
-sV,
-I1
-sV1
-I4
-sV0
-I11
-sV3
-I2
-sV2
-I5
-sV4
-I1
-ssV01
-p486
-(dp487
-V(
-I2
-sV,
-I1
-sV
-I4
-ssV06
-p488
-(dp489
-V.
-I1
-ssV04
-p490
-(dp491
-V
-I1
-ssV05
-p492
-(dp493
-V,
-I1
-ssV0;
-p494
-(dp495
-V
-I3
-ssV09
-p496
-(dp497
-V
-I1
-sV,
-I1
-ssV0
-p498
-(dp499
-Va
-I1
-sV
-I11
-sVe
-I1
-sVD
-I1
-sVj
-I1
-sVm
-I2
-sVn
-I1
-sVs
-I2
-sVd
-I3
-ssV0%
-p500
-(dp501
-V
-I1
-ssV0+
-p502
-(dp503
-V
-I1
-ssV0.
-p504
-(dp505
-V
-I2
-sVz
-I2
-sVt
-I2
-ssV0,
-p506
-(dp507
-V
-I4
-ssVdî
-p508
-(dp509
-Vt
-I2
-sVn
-I11
-ssVwe
-p510
-(dp511
-V
-I12
-sVr
-I3
-sVv
-I1
-ssVdè
-p512
-(dp513
-Vs
-I7
-sVr
-I3
-sVl
-I6
-ssVdé
-p514
-(dp515
-V
-I15
-sVc
-I23
-sVb
-I9
-sVe
-I14
-sVd
-I4
-sVg
-I10
-sVf
-I12
-sVj
-I21
-sVm
-I18
-sVl
-I17
-sVn
-I1
-sVp
-I15
-sVs
-I31
-sVr
-I6
-sVt
-I29
-sVv
-I10
-sV.
-I1
-ssVwo
-p516
-(dp517
-V
-I1
-sVr
-I14
-sVu
-I2
-ssVwn
-p518
-(dp519
-Vs
-I1
-sVl
-I3
-ssVwi
-p520
-(dp521
-Vc
-I1
-sVl
-I7
-sVn
-I3
-sVs
-I3
-sVr
-I1
-sVt
-I20
-ssVwh
-p522
-(dp523
-Va
-I2
-sVi
-I3
-sVe
-I4
-sVo
-I3
-ssVww
-p524
-(dp525
-V:
-I2
-sVw
-I5
-sV.
-I3
-ssVwt
-p526
-(dp527
-Vo
-I1
-ssVws
-p528
-(dp529
-V
-I2
-sVl
-I3
-sV,
-I1
-ssVwr
-p530
-(dp531
-Vi
-I2
-sVo
-I2
-ssVwy
-p532
-(dp533
-Ve
-I1
-ssV0a
-p534
-(dp535
-V.
-I2
-ssVié
-p536
-(dp537
-V
-I16
-sVe
-I2
-sVg
-I2
-sV,
-I2
-sV.
-I2
-sVs
-I1
-sVt
-I7
-sV;
-I2
-sV:
-I1
-ssViè
-p538
-(dp539
-Vc
-I27
-sVr
-I87
-sVm
-I25
-sVg
-I3
-ssViâ
-p540
-(dp541
-Vt
-I2
-ssVC)
-p542
-(dp543
-V
-I1
-ssVC.
-p544
-(dp545
-V
-I1
-ssVC
-p546
-(dp547
-Vo
-I1
-sVL
-I1
-sVD
-I2
-sVd
-I1
-ssVC'
-p548
-(dp549
-Vé
-I3
-sVe
-I33
-ssVCI
-p550
-(dp551
-VI
-I2
-sVD
-I1
-ssVCH
-p552
-(dp553
-VA
-I31
-sV
-I2
-sVE
-I2
-sVO
-I2
-ssVCO
-p554
-(dp555
-VB
-I1
-sVN
-I2
-ssVCL
-p556
-(dp557
-VA
-I1
-sVU
-I2
-ssVCC
-p558
-(dp559
-VX
-I1
-sVC
-I1
-ssVVÉ
-p560
-(dp561
-VE
-I1
-ssVCA
-p562
-(dp563
-VN
-I4
-ssVCE
-p564
-(dp565
-V
-I3
-sVS
-I1
-ssVCD
-p566
-(dp567
-VI
-I2
-ssVCX
-p568
-(dp569
-VX
-I1
-ssVCR
-p570
-(dp571
-V.
-I1
-ssVCU
-p572
-(dp573
-VL
-I1
-ssVCT
-p574
-(dp575
-V
-I9
-sVE
-I2
-sV,
-I2
-ssVCi
-p576
-(dp577
-Vc
-I1
-sVn
-I2
-ssVCh
-p578
-(dp579
-Va
-I13
-sVà
-I1
-sVe
-I2
-sVi
-I4
-sVo
-I1
-sVr
-I1
-ssVCo
-p580
-(dp581
-Vm
-I28
-sVl
-I4
-sVï
-I1
-sVn
-I20
-sVp
-I1
-sVr
-I6
-sVu
-I1
-ssVCl
-p582
-(dp583
-Va
-I2
-sVu
-I1
-sVo
-I1
-ssVVé
-p584
-(dp585
-Vn
-I3
-ssVCa
-p586
-(dp587
-Vc
-I85
-sVe
-I1
-sVd
-I7
-sVm
-I2
-sVl
-I1
-sVn
-I396
-sVs
-I1
-sVr
-I8
-sVt
-I2
-sVy
-I3
-ssVCe
-p588
-(dp589
-V
-I44
-sVc
-I1
-sVl
-I13
-sVn
-I1
-sVp
-I8
-sVs
-I3
-sVr
-I2
-sVu
-I1
-sVt
-I11
-ssVCr
-p590
-(dp591
-Vé
-I1
-sVo
-I6
-ssVCu
-p592
-(dp593
-Vn
-I125
-ssVix
-p594
-(dp595
-Va
-I7
-sV
-I52
-sVe
-I1
-sVi
-I4
-sV-
-I2
-sV,
-I6
-sV.
-I7
-sV;
-I2
-sV:
-I1
-ssViz
-p596
-(dp597
-Va
-I7
-sVi
-I4
-sVe
-I2
-sVo
-I1
-ssViq
-p598
-(dp599
-Vu
-I115
-ssVip
-p600
-(dp601
-Va
-I3
-sVe
-I8
-sVp
-I1
-sVi
-I8
-sV*
-I2
-sVm
-I2
-sVl
-I2
-sVo
-I9
-sVé
-I1
-sVs
-I1
-sVt
-I3
-ssVis
-p602
-(dp603
-V!
-I1
-sV
-I672
-sVp
-I22
-sV-
-I8
-sV,
-I101
-sV.
-I26
-sV;
-I15
-sV:
-I4
-sV?
-I6
-sV_
-I2
-sVa
-I80
-sVc
-I32
-sVb
-I11
-sVe
-I169
-sVf
-I3
-sVi
-I110
-sVè
-I7
-sVk
-I4
-sVm
-I7
-sVl
-I1
-sVo
-I73
-sVq
-I10
-sVé
-I23
-sVs
-I170
-sVt
-I89
-sVh
-I4
-ssVir
-p604
-(dp605
-Va
-I53
-sV
-I183
-sVc
-I3
-sVâ
-I1
-sVe
-I329
-sVg
-I3
-sVé
-I9
-sVè
-I1
-sVm
-I3
-sV,
-I25
-sVo
-I21
-sV.
-I13
-sVi
-I14
-sVs
-I18
-sVu
-I7
-sVt
-I1
-sV;
-I3
-sV?
-I4
-ssViu
-p606
-(dp607
-Vs
-I6
-sVm
-I6
-ssVit
-p608
-(dp609
-V!
-I1
-sV
-I1361
-sV-
-I61
-sV,
-I64
-sV.
-I28
-sV;
-I18
-sV:
-I34
-sVô
-I15
-sV[
-I1
-sV_
-I1
-sVa
-I59
-sVâ
-I1
-sVe
-I203
-sVi
-I70
-sVh
-I23
-sVl
-I2
-sVo
-I8
-sVé
-I75
-sVs
-I35
-sVr
-I31
-sVu
-I22
-sVt
-I11
-sVy
-I5
-sVz
-I2
-ssViv
-p610
-(dp611
-Va
-I41
-sVâ
-I1
-sVe
-I72
-sVi
-I25
-sVè
-I3
-sVo
-I3
-sVé
-I16
-sVr
-I38
-ssVii
-p612
-(dp613
-V,
-I1
-ssVik
-p614
-(dp615
-Ve
-I2
-sVd
-I1
-ssVij
-p616
-(dp617
-Vo
-I1
-ssVim
-p618
-(dp619
-Va
-I36
-sV
-I7
-sVb
-I1
-sVe
-I61
-sVi
-I15
-sVé
-I7
-sVm
-I5
-sV,
-I1
-sVo
-I1
-sV.
-I1
-sVp
-I34
-sVs
-I2
-sVu
-I1
-ssVil
-p620
-(dp621
-Va
-I7
-sV
-I530
-sVe
-I53
-sVd
-I1
-sVà
-I24
-sVi
-I26
-sVh
-I1
-sVl
-I382
-sVo
-I26
-sV.
-I7
-sVé
-I1
-sVs
-I134
-sVu
-I2
-sVt
-I3
-sVè
-I3
-sVy
-I1
-sV;
-I3
-sV:
-I1
-sV,
-I42
-ssVio
-p622
-(dp623
-Vc
-I1
-sVd
-I1
-sVm
-I1
-sVl
-I14
-sVn
-I278
-sVs
-I8
-sVr
-I2
-sVu
-I3
-sVt
-I4
-sVv
-I1
-sV.
-I2
-sV,
-I1
-ssVin
-p624
-(dp625
-V!
-I5
-sV
-I206
-sV"
-I1
-sV-
-I6
-sV,
-I72
-sV.
-I48
-sV;
-I21
-sV:
-I8
-sV?
-I1
-sVç
-I1
-sV[
-I1
-sVa
-I49
-sVc
-I66
-sVe
-I146
-sVd
-I27
-sVg
-I108
-sVf
-I34
-sVé
-I13
-sVh
-I1
-sVk
-I1
-sVj
-I4
-sVo
-I20
-sVn
-I11
-sVq
-I57
-sVi
-I18
-sVs
-I117
-sVr
-I4
-sVu
-I23
-sVt
-I140
-sVv
-I6
-sVz
-I9
-ssVia
-p626
-(dp627
-V
-I17
-sVc
-I4
-sVb
-I16
-sVd
-I1
-sVg
-I4
-sVi
-I13
-sV-
-I3
-sVm
-I29
-sVl
-I18
-sV,
-I7
-sVs
-I18
-sV:
-I1
-sVt
-I3
-sVh
-I1
-sV;
-I1
-sVn
-I12
-ssV_p
-p628
-(dp629
-Va
-I1
-ssVic
-p630
-(dp631
-Va
-I28
-sV
-I8
-sV)
-I1
-sVe
-I41
-sVi
-I68
-sVh
-I33
-sVk
-I2
-sVl
-I2
-sVo
-I6
-sV.
-I1
-sVé
-I2
-sVs
-I2
-sVu
-I15
-sVt
-I7
-sV,
-I1
-ssVib
-p632
-(dp633
-Va
-I1
-sVe
-I11
-sVi
-I6
-sVl
-I64
-sVn
-I2
-sVé
-I1
-sVr
-I12
-sVu
-I16
-ssVie
-p634
-(dp635
-V!
-I2
-sV
-I121
-sV,
-I50
-sV.
-I27
-sV;
-I10
-sV:
-I2
-sV?
-I5
-sV[
-I5
-sV_
-I1
-sVd
-I28
-sVf
-I1
-sVi
-I71
-sVm
-I4
-sVl
-I14
-sVn
-I505
-sVp
-I4
-sVs
-I46
-sVr
-I133
-sVu
-I198
-sVt
-I3
-sVw
-I1
-sVz
-I29
-ssVid
-p636
-(dp637
-Va
-I6
-sV
-I9
-sVe
-I449
-sVé
-I21
-sVè
-I6
-sV,
-I1
-sVo
-I1
-sVn
-I2
-sVi
-I10
-sVr
-I1
-sVy
-I1
-ssVig
-p638
-(dp639
-Va
-I6
-sVe
-I10
-sVé
-I9
-sVh
-I17
-sVo
-I17
-sVn
-I79
-sVi
-I16
-sVr
-I4
-sVu
-I17
-sVt
-I5
-ssVif
-p640
-(dp641
-V
-I21
-sVe
-I1
-sVf
-I14
-sVi
-I20
-sV,
-I6
-sV.
-I3
-sVé
-I1
-sVs
-I6
-sVr
-I1
-sVt
-I1
-sVy
-I3
-ssVV
-p642
-(dp643
-Vp
-I1
-sV:
-I1
-sVd
-I2
-ssVn:
-p644
-(dp645
-V
-I18
-ssVi[
-p646
-(dp647
-V1
-I2
-sV4
-I1
-ssV"A
-p648
-(dp649
-VS
-I1
-ssVi_
-p650
-(dp651
-V,
-I1
-ssVV,
-p652
-(dp653
-V
-I1
-ssVV.
-p654
-(dp655
-V
-I7
-ssV"P
-p656
-(dp657
-VR
-I3
-sVr
-I3
-ssV"R
-p658
-(dp659
-Vi
-I1
-ssV"S
-p660
-(dp661
-Vm
-I5
-ssVV:
-p662
-(dp663
-V
-I1
-ssVbî
-p664
-(dp665
-Vm
-I4
-ssVV?
-p666
-(dp667
-V
-I1
-ssVi8
-p668
-(dp669
-V.
-I1
-ssVi;
-p670
-(dp671
-V
-I14
-ssVi:
-p672
-(dp673
-V
-I2
-ssV"
-p674
-(dp675
-Va
-I2
-sVs
-I5
-sVt
-I2
-sVw
-I1
-sVd
-I1
-ssVVE
-p676
-(dp677
-V
-I4
-sVC
-I1
-sVR
-I3
-sVN
-I2
-ssVi?
-p678
-(dp679
-V
-I11
-ssVi1
-p680
-(dp681
-V1
-I2
-sV0
-I6
-ssVVI
-p682
-(dp683
-V
-I1
-sVD
-I1
-sVI
-I20
-sV,
-I3
-sV.
-I3
-sV;
-I1
-ssV".
-p684
-(dp685
-V
-I2
-ssV")
-p686
-(dp687
-V.
-I1
-ssVVO
-p688
-(dp689
-VL
-I2
-ssVVR
-p690
-(dp691
-VE
-I3
-ssVi-
-p692
-(dp693
-Vc
-I4
-sVe
-I1
-sVh
-I1
-sVj
-I4
-sVm
-I13
-sVl
-I2
-ssVi,
-p694
-(dp695
-V
-I132
-ssVi.
-p696
-(dp697
-V
-I26
-sV-
-I1
-ssVi!
-p698
-(dp699
-V
-I17
-sV_
-I2
-ssVi
-p700
-(dp701
-Vê
-I6
-sVi
-I10
-sV.
-I1
-sV1
-I1
-sVÉ
-I1
-sVA
-I1
-sVC
-I8
-sVD
-I2
-sVI
-I2
-sVM
-I2
-sVL
-I1
-sVN
-I1
-sVP
-I1
-sVT
-I1
-sVV
-I1
-sVa
-I86
-sVà
-I19
-sVc
-I43
-sVb
-I23
-sVe
-I51
-sVd
-I166
-sVg
-I11
-sVf
-I50
-sVé
-I43
-sVh
-I4
-sVj
-I30
-sVm
-I43
-sVl
-I82
-sVo
-I13
-sVn
-I53
-sVq
-I29
-sVp
-I81
-sVs
-I46
-sVr
-I42
-sVu
-I16
-sVt
-I34
-sVv
-I52
-sVy
-I1
-ssVV_
-p702
-(dp703
-V;
-I5
-sV,
-I1
-sV.
-I5
-ssVVa
-p704
-(dp705
-Vl
-I2
-sVn
-I5
-ssVCé
-p706
-(dp707
-Vs
-I3
-ssVVe
-p708
-(dp709
-Vs
-I11
-sVr
-I2
-sVn
-I32
-ssVVi
-p710
-(dp711
-Vs
-I3
-sVr
-I3
-sVe
-I1
-sVt
-I1
-sVn
-I1
-ssVVo
-p712
-(dp713
-Vy
-I17
-sVi
-I10
-sVu
-I39
-sVl
-I30
-sVt
-I6
-ssV5]
-p714
-(dp715
-V
-I2
-sV;
-I1
-sV,
-I1
-ssVt-
-p716
-(dp717
-Và
-I5
-sVc
-I16
-sVe
-I19
-sVG
-I1
-sVi
-I82
-sVH
-I1
-sVê
-I9
-sVM
-I2
-sVS
-I1
-sVo
-I7
-sVn
-I1
-sVq
-I3
-sVP
-I1
-sVs
-I1
-sVl
-I1
-ssVt*
-p718
-(dp719
-V
-I1
-sV*
-I1
-ssV°
-p720
-(dp721
-V2
-I2
-sV6
-I1
-ssVHé
-p722
-(dp723
-Vb
-I1
-sVl
-I19
-ssV°.
-p724
-(dp725
-V
-I1
-ssV59
-p726
-(dp727
-V
-I2
-sV4
-I2
-sV:
-I1
-sV,
-I3
-sV.
-I1
-ssV55
-p728
-(dp729
-V-
-I1
-sV.
-I1
-ssV54
-p730
-(dp731
-V1
-I1
-sV.
-I1
-ssV57
-p732
-(dp733
-V:
-I2
-ssV56
-p734
-(dp735
-V
-I1
-sV;
-I1
-sV,
-I2
-ssV50
-p736
-(dp737
-V1
-I2
-sV0
-I2
-sV]
-I1
-sV
-I2
-ssV52
-p738
-(dp739
-V8
-I1
-sV.
-I1
-ssV5-
-p740
-(dp741
-V4
-I1
-ssV5,
-p742
-(dp743
-V
-I3
-ssV5.
-p744
-(dp745
-V
-I4
-ssV5)
-p746
-(dp747
-V:
-I1
-sV,
-I1
-ssV5
-p748
-(dp749
-Vj
-I1
-ssVHI
-p750
-(dp751
-VS
-I2
-sVN
-I1
-ssVHO
-p752
-(dp753
-VT
-I2
-ssVHA
-p754
-(dp755
-VP
-I30
-sVN
-I1
-sVM
-I1
-sVT
-I1
-sVV
-I2
-ssVHE
-p756
-(dp757
-V
-I5
-sVR
-I3
-sVZ
-I1
-ssVe[
-p758
-(dp759
-Va
-I1
-sV1
-I3
-sV3
-I2
-sV2
-I2
-sV5
-I1
-sV7
-I1
-sV6
-I2
-sV9
-I1
-sV8
-I1
-ssVHi
-p760
-(dp761
-Vs
-I5
-sVd
-I2
-ssVHo
-p762
-(dp763
-Vr
-I4
-sVm
-I3
-sVl
-I5
-sVn
-I2
-ssVHa
-p764
-(dp765
-Vy
-I1
-sVr
-I7
-sVm
-I1
-sVw
-I1
-ssVHe
-p766
-(dp767
-Vr
-I1
-sVn
-I6
-ssV-4
-p768
-(dp769
-V1
-I1
-ssVm"
-p770
-(dp771
-V
-I1
-ssVH,
-p772
-(dp773
-V
-I1
-ssVH
-p774
-(dp775
-VD
-I1
-sVO
-I1
-ssV[P
-p776
-(dp777
-Vr
-I1
-sVo
-I1
-ssV[T
-p778
-(dp779
-Vh
-I1
-ssV[Y
-p780
-(dp781
-Ve
-I1
-ssV[E
-p782
-(dp783
-Vm
-I2
-sVt
-I1
-ssV_c
-p784
-(dp785
-Vo
-I1
-ssVnè
-p786
-(dp787
-Vq
-I1
-sVs
-I3
-sVr
-I5
-sVg
-I8
-ssVné
-p788
-(dp789
-Va
-I3
-sV
-I52
-sVc
-I9
-sVe
-I48
-sVd
-I1
-sVg
-I126
-sVi
-I1
-sVm
-I3
-sV,
-I4
-sV.
-I2
-sVs
-I24
-sVr
-I12
-sV;
-I1
-ssVnê
-p790
-(dp791
-Vt
-I17
-ssVnâ
-p792
-(dp793
-Vt
-I1
-ssVnç
-p794
-(dp795
-Va
-I21
-sVu
-I2
-sVo
-I7
-ssV[a
-p796
-(dp797
-V]
-I2
-ssVnô
-p798
-(dp799
-Vt
-I3
-ssV'ç
-p800
-(dp801
-Vn
-I1
-ssV'â
-p802
-(dp803
-Vm
-I5
-sVg
-I4
-ssV'à
-p804
-(dp805
-V
-I20
-ssV'ê
-p806
-(dp807
-Vt
-I38
-ssV'é
-p808
-(dp809
-Vc
-I33
-sVd
-I3
-sVg
-I4
-sVm
-I3
-sVl
-I7
-sVn
-I1
-sVq
-I1
-sVp
-I20
-sVt
-I99
-sVv
-I5
-ssV[3
-p810
-(dp811
-V]
-I10
-ssV[2
-p812
-(dp813
-V]
-I21
-ssV[1
-p814
-(dp815
-V1
-I2
-sV0
-I2
-sV2
-I2
-sV]
-I49
-ssV[7
-p816
-(dp817
-V]
-I2
-ssV[6
-p818
-(dp819
-V]
-I4
-ssV[5
-p820
-(dp821
-V]
-I4
-ssV[4
-p822
-(dp823
-V]
-I6
-ssV[9
-p824
-(dp825
-V]
-I2
-ssV[8
-p826
-(dp827
-V]
-I2
-ssV[*
-p828
-(dp829
-V]
-I3
-ssV'É
-p830
-(dp831
-VP
-I1
-sVd
-I2
-sVg
-I1
-ssVn[
-p832
-(dp833
-V1
-I2
-sV2
-I3
-ssVn_
-p834
-(dp835
-V;
-I1
-sV,
-I1
-ssVnh
-p836
-(dp837
-Va
-I1
-sVu
-I1
-sVe
-I8
-ssVni
-p838
-(dp839
-V!
-I3
-sV
-I46
-sV,
-I3
-sVa
-I6
-sVc
-I10
-sVb
-I1
-sVe
-I44
-sVg
-I3
-sVf
-I8
-sVé
-I2
-sVè
-I13
-sVm
-I4
-sVl
-I2
-sVo
-I1
-sVn
-I5
-sVq
-I1
-sVs
-I46
-sVr
-I26
-sVu
-I2
-sVt
-I20
-sVv
-I11
-sVz
-I3
-ssVnj
-p840
-(dp841
-Vu
-I4
-sVo
-I1
-ssVnk
-p842
-(dp843
-V
-I1
-sVs
-I1
-ssVnl
-p844
-(dp845
-Va
-I1
-sVy
-I5
-sVe
-I6
-sVi
-I1
-sVo
-I3
-ssVnn
-p846
-(dp847
-Va
-I78
-sVâ
-I1
-sVe
-I204
-sVi
-I9
-sVè
-I4
-sVê
-I13
-sVo
-I17
-sVé
-I48
-sVs
-I1
-sVu
-I19
-ssVno
-p848
-(dp849
-V
-I5
-sVc
-I11
-sVb
-I8
-sVe
-I1
-sVi
-I17
-sVm
-I33
-sVl
-I17
-sVn
-I40
-sVp
-I14
-sVs
-I33
-sVr
-I14
-sVu
-I206
-sVt
-I59
-sVw
-I8
-sVv
-I4
-sVy
-I5
-sVx
-I2
-sV,
-I1
-ssVna
-p850
-(dp851
-Vn
-I32
-sV
-I48
-sV,
-I10
-sV;
-I1
-sV:
-I1
-sVç
-I1
-sVc
-I5
-sVb
-I22
-sVd
-I6
-sVg
-I14
-sVi
-I101
-sVm
-I11
-sVl
-I21
-sVï
-I2
-sVî
-I10
-sVp
-I5
-sVs
-I3
-sVr
-I9
-sVu
-I5
-sVt
-I61
-sVv
-I11
-sVy
-I1
-ssVnb
-p852
-(dp853
-Ve
-I31
-ssVnc
-p854
-(dp855
-Va
-I3
-sV
-I28
-sVe
-I151
-sV!
-I1
-sVé
-I8
-sVh
-I21
-sVk
-I11
-sVl
-I17
-sVo
-I82
-sV,
-I6
-sVi
-I25
-sVs
-I5
-sVr
-I3
-sVu
-I3
-sVt
-I3
-sVè
-I6
-sVy
-I3
-ssVnd
-p856
-(dp857
-Va
-I124
-sV
-I209
-sV"
-I1
-sVe
-I278
-sVi
-I493
-sV-
-I14
-sV,
-I10
-sVo
-I22
-sV.
-I4
-sVé
-I8
-sVs
-I35
-sVr
-I101
-sVu
-I54
-sV_
-I1
-sV;
-I2
-sVî
-I1
-sV?
-I1
-sVl
-I1
-ssVne
-p858
-(dp859
-V
-I743
-sV-
-I4
-sV,
-I42
-sV.
-I19
-sV;
-I9
-sV:
-I4
-sV?
-I3
-sV[
-I1
-sVc
-I1
-sVb
-I1
-sVe
-I4
-sVi
-I5
-sVm
-I25
-sVl
-I14
-sVn
-I22
-sVs
-I80
-sVr
-I105
-sVu
-I60
-sVt
-I22
-sVw
-I7
-sVv
-I3
-sVy
-I6
-sVx
-I3
-sVz
-I25
-ssVnf
-p860
-(dp861
-Va
-I20
-sVe
-I12
-sVi
-I52
-sVl
-I2
-sVo
-I30
-sV.
-I2
-sVr
-I2
-sVu
-I8
-ssVng
-p862
-(dp863
-Va
-I8
-sV
-I64
-sVe
-I109
-sVi
-I1
-sVè
-I1
-sV-
-I12
-sVl
-I122
-sVo
-I1
-sV.
-I4
-sVé
-I18
-sVs
-I4
-sVr
-I3
-sVu
-I30
-sVt
-I28
-sV[
-I1
-sV:
-I1
-sV,
-I4
-ssVnx
-p864
-(dp865
-V
-I1
-ssVny
-p866
-(dp867
-V)
-I2
-sV
-I17
-sVs
-I1
-sVo
-I1
-ssVnz
-p868
-(dp869
-Va
-I2
-sVi
-I1
-sVe
-I10
-ssVnq
-p870
-(dp871
-V
-I13
-sVu
-I64
-ssVnr
-p872
-(dp873
-Vé
-I1
-sVa
-I2
-sVe
-I5
-sVi
-I6
-ssVns
-p874
-(dp875
-V
-I690
-sVi
-I91
-sV)
-I1
-sV-
-I17
-sV,
-I68
-sV.
-I27
-sV;
-I8
-sV:
-I1
-sV?
-I1
-sV[
-I2
-sV_
-I1
-sVa
-I5
-sVc
-I3
-sVe
-I74
-sVf
-I1
-sVé
-I8
-sVk
-I1
-sVo
-I13
-sVp
-I11
-sVs
-I1
-sVu
-I22
-sVt
-I31
-sVw
-I2
-sVy
-I4
-ssVnt
-p876
-(dp877
-V!
-I11
-sV
-I1213
-sV"
-I1
-sV*
-I1
-sV-
-I12
-sV,
-I115
-sV.
-I53
-sV;
-I32
-sV:
-I8
-sV?
-I2
-sV[
-I1
-sVa
-I70
-sVe
-I207
-sVi
-I108
-sVè
-I4
-sVl
-I2
-sVo
-I14
-sVé
-I26
-sVs
-I127
-sVr
-I116
-sVu
-I25
-sVô
-I21
-sVh
-I6
-ssVnu
-p878
-(dp879
-Va
-I11
-sV
-I18
-sVe
-I21
-sVf
-I1
-sVi
-I12
-sVè
-I1
-sVm
-I4
-sVl
-I5
-sVo
-I1
-sV.
-I2
-sVq
-I6
-sVs
-I14
-sVt
-I3
-sVy
-I4
-sV;
-I1
-sV,
-I2
-ssVnv
-p880
-(dp881
-Vi
-I27
-sVa
-I3
-sVe
-I22
-sVu
-I4
-sVo
-I16
-ssV'u
-p882
-(dp883
-Và
-I1
-sVs
-I6
-sVt
-I2
-sVn
-I156
-ssV't
-p884
-(dp885
-V
-I4
-ssV's
-p886
-(dp887
-V
-I4
-ssV'y
-p888
-(dp889
-V
-I53
-ssV'e
-p890
-(dp891
-Va
-I5
-sVf
-I7
-sVm
-I30
-sVl
-I32
-sVn
-I120
-sVs
-I162
-sVu
-I8
-sVx
-I23
-sVû
-I1
-ssV'd
-p892
-(dp893
-Vé
-I1
-ssV'a
-p894
-(dp895
-V
-I33
-sVc
-I14
-sVb
-I37
-sVd
-I6
-sVg
-I6
-sVi
-I140
-sVm
-I20
-sVl
-I13
-sVn
-I18
-sVp
-I41
-sVs
-I11
-sVr
-I24
-sVu
-I79
-sVt
-I16
-sVv
-I112
-sVy
-I9
-ssV'o
-p896
-(dp897
-Vb
-I3
-sVe
-I7
-sVf
-I2
-sVn
-I93
-sVp
-I8
-sVs
-I6
-sVr
-I27
-sVu
-I10
-ssV'i
-p898
-(dp899
-Vc
-I3
-sVd
-I3
-sVg
-I1
-sVm
-I12
-sVl
-I187
-sVn
-I45
-sVr
-I1
-sVv
-I1
-ssV'h
-p900
-(dp901
-Va
-I6
-sVe
-I2
-sVé
-I2
-sVo
-I31
-sVi
-I3
-sVu
-I10
-sVô
-I10
-sVy
-I1
-ssVn)
-p902
-(dp903
-V,
-I1
-ssV'U
-p904
-(dp905
-Vr
-I1
-ssV'T
-p906
-(dp907
-V
-I1
-ssVn,
-p908
-(dp909
-V
-I196
-ssVn-
-p910
-(dp911
-Va
-I1
-sVb
-I3
-sVi
-I1
-sVh
-I3
-sV-
-I1
-sV1
-I4
-sVt
-I11
-sV8
-I1
-ssVn.
-p912
-(dp913
-V
-I101
-sV"
-I1
-sVh
-I2
-sV-
-I1
-sV.
-I1
-sV]
-I1
-ssVn
-p914
-(dp915
-Vê
-I7
-sV"
-I1
-sVp
-I203
-sV(
-I2
-sV1
-I24
-sVÉ
-I3
-sV3
-I1
-sV2
-I3
-sV9
-I1
-sVA
-I11
-sVC
-I7
-sVB
-I2
-sVE
-I7
-sVD
-I3
-sVF
-I10
-sVI
-I12
-sVH
-I5
-sVK
-I1
-sVJ
-I8
-sVM
-I4
-sVO
-I1
-sVN
-I3
-sVP
-I7
-sVS
-I1
-sVâ
-I3
-sVT
-I4
-sVV
-I5
-sVX
-I3
-sV_
-I4
-sVa
-I184
-sVà
-I23
-sVc
-I147
-sVb
-I51
-sVe
-I101
-sVd
-I203
-sVg
-I34
-sVf
-I70
-sVé
-I24
-sVh
-I41
-sVj
-I44
-sVm
-I107
-sVl
-I81
-sVo
-I31
-sVn
-I76
-sVq
-I35
-sVi
-I36
-sVs
-I99
-sVr
-I48
-sVu
-I20
-sVt
-I79
-sVw
-I4
-sVv
-I95
-sVy
-I13
-ssVn!
-p916
-(dp917
-V
-I16
-ssVn"
-p918
-(dp919
-V
-I2
-ssVfâ
-p920
-(dp921
-Vc
-I2
-ssVn'
-p922
-(dp923
-Va
-I106
-sVe
-I67
-sVé
-I32
-sVh
-I2
-sVê
-I2
-sVo
-I11
-sVi
-I1
-sVu
-I1
-sVt
-I4
-sVy
-I36
-ssV'E
-p924
-(dp925
-Vs
-I12
-sVt
-I1
-sVu
-I7
-sVl
-I8
-sVv
-I1
-ssVn;
-p926
-(dp927
-V
-I48
-ssV'A
-p928
-(dp929
-Vr
-I3
-sVd
-I1
-sVf
-I3
-sVc
-I1
-sVm
-I3
-sVL
-I1
-sVN
-I1
-sVs
-I3
-sVn
-I7
-sVt
-I3
-sVv
-I1
-sVz
-I1
-sVl
-I8
-ssVn?
-p930
-(dp931
-V
-I4
-sV-
-I1
-ssV'O
-p932
-(dp933
-VP
-I2
-sVr
-I1
-sVN
-I1
-sVv
-I1
-sVp
-I2
-ssV'I
-p934
-(dp935
-Vs
-I1
-sVn
-I2
-sVb
-I3
-sVL
-I1
-sVt
-I2
-ssV:/
-p936
-(dp937
-V/
-I8
-ssV:
-p938
-(dp939
-V
-I2
-sV1
-I1
-sVA
-I4
-sVC
-I13
-sVE
-I4
-sVF
-I1
-sVI
-I6
-sVH
-I2
-sVJ
-I7
-sVM
-I12
-sVO
-I3
-sVN
-I4
-sVQ
-I2
-sVS
-I6
-sVU
-I1
-sVT
-I1
-sVV
-I6
-sV_
-I6
-sVa
-I3
-sVc
-I9
-sVe
-I15
-sVi
-I11
-sVj
-I12
-sVm
-I10
-sVl
-I15
-sVo
-I10
-sVn
-I8
-sVq
-I4
-sVp
-I4
-sVs
-I5
-sVu
-I3
-sVt
-I2
-sVv
-I13
-ssVHu
-p940
-(dp941
-Vm
-I1
-ssVfê
-p942
-(dp943
-Vt
-I1
-ssVép
-p944
-(dp945
-Va
-I24
-sVe
-I10
-sVé
-I9
-sVl
-I13
-sVo
-I81
-sVi
-I3
-sVr
-I18
-sVu
-I5
-ssVfî
-p946
-(dp947
-Vt
-I1
-ssVMé
-p948
-(dp949
-Vd
-I3
-sVm
-I2
-sVl
-I10
-sVo
-I1
-sVq
-I1
-sVt
-I1
-ssVMè
-p950
-(dp951
-Vn
-I1
-ssVSp
-p952
-(dp953
-Ve
-I1
-ssVAS
-p954
-(dp955
-V
-I1
-sVC
-I2
-sV-
-I1
-ssV:M
-p956
-(dp957
-Vo
-I1
-ssVM
-p958
-(dp959
-VI
-I1
-sVE
-I1
-ssVM,
-p960
-(dp961
-V
-I2
-ssVM.
-p962
-(dp963
-VA
-I1
-sV
-I22
-ssVMe
-p964
-(dp965
-Va
-I2
-sVx
-I1
-sVs
-I8
-sVc
-I1
-ssV.g
-p966
-(dp967
-Vu
-I2
-ssVMa
-p968
-(dp969
-V
-I9
-sVd
-I7
-sVi
-I32
-sVh
-I2
-sVj
-I1
-sVl
-I3
-sVn
-I1
-sVs
-I6
-sVr
-I123
-sVu
-I1
-sVt
-I1
-sVî
-I4
-ssVMo
-p970
-(dp971
-Va
-I1
-sVg
-I1
-sVi
-I2
-sVk
-I1
-sVï
-I1
-sVn
-I32
-sVs
-I2
-sVr
-I4
-ssVMi
-p972
-(dp973
-Vs
-I2
-sVc
-I7
-sVl
-I4
-sVd
-I1
-ssVMu
-p974
-(dp975
-Vl
-I2
-ssVMy
-p976
-(dp977
-Vt
-I1
-ssVME
-p978
-(dp979
-V
-I3
-sVD
-I2
-sV,
-I1
-sV.
-I1
-sVR
-I3
-sVN
-I1
-ssVMD
-p980
-(dp981
-VC
-I1
-ssVMA
-p982
-(dp983
-VD
-I1
-sVG
-I3
-sVI
-I2
-sVL
-I2
-sVN
-I2
-sVY
-I1
-ssVMB
-p984
-(dp985
-V
-I1
-sVE
-I2
-ssVMM
-p986
-(dp987
-V.
-I1
-ssVMO
-p988
-(dp989
-VU
-I1
-sVN
-I1
-ssVMN
-p990
-(dp991
-VI
-I1
-ssVMI
-p992
-(dp993
-VS
-I2
-sVT
-I3
-sVN
-I2
-ssVMP
-p994
-(dp995
-VR
-I1
-sVL
-I1
-ssVMS
-p996
-(dp997
-V
-I1
-ssVbr
-p998
-(dp999
-Va
-I34
-sVe
-I37
-sVi
-I30
-sVo
-I11
-sVu
-I19
-sVû
-I13
-ssVîl
-p1000
-(dp1001
-Ve
-I2
-ssVîm
-p1002
-(dp1003
-Vé
-I3
-sVe
-I3
-ssVîn
-p1004
-(dp1005
-Va
-I2
-sVé
-I7
-sVe
-I15
-ssVîc
-p1006
-(dp1007
-Vh
-I5
-ssVît
-p1008
-(dp1009
-V
-I14
-sVr
-I58
-ssVsû
-p1010
-(dp1011
-Vr
-I1
-ssVsé
-p1012
-(dp1013
-Va
-I1
-sV
-I30
-sVc
-I2
-sVe
-I14
-sVd
-I2
-sVj
-I3
-sVm
-I10
-sV,
-I6
-sV.
-I1
-sVq
-I8
-sVp
-I9
-sVs
-I11
-sVr
-I16
-sVv
-I1
-sVn
-I6
-sV:
-I1
-ssVsè
-p1014
-(dp1015
-Vc
-I1
-sVr
-I16
-sVd
-I3
-ssVs;
-p1016
-(dp1017
-V
-I155
-ssVs:
-p1018
-(dp1019
-V
-I35
-ssVs?
-p1020
-(dp1021
-V
-I39
-sV-
-I4
-ssV,
-p1022
-(dp1023
-VR
-I2
-sVé
-I19
-sV0
-I2
-sV1
-I6
-sVÉ
-I1
-sV3
-I1
-sV2
-I3
-sV9
-I10
-sVô
-I1
-sVA
-I7
-sVC
-I24
-sVE
-I4
-sVD
-I4
-sVG
-I1
-sVF
-I1
-sVI
-I5
-sVH
-I3
-sVK
-I3
-sVJ
-I3
-sVM
-I12
-sVL
-I5
-sVO
-I4
-sVN
-I11
-sVP
-I7
-sVS
-I4
-sVb
-I17
-sVU
-I1
-sVT
-I4
-sVW
-I3
-sVV
-I4
-sV_
-I3
-sVa
-I120
-sVà
-I47
-sVc
-I133
-sVâ
-I3
-sVe
-I601
-sVd
-I397
-sVg
-I6
-sVf
-I26
-sVi
-I120
-sVh
-I8
-sVj
-I93
-sVm
-I131
-sVl
-I228
-sVo
-I59
-sVn
-I73
-sVq
-I235
-sVp
-I116
-sVs
-I132
-sVr
-I51
-sVu
-I38
-sVt
-I68
-sVw
-I6
-sVv
-I62
-sVy
-I16
-ssVs*
-p1024
-(dp1025
-V*
-I1
-ssVs)
-p1026
-(dp1027
-V
-I1
-sV;
-I1
-sV,
-I1
-ssVs/
-p1028
-(dp1029
-Vb
-I1
-sVg
-I1
-ssVs.
-p1030
-(dp1031
-V
-I302
-sV-
-I2
-sV]
-I1
-sV.
-I1
-ssVs-
-p1032
-(dp1033
-VA
-I13
-sVà
-I1
-sVc
-I7
-sVe
-I1
-sVd
-I3
-sVÉ
-I4
-sVm
-I3
-sVj
-I9
-sVM
-I1
-sVl
-I4
-sVn
-I13
-sVt
-I3
-sVv
-I13
-sVE
-I1
-ssVs,
-p1034
-(dp1035
-Vy
-I1
-sV
-I765
-ssVs"
-p1036
-(dp1037
-V.
-I1
-ssVs!
-p1038
-(dp1039
-V
-I45
-sV*
-I1
-ssVs
-p1040
-(dp1041
-Vê
-I11
-sVî
-I1
-sVé
-I115
-sV"
-I4
-sV(
-I2
-sV*
-I1
-sV-
-I1
-sV1
-I5
-sV3
-I1
-sV2
-I1
-sV:
-I1
-sVâ
-I1
-sVA
-I7
-sVC
-I12
-sVB
-I20
-sVE
-I9
-sVD
-I1
-sVF
-I1
-sVI
-I4
-sVH
-I1
-sVJ
-I5
-sVM
-I4
-sVL
-I2
-sVO
-I7
-sVP
-I14
-sVS
-I3
-sVR
-I7
-sVT
-I4
-sVW
-I1
-sVY
-I1
-sVX
-I11
-sV_
-I12
-sVa
-I375
-sVà
-I97
-sVc
-I294
-sVb
-I120
-sVe
-I236
-sVd
-I770
-sVg
-I70
-sVf
-I147
-sVi
-I93
-sVh
-I69
-sVk
-I1
-sVj
-I75
-sVm
-I224
-sVl
-I448
-sVo
-I76
-sVn
-I153
-sVq
-I224
-sVp
-I375
-sVs
-I294
-sVr
-I145
-sVu
-I116
-sVt
-I153
-sVw
-I12
-sVv
-I122
-sVy
-I35
-ssVs'
-p1042
-(dp1043
-Va
-I30
-sVe
-I39
-sVé
-I35
-sVê
-I2
-sVo
-I5
-sVi
-I25
-sVy
-I4
-ssVs[
-p1044
-(dp1045
-V1
-I6
-sV2
-I1
-sV5
-I1
-sV4
-I2
-ssVs_
-p1046
-(dp1047
-V
-I1
-sV,
-I11
-sV.
-I5
-ssV?.
-p1048
-(dp1049
-V.
-I1
-ssV?-
-p1050
-(dp1051
-V-
-I9
-ssV?
-p1052
-(dp1053
-V
-I36
-sVC
-I8
-sVB
-I1
-sVE
-I6
-sVD
-I1
-sVI
-I6
-sVJ
-I8
-sVM
-I5
-sVL
-I2
-sVO
-I3
-sVN
-I1
-sVQ
-I2
-sVP
-I2
-sVS
-I1
-sVT
-I2
-sVV
-I2
-sVY
-I1
-sVc
-I3
-sVe
-I6
-sVd
-I26
-sVi
-I1
-sVj
-I1
-sVl
-I3
-sVo
-I3
-sVn
-I1
-sVq
-I3
-sVp
-I2
-sVs
-I2
-sVv
-I2
-sVy
-I1
-ssVsy
-p1054
-(dp1055
-Vs
-I3
-sVl
-I4
-ssV,c
-p1056
-(dp1057
-Ve
-I1
-ssVss
-p1058
-(dp1059
-Va
-I127
-sV
-I45
-sVe
-I286
-sVi
-I149
-sVè
-I10
-sV,
-I30
-sVo
-I17
-sV.
-I11
-sVé
-I41
-sV!
-I8
-sVu
-I24
-sV[
-I1
-sV:
-I1
-sV;
-I7
-sV?
-I1
-ssVsr
-p1060
-(dp1061
-Va
-I3
-ssVsq
-p1062
-(dp1063
-Vu
-I55
-sV'
-I1
-ssVsp
-p1064
-(dp1065
-Va
-I27
-sVe
-I30
-sVé
-I14
-sVè
-I12
-sVl
-I2
-sVo
-I15
-sVi
-I8
-sVr
-I15
-sVu
-I11
-sVh
-I1
-ssVsw
-p1066
-(dp1067
-Ve
-I2
-ssVsu
-p1068
-(dp1069
-Va
-I4
-sV
-I7
-sVc
-I10
-sVb
-I12
-sVe
-I2
-sVg
-I1
-sVf
-I6
-sVi
-I122
-sVj
-I5
-sVm
-I3
-sVl
-I14
-sVp
-I9
-sVs
-I9
-sVr
-I179
-sVy
-I5
-ssVst
-p1070
-(dp1071
-Va
-I74
-sV
-I312
-sVe
-I82
-sVé
-I21
-sVi
-I47
-sVh
-I1
-sV-
-I26
-sV,
-I7
-sVo
-I23
-sV.
-I2
-sVp
-I12
-sVs
-I1
-sVr
-I50
-sVu
-I6
-sV_
-I1
-sVè
-I6
-sVy
-I2
-sV[
-I1
-sV?
-I1
-ssVsk
-p1072
-(dp1073
-Va
-I2
-sV
-I3
-sVi
-I4
-sV,
-I1
-sV.
-I1
-sV)
-I1
-ssVsi
-p1074
-(dp1075
-V
-I163
-sV,
-I10
-sV.
-I3
-sV;
-I1
-sV?
-I2
-sVa
-I3
-sVc
-I12
-sVb
-I26
-sVe
-I102
-sVd
-I4
-sVg
-I15
-sVf
-I4
-sVé
-I3
-sVè
-I17
-sVm
-I7
-sVl
-I6
-sVo
-I53
-sVn
-I50
-sVq
-I15
-sVp
-I4
-sVs
-I10
-sVr
-I32
-sVt
-I75
-sVv
-I1
-sVx
-I27
-ssVsh
-p1076
-(dp1077
-Va
-I2
-sV
-I2
-sVi
-I3
-sVo
-I4
-sV,
-I1
-ssVso
-p1078
-(dp1079
-V
-I8
-sVc
-I8
-sVe
-I21
-sVf
-I4
-sVi
-I56
-sVm
-I18
-sVl
-I47
-sVn
-I327
-sVp
-I23
-sVr
-I31
-sVu
-I130
-sVt
-I9
-sVy
-I1
-sV.
-I1
-ssVsm
-p1080
-(dp1081
-Va
-I5
-sVe
-I6
-sVo
-I4
-ssV,q
-p1082
-(dp1083
-Vu
-I1
-ssVsc
-p1084
-(dp1085
-Va
-I16
-sVe
-I4
-sVi
-I13
-sVh
-I1
-sVl
-I15
-sVo
-I23
-sVé
-I1
-sVr
-I11
-sVu
-I4
-sVè
-I4
-ssVsb
-p1086
-(dp1087
-Vi
-I1
-sVo
-I11
-ssVsa
-p1088
-(dp1089
-V
-I122
-sVc
-I19
-sVb
-I8
-sVd
-I1
-sVg
-I33
-sVi
-I173
-sV-
-I2
-sVm
-I3
-sVl
-I13
-sVn
-I129
-sVs
-I8
-sVr
-I6
-sVu
-I16
-sVt
-I11
-sVv
-I42
-sV;
-I2
-sV.
-I1
-sV,
-I2
-sV_
-I1
-ssVsf
-p1090
-(dp1091
-Va
-I2
-sVi
-I1
-sVe
-I1
-ssVse
-p1092
-(dp1093
-V!
-I1
-sV
-I326
-sV-
-I3
-sV,
-I51
-sV.
-I34
-sV;
-I15
-sV:
-I4
-sV?
-I3
-sV_
-I3
-sVa
-I55
-sVc
-I21
-sVe
-I2
-sVd
-I8
-sVi
-I40
-sVm
-I40
-sVl
-I73
-sVo
-I1
-sVn
-I96
-sVq
-I5
-sVp
-I8
-sVs
-I139
-sVr
-I166
-sVu
-I26
-sVt
-I6
-sVv
-I2
-sVy
-I1
-sVx
-I3
-sVz
-I46
-ssV,y
-p1094
-(dp1095
-V
-I1
-ssVRu
-p1096
-(dp1097
-Vp
-I2
-sVs
-I8
-ssVeç
-p1098
-(dp1099
-Vû
-I1
-sVu
-I14
-sVo
-I8
-ssVRe
-p1100
-(dp1101
-Va
-I1
-sVf
-I1
-sVm
-I2
-sVl
-I1
-sVp
-I1
-sVv
-I1
-ssVRa
-p1102
-(dp1103
-Vp
-I1
-sVb
-I1
-sVl
-I1
-sVg
-I3
-sVv
-I1
-ssVeû
-p1104
-(dp1105
-Vm
-I1
-sVt
-I10
-ssVRo
-p1106
-(dp1107
-Vb
-I3
-sVm
-I5
-sVs
-I2
-sVu
-I4
-sVt
-I1
-sVy
-I1
-ssVRh
-p1108
-(dp1109
-Vo
-I1
-ssVRi
-p1110
-(dp1111
-Vc
-I2
-sVe
-I3
-sVg
-I2
-ssVRT
-p1112
-(dp1113
-VI
-I2
-sV*
-I2
-ssVRU
-p1114
-(dp1115
-VE
-I3
-sVT
-I1
-ssVRW
-p1116
-(dp1117
-VI
-I1
-ssVRP
-p1118
-(dp1119
-VO
-I1
-ssVRR
-p1120
-(dp1121
-VA
-I4
-ssVRS
-p1122
-(dp1123
-VI
-I2
-sVQ
-I1
-ssVÉE
-p1124
-(dp1125
-VS
-I1
-ssVRD
-p1126
-(dp1127
-VE
-I1
-ssVRE
-p1128
-(dp1129
-V!
-I1
-sV
-I32
-sVC
-I1
-sVM
-I1
-sV,
-I2
-sV.
-I1
-sVS
-I3
-sVA
-I2
-ssVRG
-p1130
-(dp1131
-V"
-I2
-sV-
-I6
-ssVRA
-p1132
-(dp1133
-VC
-I1
-sVD
-I1
-sVI
-I1
-sVH
-I1
-sVL
-I1
-sVN
-I4
-ssVRC
-p1134
-(dp1135
-VH
-I1
-ssVRM
-p1136
-(dp1137
-VI
-I1
-ssVRO
-p1138
-(dp1139
-VU
-I1
-sVV
-I1
-sVJ
-I8
-sVM
-I1
-sVN
-I1
-ssVRI
-p1140
-(dp1141
-VC
-I1
-sVB
-I1
-sVE
-I1
-sVM
-I1
-sVN
-I2
-sVS
-I1
-ssVR
-p1142
-(dp1143
-VA
-I2
-sV
-I1
-sVC
-I1
-sVB
-I1
-sVF
-I2
-sVI
-I2
-sVO
-I1
-sVN
-I1
-sVP
-I3
-sVS
-I1
-sVR
-I2
-sV"
-I1
-ssVR,
-p1144
-(dp1145
-V
-I6
-ssVR.
-p1146
-(dp1147
-V
-I1
-ssVR*
-p1148
-(dp1149
-V:
-I1
-ssVem
-p1150
-(dp1151
-Va
-I83
-sV
-I4
-sVb
-I79
-sVe
-I206
-sVi
-I48
-sVm
-I44
-sVo
-I67
-sVn
-I2
-sVp
-I104
-sVs
-I1
-sVu
-I2
-ssVel
-p1152
-(dp1153
-Va
-I38
-sV
-I77
-sVc
-I1
-sVe
-I16
-sVà
-I1
-sVi
-I15
-sVl
-I357
-sVo
-I16
-sV,
-I8
-sVq
-I88
-sVé
-I6
-sVs
-I9
-sV!
-I5
-sVu
-I19
-sV.
-I1
-sVy
-I3
-sV;
-I3
-sV:
-I1
-sVp
-I1
-sV[
-I2
-ssVà
-p1154
-(dp1155
-VA
-I4
-sVC
-I45
-sVB
-I9
-sVE
-I1
-sVD
-I1
-sVH
-I1
-sVM
-I20
-sVL
-I7
-sVN
-I3
-sVP
-I16
-sVS
-I5
-sVR
-I6
-sVU
-I1
-sVT
-I3
-sVV
-I27
-sV_
-I3
-sVa
-I2
-sVc
-I49
-sVb
-I6
-sVe
-I11
-sVd
-I31
-sVg
-I9
-sVf
-I10
-sVh
-I1
-sVj
-I2
-sVm
-I38
-sVl
-I133
-sVo
-I1
-sVn
-I4
-sVq
-I23
-sVp
-I38
-sVs
-I37
-sVr
-I6
-sVu
-I38
-sVt
-I41
-sVv
-I17
-ssVen
-p1156
-(dp1157
-V!
-I9
-sV
-I590
-sV-
-I12
-sV,
-I25
-sV.
-I14
-sVh
-I1
-sV;
-I6
-sV:
-I5
-sV?
-I1
-sVô
-I1
-sVç
-I4
-sV[
-I2
-sVa
-I69
-sVc
-I143
-sVb
-I31
-sVe
-I32
-sVd
-I266
-sVg
-I10
-sVf
-I64
-sVi
-I61
-sVè
-I4
-sVê
-I4
-sVl
-I5
-sVo
-I13
-sVn
-I42
-sVq
-I1
-sVé
-I5
-sVs
-I130
-sVr
-I10
-sVu
-I30
-sVt
-I1178
-sVv
-I36
-sVy
-I1
-sVz
-I2
-ssVei
-p1158
-(dp1159
-Vb
-I2
-sVg
-I33
-sVl
-I144
-sVn
-I41
-sVp
-I1
-sVt
-I2
-sVv
-I11
-sVz
-I1
-ssVeh
-p1160
-(dp1161
-V!
-I1
-sVa
-I1
-sVl
-I4
-ssVej
-p1162
-(dp1163
-Ve
-I1
-ssVee
-p1164
-(dp1165
-V!
-I1
-sV
-I12
-sVd
-I4
-sV,
-I1
-sVn
-I3
-sVp
-I1
-sVs
-I4
-sVr
-I2
-sVl
-I2
-ssVed
-p1166
-(dp1167
-V
-I70
-sVe
-I1
-sVi
-I17
-sV,
-I9
-sVo
-I8
-sV.
-I3
-sV)
-I1
-sVs
-I15
-sVu
-I4
-sV_
-I2
-sV?
-I1
-ssVeg
-p1168
-(dp1169
-Vi
-I5
-sVa
-I30
-sVr
-I2
-sVo
-I2
-ssVef
-p1170
-(dp1171
-Va
-I1
-sV
-I3
-sVe
-I10
-sVf
-I34
-sV-
-I2
-sVo
-I18
-sVs
-I1
-sVr
-I1
-sVu
-I9
-ssVea
-p1172
-(dp1173
-V
-I8
-sVc
-I6
-sVd
-I21
-sVi
-I7
-sVm
-I1
-sVn
-I8
-sVs
-I14
-sVr
-I9
-sVu
-I201
-sVt
-I3
-sVv
-I1
-ssVec
-p1174
-(dp1175
-V
-I128
-sVe
-I22
-sVi
-I14
-sVh
-I3
-sVk
-I7
-sVo
-I37
-sVs
-I1
-sVr
-I9
-sVu
-I7
-sVt
-I82
-sVz
-I1
-ssVeb
-p1176
-(dp1177
-Va
-I1
-sV
-I2
-sVr
-I5
-sVu
-I2
-sVo
-I1
-ssVey
-p1178
-(dp1179
-Vd
-I1
-sV
-I15
-sV,
-I4
-sV_
-I1
-sV.
-I1
-ssVex
-p1180
-(dp1181
-Va
-I7
-sVc
-I22
-sVe
-I20
-sVi
-I9
-sVé
-I8
-sVo
-I1
-sVq
-I1
-sVp
-I28
-sVt
-I44
-sV_
-I1
-ssVez
-p1182
-(dp1183
-V!
-I3
-sV
-I236
-sV-
-I63
-sV,
-I34
-sV.
-I8
-sV;
-I3
-ssVeu
-p1184
-(dp1185
-V!
-I2
-sV
-I117
-sVe
-I13
-sVf
-I7
-sVi
-I9
-sVm
-I2
-sVl
-I22
-sVn
-I31
-sVp
-I8
-sVs
-I34
-sVr
-I636
-sVt
-I70
-sVv
-I17
-sVx
-I290
-sV;
-I2
-sV.
-I4
-sV,
-I6
-sV?
-I1
-ssVet
-p1186
-(dp1187
-Va
-I21
-sV
-I1033
-sVc
-I3
-sVe
-I26
-sVi
-I46
-sVh
-I5
-sV-
-I1
-sV,
-I24
-sVo
-I18
-sV.
-I11
-sVé
-I10
-sVs
-I22
-sVr
-I12
-sVu
-I5
-sVt
-I187
-sV;
-I4
-sV_
-I1
-sV/
-I3
-ssVew
-p1188
-(dp1189
-V
-I11
-sVs
-I3
-sVt
-I1
-ssVev
-p1190
-(dp1191
-Va
-I52
-sVâ
-I1
-sVe
-I54
-sVé
-I11
-sVè
-I1
-sVê
-I1
-sVo
-I12
-sVi
-I21
-sVr
-I3
-sVu
-I3
-ssVeq
-p1192
-(dp1193
-Vu
-I46
-ssVep
-p1194
-(dp1195
-Va
-I19
-sV
-I1
-sVe
-I12
-sVl
-I4
-sVo
-I2
-sVp
-I4
-sVr
-I22
-sVu
-I10
-sVt
-I21
-ssVes
-p1196
-(dp1197
-Va
-I33
-sV
-I1914
-sVc
-I22
-sVe
-I10
-sV)
-I1
-sV-
-I23
-sV,
-I268
-sVo
-I8
-sV.
-I133
-sVq
-I11
-sVp
-I67
-sVs
-I151
-sV!
-I11
-sVu
-I3
-sVt
-I425
-sV;
-I67
-sV:
-I23
-sV[
-I3
-sV_
-I10
-sV?
-I9
-ssVer
-p1198
-(dp1199
-V!
-I4
-sV
-I531
-sV*
-I2
-sV-
-I11
-sV,
-I79
-sV/
-I1
-sV.
-I62
-sV;
-I26
-sV:
-I7
-sV?
-I3
-sVç
-I13
-sV]
-I2
-sVa
-I85
-sVc
-I36
-sVb
-I1
-sVe
-I40
-sVd
-I43
-sVg
-I43
-sVf
-I7
-sVi
-I46
-sVm
-I50
-sVl
-I5
-sVo
-I20
-sVn
-I44
-sVp
-I5
-sVs
-I197
-sVr
-I120
-sVt
-I60
-sVw
-I1
-sVv
-I53
-ssVeM
-p1200
-(dp1201
-Va
-I1
-ssVeB
-p1202
-(dp1203
-Vo
-I46
-ssVe]
-p1204
-(dp1205
-V
-I1
-ssVe_
-p1206
-(dp1207
-V
-I6
-sV,
-I13
-sV.
-I13
-sV[
-I1
-sV:
-I1
-sV;
-I2
-ssVRÂ
-p1208
-(dp1209
-VC
-I1
-ssVfy
-p1210
-(dp1211
-V
-I2
-sV,
-I1
-ssVRÉ
-p1212
-(dp1213
-VF
-I1
-ssVe-
-p1214
-(dp1215
-Vc
-I9
-sVE
-I1
-sVD
-I2
-sVG
-I2
-sVf
-I1
-sVj
-I1
-sVm
-I6
-sVl
-I9
-sVN
-I1
-sVs
-I2
-sVt
-I5
-sVv
-I2
-ssVe,
-p1216
-(dp1217
-Vq
-I1
-sV
-I911
-ssVe.
-p1218
-(dp1219
-V
-I443
-sV-
-I2
-sV.
-I2
-ssVe)
-p1220
-(dp1221
-V
-I3
-ssVe!
-p1222
-(dp1223
-V)
-I1
-sV
-I47
-sV-
-I1
-ssVe
-p1224
-(dp1225
-Vê
-I4
-sVî
-I1
-sVâ
-I4
-sVé
-I69
-sV"
-I5
-sV$
-I1
-sV(
-I2
-sV1
-I22
-sV3
-I2
-sV2
-I3
-sV5
-I1
-sV4
-I7
-sV7
-I1
-sV6
-I1
-sV:
-I1
-sV?
-I1
-sVô
-I1
-sVA
-I6
-sVC
-I141
-sVB
-I16
-sVE
-I2
-sVD
-I11
-sVG
-I14
-sVF
-I16
-sVI
-I11
-sVH
-I6
-sVK
-I4
-sVJ
-I9
-sVM
-I32
-sVL
-I30
-sVN
-I6
-sVP
-I65
-sVS
-I11
-sVR
-I7
-sVU
-I4
-sVT
-I19
-sVW
-I3
-sVV
-I23
-sVX
-I42
-sV_
-I18
-sVa
-I240
-sVà
-I123
-sVc
-I463
-sVb
-I169
-sVe
-I291
-sVd
-I824
-sVg
-I88
-sVf
-I283
-sVi
-I68
-sVh
-I53
-sVk
-I1
-sVj
-I156
-sVm
-I479
-sVl
-I694
-sVo
-I77
-sVn
-I264
-sVq
-I304
-sVp
-I558
-sVs
-I511
-sVr
-I229
-sVu
-I64
-sVt
-I320
-sVw
-I12
-sVv
-I327
-sVy
-I8
-sVz
-I1
-ssVe?
-p1226
-(dp1227
-V
-I68
-sV-
-I1
-ssVe;
-p1228
-(dp1229
-V
-I260
-ssVe:
-p1230
-(dp1231
-V
-I87
-ssV..
-p1232
-(dp1233
-V
-I6
-sV-
-I1
-sV.
-I18
-ssVxi
-p1234
-(dp1235
-Vc
-I1
-sVb
-I1
-sVè
-I4
-sVm
-I3
-sVl
-I1
-sVo
-I4
-sVs
-I2
-ssVxo
-p1236
-(dp1237
-Vr
-I1
-ssVxc
-p1238
-(dp1239
-Ve
-I15
-sVé
-I1
-sVè
-I1
-sVl
-I2
-sVo
-I2
-sVu
-I2
-ssVxa
-p1240
-(dp1241
-Vs
-I1
-sVc
-I2
-sVm
-I2
-sV,
-I1
-sVn
-I8
-ssV1]
-p1242
-(dp1243
-V
-I31
-sV,
-I8
-sV.
-I5
-sV;
-I4
-sV:
-I1
-sV?
-I2
-ssVxe
-p1244
-(dp1245
-V
-I2
-sVs
-I4
-sVr
-I9
-sVm
-I9
-sV,
-I1
-ssVxp
-p1246
-(dp1247
-Ve
-I5
-sVé
-I4
-sVl
-I7
-sVo
-I3
-sVi
-I1
-sVr
-I6
-sVu
-I2
-ssVxq
-p1248
-(dp1249
-Vu
-I1
-ssVxt
-p1250
-(dp1251
-Va
-I2
-sV
-I17
-sVe
-I6
-sVo
-I1
-sVs
-I4
-sVr
-I21
-ssVDè
-p1252
-(dp1253
-Vs
-I3
-ssVDé
-p1254
-(dp1255
-Vc
-I1
-ssVx[
-p1256
-(dp1257
-V1
-I1
-ssV1e
-p1258
-(dp1259
-Vr
-I1
-ssVx_
-p1260
-(dp1261
-V,
-I2
-ssVx.
-p1262
-(dp1263
-V)
-I1
-sV
-I27
-sVc
-I2
-ssVx,
-p1264
-(dp1265
-V
-I40
-ssVx-
-p1266
-(dp1267
-Va
-I1
-sVb
-I2
-sVd
-I2
-sVh
-I1
-sVm
-I3
-sVs
-I1
-sVt
-I1
-ssVx
-p1268
-(dp1269
-Vi
-I3
-sVB
-I1
-sVD
-I1
-sVH
-I1
-sVJ
-I2
-sVP
-I1
-sVa
-I26
-sVà
-I5
-sVc
-I20
-sVb
-I3
-sVe
-I18
-sVd
-I42
-sVg
-I7
-sVf
-I28
-sVé
-I15
-sVh
-I8
-sVj
-I3
-sVm
-I42
-sVl
-I13
-sVo
-I3
-sVn
-I8
-sVq
-I31
-sVp
-I27
-sVs
-I14
-sVr
-I10
-sVu
-I3
-sVt
-I7
-sVv
-I15
-sVy
-I1
-ssVx!
-p1270
-(dp1271
-V
-I1
-ssVx:
-p1272
-(dp1273
-V
-I2
-ssVx;
-p1274
-(dp1275
-V
-I15
-ssVx?
-p1276
-(dp1277
-V
-I1
-ssV11
-p1278
-(dp1279
-V
-I1
-sV/
-I1
-sV.
-I2
-sV3
-I1
-sV;
-I1
-sV]
-I2
-ssV10
-p1280
-(dp1281
-Va
-I2
-sV
-I4
-sV.
-I4
-sV0
-I4
-sV9
-I1
-sV]
-I2
-ssV13
-p1282
-(dp1283
-V
-I1
-ssV12
-p1284
-(dp1285
-V.
-I1
-sV4
-I1
-sV6
-I1
-sV;
-I1
-sV]
-I2
-sV_
-I1
-ssV15
-p1286
-(dp1287
-V
-I1
-sV)
-I1
-sV,
-I1
-sV.
-I1
-sV0
-I1
-sV2
-I1
-sV4
-I2
-sV9
-I2
-ssV14
-p1288
-(dp1289
-V
-I2
-sV-
-I1
-sV7
-I1
-ssV17
-p1290
-(dp1291
-V1
-I2
-sV0
-I2
-sV3
-I8
-sV5
-I14
-sV7
-I2
-sV6
-I20
-sV9
-I1
-sV8
-I3
-ssV16
-p1292
-(dp1293
-V9
-I1
-sV
-I1
-sV1
-I2
-sV4
-I1
-sV7
-I1
-ssV19
-p1294
-(dp1295
-V9
-I5
-sV7
-I3
-ssV18
-p1296
-(dp1297
-V1
-I1
-sV0
-I2
-sV2
-I3
-sV,
-I1
-sV
-I1
-ssV1;
-p1298
-(dp1299
-V
-I2
-ssV1
-p1300
-(dp1301
-VO
-I1
-sV
-I1
-sVb
-I1
-sVf
-I1
-sVJ
-I2
-sVo
-I1
-sVN
-I1
-sVs
-I1
-sVT
-I1
-ssV1(
-p1302
-(dp1303
-Vc
-I2
-ssV1*
-p1304
-(dp1305
-V*
-I1
-ssV1-
-p1306
-(dp1307
-V2
-I1
-ssV1,
-p1308
-(dp1309
-V
-I5
-ssV1/
-p1310
-(dp1311
-V0
-I1
-ssV1.
-p1312
-(dp1313
-V
-I2
-sVt
-I2
-ssVDO
-p1314
-(dp1315
-VC
-I2
-sVM
-I2
-sVT
-I1
-sVN
-I1
-ssVxé
-p1316
-(dp1317
-Vc
-I8
-ssVDI
-p1318
-(dp1319
-VC
-I2
-sVE
-I1
-sVD
-I4
-sVN
-I2
-sVS
-I2
-sVR
-I1
-sVU
-I1
-sVT
-I3
-ssVDD
-p1320
-(dp1321
-VI
-I1
-ssVDE
-p1322
-(dp1323
-V
-I10
-sVD
-I1
-sVM
-I1
-sV,
-I2
-sVN
-I2
-sVR
-I2
-sVT
-I1
-sV.
-I1
-ssVDC
-p1324
-(dp1325
-VC
-I1
-ssVDA
-p1326
-(dp1327
-VM
-I3
-sVN
-I1
-ssVDU
-p1328
-(dp1329
-VI
-I1
-sV
-I2
-ssVDo
-p1330
-(dp1331
-V
-I1
-sVr
-I3
-sVm
-I2
-sVn
-I4
-ssVDi
-p1332
-(dp1333
-Va
-I1
-sVs
-I2
-sVe
-I26
-sVd
-I1
-sVo
-I1
-ssVDe
-p1334
-(dp1335
-V
-I11
-sVc
-I6
-sVf
-I4
-sVm
-I1
-sVl
-I1
-sVn
-I1
-sVs
-I5
-sVu
-I2
-ssVDa
-p1336
-(dp1337
-Vk
-I1
-sVr
-I2
-sVm
-I4
-sVt
-I1
-sVn
-I10
-ssVD,
-p1338
-(dp1339
-V
-I2
-ssVD*
-p1340
-(dp1341
-V
-I1
-ssVD'
-p1342
-(dp1343
-VA
-I1
-sVa
-I1
-sVu
-I1
-ssVD
-p1344
-(dp1345
-VM
-I1
-sVT
-I5
-sVW
-I1
-ssVWE
-p1346
-(dp1347
-VR
-I1
-ssVWA
-p1348
-(dp1349
-VR
-I4
-sVN
-I1
-ssVWI
-p1350
-(dp1351
-VS
-I1
-ssVWH
-p1352
-(dp1353
-VA
-I1
-ssVWe
-p1354
-(dp1355
-V
-I10
-sVs
-I2
-sVr
-I1
-sVb
-I2
-sVl
-I1
-ssVWa
-p1356
-(dp1357
-Vs
-I1
-ssVWo
-p1358
-(dp1359
-Vr
-I1
-ssVWi
-p1360
-(dp1361
-Vs
-I1
-sVr
-I1
-ssVWh
-p1362
-(dp1363
-Vi
-I1
-sVy
-I1
-ssVWy
-p1364
-(dp1365
-Vo
-I1
-ssVÉP
-p1366
-(dp1367
-VE
-I1
-ssVjé
-p1368
-(dp1369
-Vs
-I33
-ssVjà
-p1370
-(dp1371
-V
-I17
-ssVÉF
-p1372
-(dp1373
-VA
-I1
-ssV$2
-p1374
-(dp1375
-V
-I1
-ssVÉp
-p1376
-(dp1377
-Vi
-I1
-ssV.o
-p1378
-(dp1379
-Vr
-I2
-ssVÉt
-p1380
-(dp1381
-Vo
-I1
-ssVÉl
-p1382
-(dp1383
-Vé
-I1
-sVi
-I1
-sVa
-I1
-ssVÉn
-p1384
-(dp1385
-Vé
-I2
-ssVPM
-p1386
-(dp1387
-VB
-I1
-ssVÉd
-p1388
-(dp1389
-Vi
-I1
-sVe
-I1
-sVo
-I5
-ssVÉg
-p1390
-(dp1391
-Vy
-I1
-sVl
-I2
-ssV.c
-p1392
-(dp1393
-Vo
-I2
-ssVus
-p1394
-(dp1395
-V!
-I1
-sV
-I842
-sVp
-I3
-sV-
-I9
-sV,
-I51
-sV.
-I14
-sV;
-I6
-sV:
-I2
-sV?
-I14
-sV[
-I1
-sV_
-I1
-sVa
-I17
-sVc
-I2
-sVe
-I78
-sVé
-I6
-sVè
-I1
-sVl
-I1
-sVo
-I1
-sVq
-I26
-sVi
-I34
-sVs
-I90
-sVu
-I4
-sVt
-I36
-ssVj'
-p1396
-(dp1397
-Va
-I81
-sVe
-I9
-sVi
-I2
-sVo
-I1
-sVé
-I14
-sVy
-I6
-ssV#6
-p1398
-(dp1399
-V
-I1
-ssV#4
-p1400
-(dp1401
-V6
-I1
-ssV.z
-p1402
-(dp1403
-Vi
-I2
-ssVju
-p1404
-(dp1405
-Vi
-I2
-sVp
-I1
-sVs
-I42
-sVr
-I8
-sVg
-I16
-ssVjo
-p1406
-(dp1407
-Va
-I1
-sVi
-I9
-sVs
-I2
-sVu
-I137
-sVl
-I10
-ssVje
-p1408
-(dp1409
-V
-I287
-sVc
-I34
-sV,
-I1
-sV.
-I1
-sVs
-I15
-sVu
-I30
-sVt
-I32
-sV?
-I3
-ssVja
-p1410
-(dp1411
-Vc
-I1
-sVm
-I56
-sVl
-I4
-sVn
-I6
-sVr
-I11
-sVu
-I2
-ssVua
-p1412
-(dp1413
-V
-I26
-sV:
-I2
-sVd
-I4
-sVg
-I1
-sVi
-I38
-sV-
-I1
-sVl
-I4
-sVn
-I77
-sVq
-I1
-sV.
-I1
-sVr
-I28
-sVu
-I1
-sVt
-I32
-sVz
-I1
-sVb
-I1
-sV,
-I2
-ssV6
-p1414
-(dp1415
-Vi
-I1
-sVa
-I1
-sV;
-I1
-sVm
-I1
-sVn
-I1
-ssV6,
-p1416
-(dp1417
-V
-I8
-ssV6.
-p1418
-(dp1419
-V)
-I1
-sV
-I4
-ssV60
-p1420
-(dp1421
-V0
-I1
-sV
-I1
-sV.
-I1
-ssV61
-p1422
-(dp1423
-V0
-I2
-sV;
-I1
-sV,
-I3
-sV.
-I2
-ssV62
-p1424
-(dp1425
-V2
-I2
-sV.
-I1
-ssV63
-p1426
-(dp1427
-V.
-I2
-ssV64
-p1428
-(dp1429
-V4
-I1
-sV-
-I2
-sV,
-I1
-sV.
-I1
-ssV65
-p1430
-(dp1431
-V0
-I1
-sV5
-I1
-ssV66
-p1432
-(dp1433
-V;
-I1
-sV,
-I3
-ssV67
-p1434
-(dp1435
-V;
-I1
-sV2
-I1
-ssV68
-p1436
-(dp1437
-V,
-I2
-ssV69
-p1438
-(dp1439
-V,
-I1
-sV6
-I1
-ssV6;
-p1440
-(dp1441
-V
-I2
-ssVï
-p1442
-(dp1443
-Vc
-I1
-ssV_l
-p1444
-(dp1445
-Vi
-I1
-sVa
-I1
-sVe
-I2
-sV'
-I2
-ssVrâ
-p1446
-(dp1447
-Vc
-I13
-sVt
-I1
-sVn
-I1
-ssV»
-p1448
-(dp1449
-V(
-I1
-ssVïo
-p1450
-(dp1451
-Vn
-I4
-ssVïm
-p1452
-(dp1453
-Va
-I1
-sVb
-I1
-ssVïf
-p1454
-(dp1455
-V
-I1
-ssVïe
-p1456
-(dp1457
-V;
-I1
-ssVïa
-p1458
-(dp1459
-Vr
-I2
-sVd
-I1
-ssV_a
-p1460
-(dp1461
-Vu
-I1
-sVl
-I1
-ssVïv
-p1462
-(dp1463
-Ve
-I1
-ssVïs
-p1464
-(dp1465
-V
-I1
-sVs
-I1
-sVe
-I2
-ssV6]
-p1466
-(dp1467
-V
-I3
-sV;
-I1
-ssVïq
-p1468
-(dp1469
-Vu
-I1
-ssV'
-p1470
-(dp1471
-VI
-I1
-sVL
-I1
-ssVI;
-p1472
-(dp1473
-V
-I1
-ssVI:
-p1474
-(dp1475
-V
-I1
-ssVI-
-p1476
-(dp1477
-V1
-I1
-ssVI,
-p1478
-(dp1479
-V
-I32
-ssVI.
-p1480
-(dp1481
-V
-I18
-ssVI
-p1482
-(dp1483
-Va
-I1
-sVf
-I2
-sVd
-I12
-sVn
-I1
-ssVà?
-p1484
-(dp1485
-V
-I2
-ssVIX
-p1486
-(dp1487
-V
-I1
-sV.
-I4
-ssVI[
-p1488
-(dp1489
-V1
-I2
-ssVI_
-p1490
-(dp1491
-V
-I1
-ssVIS
-p1492
-(dp1493
-V
-I3
-sVC
-I1
-sV"
-I1
-sVE
-I1
-sVM
-I2
-sV,
-I1
-sVO
-I1
-sVS
-I1
-sVT
-I1
-ssVIR
-p1494
-(dp1495
-VM
-I1
-sVE
-I4
-sV,
-I1
-ssVIU
-p1496
-(dp1497
-VM
-I1
-ssVIT
-p1498
-(dp1499
-V
-I2
-sVE
-I3
-sVI
-I4
-sVH
-I1
-sVN
-I1
-sVR
-I30
-sVY
-I4
-ssVIV
-p1500
-(dp1501
-V
-I2
-sVE
-I2
-sV.
-I3
-sV_
-I2
-sV:
-I1
-sV?
-I1
-ssVII
-p1502
-(dp1503
-V
-I16
-sVI
-I22
-sV,
-I18
-sV.
-I10
-sV[
-I2
-sV_
-I1
-ssVIM
-p1504
-(dp1505
-VI
-I5
-sVP
-I2
-sVE
-I2
-ssVIL
-p1506
-(dp1507
-VI
-I3
-sV
-I1
-sVS
-I1
-ssVIO
-p1508
-(dp1509
-VN
-I6
-ssVIN
-p1510
-(dp1511
-V
-I6
-sVC
-I3
-sVD
-I4
-sVG
-I3
-sVT
-I2
-ssVIA
-p1512
-(dp1513
-VB
-I1
-sVL
-I1
-ssVIC
-p1514
-(dp1515
-V
-I4
-sVU
-I1
-sVE
-I1
-sVT
-I1
-ssVIB
-p1516
-(dp1517
-VI
-I1
-sVR
-I1
-sVU
-I1
-ssVIE
-p1518
-(dp1519
-V
-I1
-sVS
-I3
-sVD
-I1
-sVN
-I1
-ssVID
-p1520
-(dp1521
-VE
-I5
-sVO
-I1
-ssVIG
-p1522
-(dp1523
-VE
-I1
-ssVIF
-p1524
-(dp1525
-V
-I3
-ssVïè
-p1526
-(dp1527
-Vt
-I1
-ssVIs
-p1528
-(dp1529
-Vs
-I9
-sVr
-I3
-sVm
-I2
-sVl
-I1
-ssVIr
-p1530
-(dp1531
-Va
-I1
-ssVIt
-p1532
-(dp1533
-Va
-I11
-sV
-I1
-ssVIv
-p1534
-(dp1535
-Va
-I5
-ssVIm
-p1536
-(dp1537
-Va
-I1
-ssVIl
-p1538
-(dp1539
-V
-I129
-sVs
-I15
-sVl
-I1
-ssVIo
-p1540
-(dp1541
-Vw
-I1
-ssVIn
-p1542
-(dp1543
-Vc
-I1
-sVt
-I3
-sVd
-I3
-sV
-I1
-sVf
-I2
-ssVIc
-p1544
-(dp1545
-Vi
-I1
-ssVIb
-p1546
-(dp1547
-Va
-I3
-ssVIe
-p1548
-(dp1549
-Vr
-I4
-ssVId
-p1550
-(dp1551
-Ve
-I2
-ssVIg
-p1552
-(dp1553
-Vn
-I1
-ssVIf
-p1554
-(dp1555
-V
-I11
-ssV(~
-p1556
-(dp1557
-V)
-I1
-ssV(s
-p1558
-(dp1559
-Vu
-I1
-ssV(p
-p1560
-(dp1561
-Va
-I1
-ssVvâ
-p1562
-(dp1563
-Vm
-I2
-sVt
-I1
-ssV(t
-p1564
-(dp1565
-Vh
-I1
-ssVA,
-p1566
-(dp1567
-V
-I1
-ssV(i
-p1568
-(dp1569
-Vf
-I2
-sVn
-I2
-ssV(o
-p1570
-(dp1571
-Vr
-I3
-sVu
-I1
-sVn
-I1
-ssV(c
-p1572
-(dp1573
-V)
-I2
-ssV(a
-p1574
-(dp1575
-Vs
-I1
-sVn
-I2
-ssV(f
-p1576
-(dp1577
-Vr
-I1
-ssV(d
-p1578
-(dp1579
-Vû
-I1
-ssV2O
-p1580
-(dp1581
-V.
-I1
-ssV(_
-p1582
-(dp1583
-V)
-I1
-sVM
-I1
-ssV(V
-p1584
-(dp1585
-Vo
-I1
-ssV(T
-p1586
-(dp1587
-Vh
-I1
-ssV(J
-p1588
-(dp1589
-Ve
-I1
-ssVvè
-p1590
-(dp1591
-Vr
-I10
-ssVTM
-p1592
-(dp1593
-V
-I1
-ssV(N
-p1594
-(dp1595
-Vo
-I1
-ssV(C
-p1596
-(dp1597
-V)
-I1
-ssVca
-p1598
-(dp1599
-Vc
-I7
-sVb
-I23
-sVd
-I12
-sVf
-I3
-sVi
-I11
-sVm
-I91
-sVl
-I16
-sV.
-I2
-sVp
-I29
-sVs
-I15
-sVr
-I82
-sVu
-I16
-sVt
-I17
-sVv
-I1
-sVy
-I3
-sVn
-I49
-ssVêt
-p1600
-(dp1601
-Va
-I2
-sV
-I6
-sVe
-I67
-sVi
-I1
-sVè
-I1
-sV,
-I1
-sV.
-I2
-sVr
-I105
-sVu
-I3
-ssV(3
-p1602
-(dp1603
-V)
-I2
-ssVêv
-p1604
-(dp1605
-Ve
-I4
-ssVêl
-p1606
-(dp1607
-Va
-I1
-sVé
-I1
-sVe
-I3
-ssVêm
-p1608
-(dp1609
-Ve
-I79
-ssV(#
-p1610
-(dp1611
-V6
-I1
-ssVêc
-p1612
-(dp1613
-Vh
-I9
-ssVoï
-p1614
-(dp1615
-Vq
-I1
-sVa
-I3
-sVs
-I2
-sVm
-I1
-sVo
-I1
-ssVoë
-p1616
-(dp1617
-Vm
-I1
-sVt
-I2
-ssVoé
-p1618
-(dp1619
-Vs
-I1
-ssVoè
-p1620
-(dp1621
-Vt
-I3
-ssVoû
-p1622
-(dp1623
-Vt
-I31
-ssVoù
-p1624
-(dp1625
-V
-I48
-sV,
-I1
-ssVd"
-p1626
-(dp1627
-V
-I1
-ssVo.
-p1628
-(dp1629
-V
-I19
-sVo
-I2
-sVn
-I1
-ssVo-
-p1630
-(dp1631
-Vc
-I1
-sVt
-I1
-sVd
-I7
-ssVo,
-p1632
-(dp1633
-V
-I43
-ssVo!
-p1634
-(dp1635
-V
-I1
-ssVo
-p1636
-(dp1637
-V"
-I1
-sVi
-I2
-sVG
-I1
-sVP
-I1
-sVT
-I3
-sVa
-I14
-sVà
-I2
-sVc
-I8
-sVe
-I6
-sVd
-I12
-sVg
-I3
-sVf
-I3
-sVé
-I2
-sVh
-I2
-sVk
-I1
-sVm
-I5
-sVl
-I5
-sVo
-I5
-sVn
-I9
-sVq
-I1
-sVp
-I9
-sVs
-I7
-sVr
-I2
-sVu
-I1
-sVt
-I17
-sVw
-I4
-sVv
-I1
-sVy
-I3
-ssVo;
-p1638
-(dp1639
-V
-I9
-ssVo:
-p1640
-(dp1641
-V
-I4
-ssVo_
-p1642
-(dp1643
-V;
-I1
-sV,
-I1
-ssV;
-p1644
-(dp1645
-Vê
-I1
-sVA
-I1
-sVC
-I9
-sVD
-I3
-sVJ
-I1
-sVO
-I2
-sVP
-I2
-sV_
-I1
-sVa
-I10
-sVà
-I1
-sVc
-I66
-sVe
-I114
-sVd
-I16
-sVf
-I1
-sVi
-I103
-sVh
-I1
-sVj
-I81
-sVm
-I78
-sVl
-I61
-sVo
-I22
-sVn
-I14
-sVq
-I14
-sVp
-I6
-sVs
-I16
-sVr
-I2
-sVu
-I7
-sVt
-I14
-sVv
-I16
-sVy
-I1
-ssVo[
-p1646
-(dp1647
-V1
-I2
-ssVoo
-p1648
-(dp1649
-Vs
-I2
-sVk
-I50
-sVd
-I1
-sVf
-I2
-ssVon
-p1650
-(dp1651
-V!
-I2
-sV
-I749
-sV"
-I1
-sV'
-I3
-sV-
-I3
-sV,
-I90
-sV.
-I40
-sV;
-I19
-sV:
-I5
-sV?
-I3
-sVg
-I47
-sV[
-I1
-sV_
-I1
-sVa
-I36
-sVc
-I68
-sVe
-I20
-sVd
-I288
-sVç
-I8
-sVf
-I12
-sVi
-I22
-sVh
-I8
-sVj
-I1
-sVl
-I6
-sVo
-I11
-sVn
-I307
-sVq
-I2
-sVs
-I381
-sVu
-I1
-sVt
-I326
-sVv
-I29
-sVz
-I2
-ssVom
-p1652
-(dp1653
-Va
-I10
-sV
-I18
-sVb
-I47
-sVe
-I72
-sVi
-I16
-sVé
-I2
-sVè
-I3
-sVm
-I323
-sVo
-I2
-sV.
-I3
-sVp
-I62
-sVs
-I2
-sVt
-I2
-sVn
-I1
-sV>
-I1
-ssVol
-p1654
-(dp1655
-Va
-I19
-sV
-I6
-sVc
-I1
-sVâ
-I1
-sVe
-I45
-sVd
-I15
-sVi
-I55
-sVè
-I3
-sVl
-I28
-sVo
-I26
-sV,
-I5
-sVé
-I18
-sVs
-I4
-sVu
-I22
-sVt
-I31
-sV.
-I2
-sV;
-I1
-sV:
-I1
-ssVok
-p1656
-(dp1657
-Va
-I1
-sV
-I19
-sV)
-I1
-sV,
-I6
-sV.
-I2
-sV0
-I3
-sVs
-I19
-ssVoj
-p1658
-(dp1659
-Ve
-I32
-ssVoi
-p1660
-(dp1661
-V!
-I14
-sV
-I100
-sVc
-I6
-sV:
-I2
-sVe
-I21
-sVd
-I7
-sVg
-I11
-sV-
-I6
-sVl
-I34
-sVn
-I123
-sVq
-I15
-sVs
-I250
-sVr
-I165
-sVt
-I75
-sVv
-I2
-sVx
-I16
-sV;
-I5
-sV.
-I6
-sV,
-I37
-sV?
-I2
-ssVoh
-p1662
-(dp1663
-V!
-I2
-sVi
-I1
-ssVog
-p1664
-(dp1665
-Ve
-I5
-sVi
-I13
-sVl
-I4
-sVo
-I2
-sVn
-I4
-sVé
-I2
-sVr
-I4
-sVu
-I4
-ssVof
-p1666
-(dp1667
-Va
-I1
-sV
-I66
-sVe
-I3
-sVf
-I23
-sVé
-I3
-sV,
-I1
-sVo
-I7
-sVl
-I10
-sVi
-I6
-sVr
-I2
-sVt
-I5
-sV.
-I1
-ssVoe
-p1668
-(dp1669
-Vi
-I6
-sVs
-I2
-sVu
-I57
-ssVod
-p1670
-(dp1671
-Va
-I4
-sV
-I3
-sVe
-I13
-sVi
-I14
-sVo
-I4
-sVé
-I4
-sVs
-I1
-sVu
-I18
-sV;
-I1
-ssVoc
-p1672
-(dp1673
-Va
-I3
-sV
-I3
-sVc
-I10
-sVe
-I14
-sVi
-I12
-sVh
-I42
-sVk
-I1
-sVo
-I22
-sVé
-I5
-sVs
-I1
-sV!
-I1
-sVu
-I19
-sVt
-I15
-sVè
-I3
-sVr
-I2
-ssVob
-p1674
-(dp1675
-Va
-I5
-sVe
-I15
-sVé
-I3
-sVj
-I3
-sVl
-I16
-sVo
-I4
-sVi
-I1
-sVs
-I7
-sVr
-I2
-sVu
-I1
-sVt
-I3
-sVv
-I1
-ssVoa
-p1676
-(dp1677
-Vc
-I2
-sVb
-I1
-sVd
-I3
-sVi
-I1
-sVm
-I1
-sVl
-I1
-sVn
-I1
-ssVoy
-p1678
-(dp1679
-Vé
-I8
-sVa
-I83
-sVâ
-I1
-sVe
-I63
-sVo
-I1
-ssVox
-p1680
-(dp1681
-Ve
-I2
-sV.
-I2
-ssVow
-p1682
-(dp1683
-Va
-I1
-sV
-I14
-sV:
-I1
-sVe
-I1
-sVi
-I3
-sV,
-I3
-sV.
-I1
-sVs
-I1
-sVn
-I4
-ssVov
-p1684
-(dp1685
-Vi
-I29
-sVe
-I16
-ssVou
-p1686
-(dp1687
-V!
-I1
-sV
-I105
-sVp
-I113
-sV,
-I4
-sV.
-I2
-sVh
-I3
-sV;
-I1
-sV:
-I1
-sVa
-I23
-sVc
-I32
-sVb
-I14
-sVe
-I37
-sVd
-I22
-sVg
-I18
-sVf
-I11
-sVé
-I9
-sVè
-I1
-sVj
-I49
-sVm
-I1
-sVl
-I72
-sVï
-I2
-sVn
-I16
-sVq
-I3
-sVi
-I36
-sVs
-I709
-sVr
-I573
-sVt
-I372
-sVv
-I234
-sVx
-I18
-sVz
-I13
-ssVot
-p1688
-(dp1689
-Va
-I6
-sV
-I28
-sVe
-I21
-sVi
-I5
-sVh
-I28
-sV*
-I1
-sV,
-I7
-sV.
-I4
-sVs
-I17
-sVr
-I77
-sVt
-I16
-sV:
-I1
-ssVos
-p1690
-(dp1691
-Va
-I14
-sV
-I62
-sVc
-I2
-sVe
-I52
-sVp
-I1
-sVi
-I12
-sV-
-I13
-sVm
-I1
-sV,
-I12
-sVo
-I23
-sV.
-I4
-sVq
-I1
-sVé
-I5
-sVs
-I134
-sVt
-I22
-sV;
-I1
-ssVor
-p1692
-(dp1693
-Vé
-I6
-sV
-I81
-sV,
-I8
-sV;
-I1
-sV:
-I2
-sVç
-I4
-sVa
-I52
-sVc
-I16
-sVb
-I2
-sVe
-I75
-sVd
-I83
-sVg
-I22
-sVf
-I2
-sVi
-I17
-sVk
-I10
-sVm
-I45
-sVl
-I3
-sVo
-I1
-sVn
-I13
-sVq
-I1
-sVp
-I11
-sVs
-I39
-sVr
-I32
-sVt
-I214
-sVw
-I1
-sVy
-I1
-sVz
-I1
-ssVoq
-p1694
-(dp1695
-Vu
-I16
-ssVop
-p1696
-(dp1697
-V
-I8
-sVe
-I16
-sVi
-I3
-sVé
-I9
-sVh
-I26
-sVl
-I17
-sVo
-I18
-sVp
-I5
-sVr
-I7
-sVu
-I1
-sVt
-I4
-sVy
-I15
-ssVNi
-p1698
-(dp1699
-V
-I1
-sVc
-I1
-ssVaç
-p1700
-(dp1701
-Va
-I3
-sVo
-I1
-ssVNo
-p1702
-(dp1703
-Vi
-I1
-sVn
-I4
-sVs
-I2
-sVr
-I6
-sVu
-I20
-sVt
-I3
-sVv
-I4
-ssVaé
-p1704
-(dp1705
-Vl
-I2
-ssVNa
-p1706
-(dp1707
-Vp
-I3
-sVt
-I2
-sVd
-I1
-ssVaë
-p1708
-(dp1709
-Vl
-I2
-ssVNe
-p1710
-(dp1711
-V
-I4
-sVb
-I1
-sVw
-I7
-sVv
-I1
-ssVaï
-p1712
-(dp1713
-Vf
-I1
-sVè
-I1
-sVm
-I1
-sVo
-I3
-sVs
-I2
-sVv
-I1
-ssVaî
-p1714
-(dp1715
-Vc
-I5
-sVt
-I68
-sVn
-I13
-ssVNu
-p1716
-(dp1717
-Vm
-I2
-ssVNI
-p1718
-(dp1719
-VT
-I2
-ssVNO
-p1720
-(dp1721
-V
-I2
-sVT
-I4
-ssVNB
-p1722
-(dp1723
-VE
-I8
-ssVNC
-p1724
-(dp1725
-VI
-I1
-sVE
-I1
-sVL
-I2
-ssVND
-p1726
-(dp1727
-VI
-I4
-sV
-I3
-sV*
-I1
-sVE
-I4
-sV,
-I1
-ssVNE
-p1728
-(dp1729
-VY
-I1
-sVS
-I1
-sVG
-I1
-ssVNG
-p1730
-(dp1731
-V
-I3
-ssVNY
-p1732
-(dp1733
-V
-I2
-sVT
-I1
-ssVNS
-p1734
-(dp1735
-V
-I6
-sVE
-I1
-sV.
-I1
-ssVNT
-p1736
-(dp1737
-V!
-I2
-sVA
-I2
-sVI
-I3
-sV*
-I1
-sVS
-I1
-sVR
-I1
-sVY
-I2
-ssVNU
-p1738
-(dp1739
-VM
-I2
-ssVN,
-p1740
-(dp1741
-V
-I3
-ssVN
-p1742
-(dp1743
-VA
-I1
-sVb
-I1
-sVE
-I2
-sVD
-I3
-sVF
-I1
-sVI
-I2
-sVU
-I1
-sV[
-I1
-ssVN'
-p1744
-(dp1745
-Va
-I2
-sVê
-I1
-sVe
-I1
-sVT
-I1
-ssV'_
-p1746
-(dp1747
-V
-I1
-sVH
-I2
-ssVaa
-p1748
-(dp1749
-Vs
-I1
-sV,
-I3
-ssVNé
-p1750
-(dp1751
-Vr
-I1
-ssVac
-p1752
-(dp1753
-Va
-I94
-sV
-I3
-sVc
-I40
-sV:
-I1
-sVe
-I29
-sVé
-I4
-sVh
-I64
-sVl
-I10
-sVo
-I7
-sV,
-I2
-sVq
-I11
-sVi
-I6
-sVs
-I1
-sVr
-I10
-sVu
-I21
-sVt
-I30
-sV;
-I1
-sV.
-I1
-ssVab
-p1754
-(dp1755
-Va
-I33
-sVb
-I28
-sVe
-I2
-sVi
-I35
-sVh
-I1
-sVj
-I1
-sVl
-I135
-sVo
-I39
-sVî
-I4
-sVs
-I9
-sVr
-I2
-sVu
-I1
-sVy
-I2
-sV,
-I1
-ssVae
-p1756
-(dp1757
-Va
-I1
-sV
-I1
-sVr
-I1
-sVl
-I8
-ssVad
-p1758
-(dp1759
-Va
-I29
-sV
-I8
-sVe
-I89
-sVd
-I9
-sVi
-I26
-sVj
-I1
-sVm
-I12
-sV,
-I2
-sVo
-I27
-sVé
-I5
-sVr
-I12
-sVu
-I2
-sVv
-I6
-sVy
-I2
-ssVag
-p1760
-(dp1761
-Va
-I9
-sVe
-I180
-sVi
-I15
-sVè
-I1
-sVo
-I5
-sVn
-I70
-sVé
-I15
-sVr
-I15
-sVu
-I16
-ssVaf
-p1762
-(dp1763
-Vi
-I2
-sVé
-I3
-sVr
-I2
-sVt
-I2
-sVf
-I20
-ssVai
-p1764
-(dp1765
-V!
-I1
-sV
-I175
-sVb
-I10
-sVe
-I198
-sVd
-I21
-sVg
-I14
-sVi
-I1
-sV-
-I4
-sVm
-I44
-sVl
-I71
-sVn
-I184
-sVs
-I600
-sVr
-I187
-sVt
-I870
-sVx
-I3
-sV[
-I1
-sV.
-I3
-sV,
-I14
-sV?
-I1
-ssVah
-p1766
-(dp1767
-Va
-I1
-sV
-I1
-sVe
-I1
-sVi
-I1
-sVm
-I1
-sV,
-I1
-sVo
-I2
-sV!
-I1
-ssVak
-p1768
-(dp1769
-V
-I1
-sVe
-I5
-sVo
-I1
-ssVaj
-p1770
-(dp1771
-Ve
-I15
-sVo
-I4
-ssVam
-p1772
-(dp1773
-Va
-I99
-sV
-I5
-sVb
-I106
-sVe
-I62
-sVé
-I1
-sV)
-I1
-sVi
-I47
-sVè
-I6
-sVm
-I7
-sV,
-I5
-sVo
-I17
-sVn
-I3
-sVp
-I21
-sVu
-I3
-sV.
-I2
-sV:
-I1
-sV_
-I1
-ssVal
-p1774
-(dp1775
-V!
-I1
-sV
-I95
-sVp
-I4
-sV-
-I1
-sV,
-I16
-sV.
-I6
-sV;
-I5
-sV?
-I3
-sV_
-I1
-sVa
-I28
-sVc
-I4
-sVe
-I66
-sVd
-I1
-sVg
-I2
-sVf
-I2
-sVé
-I5
-sVh
-I23
-sVm
-I3
-sVl
-I120
-sVo
-I33
-sVi
-I39
-sVs
-I5
-sVr
-I2
-sVu
-I8
-sVt
-I15
-sVw
-I1
-sVè
-I18
-sVy
-I1
-ssVao
-p1776
-(dp1777
-Vû
-I2
-sVr
-I4
-sVs
-I1
-sVn
-I2
-ssVan
-p1778
-(dp1779
-V
-I34
-sV'
-I1
-sV)
-I1
-sV-
-I3
-sV,
-I8
-sV.
-I2
-sV;
-I1
-sVç
-I17
-sV[
-I1
-sV_
-I1
-sVa
-I31
-sVc
-I92
-sVe
-I2
-sVd
-I737
-sVg
-I235
-sVi
-I31
-sVk
-I1
-sVo
-I16
-sVn
-I33
-sVq
-I17
-sVé
-I7
-sVs
-I442
-sVu
-I6
-sVt
-I521
-sVv
-I1
-sVy
-I20
-ssVaq
-p1780
-(dp1781
-Vu
-I40
-ssVap
-p1782
-(dp1783
-Va
-I4
-sVé
-I5
-sVe
-I31
-sV
-I3
-sVi
-I51
-sVh
-I7
-sVl
-I3
-sVo
-I7
-sV.
-I1
-sVp
-I104
-sVr
-I45
-sVt
-I14
-ssVas
-p1784
-(dp1785
-V!
-I18
-sV
-I244
-sVc
-I4
-sVe
-I21
-sVi
-I6
-sVé
-I1
-sVh
-I1
-sVk
-I4
-sV,
-I34
-sV.
-I12
-sVp
-I3
-sVs
-I197
-sVu
-I1
-sVa
-I7
-sV[
-I1
-sV;
-I4
-sV?
-I1
-sVt
-I25
-ssVar
-p1786
-(dp1787
-V
-I177
-sV'
-I1
-sVp
-I3
-sV-
-I3
-sV,
-I10
-sV;
-I1
-sVg
-I33
-sVa
-I64
-sVc
-I56
-sVb
-I15
-sVe
-I115
-sVd
-I99
-sVç
-I4
-sVf
-I6
-sVi
-I40
-sVè
-I2
-sVk
-I6
-sVm
-I49
-sVl
-I65
-sVo
-I85
-sVn
-I14
-sVq
-I33
-sVé
-I8
-sVs
-I10
-sVr
-I78
-sVu
-I12
-sVt
-I240
-sVy
-I15
-ssVau
-p1788
-(dp1789
-V
-I240
-sV)
-I1
-sV-
-I8
-sV,
-I13
-sV.
-I5
-sV;
-I3
-sV:
-I1
-sV[
-I1
-sVc
-I49
-sVb
-I4
-sVd
-I20
-sVg
-I4
-sVf
-I3
-sVj
-I8
-sVm
-I16
-sVl
-I3
-sVn
-I3
-sVq
-I1
-sVp
-I21
-sVs
-I68
-sVr
-I41
-sVt
-I218
-sVv
-I37
-sVx
-I117
-ssVat
-p1790
-(dp1791
-Va
-I13
-sV
-I52
-sVe
-I89
-sV'
-I1
-sVi
-I136
-sVh
-I6
-sV,
-I11
-sVo
-I4
-sV.
-I2
-sVq
-I1
-sVé
-I1
-sVs
-I28
-sVr
-I55
-sVu
-I29
-sVt
-I66
-sVè
-I1
-sVy
-I1
-sV;
-I1
-sV:
-I3
-sV?
-I1
-ssVaw
-p1792
-(dp1793
-Va
-I4
-sVy
-I1
-sVs
-I2
-sV.
-I1
-ssVav
-p1794
-(dp1795
-Va
-I259
-sVe
-I250
-sVi
-I32
-sVo
-I102
-sVé
-I3
-sVr
-I3
-ssVay
-p1796
-(dp1797
-Va
-I25
-sV
-I30
-sVe
-I22
-sVi
-I1
-sV)
-I1
-sVm
-I1
-sVo
-I1
-sVé
-I5
-sVs
-I54
-ssVax
-p1798
-(dp1799
-Vi
-I3
-sV-
-I2
-sVe
-I2
-sV
-I1
-ssVaz
-p1800
-(dp1801
-Vi
-I1
-ssVAs
-p1802
-(dp1803
-Vi
-I2
-sV
-I3
-sVs
-I2
-sVc
-I1
-sVt
-I1
-ssVAu
-p1804
-(dp1805
-V
-I10
-sVs
-I8
-sVt
-I1
-sVg
-I2
-ssVa[
-p1806
-(dp1807
-V1
-I2
-ssVa]
-p1808
-(dp1809
-V
-I1
-sV.
-I1
-ssVa_
-p1810
-(dp1811
-V,
-I2
-ssVuè
-p1812
-(dp1813
-Vr
-I8
-sVd
-I1
-ssVa
-p1814
-(dp1815
-V"
-I1
-sVi
-I6
-sV5
-I2
-sVC
-I19
-sVB
-I4
-sVE
-I1
-sVD
-I2
-sVG
-I3
-sVF
-I2
-sVH
-I1
-sVM
-I5
-sVP
-I11
-sVS
-I1
-sVR
-I1
-sVU
-I1
-sVT
-I2
-sVV
-I4
-sV_
-I9
-sVa
-I22
-sVà
-I28
-sVc
-I95
-sVb
-I54
-sVe
-I26
-sVd
-I128
-sVg
-I33
-sVf
-I61
-sVé
-I13
-sVh
-I9
-sVj
-I21
-sVm
-I139
-sVl
-I61
-sVo
-I2
-sVn
-I36
-sVq
-I30
-sVp
-I182
-sVs
-I72
-sVr
-I63
-sVu
-I27
-sVt
-I67
-sVw
-I2
-sVv
-I114
-ssVa-
-p1816
-(dp1817
-Vc
-I1
-sVb
-I1
-sVf
-I10
-sVM
-I1
-sVC
-I2
-sVt
-I15
-ssVa,
-p1818
-(dp1819
-V
-I76
-sVc
-I1
-ssVa.
-p1820
-(dp1821
-V
-I10
-sVb
-I2
-sVt
-I2
-ssVN°
-p1822
-(dp1823
-V
-I2
-ssVa;
-p1824
-(dp1825
-V
-I9
-ssVa:
-p1826
-(dp1827
-V
-I7
-ssVa?
-p1828
-(dp1829
-V
-I1
-ssV"D
-p1830
-(dp1831
-Ve
-I1
-ssV-E
-p1832
-(dp1833
-Vs
-I1
-sVt
-I2
-sVd
-I1
-ssVt_
-p1834
-(dp1835
-V
-I1
-sV,
-I2
-sV.
-I1
-ssV-G
-p1836
-(dp1837
-Vr
-I2
-sVe
-I1
-ssV-A
-p1838
-(dp1839
-Vy
-I13
-sVh
-I2
-ssVt[
-p1840
-(dp1841
-V1
-I2
-sV2
-I1
-ssV-C
-p1842
-(dp1843
-Va
-I2
-sVe
-I1
-sV'
-I2
-sVo
-I1
-ssV-M
-p1844
-(dp1845
-Va
-I3
-sVé
-I1
-sVe
-I1
-sVo
-I3
-ssV-L
-p1846
-(dp1847
-Va
-I1
-sV'
-I2
-ssV-O
-p1848
-(dp1849
-Vù
-I1
-sVh
-I2
-sVu
-I1
-ssV-N
-p1850
-(dp1851
-Vo
-I3
-ssV-I
-p1852
-(dp1853
-VI
-I1
-sVS
-I1
-sVl
-I1
-ssV-H
-p1854
-(dp1855
-Vo
-I1
-ssV-J
-p1856
-(dp1857
-Ve
-I1
-sV.
-I2
-ssV-T
-p1858
-(dp1859
-VM
-I1
-sVu
-I1
-ssV-V
-p1860
-(dp1861
-Vo
-I2
-ssV-Q
-p1862
-(dp1863
-Vu
-I1
-ssV-P
-p1864
-(dp1865
-Vi
-I1
-sVo
-I1
-ssV-S
-p1866
-(dp1867
-Va
-I1
-sVu
-I1
-ssVzè
-p1868
-(dp1869
-Vl
-I1
-ssVt@
-p1870
-(dp1871
-Vp
-I2
-ssVgr
-p1872
-(dp1873
-Va
-I94
-sVâ
-I13
-sVe
-I17
-sVé
-I14
-sVè
-I2
-sVo
-I15
-sVi
-I5
-ssV-e
-p1874
-(dp1875
-Vt
-I1
-sVl
-I18
-sVn
-I3
-ssV-d
-p1876
-(dp1877
-Vi
-I7
-sVa
-I7
-sVe
-I9
-sV'
-I2
-ssV-f
-p1878
-(dp1879
-Vé
-I8
-sVa
-I2
-sVr
-I1
-sVo
-I3
-ssV-a
-p1880
-(dp1881
-Vi
-I1
-sVr
-I1
-sVu
-I1
-ssVtx
-p1882
-(dp1883
-Vt
-I6
-ssV-b
-p1884
-(dp1885
-Vu
-I1
-sVe
-I3
-sVo
-I2
-ssV-m
-p1886
-(dp1887
-Vê
-I21
-sVo
-I15
-ssV-l
-p1888
-(dp1889
-Va
-I3
-sVà
-I9
-sVe
-I10
-sVu
-I2
-ssVtt
-p1890
-(dp1891
-Va
-I13
-sVe
-I195
-sVp
-I5
-sVi
-I10
-sVè
-I3
-sVo
-I2
-sVé
-I7
-sVs
-I1
-sVr
-I43
-sVu
-I7
-ssVtu
-p1892
-(dp1893
-Va
-I11
-sV
-I21
-sVc
-I1
-sVe
-I31
-sVd
-I9
-sVg
-I12
-sVé
-I18
-sVm
-I4
-sVl
-I9
-sVn
-I15
-sVp
-I2
-sVs
-I5
-sVr
-I68
-sV,
-I1
-sV?
-I2
-ssVtr
-p1894
-(dp1895
-Va
-I145
-sVe
-I578
-sV'
-I3
-sVi
-I54
-sVè
-I64
-sVê
-I13
-sVo
-I173
-sVé
-I21
-sVu
-I9
-sVô
-I12
-sVy
-I3
-ssVts
-p1896
-(dp1897
-V!
-I2
-sV
-I173
-sV"
-I1
-sVk
-I3
-sV*
-I1
-sVm
-I3
-sV,
-I45
-sV.
-I20
-sV_
-I1
-sV;
-I14
-sV:
-I2
-sV[
-I1
-sV?
-I4
-ssVtp
-p1898
-(dp1899
-Vh
-I12
-sV:
-I6
-sV.
-I1
-ssV-j
-p1900
-(dp1901
-Ve
-I14
-ssV-u
-p1902
-(dp1903
-Vp
-I1
-ssVto
-p1904
-(dp1905
-V
-I65
-sVc
-I3
-sVb
-I3
-sVd
-I1
-sVf
-I2
-sVi
-I25
-sV-
-I7
-sVm
-I50
-sV,
-I2
-sVn
-I75
-sVp
-I2
-sVr
-I5
-sVu
-I401
-sVt
-I3
-sV:
-I2
-sVy
-I8
-sV.
-I3
-sV_
-I1
-sVl
-I3
-ssVtl
-p1906
-(dp1907
-Va
-I1
-sVy
-I5
-sVe
-I2
-ssV-v
-p1908
-(dp1909
-Vi
-I3
-sVa
-I1
-sVe
-I1
-sVo
-I61
-ssV-q
-p1910
-(dp1911
-Vu
-I3
-ssV-p
-p1912
-(dp1913
-Vè
-I2
-ssVth
-p1914
-(dp1915
-Va
-I22
-sV
-I20
-sVe
-I130
-sVi
-I44
-sVè
-I3
-sVm
-I1
-sV,
-I2
-sVo
-I18
-sV.
-I1
-sVé
-I23
-sVr
-I2
-sVu
-I1
-sV;
-I1
-sV:
-I1
-ssVti
-p1916
-(dp1917
-V
-I15
-sV,
-I2
-sV.
-I2
-sV;
-I1
-sVa
-I2
-sVc
-I22
-sVb
-I4
-sVe
-I72
-sVd
-I4
-sVg
-I8
-sVf
-I8
-sVé
-I16
-sVè
-I14
-sVm
-I24
-sVl
-I17
-sVo
-I185
-sVn
-I194
-sVq
-I26
-sVp
-I1
-sVs
-I39
-sVr
-I41
-sVu
-I1
-sVt
-I64
-sVv
-I20
-ssVte
-p1918
-(dp1919
-V!
-I10
-sV
-I403
-sV-
-I4
-sV,
-I100
-sV.
-I37
-sV;
-I21
-sV:
-I6
-sV?
-I7
-sV[
-I1
-sVa
-I37
-sVc
-I3
-sVe
-I3
-sVd
-I28
-sVf
-I1
-sVi
-I1
-sVm
-I72
-sVl
-I49
-sVn
-I216
-sVp
-I1
-sVs
-I196
-sVr
-I190
-sVu
-I87
-sVt
-I1
-sVy
-I1
-sVx
-I16
-sVz
-I14
-ssVtb
-p1920
-(dp1921
-Vo
-I1
-ssVtc
-p1922
-(dp1923
-V.
-I3
-ssVta
-p1924
-(dp1925
-V
-I53
-sV-
-I1
-sV,
-I10
-sV.
-I1
-sVc
-I20
-sVb
-I49
-sVd
-I1
-sVg
-I25
-sVf
-I2
-sVi
-I374
-sVh
-I1
-sVk
-I3
-sVm
-I3
-sVl
-I35
-sVn
-I115
-sVq
-I3
-sVp
-I8
-sVs
-I7
-sVr
-I8
-sVt
-I49
-sVv
-I2
-sVx
-I4
-ssV_é
-p1926
-(dp1927
-Vt
-I2
-ssVÈV
-p1928
-(dp1929
-VR
-I1
-ssVgy
-p1930
-(dp1931
-Vp
-I2
-ssVt?
-p1932
-(dp1933
-V
-I3
-sV-
-I1
-sV.
-I1
-ssVt:
-p1934
-(dp1935
-V
-I46
-sVM
-I1
-ssVt;
-p1936
-(dp1937
-V
-I66
-ssV--
-p1938
-(dp1939
-VA
-I2
-sV
-I1
-sVC
-I4
-sVE
-I2
-sVD
-I1
-sVI
-I2
-sV-
-I4
-sVJ
-I1
-sVM
-I3
-sV,
-I1
-sVO
-I4
-sVN
-I2
-sVQ
-I1
-sVP
-I1
-sVS
-I1
-sVV
-I2
-sVL
-I2
-ssV-,
-p1940
-(dp1941
-V
-I1
-ssV p
-p1942
-(dp1943
-Va
-I805
-sVâ
-I5
-sVe
-I337
-sVi
-I95
-sVè
-I36
-sVl
-I307
-sVo
-I434
-sVé
-I24
-sVr
-I416
-sVu
-I65
-sVh
-I41
-sVy
-I1
-sVû
-I4
-ssVt.
-p1944
-(dp1945
-V
-I116
-sV-
-I4
-ssVt/
-p1946
-(dp1947
-Vp
-I1
-sVd
-I2
-ssVt,
-p1948
-(dp1949
-V
-I265
-ssV-6
-p1950
-(dp1951
-V2
-I2
-ssV-1
-p1952
-(dp1953
-V
-I1
-sV2
-I3
-sV8
-I1
-ssV-3
-p1954
-(dp1955
-V1
-I1
-ssV-2
-p1956
-(dp1957
-V%
-I1
-ssVt'
-p1958
-(dp1959
-Va
-I4
-sVy
-I1
-sVs
-I2
-ssVrk
-p1960
-(dp1961
-Va
-I1
-sV
-I6
-sVe
-I1
-sVi
-I1
-sV-
-I1
-sV,
-I3
-sV.
-I2
-sVs
-I2
-ssVt"
-p1962
-(dp1963
-V)
-I1
-sV
-I1
-ssV-8
-p1964
-(dp1965
-V°
-I1
-ssVt
-p1966
-(dp1967
-Vê
-I22
-sVé
-I51
-sV#
-I1
-sV(
-I2
-sV1
-I4
-sV2
-I1
-sV4
-I1
-sV<
-I1
-sVâ
-I1
-sVA
-I4
-sVC
-I178
-sVD
-I3
-sVG
-I25
-sVI
-I4
-sVH
-I2
-sVJ
-I2
-sVM
-I56
-sVP
-I27
-sVR
-I1
-sVV
-I1
-sV_
-I6
-sVa
-I271
-sVà
-I160
-sVc
-I196
-sVb
-I97
-sVe
-I218
-sVd
-I603
-sVg
-I14
-sVf
-I92
-sVi
-I83
-sVh
-I36
-sVk
-I1
-sVj
-I77
-sVm
-I129
-sVl
-I488
-sVo
-I74
-sVn
-I70
-sVq
-I230
-sVp
-I336
-sVs
-I210
-sVr
-I80
-sVu
-I182
-sVt
-I157
-sVw
-I11
-sVv
-I91
-sVy
-I11
-sVô
-I1
-ssVt!
-p1968
-(dp1969
-V
-I7
-sV"
-I6
-ssVEM
-p1970
-(dp1971
-VA
-I1
-sVE
-I2
-sVN
-I1
-ssVga
-p1972
-(dp1973
-V
-I1
-sVc
-I1
-sVb
-I1
-sVg
-I24
-sVi
-I7
-sVl
-I44
-sVn
-I8
-sVr
-I74
-sVu
-I7
-sVt
-I3
-sV,
-I2
-ssVù
-p1974
-(dp1975
-Va
-I2
-sVj
-I7
-sVe
-I3
-sVd
-I1
-sVp
-I1
-sVi
-I8
-sVê
-I1
-sVm
-I2
-sVl
-I9
-sVn
-I5
-sVP
-I1
-sVs
-I4
-sVt
-I3
-ssV-É
-p1976
-(dp1977
-Vd
-I4
-ssV z
-p1978
-(dp1979
-Vè
-I1
-ssVù?
-p1980
-(dp1981
-V-
-I1
-ssVgl
-p1982
-(dp1983
-Va
-I13
-sVi
-I8
-sVe
-I10
-sVo
-I109
-ssV-à
-p1984
-(dp1985
-V-
-I6
-ssVtô
-p1986
-(dp1987
-Vm
-I1
-sVt
-I38
-ssV-ê
-p1988
-(dp1989
-Vt
-I9
-ssVtî
-p1990
-(dp1991
-Vm
-I1
-ssV at p
-p1992
-(dp1993
-Vo
-I2
-ssVtê
-p1994
-(dp1995
-Vt
-I16
-ssVtè
-p1996
-(dp1997
-Vr
-I19
-sVm
-I3
-ssVté
-p1998
-(dp1999
-V
-I173
-sVe
-I10
-sVm
-I7
-sV,
-I35
-sV.
-I14
-sVs
-I29
-sVr
-I5
-sV?
-I3
-sV;
-I4
-sV:
-I1
-sV_
-I3
-sVt
-I1
-ssVtâ
-p2000
-(dp2001
-Vc
-I1
-sVt
-I1
-ssVEF
-p2002
-(dp2003
-VÈ
-I1
-sVO
-I1
-ssV/N
-p2004
-(dp2005
-Vo
-I1
-ssVg[
-p2006
-(dp2007
-V2
-I1
-ssVS*
-p2008
-(dp2009
-V*
-I1
-sVV
-I1
-ssVS.
-p2010
-(dp2011
-V
-I5
-ssVS-
-p2012
-(dp2013
-VI
-I1
-ssVS,
-p2014
-(dp2015
-V
-I6
-ssVS"
-p2016
-(dp2017
-V.
-I1
-ssVS
-p2018
-(dp2019
-VA
-I1
-sVb
-I2
-sVE
-I2
-sVD
-I1
-sVF
-I2
-sVI
-I1
-sVL
-I1
-sVo
-I2
-sV3
-I1
-sVO
-I4
-ssVS'
-p2020
-(dp2021
-Vé
-I1
-ssVve
-p2022
-(dp2023
-Va
-I6
-sV
-I65
-sVc
-I128
-sVd
-I7
-sVi
-I8
-sVm
-I18
-sVl
-I21
-sVn
-I151
-sV.
-I2
-sVs
-I14
-sVr
-I174
-sVu
-I22
-sVt
-I1
-sVy
-I1
-sV;
-I1
-sVz
-I67
-sV,
-I7
-sV?
-I1
-ssVSy
-p2024
-(dp2025
-Vr
-I1
-ssVfû
-p2026
-(dp2027
-Vm
-I1
-sVt
-I11
-ssVSu
-p2028
-(dp2029
-Vi
-I1
-sVè
-I1
-sVr
-I14
-ssVSt
-p2030
-(dp2031
-Va
-I3
-sVu
-I1
-ssVSi
-p2032
-(dp2033
-Va
-I1
-sV
-I11
-sVe
-I1
-sVè
-I11
-sVn
-I3
-sVr
-I3
-ssVSo
-p2034
-(dp2035
-Vy
-I1
-sVm
-I1
-sVu
-I5
-sV,
-I1
-sVn
-I1
-ssVSm
-p2036
-(dp2037
-Vy
-I2
-sVa
-I6
-ssVSc
-p2038
-(dp2039
-Vu
-I1
-ssVfé
-p2040
-(dp2041
-V
-I3
-sV,
-I3
-sV.
-I2
-sVs
-I1
-sVr
-I13
-sVt
-I2
-sV;
-I1
-sV[
-I1
-sVl
-I2
-ssVSa
-p2042
-(dp2043
-V
-I6
-sVc
-I1
-sVi
-I7
-sVm
-I1
-sVl
-I2
-sVn
-I1
-sVr
-I1
-sVx
-I1
-ssVSe
-p2044
-(dp2045
-Vc
-I2
-sVr
-I2
-sVs
-I1
-ssVSS
-p2046
-(dp2047
-VI
-I1
-sV
-I2
-sVE
-I1
-ssVSQ
-p2048
-(dp2049
-VU
-I1
-ssVSU
-p2050
-(dp2051
-VC
-I1
-ssVST
-p2052
-(dp2053
-VA
-I2
-sVR
-I2
-ssVSI
-p2054
-(dp2055
-VB
-I1
-sVO
-I2
-ssVSO
-p2056
-(dp2057
-V-
-I1
-ssVSM
-p2058
-(dp2059
-VA
-I2
-sVE
-I2
-ssVSC
-p2060
-(dp2061
-VI
-I2
-sVL
-I1
-ssVSE
-p2062
-(dp2063
-VQ
-I1
-sV
-I2
-sVN
-I1
-sVM
-I1
-sV.
-I1
-ssVf
-p2064
-(dp2065
-V2
-I1
-sV4
-I1
-sVC
-I6
-sVF
-I2
-sVP
-I3
-sVR
-I1
-sVT
-I1
-sVV
-I1
-sVa
-I7
-sVà
-I1
-sVc
-I3
-sVe
-I1
-sVd
-I5
-sVi
-I4
-sVm
-I2
-sVo
-I4
-sVn
-I2
-sVp
-I1
-sVs
-I6
-sVr
-I2
-sVu
-I1
-sVt
-I32
-sVw
-I3
-sVy
-I17
-ssVf,
-p2066
-(dp2067
-V
-I7
-ssVf-
-p2068
-(dp2069
-Vt
-I1
-sVd
-I2
-ssVf.
-p2070
-(dp2071
-V
-I4
-sVf
-I2
-ssVôt
-p2072
-(dp2073
-Va
-I1
-sV
-I37
-sVe
-I22
-sVé
-I11
-sVo
-I2
-sVi
-I3
-sVr
-I4
-sV;
-I1
-ssVôp
-p2074
-(dp2075
-Vi
-I2
-ssVôn
-p2076
-(dp2077
-Vi
-I2
-sVa
-I1
-sVe
-I5
-sVé
-I8
-ssVâl
-p2078
-(dp2079
-Vi
-I1
-sVe
-I1
-ssVôl
-p2080
-(dp2081
-Ve
-I3
-ssVôm
-p2082
-(dp2083
-Ve
-I1
-ssVân
-p2084
-(dp2085
-Ve
-I1
-ssVfr
-p2086
-(dp2087
-Va
-I30
-sVe
-I17
-sVi
-I20
-sVè
-I26
-sV,
-I2
-sVo
-I30
-sVé
-I3
-sVu
-I5
-ssVfs
-p2088
-(dp2089
-V
-I5
-sV;
-I1
-sV,
-I3
-sV.
-I1
-ssVft
-p2090
-(dp2091
-Vy
-I1
-sVp
-I2
-sVe
-I4
-sVw
-I3
-ssVfu
-p2092
-(dp2093
-Vg
-I3
-sVi
-I9
-sVm
-I3
-sVl
-I2
-sVn
-I10
-sVs
-I41
-sVr
-I35
-sVt
-I68
-sVy
-I2
-ssVg;
-p2094
-(dp2095
-V
-I1
-ssV /
-p2096
-(dp2097
-Ve
-I1
-ssVfa
-p2098
-(dp2099
-V
-I2
-sVc
-I8
-sVb
-I2
-sVç
-I3
-sVi
-I197
-sVm
-I13
-sVl
-I12
-sVn
-I20
-sVs
-I8
-sVr
-I3
-sVu
-I56
-sVt
-I6
-sVv
-I5
-sV:
-I1
-ssVSé
-p2100
-(dp2101
-Vd
-I1
-sVn
-I1
-ssVfe
-p2102
-(dp2103
-Vc
-I8
-sVe
-I6
-sVm
-I32
-sVn
-I14
-sVs
-I52
-sVr
-I39
-sVu
-I15
-sVt
-I15
-sV:
-I1
-ssVff
-p2104
-(dp2105
-Va
-I16
-sV
-I1
-sVe
-I29
-sVi
-I24
-sV-
-I1
-sVl
-I8
-sVo
-I5
-sVé
-I6
-sVr
-I20
-sV_
-I1
-ssVfi
-p2106
-(dp2107
-Va
-I5
-sVc
-I29
-sVe
-I8
-sVd
-I10
-sVg
-I9
-sVf
-I2
-sVé
-I1
-sVè
-I2
-sVl
-I62
-sVn
-I59
-sVq
-I3
-sVs
-I7
-sVr
-I11
-sVt
-I76
-sVv
-I1
-sVx
-I2
-ssVfl
-p2108
-(dp2109
-Va
-I9
-sVe
-I14
-sVi
-I3
-sVè
-I2
-sVo
-I7
-sVé
-I12
-ssVfo
-p2110
-(dp2111
-Vi
-I47
-sVl
-I7
-sVn
-I37
-sVs
-I2
-sVr
-I122
-sVu
-I22
-ssVât
-p2112
-(dp2113
-Va
-I1
-sV
-I6
-sVe
-I32
-sVi
-I3
-sVo
-I3
-sV.
-I1
-sVé
-I1
-sVs
-I1
-sVr
-I11
-sV;
-I1
-ssVf_
-p2114
-(dp2115
-V,
-I1
-ssVô
-p2116
-(dp2117
-Vm
-I3
-ssVy)
-p2118
-(dp2119
-V
-I3
-ssVy*
-p2120
-(dp2121
-V
-I1
-ssVy,
-p2122
-(dp2123
-V
-I12
-ssVy.
-p2124
-(dp2125
-V
-I3
-ssVy
-p2126
-(dp2127
-Vj
-I1
-sV
-I1
-sVp
-I7
-sV(
-I2
-sV1
-I1
-sV2
-I1
-sVA
-I7
-sVC
-I4
-sVB
-I1
-sVD
-I1
-sVF
-I1
-sVI
-I2
-sVM
-I4
-sVL
-I3
-sVP
-I1
-sVS
-I2
-sVT
-I1
-sVV
-I5
-sVa
-I84
-sVc
-I8
-sVb
-I9
-sVe
-I19
-sVd
-I5
-sVg
-I4
-sVf
-I12
-sVé
-I4
-sVh
-I4
-sVê
-I2
-sVm
-I4
-sVl
-I1
-sVo
-I17
-sVn
-I6
-sVi
-I5
-sVs
-I8
-sVr
-I8
-sVu
-I3
-sVt
-I20
-sVw
-I3
-sVv
-I4
-sVy
-I3
-ssV 5
-p2128
-(dp2129
-V0
-I4
-sV2
-I1
-sV
-I1
-ssVg/
-p2130
-(dp2131
-Vp
-I1
-sVe
-I2
-sVg
-I1
-ssV ;
-p2132
-(dp2133
-V
-I1
-ssV24
-p2134
-(dp2135
-V0
-I1
-sV.
-I1
-ssV25
-p2136
-(dp2137
-V)
-I1
-sV0
-I1
-ssV26
-p2138
-(dp2139
-V
-I1
-sV.
-I1
-ssV27
-p2140
-(dp2141
-V
-I1
-sV,
-I1
-ssV20
-p2142
-(dp2143
-V0
-I15
-sV;
-I1
-sV%
-I1
-sV,
-I1
-sV
-I1
-ssV21
-p2144
-(dp2145
-V
-I1
-sV5
-I2
-ssV22
-p2146
-(dp2147
-V1
-I2
-sV
-I1
-ssV28
-p2148
-(dp2149
-V
-I1
-sV;
-I1
-ssV29
-p2150
-(dp2151
-V.
-I2
-ssV2:
-p2152
-(dp2153
-V
-I1
-ssV2;
-p2154
-(dp2155
-V
-I1
-ssV2%
-p2156
-(dp2157
-V
-I1
-ssV2
-p2158
-(dp2159
-Va
-I1
-sV(
-I1
-sVd
-I1
-sVD
-I1
-ssV2,
-p2160
-(dp2161
-V
-I6
-ssV2.
-p2162
-(dp2163
-V
-I5
-ssV2/
-p2164
-(dp2165
-V1
-I1
-ssV2*
-p2166
-(dp2167
-VE
-I1
-ssVyi
-p2168
-(dp2169
-Vn
-I3
-ssVym
-p2170
-(dp2171
-Va
-I1
-sVe
-I1
-ssVyl
-p2172
-(dp2173
-Ve
-I1
-sVl
-I1
-sVo
-I1
-sVv
-I4
-ssVyo
-p2174
-(dp2175
-Vm
-I1
-sVu
-I62
-sVn
-I3
-ssVyn
-p2176
-(dp2177
-Vx
-I1
-sVg
-I3
-ssVya
-p2178
-(dp2179
-V
-I7
-sVc
-I1
-sVb
-I7
-sVd
-I1
-sVg
-I25
-sVi
-I20
-sV,
-I2
-sVl
-I7
-sVu
-I11
-sVn
-I36
-ssV2]
-p2180
-(dp2181
-V
-I15
-sV;
-I2
-sV,
-I1
-sV.
-I6
-ssVyc
-p2182
-(dp2183
-Vl
-I3
-ssV2_
-p2184
-(dp2185
-V.
-I1
-ssVye
-p2186
-(dp2187
-Va
-I4
-sVe
-I2
-sVd
-I1
-sV,
-I2
-sVn
-I10
-sVr
-I16
-sVu
-I23
-sVt
-I1
-sVz
-I59
-ssVyd
-p2188
-(dp2189
-Ve
-I1
-ssVyg
-p2190
-(dp2191
-Vm
-I1
-ssVyz
-p2192
-(dp2193
-Ve
-I1
-ssVyp
-p2194
-(dp2195
-Va
-I1
-sVr
-I1
-sVe
-I2
-sVt
-I1
-sVo
-I2
-ssVys
-p2196
-(dp2197
-V
-I35
-sVi
-I20
-sV-
-I3
-sV,
-I8
-sV.
-I6
-sVs
-I1
-sVt
-I4
-sV;
-I2
-sV?
-I1
-ssVyr
-p2198
-(dp2199
-Va
-I2
-sVe
-I14
-sVi
-I11
-sVo
-I1
-sVn
-I2
-sVr
-I1
-ssVyt
-p2200
-(dp2201
-Vi
-I1
-ssVÀ
-p2202
-(dp2203
-VM
-I1
-ssVëm
-p2204
-(dp2205
-Ve
-I1
-ssVël
-p2206
-(dp2207
-V,
-I2
-ssVy_
-p2208
-(dp2209
-V,
-I1
-ssVët
-p2210
-(dp2211
-Ve
-I2
-ssVE,
-p2212
-(dp2213
-V
-I5
-ssVE.
-p2214
-(dp2215
-V
-I4
-ssVE!
-p2216
-(dp2217
-V*
-I1
-ssVE
-p2218
-(dp2219
-VA
-I1
-sVC
-I1
-sVE
-I1
-sVD
-I5
-sVG
-I1
-sVI
-I6
-sVJ
-I1
-sVM
-I2
-sVL
-I3
-sVO
-I4
-sVN
-I2
-sV1
-I1
-sVP
-I1
-sVS
-I2
-sVT
-I2
-sVV
-I4
-sVX
-I23
-ssVyé
-p2220
-(dp2221
-V
-I15
-sVe
-I2
-ssVEN
-p2222
-(dp2223
-V
-I3
-sVC
-I1
-sVB
-I8
-sVD
-I3
-sV,
-I1
-sVT
-I3
-ssVEI
-p2224
-(dp2225
-VT
-I1
-sVN
-I2
-ssVED
-p2226
-(dp2227
-VI
-I4
-sV
-I4
-sV,
-I1
-ssVEG
-p2228
-(dp2229
-VL
-I1
-ssVyâ
-p2230
-(dp2231
-Vt
-I1
-ssVEA
-p2232
-(dp2233
-VC
-I1
-sVD
-I1
-ssVEC
-p2234
-(dp2235
-V
-I1
-sVT
-I9
-ssVEB
-p2236
-(dp2237
-VC
-I2
-sVO
-I6
-ssVEY
-p2238
-(dp2239
-V
-I1
-ssVEX
-p2240
-(dp2241
-VP
-I1
-ssVEZ
-p2242
-(dp2243
-V
-I1
-ssVEU
-p2244
-(dp2245
-VC
-I2
-sVR
-I2
-sVV
-I2
-ssVET
-p2246
-(dp2247
-V
-I2
-sVC
-I1
-sVT
-I2
-ssVEV
-p2248
-(dp2249
-VE
-I2
-ssVEQ
-p2250
-(dp2251
-VU
-I2
-ssVES
-p2252
-(dp2253
-V
-I8
-sVS
-I2
-sV,
-I3
-sV.
-I1
-ssVER
-p2254
-(dp2255
-V
-I4
-sVC
-I1
-sVD
-I1
-sVG
-I8
-sVI
-I1
-sV*
-I1
-sV,
-I4
-sVO
-I1
-sVS
-I2
-sVT
-I1
-sVW
-I1
-ssVEm
-p2256
-(dp2257
-Vp
-I2
-ssVEl
-p2258
-(dp2259
-Ve
-I1
-sVd
-I17
-sVl
-I17
-ssVEn
-p2260
-(dp2261
-V
-I13
-sVs
-I3
-sVd
-I1
-sVf
-I14
-ssVEh
-p2262
-(dp2263
-V!
-I2
-sV
-I10
-ssVEd
-p2264
-(dp2265
-Vi
-I1
-sVo
-I1
-ssVEx
-p2266
-(dp2267
-Vc
-I1
-sVt
-I1
-ssVEu
-p2268
-(dp2269
-Vr
-I15
-ssVEt
-p2270
-(dp2271
-V
-I11
-sVr
-I1
-sVe
-I6
-sV,
-I1
-ssVEv
-p2272
-(dp2273
-Vh
-I1
-ssVEs
-p2274
-(dp2275
-Vp
-I18
-sVs
-I2
-sVt
-I7
-ssVEr
-p2276
-(dp2277
-Vz
-I1
-ssV ç
-p2278
-(dp2279
-Và
-I1
-ssVX.
-p2280
-(dp2281
-V
-I8
-ssVX,
-p2282
-(dp2283
-V
-I4
-ssVX
-p2284
-(dp2285
-Ve
-I1
-sVd
-I2
-ssVX;
-p2286
-(dp2287
-V
-I1
-ssVXI
-p2288
-(dp2289
-V
-I3
-sVI
-I14
-sV-
-I1
-sV,
-I10
-sV.
-I2
-sVV
-I4
-sVX
-I3
-ssVXL
-p2290
-(dp2291
-VI
-I1
-sV
-I1
-ssVXX
-p2292
-(dp2293
-VI
-I24
-sVX
-I12
-sV.
-I3
-sV,
-I3
-sVV
-I11
-ssVXP
-p2294
-(dp2295
-VR
-I1
-ssVXV
-p2296
-(dp2297
-VI
-I21
-sV
-I2
-sV,
-I1
-sV_
-I9
-sV.
-I3
-ssVk
-p2298
-(dp2299
-Va
-I1
-sVb
-I2
-sVe
-I1
-sVd
-I2
-sVf
-I1
-sVi
-I4
-sV(
-I3
-sVm
-I2
-sVl
-I1
-sVo
-I7
-sVp
-I1
-sVs
-I1
-sVr
-I1
-sVt
-I6
-sVw
-I1
-ssVk)
-p2300
-(dp2301
-V
-I1
-sV,
-I1
-ssVk.
-p2302
-(dp2303
-V
-I5
-ssVk-
-p2304
-(dp2305
-Vu
-I1
-sVd
-I1
-ssVk,
-p2306
-(dp2307
-V
-I13
-ssVk0
-p2308
-(dp2309
-V3
-I2
-sV2
-I1
-ssV7]
-p2310
-(dp2311
-V
-I2
-ssV7
-p2312
-(dp2313
-VA
-I1
-sVd
-I1
-ssV7.
-p2314
-(dp2315
-V
-I2
-ssV7,
-p2316
-(dp2317
-V
-I3
-ssV77
-p2318
-(dp2319
-V8
-I1
-sV,
-I1
-sV7
-I1
-ssV76
-p2320
-(dp2321
-V1
-I6
-sV0
-I1
-sV3
-I2
-sV2
-I1
-sV4
-I2
-sV7
-I1
-sV6
-I4
-sV9
-I1
-sV8
-I2
-ssV75
-p2322
-(dp2323
-V9
-I7
-sV5
-I1
-sV7
-I2
-sV6
-I4
-ssV73
-p2324
-(dp2325
-V9
-I3
-sV8
-I1
-sV6
-I1
-sV0
-I3
-ssV72
-p2326
-(dp2327
-V,
-I1
-ssV71
-p2328
-(dp2329
-V1
-I1
-sV8
-I1
-sV*
-I1
-sV
-I1
-ssV70
-p2330
-(dp2331
-V;
-I1
-sV2
-I1
-sV5
-I1
-sV.
-I1
-ssVk[
-p2332
-(dp2333
-V3
-I1
-ssV7;
-p2334
-(dp2335
-V
-I2
-ssV7:
-p2336
-(dp2337
-V
-I2
-ssV79
-p2338
-(dp2339
-V6
-I1
-ssV78
-p2340
-(dp2341
-V9
-I1
-sV2
-I1
-sV5
-I1
-sV,
-I1
-ssVka
-p2342
-(dp2343
-V
-I1
-sV,
-I2
-sVï
-I1
-sVn
-I1
-ssVke
-p2344
-(dp2345
-V
-I6
-sVs
-I1
-sVe
-I1
-sVt
-I1
-ssVkd
-p2346
-(dp2347
-Vo
-I1
-ssVki
-p2348
-(dp2349
-V
-I2
-sV[
-I1
-sV,
-I1
-sVn
-I1
-ssVkh
-p2350
-(dp2351
-V
-I3
-sV;
-I3
-sV,
-I3
-sV?
-I1
-sV.
-I1
-ssVko
-p2352
-(dp2353
-Vt
-I1
-ssVkn
-p2354
-(dp2355
-Vo
-I5
-ssVkl
-p2356
-(dp2357
-Va
-I1
-ssVks
-p2358
-(dp2359
-V!
-I1
-sV
-I14
-sV,
-I4
-sV/
-I1
-sV.
-I1
-sV;
-I1
-ssVky
-p2360
-(dp2361
-V,
-I2
-ssVJE
-p2362
-(dp2363
-VC
-I8
-ssVJA
-p2364
-(dp2365
-VC
-I1
-ssVJu
-p2366
-(dp2367
-Vi
-I17
-sVs
-I1
-sVl
-I1
-sVg
-I1
-ssVJo
-p2368
-(dp2369
-Va
-I1
-sVu
-I5
-sVï
-I1
-ssVJe
-p2370
-(dp2371
-Va
-I2
-sV
-I101
-sVr
-I1
-ssVJa
-p2372
-(dp2373
-Vp
-I3
-sVc
-I9
-sVm
-I2
-sVn
-I3
-ssVJ.
-p2374
-(dp2375
-V
-I4
-sV-
-I2
-ssVJ'
-p2376
-(dp2377
-Va
-I22
-sVé
-I4
-sVi
-I1
-sVy
-I1
-ssVJé
-p2378
-(dp2379
-Vh
-I1
-sVc
-I1
-sVr
-I1
-ssV]?
-p2380
-(dp2381
-V
-I2
-ssV];
-p2382
-(dp2383
-V
-I11
-ssV]:
-p2384
-(dp2385
-V
-I1
-ssV]
-p2386
-(dp2387
-V
-I6
-sV6
-I2
-sVA
-I4
-sVC
-I4
-sVD
-I3
-sVF
-I2
-sVI
-I2
-sVH
-I1
-sVM
-I2
-sVL
-I11
-sVQ
-I1
-sVS
-I6
-sVR
-I1
-sVT
-I1
-sVV
-I11
-sVY
-I1
-sV_
-I2
-sVa
-I4
-sVd
-I2
-sVé
-I1
-sVo
-I1
-sVq
-I1
-sVp
-I1
-ssV],
-p2388
-(dp2389
-V
-I12
-ssV].
-p2390
-(dp2391
-V
-I16
-ssV);
-p2392
-(dp2393
-V
-I1
-ssV):
-p2394
-(dp2395
-V
-I2
-ssV)(
-p2396
-(dp2397
-V3
-I2
-ssV),
-p2398
-(dp2399
-V
-I6
-ssV).
-p2400
-(dp2401
-V
-I4
-ssV)
-p2402
-(dp2403
-Va
-I1
-sVc
-I2
-sVe
-I1
-sVd
-I1
-sVo
-I1
-sV2
-I1
-sVt
-I1
-sVy
-I2
-ssVpr
-p2404
-(dp2405
-Va
-I4
-sVe
-I108
-sVi
-I156
-sVè
-I79
-sVê
-I18
-sVo
-I176
-sVî
-I1
-sVé
-I76
-sVu
-I8
-ssVps
-p2406
-(dp2407
-V
-I54
-sVi
-I1
-sVh
-I1
-sV,
-I14
-sV.
-I6
-sV;
-I5
-sV_
-I1
-ssVpp
-p2408
-(dp2409
-Va
-I17
-sVe
-I28
-sVé
-I6
-sVl
-I10
-sVo
-I17
-sVi
-I1
-sVr
-I39
-sVu
-I2
-ssVpt
-p2410
-(dp2411
-Va
-I4
-sV
-I9
-sVe
-I14
-sVi
-I25
-sV-
-I1
-sV,
-I1
-sV.
-I1
-sVé
-I4
-sVs
-I1
-ssVpu
-p2412
-(dp2413
-V
-I10
-sVc
-I1
-sVb
-I16
-sVd
-I1
-sVi
-I33
-sVl
-I7
-sV.
-I1
-sVp
-I1
-sVs
-I5
-sVr
-I6
-sVt
-I20
-sVy
-I1
-sVn
-I5
-ssVpy
-p2414
-(dp2415
-V
-I4
-sVr
-I10
-sVg
-I1
-sV.
-I1
-ssVpa
-p2416
-(dp2417
-V
-I2
-sVc
-I2
-sVd
-I5
-sVg
-I64
-sVi
-I24
-sVv
-I1
-sVl
-I20
-sVn
-I9
-sVp
-I12
-sVs
-I285
-sVr
-I402
-sVu
-I17
-sVt
-I33
-sVî
-I1
-sVy
-I66
-sV.
-I1
-ssVpg
-p2418
-(dp2419
-V
-I1
-ssVpe
-p2420
-(dp2421
-Va
-I6
-sV
-I24
-sVc
-I22
-sVz
-I2
-sVi
-I23
-sV:
-I1
-sVl
-I20
-sVo
-I3
-sVn
-I86
-sVs
-I16
-sVr
-I164
-sVu
-I112
-sVt
-I39
-sV;
-I3
-sV.
-I6
-sV,
-I9
-sV_
-I2
-ssVph
-p2422
-(dp2423
-Va
-I15
-sVe
-I21
-sVé
-I1
-sVè
-I1
-sVi
-I29
-sVr
-I1
-sVt
-I3
-sVy
-I20
-ssVpi
-p2424
-(dp2425
-Va
-I15
-sVc
-I5
-sVe
-I44
-sVd
-I6
-sVg
-I2
-sVè
-I15
-sVl
-I6
-sVn
-I3
-sVq
-I6
-sVs
-I7
-sVr
-I21
-sVt
-I67
-sV,
-I1
-ssVpo
-p2426
-(dp2427
-Vc
-I4
-sVb
-I2
-sVp
-I1
-sVi
-I65
-sVè
-I3
-sVë
-I3
-sVm
-I4
-sVl
-I19
-sVn
-I75
-sVq
-I1
-sVé
-I1
-sVs
-I62
-sVr
-I79
-sVu
-I299
-sVt
-I6
-ssVpl
-p2428
-(dp2429
-Va
-I86
-sVe
-I60
-sVi
-I34
-sVè
-I1
-sVo
-I5
-sVu
-I210
-sVy
-I2
-ssVpm
-p2430
-(dp2431
-Ve
-I2
-ssVp:
-p2432
-(dp2433
-V/
-I6
-ssVp;
-p2434
-(dp2435
-V
-I1
-ssVp
-p2436
-(dp2437
-Va
-I1
-sVà
-I3
-sVb
-I1
-sVe
-I2
-sVd
-I20
-sVl
-I3
-sVo
-I1
-sVq
-I1
-sVp
-I5
-sVs
-I5
-sVr
-I2
-sVt
-I1
-sVv
-I3
-ssVp!
-p2438
-(dp2439
-V
-I1
-ssVp*
-p2440
-(dp2441
-V*
-I2
-ssVp.
-p2442
-(dp2443
-Vi
-I1
-sV
-I3
-ssVp,
-p2444
-(dp2445
-V
-I6
-ssVpû
-p2446
-(dp2447
-Vt
-I4
-ssVpâ
-p2448
-(dp2449
-Vm
-I1
-sVt
-I2
-sVl
-I2
-ssVpç
-p2450
-(dp2451
-Vo
-I3
-ssVpê
-p2452
-(dp2453
-Vc
-I6
-sVt
-I3
-ssVpè
-p2454
-(dp2455
-Vc
-I10
-sVr
-I41
-ssVpé
-p2456
-(dp2457
-Va
-I1
-sV
-I10
-sVc
-I2
-sVe
-I18
-sVd
-I3
-sVf
-I2
-sV.
-I2
-sVs
-I6
-sVr
-I47
-sV!
-I1
-sVt
-I5
-ssV<h
-p2458
-(dp2459
-Va
-I1
-ssV(*
-p2460
-(dp2461
-V)
-I1
-sV
-I1
-ssVO.
-p2462
-(dp2463
-V
-I1
-ssVO-
-p2464
-(dp2465
-VL
-I1
-ssVçû
-p2466
-(dp2467
-Vt
-I1
-ssVO
-p2468
-(dp2469
-Vc
-I3
-sVI
-I1
-sVm
-I2
-sVO
-I1
-sVP
-I3
-sVS
-I1
-sVR
-I1
-sVT
-I1
-sVW
-I1
-sVY
-I2
-ssVO?
-p2470
-(dp2471
-V
-I1
-ssVçà
-p2472
-(dp2473
-V,
-I1
-ssVgt
-p2474
-(dp2475
-Va
-I1
-sV
-I20
-sVe
-I2
-sV-
-I5
-sV,
-I1
-sVo
-I1
-sVs
-I3
-ssVgs
-p2476
-(dp2477
-V,
-I4
-ssVOn
-p2478
-(dp2479
-V
-I45
-sVl
-I1
-ssVOk
-p2480
-(dp2481
-Vl
-I1
-ssVbâ
-p2482
-(dp2483
-Vt
-I6
-ssVOh
-p2484
-(dp2485
-V!
-I7
-sV
-I1
-sVi
-I1
-ssVOe
-p2486
-(dp2487
-Vu
-I2
-sVd
-I1
-ssVbè
-p2488
-(dp2489
-Vr
-I1
-ssVbé
-p2490
-(dp2491
-V
-I16
-sVc
-I1
-sVi
-I2
-sV,
-I6
-sVn
-I5
-sV.
-I1
-sVr
-I1
-sV;
-I2
-sV:
-I1
-ssVbê
-p2492
-(dp2493
-Vt
-I1
-ssVOx
-p2494
-(dp2495
-Vf
-I1
-ssVOv
-p2496
-(dp2497
-Vi
-I1
-ssVOu
-p2498
-(dp2499
-Vi
-I15
-sVa
-I1
-sVr
-I1
-ssVOt
-p2500
-(dp2501
-Vh
-I1
-sVe
-I1
-ssVOs
-p2502
-(dp2503
-Ve
-I1
-ssVOr
-p2504
-(dp2505
-V
-I3
-sVe
-I9
-ssVOp
-p2506
-(dp2507
-Vt
-I1
-sVo
-I1
-ssVOO
-p2508
-(dp2509
-VK
-I6
-ssVON
-p2510
-(dp2511
-V
-I2
-sVE
-I1
-sV'
-I1
-sV,
-I2
-sVS
-I6
-sVT
-I1
-ssVOM
-p2512
-(dp2513
-VA
-I3
-sVE
-I3
-ssVOL
-p2514
-(dp2515
-VT
-I2
-ssVOK
-p2516
-(dp2517
-V
-I3
-sVS
-I3
-ssVOJ
-p2518
-(dp2519
-VE
-I8
-ssVOI
-p2520
-(dp2521
-VR
-I1
-ssVOF
-p2522
-(dp2523
-V
-I6
-ssVOE
-p2524
-(dp2525
-VU
-I2
-ssVOC
-p2526
-(dp2527
-VH
-I1
-sVR
-I1
-sVT
-I2
-ssVOB
-p2528
-(dp2529
-V,
-I1
-ssVOV
-p2530
-(dp2531
-VI
-I1
-ssVOU
-p2532
-(dp2533
-V
-I7
-sVR
-I1
-sVT
-I1
-sVV
-I1
-ssVOT
-p2534
-(dp2535
-V
-I2
-sVE
-I1
-sVI
-I1
-sVH
-I2
-sV,
-I1
-sV.
-I2
-ssVOS
-p2536
-(dp2537
-VS
-I1
-sVE
-I1
-ssVOR
-p2538
-(dp2539
-V
-I15
-sVS
-I1
-sVE
-I1
-ssVOP
-p2540
-(dp2541
-VT
-I2
-ssVçu
-p2542
-(dp2543
-V
-I8
-sVe
-I1
-sV,
-I1
-sVs
-I3
-sVr
-I2
-sVt
-I12
-ssVb
-p2544
-(dp2545
-Vs
-I2
-sVd
-I1
-ssVb,
-p2546
-(dp2547
-V
-I1
-ssVb.
-p2548
-(dp2549
-V
-I1
-ssVb/
-p2550
-(dp2551
-Vd
-I1
-ssVça
-p2552
-(dp2553
-Vi
-I17
-sV
-I4
-sVt
-I4
-sVn
-I3
-ssVço
-p2554
-(dp2555
-Vi
-I7
-sVn
-I18
-ssVçn
-p2556
-(dp2557
-V
-I1
-ssVbe
-p2558
-(dp2559
-Va
-I71
-sV
-I31
-sVc
-I3
-sVe
-I2
-sVd
-I1
-sVg
-I3
-sVf
-I3
-sVi
-I1
-sVl
-I43
-sVn
-I3
-sVs
-I14
-sVr
-I63
-sVt
-I3
-sV:
-I1
-sV,
-I5
-ssVba
-p2560
-(dp2561
-V
-I5
-sVc
-I2
-sVb
-I4
-sVg
-I9
-sVi
-I26
-sVm
-I1
-sVl
-I8
-sVï
-I3
-sVn
-I17
-sVp
-I12
-sVs
-I15
-sVr
-I113
-sVu
-I2
-sVt
-I28
-sVy
-I1
-ssVbb
-p2562
-(dp2563
-Va
-I3
-sVé
-I25
-ssVbl
-p2564
-(dp2565
-Vi
-I41
-sVè
-I3
-sVé
-I5
-sVe
-I226
-sVa
-I27
-ssVbm
-p2566
-(dp2567
-Ve
-I2
-ssVbn
-p2568
-(dp2569
-Vi
-I2
-sVf
-I2
-ssVbo
-p2570
-(dp2571
-V!
-I1
-sV
-I38
-sV,
-I25
-sV:
-I2
-sVe
-I3
-sVi
-I11
-sVm
-I6
-sVl
-I2
-sVo
-I4
-sVn
-I97
-sVr
-I31
-sVu
-I53
-sVt
-I1
-sVa
-I1
-sVv
-I1
-sVx
-I2
-sV;
-I9
-sV.
-I10
-sVï
-I2
-ssVbh
-p2572
-(dp2573
-Vo
-I1
-ssVbi
-p2574
-(dp2575
-Va
-I1
-sV
-I1
-sVb
-I4
-sVe
-I154
-sVè
-I1
-sVj
-I1
-sVl
-I16
-sVn
-I7
-sVs
-I4
-sVr
-I2
-sVt
-I24
-sVz
-I2
-ssVbj
-p2576
-(dp2577
-Vu
-I1
-sVe
-I4
-ssVbk
-p2578
-(dp2579
-V-
-I1
-ssVbt
-p2580
-(dp2581
-Vi
-I3
-sVe
-I1
-ssVbu
-p2582
-(dp2583
-Ve
-I1
-sVf
-I1
-sVi
-I1
-sVl
-I10
-sVn
-I1
-sVé
-I1
-sVs
-I1
-sVt
-I20
-sVv
-I3
-ssVbv
-p2584
-(dp2585
-Vi
-I1
-ssVOù
-p2586
-(dp2587
-V
-I2
-sV?
-I1
-ssVbs
-p2588
-(dp2589
-Va
-I1
-sVc
-I4
-sVe
-I3
-sVi
-I3
-sVo
-I8
-sVu
-I1
-sVt
-I1
-ssVby
-p2590
-(dp2591
-V
-I27
-sVs
-I1
-sVl
-I1
-ssV~)
-p2592
-(dp2593
-V,
-I1
-ssVTê
-p2594
-(dp2595
-Vt
-I1
-ssVTé
-p2596
-(dp2597
-Vt
-I1
-ssV.)
-p2598
-(dp2599
-V
-I2
-ssVu?
-p2600
-(dp2601
-V
-I5
-ssV.,
-p2602
-(dp2603
-V
-I1
-ssV.-
-p2604
-(dp2605
-VJ
-I2
-sV-
-I17
-ssVu;
-p2606
-(dp2607
-V
-I9
-ssVu:
-p2608
-(dp2609
-V
-I2
-ssV.
-p2610
-(dp2611
-VA
-I1
-sV
-I914
-sVC
-I1
-sVB
-I2
-sVI
-I5
-sVD
-I3
-sVS
-I2
-sVH
-I4
-sVM
-I1
-sVL
-I1
-sVl
-I7
-sVP
-I2
-sVs
-I1
-sVV
-I3
-sVN
-I1
-sVd
-I4
-ssV."
-p2612
-(dp2613
-V
-I1
-ssVu-
-p2614
-(dp2615
-Vp
-I1
-sVr
-I1
-sVM
-I1
-sVd
-I4
-sVf
-I1
-ssVu,
-p2616
-(dp2617
-V
-I44
-ssVu.
-p2618
-(dp2619
-V
-I15
-sV-
-I1
-ssVu)
-p2620
-(dp2621
-V.
-I1
-ssV.0
-p2622
-(dp2623
-V2
-I1
-ssVu'
-p2624
-(dp2625
-Va
-I23
-sVà
-I20
-sVe
-I46
-sVç
-I1
-sVi
-I169
-sVo
-I75
-sVu
-I29
-sVy
-I1
-ssVu!
-p2626
-(dp2627
-V)
-I1
-sV
-I3
-ssVu
-p2628
-(dp2629
-Vi
-I2
-sV'
-I1
-sV1
-I5
-sV2
-I2
-sV5
-I1
-sV6
-I1
-sVC
-I1
-sVE
-I1
-sVD
-I4
-sVI
-I1
-sVH
-I1
-sVJ
-I5
-sVM
-I4
-sVN
-I1
-sVP
-I7
-sVS
-I9
-sVT
-I3
-sV_
-I10
-sVa
-I25
-sVà
-I16
-sVc
-I69
-sVb
-I41
-sVe
-I21
-sVd
-I142
-sVg
-I9
-sVf
-I14
-sVé
-I1
-sVh
-I7
-sVk
-I2
-sVj
-I14
-sVm
-I71
-sVl
-I49
-sVo
-I2
-sVn
-I18
-sVq
-I33
-sVp
-I96
-sVs
-I50
-sVr
-I32
-sVu
-I7
-sVt
-I23
-sVw
-I8
-sVv
-I20
-sVy
-I1
-ssVu_
-p2630
-(dp2631
-V
-I1
-ssVu[
-p2632
-(dp2633
-V1
-I1
-ssV.A
-p2634
-(dp2635
-Vh
-I1
-sVr
-I1
-ssV.C
-p2636
-(dp2637
-Vr
-I1
-ssV.]
-p2638
-(dp2639
-V
-I2
-ssV.h
-p2640
-(dp2641
-Vt
-I2
-ssV.i
-p2642
-(dp2643
-Vb
-I2
-ssVuy
-p2644
-(dp2645
-Va
-I5
-sVé
-I4
-sVe
-I5
-ssVux
-p2646
-(dp2647
-V!
-I1
-sV
-I345
-sV-
-I7
-sV,
-I34
-sV.
-I21
-sV_
-I1
-sV;
-I13
-sV:
-I1
-sV[
-I1
-sV?
-I1
-ssV.n
-p2648
-(dp2649
-Ve
-I4
-ssVuz
-p2650
-(dp2651
-Va
-I4
-sVe
-I9
-ssVut
-p2652
-(dp2653
-Va
-I36
-sV
-I400
-sVb
-I1
-sVe
-I180
-sVi
-I27
-sVh
-I10
-sV-
-I22
-sV,
-I19
-sVo
-I39
-sV.
-I5
-sVé
-I15
-sVs
-I1
-sVr
-I109
-sVu
-I6
-sVt
-I1
-sVè
-I5
-sV;
-I4
-sV:
-I1
-sV?
-I1
-sVô
-I3
-ssV.b
-p2654
-(dp2655
-Vn
-I2
-ssVuv
-p2656
-(dp2657
-Va
-I81
-sVâ
-I1
-sVe
-I131
-sVé
-I22
-sVè
-I5
-sVo
-I2
-sVi
-I6
-sVr
-I46
-ssVuq
-p2658
-(dp2659
-Vu
-I11
-ssVup
-p2660
-(dp2661
-Va
-I11
-sV
-I33
-sV!
-I1
-sVe
-I36
-sVç
-I3
-sVp
-I4
-sVé
-I21
-sVè
-I1
-sVl
-I8
-sVo
-I1
-sV,
-I4
-sVi
-I10
-sVs
-I22
-sVr
-I18
-sVu
-I1
-sVt
-I1
-sVh
-I3
-sV;
-I1
-sV.
-I1
-ssV.f
-p2662
-(dp2663
-Vr
-I2
-ssVur
-p2664
-(dp2665
-V!
-I2
-sV
-I677
-sVp
-I14
-sV-
-I5
-sV,
-I80
-sV.
-I21
-sV;
-I17
-sV:
-I2
-sV?
-I4
-sV_
-I3
-sVa
-I85
-sVc
-I20
-sVb
-I2
-sVe
-I209
-sVd
-I28
-sVg
-I12
-sVf
-I1
-sVi
-I47
-sVè
-I2
-sVm
-I4
-sVl
-I2
-sVo
-I22
-sVn
-I39
-sVq
-I18
-sVé
-I11
-sVs
-I275
-sVr
-I29
-sVu
-I14
-sVt
-I23
-sVv
-I4
-ssVum
-p2666
-(dp2667
-Va
-I9
-sV
-I4
-sVb
-I8
-sVe
-I39
-sVé
-I3
-sVè
-I2
-sV,
-I2
-sV.
-I2
-sVi
-I4
-sVu
-I1
-sVô
-I4
-sV:
-I1
-sV_
-I2
-ssVul
-p2668
-(dp2669
-Va
-I21
-sV
-I9
-sVc
-I1
-sVâ
-I3
-sVe
-I61
-sVd
-I6
-sVg
-I31
-sVé
-I7
-sVm
-I2
-sVl
-I6
-sVo
-I5
-sV,
-I1
-sVi
-I10
-sVs
-I6
-sVu
-I17
-sVt
-I23
-sVy
-I1
-sVû
-I3
-sV.
-I1
-ssVuo
-p2670
-(dp2671
-Vi
-I63
-sVs
-I1
-sVn
-I3
-ssVun
-p2672
-(dp2673
-Va
-I1
-sV
-I533
-sVc
-I5
-sVe
-I321
-sVd
-I36
-sVé
-I129
-sV-
-I1
-sVl
-I1
-sV.
-I2
-sVi
-I24
-sVs
-I8
-sVu
-I5
-sVt
-I4
-sV;
-I1
-sV,
-I1
-ssVui
-p2674
-(dp2675
-V!
-I1
-sV
-I553
-sVc
-I2
-sVe
-I9
-sVf
-I17
-sVé
-I5
-sVè
-I4
-sV-
-I14
-sVl
-I25
-sV.
-I9
-sVp
-I5
-sVs
-I155
-sVr
-I23
-sVt
-I119
-sVv
-I21
-sV[
-I1
-sV;
-I2
-sVn
-I31
-sV,
-I35
-sV?
-I2
-ssVuh
-p2676
-(dp2677
-Va
-I3
-ssVuj
-p2678
-(dp2679
-Ve
-I5
-sVo
-I57
-ssVue
-p2680
-(dp2681
-V!
-I2
-sV
-I645
-sVr
-I64
-sV:
-I1
-sVf
-I12
-sVi
-I7
-sV-
-I2
-sV?
-I2
-sVm
-I3
-sV,
-I28
-sVo
-I3
-sV.
-I15
-sVs
-I117
-sVn
-I10
-sVu
-I19
-sVt
-I42
-sV;
-I10
-sVz
-I7
-sV_
-I4
-sVl
-I180
-ssVud
-p2682
-(dp2683
-Va
-I1
-sV
-I1
-sVe
-I25
-sVi
-I16
-sV,
-I1
-sVé
-I1
-sVr
-I23
-sV:
-I1
-ssVug
-p2684
-(dp2685
-Va
-I12
-sVe
-I23
-sVg
-I1
-sVi
-I8
-sVh
-I3
-sVm
-I3
-sVé
-I2
-sVu
-I5
-ssVuf
-p2686
-(dp2687
-Va
-I1
-sV
-I6
-sVs
-I1
-sVr
-I2
-sVf
-I19
-ssV.t
-p2688
-(dp2689
-Vx
-I6
-ssVuc
-p2690
-(dp2691
-Va
-I1
-sVc
-I2
-sVe
-I14
-sVi
-I8
-sVh
-I37
-sVk
-I1
-sVo
-I27
-sVr
-I4
-sVu
-I15
-sVt
-I7
-ssVub
-p2692
-(dp2693
-Va
-I1
-sVe
-I2
-sVi
-I4
-sVj
-I1
-sVm
-I2
-sVl
-I34
-sVo
-I2
-sVs
-I4
-sVt
-I1
-sV/
-I1
-ssVTy
-p2694
-(dp2695
-Vr
-I1
-ssVTu
-p2696
-(dp2697
-V
-I4
-sVc
-I2
-sVr
-I12
-sVn
-I1
-ssVTr
-p2698
-(dp2699
-Va
-I8
-sVi
-I3
-sVè
-I1
-sVo
-I2
-sVé
-I2
-sVu
-I1
-ssVTo
-p2700
-(dp2701
-V
-I3
-sVu
-I14
-ssVTh
-p2702
-(dp2703
-Ve
-I21
-sVi
-I7
-sVo
-I4
-sVé
-I4
-sVr
-I1
-sVu
-I12
-ssVTi
-p2704
-(dp2705
-Vm
-I1
-sVt
-I1
-ssVTe
-p2706
-(dp2707
-Vx
-I2
-sVn
-I2
-sVm
-I1
-sVl
-I3
-sV
-I2
-ssVTa
-p2708
-(dp2709
-Vs
-I2
-sVn
-I3
-ssVA
-p2710
-(dp2711
-Vc
-I2
-sVp
-I9
-sVm
-I1
-sVl
-I1
-sVP
-I2
-sVs
-I1
-sVT
-I1
-ssVgg
-p2712
-(dp2713
-Ve
-I1
-ssVTY
-p2714
-(dp2715
-V
-I4
-sV;
-I1
-sV,
-I1
-ssVTT
-p2716
-(dp2717
-VE
-I2
-sVO
-I1
-ssVTR
-p2718
-(dp2719
-VA
-I2
-sVI
-I2
-sVE
-I30
-sVO
-I1
-ssVTS
-p2720
-(dp2721
-V,
-I1
-ssVA.
-p2722
-(dp2723
-V
-I1
-ssVTN
-p2724
-(dp2725
-VE
-I1
-ssVTO
-p2726
-(dp2727
-VI
-I1
-sV
-I6
-sVM
-I3
-sV?
-I1
-ssV.»
-p2728
-(dp2729
-V
-I2
-ssVTH
-p2730
-(dp2731
-VI
-I3
-sVE
-I7
-ssVTI
-p2732
-(dp2733
-VA
-I1
-sVC
-I2
-sVE
-I2
-sVM
-I2
-sVO
-I4
-sVS
-I1
-sVV
-I1
-ssVTE
-p2734
-(dp2735
-VS
-I1
-sVR
-I2
-sVU
-I2
-sVD
-I3
-sVN
-I8
-ssVTC
-p2736
-(dp2737
-V.
-I1
-ssVTA
-p2738
-(dp2739
-VI
-I2
-sVB
-I1
-sVR
-I2
-sVL
-I1
-ssVAC
-p2740
-(dp2741
-VH
-I1
-sVE
-I1
-sVT
-I1
-sVO
-I1
-ssVAB
-p2742
-(dp2743
-VI
-I2
-sVR
-I1
-sVO
-I1
-ssVAD
-p2744
-(dp2745
-V
-I1
-sVU
-I1
-sVD
-I1
-sVE
-I1
-ssVAG
-p2746
-(dp2747
-VE
-I3
-ssVAI
-p2748
-(dp2749
-VR
-I3
-sVM
-I1
-sVN
-I2
-ssVAH
-p2750
-(dp2751
-VA
-I1
-ssVAM
-p2752
-(dp2753
-VA
-I3
-sV,
-I1
-ssVAL
-p2754
-(dp2755
-VP
-I1
-sVL
-I3
-sV
-I1
-sV,
-I1
-ssVAN
-p2756
-(dp2757
-VY
-I3
-sV
-I2
-sVS
-I2
-sVD
-I4
-sVT
-I6
-ssVT.
-p2758
-(dp2759
-V
-I2
-ssVAP
-p2760
-(dp2761
-VI
-I30
-ssVT,
-p2762
-(dp2763
-V
-I3
-ssVAR
-p2764
-(dp2765
-VI
-I1
-sV
-I2
-sVR
-I4
-sVE
-I1
-sVT
-I3
-ssVT*
-p2766
-(dp2767
-V
-I1
-sV*
-I2
-ssVAT
-p2768
-(dp2769
-V
-I1
-sVT
-I1
-ssVAV
-p2770
-(dp2771
-VE
-I4
-ssVAY
-p2772
-(dp2773
-V
-I1
-ssVT
-p2774
-(dp2775
-VE
-I1
-sVD
-I1
-sVG
-I8
-sVI
-I1
-sVH
-I1
-sVM
-I1
-sVL
-I3
-sVN
-I2
-sVP
-I1
-ssVT!
-p2776
-(dp2777
-V
-I1
-sV*
-I1
-ssVAc
-p2778
-(dp2779
-Vh
-I8
-ssVAb
-p2780
-(dp2781
-Va
-I4
-sVs
-I1
-sVr
-I1
-ssVAd
-p2782
-(dp2783
-Va
-I1
-ssVAg
-p2784
-(dp2785
-Vi
-I1
-ssVAf
-p2786
-(dp2787
-Vr
-I5
-ssVAh
-p2788
-(dp2789
-V!
-I18
-sV
-I1
-ssVAm
-p2790
-(dp2791
-Vé
-I4
-sVa
-I1
-sVs
-I1
-sVo
-I3
-ssVAl
-p2792
-(dp2793
-Va
-I2
-sVo
-I2
-sVe
-I3
-sVl
-I12
-sVg
-I4
-ssVAo
-p2794
-(dp2795
-Vd
-I1
-ssVAn
-p2796
-(dp2797
-Vc
-I1
-sVn
-I1
-sVt
-I3
-sVg
-I8
-sVd
-I1
-ssVAp
-p2798
-(dp2799
-Vp
-I2
-sVr
-I7
-ssVuï
-p2800
-(dp2801
-V
-I1
-sVe
-I1
-ssVAr
-p2802
-(dp2803
-Va
-I2
-sVc
-I6
-sVi
-I3
-sVk
-I1
-sVo
-I1
-sVr
-I4
-sVt
-I2
-ssVué
-p2804
-(dp2805
-V!
-I1
-sV
-I23
-sVe
-I9
-sV,
-I5
-sVn
-I11
-sVs
-I4
-sVr
-I8
-sVu
-I1
-sV?
-I1
-ssVAt
-p2806
-(dp2807
-Vh
-I1
-sVr
-I1
-sVl
-I1
-sVo
-I2
-ssVAw
-p2808
-(dp2809
-Va
-I1
-ssVAv
-p2810
-(dp2811
-Va
-I1
-sVe
-I3
-ssVAy
-p2812
-(dp2813
-Va
-I2
-sVr
-I13
-sVe
-I1
-ssVAz
-p2814
-(dp2815
-Vo
-I4
-ssVuà
-p2816
-(dp2817
-V
-I1
-ssVuâ
-p2818
-(dp2819
-Vm
-I1
-sVt
-I1
-ssV b
-p2820
-(dp2821
-Va
-I144
-sVâ
-I6
-sVe
-I153
-sVi
-I154
-sVê
-I1
-sVl
-I14
-sVo
-I150
-sVé
-I5
-sVr
-I72
-sVu
-I18
-sVy
-I27
-ssV c
-p2822
-(dp2823
-Va
-I220
-sVe
-I483
-sV'
-I87
-sVi
-I49
-sVh
-I335
-sVl
-I12
-sVo
-I635
-sVé
-I11
-sVr
-I101
-sVu
-I30
-sVô
-I18
-ssVgu
-p2824
-(dp2825
-Va
-I11
-sVe
-I61
-sVé
-I8
-sVè
-I3
-sVm
-I2
-sVl
-I6
-sVi
-I4
-sVs
-I3
-sVr
-I13
-sVt
-I5
-ssV a
-p2826
-(dp2827
-Vî
-I1
-sV
-I146
-sV-
-I9
-sVc
-I61
-sVb
-I51
-sVe
-I1
-sVd
-I33
-sVg
-I19
-sVf
-I21
-sVi
-I97
-sVh
-I2
-sVj
-I2
-sVm
-I49
-sVl
-I100
-sVo
-I2
-sVn
-I137
-sVp
-I112
-sVs
-I69
-sVr
-I97
-sVu
-I396
-sVt
-I51
-sVw
-I2
-sVv
-I394
-sVy
-I17
-ssV f
-p2828
-(dp2829
-Va
-I282
-sVâ
-I2
-sVe
-I120
-sVi
-I177
-sVê
-I1
-sVl
-I23
-sVo
-I172
-sVî
-I1
-sVé
-I4
-sVr
-I93
-sVu
-I151
-sVt
-I1
-sVû
-I12
-ssV g
-p2830
-(dp2831
-Va
-I63
-sVâ
-I2
-sVe
-I44
-sVi
-I6
-sVl
-I7
-sVo
-I50
-sVé
-I19
-sVr
-I121
-sVu
-I33
-ssV d
-p2832
-(dp2833
-Va
-I396
-sVe
-I2108
-sV'
-I412
-sVi
-I567
-sVè
-I7
-sVo
-I292
-sVî
-I12
-sVé
-I183
-sVr
-I24
-sVu
-I295
-sVû
-I2
-ssV e
-p2834
-(dp2835
-Va
-I3
-sVB
-I42
-sVd
-I6
-sVf
-I27
-sVi
-I1
-sVh
-I1
-sVm
-I42
-sVl
-I72
-sVn
-I593
-sVq
-I5
-sVs
-I220
-sVr
-I4
-sVu
-I63
-sVt
-I950
-sVv
-I7
-sVx
-I85
-sVû
-I10
-ssV j
-p2836
-(dp2837
-Va
-I80
-sVe
-I328
-sV'
-I113
-sVé
-I33
-sVo
-I93
-sVu
-I63
-ssV k
-p2838
-(dp2839
-Va
-I1
-sVe
-I1
-sVn
-I5
-ssV h
-p2840
-(dp2841
-Va
-I60
-sVâ
-I1
-sVe
-I29
-sVi
-I9
-sVo
-I158
-sVé
-I12
-sVu
-I18
-sVô
-I8
-sVy
-I4
-sVt
-I5
-ssV i
-p2842
-(dp2843
-Vc
-I29
-sVd
-I10
-sVg
-I4
-sVf
-I11
-sVm
-I36
-sVl
-I395
-sVn
-I170
-sVs
-I25
-sVr
-I2
-sVt
-I27
-sVv
-I1
-ssV n
-p2844
-(dp2845
-Va
-I41
-sVe
-I299
-sV'
-I258
-sVé
-I27
-sVè
-I8
-sVo
-I335
-sVi
-I44
-sVu
-I20
-sVô
-I2
-ssV o
-p2846
-(dp2847
-Vc
-I11
-sVb
-I20
-sVe
-I5
-sVd
-I3
-sVf
-I81
-sVi
-I4
-sVh
-I2
-sVm
-I2
-sVn
-I173
-sVp
-I7
-sVs
-I2
-sVr
-I84
-sVu
-I79
-sVt
-I21
-sVw
-I1
-sVv
-I3
-sVù
-I49
-ssV l
-p2848
-(dp2849
-Va
-I801
-sVà
-I16
-sVâ
-I2
-sVe
-I1457
-sV'
-I415
-sVi
-I102
-sVè
-I3
-sVo
-I70
-sVé
-I7
-sVu
-I207
-sVy
-I2
-ssV m
-p2850
-(dp2851
-Va
-I607
-sVâ
-I2
-sVe
-I299
-sV'
-I75
-sVi
-I182
-sVè
-I30
-sVê
-I48
-sVo
-I544
-sVé
-I62
-sVu
-I23
-sVy
-I1
-ssV r
-p2852
-(dp2853
-Va
-I109
-sVe
-I408
-sVi
-I85
-sVè
-I1
-sVê
-I4
-sVo
-I121
-sVé
-I135
-sVu
-I21
-sVô
-I4
-sVh
-I1
-ssV s
-p2854
-(dp2855
-Va
-I281
-sVé
-I29
-sVc
-I22
-sVb
-I1
-sVe
-I413
-sV'
-I140
-sVi
-I192
-sVh
-I4
-sVm
-I1
-sVo
-I490
-sVp
-I9
-sVu
-I289
-sVt
-I28
-sVè
-I1
-sVy
-I3
-sVû
-I1
-ssVge
-p2856
-(dp2857
-Va
-I20
-sV
-I102
-sVz
-I4
-sVd
-I2
-sV)
-I1
-sVm
-I6
-sV,
-I41
-sVo
-I6
-sVn
-I58
-sV.
-I13
-sVs
-I61
-sVr
-I66
-sV!
-I2
-sVt
-I9
-sVu
-I13
-sV;
-I15
-sV:
-I5
-sV?
-I2
-sVl
-I1
-ssV q
-p2858
-(dp2859
-Vu
-I1445
-ssV v
-p2860
-(dp2861
-Va
-I109
-sVe
-I119
-sVi
-I253
-sVê
-I4
-sVo
-I579
-sVé
-I21
-sVr
-I17
-sVu
-I47
-sVô
-I1
-ssV w
-p2862
-(dp2863
-Va
-I9
-sVe
-I13
-sVi
-I31
-sVh
-I12
-sVo
-I15
-sVr
-I4
-sVw
-I2
-ssV t
-p2864
-(dp2865
-Va
-I86
-sVâ
-I1
-sVe
-I139
-sV'
-I5
-sVi
-I36
-sVh
-I180
-sVê
-I16
-sVo
-I490
-sVé
-I8
-sVr
-I304
-sVu
-I54
-sVw
-I1
-sVy
-I1
-ssV u
-p2866
-(dp2867
-Vp
-I2
-sVs
-I26
-sVt
-I5
-sVn
-I638
-ssVgo
-p2868
-(dp2869
-Vc
-I1
-sVb
-I1
-sVe
-I1
-sVg
-I1
-sVi
-I1
-sV-
-I1
-sVl
-I2
-sVo
-I1
-sVn
-I132
-sVs
-I1
-sVr
-I13
-sVu
-I38
-sVt
-I5
-sVû
-I21
-ssVgn
-p2870
-(dp2871
-Vé
-I10
-sVa
-I20
-sVe
-I88
-sVi
-I14
-sVo
-I26
-ssVgm
-p2872
-(dp2873
-Vé
-I1
-sVe
-I3
-ssV y
-p2874
-(dp2875
-V
-I102
-sVe
-I26
-sVo
-I62
-ssVgi
-p2876
-(dp2877
-Va
-I2
-sVe
-I20
-sVé
-I1
-sVm
-I4
-sVl
-I3
-sVo
-I5
-sVn
-I15
-sVq
-I3
-sVs
-I12
-sVr
-I1
-sVt
-I12
-sVv
-I5
-ssVgh
-p2878
-(dp2879
-V
-I3
-sVt
-I16
-sVo
-I1
-sV,
-I1
-ssV B
-p2880
-(dp2881
-VA
-I1
-sVa
-I7
-sVE
-I3
-sVi
-I7
-sV,
-I2
-sVo
-I12
-sV.
-I45
-sVr
-I3
-sVu
-I36
-sVy
-I7
-sVe
-I4
-sVR
-I1
-sVU
-I2
-ssV C
-p2882
-(dp2883
-Va
-I495
-sVA
-I4
-sVe
-I83
-sV'
-I34
-sV
-I1
-sVi
-I3
-sVh
-I22
-sVl
-I4
-sVo
-I58
-sVé
-I3
-sVr
-I5
-sVu
-I125
-sVO
-I2
-sVH
-I31
-ssV A
-p2884
-(dp2885
-V
-I19
-sV,
-I1
-sV.
-I1
-sVB
-I2
-sVD
-I1
-sVN
-I3
-sVS
-I3
-sVR
-I1
-sVV
-I2
-sVc
-I7
-sVb
-I6
-sVg
-I1
-sVf
-I2
-sVh
-I16
-sVm
-I6
-sVl
-I15
-sVo
-I1
-sVn
-I6
-sVp
-I9
-sVs
-I6
-sVr
-I14
-sVu
-I21
-sVt
-I2
-sVw
-I1
-sVv
-I3
-sVy
-I3
-sVz
-I3
-ssV F
-p2886
-(dp2887
-Va
-I2
-sVe
-I7
-sVi
-I5
-sVl
-I1
-sVo
-I9
-sVI
-I4
-sVr
-I21
-sVu
-I1
-sVO
-I4
-ssV G
-p2888
-(dp2889
-Va
-I5
-sVe
-I4
-sVi
-I10
-sVo
-I1
-sVI
-I1
-sVr
-I4
-sVu
-I27
-sVU
-I8
-sVR
-I1
-ssV D
-p2890
-(dp2891
-Va
-I15
-sVA
-I4
-sVE
-I9
-sVé
-I1
-sV'
-I3
-sVI
-I3
-sVè
-I3
-sVo
-I10
-sVi
-I28
-sVU
-I2
-sVO
-I5
-sVe
-I30
-ssV E
-p2892
-(dp2893
-VB
-I8
-sVd
-I1
-sVI
-I2
-sVh
-I12
-sVl
-I26
-sVD
-I2
-sVn
-I31
-sVs
-I14
-sVr
-I1
-sVu
-I8
-sVT
-I2
-sVX
-I1
-sVV
-I2
-sVx
-I1
-sVt
-I15
-ssV J
-p2894
-(dp2895
-VA
-I1
-sVa
-I17
-sVe
-I102
-sV'
-I28
-sVé
-I3
-sVo
-I5
-sV.
-I4
-sVu
-I20
-ssV K
-p2896
-(dp2897
-Va
-I1
-sV
-I1
-sVe
-I5
-sVI
-I1
-sV.
-I4
-sV°
-I1
-ssV H
-p2898
-(dp2899
-Va
-I10
-sVA
-I2
-sVe
-I6
-sVi
-I4
-sVo
-I12
-sVé
-I20
-sVu
-I1
-ssV I
-p2900
-(dp2901
-V,
-I1
-sV.
-I3
-sV:
-I1
-sVF
-I3
-sVI
-I9
-sVM
-I2
-sVN
-I5
-sVS
-I2
-sVT
-I1
-sVV
-I5
-sVX
-I2
-sVc
-I1
-sVe
-I4
-sVd
-I2
-sVg
-I1
-sVf
-I11
-sVm
-I1
-sVl
-I144
-sVo
-I1
-sVn
-I8
-sVs
-I14
-sVr
-I1
-sVt
-I9
-sVv
-I5
-ssV N
-p2902
-(dp2903
-Va
-I6
-sVé
-I1
-sVe
-I13
-sV'
-I4
-sVi
-I2
-sVO
-I6
-sV°
-I2
-sVU
-I2
-sVo
-I34
-sVu
-I2
-sVE
-I1
-ssV O
-p2904
-(dp2905
-V
-I7
-sVC
-I1
-sVe
-I2
-sVF
-I6
-sVh
-I7
-sVk
-I1
-sVc
-I3
-sVn
-I46
-sVs
-I1
-sVr
-I11
-sVu
-I16
-sVt
-I2
-sVx
-I1
-sVù
-I2
-sVE
-I2
-sVR
-I10
-sVN
-I1
-sVT
-I2
-ssV L
-p2906
-(dp2907
-Va
-I47
-sVA
-I1
-sVE
-I6
-sV'
-I31
-sVi
-I21
-sVO
-I1
-sVI
-I5
-sVu
-I2
-sVo
-I17
-sVe
-I151
-ssV M
-p2908
-(dp2909
-Va
-I184
-sVA
-I2
-sVe
-I11
-sVD
-I1
-sVé
-I7
-sVi
-I14
-sVM
-I1
-sV,
-I1
-sVO
-I2
-sV.
-I22
-sVI
-I1
-sVS
-I1
-sVu
-I2
-sVo
-I37
-sVè
-I1
-sVy
-I1
-sVE
-I2
-ssV R
-p2910
-(dp2911
-VA
-I1
-sVa
-I7
-sVe
-I6
-sVi
-I6
-sVh
-I1
-sVo
-I16
-sVU
-I3
-sVO
-I1
-sVu
-I10
-sVE
-I2
-ssV S
-p2912
-(dp2913
-Va
-I19
-sVc
-I1
-sVe
-I3
-sV'
-I1
-sVp
-I1
-sVi
-I26
-sVM
-I2
-sVm
-I3
-sVo
-I9
-sV.
-I3
-sVé
-I2
-sVu
-I15
-sVt
-I4
-sVy
-I1
-sVU
-I1
-sVE
-I1
-sVT
-I1
-ssV P
-p2914
-(dp2915
-VA
-I3
-sVa
-I153
-sVe
-I11
-sVi
-I2
-sVM
-I1
-sVl
-I11
-sVO
-I2
-sV.
-I1
-sVé
-I6
-sVR
-I9
-sVu
-I5
-sVo
-I50
-sVy
-I1
-sVU
-I4
-sVr
-I50
-ssV Q
-p2916
-(dp2917
-Vu
-I56
-sVU
-I1
-ssV V
-p2918
-(dp2919
-Va
-I6
-sVE
-I2
-sVi
-I9
-sVé
-I3
-sVO
-I2
-sV.
-I1
-sVI
-I7
-sVo
-I97
-sVe
-I44
-ssV W
-p2920
-(dp2921
-Va
-I1
-sVA
-I4
-sVE
-I1
-sVi
-I2
-sVh
-I2
-sVo
-I1
-sVH
-I1
-sVy
-I1
-sVe
-I15
-ssV T
-p2922
-(dp2923
-Va
-I5
-sVe
-I7
-sVi
-I2
-sVh
-I43
-sVê
-I1
-sVO
-I10
-sVé
-I1
-sVr
-I17
-sVu
-I18
-sVo
-I17
-sVH
-I5
-sVy
-I1
-sVR
-I2
-ssV U
-p2924
-(dp2925
-VN
-I2
-sVS
-I3
-sVr
-I3
-sVt
-I2
-sVn
-I29
-ssV Z
-p2926
-(dp2927
-Va
-I1
-sV,
-I1
-ssV [
-p2928
-(dp2929
-Va
-I1
-sVE
-I3
-sVP
-I2
-sV*
-I3
-sV1
-I29
-sV9
-I1
-sV3
-I6
-sV2
-I12
-sV5
-I2
-sVT
-I1
-sV7
-I1
-sV6
-I2
-sVY
-I1
-sV8
-I1
-sV4
-I3
-ssV X
-p2930
-(dp2931
-V
-I2
-sVI
-I13
-sVL
-I2
-sV.
-I1
-sVV
-I25
-sVX
-I40
-sV;
-I1
-sV,
-I1
-ssV Y
-p2932
-(dp2933
-Ve
-I1
-sVO
-I7
-sVo
-I7
-ssV _
-p2934
-(dp2935
-Vé
-I2
-sVI
-I1
-sVA
-I2
-sVC
-I12
-sVE
-I2
-sVD
-I3
-sVÉ
-I2
-sVH
-I3
-sVJ
-I2
-sVM
-I13
-sVL
-I9
-sVO
-I2
-sVN
-I1
-sVP
-I9
-sVS
-I6
-sVR
-I1
-sVT
-I3
-sVV
-I3
-sVa
-I2
-sVà
-I1
-sVc
-I1
-sVg
-I1
-sVi
-I1
-sVh
-I1
-sVm
-I1
-sVl
-I6
-sVp
-I1
-sVu
-I2
-ssV "
-p2936
-(dp2937
-VA
-I1
-sVD
-I1
-sVP
-I6
-sVs
-I1
-sVl
-I1
-sVp
-I1
-sVS
-I5
-sVR
-I1
-ssV #
-p2938
-(dp2939
-V4
-I1
-ssS' '
-p2940
-(dp2941
-Vê
-I9
-sVé
-I44
-sVâ
-I1
-sV
-I660
-sV"
-I3
-sV'
-I1
-sV(
-I7
-sV«
-I3
-sV*
-I13
-sV-
-I2
-sV1
-I23
-sVÉ
-I3
-sV3
-I1
-sV2
-I9
-sV4
-I2
-sV6
-I1
-sV9
-I1
-sV»
-I1
-sVô
-I1
-sVA
-I81
-sVÀ
-I1
-sVC
-I350
-sVB
-I62
-sVE
-I73
-sVD
-I46
-sVG
-I6
-sVF
-I12
-sVI
-I154
-sVH
-I20
-sVK
-I4
-sVJ
-I117
-sVM
-I95
-sVL
-I198
-sVO
-I81
-sVN
-I28
-sVQ
-I51
-sVP
-I88
-sVS
-I29
-sVR
-I19
-sVU
-I27
-sVT
-I66
-sVW
-I16
-sVV
-I73
-sVY
-I5
-sVX
-I6
-sV[
-I65
-sVç
-I1
-sV_
-I16
-sVa
-I156
-sVà
-I22
-sVc
-I223
-sVb
-I79
-sVe
-I150
-sVd
-I344
-sVg
-I44
-sVf
-I111
-sVi
-I68
-sVh
-I40
-sVk
-I1
-sVj
-I50
-sVm
-I192
-sVl
-I235
-sVo
-I40
-sVn
-I82
-sVq
-I129
-sVp
-I259
-sVs
-I178
-sVr
-I99
-sVu
-I38
-sVt
-I122
-sVw
-I7
-sVv
-I113
-sVy
-I8
-ssVâg
-p2942
-(dp2943
-Vé
-I4
-sVe
-I7
-ssV '
-p2944
-(dp2945
-V
-I1
-sVd
-I1
-ssV $
-p2946
-(dp2947
-V2
-I1
-ssVâc
-p2948
-(dp2949
-Vh
-I5
-sVe
-I13
-ssV *
-p2950
-(dp2951
-VB
-I1
-sV*
-I10
-sVE
-I2
-sVW
-I1
-sVn
-I1
-ssVâm
-p2952
-(dp2953
-Ve
-I16
-ssV (
-p2954
-(dp2955
-Va
-I3
-sV#
-I1
-sV*
-I2
-sVd
-I1
-sVf
-I1
-sVi
-I4
-sVJ
-I1
-sVC
-I1
-sVo
-I5
-sVN
-I1
-sVp
-I1
-sVs
-I1
-sVT
-I1
-sVV
-I1
-sV~
-I1
-sV_
-I2
-sVt
-I1
-ssV .
-p2956
-(dp2957
-V
-I1
-sV.
-I1
-ssVg:
-p2958
-(dp2959
-V
-I1
-ssV -
-p2960
-(dp2961
-V-
-I2
-sVn
-I1
-ssV 2
-p2962
-(dp2963
-V
-I1
-sVO
-I1
-sV1
-I1
-sV0
-I18
-sV5
-I1
-sV4
-I1
-sV7
-I2
-sV6
-I1
-sV8
-I1
-sV:
-I1
-ssV 3
-p2964
-(dp2965
-V1
-I1
-sV0
-I3
-sV3
-I1
-sV2
-I1
-sV8
-I1
-ssV 0
-p2966
-(dp2967
-V1
-I1
-sV0
-I1
-ssV 1
-p2968
-(dp2969
-V
-I2
-sVe
-I1
-sV-
-I1
-sV,
-I1
-sV1
-I2
-sV0
-I6
-sV2
-I2
-sV5
-I6
-sV4
-I3
-sV7
-I52
-sV6
-I6
-sV9
-I8
-sV8
-I6
-ssV 6
-p2970
-(dp2971
-V
-I1
-sV0
-I2
-sV4
-I2
-sV.
-I1
-ssV 7
-p2972
-(dp2973
-V.
-I1
-ssV 4
-p2974
-(dp2975
-V
-I1
-sV%
-I1
-sV0
-I2
-sV3
-I2
-sV2
-I2
-sV7
-I2
-sV8
-I1
-ssVg
-p2976
-(dp2977
-Vp
-I1
-sV(
-I1
-sVA
-I1
-sVE
-I4
-sVL
-I6
-sVN
-I1
-sVP
-I1
-sVS
-I2
-sVa
-I7
-sVc
-I3
-sVb
-I1
-sVe
-I5
-sVd
-I3
-sVf
-I7
-sVé
-I1
-sVh
-I1
-sVo
-I8
-sVn
-I1
-sVq
-I1
-sVi
-I9
-sVs
-I3
-sVt
-I8
-sVw
-I5
-sVv
-I1
-ssV :
-p2978
-(dp2979
-V
-I3
-ssVg.
-p2980
-(dp2981
-V
-I4
-sVn
-I3
-ssVg-
-p2982
-(dp2983
-Vt
-I13
-ssVg,
-p2984
-(dp2985
-V
-I8
-ssV ?
-p2986
-(dp2987
-V
-I1
-ssV <
-p2988
-(dp2989
-Vh
-I1
-ssVéh
-p2990
-(dp2991
-Vu
-I1
-ssVém
-p2992
-(dp2993
-Va
-I5
-sVe
-I24
-sVi
-I12
-sVè
-I1
-sVê
-I1
-sVo
-I26
-sVé
-I2
-sVu
-I3
-ssVd;
-p2994
-(dp2995
-V
-I5
-ssV â
-p2996
-(dp2997
-Vm
-I7
-sVg
-I7
-ssV à
-p2998
-(dp2999
-V
-I641
-sV-
-I2
-ssVzo
-p3000
-(dp3001
-Vn
-I1
-sVf
-I4
-ssVzi
-p3002
-(dp3003
-Vp
-I2
-sVr
-I3
-sVè
-I1
-sVl
-I1
-sVn
-I2
-ssV3]
-p3004
-(dp3005
-V
-I6
-sV;
-I1
-sV,
-I1
-sV.
-I2
-ssV ê
-p3006
-(dp3007
-Vt
-I70
-ssVze
-p3008
-(dp3009
-V
-I20
-sVr
-I2
-sV,
-I1
-sVd
-I1
-ssV é
-p3010
-(dp3011
-Vc
-I42
-sVd
-I13
-sVg
-I14
-sVm
-I6
-sVl
-I14
-sVn
-I3
-sVq
-I4
-sVp
-I37
-sVr
-I2
-sVt
-I305
-sVv
-I7
-ssV î
-p3012
-(dp3013
-Vl
-I2
-ssVza
-p3014
-(dp3015
-V
-I2
-sVb
-I1
-sVi
-I1
-sV,
-I2
-sV.
-I1
-sVr
-I2
-sVt
-I4
-ssVgâ
-p3016
-(dp3017
-Vt
-I2
-ssV ô
-p3018
-(dp3019
-V
-I3
-sVt
-I2
-ssVgé
-p3020
-(dp3021
-V
-I25
-sVe
-I11
-sVd
-I10
-sVm
-I1
-sV,
-I1
-sVn
-I20
-sVs
-I14
-sV;
-I1
-sV.
-I1
-ssVgè
-p3022
-(dp3023
-Vr
-I7
-ssV À
-p3024
-(dp3025
-V
-I1
-ssV É
-p3026
-(dp3027
-Vd
-I1
-sVn
-I2
-sVt
-I1
-sVg
-I2
-sVl
-I2
-ssVz,
-p3028
-(dp3029
-V
-I35
-ssVz-
-p3030
-(dp3031
-Ve
-I1
-sVn
-I1
-sVm
-I11
-sVl
-I1
-sVv
-I49
-ssVz.
-p3032
-(dp3033
-V
-I7
-sV.
-I1
-ssV «
-p3034
-(dp3035
-V
-I2
-sVM
-I1
-ssVz
-p3036
-(dp3037
-Vj
-I1
-sVM
-I1
-sVP
-I1
-sVa
-I11
-sVà
-I1
-sVc
-I14
-sVb
-I7
-sVe
-I6
-sVd
-I22
-sVg
-I2
-sVf
-I4
-sVé
-I5
-sVê
-I2
-sVm
-I6
-sVl
-I34
-sVo
-I1
-sVn
-I3
-sVq
-I8
-sVp
-I28
-sVs
-I7
-sVr
-I10
-sVu
-I6
-sVt
-I21
-sVv
-I8
-ssVz!
-p3038
-(dp3039
-V
-I3
-ssVz;
-p3040
-(dp3041
-V
-I3
-ssV »
-p3042
-(dp3043
-V
-I1
-ssV39
-p3044
-(dp3045
-V
-I1
-sV,
-I1
-sV.
-I2
-ssV38
-p3046
-(dp3047
-V,
-I1
-sV6
-I1
-ssV33
-p3048
-(dp3049
-V9
-I1
-ssV32
-p3050
-(dp3051
-V.
-I1
-ssV31
-p3052
-(dp3053
-V5
-I1
-sV4
-I1
-ssV30
-p3054
-(dp3055
-V0
-I1
-sV;
-I1
-sV,
-I2
-sV
-I1
-sV6
-I1
-ssV36
-p3056
-(dp3057
-V.
-I2
-ssV35
-p3058
-(dp3059
-V.
-I1
-ssV3)
-p3060
-(dp3061
-V
-I2
-ssV3.
-p3062
-(dp3063
-V
-I2
-ssV3,
-p3064
-(dp3065
-V
-I2
-ssV3
-p3066
-(dp3067
-V
-I1
-sVo
-I1
-sVN
-I1
-ssVFA
-p3068
-(dp3069
-VC
-I1
-ssVFI
-p3070
-(dp3071
-VR
-I1
-sVL
-I1
-sVT
-I1
-sVN
-I1
-ssVFO
-p3072
-(dp3073
-VR
-I6
-ssVFr
-p3074
-(dp3075
-Va
-I16
-sVé
-I1
-sVe
-I2
-sVo
-I1
-sVè
-I1
-ssVFu
-p3076
-(dp3077
-Vy
-I1
-ssVFa
-p3078
-(dp3079
-Vr
-I2
-ssVFe
-p3080
-(dp3081
-Vr
-I4
-sVb
-I2
-sVu
-I1
-ssVFi
-p3082
-(dp3083
-Vg
-I4
-sVn
-I1
-ssVFl
-p3084
-(dp3085
-Vo
-I1
-ssVFo
-p3086
-(dp3087
-Vu
-I9
-ssVF
-p3088
-(dp3089
-VA
-I1
-sVD
-I1
-sVM
-I1
-sVS
-I1
-sVT
-I1
-sVW
-I1
-sVY
-I3
-ssVYO
-p3090
-(dp3091
-VU
-I7
-ssVdl
-p3092
-(dp3093
-Ve
-I1
-ssVdm
-p3094
-(dp3095
-Vi
-I10
-sVe
-I2
-ssVFÈ
-p3096
-(dp3097
-VV
-I1
-ssVYT
-p3098
-(dp3099
-VH
-I1
-ssVYo
-p3100
-(dp3101
-Vr
-I1
-sVu
-I6
-ssVYe
-p3102
-(dp3103
-Va
-I1
-sVs
-I1
-ssVY,
-p3104
-(dp3105
-V
-I1
-ssVY
-p3106
-(dp3107
-VE
-I1
-sVK
-I1
-sVB
-I1
-sVM
-I1
-sVO
-I3
-ssVY;
-p3108
-(dp3109
-V
-I1
-ssV!
-p3110
-(dp3111
-V
-I38
-sVô
-I1
-sVA
-I2
-sVC
-I2
-sVE
-I1
-sVF
-I1
-sVI
-I1
-sVJ
-I4
-sVM
-I4
-sVL
-I1
-sVO
-I2
-sVN
-I1
-sVP
-I3
-sVa
-I2
-sVà
-I1
-sVc
-I9
-sVb
-I1
-sVe
-I2
-sVd
-I22
-sVf
-I1
-sVi
-I1
-sVj
-I7
-sVm
-I12
-sVl
-I8
-sVo
-I2
-sVn
-I1
-sVq
-I5
-sVp
-I1
-sVs
-I10
-sVr
-I2
-sVt
-I2
-sVv
-I6
-ssVdy
-p3112
-(dp3113
-V
-I2
-sVl
-I1
-ssV%
-p3114
-(dp3115
-Vo
-I3
-ssVé!
-p3116
-(dp3117
-V
-I2
-ssVdw
-p3118
-(dp3119
-Va
-I1
-ssVl_
-p3120
-(dp3121
-V
-I1
-ssV8°
-p3122
-(dp3123
-V.
-I1
-ssVl[
-p3124
-(dp3125
-V1
-I2
-ssVlf
-p3126
-(dp3127
-V
-I1
-sVe
-I1
-ssVlg
-p3128
-(dp3129
-Va
-I31
-sVu
-I1
-sVr
-I1
-sVe
-I4
-ssVld
-p3130
-(dp3131
-Va
-I14
-sV
-I8
-sVb
-I1
-sVe
-I1
-sV'
-I1
-sVo
-I17
-sV.
-I1
-ssVle
-p3132
-(dp3133
-V!
-I8
-sV
-I1245
-sV-
-I15
-sV,
-I111
-sV.
-I67
-sV;
-I25
-sV:
-I8
-sV?
-I8
-sV[
-I1
-sV]
-I1
-sV_
-I2
-sVd
-I1
-sVa
-I19
-sVc
-I10
-sVg
-I6
-sVç
-I4
-sVf
-I1
-sVi
-I13
-sVm
-I71
-sVn
-I48
-sVq
-I14
-sVs
-I738
-sVr
-I79
-sVu
-I217
-sVt
-I55
-sVv
-I32
-sVy
-I3
-sVx
-I7
-sVz
-I13
-ssVlc
-p3134
-(dp3135
-Va
-I3
-sVi
-I1
-sVu
-I2
-sVo
-I1
-ssVla
-p3136
-(dp3137
-Vî
-I2
-sV
-I758
-sV-
-I2
-sV,
-I5
-sV.
-I1
-sV;
-I1
-sV?
-I1
-sVc
-I23
-sVb
-I4
-sVd
-I8
-sVg
-I15
-sVi
-I182
-sVh
-I1
-sVm
-I11
-sVn
-I90
-sVq
-I12
-sVs
-I33
-sVr
-I46
-sVu
-I2
-sVt
-I28
-sVw
-I5
-sVv
-I15
-sVy
-I2
-ssVlo
-p3138
-(dp3139
-Va
-I4
-sV
-I4
-sVc
-I1
-sVb
-I3
-sVg
-I22
-sVi
-I20
-sVm
-I4
-sV,
-I1
-sVï
-I1
-sVn
-I77
-sVq
-I1
-sVp
-I4
-sVs
-I127
-sVr
-I23
-sVu
-I36
-sVt
-I13
-sVw
-I7
-sVy
-I2
-ssVll
-p3140
-(dp3141
-Va
-I92
-sV
-I29
-sVâ
-I1
-sVe
-I676
-sVi
-I40
-sVè
-I8
-sVo
-I35
-sVé
-I21
-sVs
-I2
-sVu
-I11
-sVy
-I9
-ssVlm
-p3142
-(dp3143
-Va
-I3
-sVe
-I2
-ssVlh
-p3144
-(dp3145
-Ve
-I23
-sVo
-I1
-ssVli
-p3146
-(dp3147
-V
-I8
-sV,
-I2
-sV;
-I2
-sVa
-I8
-sVc
-I34
-sVb
-I23
-sVe
-I111
-sVd
-I2
-sVg
-I21
-sVf
-I2
-sVé
-I3
-sVè
-I8
-sVk
-I2
-sVm
-I13
-sVl
-I1
-sVo
-I24
-sVn
-I13
-sVq
-I26
-sVp
-I1
-sVs
-I23
-sVr
-I8
-sVu
-I2
-sVt
-I37
-sVv
-I28
-sVz
-I2
-ssVlv
-p3148
-(dp3149
-Va
-I4
-ssVlw
-p3150
-(dp3151
-Va
-I1
-ssVlt
-p3152
-(dp3153
-Va
-I36
-sVe
-I13
-sVi
-I11
-sVh
-I1
-sVo
-I4
-sV.
-I1
-sVé
-I1
-sVr
-I1
-sVu
-I2
-sVy
-I2
-ssVlu
-p3154
-(dp3155
-Va
-I3
-sV
-I12
-sVe
-I5
-sVd
-I8
-sVi
-I219
-sVm
-I18
-sV,
-I1
-sVn
-I6
-sVp
-I6
-sVs
-I209
-sVr
-I6
-sVt
-I28
-ssVlr
-p3156
-(dp3157
-Ve
-I2
-ssVls
-p3158
-(dp3159
-V
-I153
-sVi
-I4
-sV,
-I6
-sVo
-I3
-sV.
-I4
-sVé
-I2
-sV;
-I3
-ssVlp
-p3160
-(dp3161
-Vi
-I4
-sV
-I1
-ssVlq
-p3162
-(dp3163
-Vu
-I88
-ssVly
-p3164
-(dp3165
-V
-I25
-sV,
-I2
-sV.
-I1
-sVr
-I1
-sVn
-I1
-sVz
-I1
-ssVl'
-p3166
-(dp3167
-Va
-I156
-sVé
-I31
-sVâ
-I8
-sVe
-I61
-sVA
-I15
-sVÉ
-I2
-sVh
-I34
-sVê
-I3
-sVO
-I1
-sVy
-I1
-sVi
-I36
-sVu
-I20
-sVo
-I33
-sVI
-I5
-sVE
-I8
-sV_
-I3
-ssVl
-p3168
-(dp3169
-Vi
-I6
-sV(
-I1
-sV5
-I2
-sVC
-I1
-sVB
-I1
-sVD
-I1
-sVH
-I3
-sVP
-I8
-sVS
-I4
-sVR
-I1
-sVT
-I1
-sVa
-I52
-sVà
-I17
-sVc
-I15
-sVb
-I10
-sVe
-I80
-sVd
-I55
-sVg
-I2
-sVf
-I71
-sVé
-I21
-sVh
-I3
-sVj
-I3
-sVm
-I42
-sVl
-I45
-sVo
-I11
-sVn
-I104
-sVq
-I13
-sVp
-I58
-sVs
-I46
-sVr
-I22
-sVu
-I3
-sVt
-I10
-sVv
-I25
-sVy
-I56
-ssVl!
-p3170
-(dp3171
-V
-I6
-ssVl.
-p3172
-(dp3173
-V
-I19
-ssVl,
-p3174
-(dp3175
-V
-I76
-ssVl-
-p3176
-(dp3177
-Vv
-I1
-ssVl?
-p3178
-(dp3179
-V
-I3
-ssVl:
-p3180
-(dp3181
-V
-I3
-ssVl;
-p3182
-(dp3183
-V
-I12
-ssV8.
-p3184
-(dp3185
-V
-I2
-ssV8,
-p3186
-(dp3187
-V
-I6
-ssV8
-p3188
-(dp3189
-Va
-I1
-sVd
-I1
-sVO
-I1
-ssV8;
-p3190
-(dp3191
-V
-I1
-ssV89
-p3192
-(dp3193
-V,
-I1
-ssV82
-p3194
-(dp3195
-V9
-I1
-sV2
-I1
-sV5
-I1
-sV.
-I1
-ssV80
-p3196
-(dp3197
-V9
-I1
-sV3
-I1
-ssV81
-p3198
-(dp3199
-V5
-I1
-ssV86
-p3200
-(dp3201
-V5
-I1
-ssV85
-p3202
-(dp3203
-V.
-I1
-ssVlâ
-p3204
-(dp3205
-Vc
-I2
-sVt
-I5
-ssVlà
-p3206
-(dp3207
-V
-I39
-sV;
-I1
-sV:
-I1
-sV,
-I7
-sV?
-I2
-ssVlè
-p3208
-(dp3209
-Vc
-I1
-sVg
-I4
-sVm
-I2
-sVn
-I2
-sVr
-I29
-sVt
-I1
-sVv
-I5
-ssVlé
-p3210
-(dp3211
-Va
-I2
-sV
-I14
-sVc
-I1
-sVb
-I1
-sVe
-I42
-sVd
-I1
-sVg
-I6
-sVm
-I2
-sV,
-I7
-sV.
-I1
-sVs
-I13
-sVr
-I4
-sVt
-I1
-sV;
-I2
-sV:
-I4
-ssVlû
-p3212
-(dp3213
-Vt
-I3
-ssV8]
-p3214
-(dp3215
-V
-I1
-sV;
-I1
-ssVK
-p3216
-(dp3217
-VI
-I1
-sVs
-I1
-sVO
-I1
-ssVK.
-p3218
-(dp3219
-V
-I2
-sV-
-I2
-ssVKa
-p3220
-(dp3221
-Vn
-I1
-ssVKe
-p3222
-(dp3223
-Vh
-I4
-sVn
-I1
-ssVKI
-p3224
-(dp3225
-VN
-I1
-ssVKS
-p3226
-(dp3227
-V
-I1
-sV*
-I2
-ssV*n
-p3228
-(dp3229
-Vo
-I1
-ssVK°
-p3230
-(dp3231
-V
-I1
-ssV*e
-p3232
-(dp3233
-VB
-I1
-ssV*]
-p3234
-(dp3235
-V
-I3
-ssV*T
-p3236
-(dp3237
-Vh
-I4
-sVH
-I1
-ssV*V
-p3238
-(dp3239
-Ve
-I1
-ssV*W
-p3240
-(dp3241
-VA
-I1
-sVe
-I1
-ssV*S
-p3242
-(dp3243
-VT
-I2
-ssV*E
-p3244
-(dp3245
-VI
-I1
-sVN
-I2
-ssV*F
-p3246
-(dp3247
-VO
-I1
-ssV*B
-p3248
-(dp3249
-VE
-I1
-ssV*:
-p3250
-(dp3251
-V
-I1
-ssVsl
-p3252
-(dp3253
-Va
-I2
-sVy
-I1
-sVe
-I3
-ssV*)
-p3254
-(dp3255
-V
-I1
-ssV**
-p3256
-(dp3257
-V
-I10
-sVe
-I1
-sVF
-I1
-sV*
-I27
-sVS
-I2
-sVT
-I5
-sVW
-I1
-ssV*
-p3258
-(dp3259
-VY
-I1
-sVc
-I1
-sVm
-I1
-sVT
-I1
-ssVho
-p3260
-(dp3261
-V
-I3
-sVc
-I4
-sVe
-I1
-sVd
-I5
-sVf
-I1
-sVi
-I5
-sVm
-I112
-sVl
-I11
-sVo
-I2
-sVn
-I36
-sVq
-I1
-sVs
-I39
-sVr
-I38
-sVu
-I15
-sVt
-I2
-sVw
-I8
-ssVPé
-p3262
-(dp3263
-Vc
-I2
-sVr
-I4
-ssVha
-p3264
-(dp3265
-Vo
-I1
-sVî
-I5
-sV
-I13
-sV,
-I2
-sV[
-I1
-sVc
-I21
-sVb
-I23
-sVe
-I6
-sVg
-I3
-sVi
-I14
-sVë
-I1
-sVm
-I14
-sVl
-I15
-sVï
-I1
-sVn
-I45
-sVq
-I7
-sVp
-I28
-sVs
-I18
-sVr
-I61
-sVu
-I23
-sVt
-I16
-sVv
-I9
-ssVq
-p3266
-(dp3267
-Va
-I1
-sVp
-I4
-sVr
-I1
-sVo
-I3
-ssVq'
-p3268
-(dp3269
-Vu
-I1
-ssVqu
-p3270
-(dp3271
-Va
-I141
-sVâ
-I2
-sVe
-I931
-sV'
-I358
-sVi
-I462
-sVè
-I3
-sVo
-I57
-sVé
-I15
-ssVPr
-p3272
-(dp3273
-Vé
-I9
-sVu
-I1
-sVe
-I1
-sVi
-I6
-sVo
-I45
-ssVPu
-p3274
-(dp3275
-Vi
-I2
-sVp
-I2
-sVb
-I1
-ssVPy
-p3276
-(dp3277
-Vr
-I1
-ssVPa
-p3278
-(dp3279
-Vd
-I2
-sVg
-I1
-sVl
-I4
-sVn
-I99
-sVq
-I17
-sVs
-I1
-sVr
-I29
-sVy
-I1
-ssVPe
-p3280
-(dp3281
-Vr
-I3
-sVu
-I1
-sVt
-I2
-sVn
-I5
-ssVPi
-p3282
-(dp3283
-Ve
-I3
-ssVPo
-p3284
-(dp3285
-Vc
-I15
-sVi
-I3
-sVm
-I1
-sVl
-I5
-sVr
-I17
-sVu
-I11
-ssVPl
-p3286
-(dp3287
-Va
-I3
-sVu
-I1
-sVe
-I7
-ssVPR
-p3288
-(dp3289
-VI
-I3
-sVÉ
-I1
-sVE
-I1
-sVO
-I9
-ssVwa
-p3290
-(dp3291
-Vi
-I1
-sV,
-I1
-sVn
-I4
-sVs
-I1
-sVr
-I8
-sVy
-I6
-ssVPT
-p3292
-(dp3293
-VI
-I2
-ssVPU
-p3294
-(dp3295
-VR
-I1
-sVB
-I2
-sVN
-I1
-ssVPA
-p3296
-(dp3297
-VR
-I3
-ssVPE
-p3298
-(dp3299
-VR
-I1
-ssVPH
-p3300
-(dp3301
-V,
-I1
-ssVPI
-p3302
-(dp3303
-VT
-I30
-ssVPO
-p3304
-(dp3305
-VC
-I1
-sVS
-I2
-ssVPL
-p3306
-(dp3307
-VI
-I1
-ssVtz
-p3308
-(dp3309
-V
-I1
-sV,
-I1
-ssV0]
-p3310
-(dp3311
-V
-I2
-sV,
-I1
-ssVP.
-p3312
-(dp3313
-VC
-I1
-ssVdû
-p3314
-(dp3315
-V
-I1
-sVt
-I2
-ssVck
-p3316
-(dp3317
-Vy
-I2
-sV
-I6
-sV[
-I1
-sV,
-I3
-sVh
-I11
-ssVci
-p3318
-(dp3319
-Va
-I22
-sV
-I36
-sVc
-I5
-sVe
-I62
-sVd
-I6
-sVf
-I3
-sVé
-I2
-sVè
-I2
-sVm
-I2
-sVl
-I8
-sVo
-I2
-sVn
-I38
-sVp
-I13
-sVs
-I20
-sVr
-I4
-sVt
-I13
-sVv
-I4
-sV;
-I1
-sV.
-I3
-sV,
-I10
-sV?
-I3
-ssVch
-p3320
-(dp3321
-Va
-I200
-sV
-I15
-sVâ
-I30
-sVe
-I224
-sVi
-I35
-sVè
-I21
-sVm
-I7
-sVo
-I54
-sVé
-I32
-sVr
-I11
-sVu
-I5
-sVt
-I1
-sVy
-I1
-ssVco
-p3322
-(dp3323
-Vc
-I20
-sVb
-I1
-sVe
-I16
-sVd
-I2
-sVg
-I4
-sVf
-I1
-sVi
-I2
-sV-
-I1
-sVm
-I227
-sVl
-I25
-sVï
-I1
-sVn
-I271
-sVq
-I7
-sVp
-I17
-sVs
-I5
-sVr
-I92
-sVu
-I198
-sVt
-I3
-sVv
-I1
-sVû
-I5
-sV,
-I1
-ssVcl
-p3324
-(dp3325
-Va
-I28
-sVe
-I30
-sVi
-I3
-sVo
-I3
-sVé
-I1
-sVu
-I20
-ssVcc
-p3326
-(dp3327
-Va
-I7
-sVe
-I8
-sVi
-I2
-sVè
-I1
-sVo
-I19
-sVq
-I1
-sVé
-I1
-sVr
-I2
-sVu
-I12
-ssVvé
-p3328
-(dp3329
-V
-I28
-sVc
-I2
-sVe
-I9
-sVd
-I1
-sV,
-I3
-sV.
-I3
-sVs
-I7
-sVr
-I33
-sV;
-I1
-sVn
-I6
-sV?
-I2
-ssVvê
-p3330
-(dp3331
-Vt
-I5
-ssVce
-p3332
-(dp3333
-V!
-I2
-sV
-I330
-sV,
-I34
-sV.
-I25
-sV;
-I12
-sV:
-I4
-sV?
-I4
-sV_
-I3
-sVa
-I6
-sVc
-I2
-sVd
-I2
-sVi
-I12
-sVm
-I18
-sVl
-I61
-sVn
-I56
-sVq
-I12
-sVp
-I19
-sVs
-I151
-sVr
-I16
-sVu
-I10
-sVt
-I109
-sVv
-I11
-ssVcz
-p3334
-(dp3335
-Vi
-I1
-ssVcy
-p3336
-(dp3337
-Vc
-I3
-ssVvô
-p3338
-(dp3339
-Vt
-I1
-ssVcs
-p3340
-(dp3341
-V
-I6
-sV,
-I5
-sV/
-I1
-sV.
-I1
-ssVcr
-p3342
-(dp3343
-Va
-I12
-sVâ
-I1
-sVe
-I20
-sVi
-I68
-sVè
-I1
-sVo
-I45
-sVé
-I16
-sVu
-I16
-sVy
-I1
-ssVcq
-p3344
-(dp3345
-Vu
-I12
-ssVcu
-p3346
-(dp3347
-V
-I2
-sVe
-I9
-sVi
-I8
-sVm
-I3
-sVl
-I28
-sVn
-I33
-sVp
-I7
-sVs
-I10
-sVr
-I39
-sVt
-I11
-sVv
-I1
-sVy
-I1
-sV,
-I1
-ssVct
-p3348
-(dp3349
-Va
-I12
-sV
-I38
-sV"
-I1
-sVe
-I35
-sV'
-I1
-sVi
-I25
-sVè
-I2
-sVl
-I3
-sVo
-I4
-sV.
-I1
-sVé
-I1
-sVs
-I5
-sVr
-I9
-sVu
-I8
-sV;
-I1
-ssVc)
-p3350
-(dp3351
-V(
-I2
-sV
-I1
-ssVc.
-p3352
-(dp3353
-V
-I7
-sV»
-I1
-ssVc,
-p3354
-(dp3355
-V
-I13
-ssVc!
-p3356
-(dp3357
-V
-I2
-ssVc
-p3358
-(dp3359
-Vp
-I10
-sVA
-I1
-sVC
-I4
-sVD
-I1
-sVM
-I4
-sVP
-I2
-sVT
-I1
-sVa
-I5
-sVc
-I7
-sVb
-I3
-sVe
-I9
-sVd
-I19
-sVg
-I1
-sVf
-I2
-sVé
-I2
-sVj
-I1
-sVm
-I9
-sVl
-I26
-sVn
-I2
-sVq
-I8
-sVi
-I2
-sVs
-I10
-sVr
-I2
-sVu
-I19
-sVt
-I8
-sVv
-I4
-ssVc'
-p3360
-(dp3361
-Vé
-I22
-sVe
-I65
-ssVc;
-p3362
-(dp3363
-V
-I2
-ssVc:
-p3364
-(dp3365
-V
-I1
-ssVva
-p3366
-(dp3367
-V
-I34
-sVc
-I2
-sVb
-I2
-sVd
-I1
-sVg
-I13
-sVi
-I335
-sV,
-I5
-sVl
-I50
-sV.
-I2
-sVs
-I3
-sVr
-I2
-sVu
-I19
-sVt
-I2
-sV;
-I1
-sVn
-I101
-ssVcé
-p3368
-(dp3369
-V
-I6
-sVe
-I4
-sVd
-I11
-sVl
-I3
-sVn
-I1
-sVs
-I2
-sVr
-I7
-ssVcè
-p3370
-(dp3371
-Vs
-I5
-sVr
-I7
-sVn
-I4
-ssVcî
-p3372
-(dp3373
-Vm
-I1
-ssVvh
-p3374
-(dp3375
-Vé
-I1
-ssVvi
-p3376
-(dp3377
-Va
-I4
-sV
-I7
-sVc
-I15
-sVe
-I135
-sVd
-I14
-sVg
-I4
-sVf
-I2
-sVè
-I4
-sVl
-I45
-sVo
-I18
-sVn
-I71
-sVs
-I37
-sVr
-I21
-sVt
-I35
-sVv
-I18
-sVz
-I3
-sV,
-I1
-ssVvo
-p3378
-(dp3379
-Vc
-I1
-sVe
-I2
-sVg
-I1
-sVi
-I171
-sVm
-I1
-sVl
-I38
-sVn
-I24
-sVs
-I18
-sVr
-I8
-sVu
-I396
-sVt
-I46
-sVy
-I83
-sVû
-I3
-ssVvr
-p3380
-(dp3381
-Va
-I31
-sVe
-I63
-sVi
-I8
-sVè
-I1
-sVo
-I3
-sVé
-I3
-ssVvu
-p3382
-(dp3383
-V
-I34
-sVe
-I11
-sVl
-I4
-sV,
-I5
-sV;
-I1
-sV.
-I1
-sV?
-I1
-ssVcô
-p3384
-(dp3385
-Vt
-I18
-ssVOc
-p3386
-(dp3387
-Vh
-I1
-sVt
-I2
-ssV/g
-p3388
-(dp3389
-Va
-I2
-sVu
-I3
-ssV/f
-p3390
-(dp3391
-Vt
-I1
-ssV/e
-p3392
-(dp3393
-VB
-I3
-ssV/d
-p3394
-(dp3395
-Vo
-I3
-ssV/b
-p3396
-(dp3397
-Vo
-I1
-ssV/w
-p3398
-(dp3399
-Vw
-I3
-ssV/p
-p3400
-(dp3401
-Vr
-I1
-sVu
-I1
-sVg
-I1
-ssV//
-p3402
-(dp3403
-Vp
-I1
-sVw
-I3
-sVg
-I3
-sVf
-I1
-ssV/1
-p3404
-(dp3405
-V1
-I1
-ssV/0
-p3406
-(dp3407
-V2
-I1
-ssVBE
-p3408
-(dp3409
-V
-I1
-sVR
-I10
-sVU
-I2
-sVF
-I1
-ssVBA
-p3410
-(dp3411
-VT
-I1
-ssVBC
-p3412
-(dp3413
-VD
-I2
-ssVBL
-p3414
-(dp3415
-VI
-I2
-ssVBO
-p3416
-(dp3417
-VU
-I1
-sVO
-I6
-ssVBI
-p3418
-(dp3419
-VL
-I3
-ssVBU
-p3420
-(dp3421
-VT
-I3
-ssVû
-p3422
-(dp3423
-Vf
-I1
-ssVBR
-p3424
-(dp3425
-VA
-I2
-sVE
-I1
-ssVBe
-p3426
-(dp3427
-Va
-I1
-sV
-I1
-sVr
-I2
-ssVBa
-p3428
-(dp3429
-Va
-I1
-sVs
-I1
-sVb
-I1
-sVt
-I2
-sVd
-I2
-ssVBo
-p3430
-(dp3431
-Vr
-I8
-sVu
-I1
-sVt
-I1
-sVo
-I46
-sVn
-I2
-ssVBi
-p3432
-(dp3433
-Vs
-I3
-sVb
-I3
-sVe
-I1
-ssVBu
-p3434
-(dp3435
-Vé
-I12
-sVe
-I1
-sVl
-I22
-sVt
-I1
-ssVBr
-p3436
-(dp3437
-Vi
-I1
-sVe
-I2
-ssVBy
-p3438
-(dp3439
-V
-I4
-sVn
-I3
-ssVûr
-p3440
-(dp3441
-Ve
-I1
-ssVût
-p3442
-(dp3443
-Va
-I3
-sV
-I35
-sVe
-I11
-sVé
-I7
-sV-
-I2
-sV,
-I2
-sV.
-I1
-sVs
-I1
-ssVûm
-p3444
-(dp3445
-Ve
-I2
-ssVûl
-p3446
-(dp3447
-Vé
-I7
-sVa
-I2
-sVe
-I4
-ssVB
-p3448
-(dp3449
-V1
-I1
-ssVB,
-p3450
-(dp3451
-V
-I3
-ssVB.
-p3452
-(dp3453
-V
-I45
-ssVU'
-p3454
-(dp3455
-VI
-I1
-sVO
-I1
-ssVU
-p3456
-(dp3457
-VA
-I1
-sV"
-I1
-sVD
-I2
-sVG
-I1
-sVH
-I1
-sV*
-I1
-sVB
-I1
-sVU
-I1
-ssVUt
-p3458
-(dp3459
-Va
-I1
-sVr
-I1
-ssVUr
-p3460
-(dp3461
-Vb
-I4
-ssVUn
-p3462
-(dp3463
-Vi
-I3
-sV
-I24
-sVe
-I2
-ssVUT
-p3464
-(dp3465
-VI
-I1
-sV
-I4
-sVE
-I8
-ssVUV
-p3466
-(dp3467
-VÉ
-I1
-sVR
-I2
-ssVUS
-p3468
-(dp3469
-V
-I2
-sVE
-I1
-ssVUR
-p3470
-(dp3471
-V
-I1
-sVU
-I1
-sV,
-I1
-sVP
-I1
-ssVUM
-p3472
-(dp3473
-V
-I1
-sVB
-I2
-ssVUL
-p3474
-(dp3475
-VA
-I1
-ssVUN
-p3476
-(dp3477
-VI
-I1
-sVD
-I2
-ssVUI
-p3478
-(dp3479
-VE
-I1
-sVT
-I1
-ssVUE
-p3480
-(dp3481
-V
-I3
-sVN
-I1
-ssVUD
-p3482
-(dp3483
-VI
-I2
-ssVUC
-p3484
-(dp3485
-VH
-I3
-ssVUB
-p3486
-(dp3487
-VL
-I2
-ssVh:
-p3488
-(dp3489
-V
-I1
-ssVh;
-p3490
-(dp3491
-V
-I4
-ssV!"
-p3492
-(dp3493
-V
-I6
-ssVh?
-p3494
-(dp3495
-V
-I1
-ssV!)
-p3496
-(dp3497
-V
-I1
-sV.
-I1
-ssV!*
-p3498
-(dp3499
-V
-I1
-sV*
-I2
-ssV!-
-p3500
-(dp3501
-V-
-I1
-ssVeo
-p3502
-(dp3503
-Vi
-I2
-sVp
-I3
-sVr
-I4
-sVn
-I6
-ssVh.
-p3504
-(dp3505
-V
-I2
-ssVh,
-p3506
-(dp3507
-V
-I8
-ssVh
-p3508
-(dp3509
-Va
-I6
-sVo
-I2
-sVc
-I1
-sVb
-I8
-sVE
-I2
-sVd
-I2
-sVP
-I1
-sVi
-I1
-sVé
-I2
-sVH
-I1
-sVj
-I1
-sVm
-I1
-sVC
-I2
-sVO
-I1
-sVp
-I3
-sVu
-I1
-sVt
-I8
-sVv
-I1
-sVy
-I2
-sVe
-I1
-sVh
-I1
-ssVh!
-p3510
-(dp3511
-V
-I31
-ssVhy
-p3512
-(dp3513
-Va
-I1
-sVp
-I5
-sVs
-I20
-sV
-I1
-ssVhr
-p3514
-(dp3515
-Vé
-I8
-sVi
-I4
-sVe
-I1
-sVa
-I1
-sVo
-I2
-ssVht
-p3516
-(dp3517
-V
-I13
-sVi
-I3
-sVm
-I2
-sV,
-I2
-sVs
-I2
-sVt
-I5
-ssVhu
-p3518
-(dp3519
-Vi
-I17
-sVm
-I13
-sVn
-I13
-sVs
-I4
-sVr
-I1
-sVt
-I2
-sV;
-I1
-ssVhi
-p3520
-(dp3521
-V
-I1
-sVc
-I3
-sVb
-I1
-sVe
-I12
-sVd
-I2
-sVg
-I1
-sVm
-I1
-sVl
-I26
-sVo
-I2
-sVn
-I19
-sVq
-I1
-sVs
-I54
-sVr
-I11
-sVt
-I1
-sVv
-I6
-ssVà,
-p3522
-(dp3523
-V
-I8
-ssVhl
-p3524
-(dp3525
-V,
-I2
-sV.
-I2
-ssVhm
-p3526
-(dp3527
-Vé
-I1
-sVe
-I7
-sVo
-I1
-ssVà-
-p3528
-(dp3529
-Vd
-I3
-sVv
-I1
-sVl
-I2
-sVf
-I2
-ssVhe
-p3530
-(dp3531
-Va
-I4
-sV
-I131
-sVc
-I4
-sV:
-I2
-sVd
-I2
-sVf
-I6
-sVm
-I14
-sV,
-I17
-sVn
-I8
-sVq
-I1
-sV.
-I9
-sVs
-I37
-sVr
-I89
-sVu
-I59
-sVt
-I12
-sVv
-I23
-sVy
-I6
-sV;
-I5
-sVz
-I34
-sV?
-I2
-sVl
-I1
-ssV!_
-p3532
-(dp3533
-V
-I2
-ssVÂC
-p3534
-(dp3535
-VE
-I1
-ssVà:
-p3536
-(dp3537
-V
-I1
-ssVà;
-p3538
-(dp3539
-V
-I1
-ssV48
-p3540
-(dp3541
-V.
-I1
-ssV46
-p3542
-(dp3543
-V5
-I1
-ssV47
-p3544
-(dp3545
-V0
-I2
-sV.
-I1
-ssV44
-p3546
-(dp3547
-V.
-I1
-ssV42
-p3548
-(dp3549
-V9
-I1
-sV0
-I1
-ssV43
-p3550
-(dp3551
-V5
-I1
-sV6
-I1
-ssV40
-p3552
-(dp3553
-V
-I1
-sV0
-I2
-ssV41
-p3554
-(dp3555
-V
-I1
-sV0
-I1
-ssV4.
-p3556
-(dp3557
-V
-I4
-ssV4,
-p3558
-(dp3559
-V
-I3
-ssV4-
-p3560
-(dp3561
-V3
-I1
-sV6
-I2
-ssV4%
-p3562
-(dp3563
-V
-I1
-ssV4
-p3564
-(dp3565
-Va
-I1
-sVJ
-I2
-sVm
-I2
-sVo
-I1
-ssV4]
-p3566
-(dp3567
-V
-I3
-sV;
-I1
-sV.
-I2
-ssVhô
-p3568
-(dp3569
-Vp
-I2
-sVt
-I16
-ssVhè
-p3570
-(dp3571
-Vq
-I3
-sVr
-I20
-sVt
-I1
-sVv
-I1
-ssVhé
-p3572
-(dp3573
-Va
-I9
-sV
-I18
-sVâ
-I4
-sVe
-I9
-sVi
-I1
-sVm
-I3
-sV,
-I1
-sVo
-I9
-sVn
-I1
-sVs
-I5
-sVr
-I9
-sVt
-I2
-sV;
-I1
-sV.
-I1
-sVb
-I1
-sVl
-I1
-ssVhâ
-p3574
-(dp3575
-Vt
-I31
-ssVhà
-p3576
-(dp3577
-Vt
-I1
-ssV-s
-p3578
-(dp3579
-Vi
-I2
-sVu
-I2
-sVe
-I2
-sssb.
\ No newline at end of file
Copied: trunk/lib/venus/examples/filters/guess-language/fr.data (from rev 656, branches/sucs-site/lib/venus/examples/filters/guess-language/fr.data)
===================================================================
--- trunk/lib/venus/examples/filters/guess-language/fr.data (rev 0)
+++ trunk/lib/venus/examples/filters/guess-language/fr.data 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,22710 @@
+(itrigram
+Trigram
+p1
+(dp2
+S'length'
+p3
+F8394.978022603751
+sS'lut'
+p4
+(dp5
+V-D
+p6
+(dp7
+Va
+I3
+ssVG"
+p8
+(dp9
+V
+I2
+ssVG
+p10
+(dp11
+Va
+I1
+sVB
+I2
+ssVG-
+p12
+(dp13
+Vt
+I5
+sVT
+I1
+ssVGU
+p14
+(dp15
+VT
+I8
+ssVGR
+p16
+(dp17
+VÂ
+I1
+ssVGE
+p18
+(dp19
+VS
+I3
+sVN
+I1
+ssVGL
+p20
+(dp21
+VI
+I1
+ssVGI
+p22
+(dp23
+VV
+I1
+ssVGu
+p24
+(dp25
+Vi
+I1
+sVt
+I26
+ssVGr
+p26
+(dp27
+Va
+I5
+sVe
+I1
+ssVGe
+p28
+(dp29
+Vr
+I1
+sVo
+I1
+sVn
+I3
+ssVGa
+p30
+(dp31
+Vr
+I1
+sVu
+I2
+sVl
+I1
+sVï
+I1
+ssVGo
+p32
+(dp33
+Va
+I1
+ssVGi
+p34
+(dp35
+Vr
+I9
+sVv
+I1
+ssVZ,
+p36
+(dp37
+V
+I1
+ssVZ
+p38
+(dp39
+VL
+I1
+ssVèr
+p40
+(dp41
+Ve
+I319
+ssVès
+p42
+(dp43
+V
+I148
+sVe
+I2
+sV-
+I2
+sV,
+I3
+sV;
+I1
+sV_
+I1
+ssVèq
+p44
+(dp45
+Vu
+I4
+ssVèv
+p46
+(dp47
+Vr
+I2
+sVe
+I4
+ssVèt
+p48
+(dp49
+Vr
+I1
+sVe
+I9
+ssVèn
+p50
+(dp51
+Ve
+I24
+ssVèl
+p52
+(dp53
+Ve
+I7
+ssVèm
+p54
+(dp55
+Ve
+I30
+ssVèc
+p56
+(dp57
+Vh
+I2
+sVe
+I23
+sVl
+I14
+ssVèg
+p58
+(dp59
+Vr
+I8
+sVe
+I7
+sVl
+I1
+ssVèd
+p60
+(dp61
+Ve
+I4
+ssV-c
+p62
+(dp63
+Vi
+I14
+sVh
+I6
+sVe
+I16
+sVo
+I2
+ssVty
+p64
+(dp65
+Va
+I1
+sV
+I9
+sVr
+I2
+sVl
+I1
+sV,
+I1
+ssVZa
+p66
+(dp67
+Vm
+I1
+ssVtw
+p68
+(dp69
+Va
+I3
+sVo
+I1
+ssV-o
+p70
+(dp71
+Vf
+I1
+sVn
+I7
+ssV-n
+p72
+(dp73
+Ve
+I1
+sVo
+I15
+ssVàt
+p74
+(dp75
+Ve
+I1
+ssV-i
+p76
+(dp77
+V8
+I1
+sVl
+I83
+sVn
+I5
+ssV«M
+p78
+(dp79
+Vo
+I1
+ssV-h
+p80
+(dp81
+Ve
+I1
+sVu
+I1
+sVo
+I3
+ssVtq
+p82
+(dp83
+Vu
+I1
+ssVm'
+p84
+(dp85
+Va
+I46
+sVe
+I12
+sVé
+I7
+sVh
+I1
+sVo
+I6
+sVi
+I2
+sVy
+I1
+ssVm
+p86
+(dp87
+Va
+I7
+sVà
+I1
+sVc
+I2
+sVb
+I1
+sVe
+I6
+sVd
+I10
+sVi
+I2
+sV(
+I2
+sVl
+I1
+sVo
+I3
+sVq
+I1
+sVp
+I2
+sVs
+I1
+sVr
+I1
+sVt
+I3
+ssV-t
+p88
+(dp89
+Ve
+I23
+sVh
+I1
+sV-
+I20
+sVm
+I6
+sVr
+I12
+sVu
+I4
+ssVm,
+p90
+(dp91
+V
+I9
+ssVm.
+p92
+(dp93
+V
+I9
+ssVm)
+p94
+(dp95
+V,
+I1
+sV.
+I1
+ssV-w
+p96
+(dp97
+Vi
+I1
+ssV"l
+p98
+(dp99
+Ve
+I1
+ssVtm
+p100
+(dp101
+V
+I5
+sV"
+I1
+sVl
+I2
+ssV9]
+p102
+(dp103
+V
+I2
+ssVm>
+p104
+(dp105
+V
+I1
+ssVm:
+p106
+(dp107
+V
+I2
+ssV9,
+p108
+(dp109
+V
+I8
+ssV9.
+p110
+(dp111
+V
+I5
+ssV9
+p112
+(dp113
+VU
+I1
+sVD
+I1
+ssV-r
+p114
+(dp115
+Va
+I2
+sVo
+I1
+ssV99
+p116
+(dp117
+V
+I1
+sV,
+I1
+sV1
+I1
+sV4
+I1
+sV7
+I1
+sV9
+I1
+sV8
+I1
+ssV98
+p118
+(dp119
+V
+I1
+sV,
+I1
+ssV9:
+p120
+(dp121
+V
+I1
+ssV91
+p122
+(dp123
+V
+I2
+ssV90
+p124
+(dp125
+V
+I2
+sV0
+I1
+ssVm_
+p126
+(dp127
+V,
+I2
+sV.
+I1
+ssV92
+p128
+(dp129
+V,
+I2
+ssV95
+p130
+(dp131
+V,
+I1
+ssV94
+p132
+(dp133
+V
+I2
+sV,
+I2
+ssV97
+p134
+(dp135
+V1
+I2
+sV
+I1
+sV;
+I1
+sV,
+I1
+ssV96
+p136
+(dp137
+V,
+I3
+ssVme
+p138
+(dp139
+V!
+I1
+sV
+I462
+sV-
+I4
+sV,
+I44
+sV.
+I16
+sV;
+I11
+sV:
+I5
+sV?
+I1
+sV[
+I3
+sV_
+I4
+sVa
+I2
+sVd
+I11
+sVi
+I20
+sVm
+I4
+sVl
+I1
+sVo
+I1
+sVn
+I379
+sVs
+I187
+sVr
+I54
+sVu
+I27
+sVt
+I48
+sVz
+I6
+ssV«
+p140
+(dp141
+VQ
+I1
+sV.
+I1
+ssVma
+p142
+(dp143
+Vî
+I46
+sV
+I59
+sV-
+I1
+sV,
+I3
+sVc
+I7
+sVb
+I4
+sVe
+I2
+sVd
+I67
+sVg
+I25
+sVi
+I262
+sVk
+I3
+sVj
+I14
+sVm
+I1
+sVl
+I72
+sVï
+I1
+sVn
+I185
+sVs
+I17
+sVr
+I70
+sVu
+I22
+sVt
+I39
+sVy
+I23
+sVx
+I3
+ssVmb
+p144
+(dp145
+Va
+I34
+sV
+I2
+sVe
+I25
+sVi
+I11
+sVè
+I1
+sVl
+I39
+sVo
+I88
+sV.
+I1
+sVé
+I1
+sVr
+I40
+ssVmm
+p146
+(dp147
+Va
+I26
+sVe
+I313
+sVé
+I9
+sVè
+I4
+sVo
+I9
+sVi
+I5
+sVu
+I13
+ssVml
+p148
+(dp149
+V
+I2
+sVe
+I1
+ssVmo
+p150
+(dp151
+Ve
+I7
+sVd
+I17
+sVi
+I197
+sVm
+I16
+sVl
+I4
+sVn
+I286
+sVq
+I3
+sVs
+I8
+sVr
+I57
+sVu
+I77
+sVt
+I20
+sVv
+I3
+sVy
+I4
+sV.
+I1
+ssVmn
+p152
+(dp153
+Vé
+I2
+sVi
+I2
+sVa
+I1
+sVo
+I1
+ssVmi
+p154
+(dp155
+V
+I15
+sVe
+I53
+sVd
+I4
+sVg
+I1
+sVè
+I20
+sV-
+I1
+sVl
+I85
+sVn
+I36
+sVq
+I1
+sVs
+I75
+sVr
+I27
+sVt
+I39
+sV.
+I1
+sV,
+I8
+ssVmu
+p156
+(dp157
+V
+I2
+sVe
+I2
+sVm
+I1
+sVl
+I5
+sVn
+I13
+sVp
+I3
+sVs
+I16
+sVr
+I2
+sVt
+I2
+ssVmt
+p158
+(dp159
+Ve
+I2
+ssV 9
+p160
+(dp161
+V1
+I1
+sV0
+I3
+sV3
+I1
+sV2
+I2
+sV5
+I1
+sV4
+I1
+sV7
+I1
+sV6
+I1
+sV9
+I1
+sV8
+I1
+ssVmp
+p162
+(dp163
+Va
+I30
+sV
+I5
+sVe
+I17
+sVi
+I11
+sVh
+I1
+sVê
+I9
+sVl
+I25
+sVo
+I32
+sV,
+I2
+sVé
+I3
+sVs
+I48
+sVr
+I16
+sVu
+I8
+sVt
+I15
+sV.
+I1
+ssVms
+p164
+(dp165
+V
+I3
+sV,
+I1
+sVt
+I1
+sV.
+I1
+ssV"p
+p166
+(dp167
+Vu
+I1
+ssVmy
+p168
+(dp169
+Vs
+I1
+sVr
+I2
+ssVLe
+p170
+(dp171
+V
+I87
+sVc
+I4
+sVb
+I1
+sVg
+I1
+sVi
+I3
+sVm
+I3
+sVs
+I48
+sVu
+I4
+sVt
+I6
+sVy
+I1
+ssVLa
+p172
+(dp173
+V
+I42
+sVv
+I1
+sVm
+I3
+sVt
+I2
+sVn
+I1
+ssVLo
+p174
+(dp175
+Vi
+I1
+sVm
+I1
+sVs
+I1
+sVu
+I13
+sVn
+I1
+ssV"s
+p176
+(dp177
+Vm
+I1
+ssVLi
+p178
+(dp179
+Vs
+I11
+sVm
+I2
+sVt
+I6
+sVn
+I2
+ssVLu
+p180
+(dp181
+Vc
+I2
+ssVLE
+p182
+(dp183
+V
+I1
+sVF
+I1
+sVM
+I1
+sVQ
+I1
+sVS
+I1
+sVT
+I2
+ssVLA
+p184
+(dp185
+VI
+I1
+sV
+I1
+sVR
+I1
+ssVLO
+p186
+(dp187
+VR
+I1
+ssVLL
+p188
+(dp189
+V
+I2
+sVE
+I1
+ssVLI
+p190
+(dp191
+VA
+I1
+sVC
+I2
+sVB
+I1
+sVE
+I1
+sVG
+I1
+sVI
+I1
+sVM
+I3
+sVT
+I3
+ssVLT
+p192
+(dp193
+VA
+I2
+ssVLU
+p194
+(dp195
+VD
+I2
+ssVLS
+p196
+(dp197
+V,
+I1
+ssVLP
+p198
+(dp199
+VH
+I1
+ssVL'
+p200
+(dp201
+Va
+I16
+sV
+I1
+sVE
+I1
+sVi
+I1
+sVÉ
+I1
+sVh
+I1
+sVo
+I2
+sVé
+I1
+sVA
+I2
+sVO
+I2
+sVu
+I4
+sVe
+I2
+ssVL
+p202
+(dp203
+VP
+I2
+sVM
+I1
+sVd
+I1
+sVD
+I1
+ssVL,
+p204
+(dp205
+V
+I1
+ssVmâ
+p206
+(dp207
+Vt
+I2
+ssVmé
+p208
+(dp209
+V
+I15
+sVc
+I4
+sVe
+I11
+sVd
+I14
+sVm
+I4
+sVl
+I5
+sVn
+I1
+sVp
+I5
+sVs
+I8
+sVr
+I17
+sVt
+I22
+sV.
+I2
+sV?
+I1
+ssVmè
+p210
+(dp211
+Vr
+I28
+sVt
+I1
+sVn
+I17
+ssVmê
+p212
+(dp213
+Vm
+I66
+sVl
+I5
+ssVmô
+p214
+(dp215
+Vn
+I4
+ssV_[
+p216
+(dp217
+V2
+I1
+ssV_V
+p218
+(dp219
+Va
+I1
+sVo
+I2
+ssV_T
+p220
+(dp221
+Ve
+I3
+ssV_S
+p222
+(dp223
+Vi
+I4
+sVe
+I2
+ssV_R
+p224
+(dp225
+Ve
+I1
+ssV_P
+p226
+(dp227
+Va
+I1
+sVr
+I8
+ssV_O
+p228
+(dp229
+V
+I1
+sVe
+I1
+ssV_N
+p230
+(dp231
+Vo
+I1
+ssV_M
+p232
+(dp233
+Vé
+I10
+sVa
+I2
+sVo
+I2
+ssV_L
+p234
+(dp235
+Va
+I1
+sVe
+I7
+sV'
+I1
+ssV_J
+p236
+(dp237
+Vo
+I2
+ssV_I
+p238
+(dp239
+Vt
+I1
+ssV_H
+p240
+(dp241
+Vi
+I3
+sVe
+I1
+sVo
+I1
+ssV_E
+p242
+(dp243
+Vx
+I1
+sVl
+I1
+ssV_D
+p244
+(dp245
+Vi
+I3
+ssV_C
+p246
+(dp247
+Va
+I9
+sVr
+I1
+sVo
+I2
+ssV_A
+p248
+(dp249
+Vr
+I1
+sVn
+I1
+ssVrô
+p250
+(dp251
+Vl
+I3
+sVt
+I3
+sVn
+I12
+ssV_u
+p252
+(dp253
+Vt
+I1
+sVn
+I1
+ssVrû
+p254
+(dp255
+Vl
+I13
+ssV_m
+p256
+(dp257
+Vê
+I1
+ssVrç
+p258
+(dp259
+Va
+I4
+sVu
+I11
+sVo
+I6
+ssV_i
+p260
+(dp261
+Vn
+I1
+ssV_h
+p262
+(dp263
+Vo
+I1
+ssV_g
+p264
+(dp265
+Vl
+I1
+ssVrî
+p266
+(dp267
+Vt
+I1
+ssVrè
+p268
+(dp269
+Vs
+I139
+sVr
+I38
+sVt
+I3
+sVg
+I1
+ssVré
+p270
+(dp271
+Vé
+I2
+sV
+I22
+sV,
+I5
+sV;
+I2
+sV?
+I1
+sVa
+I17
+sVc
+I33
+sVb
+I1
+sVe
+I25
+sVd
+I10
+sVg
+I6
+sVf
+I11
+sVi
+I2
+sVm
+I15
+sVl
+I1
+sVn
+I1
+sVp
+I77
+sVs
+I61
+sVr
+I1
+sVu
+I1
+sVt
+I23
+sVv
+I26
+ssVrê
+p272
+(dp273
+Vc
+I3
+sVm
+I13
+sVt
+I27
+sVv
+I4
+ssVxf
+p274
+(dp275
+Vo
+I1
+ssV_;
+p276
+(dp277
+V
+I10
+ssV_:
+p278
+(dp279
+V
+I1
+ssV_.
+p280
+(dp281
+V
+I27
+sV,
+I1
+ssV_,
+p282
+(dp283
+V
+I43
+ssV_)
+p284
+(dp285
+V
+I1
+ssV_
+p286
+(dp287
+Va
+I2
+sVE
+I1
+sVd
+I4
+sV(
+I1
+sVj
+I1
+sVq
+I1
+sVp
+I1
+sVe
+I1
+ssVr]
+p288
+(dp289
+V
+I2
+ssVr_
+p290
+(dp291
+V
+I1
+sV;
+I1
+sV.
+I1
+ssV_É
+p292
+(dp293
+Vp
+I1
+sVl
+I1
+ssVrt
+p294
+(dp295
+Va
+I43
+sV
+I103
+sVe
+I78
+sV@
+I2
+sVi
+I188
+sVh
+I4
+sV,
+I10
+sVo
+I23
+sV.
+I8
+sVé
+I17
+sVs
+I21
+sV!
+I1
+sVu
+I32
+sVî
+I1
+sVy
+I2
+sV;
+I4
+sVr
+I2
+sV_
+I1
+ssVru
+p296
+(dp297
+Va
+I3
+sV
+I7
+sVc
+I5
+sVb
+I5
+sVe
+I10
+sVd
+I9
+sVi
+I28
+sVm
+I1
+sV,
+I2
+sVn
+I5
+sVp
+I2
+sVs
+I9
+sVr
+I9
+sVt
+I17
+sVv
+I1
+sV.
+I1
+sVl
+I1
+ssVrv
+p298
+(dp299
+Va
+I11
+sVe
+I10
+sVi
+I30
+sVo
+I2
+sVé
+I2
+sVu
+I2
+ssVrw
+p300
+(dp301
+Va
+I1
+sVo
+I1
+ssVrp
+p302
+(dp303
+Vé
+I1
+sVa
+I1
+sVs
+I11
+sVr
+I15
+sVe
+I5
+ssVrq
+p304
+(dp305
+Vu
+I52
+ssVrr
+p306
+(dp307
+Va
+I42
+sVe
+I106
+sVi
+I76
+sVh
+I1
+sVê
+I10
+sVo
+I24
+sVé
+I4
+sVu
+I1
+ssVrs
+p308
+(dp309
+V!
+I4
+sV
+I324
+sV)
+I1
+sVe
+I18
+sVp
+I1
+sVé
+I6
+sVè
+I1
+sV,
+I60
+sVo
+I37
+sV.
+I24
+sVq
+I8
+sVi
+I6
+sVu
+I5
+sVt
+I5
+sVa
+I19
+sV[
+I1
+sV:
+I2
+sV;
+I14
+sV?
+I3
+ssVry
+p310
+(dp311
+Vi
+I2
+sV
+I14
+sV*
+I1
+sVm
+I1
+sV,
+I2
+ssVrz
+p312
+(dp313
+Ve
+I2
+ssVrd
+p314
+(dp315
+Va
+I30
+sV
+I40
+sVe
+I47
+sV'
+I8
+sVi
+I44
+sVè
+I3
+sV-
+I1
+sV,
+I8
+sVo
+I19
+sV.
+I3
+sVé
+I7
+sVs
+I8
+sVr
+I11
+sVu
+I19
+sVw
+I1
+sV;
+I2
+sV:
+I1
+sV[
+I1
+ssVre
+p316
+(dp317
+V!
+I8
+sV
+I911
+sV)
+I2
+sV-
+I8
+sV,
+I162
+sV.
+I75
+sV;
+I64
+sV:
+I22
+sV?
+I19
+sVg
+I28
+sV[
+I2
+sV_
+I9
+sVa
+I22
+sVc
+I52
+sVb
+I3
+sVe
+I10
+sVd
+I17
+sVç
+I19
+sVf
+I15
+sVi
+I24
+sVh
+I1
+sVj
+I1
+sVm
+I115
+sVl
+I30
+sVn
+I335
+sVq
+I9
+sVp
+I44
+sVs
+I370
+sVr
+I50
+sVu
+I59
+sVt
+I62
+sVv
+I38
+sVz
+I32
+ssVrf
+p318
+(dp319
+Va
+I6
+sV
+I3
+sVf
+I1
+sVi
+I1
+sVo
+I1
+sVs
+I2
+sVu
+I2
+ssVrg
+p320
+(dp321
+Va
+I3
+sV
+I24
+sVe
+I36
+sVi
+I14
+sVh
+I1
+sV-
+I1
+sV,
+I4
+sVo
+I2
+sVn
+I2
+sVé
+I14
+sVu
+I3
+sV/
+I4
+sVè
+I1
+sV;
+I1
+sV.
+I3
+ssVra
+p322
+(dp323
+Vî
+I17
+sV
+I74
+sVp
+I21
+sV-
+I2
+sV,
+I15
+sV.
+I2
+sV:
+I1
+sVa
+I3
+sVc
+I32
+sVb
+I20
+sVe
+I1
+sVd
+I39
+sVg
+I41
+sVf
+I3
+sVi
+I267
+sVh
+I2
+sVë
+I1
+sVm
+I21
+sVl
+I27
+sVo
+I6
+sVn
+I224
+sVé
+I2
+sVs
+I42
+sVr
+I12
+sVu
+I3
+sVt
+I36
+sVv
+I45
+sVy
+I2
+ssVrb
+p324
+(dp325
+Vi
+I4
+sVa
+I9
+sVk
+I1
+sVr
+I6
+sVe
+I4
+ssVrc
+p326
+(dp327
+V
+I4
+sVc
+I1
+sVe
+I45
+sVi
+I18
+sVh
+I45
+sVk
+I1
+sV,
+I4
+sVo
+I7
+sVî
+I1
+sVé
+I1
+sVs
+I3
+sVr
+I1
+sVè
+I1
+sV;
+I1
+sV.
+I3
+sVl
+I1
+ssVrl
+p328
+(dp329
+Va
+I22
+sVe
+I37
+sVd
+I3
+sVé
+I6
+sVo
+I3
+sVi
+I3
+sVy
+I1
+ssVrm
+p330
+(dp331
+Va
+I33
+sV
+I4
+sV)
+I1
+sVe
+I58
+sVi
+I27
+sVl
+I1
+sVo
+I11
+sV,
+I1
+sVé
+I14
+sV.
+I1
+ssVrn
+p332
+(dp333
+Va
+I44
+sV
+I2
+sVe
+I39
+sVé
+I12
+sVo
+I3
+sV.
+I1
+sVi
+I10
+sVu
+I1
+ssVro
+p334
+(dp335
+Vï
+I1
+sVa
+I1
+sVc
+I57
+sVb
+I17
+sVd
+I28
+sVg
+I7
+sVf
+I30
+sVi
+I164
+sVh
+I1
+sVj
+I32
+sVm
+I35
+sVl
+I25
+sVo
+I2
+sVn
+I157
+sVq
+I3
+sVp
+I49
+sVs
+I30
+sVr
+I2
+sVu
+I138
+sVt
+I6
+sVv
+I28
+sVy
+I34
+ssVrh
+p336
+(dp337
+Vu
+I2
+ssVri
+p338
+(dp339
+V
+I8
+sV,
+I6
+sV;
+I2
+sV?
+I1
+sVâ
+I2
+sV_
+I1
+sVa
+I35
+sVc
+I16
+sVb
+I36
+sVe
+I146
+sVd
+I16
+sVg
+I34
+sVf
+I5
+sVé
+I1
+sVè
+I24
+sVm
+I15
+sVl
+I15
+sVo
+I19
+sVn
+I53
+sVq
+I12
+sVp
+I12
+sVs
+I102
+sVr
+I38
+sVu
+I2
+sVt
+I110
+sVv
+I63
+sVx
+I9
+sVz
+I3
+ssV_à
+p340
+(dp341
+V
+I1
+ssVr?
+p342
+(dp343
+V
+I10
+sV-
+I1
+ssVr:
+p344
+(dp345
+V
+I11
+ssVr;
+p346
+(dp347
+V
+I48
+ssVr'
+p348
+(dp349
+Va
+I1
+sVs
+I1
+sVo
+I2
+ssVr
+p350
+(dp351
+Vj
+I13
+sVR
+I2
+sVi
+I28
+sV(
+I1
+sV/
+I1
+sV1
+I2
+sV2
+I1
+sV9
+I1
+sVA
+I4
+sVC
+I24
+sVB
+I2
+sVD
+I2
+sVG
+I1
+sVI
+I2
+sVH
+I1
+sVJ
+I2
+sVM
+I12
+sVL
+I3
+sVN
+I3
+sVP
+I22
+sVâ
+I1
+sVW
+I1
+sV[
+I1
+sVZ
+I2
+sVa
+I84
+sVà
+I45
+sVc
+I66
+sVb
+I11
+sVe
+I85
+sVd
+I242
+sVg
+I4
+sVf
+I25
+sVé
+I10
+sVh
+I7
+sVê
+I5
+sVm
+I64
+sVl
+I302
+sVo
+I27
+sVn
+I25
+sVq
+I53
+sVp
+I71
+sVs
+I88
+sVr
+I17
+sVu
+I63
+sVt
+I56
+sVw
+I3
+sVv
+I26
+sVy
+I2
+ssVr!
+p352
+(dp353
+V
+I6
+ssVr,
+p354
+(dp355
+V
+I204
+ssVr-
+p356
+(dp357
+Vd
+I3
+sVt
+I11
+sVl
+I5
+ssVr.
+p358
+(dp359
+VA
+I1
+sV
+I92
+sV»
+I1
+sV-
+I1
+sV0
+I1
+ssVr/
+p360
+(dp361
+VN
+I1
+ssVr*
+p362
+(dp363
+V
+I2
+ssVù,
+p364
+(dp365
+V
+I1
+ssVQu
+p366
+(dp367
+Va
+I12
+sVi
+I5
+sVe
+I26
+sVo
+I8
+sV'
+I6
+ssVQU
+p368
+(dp369
+VI
+I1
+sVE
+I1
+sV'
+I2
+ssVd.
+p370
+(dp371
+V
+I11
+ssVd,
+p372
+(dp373
+V
+I31
+ssVd-
+p374
+(dp375
+Va
+I1
+sVi
+I6
+sVo
+I1
+sVp
+I1
+sVs
+I2
+sVr
+I2
+sVT
+I1
+sVw
+I1
+ssVd)
+p376
+(dp377
+V:
+I1
+ssVéq
+p378
+(dp379
+Vu
+I14
+ssVd'
+p380
+(dp381
+Va
+I91
+sVA
+I18
+sVâ
+I1
+sVE
+I20
+sVi
+I16
+sVh
+I27
+sVê
+I30
+sVo
+I21
+sVÉ
+I1
+sVé
+I26
+sVs
+I1
+sVu
+I109
+sVO
+I3
+sVy
+I2
+sVe
+I53
+sVU
+I1
+sVI
+I3
+ssVés
+p382
+(dp383
+Va
+I8
+sV
+I81
+sVe
+I47
+sVi
+I13
+sVh
+I2
+sV,
+I37
+sVo
+I11
+sV.
+I11
+sVu
+I36
+sV;
+I5
+sV?
+I3
+ssVér
+p384
+(dp385
+Va
+I48
+sVe
+I31
+sVé
+I15
+sVê
+I2
+sVo
+I15
+sVi
+I75
+sVu
+I1
+ssVéu
+p386
+(dp387
+Vs
+I1
+sVo
+I1
+ssVét
+p388
+(dp389
+Va
+I276
+sVe
+I34
+sVé
+I80
+sVh
+I1
+sVo
+I21
+sVi
+I34
+sVr
+I51
+sVu
+I5
+ssVd
+p390
+(dp391
+VC
+I1
+sVB
+I4
+sVE
+I2
+sVI
+I3
+sVJ
+I1
+sVM
+I1
+sVP
+I3
+sVS
+I2
+sVW
+I1
+sVV
+I1
+sV[
+I1
+sV_
+I1
+sVa
+I22
+sVà
+I4
+sVc
+I9
+sVb
+I20
+sVe
+I13
+sVd
+I24
+sVg
+I2
+sVf
+I9
+sVi
+I26
+sVh
+I7
+sVj
+I10
+sVm
+I15
+sVl
+I16
+sVo
+I29
+sVn
+I5
+sVq
+I5
+sVp
+I26
+sVs
+I14
+sVr
+I7
+sVu
+I6
+sVt
+I16
+sVw
+I4
+sVv
+I6
+sVy
+I8
+ssVév
+p392
+(dp393
+Va
+I4
+sVe
+I6
+sVé
+I20
+sVè
+I1
+sVo
+I15
+sVi
+I2
+sVu
+I1
+ssVéi
+p394
+(dp395
+Vs
+I1
+sVm
+I1
+sVt
+I3
+sVd
+I1
+ssVd?
+p396
+(dp397
+V
+I2
+ssVéj
+p398
+(dp399
+Và
+I17
+sVe
+I4
+sVo
+I3
+ssVd:
+p400
+(dp401
+V
+I2
+ssVél
+p402
+(dp403
+Va
+I36
+sVe
+I13
+sVi
+I21
+sVè
+I3
+sVo
+I4
+sVé
+I3
+sVu
+I1
+ssVéo
+p404
+(dp405
+Vd
+I3
+sVl
+I6
+sVt
+I1
+ssVén
+p406
+(dp407
+Va
+I7
+sVe
+I5
+sVi
+I16
+sVè
+I1
+sVo
+I15
+sVé
+I16
+sVu
+I1
+ssVéa
+p408
+(dp409
+Vt
+I16
+sVb
+I9
+sVu
+I2
+sVl
+I3
+sVn
+I3
+ssVéc
+p410
+(dp411
+Va
+I2
+sVe
+I20
+sVi
+I28
+sVh
+I19
+sVl
+I9
+sVo
+I27
+sVr
+I37
+sVu
+I22
+ssVéb
+p412
+(dp413
+Va
+I8
+sVi
+I1
+sVr
+I4
+ssVée
+p414
+(dp415
+V
+I106
+sV,
+I28
+sV.
+I16
+sVs
+I57
+sVn
+I6
+sV;
+I9
+sV:
+I3
+sV[
+I1
+sV?
+I2
+ssVéd
+p416
+(dp417
+Va
+I2
+sVe
+I12
+sVi
+I47
+sVé
+I6
+sVr
+I2
+sVu
+I8
+ssVég
+p418
+(dp419
+Va
+I8
+sVe
+I1
+sVi
+I4
+sVè
+I4
+sVl
+I3
+sVo
+I140
+sVn
+I2
+sVé
+I1
+sVr
+I2
+sVu
+I2
+sVy
+I1
+ssVéf
+p420
+(dp421
+Va
+I5
+sVe
+I5
+sVi
+I4
+sVl
+I4
+sVé
+I3
+sVr
+I1
+sVu
+I3
+ssVé[
+p422
+(dp423
+V1
+I1
+ssVé_
+p424
+(dp425
+V,
+I3
+ssVdn
+p426
+(dp427
+Vi
+I2
+ssVdo
+p428
+(dp429
+V
+I13
+sVc
+I16
+sVe
+I1
+sVg
+I2
+sVi
+I14
+sVm
+I13
+sV,
+I11
+sVn
+I203
+sVs
+I5
+sVr
+I37
+sVu
+I64
+sVw
+I4
+sV[
+I2
+sV.
+I5
+sV_
+I1
+sVl
+I9
+ssVé;
+p430
+(dp431
+V
+I17
+ssVé:
+p432
+(dp433
+V
+I8
+ssVdj
+p434
+(dp435
+Vu
+I1
+ssVé?
+p436
+(dp437
+V
+I8
+ssVdi
+p438
+(dp439
+V
+I3
+sV,
+I1
+sV1
+I8
+sVa
+I43
+sVc
+I13
+sVe
+I34
+sVd
+I393
+sVg
+I13
+sVf
+I13
+sVé
+I1
+sVè
+I2
+sVk
+I1
+sVm
+I3
+sVl
+I3
+sVo
+I2
+sVn
+I41
+sVq
+I6
+sVp
+I1
+sVs
+I151
+sVr
+I50
+sVu
+I5
+sVt
+I434
+sVv
+I5
+sVx
+I25
+ssVdd
+p440
+(dp441
+Vi
+I8
+sVe
+I1
+ssVde
+p442
+(dp443
+V!
+I12
+sV
+I1745
+sV-
+I1
+sV,
+I177
+sV.
+I85
+sV;
+I49
+sV:
+I18
+sV?
+I7
+sVM
+I1
+sV_
+I8
+sVa
+I11
+sVc
+I9
+sVb
+I1
+sVd
+I11
+sVg
+I1
+sVf
+I1
+sVm
+I130
+sVl
+I8
+sVn
+I34
+sVp
+I9
+sVs
+I430
+sVr
+I84
+sVu
+I155
+sVt
+I1
+sVv
+I40
+sVy
+I3
+sVx
+I1
+sVz
+I9
+ssVdb
+p444
+(dp445
+Ve
+I1
+ssVda
+p446
+(dp447
+V
+I25
+sVb
+I6
+sVd
+I1
+sVg
+I1
+sVi
+I54
+sV-
+I9
+sVj
+I2
+sVm
+I46
+sVl
+I10
+sVn
+I401
+sVy
+I5
+sVs
+I2
+sVr
+I1
+sVt
+I33
+sVv
+I9
+sV[
+I1
+sV;
+I3
+sV:
+I1
+sV,
+I3
+sV_
+I1
+ssVé,
+p448
+(dp449
+V
+I78
+ssVé.
+p450
+(dp451
+V
+I31
+sV-
+I2
+ssVdv
+p452
+(dp453
+Vi
+I4
+sVa
+I1
+sVe
+I1
+ssVé
+p454
+(dp455
+Vp
+I47
+sVC
+I4
+sVM
+I1
+sVR
+I2
+sVU
+I1
+sV_
+I2
+sVa
+I27
+sVà
+I27
+sVc
+I17
+sVb
+I5
+sVe
+I29
+sVd
+I124
+sVg
+I2
+sVf
+I7
+sVi
+I6
+sVh
+I2
+sVj
+I4
+sVm
+I14
+sVl
+I32
+sVo
+I2
+sVn
+I8
+sVq
+I23
+sVé
+I5
+sVs
+I15
+sVr
+I5
+sVu
+I9
+sVt
+I11
+sVv
+I6
+ssVdu
+p456
+(dp457
+V!
+I1
+sV
+I315
+sVc
+I14
+sVe
+I11
+sVi
+I30
+sVm
+I1
+sVl
+I1
+sV,
+I8
+sVq
+I1
+sVs
+I2
+sVr
+I12
+sVt
+I1
+sVv
+I1
+sV_
+I1
+sV?
+I1
+ssVdr
+p458
+(dp459
+Va
+I31
+sVi
+I9
+sVe
+I108
+sVô
+I2
+sVo
+I24
+ssVds
+p460
+(dp461
+V
+I42
+sV;
+I1
+sV-
+I1
+sV,
+I11
+sV.
+I4
+ssVd_
+p462
+(dp463
+V,
+I2
+sV.
+I1
+ssVd[
+p464
+(dp465
+V3
+I1
+ssVw
+p466
+(dp467
+VA
+I1
+sVb
+I1
+sVd
+I1
+sVi
+I1
+sVJ
+I1
+sVM
+I1
+sVL
+I2
+sVo
+I1
+sVN
+I2
+sVy
+I1
+sVt
+I9
+sVY
+I1
+ssVw.
+p468
+(dp469
+Vi
+I1
+sV
+I2
+sVg
+I2
+ssVw,
+p470
+(dp471
+V
+I3
+ssVéé
+p472
+(dp473
+Vt
+I2
+ssVéâ
+p474
+(dp475
+Vt
+I4
+ssV93
+p476
+(dp477
+V,
+I1
+ssVw:
+p478
+(dp479
+V
+I1
+sV/
+I2
+ssV02
+p480
+(dp481
+V
+I3
+sV*
+I1
+sV]
+I1
+sV,
+I3
+sV/
+I1
+ssV03
+p482
+(dp483
+V
+I4
+sV,
+I1
+ssV00
+p484
+(dp485
+V
+I13
+sV+
+I1
+sV,
+I1
+sV1
+I4
+sV0
+I11
+sV3
+I2
+sV2
+I5
+sV4
+I1
+ssV01
+p486
+(dp487
+V(
+I2
+sV,
+I1
+sV
+I4
+ssV06
+p488
+(dp489
+V.
+I1
+ssV04
+p490
+(dp491
+V
+I1
+ssV05
+p492
+(dp493
+V,
+I1
+ssV0;
+p494
+(dp495
+V
+I3
+ssV09
+p496
+(dp497
+V
+I1
+sV,
+I1
+ssV0
+p498
+(dp499
+Va
+I1
+sV
+I11
+sVe
+I1
+sVD
+I1
+sVj
+I1
+sVm
+I2
+sVn
+I1
+sVs
+I2
+sVd
+I3
+ssV0%
+p500
+(dp501
+V
+I1
+ssV0+
+p502
+(dp503
+V
+I1
+ssV0.
+p504
+(dp505
+V
+I2
+sVz
+I2
+sVt
+I2
+ssV0,
+p506
+(dp507
+V
+I4
+ssVdî
+p508
+(dp509
+Vt
+I2
+sVn
+I11
+ssVwe
+p510
+(dp511
+V
+I12
+sVr
+I3
+sVv
+I1
+ssVdè
+p512
+(dp513
+Vs
+I7
+sVr
+I3
+sVl
+I6
+ssVdé
+p514
+(dp515
+V
+I15
+sVc
+I23
+sVb
+I9
+sVe
+I14
+sVd
+I4
+sVg
+I10
+sVf
+I12
+sVj
+I21
+sVm
+I18
+sVl
+I17
+sVn
+I1
+sVp
+I15
+sVs
+I31
+sVr
+I6
+sVt
+I29
+sVv
+I10
+sV.
+I1
+ssVwo
+p516
+(dp517
+V
+I1
+sVr
+I14
+sVu
+I2
+ssVwn
+p518
+(dp519
+Vs
+I1
+sVl
+I3
+ssVwi
+p520
+(dp521
+Vc
+I1
+sVl
+I7
+sVn
+I3
+sVs
+I3
+sVr
+I1
+sVt
+I20
+ssVwh
+p522
+(dp523
+Va
+I2
+sVi
+I3
+sVe
+I4
+sVo
+I3
+ssVww
+p524
+(dp525
+V:
+I2
+sVw
+I5
+sV.
+I3
+ssVwt
+p526
+(dp527
+Vo
+I1
+ssVws
+p528
+(dp529
+V
+I2
+sVl
+I3
+sV,
+I1
+ssVwr
+p530
+(dp531
+Vi
+I2
+sVo
+I2
+ssVwy
+p532
+(dp533
+Ve
+I1
+ssV0a
+p534
+(dp535
+V.
+I2
+ssVié
+p536
+(dp537
+V
+I16
+sVe
+I2
+sVg
+I2
+sV,
+I2
+sV.
+I2
+sVs
+I1
+sVt
+I7
+sV;
+I2
+sV:
+I1
+ssViè
+p538
+(dp539
+Vc
+I27
+sVr
+I87
+sVm
+I25
+sVg
+I3
+ssViâ
+p540
+(dp541
+Vt
+I2
+ssVC)
+p542
+(dp543
+V
+I1
+ssVC.
+p544
+(dp545
+V
+I1
+ssVC
+p546
+(dp547
+Vo
+I1
+sVL
+I1
+sVD
+I2
+sVd
+I1
+ssVC'
+p548
+(dp549
+Vé
+I3
+sVe
+I33
+ssVCI
+p550
+(dp551
+VI
+I2
+sVD
+I1
+ssVCH
+p552
+(dp553
+VA
+I31
+sV
+I2
+sVE
+I2
+sVO
+I2
+ssVCO
+p554
+(dp555
+VB
+I1
+sVN
+I2
+ssVCL
+p556
+(dp557
+VA
+I1
+sVU
+I2
+ssVCC
+p558
+(dp559
+VX
+I1
+sVC
+I1
+ssVVÉ
+p560
+(dp561
+VE
+I1
+ssVCA
+p562
+(dp563
+VN
+I4
+ssVCE
+p564
+(dp565
+V
+I3
+sVS
+I1
+ssVCD
+p566
+(dp567
+VI
+I2
+ssVCX
+p568
+(dp569
+VX
+I1
+ssVCR
+p570
+(dp571
+V.
+I1
+ssVCU
+p572
+(dp573
+VL
+I1
+ssVCT
+p574
+(dp575
+V
+I9
+sVE
+I2
+sV,
+I2
+ssVCi
+p576
+(dp577
+Vc
+I1
+sVn
+I2
+ssVCh
+p578
+(dp579
+Va
+I13
+sVà
+I1
+sVe
+I2
+sVi
+I4
+sVo
+I1
+sVr
+I1
+ssVCo
+p580
+(dp581
+Vm
+I28
+sVl
+I4
+sVï
+I1
+sVn
+I20
+sVp
+I1
+sVr
+I6
+sVu
+I1
+ssVCl
+p582
+(dp583
+Va
+I2
+sVu
+I1
+sVo
+I1
+ssVVé
+p584
+(dp585
+Vn
+I3
+ssVCa
+p586
+(dp587
+Vc
+I85
+sVe
+I1
+sVd
+I7
+sVm
+I2
+sVl
+I1
+sVn
+I396
+sVs
+I1
+sVr
+I8
+sVt
+I2
+sVy
+I3
+ssVCe
+p588
+(dp589
+V
+I44
+sVc
+I1
+sVl
+I13
+sVn
+I1
+sVp
+I8
+sVs
+I3
+sVr
+I2
+sVu
+I1
+sVt
+I11
+ssVCr
+p590
+(dp591
+Vé
+I1
+sVo
+I6
+ssVCu
+p592
+(dp593
+Vn
+I125
+ssVix
+p594
+(dp595
+Va
+I7
+sV
+I52
+sVe
+I1
+sVi
+I4
+sV-
+I2
+sV,
+I6
+sV.
+I7
+sV;
+I2
+sV:
+I1
+ssViz
+p596
+(dp597
+Va
+I7
+sVi
+I4
+sVe
+I2
+sVo
+I1
+ssViq
+p598
+(dp599
+Vu
+I115
+ssVip
+p600
+(dp601
+Va
+I3
+sVe
+I8
+sVp
+I1
+sVi
+I8
+sV*
+I2
+sVm
+I2
+sVl
+I2
+sVo
+I9
+sVé
+I1
+sVs
+I1
+sVt
+I3
+ssVis
+p602
+(dp603
+V!
+I1
+sV
+I672
+sVp
+I22
+sV-
+I8
+sV,
+I101
+sV.
+I26
+sV;
+I15
+sV:
+I4
+sV?
+I6
+sV_
+I2
+sVa
+I80
+sVc
+I32
+sVb
+I11
+sVe
+I169
+sVf
+I3
+sVi
+I110
+sVè
+I7
+sVk
+I4
+sVm
+I7
+sVl
+I1
+sVo
+I73
+sVq
+I10
+sVé
+I23
+sVs
+I170
+sVt
+I89
+sVh
+I4
+ssVir
+p604
+(dp605
+Va
+I53
+sV
+I183
+sVc
+I3
+sVâ
+I1
+sVe
+I329
+sVg
+I3
+sVé
+I9
+sVè
+I1
+sVm
+I3
+sV,
+I25
+sVo
+I21
+sV.
+I13
+sVi
+I14
+sVs
+I18
+sVu
+I7
+sVt
+I1
+sV;
+I3
+sV?
+I4
+ssViu
+p606
+(dp607
+Vs
+I6
+sVm
+I6
+ssVit
+p608
+(dp609
+V!
+I1
+sV
+I1361
+sV-
+I61
+sV,
+I64
+sV.
+I28
+sV;
+I18
+sV:
+I34
+sVô
+I15
+sV[
+I1
+sV_
+I1
+sVa
+I59
+sVâ
+I1
+sVe
+I203
+sVi
+I70
+sVh
+I23
+sVl
+I2
+sVo
+I8
+sVé
+I75
+sVs
+I35
+sVr
+I31
+sVu
+I22
+sVt
+I11
+sVy
+I5
+sVz
+I2
+ssViv
+p610
+(dp611
+Va
+I41
+sVâ
+I1
+sVe
+I72
+sVi
+I25
+sVè
+I3
+sVo
+I3
+sVé
+I16
+sVr
+I38
+ssVii
+p612
+(dp613
+V,
+I1
+ssVik
+p614
+(dp615
+Ve
+I2
+sVd
+I1
+ssVij
+p616
+(dp617
+Vo
+I1
+ssVim
+p618
+(dp619
+Va
+I36
+sV
+I7
+sVb
+I1
+sVe
+I61
+sVi
+I15
+sVé
+I7
+sVm
+I5
+sV,
+I1
+sVo
+I1
+sV.
+I1
+sVp
+I34
+sVs
+I2
+sVu
+I1
+ssVil
+p620
+(dp621
+Va
+I7
+sV
+I530
+sVe
+I53
+sVd
+I1
+sVà
+I24
+sVi
+I26
+sVh
+I1
+sVl
+I382
+sVo
+I26
+sV.
+I7
+sVé
+I1
+sVs
+I134
+sVu
+I2
+sVt
+I3
+sVè
+I3
+sVy
+I1
+sV;
+I3
+sV:
+I1
+sV,
+I42
+ssVio
+p622
+(dp623
+Vc
+I1
+sVd
+I1
+sVm
+I1
+sVl
+I14
+sVn
+I278
+sVs
+I8
+sVr
+I2
+sVu
+I3
+sVt
+I4
+sVv
+I1
+sV.
+I2
+sV,
+I1
+ssVin
+p624
+(dp625
+V!
+I5
+sV
+I206
+sV"
+I1
+sV-
+I6
+sV,
+I72
+sV.
+I48
+sV;
+I21
+sV:
+I8
+sV?
+I1
+sVç
+I1
+sV[
+I1
+sVa
+I49
+sVc
+I66
+sVe
+I146
+sVd
+I27
+sVg
+I108
+sVf
+I34
+sVé
+I13
+sVh
+I1
+sVk
+I1
+sVj
+I4
+sVo
+I20
+sVn
+I11
+sVq
+I57
+sVi
+I18
+sVs
+I117
+sVr
+I4
+sVu
+I23
+sVt
+I140
+sVv
+I6
+sVz
+I9
+ssVia
+p626
+(dp627
+V
+I17
+sVc
+I4
+sVb
+I16
+sVd
+I1
+sVg
+I4
+sVi
+I13
+sV-
+I3
+sVm
+I29
+sVl
+I18
+sV,
+I7
+sVs
+I18
+sV:
+I1
+sVt
+I3
+sVh
+I1
+sV;
+I1
+sVn
+I12
+ssV_p
+p628
+(dp629
+Va
+I1
+ssVic
+p630
+(dp631
+Va
+I28
+sV
+I8
+sV)
+I1
+sVe
+I41
+sVi
+I68
+sVh
+I33
+sVk
+I2
+sVl
+I2
+sVo
+I6
+sV.
+I1
+sVé
+I2
+sVs
+I2
+sVu
+I15
+sVt
+I7
+sV,
+I1
+ssVib
+p632
+(dp633
+Va
+I1
+sVe
+I11
+sVi
+I6
+sVl
+I64
+sVn
+I2
+sVé
+I1
+sVr
+I12
+sVu
+I16
+ssVie
+p634
+(dp635
+V!
+I2
+sV
+I121
+sV,
+I50
+sV.
+I27
+sV;
+I10
+sV:
+I2
+sV?
+I5
+sV[
+I5
+sV_
+I1
+sVd
+I28
+sVf
+I1
+sVi
+I71
+sVm
+I4
+sVl
+I14
+sVn
+I505
+sVp
+I4
+sVs
+I46
+sVr
+I133
+sVu
+I198
+sVt
+I3
+sVw
+I1
+sVz
+I29
+ssVid
+p636
+(dp637
+Va
+I6
+sV
+I9
+sVe
+I449
+sVé
+I21
+sVè
+I6
+sV,
+I1
+sVo
+I1
+sVn
+I2
+sVi
+I10
+sVr
+I1
+sVy
+I1
+ssVig
+p638
+(dp639
+Va
+I6
+sVe
+I10
+sVé
+I9
+sVh
+I17
+sVo
+I17
+sVn
+I79
+sVi
+I16
+sVr
+I4
+sVu
+I17
+sVt
+I5
+ssVif
+p640
+(dp641
+V
+I21
+sVe
+I1
+sVf
+I14
+sVi
+I20
+sV,
+I6
+sV.
+I3
+sVé
+I1
+sVs
+I6
+sVr
+I1
+sVt
+I1
+sVy
+I3
+ssVV
+p642
+(dp643
+Vp
+I1
+sV:
+I1
+sVd
+I2
+ssVn:
+p644
+(dp645
+V
+I18
+ssVi[
+p646
+(dp647
+V1
+I2
+sV4
+I1
+ssV"A
+p648
+(dp649
+VS
+I1
+ssVi_
+p650
+(dp651
+V,
+I1
+ssVV,
+p652
+(dp653
+V
+I1
+ssVV.
+p654
+(dp655
+V
+I7
+ssV"P
+p656
+(dp657
+VR
+I3
+sVr
+I3
+ssV"R
+p658
+(dp659
+Vi
+I1
+ssV"S
+p660
+(dp661
+Vm
+I5
+ssVV:
+p662
+(dp663
+V
+I1
+ssVbî
+p664
+(dp665
+Vm
+I4
+ssVV?
+p666
+(dp667
+V
+I1
+ssVi8
+p668
+(dp669
+V.
+I1
+ssVi;
+p670
+(dp671
+V
+I14
+ssVi:
+p672
+(dp673
+V
+I2
+ssV"
+p674
+(dp675
+Va
+I2
+sVs
+I5
+sVt
+I2
+sVw
+I1
+sVd
+I1
+ssVVE
+p676
+(dp677
+V
+I4
+sVC
+I1
+sVR
+I3
+sVN
+I2
+ssVi?
+p678
+(dp679
+V
+I11
+ssVi1
+p680
+(dp681
+V1
+I2
+sV0
+I6
+ssVVI
+p682
+(dp683
+V
+I1
+sVD
+I1
+sVI
+I20
+sV,
+I3
+sV.
+I3
+sV;
+I1
+ssV".
+p684
+(dp685
+V
+I2
+ssV")
+p686
+(dp687
+V.
+I1
+ssVVO
+p688
+(dp689
+VL
+I2
+ssVVR
+p690
+(dp691
+VE
+I3
+ssVi-
+p692
+(dp693
+Vc
+I4
+sVe
+I1
+sVh
+I1
+sVj
+I4
+sVm
+I13
+sVl
+I2
+ssVi,
+p694
+(dp695
+V
+I132
+ssVi.
+p696
+(dp697
+V
+I26
+sV-
+I1
+ssVi!
+p698
+(dp699
+V
+I17
+sV_
+I2
+ssVi
+p700
+(dp701
+Vê
+I6
+sVi
+I10
+sV.
+I1
+sV1
+I1
+sVÉ
+I1
+sVA
+I1
+sVC
+I8
+sVD
+I2
+sVI
+I2
+sVM
+I2
+sVL
+I1
+sVN
+I1
+sVP
+I1
+sVT
+I1
+sVV
+I1
+sVa
+I86
+sVà
+I19
+sVc
+I43
+sVb
+I23
+sVe
+I51
+sVd
+I166
+sVg
+I11
+sVf
+I50
+sVé
+I43
+sVh
+I4
+sVj
+I30
+sVm
+I43
+sVl
+I82
+sVo
+I13
+sVn
+I53
+sVq
+I29
+sVp
+I81
+sVs
+I46
+sVr
+I42
+sVu
+I16
+sVt
+I34
+sVv
+I52
+sVy
+I1
+ssVV_
+p702
+(dp703
+V;
+I5
+sV,
+I1
+sV.
+I5
+ssVVa
+p704
+(dp705
+Vl
+I2
+sVn
+I5
+ssVCé
+p706
+(dp707
+Vs
+I3
+ssVVe
+p708
+(dp709
+Vs
+I11
+sVr
+I2
+sVn
+I32
+ssVVi
+p710
+(dp711
+Vs
+I3
+sVr
+I3
+sVe
+I1
+sVt
+I1
+sVn
+I1
+ssVVo
+p712
+(dp713
+Vy
+I17
+sVi
+I10
+sVu
+I39
+sVl
+I30
+sVt
+I6
+ssV5]
+p714
+(dp715
+V
+I2
+sV;
+I1
+sV,
+I1
+ssVt-
+p716
+(dp717
+Và
+I5
+sVc
+I16
+sVe
+I19
+sVG
+I1
+sVi
+I82
+sVH
+I1
+sVê
+I9
+sVM
+I2
+sVS
+I1
+sVo
+I7
+sVn
+I1
+sVq
+I3
+sVP
+I1
+sVs
+I1
+sVl
+I1
+ssVt*
+p718
+(dp719
+V
+I1
+sV*
+I1
+ssV°
+p720
+(dp721
+V2
+I2
+sV6
+I1
+ssVHé
+p722
+(dp723
+Vb
+I1
+sVl
+I19
+ssV°.
+p724
+(dp725
+V
+I1
+ssV59
+p726
+(dp727
+V
+I2
+sV4
+I2
+sV:
+I1
+sV,
+I3
+sV.
+I1
+ssV55
+p728
+(dp729
+V-
+I1
+sV.
+I1
+ssV54
+p730
+(dp731
+V1
+I1
+sV.
+I1
+ssV57
+p732
+(dp733
+V:
+I2
+ssV56
+p734
+(dp735
+V
+I1
+sV;
+I1
+sV,
+I2
+ssV50
+p736
+(dp737
+V1
+I2
+sV0
+I2
+sV]
+I1
+sV
+I2
+ssV52
+p738
+(dp739
+V8
+I1
+sV.
+I1
+ssV5-
+p740
+(dp741
+V4
+I1
+ssV5,
+p742
+(dp743
+V
+I3
+ssV5.
+p744
+(dp745
+V
+I4
+ssV5)
+p746
+(dp747
+V:
+I1
+sV,
+I1
+ssV5
+p748
+(dp749
+Vj
+I1
+ssVHI
+p750
+(dp751
+VS
+I2
+sVN
+I1
+ssVHO
+p752
+(dp753
+VT
+I2
+ssVHA
+p754
+(dp755
+VP
+I30
+sVN
+I1
+sVM
+I1
+sVT
+I1
+sVV
+I2
+ssVHE
+p756
+(dp757
+V
+I5
+sVR
+I3
+sVZ
+I1
+ssVe[
+p758
+(dp759
+Va
+I1
+sV1
+I3
+sV3
+I2
+sV2
+I2
+sV5
+I1
+sV7
+I1
+sV6
+I2
+sV9
+I1
+sV8
+I1
+ssVHi
+p760
+(dp761
+Vs
+I5
+sVd
+I2
+ssVHo
+p762
+(dp763
+Vr
+I4
+sVm
+I3
+sVl
+I5
+sVn
+I2
+ssVHa
+p764
+(dp765
+Vy
+I1
+sVr
+I7
+sVm
+I1
+sVw
+I1
+ssVHe
+p766
+(dp767
+Vr
+I1
+sVn
+I6
+ssV-4
+p768
+(dp769
+V1
+I1
+ssVm"
+p770
+(dp771
+V
+I1
+ssVH,
+p772
+(dp773
+V
+I1
+ssVH
+p774
+(dp775
+VD
+I1
+sVO
+I1
+ssV[P
+p776
+(dp777
+Vr
+I1
+sVo
+I1
+ssV[T
+p778
+(dp779
+Vh
+I1
+ssV[Y
+p780
+(dp781
+Ve
+I1
+ssV[E
+p782
+(dp783
+Vm
+I2
+sVt
+I1
+ssV_c
+p784
+(dp785
+Vo
+I1
+ssVnè
+p786
+(dp787
+Vq
+I1
+sVs
+I3
+sVr
+I5
+sVg
+I8
+ssVné
+p788
+(dp789
+Va
+I3
+sV
+I52
+sVc
+I9
+sVe
+I48
+sVd
+I1
+sVg
+I126
+sVi
+I1
+sVm
+I3
+sV,
+I4
+sV.
+I2
+sVs
+I24
+sVr
+I12
+sV;
+I1
+ssVnê
+p790
+(dp791
+Vt
+I17
+ssVnâ
+p792
+(dp793
+Vt
+I1
+ssVnç
+p794
+(dp795
+Va
+I21
+sVu
+I2
+sVo
+I7
+ssV[a
+p796
+(dp797
+V]
+I2
+ssVnô
+p798
+(dp799
+Vt
+I3
+ssV'ç
+p800
+(dp801
+Vn
+I1
+ssV'â
+p802
+(dp803
+Vm
+I5
+sVg
+I4
+ssV'à
+p804
+(dp805
+V
+I20
+ssV'ê
+p806
+(dp807
+Vt
+I38
+ssV'é
+p808
+(dp809
+Vc
+I33
+sVd
+I3
+sVg
+I4
+sVm
+I3
+sVl
+I7
+sVn
+I1
+sVq
+I1
+sVp
+I20
+sVt
+I99
+sVv
+I5
+ssV[3
+p810
+(dp811
+V]
+I10
+ssV[2
+p812
+(dp813
+V]
+I21
+ssV[1
+p814
+(dp815
+V1
+I2
+sV0
+I2
+sV2
+I2
+sV]
+I49
+ssV[7
+p816
+(dp817
+V]
+I2
+ssV[6
+p818
+(dp819
+V]
+I4
+ssV[5
+p820
+(dp821
+V]
+I4
+ssV[4
+p822
+(dp823
+V]
+I6
+ssV[9
+p824
+(dp825
+V]
+I2
+ssV[8
+p826
+(dp827
+V]
+I2
+ssV[*
+p828
+(dp829
+V]
+I3
+ssV'É
+p830
+(dp831
+VP
+I1
+sVd
+I2
+sVg
+I1
+ssVn[
+p832
+(dp833
+V1
+I2
+sV2
+I3
+ssVn_
+p834
+(dp835
+V;
+I1
+sV,
+I1
+ssVnh
+p836
+(dp837
+Va
+I1
+sVu
+I1
+sVe
+I8
+ssVni
+p838
+(dp839
+V!
+I3
+sV
+I46
+sV,
+I3
+sVa
+I6
+sVc
+I10
+sVb
+I1
+sVe
+I44
+sVg
+I3
+sVf
+I8
+sVé
+I2
+sVè
+I13
+sVm
+I4
+sVl
+I2
+sVo
+I1
+sVn
+I5
+sVq
+I1
+sVs
+I46
+sVr
+I26
+sVu
+I2
+sVt
+I20
+sVv
+I11
+sVz
+I3
+ssVnj
+p840
+(dp841
+Vu
+I4
+sVo
+I1
+ssVnk
+p842
+(dp843
+V
+I1
+sVs
+I1
+ssVnl
+p844
+(dp845
+Va
+I1
+sVy
+I5
+sVe
+I6
+sVi
+I1
+sVo
+I3
+ssVnn
+p846
+(dp847
+Va
+I78
+sVâ
+I1
+sVe
+I204
+sVi
+I9
+sVè
+I4
+sVê
+I13
+sVo
+I17
+sVé
+I48
+sVs
+I1
+sVu
+I19
+ssVno
+p848
+(dp849
+V
+I5
+sVc
+I11
+sVb
+I8
+sVe
+I1
+sVi
+I17
+sVm
+I33
+sVl
+I17
+sVn
+I40
+sVp
+I14
+sVs
+I33
+sVr
+I14
+sVu
+I206
+sVt
+I59
+sVw
+I8
+sVv
+I4
+sVy
+I5
+sVx
+I2
+sV,
+I1
+ssVna
+p850
+(dp851
+Vn
+I32
+sV
+I48
+sV,
+I10
+sV;
+I1
+sV:
+I1
+sVç
+I1
+sVc
+I5
+sVb
+I22
+sVd
+I6
+sVg
+I14
+sVi
+I101
+sVm
+I11
+sVl
+I21
+sVï
+I2
+sVî
+I10
+sVp
+I5
+sVs
+I3
+sVr
+I9
+sVu
+I5
+sVt
+I61
+sVv
+I11
+sVy
+I1
+ssVnb
+p852
+(dp853
+Ve
+I31
+ssVnc
+p854
+(dp855
+Va
+I3
+sV
+I28
+sVe
+I151
+sV!
+I1
+sVé
+I8
+sVh
+I21
+sVk
+I11
+sVl
+I17
+sVo
+I82
+sV,
+I6
+sVi
+I25
+sVs
+I5
+sVr
+I3
+sVu
+I3
+sVt
+I3
+sVè
+I6
+sVy
+I3
+ssVnd
+p856
+(dp857
+Va
+I124
+sV
+I209
+sV"
+I1
+sVe
+I278
+sVi
+I493
+sV-
+I14
+sV,
+I10
+sVo
+I22
+sV.
+I4
+sVé
+I8
+sVs
+I35
+sVr
+I101
+sVu
+I54
+sV_
+I1
+sV;
+I2
+sVî
+I1
+sV?
+I1
+sVl
+I1
+ssVne
+p858
+(dp859
+V
+I743
+sV-
+I4
+sV,
+I42
+sV.
+I19
+sV;
+I9
+sV:
+I4
+sV?
+I3
+sV[
+I1
+sVc
+I1
+sVb
+I1
+sVe
+I4
+sVi
+I5
+sVm
+I25
+sVl
+I14
+sVn
+I22
+sVs
+I80
+sVr
+I105
+sVu
+I60
+sVt
+I22
+sVw
+I7
+sVv
+I3
+sVy
+I6
+sVx
+I3
+sVz
+I25
+ssVnf
+p860
+(dp861
+Va
+I20
+sVe
+I12
+sVi
+I52
+sVl
+I2
+sVo
+I30
+sV.
+I2
+sVr
+I2
+sVu
+I8
+ssVng
+p862
+(dp863
+Va
+I8
+sV
+I64
+sVe
+I109
+sVi
+I1
+sVè
+I1
+sV-
+I12
+sVl
+I122
+sVo
+I1
+sV.
+I4
+sVé
+I18
+sVs
+I4
+sVr
+I3
+sVu
+I30
+sVt
+I28
+sV[
+I1
+sV:
+I1
+sV,
+I4
+ssVnx
+p864
+(dp865
+V
+I1
+ssVny
+p866
+(dp867
+V)
+I2
+sV
+I17
+sVs
+I1
+sVo
+I1
+ssVnz
+p868
+(dp869
+Va
+I2
+sVi
+I1
+sVe
+I10
+ssVnq
+p870
+(dp871
+V
+I13
+sVu
+I64
+ssVnr
+p872
+(dp873
+Vé
+I1
+sVa
+I2
+sVe
+I5
+sVi
+I6
+ssVns
+p874
+(dp875
+V
+I690
+sVi
+I91
+sV)
+I1
+sV-
+I17
+sV,
+I68
+sV.
+I27
+sV;
+I8
+sV:
+I1
+sV?
+I1
+sV[
+I2
+sV_
+I1
+sVa
+I5
+sVc
+I3
+sVe
+I74
+sVf
+I1
+sVé
+I8
+sVk
+I1
+sVo
+I13
+sVp
+I11
+sVs
+I1
+sVu
+I22
+sVt
+I31
+sVw
+I2
+sVy
+I4
+ssVnt
+p876
+(dp877
+V!
+I11
+sV
+I1213
+sV"
+I1
+sV*
+I1
+sV-
+I12
+sV,
+I115
+sV.
+I53
+sV;
+I32
+sV:
+I8
+sV?
+I2
+sV[
+I1
+sVa
+I70
+sVe
+I207
+sVi
+I108
+sVè
+I4
+sVl
+I2
+sVo
+I14
+sVé
+I26
+sVs
+I127
+sVr
+I116
+sVu
+I25
+sVô
+I21
+sVh
+I6
+ssVnu
+p878
+(dp879
+Va
+I11
+sV
+I18
+sVe
+I21
+sVf
+I1
+sVi
+I12
+sVè
+I1
+sVm
+I4
+sVl
+I5
+sVo
+I1
+sV.
+I2
+sVq
+I6
+sVs
+I14
+sVt
+I3
+sVy
+I4
+sV;
+I1
+sV,
+I2
+ssVnv
+p880
+(dp881
+Vi
+I27
+sVa
+I3
+sVe
+I22
+sVu
+I4
+sVo
+I16
+ssV'u
+p882
+(dp883
+Và
+I1
+sVs
+I6
+sVt
+I2
+sVn
+I156
+ssV't
+p884
+(dp885
+V
+I4
+ssV's
+p886
+(dp887
+V
+I4
+ssV'y
+p888
+(dp889
+V
+I53
+ssV'e
+p890
+(dp891
+Va
+I5
+sVf
+I7
+sVm
+I30
+sVl
+I32
+sVn
+I120
+sVs
+I162
+sVu
+I8
+sVx
+I23
+sVû
+I1
+ssV'd
+p892
+(dp893
+Vé
+I1
+ssV'a
+p894
+(dp895
+V
+I33
+sVc
+I14
+sVb
+I37
+sVd
+I6
+sVg
+I6
+sVi
+I140
+sVm
+I20
+sVl
+I13
+sVn
+I18
+sVp
+I41
+sVs
+I11
+sVr
+I24
+sVu
+I79
+sVt
+I16
+sVv
+I112
+sVy
+I9
+ssV'o
+p896
+(dp897
+Vb
+I3
+sVe
+I7
+sVf
+I2
+sVn
+I93
+sVp
+I8
+sVs
+I6
+sVr
+I27
+sVu
+I10
+ssV'i
+p898
+(dp899
+Vc
+I3
+sVd
+I3
+sVg
+I1
+sVm
+I12
+sVl
+I187
+sVn
+I45
+sVr
+I1
+sVv
+I1
+ssV'h
+p900
+(dp901
+Va
+I6
+sVe
+I2
+sVé
+I2
+sVo
+I31
+sVi
+I3
+sVu
+I10
+sVô
+I10
+sVy
+I1
+ssVn)
+p902
+(dp903
+V,
+I1
+ssV'U
+p904
+(dp905
+Vr
+I1
+ssV'T
+p906
+(dp907
+V
+I1
+ssVn,
+p908
+(dp909
+V
+I196
+ssVn-
+p910
+(dp911
+Va
+I1
+sVb
+I3
+sVi
+I1
+sVh
+I3
+sV-
+I1
+sV1
+I4
+sVt
+I11
+sV8
+I1
+ssVn.
+p912
+(dp913
+V
+I101
+sV"
+I1
+sVh
+I2
+sV-
+I1
+sV.
+I1
+sV]
+I1
+ssVn
+p914
+(dp915
+Vê
+I7
+sV"
+I1
+sVp
+I203
+sV(
+I2
+sV1
+I24
+sVÉ
+I3
+sV3
+I1
+sV2
+I3
+sV9
+I1
+sVA
+I11
+sVC
+I7
+sVB
+I2
+sVE
+I7
+sVD
+I3
+sVF
+I10
+sVI
+I12
+sVH
+I5
+sVK
+I1
+sVJ
+I8
+sVM
+I4
+sVO
+I1
+sVN
+I3
+sVP
+I7
+sVS
+I1
+sVâ
+I3
+sVT
+I4
+sVV
+I5
+sVX
+I3
+sV_
+I4
+sVa
+I184
+sVà
+I23
+sVc
+I147
+sVb
+I51
+sVe
+I101
+sVd
+I203
+sVg
+I34
+sVf
+I70
+sVé
+I24
+sVh
+I41
+sVj
+I44
+sVm
+I107
+sVl
+I81
+sVo
+I31
+sVn
+I76
+sVq
+I35
+sVi
+I36
+sVs
+I99
+sVr
+I48
+sVu
+I20
+sVt
+I79
+sVw
+I4
+sVv
+I95
+sVy
+I13
+ssVn!
+p916
+(dp917
+V
+I16
+ssVn"
+p918
+(dp919
+V
+I2
+ssVfâ
+p920
+(dp921
+Vc
+I2
+ssVn'
+p922
+(dp923
+Va
+I106
+sVe
+I67
+sVé
+I32
+sVh
+I2
+sVê
+I2
+sVo
+I11
+sVi
+I1
+sVu
+I1
+sVt
+I4
+sVy
+I36
+ssV'E
+p924
+(dp925
+Vs
+I12
+sVt
+I1
+sVu
+I7
+sVl
+I8
+sVv
+I1
+ssVn;
+p926
+(dp927
+V
+I48
+ssV'A
+p928
+(dp929
+Vr
+I3
+sVd
+I1
+sVf
+I3
+sVc
+I1
+sVm
+I3
+sVL
+I1
+sVN
+I1
+sVs
+I3
+sVn
+I7
+sVt
+I3
+sVv
+I1
+sVz
+I1
+sVl
+I8
+ssVn?
+p930
+(dp931
+V
+I4
+sV-
+I1
+ssV'O
+p932
+(dp933
+VP
+I2
+sVr
+I1
+sVN
+I1
+sVv
+I1
+sVp
+I2
+ssV'I
+p934
+(dp935
+Vs
+I1
+sVn
+I2
+sVb
+I3
+sVL
+I1
+sVt
+I2
+ssV:/
+p936
+(dp937
+V/
+I8
+ssV:
+p938
+(dp939
+V
+I2
+sV1
+I1
+sVA
+I4
+sVC
+I13
+sVE
+I4
+sVF
+I1
+sVI
+I6
+sVH
+I2
+sVJ
+I7
+sVM
+I12
+sVO
+I3
+sVN
+I4
+sVQ
+I2
+sVS
+I6
+sVU
+I1
+sVT
+I1
+sVV
+I6
+sV_
+I6
+sVa
+I3
+sVc
+I9
+sVe
+I15
+sVi
+I11
+sVj
+I12
+sVm
+I10
+sVl
+I15
+sVo
+I10
+sVn
+I8
+sVq
+I4
+sVp
+I4
+sVs
+I5
+sVu
+I3
+sVt
+I2
+sVv
+I13
+ssVHu
+p940
+(dp941
+Vm
+I1
+ssVfê
+p942
+(dp943
+Vt
+I1
+ssVép
+p944
+(dp945
+Va
+I24
+sVe
+I10
+sVé
+I9
+sVl
+I13
+sVo
+I81
+sVi
+I3
+sVr
+I18
+sVu
+I5
+ssVfî
+p946
+(dp947
+Vt
+I1
+ssVMé
+p948
+(dp949
+Vd
+I3
+sVm
+I2
+sVl
+I10
+sVo
+I1
+sVq
+I1
+sVt
+I1
+ssVMè
+p950
+(dp951
+Vn
+I1
+ssVSp
+p952
+(dp953
+Ve
+I1
+ssVAS
+p954
+(dp955
+V
+I1
+sVC
+I2
+sV-
+I1
+ssV:M
+p956
+(dp957
+Vo
+I1
+ssVM
+p958
+(dp959
+VI
+I1
+sVE
+I1
+ssVM,
+p960
+(dp961
+V
+I2
+ssVM.
+p962
+(dp963
+VA
+I1
+sV
+I22
+ssVMe
+p964
+(dp965
+Va
+I2
+sVx
+I1
+sVs
+I8
+sVc
+I1
+ssV.g
+p966
+(dp967
+Vu
+I2
+ssVMa
+p968
+(dp969
+V
+I9
+sVd
+I7
+sVi
+I32
+sVh
+I2
+sVj
+I1
+sVl
+I3
+sVn
+I1
+sVs
+I6
+sVr
+I123
+sVu
+I1
+sVt
+I1
+sVî
+I4
+ssVMo
+p970
+(dp971
+Va
+I1
+sVg
+I1
+sVi
+I2
+sVk
+I1
+sVï
+I1
+sVn
+I32
+sVs
+I2
+sVr
+I4
+ssVMi
+p972
+(dp973
+Vs
+I2
+sVc
+I7
+sVl
+I4
+sVd
+I1
+ssVMu
+p974
+(dp975
+Vl
+I2
+ssVMy
+p976
+(dp977
+Vt
+I1
+ssVME
+p978
+(dp979
+V
+I3
+sVD
+I2
+sV,
+I1
+sV.
+I1
+sVR
+I3
+sVN
+I1
+ssVMD
+p980
+(dp981
+VC
+I1
+ssVMA
+p982
+(dp983
+VD
+I1
+sVG
+I3
+sVI
+I2
+sVL
+I2
+sVN
+I2
+sVY
+I1
+ssVMB
+p984
+(dp985
+V
+I1
+sVE
+I2
+ssVMM
+p986
+(dp987
+V.
+I1
+ssVMO
+p988
+(dp989
+VU
+I1
+sVN
+I1
+ssVMN
+p990
+(dp991
+VI
+I1
+ssVMI
+p992
+(dp993
+VS
+I2
+sVT
+I3
+sVN
+I2
+ssVMP
+p994
+(dp995
+VR
+I1
+sVL
+I1
+ssVMS
+p996
+(dp997
+V
+I1
+ssVbr
+p998
+(dp999
+Va
+I34
+sVe
+I37
+sVi
+I30
+sVo
+I11
+sVu
+I19
+sVû
+I13
+ssVîl
+p1000
+(dp1001
+Ve
+I2
+ssVîm
+p1002
+(dp1003
+Vé
+I3
+sVe
+I3
+ssVîn
+p1004
+(dp1005
+Va
+I2
+sVé
+I7
+sVe
+I15
+ssVîc
+p1006
+(dp1007
+Vh
+I5
+ssVît
+p1008
+(dp1009
+V
+I14
+sVr
+I58
+ssVsû
+p1010
+(dp1011
+Vr
+I1
+ssVsé
+p1012
+(dp1013
+Va
+I1
+sV
+I30
+sVc
+I2
+sVe
+I14
+sVd
+I2
+sVj
+I3
+sVm
+I10
+sV,
+I6
+sV.
+I1
+sVq
+I8
+sVp
+I9
+sVs
+I11
+sVr
+I16
+sVv
+I1
+sVn
+I6
+sV:
+I1
+ssVsè
+p1014
+(dp1015
+Vc
+I1
+sVr
+I16
+sVd
+I3
+ssVs;
+p1016
+(dp1017
+V
+I155
+ssVs:
+p1018
+(dp1019
+V
+I35
+ssVs?
+p1020
+(dp1021
+V
+I39
+sV-
+I4
+ssV,
+p1022
+(dp1023
+VR
+I2
+sVé
+I19
+sV0
+I2
+sV1
+I6
+sVÉ
+I1
+sV3
+I1
+sV2
+I3
+sV9
+I10
+sVô
+I1
+sVA
+I7
+sVC
+I24
+sVE
+I4
+sVD
+I4
+sVG
+I1
+sVF
+I1
+sVI
+I5
+sVH
+I3
+sVK
+I3
+sVJ
+I3
+sVM
+I12
+sVL
+I5
+sVO
+I4
+sVN
+I11
+sVP
+I7
+sVS
+I4
+sVb
+I17
+sVU
+I1
+sVT
+I4
+sVW
+I3
+sVV
+I4
+sV_
+I3
+sVa
+I120
+sVà
+I47
+sVc
+I133
+sVâ
+I3
+sVe
+I601
+sVd
+I397
+sVg
+I6
+sVf
+I26
+sVi
+I120
+sVh
+I8
+sVj
+I93
+sVm
+I131
+sVl
+I228
+sVo
+I59
+sVn
+I73
+sVq
+I235
+sVp
+I116
+sVs
+I132
+sVr
+I51
+sVu
+I38
+sVt
+I68
+sVw
+I6
+sVv
+I62
+sVy
+I16
+ssVs*
+p1024
+(dp1025
+V*
+I1
+ssVs)
+p1026
+(dp1027
+V
+I1
+sV;
+I1
+sV,
+I1
+ssVs/
+p1028
+(dp1029
+Vb
+I1
+sVg
+I1
+ssVs.
+p1030
+(dp1031
+V
+I302
+sV-
+I2
+sV]
+I1
+sV.
+I1
+ssVs-
+p1032
+(dp1033
+VA
+I13
+sVà
+I1
+sVc
+I7
+sVe
+I1
+sVd
+I3
+sVÉ
+I4
+sVm
+I3
+sVj
+I9
+sVM
+I1
+sVl
+I4
+sVn
+I13
+sVt
+I3
+sVv
+I13
+sVE
+I1
+ssVs,
+p1034
+(dp1035
+Vy
+I1
+sV
+I765
+ssVs"
+p1036
+(dp1037
+V.
+I1
+ssVs!
+p1038
+(dp1039
+V
+I45
+sV*
+I1
+ssVs
+p1040
+(dp1041
+Vê
+I11
+sVî
+I1
+sVé
+I115
+sV"
+I4
+sV(
+I2
+sV*
+I1
+sV-
+I1
+sV1
+I5
+sV3
+I1
+sV2
+I1
+sV:
+I1
+sVâ
+I1
+sVA
+I7
+sVC
+I12
+sVB
+I20
+sVE
+I9
+sVD
+I1
+sVF
+I1
+sVI
+I4
+sVH
+I1
+sVJ
+I5
+sVM
+I4
+sVL
+I2
+sVO
+I7
+sVP
+I14
+sVS
+I3
+sVR
+I7
+sVT
+I4
+sVW
+I1
+sVY
+I1
+sVX
+I11
+sV_
+I12
+sVa
+I375
+sVà
+I97
+sVc
+I294
+sVb
+I120
+sVe
+I236
+sVd
+I770
+sVg
+I70
+sVf
+I147
+sVi
+I93
+sVh
+I69
+sVk
+I1
+sVj
+I75
+sVm
+I224
+sVl
+I448
+sVo
+I76
+sVn
+I153
+sVq
+I224
+sVp
+I375
+sVs
+I294
+sVr
+I145
+sVu
+I116
+sVt
+I153
+sVw
+I12
+sVv
+I122
+sVy
+I35
+ssVs'
+p1042
+(dp1043
+Va
+I30
+sVe
+I39
+sVé
+I35
+sVê
+I2
+sVo
+I5
+sVi
+I25
+sVy
+I4
+ssVs[
+p1044
+(dp1045
+V1
+I6
+sV2
+I1
+sV5
+I1
+sV4
+I2
+ssVs_
+p1046
+(dp1047
+V
+I1
+sV,
+I11
+sV.
+I5
+ssV?.
+p1048
+(dp1049
+V.
+I1
+ssV?-
+p1050
+(dp1051
+V-
+I9
+ssV?
+p1052
+(dp1053
+V
+I36
+sVC
+I8
+sVB
+I1
+sVE
+I6
+sVD
+I1
+sVI
+I6
+sVJ
+I8
+sVM
+I5
+sVL
+I2
+sVO
+I3
+sVN
+I1
+sVQ
+I2
+sVP
+I2
+sVS
+I1
+sVT
+I2
+sVV
+I2
+sVY
+I1
+sVc
+I3
+sVe
+I6
+sVd
+I26
+sVi
+I1
+sVj
+I1
+sVl
+I3
+sVo
+I3
+sVn
+I1
+sVq
+I3
+sVp
+I2
+sVs
+I2
+sVv
+I2
+sVy
+I1
+ssVsy
+p1054
+(dp1055
+Vs
+I3
+sVl
+I4
+ssV,c
+p1056
+(dp1057
+Ve
+I1
+ssVss
+p1058
+(dp1059
+Va
+I127
+sV
+I45
+sVe
+I286
+sVi
+I149
+sVè
+I10
+sV,
+I30
+sVo
+I17
+sV.
+I11
+sVé
+I41
+sV!
+I8
+sVu
+I24
+sV[
+I1
+sV:
+I1
+sV;
+I7
+sV?
+I1
+ssVsr
+p1060
+(dp1061
+Va
+I3
+ssVsq
+p1062
+(dp1063
+Vu
+I55
+sV'
+I1
+ssVsp
+p1064
+(dp1065
+Va
+I27
+sVe
+I30
+sVé
+I14
+sVè
+I12
+sVl
+I2
+sVo
+I15
+sVi
+I8
+sVr
+I15
+sVu
+I11
+sVh
+I1
+ssVsw
+p1066
+(dp1067
+Ve
+I2
+ssVsu
+p1068
+(dp1069
+Va
+I4
+sV
+I7
+sVc
+I10
+sVb
+I12
+sVe
+I2
+sVg
+I1
+sVf
+I6
+sVi
+I122
+sVj
+I5
+sVm
+I3
+sVl
+I14
+sVp
+I9
+sVs
+I9
+sVr
+I179
+sVy
+I5
+ssVst
+p1070
+(dp1071
+Va
+I74
+sV
+I312
+sVe
+I82
+sVé
+I21
+sVi
+I47
+sVh
+I1
+sV-
+I26
+sV,
+I7
+sVo
+I23
+sV.
+I2
+sVp
+I12
+sVs
+I1
+sVr
+I50
+sVu
+I6
+sV_
+I1
+sVè
+I6
+sVy
+I2
+sV[
+I1
+sV?
+I1
+ssVsk
+p1072
+(dp1073
+Va
+I2
+sV
+I3
+sVi
+I4
+sV,
+I1
+sV.
+I1
+sV)
+I1
+ssVsi
+p1074
+(dp1075
+V
+I163
+sV,
+I10
+sV.
+I3
+sV;
+I1
+sV?
+I2
+sVa
+I3
+sVc
+I12
+sVb
+I26
+sVe
+I102
+sVd
+I4
+sVg
+I15
+sVf
+I4
+sVé
+I3
+sVè
+I17
+sVm
+I7
+sVl
+I6
+sVo
+I53
+sVn
+I50
+sVq
+I15
+sVp
+I4
+sVs
+I10
+sVr
+I32
+sVt
+I75
+sVv
+I1
+sVx
+I27
+ssVsh
+p1076
+(dp1077
+Va
+I2
+sV
+I2
+sVi
+I3
+sVo
+I4
+sV,
+I1
+ssVso
+p1078
+(dp1079
+V
+I8
+sVc
+I8
+sVe
+I21
+sVf
+I4
+sVi
+I56
+sVm
+I18
+sVl
+I47
+sVn
+I327
+sVp
+I23
+sVr
+I31
+sVu
+I130
+sVt
+I9
+sVy
+I1
+sV.
+I1
+ssVsm
+p1080
+(dp1081
+Va
+I5
+sVe
+I6
+sVo
+I4
+ssV,q
+p1082
+(dp1083
+Vu
+I1
+ssVsc
+p1084
+(dp1085
+Va
+I16
+sVe
+I4
+sVi
+I13
+sVh
+I1
+sVl
+I15
+sVo
+I23
+sVé
+I1
+sVr
+I11
+sVu
+I4
+sVè
+I4
+ssVsb
+p1086
+(dp1087
+Vi
+I1
+sVo
+I11
+ssVsa
+p1088
+(dp1089
+V
+I122
+sVc
+I19
+sVb
+I8
+sVd
+I1
+sVg
+I33
+sVi
+I173
+sV-
+I2
+sVm
+I3
+sVl
+I13
+sVn
+I129
+sVs
+I8
+sVr
+I6
+sVu
+I16
+sVt
+I11
+sVv
+I42
+sV;
+I2
+sV.
+I1
+sV,
+I2
+sV_
+I1
+ssVsf
+p1090
+(dp1091
+Va
+I2
+sVi
+I1
+sVe
+I1
+ssVse
+p1092
+(dp1093
+V!
+I1
+sV
+I326
+sV-
+I3
+sV,
+I51
+sV.
+I34
+sV;
+I15
+sV:
+I4
+sV?
+I3
+sV_
+I3
+sVa
+I55
+sVc
+I21
+sVe
+I2
+sVd
+I8
+sVi
+I40
+sVm
+I40
+sVl
+I73
+sVo
+I1
+sVn
+I96
+sVq
+I5
+sVp
+I8
+sVs
+I139
+sVr
+I166
+sVu
+I26
+sVt
+I6
+sVv
+I2
+sVy
+I1
+sVx
+I3
+sVz
+I46
+ssV,y
+p1094
+(dp1095
+V
+I1
+ssVRu
+p1096
+(dp1097
+Vp
+I2
+sVs
+I8
+ssVeç
+p1098
+(dp1099
+Vû
+I1
+sVu
+I14
+sVo
+I8
+ssVRe
+p1100
+(dp1101
+Va
+I1
+sVf
+I1
+sVm
+I2
+sVl
+I1
+sVp
+I1
+sVv
+I1
+ssVRa
+p1102
+(dp1103
+Vp
+I1
+sVb
+I1
+sVl
+I1
+sVg
+I3
+sVv
+I1
+ssVeû
+p1104
+(dp1105
+Vm
+I1
+sVt
+I10
+ssVRo
+p1106
+(dp1107
+Vb
+I3
+sVm
+I5
+sVs
+I2
+sVu
+I4
+sVt
+I1
+sVy
+I1
+ssVRh
+p1108
+(dp1109
+Vo
+I1
+ssVRi
+p1110
+(dp1111
+Vc
+I2
+sVe
+I3
+sVg
+I2
+ssVRT
+p1112
+(dp1113
+VI
+I2
+sV*
+I2
+ssVRU
+p1114
+(dp1115
+VE
+I3
+sVT
+I1
+ssVRW
+p1116
+(dp1117
+VI
+I1
+ssVRP
+p1118
+(dp1119
+VO
+I1
+ssVRR
+p1120
+(dp1121
+VA
+I4
+ssVRS
+p1122
+(dp1123
+VI
+I2
+sVQ
+I1
+ssVÉE
+p1124
+(dp1125
+VS
+I1
+ssVRD
+p1126
+(dp1127
+VE
+I1
+ssVRE
+p1128
+(dp1129
+V!
+I1
+sV
+I32
+sVC
+I1
+sVM
+I1
+sV,
+I2
+sV.
+I1
+sVS
+I3
+sVA
+I2
+ssVRG
+p1130
+(dp1131
+V"
+I2
+sV-
+I6
+ssVRA
+p1132
+(dp1133
+VC
+I1
+sVD
+I1
+sVI
+I1
+sVH
+I1
+sVL
+I1
+sVN
+I4
+ssVRC
+p1134
+(dp1135
+VH
+I1
+ssVRM
+p1136
+(dp1137
+VI
+I1
+ssVRO
+p1138
+(dp1139
+VU
+I1
+sVV
+I1
+sVJ
+I8
+sVM
+I1
+sVN
+I1
+ssVRI
+p1140
+(dp1141
+VC
+I1
+sVB
+I1
+sVE
+I1
+sVM
+I1
+sVN
+I2
+sVS
+I1
+ssVR
+p1142
+(dp1143
+VA
+I2
+sV
+I1
+sVC
+I1
+sVB
+I1
+sVF
+I2
+sVI
+I2
+sVO
+I1
+sVN
+I1
+sVP
+I3
+sVS
+I1
+sVR
+I2
+sV"
+I1
+ssVR,
+p1144
+(dp1145
+V
+I6
+ssVR.
+p1146
+(dp1147
+V
+I1
+ssVR*
+p1148
+(dp1149
+V:
+I1
+ssVem
+p1150
+(dp1151
+Va
+I83
+sV
+I4
+sVb
+I79
+sVe
+I206
+sVi
+I48
+sVm
+I44
+sVo
+I67
+sVn
+I2
+sVp
+I104
+sVs
+I1
+sVu
+I2
+ssVel
+p1152
+(dp1153
+Va
+I38
+sV
+I77
+sVc
+I1
+sVe
+I16
+sVà
+I1
+sVi
+I15
+sVl
+I357
+sVo
+I16
+sV,
+I8
+sVq
+I88
+sVé
+I6
+sVs
+I9
+sV!
+I5
+sVu
+I19
+sV.
+I1
+sVy
+I3
+sV;
+I3
+sV:
+I1
+sVp
+I1
+sV[
+I2
+ssVà
+p1154
+(dp1155
+VA
+I4
+sVC
+I45
+sVB
+I9
+sVE
+I1
+sVD
+I1
+sVH
+I1
+sVM
+I20
+sVL
+I7
+sVN
+I3
+sVP
+I16
+sVS
+I5
+sVR
+I6
+sVU
+I1
+sVT
+I3
+sVV
+I27
+sV_
+I3
+sVa
+I2
+sVc
+I49
+sVb
+I6
+sVe
+I11
+sVd
+I31
+sVg
+I9
+sVf
+I10
+sVh
+I1
+sVj
+I2
+sVm
+I38
+sVl
+I133
+sVo
+I1
+sVn
+I4
+sVq
+I23
+sVp
+I38
+sVs
+I37
+sVr
+I6
+sVu
+I38
+sVt
+I41
+sVv
+I17
+ssVen
+p1156
+(dp1157
+V!
+I9
+sV
+I590
+sV-
+I12
+sV,
+I25
+sV.
+I14
+sVh
+I1
+sV;
+I6
+sV:
+I5
+sV?
+I1
+sVô
+I1
+sVç
+I4
+sV[
+I2
+sVa
+I69
+sVc
+I143
+sVb
+I31
+sVe
+I32
+sVd
+I266
+sVg
+I10
+sVf
+I64
+sVi
+I61
+sVè
+I4
+sVê
+I4
+sVl
+I5
+sVo
+I13
+sVn
+I42
+sVq
+I1
+sVé
+I5
+sVs
+I130
+sVr
+I10
+sVu
+I30
+sVt
+I1178
+sVv
+I36
+sVy
+I1
+sVz
+I2
+ssVei
+p1158
+(dp1159
+Vb
+I2
+sVg
+I33
+sVl
+I144
+sVn
+I41
+sVp
+I1
+sVt
+I2
+sVv
+I11
+sVz
+I1
+ssVeh
+p1160
+(dp1161
+V!
+I1
+sVa
+I1
+sVl
+I4
+ssVej
+p1162
+(dp1163
+Ve
+I1
+ssVee
+p1164
+(dp1165
+V!
+I1
+sV
+I12
+sVd
+I4
+sV,
+I1
+sVn
+I3
+sVp
+I1
+sVs
+I4
+sVr
+I2
+sVl
+I2
+ssVed
+p1166
+(dp1167
+V
+I70
+sVe
+I1
+sVi
+I17
+sV,
+I9
+sVo
+I8
+sV.
+I3
+sV)
+I1
+sVs
+I15
+sVu
+I4
+sV_
+I2
+sV?
+I1
+ssVeg
+p1168
+(dp1169
+Vi
+I5
+sVa
+I30
+sVr
+I2
+sVo
+I2
+ssVef
+p1170
+(dp1171
+Va
+I1
+sV
+I3
+sVe
+I10
+sVf
+I34
+sV-
+I2
+sVo
+I18
+sVs
+I1
+sVr
+I1
+sVu
+I9
+ssVea
+p1172
+(dp1173
+V
+I8
+sVc
+I6
+sVd
+I21
+sVi
+I7
+sVm
+I1
+sVn
+I8
+sVs
+I14
+sVr
+I9
+sVu
+I201
+sVt
+I3
+sVv
+I1
+ssVec
+p1174
+(dp1175
+V
+I128
+sVe
+I22
+sVi
+I14
+sVh
+I3
+sVk
+I7
+sVo
+I37
+sVs
+I1
+sVr
+I9
+sVu
+I7
+sVt
+I82
+sVz
+I1
+ssVeb
+p1176
+(dp1177
+Va
+I1
+sV
+I2
+sVr
+I5
+sVu
+I2
+sVo
+I1
+ssVey
+p1178
+(dp1179
+Vd
+I1
+sV
+I15
+sV,
+I4
+sV_
+I1
+sV.
+I1
+ssVex
+p1180
+(dp1181
+Va
+I7
+sVc
+I22
+sVe
+I20
+sVi
+I9
+sVé
+I8
+sVo
+I1
+sVq
+I1
+sVp
+I28
+sVt
+I44
+sV_
+I1
+ssVez
+p1182
+(dp1183
+V!
+I3
+sV
+I236
+sV-
+I63
+sV,
+I34
+sV.
+I8
+sV;
+I3
+ssVeu
+p1184
+(dp1185
+V!
+I2
+sV
+I117
+sVe
+I13
+sVf
+I7
+sVi
+I9
+sVm
+I2
+sVl
+I22
+sVn
+I31
+sVp
+I8
+sVs
+I34
+sVr
+I636
+sVt
+I70
+sVv
+I17
+sVx
+I290
+sV;
+I2
+sV.
+I4
+sV,
+I6
+sV?
+I1
+ssVet
+p1186
+(dp1187
+Va
+I21
+sV
+I1033
+sVc
+I3
+sVe
+I26
+sVi
+I46
+sVh
+I5
+sV-
+I1
+sV,
+I24
+sVo
+I18
+sV.
+I11
+sVé
+I10
+sVs
+I22
+sVr
+I12
+sVu
+I5
+sVt
+I187
+sV;
+I4
+sV_
+I1
+sV/
+I3
+ssVew
+p1188
+(dp1189
+V
+I11
+sVs
+I3
+sVt
+I1
+ssVev
+p1190
+(dp1191
+Va
+I52
+sVâ
+I1
+sVe
+I54
+sVé
+I11
+sVè
+I1
+sVê
+I1
+sVo
+I12
+sVi
+I21
+sVr
+I3
+sVu
+I3
+ssVeq
+p1192
+(dp1193
+Vu
+I46
+ssVep
+p1194
+(dp1195
+Va
+I19
+sV
+I1
+sVe
+I12
+sVl
+I4
+sVo
+I2
+sVp
+I4
+sVr
+I22
+sVu
+I10
+sVt
+I21
+ssVes
+p1196
+(dp1197
+Va
+I33
+sV
+I1914
+sVc
+I22
+sVe
+I10
+sV)
+I1
+sV-
+I23
+sV,
+I268
+sVo
+I8
+sV.
+I133
+sVq
+I11
+sVp
+I67
+sVs
+I151
+sV!
+I11
+sVu
+I3
+sVt
+I425
+sV;
+I67
+sV:
+I23
+sV[
+I3
+sV_
+I10
+sV?
+I9
+ssVer
+p1198
+(dp1199
+V!
+I4
+sV
+I531
+sV*
+I2
+sV-
+I11
+sV,
+I79
+sV/
+I1
+sV.
+I62
+sV;
+I26
+sV:
+I7
+sV?
+I3
+sVç
+I13
+sV]
+I2
+sVa
+I85
+sVc
+I36
+sVb
+I1
+sVe
+I40
+sVd
+I43
+sVg
+I43
+sVf
+I7
+sVi
+I46
+sVm
+I50
+sVl
+I5
+sVo
+I20
+sVn
+I44
+sVp
+I5
+sVs
+I197
+sVr
+I120
+sVt
+I60
+sVw
+I1
+sVv
+I53
+ssVeM
+p1200
+(dp1201
+Va
+I1
+ssVeB
+p1202
+(dp1203
+Vo
+I46
+ssVe]
+p1204
+(dp1205
+V
+I1
+ssVe_
+p1206
+(dp1207
+V
+I6
+sV,
+I13
+sV.
+I13
+sV[
+I1
+sV:
+I1
+sV;
+I2
+ssVRÂ
+p1208
+(dp1209
+VC
+I1
+ssVfy
+p1210
+(dp1211
+V
+I2
+sV,
+I1
+ssVRÉ
+p1212
+(dp1213
+VF
+I1
+ssVe-
+p1214
+(dp1215
+Vc
+I9
+sVE
+I1
+sVD
+I2
+sVG
+I2
+sVf
+I1
+sVj
+I1
+sVm
+I6
+sVl
+I9
+sVN
+I1
+sVs
+I2
+sVt
+I5
+sVv
+I2
+ssVe,
+p1216
+(dp1217
+Vq
+I1
+sV
+I911
+ssVe.
+p1218
+(dp1219
+V
+I443
+sV-
+I2
+sV.
+I2
+ssVe)
+p1220
+(dp1221
+V
+I3
+ssVe!
+p1222
+(dp1223
+V)
+I1
+sV
+I47
+sV-
+I1
+ssVe
+p1224
+(dp1225
+Vê
+I4
+sVî
+I1
+sVâ
+I4
+sVé
+I69
+sV"
+I5
+sV$
+I1
+sV(
+I2
+sV1
+I22
+sV3
+I2
+sV2
+I3
+sV5
+I1
+sV4
+I7
+sV7
+I1
+sV6
+I1
+sV:
+I1
+sV?
+I1
+sVô
+I1
+sVA
+I6
+sVC
+I141
+sVB
+I16
+sVE
+I2
+sVD
+I11
+sVG
+I14
+sVF
+I16
+sVI
+I11
+sVH
+I6
+sVK
+I4
+sVJ
+I9
+sVM
+I32
+sVL
+I30
+sVN
+I6
+sVP
+I65
+sVS
+I11
+sVR
+I7
+sVU
+I4
+sVT
+I19
+sVW
+I3
+sVV
+I23
+sVX
+I42
+sV_
+I18
+sVa
+I240
+sVà
+I123
+sVc
+I463
+sVb
+I169
+sVe
+I291
+sVd
+I824
+sVg
+I88
+sVf
+I283
+sVi
+I68
+sVh
+I53
+sVk
+I1
+sVj
+I156
+sVm
+I479
+sVl
+I694
+sVo
+I77
+sVn
+I264
+sVq
+I304
+sVp
+I558
+sVs
+I511
+sVr
+I229
+sVu
+I64
+sVt
+I320
+sVw
+I12
+sVv
+I327
+sVy
+I8
+sVz
+I1
+ssVe?
+p1226
+(dp1227
+V
+I68
+sV-
+I1
+ssVe;
+p1228
+(dp1229
+V
+I260
+ssVe:
+p1230
+(dp1231
+V
+I87
+ssV..
+p1232
+(dp1233
+V
+I6
+sV-
+I1
+sV.
+I18
+ssVxi
+p1234
+(dp1235
+Vc
+I1
+sVb
+I1
+sVè
+I4
+sVm
+I3
+sVl
+I1
+sVo
+I4
+sVs
+I2
+ssVxo
+p1236
+(dp1237
+Vr
+I1
+ssVxc
+p1238
+(dp1239
+Ve
+I15
+sVé
+I1
+sVè
+I1
+sVl
+I2
+sVo
+I2
+sVu
+I2
+ssVxa
+p1240
+(dp1241
+Vs
+I1
+sVc
+I2
+sVm
+I2
+sV,
+I1
+sVn
+I8
+ssV1]
+p1242
+(dp1243
+V
+I31
+sV,
+I8
+sV.
+I5
+sV;
+I4
+sV:
+I1
+sV?
+I2
+ssVxe
+p1244
+(dp1245
+V
+I2
+sVs
+I4
+sVr
+I9
+sVm
+I9
+sV,
+I1
+ssVxp
+p1246
+(dp1247
+Ve
+I5
+sVé
+I4
+sVl
+I7
+sVo
+I3
+sVi
+I1
+sVr
+I6
+sVu
+I2
+ssVxq
+p1248
+(dp1249
+Vu
+I1
+ssVxt
+p1250
+(dp1251
+Va
+I2
+sV
+I17
+sVe
+I6
+sVo
+I1
+sVs
+I4
+sVr
+I21
+ssVDè
+p1252
+(dp1253
+Vs
+I3
+ssVDé
+p1254
+(dp1255
+Vc
+I1
+ssVx[
+p1256
+(dp1257
+V1
+I1
+ssV1e
+p1258
+(dp1259
+Vr
+I1
+ssVx_
+p1260
+(dp1261
+V,
+I2
+ssVx.
+p1262
+(dp1263
+V)
+I1
+sV
+I27
+sVc
+I2
+ssVx,
+p1264
+(dp1265
+V
+I40
+ssVx-
+p1266
+(dp1267
+Va
+I1
+sVb
+I2
+sVd
+I2
+sVh
+I1
+sVm
+I3
+sVs
+I1
+sVt
+I1
+ssVx
+p1268
+(dp1269
+Vi
+I3
+sVB
+I1
+sVD
+I1
+sVH
+I1
+sVJ
+I2
+sVP
+I1
+sVa
+I26
+sVà
+I5
+sVc
+I20
+sVb
+I3
+sVe
+I18
+sVd
+I42
+sVg
+I7
+sVf
+I28
+sVé
+I15
+sVh
+I8
+sVj
+I3
+sVm
+I42
+sVl
+I13
+sVo
+I3
+sVn
+I8
+sVq
+I31
+sVp
+I27
+sVs
+I14
+sVr
+I10
+sVu
+I3
+sVt
+I7
+sVv
+I15
+sVy
+I1
+ssVx!
+p1270
+(dp1271
+V
+I1
+ssVx:
+p1272
+(dp1273
+V
+I2
+ssVx;
+p1274
+(dp1275
+V
+I15
+ssVx?
+p1276
+(dp1277
+V
+I1
+ssV11
+p1278
+(dp1279
+V
+I1
+sV/
+I1
+sV.
+I2
+sV3
+I1
+sV;
+I1
+sV]
+I2
+ssV10
+p1280
+(dp1281
+Va
+I2
+sV
+I4
+sV.
+I4
+sV0
+I4
+sV9
+I1
+sV]
+I2
+ssV13
+p1282
+(dp1283
+V
+I1
+ssV12
+p1284
+(dp1285
+V.
+I1
+sV4
+I1
+sV6
+I1
+sV;
+I1
+sV]
+I2
+sV_
+I1
+ssV15
+p1286
+(dp1287
+V
+I1
+sV)
+I1
+sV,
+I1
+sV.
+I1
+sV0
+I1
+sV2
+I1
+sV4
+I2
+sV9
+I2
+ssV14
+p1288
+(dp1289
+V
+I2
+sV-
+I1
+sV7
+I1
+ssV17
+p1290
+(dp1291
+V1
+I2
+sV0
+I2
+sV3
+I8
+sV5
+I14
+sV7
+I2
+sV6
+I20
+sV9
+I1
+sV8
+I3
+ssV16
+p1292
+(dp1293
+V9
+I1
+sV
+I1
+sV1
+I2
+sV4
+I1
+sV7
+I1
+ssV19
+p1294
+(dp1295
+V9
+I5
+sV7
+I3
+ssV18
+p1296
+(dp1297
+V1
+I1
+sV0
+I2
+sV2
+I3
+sV,
+I1
+sV
+I1
+ssV1;
+p1298
+(dp1299
+V
+I2
+ssV1
+p1300
+(dp1301
+VO
+I1
+sV
+I1
+sVb
+I1
+sVf
+I1
+sVJ
+I2
+sVo
+I1
+sVN
+I1
+sVs
+I1
+sVT
+I1
+ssV1(
+p1302
+(dp1303
+Vc
+I2
+ssV1*
+p1304
+(dp1305
+V*
+I1
+ssV1-
+p1306
+(dp1307
+V2
+I1
+ssV1,
+p1308
+(dp1309
+V
+I5
+ssV1/
+p1310
+(dp1311
+V0
+I1
+ssV1.
+p1312
+(dp1313
+V
+I2
+sVt
+I2
+ssVDO
+p1314
+(dp1315
+VC
+I2
+sVM
+I2
+sVT
+I1
+sVN
+I1
+ssVxé
+p1316
+(dp1317
+Vc
+I8
+ssVDI
+p1318
+(dp1319
+VC
+I2
+sVE
+I1
+sVD
+I4
+sVN
+I2
+sVS
+I2
+sVR
+I1
+sVU
+I1
+sVT
+I3
+ssVDD
+p1320
+(dp1321
+VI
+I1
+ssVDE
+p1322
+(dp1323
+V
+I10
+sVD
+I1
+sVM
+I1
+sV,
+I2
+sVN
+I2
+sVR
+I2
+sVT
+I1
+sV.
+I1
+ssVDC
+p1324
+(dp1325
+VC
+I1
+ssVDA
+p1326
+(dp1327
+VM
+I3
+sVN
+I1
+ssVDU
+p1328
+(dp1329
+VI
+I1
+sV
+I2
+ssVDo
+p1330
+(dp1331
+V
+I1
+sVr
+I3
+sVm
+I2
+sVn
+I4
+ssVDi
+p1332
+(dp1333
+Va
+I1
+sVs
+I2
+sVe
+I26
+sVd
+I1
+sVo
+I1
+ssVDe
+p1334
+(dp1335
+V
+I11
+sVc
+I6
+sVf
+I4
+sVm
+I1
+sVl
+I1
+sVn
+I1
+sVs
+I5
+sVu
+I2
+ssVDa
+p1336
+(dp1337
+Vk
+I1
+sVr
+I2
+sVm
+I4
+sVt
+I1
+sVn
+I10
+ssVD,
+p1338
+(dp1339
+V
+I2
+ssVD*
+p1340
+(dp1341
+V
+I1
+ssVD'
+p1342
+(dp1343
+VA
+I1
+sVa
+I1
+sVu
+I1
+ssVD
+p1344
+(dp1345
+VM
+I1
+sVT
+I5
+sVW
+I1
+ssVWE
+p1346
+(dp1347
+VR
+I1
+ssVWA
+p1348
+(dp1349
+VR
+I4
+sVN
+I1
+ssVWI
+p1350
+(dp1351
+VS
+I1
+ssVWH
+p1352
+(dp1353
+VA
+I1
+ssVWe
+p1354
+(dp1355
+V
+I10
+sVs
+I2
+sVr
+I1
+sVb
+I2
+sVl
+I1
+ssVWa
+p1356
+(dp1357
+Vs
+I1
+ssVWo
+p1358
+(dp1359
+Vr
+I1
+ssVWi
+p1360
+(dp1361
+Vs
+I1
+sVr
+I1
+ssVWh
+p1362
+(dp1363
+Vi
+I1
+sVy
+I1
+ssVWy
+p1364
+(dp1365
+Vo
+I1
+ssVÉP
+p1366
+(dp1367
+VE
+I1
+ssVjé
+p1368
+(dp1369
+Vs
+I33
+ssVjà
+p1370
+(dp1371
+V
+I17
+ssVÉF
+p1372
+(dp1373
+VA
+I1
+ssV$2
+p1374
+(dp1375
+V
+I1
+ssVÉp
+p1376
+(dp1377
+Vi
+I1
+ssV.o
+p1378
+(dp1379
+Vr
+I2
+ssVÉt
+p1380
+(dp1381
+Vo
+I1
+ssVÉl
+p1382
+(dp1383
+Vé
+I1
+sVi
+I1
+sVa
+I1
+ssVÉn
+p1384
+(dp1385
+Vé
+I2
+ssVPM
+p1386
+(dp1387
+VB
+I1
+ssVÉd
+p1388
+(dp1389
+Vi
+I1
+sVe
+I1
+sVo
+I5
+ssVÉg
+p1390
+(dp1391
+Vy
+I1
+sVl
+I2
+ssV.c
+p1392
+(dp1393
+Vo
+I2
+ssVus
+p1394
+(dp1395
+V!
+I1
+sV
+I842
+sVp
+I3
+sV-
+I9
+sV,
+I51
+sV.
+I14
+sV;
+I6
+sV:
+I2
+sV?
+I14
+sV[
+I1
+sV_
+I1
+sVa
+I17
+sVc
+I2
+sVe
+I78
+sVé
+I6
+sVè
+I1
+sVl
+I1
+sVo
+I1
+sVq
+I26
+sVi
+I34
+sVs
+I90
+sVu
+I4
+sVt
+I36
+ssVj'
+p1396
+(dp1397
+Va
+I81
+sVe
+I9
+sVi
+I2
+sVo
+I1
+sVé
+I14
+sVy
+I6
+ssV#6
+p1398
+(dp1399
+V
+I1
+ssV#4
+p1400
+(dp1401
+V6
+I1
+ssV.z
+p1402
+(dp1403
+Vi
+I2
+ssVju
+p1404
+(dp1405
+Vi
+I2
+sVp
+I1
+sVs
+I42
+sVr
+I8
+sVg
+I16
+ssVjo
+p1406
+(dp1407
+Va
+I1
+sVi
+I9
+sVs
+I2
+sVu
+I137
+sVl
+I10
+ssVje
+p1408
+(dp1409
+V
+I287
+sVc
+I34
+sV,
+I1
+sV.
+I1
+sVs
+I15
+sVu
+I30
+sVt
+I32
+sV?
+I3
+ssVja
+p1410
+(dp1411
+Vc
+I1
+sVm
+I56
+sVl
+I4
+sVn
+I6
+sVr
+I11
+sVu
+I2
+ssVua
+p1412
+(dp1413
+V
+I26
+sV:
+I2
+sVd
+I4
+sVg
+I1
+sVi
+I38
+sV-
+I1
+sVl
+I4
+sVn
+I77
+sVq
+I1
+sV.
+I1
+sVr
+I28
+sVu
+I1
+sVt
+I32
+sVz
+I1
+sVb
+I1
+sV,
+I2
+ssV6
+p1414
+(dp1415
+Vi
+I1
+sVa
+I1
+sV;
+I1
+sVm
+I1
+sVn
+I1
+ssV6,
+p1416
+(dp1417
+V
+I8
+ssV6.
+p1418
+(dp1419
+V)
+I1
+sV
+I4
+ssV60
+p1420
+(dp1421
+V0
+I1
+sV
+I1
+sV.
+I1
+ssV61
+p1422
+(dp1423
+V0
+I2
+sV;
+I1
+sV,
+I3
+sV.
+I2
+ssV62
+p1424
+(dp1425
+V2
+I2
+sV.
+I1
+ssV63
+p1426
+(dp1427
+V.
+I2
+ssV64
+p1428
+(dp1429
+V4
+I1
+sV-
+I2
+sV,
+I1
+sV.
+I1
+ssV65
+p1430
+(dp1431
+V0
+I1
+sV5
+I1
+ssV66
+p1432
+(dp1433
+V;
+I1
+sV,
+I3
+ssV67
+p1434
+(dp1435
+V;
+I1
+sV2
+I1
+ssV68
+p1436
+(dp1437
+V,
+I2
+ssV69
+p1438
+(dp1439
+V,
+I1
+sV6
+I1
+ssV6;
+p1440
+(dp1441
+V
+I2
+ssVï
+p1442
+(dp1443
+Vc
+I1
+ssV_l
+p1444
+(dp1445
+Vi
+I1
+sVa
+I1
+sVe
+I2
+sV'
+I2
+ssVrâ
+p1446
+(dp1447
+Vc
+I13
+sVt
+I1
+sVn
+I1
+ssV»
+p1448
+(dp1449
+V(
+I1
+ssVïo
+p1450
+(dp1451
+Vn
+I4
+ssVïm
+p1452
+(dp1453
+Va
+I1
+sVb
+I1
+ssVïf
+p1454
+(dp1455
+V
+I1
+ssVïe
+p1456
+(dp1457
+V;
+I1
+ssVïa
+p1458
+(dp1459
+Vr
+I2
+sVd
+I1
+ssV_a
+p1460
+(dp1461
+Vu
+I1
+sVl
+I1
+ssVïv
+p1462
+(dp1463
+Ve
+I1
+ssVïs
+p1464
+(dp1465
+V
+I1
+sVs
+I1
+sVe
+I2
+ssV6]
+p1466
+(dp1467
+V
+I3
+sV;
+I1
+ssVïq
+p1468
+(dp1469
+Vu
+I1
+ssV'
+p1470
+(dp1471
+VI
+I1
+sVL
+I1
+ssVI;
+p1472
+(dp1473
+V
+I1
+ssVI:
+p1474
+(dp1475
+V
+I1
+ssVI-
+p1476
+(dp1477
+V1
+I1
+ssVI,
+p1478
+(dp1479
+V
+I32
+ssVI.
+p1480
+(dp1481
+V
+I18
+ssVI
+p1482
+(dp1483
+Va
+I1
+sVf
+I2
+sVd
+I12
+sVn
+I1
+ssVà?
+p1484
+(dp1485
+V
+I2
+ssVIX
+p1486
+(dp1487
+V
+I1
+sV.
+I4
+ssVI[
+p1488
+(dp1489
+V1
+I2
+ssVI_
+p1490
+(dp1491
+V
+I1
+ssVIS
+p1492
+(dp1493
+V
+I3
+sVC
+I1
+sV"
+I1
+sVE
+I1
+sVM
+I2
+sV,
+I1
+sVO
+I1
+sVS
+I1
+sVT
+I1
+ssVIR
+p1494
+(dp1495
+VM
+I1
+sVE
+I4
+sV,
+I1
+ssVIU
+p1496
+(dp1497
+VM
+I1
+ssVIT
+p1498
+(dp1499
+V
+I2
+sVE
+I3
+sVI
+I4
+sVH
+I1
+sVN
+I1
+sVR
+I30
+sVY
+I4
+ssVIV
+p1500
+(dp1501
+V
+I2
+sVE
+I2
+sV.
+I3
+sV_
+I2
+sV:
+I1
+sV?
+I1
+ssVII
+p1502
+(dp1503
+V
+I16
+sVI
+I22
+sV,
+I18
+sV.
+I10
+sV[
+I2
+sV_
+I1
+ssVIM
+p1504
+(dp1505
+VI
+I5
+sVP
+I2
+sVE
+I2
+ssVIL
+p1506
+(dp1507
+VI
+I3
+sV
+I1
+sVS
+I1
+ssVIO
+p1508
+(dp1509
+VN
+I6
+ssVIN
+p1510
+(dp1511
+V
+I6
+sVC
+I3
+sVD
+I4
+sVG
+I3
+sVT
+I2
+ssVIA
+p1512
+(dp1513
+VB
+I1
+sVL
+I1
+ssVIC
+p1514
+(dp1515
+V
+I4
+sVU
+I1
+sVE
+I1
+sVT
+I1
+ssVIB
+p1516
+(dp1517
+VI
+I1
+sVR
+I1
+sVU
+I1
+ssVIE
+p1518
+(dp1519
+V
+I1
+sVS
+I3
+sVD
+I1
+sVN
+I1
+ssVID
+p1520
+(dp1521
+VE
+I5
+sVO
+I1
+ssVIG
+p1522
+(dp1523
+VE
+I1
+ssVIF
+p1524
+(dp1525
+V
+I3
+ssVïè
+p1526
+(dp1527
+Vt
+I1
+ssVIs
+p1528
+(dp1529
+Vs
+I9
+sVr
+I3
+sVm
+I2
+sVl
+I1
+ssVIr
+p1530
+(dp1531
+Va
+I1
+ssVIt
+p1532
+(dp1533
+Va
+I11
+sV
+I1
+ssVIv
+p1534
+(dp1535
+Va
+I5
+ssVIm
+p1536
+(dp1537
+Va
+I1
+ssVIl
+p1538
+(dp1539
+V
+I129
+sVs
+I15
+sVl
+I1
+ssVIo
+p1540
+(dp1541
+Vw
+I1
+ssVIn
+p1542
+(dp1543
+Vc
+I1
+sVt
+I3
+sVd
+I3
+sV
+I1
+sVf
+I2
+ssVIc
+p1544
+(dp1545
+Vi
+I1
+ssVIb
+p1546
+(dp1547
+Va
+I3
+ssVIe
+p1548
+(dp1549
+Vr
+I4
+ssVId
+p1550
+(dp1551
+Ve
+I2
+ssVIg
+p1552
+(dp1553
+Vn
+I1
+ssVIf
+p1554
+(dp1555
+V
+I11
+ssV(~
+p1556
+(dp1557
+V)
+I1
+ssV(s
+p1558
+(dp1559
+Vu
+I1
+ssV(p
+p1560
+(dp1561
+Va
+I1
+ssVvâ
+p1562
+(dp1563
+Vm
+I2
+sVt
+I1
+ssV(t
+p1564
+(dp1565
+Vh
+I1
+ssVA,
+p1566
+(dp1567
+V
+I1
+ssV(i
+p1568
+(dp1569
+Vf
+I2
+sVn
+I2
+ssV(o
+p1570
+(dp1571
+Vr
+I3
+sVu
+I1
+sVn
+I1
+ssV(c
+p1572
+(dp1573
+V)
+I2
+ssV(a
+p1574
+(dp1575
+Vs
+I1
+sVn
+I2
+ssV(f
+p1576
+(dp1577
+Vr
+I1
+ssV(d
+p1578
+(dp1579
+Vû
+I1
+ssV2O
+p1580
+(dp1581
+V.
+I1
+ssV(_
+p1582
+(dp1583
+V)
+I1
+sVM
+I1
+ssV(V
+p1584
+(dp1585
+Vo
+I1
+ssV(T
+p1586
+(dp1587
+Vh
+I1
+ssV(J
+p1588
+(dp1589
+Ve
+I1
+ssVvè
+p1590
+(dp1591
+Vr
+I10
+ssVTM
+p1592
+(dp1593
+V
+I1
+ssV(N
+p1594
+(dp1595
+Vo
+I1
+ssV(C
+p1596
+(dp1597
+V)
+I1
+ssVca
+p1598
+(dp1599
+Vc
+I7
+sVb
+I23
+sVd
+I12
+sVf
+I3
+sVi
+I11
+sVm
+I91
+sVl
+I16
+sV.
+I2
+sVp
+I29
+sVs
+I15
+sVr
+I82
+sVu
+I16
+sVt
+I17
+sVv
+I1
+sVy
+I3
+sVn
+I49
+ssVêt
+p1600
+(dp1601
+Va
+I2
+sV
+I6
+sVe
+I67
+sVi
+I1
+sVè
+I1
+sV,
+I1
+sV.
+I2
+sVr
+I105
+sVu
+I3
+ssV(3
+p1602
+(dp1603
+V)
+I2
+ssVêv
+p1604
+(dp1605
+Ve
+I4
+ssVêl
+p1606
+(dp1607
+Va
+I1
+sVé
+I1
+sVe
+I3
+ssVêm
+p1608
+(dp1609
+Ve
+I79
+ssV(#
+p1610
+(dp1611
+V6
+I1
+ssVêc
+p1612
+(dp1613
+Vh
+I9
+ssVoï
+p1614
+(dp1615
+Vq
+I1
+sVa
+I3
+sVs
+I2
+sVm
+I1
+sVo
+I1
+ssVoë
+p1616
+(dp1617
+Vm
+I1
+sVt
+I2
+ssVoé
+p1618
+(dp1619
+Vs
+I1
+ssVoè
+p1620
+(dp1621
+Vt
+I3
+ssVoû
+p1622
+(dp1623
+Vt
+I31
+ssVoù
+p1624
+(dp1625
+V
+I48
+sV,
+I1
+ssVd"
+p1626
+(dp1627
+V
+I1
+ssVo.
+p1628
+(dp1629
+V
+I19
+sVo
+I2
+sVn
+I1
+ssVo-
+p1630
+(dp1631
+Vc
+I1
+sVt
+I1
+sVd
+I7
+ssVo,
+p1632
+(dp1633
+V
+I43
+ssVo!
+p1634
+(dp1635
+V
+I1
+ssVo
+p1636
+(dp1637
+V"
+I1
+sVi
+I2
+sVG
+I1
+sVP
+I1
+sVT
+I3
+sVa
+I14
+sVà
+I2
+sVc
+I8
+sVe
+I6
+sVd
+I12
+sVg
+I3
+sVf
+I3
+sVé
+I2
+sVh
+I2
+sVk
+I1
+sVm
+I5
+sVl
+I5
+sVo
+I5
+sVn
+I9
+sVq
+I1
+sVp
+I9
+sVs
+I7
+sVr
+I2
+sVu
+I1
+sVt
+I17
+sVw
+I4
+sVv
+I1
+sVy
+I3
+ssVo;
+p1638
+(dp1639
+V
+I9
+ssVo:
+p1640
+(dp1641
+V
+I4
+ssVo_
+p1642
+(dp1643
+V;
+I1
+sV,
+I1
+ssV;
+p1644
+(dp1645
+Vê
+I1
+sVA
+I1
+sVC
+I9
+sVD
+I3
+sVJ
+I1
+sVO
+I2
+sVP
+I2
+sV_
+I1
+sVa
+I10
+sVà
+I1
+sVc
+I66
+sVe
+I114
+sVd
+I16
+sVf
+I1
+sVi
+I103
+sVh
+I1
+sVj
+I81
+sVm
+I78
+sVl
+I61
+sVo
+I22
+sVn
+I14
+sVq
+I14
+sVp
+I6
+sVs
+I16
+sVr
+I2
+sVu
+I7
+sVt
+I14
+sVv
+I16
+sVy
+I1
+ssVo[
+p1646
+(dp1647
+V1
+I2
+ssVoo
+p1648
+(dp1649
+Vs
+I2
+sVk
+I50
+sVd
+I1
+sVf
+I2
+ssVon
+p1650
+(dp1651
+V!
+I2
+sV
+I749
+sV"
+I1
+sV'
+I3
+sV-
+I3
+sV,
+I90
+sV.
+I40
+sV;
+I19
+sV:
+I5
+sV?
+I3
+sVg
+I47
+sV[
+I1
+sV_
+I1
+sVa
+I36
+sVc
+I68
+sVe
+I20
+sVd
+I288
+sVç
+I8
+sVf
+I12
+sVi
+I22
+sVh
+I8
+sVj
+I1
+sVl
+I6
+sVo
+I11
+sVn
+I307
+sVq
+I2
+sVs
+I381
+sVu
+I1
+sVt
+I326
+sVv
+I29
+sVz
+I2
+ssVom
+p1652
+(dp1653
+Va
+I10
+sV
+I18
+sVb
+I47
+sVe
+I72
+sVi
+I16
+sVé
+I2
+sVè
+I3
+sVm
+I323
+sVo
+I2
+sV.
+I3
+sVp
+I62
+sVs
+I2
+sVt
+I2
+sVn
+I1
+sV>
+I1
+ssVol
+p1654
+(dp1655
+Va
+I19
+sV
+I6
+sVc
+I1
+sVâ
+I1
+sVe
+I45
+sVd
+I15
+sVi
+I55
+sVè
+I3
+sVl
+I28
+sVo
+I26
+sV,
+I5
+sVé
+I18
+sVs
+I4
+sVu
+I22
+sVt
+I31
+sV.
+I2
+sV;
+I1
+sV:
+I1
+ssVok
+p1656
+(dp1657
+Va
+I1
+sV
+I19
+sV)
+I1
+sV,
+I6
+sV.
+I2
+sV0
+I3
+sVs
+I19
+ssVoj
+p1658
+(dp1659
+Ve
+I32
+ssVoi
+p1660
+(dp1661
+V!
+I14
+sV
+I100
+sVc
+I6
+sV:
+I2
+sVe
+I21
+sVd
+I7
+sVg
+I11
+sV-
+I6
+sVl
+I34
+sVn
+I123
+sVq
+I15
+sVs
+I250
+sVr
+I165
+sVt
+I75
+sVv
+I2
+sVx
+I16
+sV;
+I5
+sV.
+I6
+sV,
+I37
+sV?
+I2
+ssVoh
+p1662
+(dp1663
+V!
+I2
+sVi
+I1
+ssVog
+p1664
+(dp1665
+Ve
+I5
+sVi
+I13
+sVl
+I4
+sVo
+I2
+sVn
+I4
+sVé
+I2
+sVr
+I4
+sVu
+I4
+ssVof
+p1666
+(dp1667
+Va
+I1
+sV
+I66
+sVe
+I3
+sVf
+I23
+sVé
+I3
+sV,
+I1
+sVo
+I7
+sVl
+I10
+sVi
+I6
+sVr
+I2
+sVt
+I5
+sV.
+I1
+ssVoe
+p1668
+(dp1669
+Vi
+I6
+sVs
+I2
+sVu
+I57
+ssVod
+p1670
+(dp1671
+Va
+I4
+sV
+I3
+sVe
+I13
+sVi
+I14
+sVo
+I4
+sVé
+I4
+sVs
+I1
+sVu
+I18
+sV;
+I1
+ssVoc
+p1672
+(dp1673
+Va
+I3
+sV
+I3
+sVc
+I10
+sVe
+I14
+sVi
+I12
+sVh
+I42
+sVk
+I1
+sVo
+I22
+sVé
+I5
+sVs
+I1
+sV!
+I1
+sVu
+I19
+sVt
+I15
+sVè
+I3
+sVr
+I2
+ssVob
+p1674
+(dp1675
+Va
+I5
+sVe
+I15
+sVé
+I3
+sVj
+I3
+sVl
+I16
+sVo
+I4
+sVi
+I1
+sVs
+I7
+sVr
+I2
+sVu
+I1
+sVt
+I3
+sVv
+I1
+ssVoa
+p1676
+(dp1677
+Vc
+I2
+sVb
+I1
+sVd
+I3
+sVi
+I1
+sVm
+I1
+sVl
+I1
+sVn
+I1
+ssVoy
+p1678
+(dp1679
+Vé
+I8
+sVa
+I83
+sVâ
+I1
+sVe
+I63
+sVo
+I1
+ssVox
+p1680
+(dp1681
+Ve
+I2
+sV.
+I2
+ssVow
+p1682
+(dp1683
+Va
+I1
+sV
+I14
+sV:
+I1
+sVe
+I1
+sVi
+I3
+sV,
+I3
+sV.
+I1
+sVs
+I1
+sVn
+I4
+ssVov
+p1684
+(dp1685
+Vi
+I29
+sVe
+I16
+ssVou
+p1686
+(dp1687
+V!
+I1
+sV
+I105
+sVp
+I113
+sV,
+I4
+sV.
+I2
+sVh
+I3
+sV;
+I1
+sV:
+I1
+sVa
+I23
+sVc
+I32
+sVb
+I14
+sVe
+I37
+sVd
+I22
+sVg
+I18
+sVf
+I11
+sVé
+I9
+sVè
+I1
+sVj
+I49
+sVm
+I1
+sVl
+I72
+sVï
+I2
+sVn
+I16
+sVq
+I3
+sVi
+I36
+sVs
+I709
+sVr
+I573
+sVt
+I372
+sVv
+I234
+sVx
+I18
+sVz
+I13
+ssVot
+p1688
+(dp1689
+Va
+I6
+sV
+I28
+sVe
+I21
+sVi
+I5
+sVh
+I28
+sV*
+I1
+sV,
+I7
+sV.
+I4
+sVs
+I17
+sVr
+I77
+sVt
+I16
+sV:
+I1
+ssVos
+p1690
+(dp1691
+Va
+I14
+sV
+I62
+sVc
+I2
+sVe
+I52
+sVp
+I1
+sVi
+I12
+sV-
+I13
+sVm
+I1
+sV,
+I12
+sVo
+I23
+sV.
+I4
+sVq
+I1
+sVé
+I5
+sVs
+I134
+sVt
+I22
+sV;
+I1
+ssVor
+p1692
+(dp1693
+Vé
+I6
+sV
+I81
+sV,
+I8
+sV;
+I1
+sV:
+I2
+sVç
+I4
+sVa
+I52
+sVc
+I16
+sVb
+I2
+sVe
+I75
+sVd
+I83
+sVg
+I22
+sVf
+I2
+sVi
+I17
+sVk
+I10
+sVm
+I45
+sVl
+I3
+sVo
+I1
+sVn
+I13
+sVq
+I1
+sVp
+I11
+sVs
+I39
+sVr
+I32
+sVt
+I214
+sVw
+I1
+sVy
+I1
+sVz
+I1
+ssVoq
+p1694
+(dp1695
+Vu
+I16
+ssVop
+p1696
+(dp1697
+V
+I8
+sVe
+I16
+sVi
+I3
+sVé
+I9
+sVh
+I26
+sVl
+I17
+sVo
+I18
+sVp
+I5
+sVr
+I7
+sVu
+I1
+sVt
+I4
+sVy
+I15
+ssVNi
+p1698
+(dp1699
+V
+I1
+sVc
+I1
+ssVaç
+p1700
+(dp1701
+Va
+I3
+sVo
+I1
+ssVNo
+p1702
+(dp1703
+Vi
+I1
+sVn
+I4
+sVs
+I2
+sVr
+I6
+sVu
+I20
+sVt
+I3
+sVv
+I4
+ssVaé
+p1704
+(dp1705
+Vl
+I2
+ssVNa
+p1706
+(dp1707
+Vp
+I3
+sVt
+I2
+sVd
+I1
+ssVaë
+p1708
+(dp1709
+Vl
+I2
+ssVNe
+p1710
+(dp1711
+V
+I4
+sVb
+I1
+sVw
+I7
+sVv
+I1
+ssVaï
+p1712
+(dp1713
+Vf
+I1
+sVè
+I1
+sVm
+I1
+sVo
+I3
+sVs
+I2
+sVv
+I1
+ssVaî
+p1714
+(dp1715
+Vc
+I5
+sVt
+I68
+sVn
+I13
+ssVNu
+p1716
+(dp1717
+Vm
+I2
+ssVNI
+p1718
+(dp1719
+VT
+I2
+ssVNO
+p1720
+(dp1721
+V
+I2
+sVT
+I4
+ssVNB
+p1722
+(dp1723
+VE
+I8
+ssVNC
+p1724
+(dp1725
+VI
+I1
+sVE
+I1
+sVL
+I2
+ssVND
+p1726
+(dp1727
+VI
+I4
+sV
+I3
+sV*
+I1
+sVE
+I4
+sV,
+I1
+ssVNE
+p1728
+(dp1729
+VY
+I1
+sVS
+I1
+sVG
+I1
+ssVNG
+p1730
+(dp1731
+V
+I3
+ssVNY
+p1732
+(dp1733
+V
+I2
+sVT
+I1
+ssVNS
+p1734
+(dp1735
+V
+I6
+sVE
+I1
+sV.
+I1
+ssVNT
+p1736
+(dp1737
+V!
+I2
+sVA
+I2
+sVI
+I3
+sV*
+I1
+sVS
+I1
+sVR
+I1
+sVY
+I2
+ssVNU
+p1738
+(dp1739
+VM
+I2
+ssVN,
+p1740
+(dp1741
+V
+I3
+ssVN
+p1742
+(dp1743
+VA
+I1
+sVb
+I1
+sVE
+I2
+sVD
+I3
+sVF
+I1
+sVI
+I2
+sVU
+I1
+sV[
+I1
+ssVN'
+p1744
+(dp1745
+Va
+I2
+sVê
+I1
+sVe
+I1
+sVT
+I1
+ssV'_
+p1746
+(dp1747
+V
+I1
+sVH
+I2
+ssVaa
+p1748
+(dp1749
+Vs
+I1
+sV,
+I3
+ssVNé
+p1750
+(dp1751
+Vr
+I1
+ssVac
+p1752
+(dp1753
+Va
+I94
+sV
+I3
+sVc
+I40
+sV:
+I1
+sVe
+I29
+sVé
+I4
+sVh
+I64
+sVl
+I10
+sVo
+I7
+sV,
+I2
+sVq
+I11
+sVi
+I6
+sVs
+I1
+sVr
+I10
+sVu
+I21
+sVt
+I30
+sV;
+I1
+sV.
+I1
+ssVab
+p1754
+(dp1755
+Va
+I33
+sVb
+I28
+sVe
+I2
+sVi
+I35
+sVh
+I1
+sVj
+I1
+sVl
+I135
+sVo
+I39
+sVî
+I4
+sVs
+I9
+sVr
+I2
+sVu
+I1
+sVy
+I2
+sV,
+I1
+ssVae
+p1756
+(dp1757
+Va
+I1
+sV
+I1
+sVr
+I1
+sVl
+I8
+ssVad
+p1758
+(dp1759
+Va
+I29
+sV
+I8
+sVe
+I89
+sVd
+I9
+sVi
+I26
+sVj
+I1
+sVm
+I12
+sV,
+I2
+sVo
+I27
+sVé
+I5
+sVr
+I12
+sVu
+I2
+sVv
+I6
+sVy
+I2
+ssVag
+p1760
+(dp1761
+Va
+I9
+sVe
+I180
+sVi
+I15
+sVè
+I1
+sVo
+I5
+sVn
+I70
+sVé
+I15
+sVr
+I15
+sVu
+I16
+ssVaf
+p1762
+(dp1763
+Vi
+I2
+sVé
+I3
+sVr
+I2
+sVt
+I2
+sVf
+I20
+ssVai
+p1764
+(dp1765
+V!
+I1
+sV
+I175
+sVb
+I10
+sVe
+I198
+sVd
+I21
+sVg
+I14
+sVi
+I1
+sV-
+I4
+sVm
+I44
+sVl
+I71
+sVn
+I184
+sVs
+I600
+sVr
+I187
+sVt
+I870
+sVx
+I3
+sV[
+I1
+sV.
+I3
+sV,
+I14
+sV?
+I1
+ssVah
+p1766
+(dp1767
+Va
+I1
+sV
+I1
+sVe
+I1
+sVi
+I1
+sVm
+I1
+sV,
+I1
+sVo
+I2
+sV!
+I1
+ssVak
+p1768
+(dp1769
+V
+I1
+sVe
+I5
+sVo
+I1
+ssVaj
+p1770
+(dp1771
+Ve
+I15
+sVo
+I4
+ssVam
+p1772
+(dp1773
+Va
+I99
+sV
+I5
+sVb
+I106
+sVe
+I62
+sVé
+I1
+sV)
+I1
+sVi
+I47
+sVè
+I6
+sVm
+I7
+sV,
+I5
+sVo
+I17
+sVn
+I3
+sVp
+I21
+sVu
+I3
+sV.
+I2
+sV:
+I1
+sV_
+I1
+ssVal
+p1774
+(dp1775
+V!
+I1
+sV
+I95
+sVp
+I4
+sV-
+I1
+sV,
+I16
+sV.
+I6
+sV;
+I5
+sV?
+I3
+sV_
+I1
+sVa
+I28
+sVc
+I4
+sVe
+I66
+sVd
+I1
+sVg
+I2
+sVf
+I2
+sVé
+I5
+sVh
+I23
+sVm
+I3
+sVl
+I120
+sVo
+I33
+sVi
+I39
+sVs
+I5
+sVr
+I2
+sVu
+I8
+sVt
+I15
+sVw
+I1
+sVè
+I18
+sVy
+I1
+ssVao
+p1776
+(dp1777
+Vû
+I2
+sVr
+I4
+sVs
+I1
+sVn
+I2
+ssVan
+p1778
+(dp1779
+V
+I34
+sV'
+I1
+sV)
+I1
+sV-
+I3
+sV,
+I8
+sV.
+I2
+sV;
+I1
+sVç
+I17
+sV[
+I1
+sV_
+I1
+sVa
+I31
+sVc
+I92
+sVe
+I2
+sVd
+I737
+sVg
+I235
+sVi
+I31
+sVk
+I1
+sVo
+I16
+sVn
+I33
+sVq
+I17
+sVé
+I7
+sVs
+I442
+sVu
+I6
+sVt
+I521
+sVv
+I1
+sVy
+I20
+ssVaq
+p1780
+(dp1781
+Vu
+I40
+ssVap
+p1782
+(dp1783
+Va
+I4
+sVé
+I5
+sVe
+I31
+sV
+I3
+sVi
+I51
+sVh
+I7
+sVl
+I3
+sVo
+I7
+sV.
+I1
+sVp
+I104
+sVr
+I45
+sVt
+I14
+ssVas
+p1784
+(dp1785
+V!
+I18
+sV
+I244
+sVc
+I4
+sVe
+I21
+sVi
+I6
+sVé
+I1
+sVh
+I1
+sVk
+I4
+sV,
+I34
+sV.
+I12
+sVp
+I3
+sVs
+I197
+sVu
+I1
+sVa
+I7
+sV[
+I1
+sV;
+I4
+sV?
+I1
+sVt
+I25
+ssVar
+p1786
+(dp1787
+V
+I177
+sV'
+I1
+sVp
+I3
+sV-
+I3
+sV,
+I10
+sV;
+I1
+sVg
+I33
+sVa
+I64
+sVc
+I56
+sVb
+I15
+sVe
+I115
+sVd
+I99
+sVç
+I4
+sVf
+I6
+sVi
+I40
+sVè
+I2
+sVk
+I6
+sVm
+I49
+sVl
+I65
+sVo
+I85
+sVn
+I14
+sVq
+I33
+sVé
+I8
+sVs
+I10
+sVr
+I78
+sVu
+I12
+sVt
+I240
+sVy
+I15
+ssVau
+p1788
+(dp1789
+V
+I240
+sV)
+I1
+sV-
+I8
+sV,
+I13
+sV.
+I5
+sV;
+I3
+sV:
+I1
+sV[
+I1
+sVc
+I49
+sVb
+I4
+sVd
+I20
+sVg
+I4
+sVf
+I3
+sVj
+I8
+sVm
+I16
+sVl
+I3
+sVn
+I3
+sVq
+I1
+sVp
+I21
+sVs
+I68
+sVr
+I41
+sVt
+I218
+sVv
+I37
+sVx
+I117
+ssVat
+p1790
+(dp1791
+Va
+I13
+sV
+I52
+sVe
+I89
+sV'
+I1
+sVi
+I136
+sVh
+I6
+sV,
+I11
+sVo
+I4
+sV.
+I2
+sVq
+I1
+sVé
+I1
+sVs
+I28
+sVr
+I55
+sVu
+I29
+sVt
+I66
+sVè
+I1
+sVy
+I1
+sV;
+I1
+sV:
+I3
+sV?
+I1
+ssVaw
+p1792
+(dp1793
+Va
+I4
+sVy
+I1
+sVs
+I2
+sV.
+I1
+ssVav
+p1794
+(dp1795
+Va
+I259
+sVe
+I250
+sVi
+I32
+sVo
+I102
+sVé
+I3
+sVr
+I3
+ssVay
+p1796
+(dp1797
+Va
+I25
+sV
+I30
+sVe
+I22
+sVi
+I1
+sV)
+I1
+sVm
+I1
+sVo
+I1
+sVé
+I5
+sVs
+I54
+ssVax
+p1798
+(dp1799
+Vi
+I3
+sV-
+I2
+sVe
+I2
+sV
+I1
+ssVaz
+p1800
+(dp1801
+Vi
+I1
+ssVAs
+p1802
+(dp1803
+Vi
+I2
+sV
+I3
+sVs
+I2
+sVc
+I1
+sVt
+I1
+ssVAu
+p1804
+(dp1805
+V
+I10
+sVs
+I8
+sVt
+I1
+sVg
+I2
+ssVa[
+p1806
+(dp1807
+V1
+I2
+ssVa]
+p1808
+(dp1809
+V
+I1
+sV.
+I1
+ssVa_
+p1810
+(dp1811
+V,
+I2
+ssVuè
+p1812
+(dp1813
+Vr
+I8
+sVd
+I1
+ssVa
+p1814
+(dp1815
+V"
+I1
+sVi
+I6
+sV5
+I2
+sVC
+I19
+sVB
+I4
+sVE
+I1
+sVD
+I2
+sVG
+I3
+sVF
+I2
+sVH
+I1
+sVM
+I5
+sVP
+I11
+sVS
+I1
+sVR
+I1
+sVU
+I1
+sVT
+I2
+sVV
+I4
+sV_
+I9
+sVa
+I22
+sVà
+I28
+sVc
+I95
+sVb
+I54
+sVe
+I26
+sVd
+I128
+sVg
+I33
+sVf
+I61
+sVé
+I13
+sVh
+I9
+sVj
+I21
+sVm
+I139
+sVl
+I61
+sVo
+I2
+sVn
+I36
+sVq
+I30
+sVp
+I182
+sVs
+I72
+sVr
+I63
+sVu
+I27
+sVt
+I67
+sVw
+I2
+sVv
+I114
+ssVa-
+p1816
+(dp1817
+Vc
+I1
+sVb
+I1
+sVf
+I10
+sVM
+I1
+sVC
+I2
+sVt
+I15
+ssVa,
+p1818
+(dp1819
+V
+I76
+sVc
+I1
+ssVa.
+p1820
+(dp1821
+V
+I10
+sVb
+I2
+sVt
+I2
+ssVN°
+p1822
+(dp1823
+V
+I2
+ssVa;
+p1824
+(dp1825
+V
+I9
+ssVa:
+p1826
+(dp1827
+V
+I7
+ssVa?
+p1828
+(dp1829
+V
+I1
+ssV"D
+p1830
+(dp1831
+Ve
+I1
+ssV-E
+p1832
+(dp1833
+Vs
+I1
+sVt
+I2
+sVd
+I1
+ssVt_
+p1834
+(dp1835
+V
+I1
+sV,
+I2
+sV.
+I1
+ssV-G
+p1836
+(dp1837
+Vr
+I2
+sVe
+I1
+ssV-A
+p1838
+(dp1839
+Vy
+I13
+sVh
+I2
+ssVt[
+p1840
+(dp1841
+V1
+I2
+sV2
+I1
+ssV-C
+p1842
+(dp1843
+Va
+I2
+sVe
+I1
+sV'
+I2
+sVo
+I1
+ssV-M
+p1844
+(dp1845
+Va
+I3
+sVé
+I1
+sVe
+I1
+sVo
+I3
+ssV-L
+p1846
+(dp1847
+Va
+I1
+sV'
+I2
+ssV-O
+p1848
+(dp1849
+Vù
+I1
+sVh
+I2
+sVu
+I1
+ssV-N
+p1850
+(dp1851
+Vo
+I3
+ssV-I
+p1852
+(dp1853
+VI
+I1
+sVS
+I1
+sVl
+I1
+ssV-H
+p1854
+(dp1855
+Vo
+I1
+ssV-J
+p1856
+(dp1857
+Ve
+I1
+sV.
+I2
+ssV-T
+p1858
+(dp1859
+VM
+I1
+sVu
+I1
+ssV-V
+p1860
+(dp1861
+Vo
+I2
+ssV-Q
+p1862
+(dp1863
+Vu
+I1
+ssV-P
+p1864
+(dp1865
+Vi
+I1
+sVo
+I1
+ssV-S
+p1866
+(dp1867
+Va
+I1
+sVu
+I1
+ssVzè
+p1868
+(dp1869
+Vl
+I1
+ssVt@
+p1870
+(dp1871
+Vp
+I2
+ssVgr
+p1872
+(dp1873
+Va
+I94
+sVâ
+I13
+sVe
+I17
+sVé
+I14
+sVè
+I2
+sVo
+I15
+sVi
+I5
+ssV-e
+p1874
+(dp1875
+Vt
+I1
+sVl
+I18
+sVn
+I3
+ssV-d
+p1876
+(dp1877
+Vi
+I7
+sVa
+I7
+sVe
+I9
+sV'
+I2
+ssV-f
+p1878
+(dp1879
+Vé
+I8
+sVa
+I2
+sVr
+I1
+sVo
+I3
+ssV-a
+p1880
+(dp1881
+Vi
+I1
+sVr
+I1
+sVu
+I1
+ssVtx
+p1882
+(dp1883
+Vt
+I6
+ssV-b
+p1884
+(dp1885
+Vu
+I1
+sVe
+I3
+sVo
+I2
+ssV-m
+p1886
+(dp1887
+Vê
+I21
+sVo
+I15
+ssV-l
+p1888
+(dp1889
+Va
+I3
+sVà
+I9
+sVe
+I10
+sVu
+I2
+ssVtt
+p1890
+(dp1891
+Va
+I13
+sVe
+I195
+sVp
+I5
+sVi
+I10
+sVè
+I3
+sVo
+I2
+sVé
+I7
+sVs
+I1
+sVr
+I43
+sVu
+I7
+ssVtu
+p1892
+(dp1893
+Va
+I11
+sV
+I21
+sVc
+I1
+sVe
+I31
+sVd
+I9
+sVg
+I12
+sVé
+I18
+sVm
+I4
+sVl
+I9
+sVn
+I15
+sVp
+I2
+sVs
+I5
+sVr
+I68
+sV,
+I1
+sV?
+I2
+ssVtr
+p1894
+(dp1895
+Va
+I145
+sVe
+I578
+sV'
+I3
+sVi
+I54
+sVè
+I64
+sVê
+I13
+sVo
+I173
+sVé
+I21
+sVu
+I9
+sVô
+I12
+sVy
+I3
+ssVts
+p1896
+(dp1897
+V!
+I2
+sV
+I173
+sV"
+I1
+sVk
+I3
+sV*
+I1
+sVm
+I3
+sV,
+I45
+sV.
+I20
+sV_
+I1
+sV;
+I14
+sV:
+I2
+sV[
+I1
+sV?
+I4
+ssVtp
+p1898
+(dp1899
+Vh
+I12
+sV:
+I6
+sV.
+I1
+ssV-j
+p1900
+(dp1901
+Ve
+I14
+ssV-u
+p1902
+(dp1903
+Vp
+I1
+ssVto
+p1904
+(dp1905
+V
+I65
+sVc
+I3
+sVb
+I3
+sVd
+I1
+sVf
+I2
+sVi
+I25
+sV-
+I7
+sVm
+I50
+sV,
+I2
+sVn
+I75
+sVp
+I2
+sVr
+I5
+sVu
+I401
+sVt
+I3
+sV:
+I2
+sVy
+I8
+sV.
+I3
+sV_
+I1
+sVl
+I3
+ssVtl
+p1906
+(dp1907
+Va
+I1
+sVy
+I5
+sVe
+I2
+ssV-v
+p1908
+(dp1909
+Vi
+I3
+sVa
+I1
+sVe
+I1
+sVo
+I61
+ssV-q
+p1910
+(dp1911
+Vu
+I3
+ssV-p
+p1912
+(dp1913
+Vè
+I2
+ssVth
+p1914
+(dp1915
+Va
+I22
+sV
+I20
+sVe
+I130
+sVi
+I44
+sVè
+I3
+sVm
+I1
+sV,
+I2
+sVo
+I18
+sV.
+I1
+sVé
+I23
+sVr
+I2
+sVu
+I1
+sV;
+I1
+sV:
+I1
+ssVti
+p1916
+(dp1917
+V
+I15
+sV,
+I2
+sV.
+I2
+sV;
+I1
+sVa
+I2
+sVc
+I22
+sVb
+I4
+sVe
+I72
+sVd
+I4
+sVg
+I8
+sVf
+I8
+sVé
+I16
+sVè
+I14
+sVm
+I24
+sVl
+I17
+sVo
+I185
+sVn
+I194
+sVq
+I26
+sVp
+I1
+sVs
+I39
+sVr
+I41
+sVu
+I1
+sVt
+I64
+sVv
+I20
+ssVte
+p1918
+(dp1919
+V!
+I10
+sV
+I403
+sV-
+I4
+sV,
+I100
+sV.
+I37
+sV;
+I21
+sV:
+I6
+sV?
+I7
+sV[
+I1
+sVa
+I37
+sVc
+I3
+sVe
+I3
+sVd
+I28
+sVf
+I1
+sVi
+I1
+sVm
+I72
+sVl
+I49
+sVn
+I216
+sVp
+I1
+sVs
+I196
+sVr
+I190
+sVu
+I87
+sVt
+I1
+sVy
+I1
+sVx
+I16
+sVz
+I14
+ssVtb
+p1920
+(dp1921
+Vo
+I1
+ssVtc
+p1922
+(dp1923
+V.
+I3
+ssVta
+p1924
+(dp1925
+V
+I53
+sV-
+I1
+sV,
+I10
+sV.
+I1
+sVc
+I20
+sVb
+I49
+sVd
+I1
+sVg
+I25
+sVf
+I2
+sVi
+I374
+sVh
+I1
+sVk
+I3
+sVm
+I3
+sVl
+I35
+sVn
+I115
+sVq
+I3
+sVp
+I8
+sVs
+I7
+sVr
+I8
+sVt
+I49
+sVv
+I2
+sVx
+I4
+ssV_é
+p1926
+(dp1927
+Vt
+I2
+ssVÈV
+p1928
+(dp1929
+VR
+I1
+ssVgy
+p1930
+(dp1931
+Vp
+I2
+ssVt?
+p1932
+(dp1933
+V
+I3
+sV-
+I1
+sV.
+I1
+ssVt:
+p1934
+(dp1935
+V
+I46
+sVM
+I1
+ssVt;
+p1936
+(dp1937
+V
+I66
+ssV--
+p1938
+(dp1939
+VA
+I2
+sV
+I1
+sVC
+I4
+sVE
+I2
+sVD
+I1
+sVI
+I2
+sV-
+I4
+sVJ
+I1
+sVM
+I3
+sV,
+I1
+sVO
+I4
+sVN
+I2
+sVQ
+I1
+sVP
+I1
+sVS
+I1
+sVV
+I2
+sVL
+I2
+ssV-,
+p1940
+(dp1941
+V
+I1
+ssV p
+p1942
+(dp1943
+Va
+I805
+sVâ
+I5
+sVe
+I337
+sVi
+I95
+sVè
+I36
+sVl
+I307
+sVo
+I434
+sVé
+I24
+sVr
+I416
+sVu
+I65
+sVh
+I41
+sVy
+I1
+sVû
+I4
+ssVt.
+p1944
+(dp1945
+V
+I116
+sV-
+I4
+ssVt/
+p1946
+(dp1947
+Vp
+I1
+sVd
+I2
+ssVt,
+p1948
+(dp1949
+V
+I265
+ssV-6
+p1950
+(dp1951
+V2
+I2
+ssV-1
+p1952
+(dp1953
+V
+I1
+sV2
+I3
+sV8
+I1
+ssV-3
+p1954
+(dp1955
+V1
+I1
+ssV-2
+p1956
+(dp1957
+V%
+I1
+ssVt'
+p1958
+(dp1959
+Va
+I4
+sVy
+I1
+sVs
+I2
+ssVrk
+p1960
+(dp1961
+Va
+I1
+sV
+I6
+sVe
+I1
+sVi
+I1
+sV-
+I1
+sV,
+I3
+sV.
+I2
+sVs
+I2
+ssVt"
+p1962
+(dp1963
+V)
+I1
+sV
+I1
+ssV-8
+p1964
+(dp1965
+V°
+I1
+ssVt
+p1966
+(dp1967
+Vê
+I22
+sVé
+I51
+sV#
+I1
+sV(
+I2
+sV1
+I4
+sV2
+I1
+sV4
+I1
+sV<
+I1
+sVâ
+I1
+sVA
+I4
+sVC
+I178
+sVD
+I3
+sVG
+I25
+sVI
+I4
+sVH
+I2
+sVJ
+I2
+sVM
+I56
+sVP
+I27
+sVR
+I1
+sVV
+I1
+sV_
+I6
+sVa
+I271
+sVà
+I160
+sVc
+I196
+sVb
+I97
+sVe
+I218
+sVd
+I603
+sVg
+I14
+sVf
+I92
+sVi
+I83
+sVh
+I36
+sVk
+I1
+sVj
+I77
+sVm
+I129
+sVl
+I488
+sVo
+I74
+sVn
+I70
+sVq
+I230
+sVp
+I336
+sVs
+I210
+sVr
+I80
+sVu
+I182
+sVt
+I157
+sVw
+I11
+sVv
+I91
+sVy
+I11
+sVô
+I1
+ssVt!
+p1968
+(dp1969
+V
+I7
+sV"
+I6
+ssVEM
+p1970
+(dp1971
+VA
+I1
+sVE
+I2
+sVN
+I1
+ssVga
+p1972
+(dp1973
+V
+I1
+sVc
+I1
+sVb
+I1
+sVg
+I24
+sVi
+I7
+sVl
+I44
+sVn
+I8
+sVr
+I74
+sVu
+I7
+sVt
+I3
+sV,
+I2
+ssVù
+p1974
+(dp1975
+Va
+I2
+sVj
+I7
+sVe
+I3
+sVd
+I1
+sVp
+I1
+sVi
+I8
+sVê
+I1
+sVm
+I2
+sVl
+I9
+sVn
+I5
+sVP
+I1
+sVs
+I4
+sVt
+I3
+ssV-É
+p1976
+(dp1977
+Vd
+I4
+ssV z
+p1978
+(dp1979
+Vè
+I1
+ssVù?
+p1980
+(dp1981
+V-
+I1
+ssVgl
+p1982
+(dp1983
+Va
+I13
+sVi
+I8
+sVe
+I10
+sVo
+I109
+ssV-à
+p1984
+(dp1985
+V-
+I6
+ssVtô
+p1986
+(dp1987
+Vm
+I1
+sVt
+I38
+ssV-ê
+p1988
+(dp1989
+Vt
+I9
+ssVtî
+p1990
+(dp1991
+Vm
+I1
+ssV at p
+p1992
+(dp1993
+Vo
+I2
+ssVtê
+p1994
+(dp1995
+Vt
+I16
+ssVtè
+p1996
+(dp1997
+Vr
+I19
+sVm
+I3
+ssVté
+p1998
+(dp1999
+V
+I173
+sVe
+I10
+sVm
+I7
+sV,
+I35
+sV.
+I14
+sVs
+I29
+sVr
+I5
+sV?
+I3
+sV;
+I4
+sV:
+I1
+sV_
+I3
+sVt
+I1
+ssVtâ
+p2000
+(dp2001
+Vc
+I1
+sVt
+I1
+ssVEF
+p2002
+(dp2003
+VÈ
+I1
+sVO
+I1
+ssV/N
+p2004
+(dp2005
+Vo
+I1
+ssVg[
+p2006
+(dp2007
+V2
+I1
+ssVS*
+p2008
+(dp2009
+V*
+I1
+sVV
+I1
+ssVS.
+p2010
+(dp2011
+V
+I5
+ssVS-
+p2012
+(dp2013
+VI
+I1
+ssVS,
+p2014
+(dp2015
+V
+I6
+ssVS"
+p2016
+(dp2017
+V.
+I1
+ssVS
+p2018
+(dp2019
+VA
+I1
+sVb
+I2
+sVE
+I2
+sVD
+I1
+sVF
+I2
+sVI
+I1
+sVL
+I1
+sVo
+I2
+sV3
+I1
+sVO
+I4
+ssVS'
+p2020
+(dp2021
+Vé
+I1
+ssVve
+p2022
+(dp2023
+Va
+I6
+sV
+I65
+sVc
+I128
+sVd
+I7
+sVi
+I8
+sVm
+I18
+sVl
+I21
+sVn
+I151
+sV.
+I2
+sVs
+I14
+sVr
+I174
+sVu
+I22
+sVt
+I1
+sVy
+I1
+sV;
+I1
+sVz
+I67
+sV,
+I7
+sV?
+I1
+ssVSy
+p2024
+(dp2025
+Vr
+I1
+ssVfû
+p2026
+(dp2027
+Vm
+I1
+sVt
+I11
+ssVSu
+p2028
+(dp2029
+Vi
+I1
+sVè
+I1
+sVr
+I14
+ssVSt
+p2030
+(dp2031
+Va
+I3
+sVu
+I1
+ssVSi
+p2032
+(dp2033
+Va
+I1
+sV
+I11
+sVe
+I1
+sVè
+I11
+sVn
+I3
+sVr
+I3
+ssVSo
+p2034
+(dp2035
+Vy
+I1
+sVm
+I1
+sVu
+I5
+sV,
+I1
+sVn
+I1
+ssVSm
+p2036
+(dp2037
+Vy
+I2
+sVa
+I6
+ssVSc
+p2038
+(dp2039
+Vu
+I1
+ssVfé
+p2040
+(dp2041
+V
+I3
+sV,
+I3
+sV.
+I2
+sVs
+I1
+sVr
+I13
+sVt
+I2
+sV;
+I1
+sV[
+I1
+sVl
+I2
+ssVSa
+p2042
+(dp2043
+V
+I6
+sVc
+I1
+sVi
+I7
+sVm
+I1
+sVl
+I2
+sVn
+I1
+sVr
+I1
+sVx
+I1
+ssVSe
+p2044
+(dp2045
+Vc
+I2
+sVr
+I2
+sVs
+I1
+ssVSS
+p2046
+(dp2047
+VI
+I1
+sV
+I2
+sVE
+I1
+ssVSQ
+p2048
+(dp2049
+VU
+I1
+ssVSU
+p2050
+(dp2051
+VC
+I1
+ssVST
+p2052
+(dp2053
+VA
+I2
+sVR
+I2
+ssVSI
+p2054
+(dp2055
+VB
+I1
+sVO
+I2
+ssVSO
+p2056
+(dp2057
+V-
+I1
+ssVSM
+p2058
+(dp2059
+VA
+I2
+sVE
+I2
+ssVSC
+p2060
+(dp2061
+VI
+I2
+sVL
+I1
+ssVSE
+p2062
+(dp2063
+VQ
+I1
+sV
+I2
+sVN
+I1
+sVM
+I1
+sV.
+I1
+ssVf
+p2064
+(dp2065
+V2
+I1
+sV4
+I1
+sVC
+I6
+sVF
+I2
+sVP
+I3
+sVR
+I1
+sVT
+I1
+sVV
+I1
+sVa
+I7
+sVà
+I1
+sVc
+I3
+sVe
+I1
+sVd
+I5
+sVi
+I4
+sVm
+I2
+sVo
+I4
+sVn
+I2
+sVp
+I1
+sVs
+I6
+sVr
+I2
+sVu
+I1
+sVt
+I32
+sVw
+I3
+sVy
+I17
+ssVf,
+p2066
+(dp2067
+V
+I7
+ssVf-
+p2068
+(dp2069
+Vt
+I1
+sVd
+I2
+ssVf.
+p2070
+(dp2071
+V
+I4
+sVf
+I2
+ssVôt
+p2072
+(dp2073
+Va
+I1
+sV
+I37
+sVe
+I22
+sVé
+I11
+sVo
+I2
+sVi
+I3
+sVr
+I4
+sV;
+I1
+ssVôp
+p2074
+(dp2075
+Vi
+I2
+ssVôn
+p2076
+(dp2077
+Vi
+I2
+sVa
+I1
+sVe
+I5
+sVé
+I8
+ssVâl
+p2078
+(dp2079
+Vi
+I1
+sVe
+I1
+ssVôl
+p2080
+(dp2081
+Ve
+I3
+ssVôm
+p2082
+(dp2083
+Ve
+I1
+ssVân
+p2084
+(dp2085
+Ve
+I1
+ssVfr
+p2086
+(dp2087
+Va
+I30
+sVe
+I17
+sVi
+I20
+sVè
+I26
+sV,
+I2
+sVo
+I30
+sVé
+I3
+sVu
+I5
+ssVfs
+p2088
+(dp2089
+V
+I5
+sV;
+I1
+sV,
+I3
+sV.
+I1
+ssVft
+p2090
+(dp2091
+Vy
+I1
+sVp
+I2
+sVe
+I4
+sVw
+I3
+ssVfu
+p2092
+(dp2093
+Vg
+I3
+sVi
+I9
+sVm
+I3
+sVl
+I2
+sVn
+I10
+sVs
+I41
+sVr
+I35
+sVt
+I68
+sVy
+I2
+ssVg;
+p2094
+(dp2095
+V
+I1
+ssV /
+p2096
+(dp2097
+Ve
+I1
+ssVfa
+p2098
+(dp2099
+V
+I2
+sVc
+I8
+sVb
+I2
+sVç
+I3
+sVi
+I197
+sVm
+I13
+sVl
+I12
+sVn
+I20
+sVs
+I8
+sVr
+I3
+sVu
+I56
+sVt
+I6
+sVv
+I5
+sV:
+I1
+ssVSé
+p2100
+(dp2101
+Vd
+I1
+sVn
+I1
+ssVfe
+p2102
+(dp2103
+Vc
+I8
+sVe
+I6
+sVm
+I32
+sVn
+I14
+sVs
+I52
+sVr
+I39
+sVu
+I15
+sVt
+I15
+sV:
+I1
+ssVff
+p2104
+(dp2105
+Va
+I16
+sV
+I1
+sVe
+I29
+sVi
+I24
+sV-
+I1
+sVl
+I8
+sVo
+I5
+sVé
+I6
+sVr
+I20
+sV_
+I1
+ssVfi
+p2106
+(dp2107
+Va
+I5
+sVc
+I29
+sVe
+I8
+sVd
+I10
+sVg
+I9
+sVf
+I2
+sVé
+I1
+sVè
+I2
+sVl
+I62
+sVn
+I59
+sVq
+I3
+sVs
+I7
+sVr
+I11
+sVt
+I76
+sVv
+I1
+sVx
+I2
+ssVfl
+p2108
+(dp2109
+Va
+I9
+sVe
+I14
+sVi
+I3
+sVè
+I2
+sVo
+I7
+sVé
+I12
+ssVfo
+p2110
+(dp2111
+Vi
+I47
+sVl
+I7
+sVn
+I37
+sVs
+I2
+sVr
+I122
+sVu
+I22
+ssVât
+p2112
+(dp2113
+Va
+I1
+sV
+I6
+sVe
+I32
+sVi
+I3
+sVo
+I3
+sV.
+I1
+sVé
+I1
+sVs
+I1
+sVr
+I11
+sV;
+I1
+ssVf_
+p2114
+(dp2115
+V,
+I1
+ssVô
+p2116
+(dp2117
+Vm
+I3
+ssVy)
+p2118
+(dp2119
+V
+I3
+ssVy*
+p2120
+(dp2121
+V
+I1
+ssVy,
+p2122
+(dp2123
+V
+I12
+ssVy.
+p2124
+(dp2125
+V
+I3
+ssVy
+p2126
+(dp2127
+Vj
+I1
+sV
+I1
+sVp
+I7
+sV(
+I2
+sV1
+I1
+sV2
+I1
+sVA
+I7
+sVC
+I4
+sVB
+I1
+sVD
+I1
+sVF
+I1
+sVI
+I2
+sVM
+I4
+sVL
+I3
+sVP
+I1
+sVS
+I2
+sVT
+I1
+sVV
+I5
+sVa
+I84
+sVc
+I8
+sVb
+I9
+sVe
+I19
+sVd
+I5
+sVg
+I4
+sVf
+I12
+sVé
+I4
+sVh
+I4
+sVê
+I2
+sVm
+I4
+sVl
+I1
+sVo
+I17
+sVn
+I6
+sVi
+I5
+sVs
+I8
+sVr
+I8
+sVu
+I3
+sVt
+I20
+sVw
+I3
+sVv
+I4
+sVy
+I3
+ssV 5
+p2128
+(dp2129
+V0
+I4
+sV2
+I1
+sV
+I1
+ssVg/
+p2130
+(dp2131
+Vp
+I1
+sVe
+I2
+sVg
+I1
+ssV ;
+p2132
+(dp2133
+V
+I1
+ssV24
+p2134
+(dp2135
+V0
+I1
+sV.
+I1
+ssV25
+p2136
+(dp2137
+V)
+I1
+sV0
+I1
+ssV26
+p2138
+(dp2139
+V
+I1
+sV.
+I1
+ssV27
+p2140
+(dp2141
+V
+I1
+sV,
+I1
+ssV20
+p2142
+(dp2143
+V0
+I15
+sV;
+I1
+sV%
+I1
+sV,
+I1
+sV
+I1
+ssV21
+p2144
+(dp2145
+V
+I1
+sV5
+I2
+ssV22
+p2146
+(dp2147
+V1
+I2
+sV
+I1
+ssV28
+p2148
+(dp2149
+V
+I1
+sV;
+I1
+ssV29
+p2150
+(dp2151
+V.
+I2
+ssV2:
+p2152
+(dp2153
+V
+I1
+ssV2;
+p2154
+(dp2155
+V
+I1
+ssV2%
+p2156
+(dp2157
+V
+I1
+ssV2
+p2158
+(dp2159
+Va
+I1
+sV(
+I1
+sVd
+I1
+sVD
+I1
+ssV2,
+p2160
+(dp2161
+V
+I6
+ssV2.
+p2162
+(dp2163
+V
+I5
+ssV2/
+p2164
+(dp2165
+V1
+I1
+ssV2*
+p2166
+(dp2167
+VE
+I1
+ssVyi
+p2168
+(dp2169
+Vn
+I3
+ssVym
+p2170
+(dp2171
+Va
+I1
+sVe
+I1
+ssVyl
+p2172
+(dp2173
+Ve
+I1
+sVl
+I1
+sVo
+I1
+sVv
+I4
+ssVyo
+p2174
+(dp2175
+Vm
+I1
+sVu
+I62
+sVn
+I3
+ssVyn
+p2176
+(dp2177
+Vx
+I1
+sVg
+I3
+ssVya
+p2178
+(dp2179
+V
+I7
+sVc
+I1
+sVb
+I7
+sVd
+I1
+sVg
+I25
+sVi
+I20
+sV,
+I2
+sVl
+I7
+sVu
+I11
+sVn
+I36
+ssV2]
+p2180
+(dp2181
+V
+I15
+sV;
+I2
+sV,
+I1
+sV.
+I6
+ssVyc
+p2182
+(dp2183
+Vl
+I3
+ssV2_
+p2184
+(dp2185
+V.
+I1
+ssVye
+p2186
+(dp2187
+Va
+I4
+sVe
+I2
+sVd
+I1
+sV,
+I2
+sVn
+I10
+sVr
+I16
+sVu
+I23
+sVt
+I1
+sVz
+I59
+ssVyd
+p2188
+(dp2189
+Ve
+I1
+ssVyg
+p2190
+(dp2191
+Vm
+I1
+ssVyz
+p2192
+(dp2193
+Ve
+I1
+ssVyp
+p2194
+(dp2195
+Va
+I1
+sVr
+I1
+sVe
+I2
+sVt
+I1
+sVo
+I2
+ssVys
+p2196
+(dp2197
+V
+I35
+sVi
+I20
+sV-
+I3
+sV,
+I8
+sV.
+I6
+sVs
+I1
+sVt
+I4
+sV;
+I2
+sV?
+I1
+ssVyr
+p2198
+(dp2199
+Va
+I2
+sVe
+I14
+sVi
+I11
+sVo
+I1
+sVn
+I2
+sVr
+I1
+ssVyt
+p2200
+(dp2201
+Vi
+I1
+ssVÀ
+p2202
+(dp2203
+VM
+I1
+ssVëm
+p2204
+(dp2205
+Ve
+I1
+ssVël
+p2206
+(dp2207
+V,
+I2
+ssVy_
+p2208
+(dp2209
+V,
+I1
+ssVët
+p2210
+(dp2211
+Ve
+I2
+ssVE,
+p2212
+(dp2213
+V
+I5
+ssVE.
+p2214
+(dp2215
+V
+I4
+ssVE!
+p2216
+(dp2217
+V*
+I1
+ssVE
+p2218
+(dp2219
+VA
+I1
+sVC
+I1
+sVE
+I1
+sVD
+I5
+sVG
+I1
+sVI
+I6
+sVJ
+I1
+sVM
+I2
+sVL
+I3
+sVO
+I4
+sVN
+I2
+sV1
+I1
+sVP
+I1
+sVS
+I2
+sVT
+I2
+sVV
+I4
+sVX
+I23
+ssVyé
+p2220
+(dp2221
+V
+I15
+sVe
+I2
+ssVEN
+p2222
+(dp2223
+V
+I3
+sVC
+I1
+sVB
+I8
+sVD
+I3
+sV,
+I1
+sVT
+I3
+ssVEI
+p2224
+(dp2225
+VT
+I1
+sVN
+I2
+ssVED
+p2226
+(dp2227
+VI
+I4
+sV
+I4
+sV,
+I1
+ssVEG
+p2228
+(dp2229
+VL
+I1
+ssVyâ
+p2230
+(dp2231
+Vt
+I1
+ssVEA
+p2232
+(dp2233
+VC
+I1
+sVD
+I1
+ssVEC
+p2234
+(dp2235
+V
+I1
+sVT
+I9
+ssVEB
+p2236
+(dp2237
+VC
+I2
+sVO
+I6
+ssVEY
+p2238
+(dp2239
+V
+I1
+ssVEX
+p2240
+(dp2241
+VP
+I1
+ssVEZ
+p2242
+(dp2243
+V
+I1
+ssVEU
+p2244
+(dp2245
+VC
+I2
+sVR
+I2
+sVV
+I2
+ssVET
+p2246
+(dp2247
+V
+I2
+sVC
+I1
+sVT
+I2
+ssVEV
+p2248
+(dp2249
+VE
+I2
+ssVEQ
+p2250
+(dp2251
+VU
+I2
+ssVES
+p2252
+(dp2253
+V
+I8
+sVS
+I2
+sV,
+I3
+sV.
+I1
+ssVER
+p2254
+(dp2255
+V
+I4
+sVC
+I1
+sVD
+I1
+sVG
+I8
+sVI
+I1
+sV*
+I1
+sV,
+I4
+sVO
+I1
+sVS
+I2
+sVT
+I1
+sVW
+I1
+ssVEm
+p2256
+(dp2257
+Vp
+I2
+ssVEl
+p2258
+(dp2259
+Ve
+I1
+sVd
+I17
+sVl
+I17
+ssVEn
+p2260
+(dp2261
+V
+I13
+sVs
+I3
+sVd
+I1
+sVf
+I14
+ssVEh
+p2262
+(dp2263
+V!
+I2
+sV
+I10
+ssVEd
+p2264
+(dp2265
+Vi
+I1
+sVo
+I1
+ssVEx
+p2266
+(dp2267
+Vc
+I1
+sVt
+I1
+ssVEu
+p2268
+(dp2269
+Vr
+I15
+ssVEt
+p2270
+(dp2271
+V
+I11
+sVr
+I1
+sVe
+I6
+sV,
+I1
+ssVEv
+p2272
+(dp2273
+Vh
+I1
+ssVEs
+p2274
+(dp2275
+Vp
+I18
+sVs
+I2
+sVt
+I7
+ssVEr
+p2276
+(dp2277
+Vz
+I1
+ssV ç
+p2278
+(dp2279
+Và
+I1
+ssVX.
+p2280
+(dp2281
+V
+I8
+ssVX,
+p2282
+(dp2283
+V
+I4
+ssVX
+p2284
+(dp2285
+Ve
+I1
+sVd
+I2
+ssVX;
+p2286
+(dp2287
+V
+I1
+ssVXI
+p2288
+(dp2289
+V
+I3
+sVI
+I14
+sV-
+I1
+sV,
+I10
+sV.
+I2
+sVV
+I4
+sVX
+I3
+ssVXL
+p2290
+(dp2291
+VI
+I1
+sV
+I1
+ssVXX
+p2292
+(dp2293
+VI
+I24
+sVX
+I12
+sV.
+I3
+sV,
+I3
+sVV
+I11
+ssVXP
+p2294
+(dp2295
+VR
+I1
+ssVXV
+p2296
+(dp2297
+VI
+I21
+sV
+I2
+sV,
+I1
+sV_
+I9
+sV.
+I3
+ssVk
+p2298
+(dp2299
+Va
+I1
+sVb
+I2
+sVe
+I1
+sVd
+I2
+sVf
+I1
+sVi
+I4
+sV(
+I3
+sVm
+I2
+sVl
+I1
+sVo
+I7
+sVp
+I1
+sVs
+I1
+sVr
+I1
+sVt
+I6
+sVw
+I1
+ssVk)
+p2300
+(dp2301
+V
+I1
+sV,
+I1
+ssVk.
+p2302
+(dp2303
+V
+I5
+ssVk-
+p2304
+(dp2305
+Vu
+I1
+sVd
+I1
+ssVk,
+p2306
+(dp2307
+V
+I13
+ssVk0
+p2308
+(dp2309
+V3
+I2
+sV2
+I1
+ssV7]
+p2310
+(dp2311
+V
+I2
+ssV7
+p2312
+(dp2313
+VA
+I1
+sVd
+I1
+ssV7.
+p2314
+(dp2315
+V
+I2
+ssV7,
+p2316
+(dp2317
+V
+I3
+ssV77
+p2318
+(dp2319
+V8
+I1
+sV,
+I1
+sV7
+I1
+ssV76
+p2320
+(dp2321
+V1
+I6
+sV0
+I1
+sV3
+I2
+sV2
+I1
+sV4
+I2
+sV7
+I1
+sV6
+I4
+sV9
+I1
+sV8
+I2
+ssV75
+p2322
+(dp2323
+V9
+I7
+sV5
+I1
+sV7
+I2
+sV6
+I4
+ssV73
+p2324
+(dp2325
+V9
+I3
+sV8
+I1
+sV6
+I1
+sV0
+I3
+ssV72
+p2326
+(dp2327
+V,
+I1
+ssV71
+p2328
+(dp2329
+V1
+I1
+sV8
+I1
+sV*
+I1
+sV
+I1
+ssV70
+p2330
+(dp2331
+V;
+I1
+sV2
+I1
+sV5
+I1
+sV.
+I1
+ssVk[
+p2332
+(dp2333
+V3
+I1
+ssV7;
+p2334
+(dp2335
+V
+I2
+ssV7:
+p2336
+(dp2337
+V
+I2
+ssV79
+p2338
+(dp2339
+V6
+I1
+ssV78
+p2340
+(dp2341
+V9
+I1
+sV2
+I1
+sV5
+I1
+sV,
+I1
+ssVka
+p2342
+(dp2343
+V
+I1
+sV,
+I2
+sVï
+I1
+sVn
+I1
+ssVke
+p2344
+(dp2345
+V
+I6
+sVs
+I1
+sVe
+I1
+sVt
+I1
+ssVkd
+p2346
+(dp2347
+Vo
+I1
+ssVki
+p2348
+(dp2349
+V
+I2
+sV[
+I1
+sV,
+I1
+sVn
+I1
+ssVkh
+p2350
+(dp2351
+V
+I3
+sV;
+I3
+sV,
+I3
+sV?
+I1
+sV.
+I1
+ssVko
+p2352
+(dp2353
+Vt
+I1
+ssVkn
+p2354
+(dp2355
+Vo
+I5
+ssVkl
+p2356
+(dp2357
+Va
+I1
+ssVks
+p2358
+(dp2359
+V!
+I1
+sV
+I14
+sV,
+I4
+sV/
+I1
+sV.
+I1
+sV;
+I1
+ssVky
+p2360
+(dp2361
+V,
+I2
+ssVJE
+p2362
+(dp2363
+VC
+I8
+ssVJA
+p2364
+(dp2365
+VC
+I1
+ssVJu
+p2366
+(dp2367
+Vi
+I17
+sVs
+I1
+sVl
+I1
+sVg
+I1
+ssVJo
+p2368
+(dp2369
+Va
+I1
+sVu
+I5
+sVï
+I1
+ssVJe
+p2370
+(dp2371
+Va
+I2
+sV
+I101
+sVr
+I1
+ssVJa
+p2372
+(dp2373
+Vp
+I3
+sVc
+I9
+sVm
+I2
+sVn
+I3
+ssVJ.
+p2374
+(dp2375
+V
+I4
+sV-
+I2
+ssVJ'
+p2376
+(dp2377
+Va
+I22
+sVé
+I4
+sVi
+I1
+sVy
+I1
+ssVJé
+p2378
+(dp2379
+Vh
+I1
+sVc
+I1
+sVr
+I1
+ssV]?
+p2380
+(dp2381
+V
+I2
+ssV];
+p2382
+(dp2383
+V
+I11
+ssV]:
+p2384
+(dp2385
+V
+I1
+ssV]
+p2386
+(dp2387
+V
+I6
+sV6
+I2
+sVA
+I4
+sVC
+I4
+sVD
+I3
+sVF
+I2
+sVI
+I2
+sVH
+I1
+sVM
+I2
+sVL
+I11
+sVQ
+I1
+sVS
+I6
+sVR
+I1
+sVT
+I1
+sVV
+I11
+sVY
+I1
+sV_
+I2
+sVa
+I4
+sVd
+I2
+sVé
+I1
+sVo
+I1
+sVq
+I1
+sVp
+I1
+ssV],
+p2388
+(dp2389
+V
+I12
+ssV].
+p2390
+(dp2391
+V
+I16
+ssV);
+p2392
+(dp2393
+V
+I1
+ssV):
+p2394
+(dp2395
+V
+I2
+ssV)(
+p2396
+(dp2397
+V3
+I2
+ssV),
+p2398
+(dp2399
+V
+I6
+ssV).
+p2400
+(dp2401
+V
+I4
+ssV)
+p2402
+(dp2403
+Va
+I1
+sVc
+I2
+sVe
+I1
+sVd
+I1
+sVo
+I1
+sV2
+I1
+sVt
+I1
+sVy
+I2
+ssVpr
+p2404
+(dp2405
+Va
+I4
+sVe
+I108
+sVi
+I156
+sVè
+I79
+sVê
+I18
+sVo
+I176
+sVî
+I1
+sVé
+I76
+sVu
+I8
+ssVps
+p2406
+(dp2407
+V
+I54
+sVi
+I1
+sVh
+I1
+sV,
+I14
+sV.
+I6
+sV;
+I5
+sV_
+I1
+ssVpp
+p2408
+(dp2409
+Va
+I17
+sVe
+I28
+sVé
+I6
+sVl
+I10
+sVo
+I17
+sVi
+I1
+sVr
+I39
+sVu
+I2
+ssVpt
+p2410
+(dp2411
+Va
+I4
+sV
+I9
+sVe
+I14
+sVi
+I25
+sV-
+I1
+sV,
+I1
+sV.
+I1
+sVé
+I4
+sVs
+I1
+ssVpu
+p2412
+(dp2413
+V
+I10
+sVc
+I1
+sVb
+I16
+sVd
+I1
+sVi
+I33
+sVl
+I7
+sV.
+I1
+sVp
+I1
+sVs
+I5
+sVr
+I6
+sVt
+I20
+sVy
+I1
+sVn
+I5
+ssVpy
+p2414
+(dp2415
+V
+I4
+sVr
+I10
+sVg
+I1
+sV.
+I1
+ssVpa
+p2416
+(dp2417
+V
+I2
+sVc
+I2
+sVd
+I5
+sVg
+I64
+sVi
+I24
+sVv
+I1
+sVl
+I20
+sVn
+I9
+sVp
+I12
+sVs
+I285
+sVr
+I402
+sVu
+I17
+sVt
+I33
+sVî
+I1
+sVy
+I66
+sV.
+I1
+ssVpg
+p2418
+(dp2419
+V
+I1
+ssVpe
+p2420
+(dp2421
+Va
+I6
+sV
+I24
+sVc
+I22
+sVz
+I2
+sVi
+I23
+sV:
+I1
+sVl
+I20
+sVo
+I3
+sVn
+I86
+sVs
+I16
+sVr
+I164
+sVu
+I112
+sVt
+I39
+sV;
+I3
+sV.
+I6
+sV,
+I9
+sV_
+I2
+ssVph
+p2422
+(dp2423
+Va
+I15
+sVe
+I21
+sVé
+I1
+sVè
+I1
+sVi
+I29
+sVr
+I1
+sVt
+I3
+sVy
+I20
+ssVpi
+p2424
+(dp2425
+Va
+I15
+sVc
+I5
+sVe
+I44
+sVd
+I6
+sVg
+I2
+sVè
+I15
+sVl
+I6
+sVn
+I3
+sVq
+I6
+sVs
+I7
+sVr
+I21
+sVt
+I67
+sV,
+I1
+ssVpo
+p2426
+(dp2427
+Vc
+I4
+sVb
+I2
+sVp
+I1
+sVi
+I65
+sVè
+I3
+sVë
+I3
+sVm
+I4
+sVl
+I19
+sVn
+I75
+sVq
+I1
+sVé
+I1
+sVs
+I62
+sVr
+I79
+sVu
+I299
+sVt
+I6
+ssVpl
+p2428
+(dp2429
+Va
+I86
+sVe
+I60
+sVi
+I34
+sVè
+I1
+sVo
+I5
+sVu
+I210
+sVy
+I2
+ssVpm
+p2430
+(dp2431
+Ve
+I2
+ssVp:
+p2432
+(dp2433
+V/
+I6
+ssVp;
+p2434
+(dp2435
+V
+I1
+ssVp
+p2436
+(dp2437
+Va
+I1
+sVà
+I3
+sVb
+I1
+sVe
+I2
+sVd
+I20
+sVl
+I3
+sVo
+I1
+sVq
+I1
+sVp
+I5
+sVs
+I5
+sVr
+I2
+sVt
+I1
+sVv
+I3
+ssVp!
+p2438
+(dp2439
+V
+I1
+ssVp*
+p2440
+(dp2441
+V*
+I2
+ssVp.
+p2442
+(dp2443
+Vi
+I1
+sV
+I3
+ssVp,
+p2444
+(dp2445
+V
+I6
+ssVpû
+p2446
+(dp2447
+Vt
+I4
+ssVpâ
+p2448
+(dp2449
+Vm
+I1
+sVt
+I2
+sVl
+I2
+ssVpç
+p2450
+(dp2451
+Vo
+I3
+ssVpê
+p2452
+(dp2453
+Vc
+I6
+sVt
+I3
+ssVpè
+p2454
+(dp2455
+Vc
+I10
+sVr
+I41
+ssVpé
+p2456
+(dp2457
+Va
+I1
+sV
+I10
+sVc
+I2
+sVe
+I18
+sVd
+I3
+sVf
+I2
+sV.
+I2
+sVs
+I6
+sVr
+I47
+sV!
+I1
+sVt
+I5
+ssV<h
+p2458
+(dp2459
+Va
+I1
+ssV(*
+p2460
+(dp2461
+V)
+I1
+sV
+I1
+ssVO.
+p2462
+(dp2463
+V
+I1
+ssVO-
+p2464
+(dp2465
+VL
+I1
+ssVçû
+p2466
+(dp2467
+Vt
+I1
+ssVO
+p2468
+(dp2469
+Vc
+I3
+sVI
+I1
+sVm
+I2
+sVO
+I1
+sVP
+I3
+sVS
+I1
+sVR
+I1
+sVT
+I1
+sVW
+I1
+sVY
+I2
+ssVO?
+p2470
+(dp2471
+V
+I1
+ssVçà
+p2472
+(dp2473
+V,
+I1
+ssVgt
+p2474
+(dp2475
+Va
+I1
+sV
+I20
+sVe
+I2
+sV-
+I5
+sV,
+I1
+sVo
+I1
+sVs
+I3
+ssVgs
+p2476
+(dp2477
+V,
+I4
+ssVOn
+p2478
+(dp2479
+V
+I45
+sVl
+I1
+ssVOk
+p2480
+(dp2481
+Vl
+I1
+ssVbâ
+p2482
+(dp2483
+Vt
+I6
+ssVOh
+p2484
+(dp2485
+V!
+I7
+sV
+I1
+sVi
+I1
+ssVOe
+p2486
+(dp2487
+Vu
+I2
+sVd
+I1
+ssVbè
+p2488
+(dp2489
+Vr
+I1
+ssVbé
+p2490
+(dp2491
+V
+I16
+sVc
+I1
+sVi
+I2
+sV,
+I6
+sVn
+I5
+sV.
+I1
+sVr
+I1
+sV;
+I2
+sV:
+I1
+ssVbê
+p2492
+(dp2493
+Vt
+I1
+ssVOx
+p2494
+(dp2495
+Vf
+I1
+ssVOv
+p2496
+(dp2497
+Vi
+I1
+ssVOu
+p2498
+(dp2499
+Vi
+I15
+sVa
+I1
+sVr
+I1
+ssVOt
+p2500
+(dp2501
+Vh
+I1
+sVe
+I1
+ssVOs
+p2502
+(dp2503
+Ve
+I1
+ssVOr
+p2504
+(dp2505
+V
+I3
+sVe
+I9
+ssVOp
+p2506
+(dp2507
+Vt
+I1
+sVo
+I1
+ssVOO
+p2508
+(dp2509
+VK
+I6
+ssVON
+p2510
+(dp2511
+V
+I2
+sVE
+I1
+sV'
+I1
+sV,
+I2
+sVS
+I6
+sVT
+I1
+ssVOM
+p2512
+(dp2513
+VA
+I3
+sVE
+I3
+ssVOL
+p2514
+(dp2515
+VT
+I2
+ssVOK
+p2516
+(dp2517
+V
+I3
+sVS
+I3
+ssVOJ
+p2518
+(dp2519
+VE
+I8
+ssVOI
+p2520
+(dp2521
+VR
+I1
+ssVOF
+p2522
+(dp2523
+V
+I6
+ssVOE
+p2524
+(dp2525
+VU
+I2
+ssVOC
+p2526
+(dp2527
+VH
+I1
+sVR
+I1
+sVT
+I2
+ssVOB
+p2528
+(dp2529
+V,
+I1
+ssVOV
+p2530
+(dp2531
+VI
+I1
+ssVOU
+p2532
+(dp2533
+V
+I7
+sVR
+I1
+sVT
+I1
+sVV
+I1
+ssVOT
+p2534
+(dp2535
+V
+I2
+sVE
+I1
+sVI
+I1
+sVH
+I2
+sV,
+I1
+sV.
+I2
+ssVOS
+p2536
+(dp2537
+VS
+I1
+sVE
+I1
+ssVOR
+p2538
+(dp2539
+V
+I15
+sVS
+I1
+sVE
+I1
+ssVOP
+p2540
+(dp2541
+VT
+I2
+ssVçu
+p2542
+(dp2543
+V
+I8
+sVe
+I1
+sV,
+I1
+sVs
+I3
+sVr
+I2
+sVt
+I12
+ssVb
+p2544
+(dp2545
+Vs
+I2
+sVd
+I1
+ssVb,
+p2546
+(dp2547
+V
+I1
+ssVb.
+p2548
+(dp2549
+V
+I1
+ssVb/
+p2550
+(dp2551
+Vd
+I1
+ssVça
+p2552
+(dp2553
+Vi
+I17
+sV
+I4
+sVt
+I4
+sVn
+I3
+ssVço
+p2554
+(dp2555
+Vi
+I7
+sVn
+I18
+ssVçn
+p2556
+(dp2557
+V
+I1
+ssVbe
+p2558
+(dp2559
+Va
+I71
+sV
+I31
+sVc
+I3
+sVe
+I2
+sVd
+I1
+sVg
+I3
+sVf
+I3
+sVi
+I1
+sVl
+I43
+sVn
+I3
+sVs
+I14
+sVr
+I63
+sVt
+I3
+sV:
+I1
+sV,
+I5
+ssVba
+p2560
+(dp2561
+V
+I5
+sVc
+I2
+sVb
+I4
+sVg
+I9
+sVi
+I26
+sVm
+I1
+sVl
+I8
+sVï
+I3
+sVn
+I17
+sVp
+I12
+sVs
+I15
+sVr
+I113
+sVu
+I2
+sVt
+I28
+sVy
+I1
+ssVbb
+p2562
+(dp2563
+Va
+I3
+sVé
+I25
+ssVbl
+p2564
+(dp2565
+Vi
+I41
+sVè
+I3
+sVé
+I5
+sVe
+I226
+sVa
+I27
+ssVbm
+p2566
+(dp2567
+Ve
+I2
+ssVbn
+p2568
+(dp2569
+Vi
+I2
+sVf
+I2
+ssVbo
+p2570
+(dp2571
+V!
+I1
+sV
+I38
+sV,
+I25
+sV:
+I2
+sVe
+I3
+sVi
+I11
+sVm
+I6
+sVl
+I2
+sVo
+I4
+sVn
+I97
+sVr
+I31
+sVu
+I53
+sVt
+I1
+sVa
+I1
+sVv
+I1
+sVx
+I2
+sV;
+I9
+sV.
+I10
+sVï
+I2
+ssVbh
+p2572
+(dp2573
+Vo
+I1
+ssVbi
+p2574
+(dp2575
+Va
+I1
+sV
+I1
+sVb
+I4
+sVe
+I154
+sVè
+I1
+sVj
+I1
+sVl
+I16
+sVn
+I7
+sVs
+I4
+sVr
+I2
+sVt
+I24
+sVz
+I2
+ssVbj
+p2576
+(dp2577
+Vu
+I1
+sVe
+I4
+ssVbk
+p2578
+(dp2579
+V-
+I1
+ssVbt
+p2580
+(dp2581
+Vi
+I3
+sVe
+I1
+ssVbu
+p2582
+(dp2583
+Ve
+I1
+sVf
+I1
+sVi
+I1
+sVl
+I10
+sVn
+I1
+sVé
+I1
+sVs
+I1
+sVt
+I20
+sVv
+I3
+ssVbv
+p2584
+(dp2585
+Vi
+I1
+ssVOù
+p2586
+(dp2587
+V
+I2
+sV?
+I1
+ssVbs
+p2588
+(dp2589
+Va
+I1
+sVc
+I4
+sVe
+I3
+sVi
+I3
+sVo
+I8
+sVu
+I1
+sVt
+I1
+ssVby
+p2590
+(dp2591
+V
+I27
+sVs
+I1
+sVl
+I1
+ssV~)
+p2592
+(dp2593
+V,
+I1
+ssVTê
+p2594
+(dp2595
+Vt
+I1
+ssVTé
+p2596
+(dp2597
+Vt
+I1
+ssV.)
+p2598
+(dp2599
+V
+I2
+ssVu?
+p2600
+(dp2601
+V
+I5
+ssV.,
+p2602
+(dp2603
+V
+I1
+ssV.-
+p2604
+(dp2605
+VJ
+I2
+sV-
+I17
+ssVu;
+p2606
+(dp2607
+V
+I9
+ssVu:
+p2608
+(dp2609
+V
+I2
+ssV.
+p2610
+(dp2611
+VA
+I1
+sV
+I914
+sVC
+I1
+sVB
+I2
+sVI
+I5
+sVD
+I3
+sVS
+I2
+sVH
+I4
+sVM
+I1
+sVL
+I1
+sVl
+I7
+sVP
+I2
+sVs
+I1
+sVV
+I3
+sVN
+I1
+sVd
+I4
+ssV."
+p2612
+(dp2613
+V
+I1
+ssVu-
+p2614
+(dp2615
+Vp
+I1
+sVr
+I1
+sVM
+I1
+sVd
+I4
+sVf
+I1
+ssVu,
+p2616
+(dp2617
+V
+I44
+ssVu.
+p2618
+(dp2619
+V
+I15
+sV-
+I1
+ssVu)
+p2620
+(dp2621
+V.
+I1
+ssV.0
+p2622
+(dp2623
+V2
+I1
+ssVu'
+p2624
+(dp2625
+Va
+I23
+sVà
+I20
+sVe
+I46
+sVç
+I1
+sVi
+I169
+sVo
+I75
+sVu
+I29
+sVy
+I1
+ssVu!
+p2626
+(dp2627
+V)
+I1
+sV
+I3
+ssVu
+p2628
+(dp2629
+Vi
+I2
+sV'
+I1
+sV1
+I5
+sV2
+I2
+sV5
+I1
+sV6
+I1
+sVC
+I1
+sVE
+I1
+sVD
+I4
+sVI
+I1
+sVH
+I1
+sVJ
+I5
+sVM
+I4
+sVN
+I1
+sVP
+I7
+sVS
+I9
+sVT
+I3
+sV_
+I10
+sVa
+I25
+sVà
+I16
+sVc
+I69
+sVb
+I41
+sVe
+I21
+sVd
+I142
+sVg
+I9
+sVf
+I14
+sVé
+I1
+sVh
+I7
+sVk
+I2
+sVj
+I14
+sVm
+I71
+sVl
+I49
+sVo
+I2
+sVn
+I18
+sVq
+I33
+sVp
+I96
+sVs
+I50
+sVr
+I32
+sVu
+I7
+sVt
+I23
+sVw
+I8
+sVv
+I20
+sVy
+I1
+ssVu_
+p2630
+(dp2631
+V
+I1
+ssVu[
+p2632
+(dp2633
+V1
+I1
+ssV.A
+p2634
+(dp2635
+Vh
+I1
+sVr
+I1
+ssV.C
+p2636
+(dp2637
+Vr
+I1
+ssV.]
+p2638
+(dp2639
+V
+I2
+ssV.h
+p2640
+(dp2641
+Vt
+I2
+ssV.i
+p2642
+(dp2643
+Vb
+I2
+ssVuy
+p2644
+(dp2645
+Va
+I5
+sVé
+I4
+sVe
+I5
+ssVux
+p2646
+(dp2647
+V!
+I1
+sV
+I345
+sV-
+I7
+sV,
+I34
+sV.
+I21
+sV_
+I1
+sV;
+I13
+sV:
+I1
+sV[
+I1
+sV?
+I1
+ssV.n
+p2648
+(dp2649
+Ve
+I4
+ssVuz
+p2650
+(dp2651
+Va
+I4
+sVe
+I9
+ssVut
+p2652
+(dp2653
+Va
+I36
+sV
+I400
+sVb
+I1
+sVe
+I180
+sVi
+I27
+sVh
+I10
+sV-
+I22
+sV,
+I19
+sVo
+I39
+sV.
+I5
+sVé
+I15
+sVs
+I1
+sVr
+I109
+sVu
+I6
+sVt
+I1
+sVè
+I5
+sV;
+I4
+sV:
+I1
+sV?
+I1
+sVô
+I3
+ssV.b
+p2654
+(dp2655
+Vn
+I2
+ssVuv
+p2656
+(dp2657
+Va
+I81
+sVâ
+I1
+sVe
+I131
+sVé
+I22
+sVè
+I5
+sVo
+I2
+sVi
+I6
+sVr
+I46
+ssVuq
+p2658
+(dp2659
+Vu
+I11
+ssVup
+p2660
+(dp2661
+Va
+I11
+sV
+I33
+sV!
+I1
+sVe
+I36
+sVç
+I3
+sVp
+I4
+sVé
+I21
+sVè
+I1
+sVl
+I8
+sVo
+I1
+sV,
+I4
+sVi
+I10
+sVs
+I22
+sVr
+I18
+sVu
+I1
+sVt
+I1
+sVh
+I3
+sV;
+I1
+sV.
+I1
+ssV.f
+p2662
+(dp2663
+Vr
+I2
+ssVur
+p2664
+(dp2665
+V!
+I2
+sV
+I677
+sVp
+I14
+sV-
+I5
+sV,
+I80
+sV.
+I21
+sV;
+I17
+sV:
+I2
+sV?
+I4
+sV_
+I3
+sVa
+I85
+sVc
+I20
+sVb
+I2
+sVe
+I209
+sVd
+I28
+sVg
+I12
+sVf
+I1
+sVi
+I47
+sVè
+I2
+sVm
+I4
+sVl
+I2
+sVo
+I22
+sVn
+I39
+sVq
+I18
+sVé
+I11
+sVs
+I275
+sVr
+I29
+sVu
+I14
+sVt
+I23
+sVv
+I4
+ssVum
+p2666
+(dp2667
+Va
+I9
+sV
+I4
+sVb
+I8
+sVe
+I39
+sVé
+I3
+sVè
+I2
+sV,
+I2
+sV.
+I2
+sVi
+I4
+sVu
+I1
+sVô
+I4
+sV:
+I1
+sV_
+I2
+ssVul
+p2668
+(dp2669
+Va
+I21
+sV
+I9
+sVc
+I1
+sVâ
+I3
+sVe
+I61
+sVd
+I6
+sVg
+I31
+sVé
+I7
+sVm
+I2
+sVl
+I6
+sVo
+I5
+sV,
+I1
+sVi
+I10
+sVs
+I6
+sVu
+I17
+sVt
+I23
+sVy
+I1
+sVû
+I3
+sV.
+I1
+ssVuo
+p2670
+(dp2671
+Vi
+I63
+sVs
+I1
+sVn
+I3
+ssVun
+p2672
+(dp2673
+Va
+I1
+sV
+I533
+sVc
+I5
+sVe
+I321
+sVd
+I36
+sVé
+I129
+sV-
+I1
+sVl
+I1
+sV.
+I2
+sVi
+I24
+sVs
+I8
+sVu
+I5
+sVt
+I4
+sV;
+I1
+sV,
+I1
+ssVui
+p2674
+(dp2675
+V!
+I1
+sV
+I553
+sVc
+I2
+sVe
+I9
+sVf
+I17
+sVé
+I5
+sVè
+I4
+sV-
+I14
+sVl
+I25
+sV.
+I9
+sVp
+I5
+sVs
+I155
+sVr
+I23
+sVt
+I119
+sVv
+I21
+sV[
+I1
+sV;
+I2
+sVn
+I31
+sV,
+I35
+sV?
+I2
+ssVuh
+p2676
+(dp2677
+Va
+I3
+ssVuj
+p2678
+(dp2679
+Ve
+I5
+sVo
+I57
+ssVue
+p2680
+(dp2681
+V!
+I2
+sV
+I645
+sVr
+I64
+sV:
+I1
+sVf
+I12
+sVi
+I7
+sV-
+I2
+sV?
+I2
+sVm
+I3
+sV,
+I28
+sVo
+I3
+sV.
+I15
+sVs
+I117
+sVn
+I10
+sVu
+I19
+sVt
+I42
+sV;
+I10
+sVz
+I7
+sV_
+I4
+sVl
+I180
+ssVud
+p2682
+(dp2683
+Va
+I1
+sV
+I1
+sVe
+I25
+sVi
+I16
+sV,
+I1
+sVé
+I1
+sVr
+I23
+sV:
+I1
+ssVug
+p2684
+(dp2685
+Va
+I12
+sVe
+I23
+sVg
+I1
+sVi
+I8
+sVh
+I3
+sVm
+I3
+sVé
+I2
+sVu
+I5
+ssVuf
+p2686
+(dp2687
+Va
+I1
+sV
+I6
+sVs
+I1
+sVr
+I2
+sVf
+I19
+ssV.t
+p2688
+(dp2689
+Vx
+I6
+ssVuc
+p2690
+(dp2691
+Va
+I1
+sVc
+I2
+sVe
+I14
+sVi
+I8
+sVh
+I37
+sVk
+I1
+sVo
+I27
+sVr
+I4
+sVu
+I15
+sVt
+I7
+ssVub
+p2692
+(dp2693
+Va
+I1
+sVe
+I2
+sVi
+I4
+sVj
+I1
+sVm
+I2
+sVl
+I34
+sVo
+I2
+sVs
+I4
+sVt
+I1
+sV/
+I1
+ssVTy
+p2694
+(dp2695
+Vr
+I1
+ssVTu
+p2696
+(dp2697
+V
+I4
+sVc
+I2
+sVr
+I12
+sVn
+I1
+ssVTr
+p2698
+(dp2699
+Va
+I8
+sVi
+I3
+sVè
+I1
+sVo
+I2
+sVé
+I2
+sVu
+I1
+ssVTo
+p2700
+(dp2701
+V
+I3
+sVu
+I14
+ssVTh
+p2702
+(dp2703
+Ve
+I21
+sVi
+I7
+sVo
+I4
+sVé
+I4
+sVr
+I1
+sVu
+I12
+ssVTi
+p2704
+(dp2705
+Vm
+I1
+sVt
+I1
+ssVTe
+p2706
+(dp2707
+Vx
+I2
+sVn
+I2
+sVm
+I1
+sVl
+I3
+sV
+I2
+ssVTa
+p2708
+(dp2709
+Vs
+I2
+sVn
+I3
+ssVA
+p2710
+(dp2711
+Vc
+I2
+sVp
+I9
+sVm
+I1
+sVl
+I1
+sVP
+I2
+sVs
+I1
+sVT
+I1
+ssVgg
+p2712
+(dp2713
+Ve
+I1
+ssVTY
+p2714
+(dp2715
+V
+I4
+sV;
+I1
+sV,
+I1
+ssVTT
+p2716
+(dp2717
+VE
+I2
+sVO
+I1
+ssVTR
+p2718
+(dp2719
+VA
+I2
+sVI
+I2
+sVE
+I30
+sVO
+I1
+ssVTS
+p2720
+(dp2721
+V,
+I1
+ssVA.
+p2722
+(dp2723
+V
+I1
+ssVTN
+p2724
+(dp2725
+VE
+I1
+ssVTO
+p2726
+(dp2727
+VI
+I1
+sV
+I6
+sVM
+I3
+sV?
+I1
+ssV.»
+p2728
+(dp2729
+V
+I2
+ssVTH
+p2730
+(dp2731
+VI
+I3
+sVE
+I7
+ssVTI
+p2732
+(dp2733
+VA
+I1
+sVC
+I2
+sVE
+I2
+sVM
+I2
+sVO
+I4
+sVS
+I1
+sVV
+I1
+ssVTE
+p2734
+(dp2735
+VS
+I1
+sVR
+I2
+sVU
+I2
+sVD
+I3
+sVN
+I8
+ssVTC
+p2736
+(dp2737
+V.
+I1
+ssVTA
+p2738
+(dp2739
+VI
+I2
+sVB
+I1
+sVR
+I2
+sVL
+I1
+ssVAC
+p2740
+(dp2741
+VH
+I1
+sVE
+I1
+sVT
+I1
+sVO
+I1
+ssVAB
+p2742
+(dp2743
+VI
+I2
+sVR
+I1
+sVO
+I1
+ssVAD
+p2744
+(dp2745
+V
+I1
+sVU
+I1
+sVD
+I1
+sVE
+I1
+ssVAG
+p2746
+(dp2747
+VE
+I3
+ssVAI
+p2748
+(dp2749
+VR
+I3
+sVM
+I1
+sVN
+I2
+ssVAH
+p2750
+(dp2751
+VA
+I1
+ssVAM
+p2752
+(dp2753
+VA
+I3
+sV,
+I1
+ssVAL
+p2754
+(dp2755
+VP
+I1
+sVL
+I3
+sV
+I1
+sV,
+I1
+ssVAN
+p2756
+(dp2757
+VY
+I3
+sV
+I2
+sVS
+I2
+sVD
+I4
+sVT
+I6
+ssVT.
+p2758
+(dp2759
+V
+I2
+ssVAP
+p2760
+(dp2761
+VI
+I30
+ssVT,
+p2762
+(dp2763
+V
+I3
+ssVAR
+p2764
+(dp2765
+VI
+I1
+sV
+I2
+sVR
+I4
+sVE
+I1
+sVT
+I3
+ssVT*
+p2766
+(dp2767
+V
+I1
+sV*
+I2
+ssVAT
+p2768
+(dp2769
+V
+I1
+sVT
+I1
+ssVAV
+p2770
+(dp2771
+VE
+I4
+ssVAY
+p2772
+(dp2773
+V
+I1
+ssVT
+p2774
+(dp2775
+VE
+I1
+sVD
+I1
+sVG
+I8
+sVI
+I1
+sVH
+I1
+sVM
+I1
+sVL
+I3
+sVN
+I2
+sVP
+I1
+ssVT!
+p2776
+(dp2777
+V
+I1
+sV*
+I1
+ssVAc
+p2778
+(dp2779
+Vh
+I8
+ssVAb
+p2780
+(dp2781
+Va
+I4
+sVs
+I1
+sVr
+I1
+ssVAd
+p2782
+(dp2783
+Va
+I1
+ssVAg
+p2784
+(dp2785
+Vi
+I1
+ssVAf
+p2786
+(dp2787
+Vr
+I5
+ssVAh
+p2788
+(dp2789
+V!
+I18
+sV
+I1
+ssVAm
+p2790
+(dp2791
+Vé
+I4
+sVa
+I1
+sVs
+I1
+sVo
+I3
+ssVAl
+p2792
+(dp2793
+Va
+I2
+sVo
+I2
+sVe
+I3
+sVl
+I12
+sVg
+I4
+ssVAo
+p2794
+(dp2795
+Vd
+I1
+ssVAn
+p2796
+(dp2797
+Vc
+I1
+sVn
+I1
+sVt
+I3
+sVg
+I8
+sVd
+I1
+ssVAp
+p2798
+(dp2799
+Vp
+I2
+sVr
+I7
+ssVuï
+p2800
+(dp2801
+V
+I1
+sVe
+I1
+ssVAr
+p2802
+(dp2803
+Va
+I2
+sVc
+I6
+sVi
+I3
+sVk
+I1
+sVo
+I1
+sVr
+I4
+sVt
+I2
+ssVué
+p2804
+(dp2805
+V!
+I1
+sV
+I23
+sVe
+I9
+sV,
+I5
+sVn
+I11
+sVs
+I4
+sVr
+I8
+sVu
+I1
+sV?
+I1
+ssVAt
+p2806
+(dp2807
+Vh
+I1
+sVr
+I1
+sVl
+I1
+sVo
+I2
+ssVAw
+p2808
+(dp2809
+Va
+I1
+ssVAv
+p2810
+(dp2811
+Va
+I1
+sVe
+I3
+ssVAy
+p2812
+(dp2813
+Va
+I2
+sVr
+I13
+sVe
+I1
+ssVAz
+p2814
+(dp2815
+Vo
+I4
+ssVuà
+p2816
+(dp2817
+V
+I1
+ssVuâ
+p2818
+(dp2819
+Vm
+I1
+sVt
+I1
+ssV b
+p2820
+(dp2821
+Va
+I144
+sVâ
+I6
+sVe
+I153
+sVi
+I154
+sVê
+I1
+sVl
+I14
+sVo
+I150
+sVé
+I5
+sVr
+I72
+sVu
+I18
+sVy
+I27
+ssV c
+p2822
+(dp2823
+Va
+I220
+sVe
+I483
+sV'
+I87
+sVi
+I49
+sVh
+I335
+sVl
+I12
+sVo
+I635
+sVé
+I11
+sVr
+I101
+sVu
+I30
+sVô
+I18
+ssVgu
+p2824
+(dp2825
+Va
+I11
+sVe
+I61
+sVé
+I8
+sVè
+I3
+sVm
+I2
+sVl
+I6
+sVi
+I4
+sVs
+I3
+sVr
+I13
+sVt
+I5
+ssV a
+p2826
+(dp2827
+Vî
+I1
+sV
+I146
+sV-
+I9
+sVc
+I61
+sVb
+I51
+sVe
+I1
+sVd
+I33
+sVg
+I19
+sVf
+I21
+sVi
+I97
+sVh
+I2
+sVj
+I2
+sVm
+I49
+sVl
+I100
+sVo
+I2
+sVn
+I137
+sVp
+I112
+sVs
+I69
+sVr
+I97
+sVu
+I396
+sVt
+I51
+sVw
+I2
+sVv
+I394
+sVy
+I17
+ssV f
+p2828
+(dp2829
+Va
+I282
+sVâ
+I2
+sVe
+I120
+sVi
+I177
+sVê
+I1
+sVl
+I23
+sVo
+I172
+sVî
+I1
+sVé
+I4
+sVr
+I93
+sVu
+I151
+sVt
+I1
+sVû
+I12
+ssV g
+p2830
+(dp2831
+Va
+I63
+sVâ
+I2
+sVe
+I44
+sVi
+I6
+sVl
+I7
+sVo
+I50
+sVé
+I19
+sVr
+I121
+sVu
+I33
+ssV d
+p2832
+(dp2833
+Va
+I396
+sVe
+I2108
+sV'
+I412
+sVi
+I567
+sVè
+I7
+sVo
+I292
+sVî
+I12
+sVé
+I183
+sVr
+I24
+sVu
+I295
+sVû
+I2
+ssV e
+p2834
+(dp2835
+Va
+I3
+sVB
+I42
+sVd
+I6
+sVf
+I27
+sVi
+I1
+sVh
+I1
+sVm
+I42
+sVl
+I72
+sVn
+I593
+sVq
+I5
+sVs
+I220
+sVr
+I4
+sVu
+I63
+sVt
+I950
+sVv
+I7
+sVx
+I85
+sVû
+I10
+ssV j
+p2836
+(dp2837
+Va
+I80
+sVe
+I328
+sV'
+I113
+sVé
+I33
+sVo
+I93
+sVu
+I63
+ssV k
+p2838
+(dp2839
+Va
+I1
+sVe
+I1
+sVn
+I5
+ssV h
+p2840
+(dp2841
+Va
+I60
+sVâ
+I1
+sVe
+I29
+sVi
+I9
+sVo
+I158
+sVé
+I12
+sVu
+I18
+sVô
+I8
+sVy
+I4
+sVt
+I5
+ssV i
+p2842
+(dp2843
+Vc
+I29
+sVd
+I10
+sVg
+I4
+sVf
+I11
+sVm
+I36
+sVl
+I395
+sVn
+I170
+sVs
+I25
+sVr
+I2
+sVt
+I27
+sVv
+I1
+ssV n
+p2844
+(dp2845
+Va
+I41
+sVe
+I299
+sV'
+I258
+sVé
+I27
+sVè
+I8
+sVo
+I335
+sVi
+I44
+sVu
+I20
+sVô
+I2
+ssV o
+p2846
+(dp2847
+Vc
+I11
+sVb
+I20
+sVe
+I5
+sVd
+I3
+sVf
+I81
+sVi
+I4
+sVh
+I2
+sVm
+I2
+sVn
+I173
+sVp
+I7
+sVs
+I2
+sVr
+I84
+sVu
+I79
+sVt
+I21
+sVw
+I1
+sVv
+I3
+sVù
+I49
+ssV l
+p2848
+(dp2849
+Va
+I801
+sVà
+I16
+sVâ
+I2
+sVe
+I1457
+sV'
+I415
+sVi
+I102
+sVè
+I3
+sVo
+I70
+sVé
+I7
+sVu
+I207
+sVy
+I2
+ssV m
+p2850
+(dp2851
+Va
+I607
+sVâ
+I2
+sVe
+I299
+sV'
+I75
+sVi
+I182
+sVè
+I30
+sVê
+I48
+sVo
+I544
+sVé
+I62
+sVu
+I23
+sVy
+I1
+ssV r
+p2852
+(dp2853
+Va
+I109
+sVe
+I408
+sVi
+I85
+sVè
+I1
+sVê
+I4
+sVo
+I121
+sVé
+I135
+sVu
+I21
+sVô
+I4
+sVh
+I1
+ssV s
+p2854
+(dp2855
+Va
+I281
+sVé
+I29
+sVc
+I22
+sVb
+I1
+sVe
+I413
+sV'
+I140
+sVi
+I192
+sVh
+I4
+sVm
+I1
+sVo
+I490
+sVp
+I9
+sVu
+I289
+sVt
+I28
+sVè
+I1
+sVy
+I3
+sVû
+I1
+ssVge
+p2856
+(dp2857
+Va
+I20
+sV
+I102
+sVz
+I4
+sVd
+I2
+sV)
+I1
+sVm
+I6
+sV,
+I41
+sVo
+I6
+sVn
+I58
+sV.
+I13
+sVs
+I61
+sVr
+I66
+sV!
+I2
+sVt
+I9
+sVu
+I13
+sV;
+I15
+sV:
+I5
+sV?
+I2
+sVl
+I1
+ssV q
+p2858
+(dp2859
+Vu
+I1445
+ssV v
+p2860
+(dp2861
+Va
+I109
+sVe
+I119
+sVi
+I253
+sVê
+I4
+sVo
+I579
+sVé
+I21
+sVr
+I17
+sVu
+I47
+sVô
+I1
+ssV w
+p2862
+(dp2863
+Va
+I9
+sVe
+I13
+sVi
+I31
+sVh
+I12
+sVo
+I15
+sVr
+I4
+sVw
+I2
+ssV t
+p2864
+(dp2865
+Va
+I86
+sVâ
+I1
+sVe
+I139
+sV'
+I5
+sVi
+I36
+sVh
+I180
+sVê
+I16
+sVo
+I490
+sVé
+I8
+sVr
+I304
+sVu
+I54
+sVw
+I1
+sVy
+I1
+ssV u
+p2866
+(dp2867
+Vp
+I2
+sVs
+I26
+sVt
+I5
+sVn
+I638
+ssVgo
+p2868
+(dp2869
+Vc
+I1
+sVb
+I1
+sVe
+I1
+sVg
+I1
+sVi
+I1
+sV-
+I1
+sVl
+I2
+sVo
+I1
+sVn
+I132
+sVs
+I1
+sVr
+I13
+sVu
+I38
+sVt
+I5
+sVû
+I21
+ssVgn
+p2870
+(dp2871
+Vé
+I10
+sVa
+I20
+sVe
+I88
+sVi
+I14
+sVo
+I26
+ssVgm
+p2872
+(dp2873
+Vé
+I1
+sVe
+I3
+ssV y
+p2874
+(dp2875
+V
+I102
+sVe
+I26
+sVo
+I62
+ssVgi
+p2876
+(dp2877
+Va
+I2
+sVe
+I20
+sVé
+I1
+sVm
+I4
+sVl
+I3
+sVo
+I5
+sVn
+I15
+sVq
+I3
+sVs
+I12
+sVr
+I1
+sVt
+I12
+sVv
+I5
+ssVgh
+p2878
+(dp2879
+V
+I3
+sVt
+I16
+sVo
+I1
+sV,
+I1
+ssV B
+p2880
+(dp2881
+VA
+I1
+sVa
+I7
+sVE
+I3
+sVi
+I7
+sV,
+I2
+sVo
+I12
+sV.
+I45
+sVr
+I3
+sVu
+I36
+sVy
+I7
+sVe
+I4
+sVR
+I1
+sVU
+I2
+ssV C
+p2882
+(dp2883
+Va
+I495
+sVA
+I4
+sVe
+I83
+sV'
+I34
+sV
+I1
+sVi
+I3
+sVh
+I22
+sVl
+I4
+sVo
+I58
+sVé
+I3
+sVr
+I5
+sVu
+I125
+sVO
+I2
+sVH
+I31
+ssV A
+p2884
+(dp2885
+V
+I19
+sV,
+I1
+sV.
+I1
+sVB
+I2
+sVD
+I1
+sVN
+I3
+sVS
+I3
+sVR
+I1
+sVV
+I2
+sVc
+I7
+sVb
+I6
+sVg
+I1
+sVf
+I2
+sVh
+I16
+sVm
+I6
+sVl
+I15
+sVo
+I1
+sVn
+I6
+sVp
+I9
+sVs
+I6
+sVr
+I14
+sVu
+I21
+sVt
+I2
+sVw
+I1
+sVv
+I3
+sVy
+I3
+sVz
+I3
+ssV F
+p2886
+(dp2887
+Va
+I2
+sVe
+I7
+sVi
+I5
+sVl
+I1
+sVo
+I9
+sVI
+I4
+sVr
+I21
+sVu
+I1
+sVO
+I4
+ssV G
+p2888
+(dp2889
+Va
+I5
+sVe
+I4
+sVi
+I10
+sVo
+I1
+sVI
+I1
+sVr
+I4
+sVu
+I27
+sVU
+I8
+sVR
+I1
+ssV D
+p2890
+(dp2891
+Va
+I15
+sVA
+I4
+sVE
+I9
+sVé
+I1
+sV'
+I3
+sVI
+I3
+sVè
+I3
+sVo
+I10
+sVi
+I28
+sVU
+I2
+sVO
+I5
+sVe
+I30
+ssV E
+p2892
+(dp2893
+VB
+I8
+sVd
+I1
+sVI
+I2
+sVh
+I12
+sVl
+I26
+sVD
+I2
+sVn
+I31
+sVs
+I14
+sVr
+I1
+sVu
+I8
+sVT
+I2
+sVX
+I1
+sVV
+I2
+sVx
+I1
+sVt
+I15
+ssV J
+p2894
+(dp2895
+VA
+I1
+sVa
+I17
+sVe
+I102
+sV'
+I28
+sVé
+I3
+sVo
+I5
+sV.
+I4
+sVu
+I20
+ssV K
+p2896
+(dp2897
+Va
+I1
+sV
+I1
+sVe
+I5
+sVI
+I1
+sV.
+I4
+sV°
+I1
+ssV H
+p2898
+(dp2899
+Va
+I10
+sVA
+I2
+sVe
+I6
+sVi
+I4
+sVo
+I12
+sVé
+I20
+sVu
+I1
+ssV I
+p2900
+(dp2901
+V,
+I1
+sV.
+I3
+sV:
+I1
+sVF
+I3
+sVI
+I9
+sVM
+I2
+sVN
+I5
+sVS
+I2
+sVT
+I1
+sVV
+I5
+sVX
+I2
+sVc
+I1
+sVe
+I4
+sVd
+I2
+sVg
+I1
+sVf
+I11
+sVm
+I1
+sVl
+I144
+sVo
+I1
+sVn
+I8
+sVs
+I14
+sVr
+I1
+sVt
+I9
+sVv
+I5
+ssV N
+p2902
+(dp2903
+Va
+I6
+sVé
+I1
+sVe
+I13
+sV'
+I4
+sVi
+I2
+sVO
+I6
+sV°
+I2
+sVU
+I2
+sVo
+I34
+sVu
+I2
+sVE
+I1
+ssV O
+p2904
+(dp2905
+V
+I7
+sVC
+I1
+sVe
+I2
+sVF
+I6
+sVh
+I7
+sVk
+I1
+sVc
+I3
+sVn
+I46
+sVs
+I1
+sVr
+I11
+sVu
+I16
+sVt
+I2
+sVx
+I1
+sVù
+I2
+sVE
+I2
+sVR
+I10
+sVN
+I1
+sVT
+I2
+ssV L
+p2906
+(dp2907
+Va
+I47
+sVA
+I1
+sVE
+I6
+sV'
+I31
+sVi
+I21
+sVO
+I1
+sVI
+I5
+sVu
+I2
+sVo
+I17
+sVe
+I151
+ssV M
+p2908
+(dp2909
+Va
+I184
+sVA
+I2
+sVe
+I11
+sVD
+I1
+sVé
+I7
+sVi
+I14
+sVM
+I1
+sV,
+I1
+sVO
+I2
+sV.
+I22
+sVI
+I1
+sVS
+I1
+sVu
+I2
+sVo
+I37
+sVè
+I1
+sVy
+I1
+sVE
+I2
+ssV R
+p2910
+(dp2911
+VA
+I1
+sVa
+I7
+sVe
+I6
+sVi
+I6
+sVh
+I1
+sVo
+I16
+sVU
+I3
+sVO
+I1
+sVu
+I10
+sVE
+I2
+ssV S
+p2912
+(dp2913
+Va
+I19
+sVc
+I1
+sVe
+I3
+sV'
+I1
+sVp
+I1
+sVi
+I26
+sVM
+I2
+sVm
+I3
+sVo
+I9
+sV.
+I3
+sVé
+I2
+sVu
+I15
+sVt
+I4
+sVy
+I1
+sVU
+I1
+sVE
+I1
+sVT
+I1
+ssV P
+p2914
+(dp2915
+VA
+I3
+sVa
+I153
+sVe
+I11
+sVi
+I2
+sVM
+I1
+sVl
+I11
+sVO
+I2
+sV.
+I1
+sVé
+I6
+sVR
+I9
+sVu
+I5
+sVo
+I50
+sVy
+I1
+sVU
+I4
+sVr
+I50
+ssV Q
+p2916
+(dp2917
+Vu
+I56
+sVU
+I1
+ssV V
+p2918
+(dp2919
+Va
+I6
+sVE
+I2
+sVi
+I9
+sVé
+I3
+sVO
+I2
+sV.
+I1
+sVI
+I7
+sVo
+I97
+sVe
+I44
+ssV W
+p2920
+(dp2921
+Va
+I1
+sVA
+I4
+sVE
+I1
+sVi
+I2
+sVh
+I2
+sVo
+I1
+sVH
+I1
+sVy
+I1
+sVe
+I15
+ssV T
+p2922
+(dp2923
+Va
+I5
+sVe
+I7
+sVi
+I2
+sVh
+I43
+sVê
+I1
+sVO
+I10
+sVé
+I1
+sVr
+I17
+sVu
+I18
+sVo
+I17
+sVH
+I5
+sVy
+I1
+sVR
+I2
+ssV U
+p2924
+(dp2925
+VN
+I2
+sVS
+I3
+sVr
+I3
+sVt
+I2
+sVn
+I29
+ssV Z
+p2926
+(dp2927
+Va
+I1
+sV,
+I1
+ssV [
+p2928
+(dp2929
+Va
+I1
+sVE
+I3
+sVP
+I2
+sV*
+I3
+sV1
+I29
+sV9
+I1
+sV3
+I6
+sV2
+I12
+sV5
+I2
+sVT
+I1
+sV7
+I1
+sV6
+I2
+sVY
+I1
+sV8
+I1
+sV4
+I3
+ssV X
+p2930
+(dp2931
+V
+I2
+sVI
+I13
+sVL
+I2
+sV.
+I1
+sVV
+I25
+sVX
+I40
+sV;
+I1
+sV,
+I1
+ssV Y
+p2932
+(dp2933
+Ve
+I1
+sVO
+I7
+sVo
+I7
+ssV _
+p2934
+(dp2935
+Vé
+I2
+sVI
+I1
+sVA
+I2
+sVC
+I12
+sVE
+I2
+sVD
+I3
+sVÉ
+I2
+sVH
+I3
+sVJ
+I2
+sVM
+I13
+sVL
+I9
+sVO
+I2
+sVN
+I1
+sVP
+I9
+sVS
+I6
+sVR
+I1
+sVT
+I3
+sVV
+I3
+sVa
+I2
+sVà
+I1
+sVc
+I1
+sVg
+I1
+sVi
+I1
+sVh
+I1
+sVm
+I1
+sVl
+I6
+sVp
+I1
+sVu
+I2
+ssV "
+p2936
+(dp2937
+VA
+I1
+sVD
+I1
+sVP
+I6
+sVs
+I1
+sVl
+I1
+sVp
+I1
+sVS
+I5
+sVR
+I1
+ssV #
+p2938
+(dp2939
+V4
+I1
+ssS' '
+p2940
+(dp2941
+Vê
+I9
+sVé
+I44
+sVâ
+I1
+sV
+I660
+sV"
+I3
+sV'
+I1
+sV(
+I7
+sV«
+I3
+sV*
+I13
+sV-
+I2
+sV1
+I23
+sVÉ
+I3
+sV3
+I1
+sV2
+I9
+sV4
+I2
+sV6
+I1
+sV9
+I1
+sV»
+I1
+sVô
+I1
+sVA
+I81
+sVÀ
+I1
+sVC
+I350
+sVB
+I62
+sVE
+I73
+sVD
+I46
+sVG
+I6
+sVF
+I12
+sVI
+I154
+sVH
+I20
+sVK
+I4
+sVJ
+I117
+sVM
+I95
+sVL
+I198
+sVO
+I81
+sVN
+I28
+sVQ
+I51
+sVP
+I88
+sVS
+I29
+sVR
+I19
+sVU
+I27
+sVT
+I66
+sVW
+I16
+sVV
+I73
+sVY
+I5
+sVX
+I6
+sV[
+I65
+sVç
+I1
+sV_
+I16
+sVa
+I156
+sVà
+I22
+sVc
+I223
+sVb
+I79
+sVe
+I150
+sVd
+I344
+sVg
+I44
+sVf
+I111
+sVi
+I68
+sVh
+I40
+sVk
+I1
+sVj
+I50
+sVm
+I192
+sVl
+I235
+sVo
+I40
+sVn
+I82
+sVq
+I129
+sVp
+I259
+sVs
+I178
+sVr
+I99
+sVu
+I38
+sVt
+I122
+sVw
+I7
+sVv
+I113
+sVy
+I8
+ssVâg
+p2942
+(dp2943
+Vé
+I4
+sVe
+I7
+ssV '
+p2944
+(dp2945
+V
+I1
+sVd
+I1
+ssV $
+p2946
+(dp2947
+V2
+I1
+ssVâc
+p2948
+(dp2949
+Vh
+I5
+sVe
+I13
+ssV *
+p2950
+(dp2951
+VB
+I1
+sV*
+I10
+sVE
+I2
+sVW
+I1
+sVn
+I1
+ssVâm
+p2952
+(dp2953
+Ve
+I16
+ssV (
+p2954
+(dp2955
+Va
+I3
+sV#
+I1
+sV*
+I2
+sVd
+I1
+sVf
+I1
+sVi
+I4
+sVJ
+I1
+sVC
+I1
+sVo
+I5
+sVN
+I1
+sVp
+I1
+sVs
+I1
+sVT
+I1
+sVV
+I1
+sV~
+I1
+sV_
+I2
+sVt
+I1
+ssV .
+p2956
+(dp2957
+V
+I1
+sV.
+I1
+ssVg:
+p2958
+(dp2959
+V
+I1
+ssV -
+p2960
+(dp2961
+V-
+I2
+sVn
+I1
+ssV 2
+p2962
+(dp2963
+V
+I1
+sVO
+I1
+sV1
+I1
+sV0
+I18
+sV5
+I1
+sV4
+I1
+sV7
+I2
+sV6
+I1
+sV8
+I1
+sV:
+I1
+ssV 3
+p2964
+(dp2965
+V1
+I1
+sV0
+I3
+sV3
+I1
+sV2
+I1
+sV8
+I1
+ssV 0
+p2966
+(dp2967
+V1
+I1
+sV0
+I1
+ssV 1
+p2968
+(dp2969
+V
+I2
+sVe
+I1
+sV-
+I1
+sV,
+I1
+sV1
+I2
+sV0
+I6
+sV2
+I2
+sV5
+I6
+sV4
+I3
+sV7
+I52
+sV6
+I6
+sV9
+I8
+sV8
+I6
+ssV 6
+p2970
+(dp2971
+V
+I1
+sV0
+I2
+sV4
+I2
+sV.
+I1
+ssV 7
+p2972
+(dp2973
+V.
+I1
+ssV 4
+p2974
+(dp2975
+V
+I1
+sV%
+I1
+sV0
+I2
+sV3
+I2
+sV2
+I2
+sV7
+I2
+sV8
+I1
+ssVg
+p2976
+(dp2977
+Vp
+I1
+sV(
+I1
+sVA
+I1
+sVE
+I4
+sVL
+I6
+sVN
+I1
+sVP
+I1
+sVS
+I2
+sVa
+I7
+sVc
+I3
+sVb
+I1
+sVe
+I5
+sVd
+I3
+sVf
+I7
+sVé
+I1
+sVh
+I1
+sVo
+I8
+sVn
+I1
+sVq
+I1
+sVi
+I9
+sVs
+I3
+sVt
+I8
+sVw
+I5
+sVv
+I1
+ssV :
+p2978
+(dp2979
+V
+I3
+ssVg.
+p2980
+(dp2981
+V
+I4
+sVn
+I3
+ssVg-
+p2982
+(dp2983
+Vt
+I13
+ssVg,
+p2984
+(dp2985
+V
+I8
+ssV ?
+p2986
+(dp2987
+V
+I1
+ssV <
+p2988
+(dp2989
+Vh
+I1
+ssVéh
+p2990
+(dp2991
+Vu
+I1
+ssVém
+p2992
+(dp2993
+Va
+I5
+sVe
+I24
+sVi
+I12
+sVè
+I1
+sVê
+I1
+sVo
+I26
+sVé
+I2
+sVu
+I3
+ssVd;
+p2994
+(dp2995
+V
+I5
+ssV â
+p2996
+(dp2997
+Vm
+I7
+sVg
+I7
+ssV à
+p2998
+(dp2999
+V
+I641
+sV-
+I2
+ssVzo
+p3000
+(dp3001
+Vn
+I1
+sVf
+I4
+ssVzi
+p3002
+(dp3003
+Vp
+I2
+sVr
+I3
+sVè
+I1
+sVl
+I1
+sVn
+I2
+ssV3]
+p3004
+(dp3005
+V
+I6
+sV;
+I1
+sV,
+I1
+sV.
+I2
+ssV ê
+p3006
+(dp3007
+Vt
+I70
+ssVze
+p3008
+(dp3009
+V
+I20
+sVr
+I2
+sV,
+I1
+sVd
+I1
+ssV é
+p3010
+(dp3011
+Vc
+I42
+sVd
+I13
+sVg
+I14
+sVm
+I6
+sVl
+I14
+sVn
+I3
+sVq
+I4
+sVp
+I37
+sVr
+I2
+sVt
+I305
+sVv
+I7
+ssV î
+p3012
+(dp3013
+Vl
+I2
+ssVza
+p3014
+(dp3015
+V
+I2
+sVb
+I1
+sVi
+I1
+sV,
+I2
+sV.
+I1
+sVr
+I2
+sVt
+I4
+ssVgâ
+p3016
+(dp3017
+Vt
+I2
+ssV ô
+p3018
+(dp3019
+V
+I3
+sVt
+I2
+ssVgé
+p3020
+(dp3021
+V
+I25
+sVe
+I11
+sVd
+I10
+sVm
+I1
+sV,
+I1
+sVn
+I20
+sVs
+I14
+sV;
+I1
+sV.
+I1
+ssVgè
+p3022
+(dp3023
+Vr
+I7
+ssV À
+p3024
+(dp3025
+V
+I1
+ssV É
+p3026
+(dp3027
+Vd
+I1
+sVn
+I2
+sVt
+I1
+sVg
+I2
+sVl
+I2
+ssVz,
+p3028
+(dp3029
+V
+I35
+ssVz-
+p3030
+(dp3031
+Ve
+I1
+sVn
+I1
+sVm
+I11
+sVl
+I1
+sVv
+I49
+ssVz.
+p3032
+(dp3033
+V
+I7
+sV.
+I1
+ssV «
+p3034
+(dp3035
+V
+I2
+sVM
+I1
+ssVz
+p3036
+(dp3037
+Vj
+I1
+sVM
+I1
+sVP
+I1
+sVa
+I11
+sVà
+I1
+sVc
+I14
+sVb
+I7
+sVe
+I6
+sVd
+I22
+sVg
+I2
+sVf
+I4
+sVé
+I5
+sVê
+I2
+sVm
+I6
+sVl
+I34
+sVo
+I1
+sVn
+I3
+sVq
+I8
+sVp
+I28
+sVs
+I7
+sVr
+I10
+sVu
+I6
+sVt
+I21
+sVv
+I8
+ssVz!
+p3038
+(dp3039
+V
+I3
+ssVz;
+p3040
+(dp3041
+V
+I3
+ssV »
+p3042
+(dp3043
+V
+I1
+ssV39
+p3044
+(dp3045
+V
+I1
+sV,
+I1
+sV.
+I2
+ssV38
+p3046
+(dp3047
+V,
+I1
+sV6
+I1
+ssV33
+p3048
+(dp3049
+V9
+I1
+ssV32
+p3050
+(dp3051
+V.
+I1
+ssV31
+p3052
+(dp3053
+V5
+I1
+sV4
+I1
+ssV30
+p3054
+(dp3055
+V0
+I1
+sV;
+I1
+sV,
+I2
+sV
+I1
+sV6
+I1
+ssV36
+p3056
+(dp3057
+V.
+I2
+ssV35
+p3058
+(dp3059
+V.
+I1
+ssV3)
+p3060
+(dp3061
+V
+I2
+ssV3.
+p3062
+(dp3063
+V
+I2
+ssV3,
+p3064
+(dp3065
+V
+I2
+ssV3
+p3066
+(dp3067
+V
+I1
+sVo
+I1
+sVN
+I1
+ssVFA
+p3068
+(dp3069
+VC
+I1
+ssVFI
+p3070
+(dp3071
+VR
+I1
+sVL
+I1
+sVT
+I1
+sVN
+I1
+ssVFO
+p3072
+(dp3073
+VR
+I6
+ssVFr
+p3074
+(dp3075
+Va
+I16
+sVé
+I1
+sVe
+I2
+sVo
+I1
+sVè
+I1
+ssVFu
+p3076
+(dp3077
+Vy
+I1
+ssVFa
+p3078
+(dp3079
+Vr
+I2
+ssVFe
+p3080
+(dp3081
+Vr
+I4
+sVb
+I2
+sVu
+I1
+ssVFi
+p3082
+(dp3083
+Vg
+I4
+sVn
+I1
+ssVFl
+p3084
+(dp3085
+Vo
+I1
+ssVFo
+p3086
+(dp3087
+Vu
+I9
+ssVF
+p3088
+(dp3089
+VA
+I1
+sVD
+I1
+sVM
+I1
+sVS
+I1
+sVT
+I1
+sVW
+I1
+sVY
+I3
+ssVYO
+p3090
+(dp3091
+VU
+I7
+ssVdl
+p3092
+(dp3093
+Ve
+I1
+ssVdm
+p3094
+(dp3095
+Vi
+I10
+sVe
+I2
+ssVFÈ
+p3096
+(dp3097
+VV
+I1
+ssVYT
+p3098
+(dp3099
+VH
+I1
+ssVYo
+p3100
+(dp3101
+Vr
+I1
+sVu
+I6
+ssVYe
+p3102
+(dp3103
+Va
+I1
+sVs
+I1
+ssVY,
+p3104
+(dp3105
+V
+I1
+ssVY
+p3106
+(dp3107
+VE
+I1
+sVK
+I1
+sVB
+I1
+sVM
+I1
+sVO
+I3
+ssVY;
+p3108
+(dp3109
+V
+I1
+ssV!
+p3110
+(dp3111
+V
+I38
+sVô
+I1
+sVA
+I2
+sVC
+I2
+sVE
+I1
+sVF
+I1
+sVI
+I1
+sVJ
+I4
+sVM
+I4
+sVL
+I1
+sVO
+I2
+sVN
+I1
+sVP
+I3
+sVa
+I2
+sVà
+I1
+sVc
+I9
+sVb
+I1
+sVe
+I2
+sVd
+I22
+sVf
+I1
+sVi
+I1
+sVj
+I7
+sVm
+I12
+sVl
+I8
+sVo
+I2
+sVn
+I1
+sVq
+I5
+sVp
+I1
+sVs
+I10
+sVr
+I2
+sVt
+I2
+sVv
+I6
+ssVdy
+p3112
+(dp3113
+V
+I2
+sVl
+I1
+ssV%
+p3114
+(dp3115
+Vo
+I3
+ssVé!
+p3116
+(dp3117
+V
+I2
+ssVdw
+p3118
+(dp3119
+Va
+I1
+ssVl_
+p3120
+(dp3121
+V
+I1
+ssV8°
+p3122
+(dp3123
+V.
+I1
+ssVl[
+p3124
+(dp3125
+V1
+I2
+ssVlf
+p3126
+(dp3127
+V
+I1
+sVe
+I1
+ssVlg
+p3128
+(dp3129
+Va
+I31
+sVu
+I1
+sVr
+I1
+sVe
+I4
+ssVld
+p3130
+(dp3131
+Va
+I14
+sV
+I8
+sVb
+I1
+sVe
+I1
+sV'
+I1
+sVo
+I17
+sV.
+I1
+ssVle
+p3132
+(dp3133
+V!
+I8
+sV
+I1245
+sV-
+I15
+sV,
+I111
+sV.
+I67
+sV;
+I25
+sV:
+I8
+sV?
+I8
+sV[
+I1
+sV]
+I1
+sV_
+I2
+sVd
+I1
+sVa
+I19
+sVc
+I10
+sVg
+I6
+sVç
+I4
+sVf
+I1
+sVi
+I13
+sVm
+I71
+sVn
+I48
+sVq
+I14
+sVs
+I738
+sVr
+I79
+sVu
+I217
+sVt
+I55
+sVv
+I32
+sVy
+I3
+sVx
+I7
+sVz
+I13
+ssVlc
+p3134
+(dp3135
+Va
+I3
+sVi
+I1
+sVu
+I2
+sVo
+I1
+ssVla
+p3136
+(dp3137
+Vî
+I2
+sV
+I758
+sV-
+I2
+sV,
+I5
+sV.
+I1
+sV;
+I1
+sV?
+I1
+sVc
+I23
+sVb
+I4
+sVd
+I8
+sVg
+I15
+sVi
+I182
+sVh
+I1
+sVm
+I11
+sVn
+I90
+sVq
+I12
+sVs
+I33
+sVr
+I46
+sVu
+I2
+sVt
+I28
+sVw
+I5
+sVv
+I15
+sVy
+I2
+ssVlo
+p3138
+(dp3139
+Va
+I4
+sV
+I4
+sVc
+I1
+sVb
+I3
+sVg
+I22
+sVi
+I20
+sVm
+I4
+sV,
+I1
+sVï
+I1
+sVn
+I77
+sVq
+I1
+sVp
+I4
+sVs
+I127
+sVr
+I23
+sVu
+I36
+sVt
+I13
+sVw
+I7
+sVy
+I2
+ssVll
+p3140
+(dp3141
+Va
+I92
+sV
+I29
+sVâ
+I1
+sVe
+I676
+sVi
+I40
+sVè
+I8
+sVo
+I35
+sVé
+I21
+sVs
+I2
+sVu
+I11
+sVy
+I9
+ssVlm
+p3142
+(dp3143
+Va
+I3
+sVe
+I2
+ssVlh
+p3144
+(dp3145
+Ve
+I23
+sVo
+I1
+ssVli
+p3146
+(dp3147
+V
+I8
+sV,
+I2
+sV;
+I2
+sVa
+I8
+sVc
+I34
+sVb
+I23
+sVe
+I111
+sVd
+I2
+sVg
+I21
+sVf
+I2
+sVé
+I3
+sVè
+I8
+sVk
+I2
+sVm
+I13
+sVl
+I1
+sVo
+I24
+sVn
+I13
+sVq
+I26
+sVp
+I1
+sVs
+I23
+sVr
+I8
+sVu
+I2
+sVt
+I37
+sVv
+I28
+sVz
+I2
+ssVlv
+p3148
+(dp3149
+Va
+I4
+ssVlw
+p3150
+(dp3151
+Va
+I1
+ssVlt
+p3152
+(dp3153
+Va
+I36
+sVe
+I13
+sVi
+I11
+sVh
+I1
+sVo
+I4
+sV.
+I1
+sVé
+I1
+sVr
+I1
+sVu
+I2
+sVy
+I2
+ssVlu
+p3154
+(dp3155
+Va
+I3
+sV
+I12
+sVe
+I5
+sVd
+I8
+sVi
+I219
+sVm
+I18
+sV,
+I1
+sVn
+I6
+sVp
+I6
+sVs
+I209
+sVr
+I6
+sVt
+I28
+ssVlr
+p3156
+(dp3157
+Ve
+I2
+ssVls
+p3158
+(dp3159
+V
+I153
+sVi
+I4
+sV,
+I6
+sVo
+I3
+sV.
+I4
+sVé
+I2
+sV;
+I3
+ssVlp
+p3160
+(dp3161
+Vi
+I4
+sV
+I1
+ssVlq
+p3162
+(dp3163
+Vu
+I88
+ssVly
+p3164
+(dp3165
+V
+I25
+sV,
+I2
+sV.
+I1
+sVr
+I1
+sVn
+I1
+sVz
+I1
+ssVl'
+p3166
+(dp3167
+Va
+I156
+sVé
+I31
+sVâ
+I8
+sVe
+I61
+sVA
+I15
+sVÉ
+I2
+sVh
+I34
+sVê
+I3
+sVO
+I1
+sVy
+I1
+sVi
+I36
+sVu
+I20
+sVo
+I33
+sVI
+I5
+sVE
+I8
+sV_
+I3
+ssVl
+p3168
+(dp3169
+Vi
+I6
+sV(
+I1
+sV5
+I2
+sVC
+I1
+sVB
+I1
+sVD
+I1
+sVH
+I3
+sVP
+I8
+sVS
+I4
+sVR
+I1
+sVT
+I1
+sVa
+I52
+sVà
+I17
+sVc
+I15
+sVb
+I10
+sVe
+I80
+sVd
+I55
+sVg
+I2
+sVf
+I71
+sVé
+I21
+sVh
+I3
+sVj
+I3
+sVm
+I42
+sVl
+I45
+sVo
+I11
+sVn
+I104
+sVq
+I13
+sVp
+I58
+sVs
+I46
+sVr
+I22
+sVu
+I3
+sVt
+I10
+sVv
+I25
+sVy
+I56
+ssVl!
+p3170
+(dp3171
+V
+I6
+ssVl.
+p3172
+(dp3173
+V
+I19
+ssVl,
+p3174
+(dp3175
+V
+I76
+ssVl-
+p3176
+(dp3177
+Vv
+I1
+ssVl?
+p3178
+(dp3179
+V
+I3
+ssVl:
+p3180
+(dp3181
+V
+I3
+ssVl;
+p3182
+(dp3183
+V
+I12
+ssV8.
+p3184
+(dp3185
+V
+I2
+ssV8,
+p3186
+(dp3187
+V
+I6
+ssV8
+p3188
+(dp3189
+Va
+I1
+sVd
+I1
+sVO
+I1
+ssV8;
+p3190
+(dp3191
+V
+I1
+ssV89
+p3192
+(dp3193
+V,
+I1
+ssV82
+p3194
+(dp3195
+V9
+I1
+sV2
+I1
+sV5
+I1
+sV.
+I1
+ssV80
+p3196
+(dp3197
+V9
+I1
+sV3
+I1
+ssV81
+p3198
+(dp3199
+V5
+I1
+ssV86
+p3200
+(dp3201
+V5
+I1
+ssV85
+p3202
+(dp3203
+V.
+I1
+ssVlâ
+p3204
+(dp3205
+Vc
+I2
+sVt
+I5
+ssVlà
+p3206
+(dp3207
+V
+I39
+sV;
+I1
+sV:
+I1
+sV,
+I7
+sV?
+I2
+ssVlè
+p3208
+(dp3209
+Vc
+I1
+sVg
+I4
+sVm
+I2
+sVn
+I2
+sVr
+I29
+sVt
+I1
+sVv
+I5
+ssVlé
+p3210
+(dp3211
+Va
+I2
+sV
+I14
+sVc
+I1
+sVb
+I1
+sVe
+I42
+sVd
+I1
+sVg
+I6
+sVm
+I2
+sV,
+I7
+sV.
+I1
+sVs
+I13
+sVr
+I4
+sVt
+I1
+sV;
+I2
+sV:
+I4
+ssVlû
+p3212
+(dp3213
+Vt
+I3
+ssV8]
+p3214
+(dp3215
+V
+I1
+sV;
+I1
+ssVK
+p3216
+(dp3217
+VI
+I1
+sVs
+I1
+sVO
+I1
+ssVK.
+p3218
+(dp3219
+V
+I2
+sV-
+I2
+ssVKa
+p3220
+(dp3221
+Vn
+I1
+ssVKe
+p3222
+(dp3223
+Vh
+I4
+sVn
+I1
+ssVKI
+p3224
+(dp3225
+VN
+I1
+ssVKS
+p3226
+(dp3227
+V
+I1
+sV*
+I2
+ssV*n
+p3228
+(dp3229
+Vo
+I1
+ssVK°
+p3230
+(dp3231
+V
+I1
+ssV*e
+p3232
+(dp3233
+VB
+I1
+ssV*]
+p3234
+(dp3235
+V
+I3
+ssV*T
+p3236
+(dp3237
+Vh
+I4
+sVH
+I1
+ssV*V
+p3238
+(dp3239
+Ve
+I1
+ssV*W
+p3240
+(dp3241
+VA
+I1
+sVe
+I1
+ssV*S
+p3242
+(dp3243
+VT
+I2
+ssV*E
+p3244
+(dp3245
+VI
+I1
+sVN
+I2
+ssV*F
+p3246
+(dp3247
+VO
+I1
+ssV*B
+p3248
+(dp3249
+VE
+I1
+ssV*:
+p3250
+(dp3251
+V
+I1
+ssVsl
+p3252
+(dp3253
+Va
+I2
+sVy
+I1
+sVe
+I3
+ssV*)
+p3254
+(dp3255
+V
+I1
+ssV**
+p3256
+(dp3257
+V
+I10
+sVe
+I1
+sVF
+I1
+sV*
+I27
+sVS
+I2
+sVT
+I5
+sVW
+I1
+ssV*
+p3258
+(dp3259
+VY
+I1
+sVc
+I1
+sVm
+I1
+sVT
+I1
+ssVho
+p3260
+(dp3261
+V
+I3
+sVc
+I4
+sVe
+I1
+sVd
+I5
+sVf
+I1
+sVi
+I5
+sVm
+I112
+sVl
+I11
+sVo
+I2
+sVn
+I36
+sVq
+I1
+sVs
+I39
+sVr
+I38
+sVu
+I15
+sVt
+I2
+sVw
+I8
+ssVPé
+p3262
+(dp3263
+Vc
+I2
+sVr
+I4
+ssVha
+p3264
+(dp3265
+Vo
+I1
+sVî
+I5
+sV
+I13
+sV,
+I2
+sV[
+I1
+sVc
+I21
+sVb
+I23
+sVe
+I6
+sVg
+I3
+sVi
+I14
+sVë
+I1
+sVm
+I14
+sVl
+I15
+sVï
+I1
+sVn
+I45
+sVq
+I7
+sVp
+I28
+sVs
+I18
+sVr
+I61
+sVu
+I23
+sVt
+I16
+sVv
+I9
+ssVq
+p3266
+(dp3267
+Va
+I1
+sVp
+I4
+sVr
+I1
+sVo
+I3
+ssVq'
+p3268
+(dp3269
+Vu
+I1
+ssVqu
+p3270
+(dp3271
+Va
+I141
+sVâ
+I2
+sVe
+I931
+sV'
+I358
+sVi
+I462
+sVè
+I3
+sVo
+I57
+sVé
+I15
+ssVPr
+p3272
+(dp3273
+Vé
+I9
+sVu
+I1
+sVe
+I1
+sVi
+I6
+sVo
+I45
+ssVPu
+p3274
+(dp3275
+Vi
+I2
+sVp
+I2
+sVb
+I1
+ssVPy
+p3276
+(dp3277
+Vr
+I1
+ssVPa
+p3278
+(dp3279
+Vd
+I2
+sVg
+I1
+sVl
+I4
+sVn
+I99
+sVq
+I17
+sVs
+I1
+sVr
+I29
+sVy
+I1
+ssVPe
+p3280
+(dp3281
+Vr
+I3
+sVu
+I1
+sVt
+I2
+sVn
+I5
+ssVPi
+p3282
+(dp3283
+Ve
+I3
+ssVPo
+p3284
+(dp3285
+Vc
+I15
+sVi
+I3
+sVm
+I1
+sVl
+I5
+sVr
+I17
+sVu
+I11
+ssVPl
+p3286
+(dp3287
+Va
+I3
+sVu
+I1
+sVe
+I7
+ssVPR
+p3288
+(dp3289
+VI
+I3
+sVÉ
+I1
+sVE
+I1
+sVO
+I9
+ssVwa
+p3290
+(dp3291
+Vi
+I1
+sV,
+I1
+sVn
+I4
+sVs
+I1
+sVr
+I8
+sVy
+I6
+ssVPT
+p3292
+(dp3293
+VI
+I2
+ssVPU
+p3294
+(dp3295
+VR
+I1
+sVB
+I2
+sVN
+I1
+ssVPA
+p3296
+(dp3297
+VR
+I3
+ssVPE
+p3298
+(dp3299
+VR
+I1
+ssVPH
+p3300
+(dp3301
+V,
+I1
+ssVPI
+p3302
+(dp3303
+VT
+I30
+ssVPO
+p3304
+(dp3305
+VC
+I1
+sVS
+I2
+ssVPL
+p3306
+(dp3307
+VI
+I1
+ssVtz
+p3308
+(dp3309
+V
+I1
+sV,
+I1
+ssV0]
+p3310
+(dp3311
+V
+I2
+sV,
+I1
+ssVP.
+p3312
+(dp3313
+VC
+I1
+ssVdû
+p3314
+(dp3315
+V
+I1
+sVt
+I2
+ssVck
+p3316
+(dp3317
+Vy
+I2
+sV
+I6
+sV[
+I1
+sV,
+I3
+sVh
+I11
+ssVci
+p3318
+(dp3319
+Va
+I22
+sV
+I36
+sVc
+I5
+sVe
+I62
+sVd
+I6
+sVf
+I3
+sVé
+I2
+sVè
+I2
+sVm
+I2
+sVl
+I8
+sVo
+I2
+sVn
+I38
+sVp
+I13
+sVs
+I20
+sVr
+I4
+sVt
+I13
+sVv
+I4
+sV;
+I1
+sV.
+I3
+sV,
+I10
+sV?
+I3
+ssVch
+p3320
+(dp3321
+Va
+I200
+sV
+I15
+sVâ
+I30
+sVe
+I224
+sVi
+I35
+sVè
+I21
+sVm
+I7
+sVo
+I54
+sVé
+I32
+sVr
+I11
+sVu
+I5
+sVt
+I1
+sVy
+I1
+ssVco
+p3322
+(dp3323
+Vc
+I20
+sVb
+I1
+sVe
+I16
+sVd
+I2
+sVg
+I4
+sVf
+I1
+sVi
+I2
+sV-
+I1
+sVm
+I227
+sVl
+I25
+sVï
+I1
+sVn
+I271
+sVq
+I7
+sVp
+I17
+sVs
+I5
+sVr
+I92
+sVu
+I198
+sVt
+I3
+sVv
+I1
+sVû
+I5
+sV,
+I1
+ssVcl
+p3324
+(dp3325
+Va
+I28
+sVe
+I30
+sVi
+I3
+sVo
+I3
+sVé
+I1
+sVu
+I20
+ssVcc
+p3326
+(dp3327
+Va
+I7
+sVe
+I8
+sVi
+I2
+sVè
+I1
+sVo
+I19
+sVq
+I1
+sVé
+I1
+sVr
+I2
+sVu
+I12
+ssVvé
+p3328
+(dp3329
+V
+I28
+sVc
+I2
+sVe
+I9
+sVd
+I1
+sV,
+I3
+sV.
+I3
+sVs
+I7
+sVr
+I33
+sV;
+I1
+sVn
+I6
+sV?
+I2
+ssVvê
+p3330
+(dp3331
+Vt
+I5
+ssVce
+p3332
+(dp3333
+V!
+I2
+sV
+I330
+sV,
+I34
+sV.
+I25
+sV;
+I12
+sV:
+I4
+sV?
+I4
+sV_
+I3
+sVa
+I6
+sVc
+I2
+sVd
+I2
+sVi
+I12
+sVm
+I18
+sVl
+I61
+sVn
+I56
+sVq
+I12
+sVp
+I19
+sVs
+I151
+sVr
+I16
+sVu
+I10
+sVt
+I109
+sVv
+I11
+ssVcz
+p3334
+(dp3335
+Vi
+I1
+ssVcy
+p3336
+(dp3337
+Vc
+I3
+ssVvô
+p3338
+(dp3339
+Vt
+I1
+ssVcs
+p3340
+(dp3341
+V
+I6
+sV,
+I5
+sV/
+I1
+sV.
+I1
+ssVcr
+p3342
+(dp3343
+Va
+I12
+sVâ
+I1
+sVe
+I20
+sVi
+I68
+sVè
+I1
+sVo
+I45
+sVé
+I16
+sVu
+I16
+sVy
+I1
+ssVcq
+p3344
+(dp3345
+Vu
+I12
+ssVcu
+p3346
+(dp3347
+V
+I2
+sVe
+I9
+sVi
+I8
+sVm
+I3
+sVl
+I28
+sVn
+I33
+sVp
+I7
+sVs
+I10
+sVr
+I39
+sVt
+I11
+sVv
+I1
+sVy
+I1
+sV,
+I1
+ssVct
+p3348
+(dp3349
+Va
+I12
+sV
+I38
+sV"
+I1
+sVe
+I35
+sV'
+I1
+sVi
+I25
+sVè
+I2
+sVl
+I3
+sVo
+I4
+sV.
+I1
+sVé
+I1
+sVs
+I5
+sVr
+I9
+sVu
+I8
+sV;
+I1
+ssVc)
+p3350
+(dp3351
+V(
+I2
+sV
+I1
+ssVc.
+p3352
+(dp3353
+V
+I7
+sV»
+I1
+ssVc,
+p3354
+(dp3355
+V
+I13
+ssVc!
+p3356
+(dp3357
+V
+I2
+ssVc
+p3358
+(dp3359
+Vp
+I10
+sVA
+I1
+sVC
+I4
+sVD
+I1
+sVM
+I4
+sVP
+I2
+sVT
+I1
+sVa
+I5
+sVc
+I7
+sVb
+I3
+sVe
+I9
+sVd
+I19
+sVg
+I1
+sVf
+I2
+sVé
+I2
+sVj
+I1
+sVm
+I9
+sVl
+I26
+sVn
+I2
+sVq
+I8
+sVi
+I2
+sVs
+I10
+sVr
+I2
+sVu
+I19
+sVt
+I8
+sVv
+I4
+ssVc'
+p3360
+(dp3361
+Vé
+I22
+sVe
+I65
+ssVc;
+p3362
+(dp3363
+V
+I2
+ssVc:
+p3364
+(dp3365
+V
+I1
+ssVva
+p3366
+(dp3367
+V
+I34
+sVc
+I2
+sVb
+I2
+sVd
+I1
+sVg
+I13
+sVi
+I335
+sV,
+I5
+sVl
+I50
+sV.
+I2
+sVs
+I3
+sVr
+I2
+sVu
+I19
+sVt
+I2
+sV;
+I1
+sVn
+I101
+ssVcé
+p3368
+(dp3369
+V
+I6
+sVe
+I4
+sVd
+I11
+sVl
+I3
+sVn
+I1
+sVs
+I2
+sVr
+I7
+ssVcè
+p3370
+(dp3371
+Vs
+I5
+sVr
+I7
+sVn
+I4
+ssVcî
+p3372
+(dp3373
+Vm
+I1
+ssVvh
+p3374
+(dp3375
+Vé
+I1
+ssVvi
+p3376
+(dp3377
+Va
+I4
+sV
+I7
+sVc
+I15
+sVe
+I135
+sVd
+I14
+sVg
+I4
+sVf
+I2
+sVè
+I4
+sVl
+I45
+sVo
+I18
+sVn
+I71
+sVs
+I37
+sVr
+I21
+sVt
+I35
+sVv
+I18
+sVz
+I3
+sV,
+I1
+ssVvo
+p3378
+(dp3379
+Vc
+I1
+sVe
+I2
+sVg
+I1
+sVi
+I171
+sVm
+I1
+sVl
+I38
+sVn
+I24
+sVs
+I18
+sVr
+I8
+sVu
+I396
+sVt
+I46
+sVy
+I83
+sVû
+I3
+ssVvr
+p3380
+(dp3381
+Va
+I31
+sVe
+I63
+sVi
+I8
+sVè
+I1
+sVo
+I3
+sVé
+I3
+ssVvu
+p3382
+(dp3383
+V
+I34
+sVe
+I11
+sVl
+I4
+sV,
+I5
+sV;
+I1
+sV.
+I1
+sV?
+I1
+ssVcô
+p3384
+(dp3385
+Vt
+I18
+ssVOc
+p3386
+(dp3387
+Vh
+I1
+sVt
+I2
+ssV/g
+p3388
+(dp3389
+Va
+I2
+sVu
+I3
+ssV/f
+p3390
+(dp3391
+Vt
+I1
+ssV/e
+p3392
+(dp3393
+VB
+I3
+ssV/d
+p3394
+(dp3395
+Vo
+I3
+ssV/b
+p3396
+(dp3397
+Vo
+I1
+ssV/w
+p3398
+(dp3399
+Vw
+I3
+ssV/p
+p3400
+(dp3401
+Vr
+I1
+sVu
+I1
+sVg
+I1
+ssV//
+p3402
+(dp3403
+Vp
+I1
+sVw
+I3
+sVg
+I3
+sVf
+I1
+ssV/1
+p3404
+(dp3405
+V1
+I1
+ssV/0
+p3406
+(dp3407
+V2
+I1
+ssVBE
+p3408
+(dp3409
+V
+I1
+sVR
+I10
+sVU
+I2
+sVF
+I1
+ssVBA
+p3410
+(dp3411
+VT
+I1
+ssVBC
+p3412
+(dp3413
+VD
+I2
+ssVBL
+p3414
+(dp3415
+VI
+I2
+ssVBO
+p3416
+(dp3417
+VU
+I1
+sVO
+I6
+ssVBI
+p3418
+(dp3419
+VL
+I3
+ssVBU
+p3420
+(dp3421
+VT
+I3
+ssVû
+p3422
+(dp3423
+Vf
+I1
+ssVBR
+p3424
+(dp3425
+VA
+I2
+sVE
+I1
+ssVBe
+p3426
+(dp3427
+Va
+I1
+sV
+I1
+sVr
+I2
+ssVBa
+p3428
+(dp3429
+Va
+I1
+sVs
+I1
+sVb
+I1
+sVt
+I2
+sVd
+I2
+ssVBo
+p3430
+(dp3431
+Vr
+I8
+sVu
+I1
+sVt
+I1
+sVo
+I46
+sVn
+I2
+ssVBi
+p3432
+(dp3433
+Vs
+I3
+sVb
+I3
+sVe
+I1
+ssVBu
+p3434
+(dp3435
+Vé
+I12
+sVe
+I1
+sVl
+I22
+sVt
+I1
+ssVBr
+p3436
+(dp3437
+Vi
+I1
+sVe
+I2
+ssVBy
+p3438
+(dp3439
+V
+I4
+sVn
+I3
+ssVûr
+p3440
+(dp3441
+Ve
+I1
+ssVût
+p3442
+(dp3443
+Va
+I3
+sV
+I35
+sVe
+I11
+sVé
+I7
+sV-
+I2
+sV,
+I2
+sV.
+I1
+sVs
+I1
+ssVûm
+p3444
+(dp3445
+Ve
+I2
+ssVûl
+p3446
+(dp3447
+Vé
+I7
+sVa
+I2
+sVe
+I4
+ssVB
+p3448
+(dp3449
+V1
+I1
+ssVB,
+p3450
+(dp3451
+V
+I3
+ssVB.
+p3452
+(dp3453
+V
+I45
+ssVU'
+p3454
+(dp3455
+VI
+I1
+sVO
+I1
+ssVU
+p3456
+(dp3457
+VA
+I1
+sV"
+I1
+sVD
+I2
+sVG
+I1
+sVH
+I1
+sV*
+I1
+sVB
+I1
+sVU
+I1
+ssVUt
+p3458
+(dp3459
+Va
+I1
+sVr
+I1
+ssVUr
+p3460
+(dp3461
+Vb
+I4
+ssVUn
+p3462
+(dp3463
+Vi
+I3
+sV
+I24
+sVe
+I2
+ssVUT
+p3464
+(dp3465
+VI
+I1
+sV
+I4
+sVE
+I8
+ssVUV
+p3466
+(dp3467
+VÉ
+I1
+sVR
+I2
+ssVUS
+p3468
+(dp3469
+V
+I2
+sVE
+I1
+ssVUR
+p3470
+(dp3471
+V
+I1
+sVU
+I1
+sV,
+I1
+sVP
+I1
+ssVUM
+p3472
+(dp3473
+V
+I1
+sVB
+I2
+ssVUL
+p3474
+(dp3475
+VA
+I1
+ssVUN
+p3476
+(dp3477
+VI
+I1
+sVD
+I2
+ssVUI
+p3478
+(dp3479
+VE
+I1
+sVT
+I1
+ssVUE
+p3480
+(dp3481
+V
+I3
+sVN
+I1
+ssVUD
+p3482
+(dp3483
+VI
+I2
+ssVUC
+p3484
+(dp3485
+VH
+I3
+ssVUB
+p3486
+(dp3487
+VL
+I2
+ssVh:
+p3488
+(dp3489
+V
+I1
+ssVh;
+p3490
+(dp3491
+V
+I4
+ssV!"
+p3492
+(dp3493
+V
+I6
+ssVh?
+p3494
+(dp3495
+V
+I1
+ssV!)
+p3496
+(dp3497
+V
+I1
+sV.
+I1
+ssV!*
+p3498
+(dp3499
+V
+I1
+sV*
+I2
+ssV!-
+p3500
+(dp3501
+V-
+I1
+ssVeo
+p3502
+(dp3503
+Vi
+I2
+sVp
+I3
+sVr
+I4
+sVn
+I6
+ssVh.
+p3504
+(dp3505
+V
+I2
+ssVh,
+p3506
+(dp3507
+V
+I8
+ssVh
+p3508
+(dp3509
+Va
+I6
+sVo
+I2
+sVc
+I1
+sVb
+I8
+sVE
+I2
+sVd
+I2
+sVP
+I1
+sVi
+I1
+sVé
+I2
+sVH
+I1
+sVj
+I1
+sVm
+I1
+sVC
+I2
+sVO
+I1
+sVp
+I3
+sVu
+I1
+sVt
+I8
+sVv
+I1
+sVy
+I2
+sVe
+I1
+sVh
+I1
+ssVh!
+p3510
+(dp3511
+V
+I31
+ssVhy
+p3512
+(dp3513
+Va
+I1
+sVp
+I5
+sVs
+I20
+sV
+I1
+ssVhr
+p3514
+(dp3515
+Vé
+I8
+sVi
+I4
+sVe
+I1
+sVa
+I1
+sVo
+I2
+ssVht
+p3516
+(dp3517
+V
+I13
+sVi
+I3
+sVm
+I2
+sV,
+I2
+sVs
+I2
+sVt
+I5
+ssVhu
+p3518
+(dp3519
+Vi
+I17
+sVm
+I13
+sVn
+I13
+sVs
+I4
+sVr
+I1
+sVt
+I2
+sV;
+I1
+ssVhi
+p3520
+(dp3521
+V
+I1
+sVc
+I3
+sVb
+I1
+sVe
+I12
+sVd
+I2
+sVg
+I1
+sVm
+I1
+sVl
+I26
+sVo
+I2
+sVn
+I19
+sVq
+I1
+sVs
+I54
+sVr
+I11
+sVt
+I1
+sVv
+I6
+ssVà,
+p3522
+(dp3523
+V
+I8
+ssVhl
+p3524
+(dp3525
+V,
+I2
+sV.
+I2
+ssVhm
+p3526
+(dp3527
+Vé
+I1
+sVe
+I7
+sVo
+I1
+ssVà-
+p3528
+(dp3529
+Vd
+I3
+sVv
+I1
+sVl
+I2
+sVf
+I2
+ssVhe
+p3530
+(dp3531
+Va
+I4
+sV
+I131
+sVc
+I4
+sV:
+I2
+sVd
+I2
+sVf
+I6
+sVm
+I14
+sV,
+I17
+sVn
+I8
+sVq
+I1
+sV.
+I9
+sVs
+I37
+sVr
+I89
+sVu
+I59
+sVt
+I12
+sVv
+I23
+sVy
+I6
+sV;
+I5
+sVz
+I34
+sV?
+I2
+sVl
+I1
+ssV!_
+p3532
+(dp3533
+V
+I2
+ssVÂC
+p3534
+(dp3535
+VE
+I1
+ssVà:
+p3536
+(dp3537
+V
+I1
+ssVà;
+p3538
+(dp3539
+V
+I1
+ssV48
+p3540
+(dp3541
+V.
+I1
+ssV46
+p3542
+(dp3543
+V5
+I1
+ssV47
+p3544
+(dp3545
+V0
+I2
+sV.
+I1
+ssV44
+p3546
+(dp3547
+V.
+I1
+ssV42
+p3548
+(dp3549
+V9
+I1
+sV0
+I1
+ssV43
+p3550
+(dp3551
+V5
+I1
+sV6
+I1
+ssV40
+p3552
+(dp3553
+V
+I1
+sV0
+I2
+ssV41
+p3554
+(dp3555
+V
+I1
+sV0
+I1
+ssV4.
+p3556
+(dp3557
+V
+I4
+ssV4,
+p3558
+(dp3559
+V
+I3
+ssV4-
+p3560
+(dp3561
+V3
+I1
+sV6
+I2
+ssV4%
+p3562
+(dp3563
+V
+I1
+ssV4
+p3564
+(dp3565
+Va
+I1
+sVJ
+I2
+sVm
+I2
+sVo
+I1
+ssV4]
+p3566
+(dp3567
+V
+I3
+sV;
+I1
+sV.
+I2
+ssVhô
+p3568
+(dp3569
+Vp
+I2
+sVt
+I16
+ssVhè
+p3570
+(dp3571
+Vq
+I3
+sVr
+I20
+sVt
+I1
+sVv
+I1
+ssVhé
+p3572
+(dp3573
+Va
+I9
+sV
+I18
+sVâ
+I4
+sVe
+I9
+sVi
+I1
+sVm
+I3
+sV,
+I1
+sVo
+I9
+sVn
+I1
+sVs
+I5
+sVr
+I9
+sVt
+I2
+sV;
+I1
+sV.
+I1
+sVb
+I1
+sVl
+I1
+ssVhâ
+p3574
+(dp3575
+Vt
+I31
+ssVhà
+p3576
+(dp3577
+Vt
+I1
+ssV-s
+p3578
+(dp3579
+Vi
+I2
+sVu
+I2
+sVe
+I2
+sssb.
\ No newline at end of file
Deleted: trunk/lib/venus/examples/filters/guess-language/guess-language.py
===================================================================
--- branches/sucs-site/lib/venus/examples/filters/guess-language/guess-language.py 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/lib/venus/examples/filters/guess-language/guess-language.py 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,58 +0,0 @@
-#!/usr/bin/env python
-"""A filter to guess languages.
-
-This filter guesses whether an Atom entry is written
-in English or French. It should be trivial to chose between
-two other languages, easy to extend to more than two languages
-and useful to pass these languages as Venus configuration
-parameters.
-
-(See the REAME file for more details).
-
-Requires Python 2.1, recommends 2.4.
-"""
-__authors__ = [ "Eric van der Vlist <vdv at dyomedea.com>"]
-__license__ = "Python"
-
-import amara
-from sys import stdin, stdout
-from trigram import Trigram
-from xml.dom import XML_NAMESPACE as XML_NS
-import cPickle
-
-ATOM_NSS = {
- u'atom': u'http://www.w3.org/2005/Atom',
- u'xml': XML_NS
-}
-
-langs = {}
-
-def tri(lang):
- if not langs.has_key(lang):
- f = open('filters/guess-language/%s.data' % lang, 'r')
- t = cPickle.load(f)
- f.close()
- langs[lang] = t
- return langs[lang]
-
-
-def guess_language(entry):
- text = u'';
- for child in entry.xml_xpath(u'atom:title|atom:summary|atom:content'):
- text = text + u' '+ child.__unicode__()
- t = Trigram()
- t.parseString(text)
- if tri('fr') - t > tri('en') - t:
- lang=u'en'
- else:
- lang=u'fr'
- entry.xml_set_attribute((u'xml:lang', XML_NS), lang)
-
-def main():
- feed = amara.parse(stdin, prefixes=ATOM_NSS)
- for entry in feed.xml_xpath(u'//atom:entry[not(@xml:lang)]'):
- guess_language(entry)
- feed.xml(stdout)
-
-if __name__ == '__main__':
- main()
Copied: trunk/lib/venus/examples/filters/guess-language/guess-language.py (from rev 656, branches/sucs-site/lib/venus/examples/filters/guess-language/guess-language.py)
===================================================================
--- trunk/lib/venus/examples/filters/guess-language/guess-language.py (rev 0)
+++ trunk/lib/venus/examples/filters/guess-language/guess-language.py 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,58 @@
+#!/usr/bin/env python
+"""A filter to guess languages.
+
+This filter guesses whether an Atom entry is written
+in English or French. It should be trivial to chose between
+two other languages, easy to extend to more than two languages
+and useful to pass these languages as Venus configuration
+parameters.
+
+(See the REAME file for more details).
+
+Requires Python 2.1, recommends 2.4.
+"""
+__authors__ = [ "Eric van der Vlist <vdv at dyomedea.com>"]
+__license__ = "Python"
+
+import amara
+from sys import stdin, stdout
+from trigram import Trigram
+from xml.dom import XML_NAMESPACE as XML_NS
+import cPickle
+
+ATOM_NSS = {
+ u'atom': u'http://www.w3.org/2005/Atom',
+ u'xml': XML_NS
+}
+
+langs = {}
+
+def tri(lang):
+ if not langs.has_key(lang):
+ f = open('filters/guess-language/%s.data' % lang, 'r')
+ t = cPickle.load(f)
+ f.close()
+ langs[lang] = t
+ return langs[lang]
+
+
+def guess_language(entry):
+ text = u'';
+ for child in entry.xml_xpath(u'atom:title|atom:summary|atom:content'):
+ text = text + u' '+ child.__unicode__()
+ t = Trigram()
+ t.parseString(text)
+ if tri('fr') - t > tri('en') - t:
+ lang=u'en'
+ else:
+ lang=u'fr'
+ entry.xml_set_attribute((u'xml:lang', XML_NS), lang)
+
+def main():
+ feed = amara.parse(stdin, prefixes=ATOM_NSS)
+ for entry in feed.xml_xpath(u'//atom:entry[not(@xml:lang)]'):
+ guess_language(entry)
+ feed.xml(stdout)
+
+if __name__ == '__main__':
+ main()
Deleted: trunk/lib/venus/examples/filters/guess-language/learn-language.py
===================================================================
--- branches/sucs-site/lib/venus/examples/filters/guess-language/learn-language.py 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/lib/venus/examples/filters/guess-language/learn-language.py 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,25 +0,0 @@
-#!/usr/bin/env python
-"""A filter to guess languages.
-
-This utility saves a Trigram object on file.
-
-(See the REAME file for more details).
-
-Requires Python 2.1, recommends 2.4.
-"""
-__authors__ = [ "Eric van der Vlist <vdv at dyomedea.com>"]
-__license__ = "Python"
-
-from trigram import Trigram
-from sys import argv
-from cPickle import dump
-
-
-def main():
- tri = Trigram(argv[1])
- out = open(argv[2], 'w')
- dump(tri, out)
- out.close()
-
-if __name__ == '__main__':
- main()
Copied: trunk/lib/venus/examples/filters/guess-language/learn-language.py (from rev 656, branches/sucs-site/lib/venus/examples/filters/guess-language/learn-language.py)
===================================================================
--- trunk/lib/venus/examples/filters/guess-language/learn-language.py (rev 0)
+++ trunk/lib/venus/examples/filters/guess-language/learn-language.py 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,25 @@
+#!/usr/bin/env python
+"""A filter to guess languages.
+
+This utility saves a Trigram object on file.
+
+(See the REAME file for more details).
+
+Requires Python 2.1, recommends 2.4.
+"""
+__authors__ = [ "Eric van der Vlist <vdv at dyomedea.com>"]
+__license__ = "Python"
+
+from trigram import Trigram
+from sys import argv
+from cPickle import dump
+
+
+def main():
+ tri = Trigram(argv[1])
+ out = open(argv[2], 'w')
+ dump(tri, out)
+ out.close()
+
+if __name__ == '__main__':
+ main()
Deleted: trunk/lib/venus/examples/filters/guess-language/trigram.py
===================================================================
--- branches/sucs-site/lib/venus/examples/filters/guess-language/trigram.py 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/lib/venus/examples/filters/guess-language/trigram.py 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,188 +0,0 @@
-#!/usr/bin/python
-# -*- coding: UTF-8 -*-
-"""
- This class is based on the Python recipe titled
- "Language detection using character trigrams"
- http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/326576
- by Douglas Bagnall.
- It has been (slightly) adapted by Eric van der Vlist to support
- Unicode and accept a method to parse strings.
-"""
-__authors__ = [ "Douglas Bagnall", "Eric van der Vlist <vdv at dyomedea.com>"]
-__license__ = "Python"
-
-import random
-from urllib import urlopen
-
-class Trigram:
- """
- From one or more text files, the frequency of three character
- sequences is calculated. When treated as a vector, this information
- can be compared to other trigrams, and the difference between them
- seen as an angle. The cosine of this angle varies between 1 for
- complete similarity, and 0 for utter difference. Since letter
- combinations are characteristic to a language, this can be used to
- determine the language of a body of text. For example:
-
- >>> reference_en = Trigram('/path/to/reference/text/english')
- >>> reference_de = Trigram('/path/to/reference/text/german')
- >>> unknown = Trigram('url://pointing/to/unknown/text')
- >>> unknown.similarity(reference_de)
- 0.4
- >>> unknown.similarity(reference_en)
- 0.95
-
- would indicate the unknown text is almost cetrtainly English. As
- syntax sugar, the minus sign is overloaded to return the difference
- between texts, so the above objects would give you:
-
- >>> unknown - reference_de
- 0.6
- >>> reference_en - unknown # order doesn't matter.
- 0.05
-
- As it stands, the Trigram ignores character set information, which
- means you can only accurately compare within a single encoding
- (iso-8859-1 in the examples). A more complete implementation might
- convert to unicode first.
-
- As an extra bonus, there is a method to make up nonsense words in the
- style of the Trigram's text.
-
- >>> reference_en.makeWords(30)
- My withillonquiver and ald, by now wittlectionsurper, may sequia,
- tory, I ad my notter. Marriusbabilly She lady for rachalle spen
- hat knong al elf
-
- Beware when using urls: HTML won't be parsed out.
-
- Most methods chatter away to standard output, to let you know they're
- still there.
- """
-
- length = 0
-
- def __init__(self, fn=None):
- self.lut = {}
- if fn is not None:
- self.parseFile(fn)
-
- def _parseAFragment(self, line, pair=' '):
- for letter in line:
- d = self.lut.setdefault(pair, {})
- d[letter] = d.get(letter, 0) + 1
- pair = pair[1] + letter
- return pair
-
- def parseString(self, string):
- self._parseAFragment(string)
- self.measure()
-
- def parseFile(self, fn, encoding="iso-8859-1"):
- pair = ' '
- if '://' in fn:
- #print "trying to fetch url, may take time..."
- f = urlopen(fn)
- else:
- f = open(fn)
- for z, line in enumerate(f):
- #if not z % 1000:
- # print "line %s" % z
- # \n's are spurious in a prose context
- pair = self._parseAFragment(line.strip().decode(encoding) + ' ')
- f.close()
- self.measure()
-
-
- def measure(self):
- """calculates the scalar length of the trigram vector and
- stores it in self.length."""
- total = 0
- for y in self.lut.values():
- total += sum([ x * x for x in y.values() ])
- self.length = total ** 0.5
-
- def similarity(self, other):
- """returns a number between 0 and 1 indicating similarity.
- 1 means an identical ratio of trigrams;
- 0 means no trigrams in common.
- """
- if not isinstance(other, Trigram):
- raise TypeError("can't compare Trigram with non-Trigram")
- lut1 = self.lut
- lut2 = other.lut
- total = 0
- for k in lut1.keys():
- if k in lut2:
- a = lut1[k]
- b = lut2[k]
- for x in a:
- if x in b:
- total += a[x] * b[x]
-
- return float(total) / (self.length * other.length)
-
- def __sub__(self, other):
- """indicates difference between trigram sets; 1 is entirely
- different, 0 is entirely the same."""
- return 1 - self.similarity(other)
-
-
- def makeWords(self, count):
- """returns a string of made-up words based on the known text."""
- text = []
- k = ' '
- while count:
- n = self.likely(k)
- text.append(n)
- k = k[1] + n
- if n in ' \t':
- count -= 1
- return ''.join(text)
-
-
- def likely(self, k):
- """Returns a character likely to follow the given string
- two character string, or a space if nothing is found."""
- if k not in self.lut:
- return ' '
- # if you were using this a lot, caching would a good idea.
- letters = []
- for k, v in self.lut[k].items():
- letters.append(k * v)
- letters = ''.join(letters)
- return random.choice(letters)
-
-
-def test():
- en = Trigram('http://gutenberg.net/dirs/etext97/lsusn11.txt')
- #NB fr and some others have English license text.
- # no has english excerpts.
- fr = Trigram('http://gutenberg.net/dirs/etext03/candi10.txt')
- fi = Trigram('http://gutenberg.net/dirs/1/0/4/9/10492/10492-8.txt')
- no = Trigram('http://gutenberg.net/dirs/1/2/8/4/12844/12844-8.txt')
- se = Trigram('http://gutenberg.net/dirs/1/0/1/1/10117/10117-8.txt')
- no2 = Trigram('http://gutenberg.net/dirs/1/3/0/4/13041/13041-8.txt')
- en2 = Trigram('http://gutenberg.net/dirs/etext05/cfgsh10.txt')
- fr2 = Trigram('http://gutenberg.net/dirs/1/3/7/0/13704/13704-8.txt')
- print "calculating difference:"
- print "en - fr is %s" % (en - fr)
- print "fr - en is %s" % (fr - en)
- print "en - en2 is %s" % (en - en2)
- print "en - fr2 is %s" % (en - fr2)
- print "fr - en2 is %s" % (fr - en2)
- print "fr - fr2 is %s" % (fr - fr2)
- print "fr2 - en2 is %s" % (fr2 - en2)
- print "fi - fr is %s" % (fi - fr)
- print "fi - en is %s" % (fi - en)
- print "fi - se is %s" % (fi - se)
- print "no - se is %s" % (no - se)
- print "en - no is %s" % (en - no)
- print "no - no2 is %s" % (no - no2)
- print "se - no2 is %s" % (se - no2)
- print "en - no2 is %s" % (en - no2)
- print "fr - no2 is %s" % (fr - no2)
-
-
-if __name__ == '__main__':
- test()
Copied: trunk/lib/venus/examples/filters/guess-language/trigram.py (from rev 656, branches/sucs-site/lib/venus/examples/filters/guess-language/trigram.py)
===================================================================
--- trunk/lib/venus/examples/filters/guess-language/trigram.py (rev 0)
+++ trunk/lib/venus/examples/filters/guess-language/trigram.py 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,188 @@
+#!/usr/bin/python
+# -*- coding: UTF-8 -*-
+"""
+ This class is based on the Python recipe titled
+ "Language detection using character trigrams"
+ http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/326576
+ by Douglas Bagnall.
+ It has been (slightly) adapted by Eric van der Vlist to support
+ Unicode and accept a method to parse strings.
+"""
+__authors__ = [ "Douglas Bagnall", "Eric van der Vlist <vdv at dyomedea.com>"]
+__license__ = "Python"
+
+import random
+from urllib import urlopen
+
+class Trigram:
+ """
+ From one or more text files, the frequency of three character
+ sequences is calculated. When treated as a vector, this information
+ can be compared to other trigrams, and the difference between them
+ seen as an angle. The cosine of this angle varies between 1 for
+ complete similarity, and 0 for utter difference. Since letter
+ combinations are characteristic to a language, this can be used to
+ determine the language of a body of text. For example:
+
+ >>> reference_en = Trigram('/path/to/reference/text/english')
+ >>> reference_de = Trigram('/path/to/reference/text/german')
+ >>> unknown = Trigram('url://pointing/to/unknown/text')
+ >>> unknown.similarity(reference_de)
+ 0.4
+ >>> unknown.similarity(reference_en)
+ 0.95
+
+ would indicate the unknown text is almost cetrtainly English. As
+ syntax sugar, the minus sign is overloaded to return the difference
+ between texts, so the above objects would give you:
+
+ >>> unknown - reference_de
+ 0.6
+ >>> reference_en - unknown # order doesn't matter.
+ 0.05
+
+ As it stands, the Trigram ignores character set information, which
+ means you can only accurately compare within a single encoding
+ (iso-8859-1 in the examples). A more complete implementation might
+ convert to unicode first.
+
+ As an extra bonus, there is a method to make up nonsense words in the
+ style of the Trigram's text.
+
+ >>> reference_en.makeWords(30)
+ My withillonquiver and ald, by now wittlectionsurper, may sequia,
+ tory, I ad my notter. Marriusbabilly She lady for rachalle spen
+ hat knong al elf
+
+ Beware when using urls: HTML won't be parsed out.
+
+ Most methods chatter away to standard output, to let you know they're
+ still there.
+ """
+
+ length = 0
+
+ def __init__(self, fn=None):
+ self.lut = {}
+ if fn is not None:
+ self.parseFile(fn)
+
+ def _parseAFragment(self, line, pair=' '):
+ for letter in line:
+ d = self.lut.setdefault(pair, {})
+ d[letter] = d.get(letter, 0) + 1
+ pair = pair[1] + letter
+ return pair
+
+ def parseString(self, string):
+ self._parseAFragment(string)
+ self.measure()
+
+ def parseFile(self, fn, encoding="iso-8859-1"):
+ pair = ' '
+ if '://' in fn:
+ #print "trying to fetch url, may take time..."
+ f = urlopen(fn)
+ else:
+ f = open(fn)
+ for z, line in enumerate(f):
+ #if not z % 1000:
+ # print "line %s" % z
+ # \n's are spurious in a prose context
+ pair = self._parseAFragment(line.strip().decode(encoding) + ' ')
+ f.close()
+ self.measure()
+
+
+ def measure(self):
+ """calculates the scalar length of the trigram vector and
+ stores it in self.length."""
+ total = 0
+ for y in self.lut.values():
+ total += sum([ x * x for x in y.values() ])
+ self.length = total ** 0.5
+
+ def similarity(self, other):
+ """returns a number between 0 and 1 indicating similarity.
+ 1 means an identical ratio of trigrams;
+ 0 means no trigrams in common.
+ """
+ if not isinstance(other, Trigram):
+ raise TypeError("can't compare Trigram with non-Trigram")
+ lut1 = self.lut
+ lut2 = other.lut
+ total = 0
+ for k in lut1.keys():
+ if k in lut2:
+ a = lut1[k]
+ b = lut2[k]
+ for x in a:
+ if x in b:
+ total += a[x] * b[x]
+
+ return float(total) / (self.length * other.length)
+
+ def __sub__(self, other):
+ """indicates difference between trigram sets; 1 is entirely
+ different, 0 is entirely the same."""
+ return 1 - self.similarity(other)
+
+
+ def makeWords(self, count):
+ """returns a string of made-up words based on the known text."""
+ text = []
+ k = ' '
+ while count:
+ n = self.likely(k)
+ text.append(n)
+ k = k[1] + n
+ if n in ' \t':
+ count -= 1
+ return ''.join(text)
+
+
+ def likely(self, k):
+ """Returns a character likely to follow the given string
+ two character string, or a space if nothing is found."""
+ if k not in self.lut:
+ return ' '
+ # if you were using this a lot, caching would a good idea.
+ letters = []
+ for k, v in self.lut[k].items():
+ letters.append(k * v)
+ letters = ''.join(letters)
+ return random.choice(letters)
+
+
+def test():
+ en = Trigram('http://gutenberg.net/dirs/etext97/lsusn11.txt')
+ #NB fr and some others have English license text.
+ # no has english excerpts.
+ fr = Trigram('http://gutenberg.net/dirs/etext03/candi10.txt')
+ fi = Trigram('http://gutenberg.net/dirs/1/0/4/9/10492/10492-8.txt')
+ no = Trigram('http://gutenberg.net/dirs/1/2/8/4/12844/12844-8.txt')
+ se = Trigram('http://gutenberg.net/dirs/1/0/1/1/10117/10117-8.txt')
+ no2 = Trigram('http://gutenberg.net/dirs/1/3/0/4/13041/13041-8.txt')
+ en2 = Trigram('http://gutenberg.net/dirs/etext05/cfgsh10.txt')
+ fr2 = Trigram('http://gutenberg.net/dirs/1/3/7/0/13704/13704-8.txt')
+ print "calculating difference:"
+ print "en - fr is %s" % (en - fr)
+ print "fr - en is %s" % (fr - en)
+ print "en - en2 is %s" % (en - en2)
+ print "en - fr2 is %s" % (en - fr2)
+ print "fr - en2 is %s" % (fr - en2)
+ print "fr - fr2 is %s" % (fr - fr2)
+ print "fr2 - en2 is %s" % (fr2 - en2)
+ print "fi - fr is %s" % (fi - fr)
+ print "fi - en is %s" % (fi - en)
+ print "fi - se is %s" % (fi - se)
+ print "no - se is %s" % (no - se)
+ print "en - no is %s" % (en - no)
+ print "no - no2 is %s" % (no - no2)
+ print "se - no2 is %s" % (se - no2)
+ print "en - no2 is %s" % (en - no2)
+ print "fr - no2 is %s" % (fr - no2)
+
+
+if __name__ == '__main__':
+ test()
Deleted: trunk/lib/venus/examples/filters/xpath-sifter/xpath-sifter.ini
===================================================================
--- branches/sucs-site/lib/venus/examples/filters/xpath-sifter/xpath-sifter.ini 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/lib/venus/examples/filters/xpath-sifter/xpath-sifter.ini 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,55 +0,0 @@
-# The xpath_sifter filter allows you to stop entries from a feed being displayed
-# if they do not match a particular pattern.
-
-# It is useful for things like only displaying entries in a particular category
-# even if the site does not provide per category feeds, and displaying only entries
-# that contain a particular string in their title.
-
-# The xpath_sifter filter applies only after all feeds are normalised to Atom 1.0.
-# Look in your cache to see what entries look like.
-
-[Planet]
-# we are only applying the filter to certain feeds, so we do not configure it in the
-# [Planet] section
-
-### FIRST FEED: FILTER ON CATEGORY ###
-
-# We are only interested in entries in the category "two" from this blogger, but
-# he does not provide a per-category feed.
-# The Atom for categories looks like this: <category term="two"/>, so here
-# we filter the http://example.com/uncategorised.xml file for entries with a
-# category tag with the term attribute equal to 'two'
-[http://example.com/uncategorised.xml]
-name = Category 'two' (from Site Without a Categorised Feed)
-
-# This first version is the readable way to do it, but you'll run into trouble
-# if you have any special characters, like spaces, in your require string
-# filters = xpath_sifter.py?require=//atom:category[@term='two']
-
-# Here's a URL quoted version:
-filters = xpath_sifter.py?require=//atom%3Acategory%5B%40term%3D%27two%27%5D
-
-# Here's a way to get the URL quoted version on the command line:
-# python -c "import urllib; print urllib.quote('STRING');"
-# eg
-# python -c "import urllib; print urllib.quote('atom:category[@term=\'two\']');"
-
-### SECOND FEED: FILTER ON TITLE ###
-
-# The verbose blogger whose feed is below blogs about many subjects but we are
-# only interested in entries about Venus. She does not use categories but
-# fortunately her titles are very consistent, so we search within the title
-# tag's text for the text 'Venus'
-[http://example.com/verbose.xml]
-name = Venus (from Verbose Site)
-
-# Non-quoted version
-# filters = xpath_sifter.py?require=//atom:title[contains(.,'Venus')]
-# Quoted version
-filters = xpath_sifter.py?atom%3Atitle%5Bcontains%28.%2C%27Venus%27%29%5D
-
-### THIRD FEED: NO FILTER ###
-
-# We can include other feeds that do not have the filter applied
-[http://example.com/normal.xml]
-name = No filter applied
Copied: trunk/lib/venus/examples/filters/xpath-sifter/xpath-sifter.ini (from rev 656, branches/sucs-site/lib/venus/examples/filters/xpath-sifter/xpath-sifter.ini)
===================================================================
--- trunk/lib/venus/examples/filters/xpath-sifter/xpath-sifter.ini (rev 0)
+++ trunk/lib/venus/examples/filters/xpath-sifter/xpath-sifter.ini 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,55 @@
+# The xpath_sifter filter allows you to stop entries from a feed being displayed
+# if they do not match a particular pattern.
+
+# It is useful for things like only displaying entries in a particular category
+# even if the site does not provide per category feeds, and displaying only entries
+# that contain a particular string in their title.
+
+# The xpath_sifter filter applies only after all feeds are normalised to Atom 1.0.
+# Look in your cache to see what entries look like.
+
+[Planet]
+# we are only applying the filter to certain feeds, so we do not configure it in the
+# [Planet] section
+
+### FIRST FEED: FILTER ON CATEGORY ###
+
+# We are only interested in entries in the category "two" from this blogger, but
+# he does not provide a per-category feed.
+# The Atom for categories looks like this: <category term="two"/>, so here
+# we filter the http://example.com/uncategorised.xml file for entries with a
+# category tag with the term attribute equal to 'two'
+[http://example.com/uncategorised.xml]
+name = Category 'two' (from Site Without a Categorised Feed)
+
+# This first version is the readable way to do it, but you'll run into trouble
+# if you have any special characters, like spaces, in your require string
+# filters = xpath_sifter.py?require=//atom:category[@term='two']
+
+# Here's a URL quoted version:
+filters = xpath_sifter.py?require=//atom%3Acategory%5B%40term%3D%27two%27%5D
+
+# Here's a way to get the URL quoted version on the command line:
+# python -c "import urllib; print urllib.quote('STRING');"
+# eg
+# python -c "import urllib; print urllib.quote('atom:category[@term=\'two\']');"
+
+### SECOND FEED: FILTER ON TITLE ###
+
+# The verbose blogger whose feed is below blogs about many subjects but we are
+# only interested in entries about Venus. She does not use categories but
+# fortunately her titles are very consistent, so we search within the title
+# tag's text for the text 'Venus'
+[http://example.com/verbose.xml]
+name = Venus (from Verbose Site)
+
+# Non-quoted version
+# filters = xpath_sifter.py?require=//atom:title[contains(.,'Venus')]
+# Quoted version
+filters = xpath_sifter.py?atom%3Atitle%5Bcontains%28.%2C%27Venus%27%29%5D
+
+### THIRD FEED: NO FILTER ###
+
+# We can include other feeds that do not have the filter applied
+[http://example.com/normal.xml]
+name = No filter applied
Deleted: trunk/lib/venus/examples/foaf-based.ini
===================================================================
--- branches/sucs-site/lib/venus/examples/foaf-based.ini 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/lib/venus/examples/foaf-based.ini 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,44 +0,0 @@
-# Planet configuration file
-
-# Every planet needs a [Planet] section
-[Planet]
-# name: Your planet's name
-# link: Link to the main page
-# owner_name: Your name
-# owner_email: Your e-mail address
-name = Elias' Planet
-link = http://torrez.us/planet/
-owner_name = Elias Torres
-owner_email = elias at torrez.us
-
-# cache_directory: Where cached feeds are stored
-# log_level: One of DEBUG, INFO, WARNING, ERROR or CRITICAL
-cache_directory = /tmp/venus/
-log_level = DEBUG
-
-# The following provide defaults for each template:
-# output_theme: "theme" of the output
-# output_dir: Directory to place output files
-# items_per_page: How many items to put on each page
-output_theme = mobile
-output_dir = /var/www/planet
-items_per_page = 60
-
-# If non-zero, all feeds which have not been updated in the indicated
-# number of days will be marked as inactive
-activity_threshold = 90
-
-# filters to be run
-filters = excerpt.py
-
-# filter parameters
-[excerpt.py]
-omit = img p br
-width = 500
-
-# subscription list
-[http://torrez.us/who#elias]
-content_type = foaf
-online_accounts =
- http://del.icio.us/|http://del.icio.us/rss/{foaf:accountName}
- http://flickr.com/|http://api.flickr.com/services/feeds/photos_public.gne?id={foaf:accountName}
Copied: trunk/lib/venus/examples/foaf-based.ini (from rev 656, branches/sucs-site/lib/venus/examples/foaf-based.ini)
===================================================================
--- trunk/lib/venus/examples/foaf-based.ini (rev 0)
+++ trunk/lib/venus/examples/foaf-based.ini 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,44 @@
+# Planet configuration file
+
+# Every planet needs a [Planet] section
+[Planet]
+# name: Your planet's name
+# link: Link to the main page
+# owner_name: Your name
+# owner_email: Your e-mail address
+name = Elias' Planet
+link = http://torrez.us/planet/
+owner_name = Elias Torres
+owner_email = elias at torrez.us
+
+# cache_directory: Where cached feeds are stored
+# log_level: One of DEBUG, INFO, WARNING, ERROR or CRITICAL
+cache_directory = /tmp/venus/
+log_level = DEBUG
+
+# The following provide defaults for each template:
+# output_theme: "theme" of the output
+# output_dir: Directory to place output files
+# items_per_page: How many items to put on each page
+output_theme = mobile
+output_dir = /var/www/planet
+items_per_page = 60
+
+# If non-zero, all feeds which have not been updated in the indicated
+# number of days will be marked as inactive
+activity_threshold = 90
+
+# filters to be run
+filters = excerpt.py
+
+# filter parameters
+[excerpt.py]
+omit = img p br
+width = 500
+
+# subscription list
+[http://torrez.us/who#elias]
+content_type = foaf
+online_accounts =
+ http://del.icio.us/|http://del.icio.us/rss/{foaf:accountName}
+ http://flickr.com/|http://api.flickr.com/services/feeds/photos_public.gne?id={foaf:accountName}
Deleted: trunk/lib/venus/examples/images/edd.png
===================================================================
(Binary files differ)
Copied: trunk/lib/venus/examples/images/edd.png (from rev 656, branches/sucs-site/lib/venus/examples/images/edd.png)
===================================================================
(Binary files differ)
Deleted: trunk/lib/venus/examples/images/jdub.png
===================================================================
(Binary files differ)
Copied: trunk/lib/venus/examples/images/jdub.png (from rev 656, branches/sucs-site/lib/venus/examples/images/jdub.png)
===================================================================
(Binary files differ)
Deleted: trunk/lib/venus/examples/images/keybuk.png
===================================================================
(Binary files differ)
Copied: trunk/lib/venus/examples/images/keybuk.png (from rev 656, branches/sucs-site/lib/venus/examples/images/keybuk.png)
===================================================================
(Binary files differ)
Deleted: trunk/lib/venus/examples/images/thom.png
===================================================================
(Binary files differ)
Copied: trunk/lib/venus/examples/images/thom.png (from rev 656, branches/sucs-site/lib/venus/examples/images/thom.png)
===================================================================
(Binary files differ)
Deleted: trunk/lib/venus/examples/opml-top100.ini
===================================================================
--- branches/sucs-site/lib/venus/examples/opml-top100.ini 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/lib/venus/examples/opml-top100.ini 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,53 +0,0 @@
-# Planet configuration file
-
-# Every planet needs a [Planet] section
-[Planet]
-# name: Your planet's name
-# link: Link to the main page
-# owner_name: Your name
-# owner_email: Your e-mail address
-name = OPML Top 100
-link = http://planet.intertwingly.net/top100/
-owner_name = Sam Ruby
-owner_email = rubys at intertwingly.net
-
-# cache_directory: Where cached feeds are stored
-# log_level: One of DEBUG, INFO, WARNING, ERROR or CRITICAL
-cache_directory = /home/rubys/planet/top100
-log_level = INFO
-
-# The following provide defaults for each template:
-# output_theme: "theme" of the output
-# output_dir: Directory to place output files
-# items_per_page: How many items to put on each page
-output_theme = mobile
-output_dir = /home/rubys/public_html/top100
-items_per_page = 60
-
-# If non-zero, all feeds which have not been updated in the indicated
-# number of days will be marked as inactive
-activity_threshold = 90
-
-# filters to be run
-filters = excerpt.py
-
-bill_of_materials:
- .htaccess
- favicon.ico
- robots.txt
-
-# filter parameters
-[excerpt.py]
-omit = img p br
-width = 500
-
-# add memes to output
-[index.html.xslt]
-filters = mememe.plugin
-
-[mememe.plugin]
-sidebar = //*[@id="footer"]
-
-# subscription list
-[http://share.opml.org/opml/top100.opml]
-content_type = opml
Copied: trunk/lib/venus/examples/opml-top100.ini (from rev 656, branches/sucs-site/lib/venus/examples/opml-top100.ini)
===================================================================
--- trunk/lib/venus/examples/opml-top100.ini (rev 0)
+++ trunk/lib/venus/examples/opml-top100.ini 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,53 @@
+# Planet configuration file
+
+# Every planet needs a [Planet] section
+[Planet]
+# name: Your planet's name
+# link: Link to the main page
+# owner_name: Your name
+# owner_email: Your e-mail address
+name = OPML Top 100
+link = http://planet.intertwingly.net/top100/
+owner_name = Sam Ruby
+owner_email = rubys at intertwingly.net
+
+# cache_directory: Where cached feeds are stored
+# log_level: One of DEBUG, INFO, WARNING, ERROR or CRITICAL
+cache_directory = /home/rubys/planet/top100
+log_level = INFO
+
+# The following provide defaults for each template:
+# output_theme: "theme" of the output
+# output_dir: Directory to place output files
+# items_per_page: How many items to put on each page
+output_theme = mobile
+output_dir = /home/rubys/public_html/top100
+items_per_page = 60
+
+# If non-zero, all feeds which have not been updated in the indicated
+# number of days will be marked as inactive
+activity_threshold = 90
+
+# filters to be run
+filters = excerpt.py
+
+bill_of_materials:
+ .htaccess
+ favicon.ico
+ robots.txt
+
+# filter parameters
+[excerpt.py]
+omit = img p br
+width = 500
+
+# add memes to output
+[index.html.xslt]
+filters = mememe.plugin
+
+[mememe.plugin]
+sidebar = //*[@id="footer"]
+
+# subscription list
+[http://share.opml.org/opml/top100.opml]
+content_type = opml
Deleted: trunk/lib/venus/examples/planet-schmanet.ini
===================================================================
--- branches/sucs-site/lib/venus/examples/planet-schmanet.ini 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/lib/venus/examples/planet-schmanet.ini 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,78 +0,0 @@
-# Planet configuration file based on the 'fancy' Planet 2.0 example.
-#
-# This illustrates some of Planet's fancier features with example.
-
-# Every planet needs a [Planet] section
-[Planet]
-# name: Your planet's name
-# link: Link to the main page
-# owner_name: Your name
-# owner_email: Your e-mail address
-name = Planet Schmanet
-link = http://planet.schmanet.janet/
-owner_name = Janet Weiss
-owner_email = janet at slut.sex
-
-# cache_directory: Where cached feeds are stored
-# log_level: One of DEBUG, INFO, WARNING, ERROR or CRITICAL
-# feed_timeout: number of seconds to wait for any given feed
-cache_directory = /home/rubys/planet/pscache
-log_level = DEBUG
-feed_timeout = 20
-
-# output_theme: "theme" of the output
-# output_dir: Directory to place output files
-# items_per_page: How many items to put on each page
-output_theme = classic_fancy
-output_dir = /home/rubys/public_html/fancy
-items_per_page = 60
-
-# additional files to copy (note the wildcards!)
-bill_of_materials:
- images/#{face}
-
-# Options placed in the [DEFAULT] section provide defaults for the feed
-# sections. Placing a default here means you only need to override the
-# special cases later.
-[DEFAULT]
-# Hackergotchi default size.
-# If we want to put a face alongside a feed, and it's this size, we
-# can omit these variables.
-facewidth = 65
-faceheight = 85
-
-
-# Any other section defines a feed to subscribe to. The section title
-# (in the []s) is the URI of the feed itself. A section can also be
-# have any of the following options:
-#
-# name: Name of the feed (defaults to the title found in the feed)
-#
-# Additionally any other option placed here will be available in
-# the template (prefixed with channel_ for the Items loop). We use
-# this trick to make the faces work -- this isn't something Planet
-# "natively" knows about. Look at fancy-examples/index.html.tmpl
-# for the flip-side of this.
-
-[http://www.netsplit.com/blog/index.rss]
-name = Scott James Remnant
-face = keybuk.png
-# pick up the default facewidth and faceheight
-
-[http://www.gnome.org/~jdub/blog/?flav=rss]
-name = Jeff Waugh
-face = jdub.png
-facewidth = 70
-faceheight = 74
-
-[http://usefulinc.com/edd/blog/rss91]
-name = Edd Dumbill
-face = edd.png
-facewidth = 62
-faceheight = 80
-
-[http://blog.clearairturbulence.org/?flav=rss]
-name = Thom May
-face = thom.png
-# pick up the default faceheight only
-facewidth = 59
Copied: trunk/lib/venus/examples/planet-schmanet.ini (from rev 656, branches/sucs-site/lib/venus/examples/planet-schmanet.ini)
===================================================================
--- trunk/lib/venus/examples/planet-schmanet.ini (rev 0)
+++ trunk/lib/venus/examples/planet-schmanet.ini 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,78 @@
+# Planet configuration file based on the 'fancy' Planet 2.0 example.
+#
+# This illustrates some of Planet's fancier features with example.
+
+# Every planet needs a [Planet] section
+[Planet]
+# name: Your planet's name
+# link: Link to the main page
+# owner_name: Your name
+# owner_email: Your e-mail address
+name = Planet Schmanet
+link = http://planet.schmanet.janet/
+owner_name = Janet Weiss
+owner_email = janet at slut.sex
+
+# cache_directory: Where cached feeds are stored
+# log_level: One of DEBUG, INFO, WARNING, ERROR or CRITICAL
+# feed_timeout: number of seconds to wait for any given feed
+cache_directory = /home/rubys/planet/pscache
+log_level = DEBUG
+feed_timeout = 20
+
+# output_theme: "theme" of the output
+# output_dir: Directory to place output files
+# items_per_page: How many items to put on each page
+output_theme = classic_fancy
+output_dir = /home/rubys/public_html/fancy
+items_per_page = 60
+
+# additional files to copy (note the wildcards!)
+bill_of_materials:
+ images/#{face}
+
+# Options placed in the [DEFAULT] section provide defaults for the feed
+# sections. Placing a default here means you only need to override the
+# special cases later.
+[DEFAULT]
+# Hackergotchi default size.
+# If we want to put a face alongside a feed, and it's this size, we
+# can omit these variables.
+facewidth = 65
+faceheight = 85
+
+
+# Any other section defines a feed to subscribe to. The section title
+# (in the []s) is the URI of the feed itself. A section can also be
+# have any of the following options:
+#
+# name: Name of the feed (defaults to the title found in the feed)
+#
+# Additionally any other option placed here will be available in
+# the template (prefixed with channel_ for the Items loop). We use
+# this trick to make the faces work -- this isn't something Planet
+# "natively" knows about. Look at fancy-examples/index.html.tmpl
+# for the flip-side of this.
+
+[http://www.netsplit.com/blog/index.rss]
+name = Scott James Remnant
+face = keybuk.png
+# pick up the default facewidth and faceheight
+
+[http://www.gnome.org/~jdub/blog/?flav=rss]
+name = Jeff Waugh
+face = jdub.png
+facewidth = 70
+faceheight = 74
+
+[http://usefulinc.com/edd/blog/rss91]
+name = Edd Dumbill
+face = edd.png
+facewidth = 62
+faceheight = 80
+
+[http://blog.clearairturbulence.org/?flav=rss]
+name = Thom May
+face = thom.png
+# pick up the default faceheight only
+facewidth = 59
Deleted: trunk/lib/venus/expunge.py
===================================================================
--- branches/sucs-site/lib/venus/expunge.py 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/lib/venus/expunge.py 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,17 +0,0 @@
-#!/usr/bin/env python
-"""
-Main program to run just the expunge portion of planet
-"""
-
-import os.path
-import sys
-from planet import expunge, config
-
-if __name__ == '__main__':
-
- if len(sys.argv) == 2 and os.path.isfile(sys.argv[1]):
- config.load(sys.argv[1])
- expunge.expungeCache()
- else:
- print "Usage:"
- print " python %s config.ini" % sys.argv[0]
Copied: trunk/lib/venus/expunge.py (from rev 656, branches/sucs-site/lib/venus/expunge.py)
===================================================================
--- trunk/lib/venus/expunge.py (rev 0)
+++ trunk/lib/venus/expunge.py 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,17 @@
+#!/usr/bin/env python
+"""
+Main program to run just the expunge portion of planet
+"""
+
+import os.path
+import sys
+from planet import expunge, config
+
+if __name__ == '__main__':
+
+ if len(sys.argv) == 2 and os.path.isfile(sys.argv[1]):
+ config.load(sys.argv[1])
+ expunge.expungeCache()
+ else:
+ print "Usage:"
+ print " python %s config.ini" % sys.argv[0]
Deleted: trunk/lib/venus/filters/addsearch.genshi
===================================================================
--- branches/sucs-site/lib/venus/filters/addsearch.genshi 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/lib/venus/filters/addsearch.genshi 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,30 +0,0 @@
-<html xmlns:py="http://genshi.edgewall.org/" py:strip="">
-
- <!--! insert search form -->
- <div py:match="div[@id='sidebar']" py:attrs="select('@*')">
- ${select('*')}
- <h2>Search</h2>
- <form><input name="q"/></form>
- </div>
-
- <?python from urlparse import urljoin ?>
-
- <!--! insert opensearch autodiscovery link -->
- <head py:match="head" py:attrs="select('@*')">
- ${select('*')}
- <link rel="search" type="application/opensearchdescription+xml"
- href="${urljoin(str(select('link[@rel=\'alternate\']/@href')),
- 'opensearchdescription.xml')}"
- title="${select('link[@rel=\'alternate\']/@title')} search"/>
- </head>
-
- <!--! ensure that scripts don't use empty tag syntax -->
- <script py:match="script" py:attrs="select('@*')">
- ${select('*')}
- </script>
-
- <!--! Include the original stream, which will be processed by the rules
- defined above -->
- ${input}
-
-</html>
Copied: trunk/lib/venus/filters/addsearch.genshi (from rev 656, branches/sucs-site/lib/venus/filters/addsearch.genshi)
===================================================================
--- trunk/lib/venus/filters/addsearch.genshi (rev 0)
+++ trunk/lib/venus/filters/addsearch.genshi 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,30 @@
+<html xmlns:py="http://genshi.edgewall.org/" py:strip="">
+
+ <!--! insert search form -->
+ <div py:match="div[@id='sidebar']" py:attrs="select('@*')">
+ ${select('*')}
+ <h2>Search</h2>
+ <form><input name="q"/></form>
+ </div>
+
+ <?python from urlparse import urljoin ?>
+
+ <!--! insert opensearch autodiscovery link -->
+ <head py:match="head" py:attrs="select('@*')">
+ ${select('*')}
+ <link rel="search" type="application/opensearchdescription+xml"
+ href="${urljoin(str(select('link[@rel=\'alternate\']/@href')),
+ 'opensearchdescription.xml')}"
+ title="${select('link[@rel=\'alternate\']/@title')} search"/>
+ </head>
+
+ <!--! ensure that scripts don't use empty tag syntax -->
+ <script py:match="script" py:attrs="select('@*')">
+ ${select('*')}
+ </script>
+
+ <!--! Include the original stream, which will be processed by the rules
+ defined above -->
+ ${input}
+
+</html>
Deleted: trunk/lib/venus/filters/addsearch.xslt
===================================================================
--- branches/sucs-site/lib/venus/filters/addsearch.xslt 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/lib/venus/filters/addsearch.xslt 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,70 +0,0 @@
-<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
- xmlns:xhtml="http://www.w3.org/1999/xhtml"
- xmlns="http://www.w3.org/1999/xhtml">
-
- <!-- insert search form -->
- <xsl:template match="xhtml:div[@id='sidebar']">
- <xsl:copy>
- <xsl:apply-templates select="@*|node()"/>
- <h2>Search</h2>
- <form><input name="q"/></form>
- </xsl:copy>
- </xsl:template>
-
- <!-- function to return baseuri of a given string -->
- <xsl:template name="baseuri">
- <xsl:param name="string" />
- <xsl:if test="contains($string, '/')">
- <xsl:value-of select="substring-before($string, '/')"/>
- <xsl:text>/</xsl:text>
- <xsl:call-template name="baseuri">
- <xsl:with-param name="string">
- <xsl:value-of select="substring-after($string, '/')"/>
- </xsl:with-param>
- </xsl:call-template>
- </xsl:if>
- </xsl:template>
-
- <!-- insert opensearch autodiscovery link -->
- <xsl:template match="xhtml:head">
- <xsl:copy>
- <xsl:apply-templates select="@*|node()"/>
- <link rel="search" type="application/opensearchdescription+xml" title="{xhtml:link[@rel='alternate']/@title} search">
- <xsl:attribute name="href">
- <xsl:call-template name="baseuri">
- <xsl:with-param name="string">
- <xsl:value-of select="xhtml:link[@rel='alternate']/@href"/>
- </xsl:with-param>
- </xsl:call-template>
- <xsl:text>opensearchdescription.xml</xsl:text>
- </xsl:attribute>
- </link>
- </xsl:copy>
- </xsl:template>
-
- <!-- ensure that scripts don't use empty tag syntax -->
- <xsl:template match="xhtml:script">
- <xsl:copy>
- <xsl:apply-templates select="@*|node()"/>
- <xsl:if test="not(node())">
- <xsl:comment><!--HTML Compatibility--></xsl:comment>
- </xsl:if>
- </xsl:copy>
- </xsl:template>
-
- <!-- add HTML5 doctype -->
- <xsl:template match="/xhtml:html">
- <xsl:text disable-output-escaping="yes"><!DOCTYPE html></xsl:text>
- <xsl:copy>
- <xsl:apply-templates select="@*|node()"/>
- </xsl:copy>
- </xsl:template>
-
- <!-- pass through everything else -->
- <xsl:template match="@*|node()">
- <xsl:copy>
- <xsl:apply-templates select="@*|node()"/>
- </xsl:copy>
- </xsl:template>
-
-</xsl:stylesheet>
Copied: trunk/lib/venus/filters/addsearch.xslt (from rev 656, branches/sucs-site/lib/venus/filters/addsearch.xslt)
===================================================================
--- trunk/lib/venus/filters/addsearch.xslt (rev 0)
+++ trunk/lib/venus/filters/addsearch.xslt 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,70 @@
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
+ xmlns:xhtml="http://www.w3.org/1999/xhtml"
+ xmlns="http://www.w3.org/1999/xhtml">
+
+ <!-- insert search form -->
+ <xsl:template match="xhtml:div[@id='sidebar']">
+ <xsl:copy>
+ <xsl:apply-templates select="@*|node()"/>
+ <h2>Search</h2>
+ <form><input name="q"/></form>
+ </xsl:copy>
+ </xsl:template>
+
+ <!-- function to return baseuri of a given string -->
+ <xsl:template name="baseuri">
+ <xsl:param name="string" />
+ <xsl:if test="contains($string, '/')">
+ <xsl:value-of select="substring-before($string, '/')"/>
+ <xsl:text>/</xsl:text>
+ <xsl:call-template name="baseuri">
+ <xsl:with-param name="string">
+ <xsl:value-of select="substring-after($string, '/')"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:template>
+
+ <!-- insert opensearch autodiscovery link -->
+ <xsl:template match="xhtml:head">
+ <xsl:copy>
+ <xsl:apply-templates select="@*|node()"/>
+ <link rel="search" type="application/opensearchdescription+xml" title="{xhtml:link[@rel='alternate']/@title} search">
+ <xsl:attribute name="href">
+ <xsl:call-template name="baseuri">
+ <xsl:with-param name="string">
+ <xsl:value-of select="xhtml:link[@rel='alternate']/@href"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ <xsl:text>opensearchdescription.xml</xsl:text>
+ </xsl:attribute>
+ </link>
+ </xsl:copy>
+ </xsl:template>
+
+ <!-- ensure that scripts don't use empty tag syntax -->
+ <xsl:template match="xhtml:script">
+ <xsl:copy>
+ <xsl:apply-templates select="@*|node()"/>
+ <xsl:if test="not(node())">
+ <xsl:comment><!--HTML Compatibility--></xsl:comment>
+ </xsl:if>
+ </xsl:copy>
+ </xsl:template>
+
+ <!-- add HTML5 doctype -->
+ <xsl:template match="/xhtml:html">
+ <xsl:text disable-output-escaping="yes"><!DOCTYPE html></xsl:text>
+ <xsl:copy>
+ <xsl:apply-templates select="@*|node()"/>
+ </xsl:copy>
+ </xsl:template>
+
+ <!-- pass through everything else -->
+ <xsl:template match="@*|node()">
+ <xsl:copy>
+ <xsl:apply-templates select="@*|node()"/>
+ </xsl:copy>
+ </xsl:template>
+
+</xsl:stylesheet>
Deleted: trunk/lib/venus/filters/coral_cdn_filter.py
===================================================================
--- branches/sucs-site/lib/venus/filters/coral_cdn_filter.py 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/lib/venus/filters/coral_cdn_filter.py 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,18 +0,0 @@
-"""
-Remap all images to take advantage of the Coral Content Distribution
-Network <http://www.coralcdn.org/>.
-"""
-
-import re, sys, urlparse, xml.dom.minidom
-
-entry = xml.dom.minidom.parse(sys.stdin).documentElement
-
-for node in entry.getElementsByTagName('img'):
- if node.hasAttribute('src'):
- component = list(urlparse.urlparse(node.getAttribute('src')))
- if component[0] == 'http':
- component[1] = re.sub(r':(\d+)$', r'.\1', component[1])
- component[1] += '.nyud.net:8080'
- node.setAttribute('src', urlparse.urlunparse(component))
-
-print entry.toxml('utf-8')
Copied: trunk/lib/venus/filters/coral_cdn_filter.py (from rev 656, branches/sucs-site/lib/venus/filters/coral_cdn_filter.py)
===================================================================
--- trunk/lib/venus/filters/coral_cdn_filter.py (rev 0)
+++ trunk/lib/venus/filters/coral_cdn_filter.py 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,18 @@
+"""
+Remap all images to take advantage of the Coral Content Distribution
+Network <http://www.coralcdn.org/>.
+"""
+
+import re, sys, urlparse, xml.dom.minidom
+
+entry = xml.dom.minidom.parse(sys.stdin).documentElement
+
+for node in entry.getElementsByTagName('img'):
+ if node.hasAttribute('src'):
+ component = list(urlparse.urlparse(node.getAttribute('src')))
+ if component[0] == 'http':
+ component[1] = re.sub(r':(\d+)$', r'.\1', component[1])
+ component[1] += '.nyud.net:8080'
+ node.setAttribute('src', urlparse.urlunparse(component))
+
+print entry.toxml('utf-8')
Deleted: trunk/lib/venus/filters/delDupName/byline_author.xslt
===================================================================
--- branches/sucs-site/lib/venus/filters/delDupName/byline_author.xslt 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/lib/venus/filters/delDupName/byline_author.xslt 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,29 +0,0 @@
-<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
- xmlns:atom="http://www.w3.org/2005/Atom"
- xmlns:xhtml="http://www.w3.org/1999/xhtml">
-
- <!-- Replace atom:author/atom:name with the byline author -->
- <xsl:template match="atom:entry/atom:author[../atom:content/xhtml:div/xhtml:span[@class='byline-author' and substring(.,1,10)='Posted by ']]">
- <xsl:copy>
- <atom:name>
- <xsl:value-of select="substring(../atom:content/xhtml:div/xhtml:span[@class='byline-author'],11)"/>
- </atom:name>
- <xsl:apply-templates select="*[not(self::atom:name)]"/>
- </xsl:copy>
- </xsl:template>
-
- <!-- Remove byline author -->
- <xsl:template match="xhtml:div/xhtml:span[@class='byline-author' and substring(.,1,10)='Posted by ']"/>
-
- <!-- Remove two line breaks following byline author -->
- <xsl:template match="xhtml:br[preceding-sibling::*[1][@class='byline-author' and substring(.,1,10)='Posted by ']]"/>
- <xsl:template match="xhtml:br[preceding-sibling::*[2][@class='byline-author' and substring(.,1,10)='Posted by ']]"/>
-
- <!-- pass through everything else -->
- <xsl:template match="@*|node()">
- <xsl:copy>
- <xsl:apply-templates select="@*|node()"/>
- </xsl:copy>
- </xsl:template>
-
-</xsl:stylesheet>
Copied: trunk/lib/venus/filters/delDupName/byline_author.xslt (from rev 656, branches/sucs-site/lib/venus/filters/delDupName/byline_author.xslt)
===================================================================
--- trunk/lib/venus/filters/delDupName/byline_author.xslt (rev 0)
+++ trunk/lib/venus/filters/delDupName/byline_author.xslt 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,29 @@
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
+ xmlns:atom="http://www.w3.org/2005/Atom"
+ xmlns:xhtml="http://www.w3.org/1999/xhtml">
+
+ <!-- Replace atom:author/atom:name with the byline author -->
+ <xsl:template match="atom:entry/atom:author[../atom:content/xhtml:div/xhtml:span[@class='byline-author' and substring(.,1,10)='Posted by ']]">
+ <xsl:copy>
+ <atom:name>
+ <xsl:value-of select="substring(../atom:content/xhtml:div/xhtml:span[@class='byline-author'],11)"/>
+ </atom:name>
+ <xsl:apply-templates select="*[not(self::atom:name)]"/>
+ </xsl:copy>
+ </xsl:template>
+
+ <!-- Remove byline author -->
+ <xsl:template match="xhtml:div/xhtml:span[@class='byline-author' and substring(.,1,10)='Posted by ']"/>
+
+ <!-- Remove two line breaks following byline author -->
+ <xsl:template match="xhtml:br[preceding-sibling::*[1][@class='byline-author' and substring(.,1,10)='Posted by ']]"/>
+ <xsl:template match="xhtml:br[preceding-sibling::*[2][@class='byline-author' and substring(.,1,10)='Posted by ']]"/>
+
+ <!-- pass through everything else -->
+ <xsl:template match="@*|node()">
+ <xsl:copy>
+ <xsl:apply-templates select="@*|node()"/>
+ </xsl:copy>
+ </xsl:template>
+
+</xsl:stylesheet>
Deleted: trunk/lib/venus/filters/delDupName/p_by_name.xslt
===================================================================
--- branches/sucs-site/lib/venus/filters/delDupName/p_by_name.xslt 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/lib/venus/filters/delDupName/p_by_name.xslt 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,17 +0,0 @@
-<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
- xmlns:atom="http://www.w3.org/2005/Atom"
- xmlns:xhtml="http://www.w3.org/1999/xhtml">
-
- <!-- If the first paragraph consists exclusively of "By author-name",
- delete it -->
- <xsl:template match="atom:content/xhtml:div/xhtml:p[1][. =
- concat('By ', ../../../atom:author/atom:name)]"/>
-
- <!-- pass through everything else -->
- <xsl:template match="@*|node()">
- <xsl:copy>
- <xsl:apply-templates select="@*|node()"/>
- </xsl:copy>
- </xsl:template>
-
-</xsl:stylesheet>
Copied: trunk/lib/venus/filters/delDupName/p_by_name.xslt (from rev 656, branches/sucs-site/lib/venus/filters/delDupName/p_by_name.xslt)
===================================================================
--- trunk/lib/venus/filters/delDupName/p_by_name.xslt (rev 0)
+++ trunk/lib/venus/filters/delDupName/p_by_name.xslt 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,17 @@
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
+ xmlns:atom="http://www.w3.org/2005/Atom"
+ xmlns:xhtml="http://www.w3.org/1999/xhtml">
+
+ <!-- If the first paragraph consists exclusively of "By author-name",
+ delete it -->
+ <xsl:template match="atom:content/xhtml:div/xhtml:p[1][. =
+ concat('By ', ../../../atom:author/atom:name)]"/>
+
+ <!-- pass through everything else -->
+ <xsl:template match="@*|node()">
+ <xsl:copy>
+ <xsl:apply-templates select="@*|node()"/>
+ </xsl:copy>
+ </xsl:template>
+
+</xsl:stylesheet>
Deleted: trunk/lib/venus/filters/delDupName/p_from.xslt
===================================================================
--- branches/sucs-site/lib/venus/filters/delDupName/p_from.xslt 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/lib/venus/filters/delDupName/p_from.xslt 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,15 +0,0 @@
-<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
- xmlns:atom="http://www.w3.org/2005/Atom"
- xmlns:xhtml="http://www.w3.org/1999/xhtml">
-
- <!-- If the first paragraph consists contains @class="from", delete it -->
- <xsl:template match="atom:content/xhtml:div/xhtml:div[@class='comment']/xhtml:p[1][@class='from']"/>
-
- <!-- pass through everything else -->
- <xsl:template match="@*|node()">
- <xsl:copy>
- <xsl:apply-templates select="@*|node()"/>
- </xsl:copy>
- </xsl:template>
-
-</xsl:stylesheet>
Copied: trunk/lib/venus/filters/delDupName/p_from.xslt (from rev 656, branches/sucs-site/lib/venus/filters/delDupName/p_from.xslt)
===================================================================
--- trunk/lib/venus/filters/delDupName/p_from.xslt (rev 0)
+++ trunk/lib/venus/filters/delDupName/p_from.xslt 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,15 @@
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
+ xmlns:atom="http://www.w3.org/2005/Atom"
+ xmlns:xhtml="http://www.w3.org/1999/xhtml">
+
+ <!-- If the first paragraph consists contains @class="from", delete it -->
+ <xsl:template match="atom:content/xhtml:div/xhtml:div[@class='comment']/xhtml:p[1][@class='from']"/>
+
+ <!-- pass through everything else -->
+ <xsl:template match="@*|node()">
+ <xsl:copy>
+ <xsl:apply-templates select="@*|node()"/>
+ </xsl:copy>
+ </xsl:template>
+
+</xsl:stylesheet>
Deleted: trunk/lib/venus/filters/detitle.xslt
===================================================================
--- branches/sucs-site/lib/venus/filters/detitle.xslt 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/lib/venus/filters/detitle.xslt 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,25 +0,0 @@
-<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
- xmlns:atom="http://www.w3.org/2005/Atom"
- xmlns="http://www.w3.org/1999/xhtml">
-
- <!-- only retain titles that don't duplicate summary or content -->
- <xsl:template match="atom:title">
- <xsl:copy>
- <xsl:if test="string-length(.) < 30 or
- ( substring(.,1,string-length(.)-3) !=
- substring(../atom:content,1,string-length(.)-3) and
- substring(.,1,string-length(.)-3) !=
- substring(../atom:summary,1,string-length(.)-3) )">
- <xsl:apply-templates select="@*|node()"/>
- </xsl:if>
- </xsl:copy>
- </xsl:template>
-
- <!-- pass through everything else -->
- <xsl:template match="@*|node()">
- <xsl:copy>
- <xsl:apply-templates select="@*|node()"/>
- </xsl:copy>
- </xsl:template>
-
-</xsl:stylesheet>
Copied: trunk/lib/venus/filters/detitle.xslt (from rev 656, branches/sucs-site/lib/venus/filters/detitle.xslt)
===================================================================
--- trunk/lib/venus/filters/detitle.xslt (rev 0)
+++ trunk/lib/venus/filters/detitle.xslt 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,25 @@
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
+ xmlns:atom="http://www.w3.org/2005/Atom"
+ xmlns="http://www.w3.org/1999/xhtml">
+
+ <!-- only retain titles that don't duplicate summary or content -->
+ <xsl:template match="atom:title">
+ <xsl:copy>
+ <xsl:if test="string-length(.) < 30 or
+ ( substring(.,1,string-length(.)-3) !=
+ substring(../atom:content,1,string-length(.)-3) and
+ substring(.,1,string-length(.)-3) !=
+ substring(../atom:summary,1,string-length(.)-3) )">
+ <xsl:apply-templates select="@*|node()"/>
+ </xsl:if>
+ </xsl:copy>
+ </xsl:template>
+
+ <!-- pass through everything else -->
+ <xsl:template match="@*|node()">
+ <xsl:copy>
+ <xsl:apply-templates select="@*|node()"/>
+ </xsl:copy>
+ </xsl:template>
+
+</xsl:stylesheet>
Deleted: trunk/lib/venus/filters/excerpt.py
===================================================================
--- branches/sucs-site/lib/venus/filters/excerpt.py 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/lib/venus/filters/excerpt.py 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,109 +0,0 @@
-"""
-Generate an excerpt from either the summary or a content of an entry.
-
-Parameters:
- width: maximum number of characters in the excerpt. Default: 500
- omit: whitespace delimited list of html tags to remove. Default: none
- target: name of element created. Default: planet:excerpt
-
-Notes:
- * if 'img' is in the list of tags to be omitted <img> tags are replaced with
- hypertext links associated with the value of the 'alt' attribute. If there
- is no alt attribute value, <img> is used instead. If the parent element
- of the img tag is already an <a> tag, no additional hypertext links are
- added.
-"""
-
-import sys, xml.dom.minidom, textwrap
-from xml.dom import Node, minidom
-
-atomNS = 'http://www.w3.org/2005/Atom'
-planetNS = 'http://planet.intertwingly.net/'
-
-args = dict(zip([name.lstrip('-') for name in sys.argv[1::2]], sys.argv[2::2]))
-
-wrapper = textwrap.TextWrapper(width=int(args.get('width','500')))
-omit = args.get('omit', '').split()
-target = args.get('target', 'planet:excerpt')
-
-class copy:
- """ recursively copy a source to a target, up to a given width """
-
- def __init__(self, dom, source, target):
- self.dom = dom
- self.full = False
- self.text = []
- self.textlen = 0
- self.copyChildren(source, target)
-
- def copyChildren(self, source, target):
- """ copy child nodes of a source to the target """
- for child in source.childNodes:
- if child.nodeType == Node.ELEMENT_NODE:
- self.copyElement(child, target)
- elif child.nodeType == Node.TEXT_NODE:
- self.copyText(child.data, target)
- if self.full: break
-
- def copyElement(self, source, target):
- """ copy source element to the target """
-
- # check the omit list
- if source.nodeName in omit:
- if source.nodeName == 'img':
- return self.elideImage(source, target)
- return self.copyChildren(source, target)
-
- # copy element, attributes, and children
- child = self.dom.createElementNS(source.namespaceURI, source.nodeName)
- target.appendChild(child)
- for i in range(0, source.attributes.length):
- attr = source.attributes.item(i)
- child.setAttributeNS(attr.namespaceURI, attr.name, attr.value)
- self.copyChildren(source, child)
-
- def elideImage(self, source, target):
- """ copy an elided form of the image element to the target """
- alt = source.getAttribute('alt') or '<img>'
- src = source.getAttribute('src')
-
- if target.nodeName == 'a' or not src:
- self.copyText(alt, target)
- else:
- child = self.dom.createElement('a')
- child.setAttribute('href', src)
- self.copyText(alt, child)
- target.appendChild(child)
-
- def copyText(self, source, target):
- """ copy text to the target, until the point where it would wrap """
- if not source.isspace() and source.strip():
- self.text.append(source.strip())
- lines = wrapper.wrap(' '.join(self.text))
- if len(lines) == 1:
- target.appendChild(self.dom.createTextNode(source))
- self.textlen = len(lines[0])
- elif lines:
- excerpt = source[:len(lines[0])-self.textlen] + u' \u2026'
- target.appendChild(dom.createTextNode(excerpt))
- self.full = True
-
-# select summary or content element
-dom = minidom.parse(sys.stdin)
-source = dom.getElementsByTagNameNS(atomNS, 'summary')
-if not source:
- source = dom.getElementsByTagNameNS(atomNS, 'content')
-
-# if present, recursively copy it to a planet:excerpt element
-if source:
- if target.startswith('planet:'):
- dom.documentElement.setAttribute('xmlns:planet', planetNS)
- if target.startswith('atom:'): target = target.split(':',1)[1]
- excerpt = dom.createElementNS(planetNS, target)
- source[0].parentNode.appendChild(excerpt)
- copy(dom, source[0], excerpt)
- if source[0].nodeName == excerpt.nodeName:
- source[0].parentNode.removeChild(source[0])
-
-# print out results
-print dom.toxml('utf-8')
Copied: trunk/lib/venus/filters/excerpt.py (from rev 656, branches/sucs-site/lib/venus/filters/excerpt.py)
===================================================================
--- trunk/lib/venus/filters/excerpt.py (rev 0)
+++ trunk/lib/venus/filters/excerpt.py 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,109 @@
+"""
+Generate an excerpt from either the summary or a content of an entry.
+
+Parameters:
+ width: maximum number of characters in the excerpt. Default: 500
+ omit: whitespace delimited list of html tags to remove. Default: none
+ target: name of element created. Default: planet:excerpt
+
+Notes:
+ * if 'img' is in the list of tags to be omitted <img> tags are replaced with
+ hypertext links associated with the value of the 'alt' attribute. If there
+ is no alt attribute value, <img> is used instead. If the parent element
+ of the img tag is already an <a> tag, no additional hypertext links are
+ added.
+"""
+
+import sys, xml.dom.minidom, textwrap
+from xml.dom import Node, minidom
+
+atomNS = 'http://www.w3.org/2005/Atom'
+planetNS = 'http://planet.intertwingly.net/'
+
+args = dict(zip([name.lstrip('-') for name in sys.argv[1::2]], sys.argv[2::2]))
+
+wrapper = textwrap.TextWrapper(width=int(args.get('width','500')))
+omit = args.get('omit', '').split()
+target = args.get('target', 'planet:excerpt')
+
+class copy:
+ """ recursively copy a source to a target, up to a given width """
+
+ def __init__(self, dom, source, target):
+ self.dom = dom
+ self.full = False
+ self.text = []
+ self.textlen = 0
+ self.copyChildren(source, target)
+
+ def copyChildren(self, source, target):
+ """ copy child nodes of a source to the target """
+ for child in source.childNodes:
+ if child.nodeType == Node.ELEMENT_NODE:
+ self.copyElement(child, target)
+ elif child.nodeType == Node.TEXT_NODE:
+ self.copyText(child.data, target)
+ if self.full: break
+
+ def copyElement(self, source, target):
+ """ copy source element to the target """
+
+ # check the omit list
+ if source.nodeName in omit:
+ if source.nodeName == 'img':
+ return self.elideImage(source, target)
+ return self.copyChildren(source, target)
+
+ # copy element, attributes, and children
+ child = self.dom.createElementNS(source.namespaceURI, source.nodeName)
+ target.appendChild(child)
+ for i in range(0, source.attributes.length):
+ attr = source.attributes.item(i)
+ child.setAttributeNS(attr.namespaceURI, attr.name, attr.value)
+ self.copyChildren(source, child)
+
+ def elideImage(self, source, target):
+ """ copy an elided form of the image element to the target """
+ alt = source.getAttribute('alt') or '<img>'
+ src = source.getAttribute('src')
+
+ if target.nodeName == 'a' or not src:
+ self.copyText(alt, target)
+ else:
+ child = self.dom.createElement('a')
+ child.setAttribute('href', src)
+ self.copyText(alt, child)
+ target.appendChild(child)
+
+ def copyText(self, source, target):
+ """ copy text to the target, until the point where it would wrap """
+ if not source.isspace() and source.strip():
+ self.text.append(source.strip())
+ lines = wrapper.wrap(' '.join(self.text))
+ if len(lines) == 1:
+ target.appendChild(self.dom.createTextNode(source))
+ self.textlen = len(lines[0])
+ elif lines:
+ excerpt = source[:len(lines[0])-self.textlen] + u' \u2026'
+ target.appendChild(dom.createTextNode(excerpt))
+ self.full = True
+
+# select summary or content element
+dom = minidom.parse(sys.stdin)
+source = dom.getElementsByTagNameNS(atomNS, 'summary')
+if not source:
+ source = dom.getElementsByTagNameNS(atomNS, 'content')
+
+# if present, recursively copy it to a planet:excerpt element
+if source:
+ if target.startswith('planet:'):
+ dom.documentElement.setAttribute('xmlns:planet', planetNS)
+ if target.startswith('atom:'): target = target.split(':',1)[1]
+ excerpt = dom.createElementNS(planetNS, target)
+ source[0].parentNode.appendChild(excerpt)
+ copy(dom, source[0], excerpt)
+ if source[0].nodeName == excerpt.nodeName:
+ source[0].parentNode.removeChild(source[0])
+
+# print out results
+print dom.toxml('utf-8')
Deleted: trunk/lib/venus/filters/h1title.xslt
===================================================================
--- branches/sucs-site/lib/venus/filters/h1title.xslt 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/lib/venus/filters/h1title.xslt 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,30 +0,0 @@
-<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
- xmlns:atom="http://www.w3.org/2005/Atom"
- xmlns:xhtml="http://www.w3.org/1999/xhtml">
-
- <!-- Replace title with value of h1, if present -->
- <xsl:template match="atom:title">
- <xsl:apply-templates select="@*"/>
- <xsl:copy>
- <xsl:choose>
- <xsl:when test="count(//xhtml:h1) = 1">
- <xsl:value-of select="normalize-space(//xhtml:h1)"/>
- </xsl:when>
- <xsl:otherwise>
- <xsl:apply-templates select="node()"/>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:copy>
- </xsl:template>
-
- <!-- Remove all h1s -->
- <xsl:template match="xhtml:h1"/>
-
- <!-- pass through everything else -->
- <xsl:template match="@*|node()">
- <xsl:copy>
- <xsl:apply-templates select="@*|node()"/>
- </xsl:copy>
- </xsl:template>
-
-</xsl:stylesheet>
Copied: trunk/lib/venus/filters/h1title.xslt (from rev 656, branches/sucs-site/lib/venus/filters/h1title.xslt)
===================================================================
--- trunk/lib/venus/filters/h1title.xslt (rev 0)
+++ trunk/lib/venus/filters/h1title.xslt 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,30 @@
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
+ xmlns:atom="http://www.w3.org/2005/Atom"
+ xmlns:xhtml="http://www.w3.org/1999/xhtml">
+
+ <!-- Replace title with value of h1, if present -->
+ <xsl:template match="atom:title">
+ <xsl:apply-templates select="@*"/>
+ <xsl:copy>
+ <xsl:choose>
+ <xsl:when test="count(//xhtml:h1) = 1">
+ <xsl:value-of select="normalize-space(//xhtml:h1)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="node()"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:copy>
+ </xsl:template>
+
+ <!-- Remove all h1s -->
+ <xsl:template match="xhtml:h1"/>
+
+ <!-- pass through everything else -->
+ <xsl:template match="@*|node()">
+ <xsl:copy>
+ <xsl:apply-templates select="@*|node()"/>
+ </xsl:copy>
+ </xsl:template>
+
+</xsl:stylesheet>
Deleted: trunk/lib/venus/filters/html2xhtml.plugin
===================================================================
--- branches/sucs-site/lib/venus/filters/html2xhtml.plugin 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/lib/venus/filters/html2xhtml.plugin 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,6 +0,0 @@
-import sys
-import html5lib
-tree=html5lib.treebuilders.dom.TreeBuilder
-parser = html5lib.html5parser.HTMLParser(tree=tree)
-document = parser.parse(sys.stdin)
-sys.stdout.write(document.toxml("utf-8"))
Copied: trunk/lib/venus/filters/html2xhtml.plugin (from rev 656, branches/sucs-site/lib/venus/filters/html2xhtml.plugin)
===================================================================
--- trunk/lib/venus/filters/html2xhtml.plugin (rev 0)
+++ trunk/lib/venus/filters/html2xhtml.plugin 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,6 @@
+import sys
+import html5lib
+tree=html5lib.treebuilders.dom.TreeBuilder
+parser = html5lib.html5parser.HTMLParser(tree=tree)
+document = parser.parse(sys.stdin)
+sys.stdout.write(document.toxml("utf-8"))
Deleted: trunk/lib/venus/filters/mememe.plugin
===================================================================
--- branches/sucs-site/lib/venus/filters/mememe.plugin 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/lib/venus/filters/mememe.plugin 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,496 +0,0 @@
-#
-# This Venus output filter will annotate an XHTML page with a list of
-# "memes" (or most popular linked destinations, based on the last week
-# of entries from the cache) and will update the subscription list with
-# links to recent entries from each subscription.
-#
-# Templates that don't produce XHTML natively will need their output passed
-# through html2xhtml.plugin first.
-#
-# Typical configuration (based on classic_fancy):
-#
-# [index.html.tmpl]
-# filters:
-# html2xhtml.plugin
-# mememe.plugin
-#
-# [mememe.plugin]
-# sidebar = @class='sidebar'
-#
-
-import glob, libxml2, os, time, sys, sgmllib, urllib2, urlparse, re, md5
-from xml.sax.saxutils import escape
-from htmlentitydefs import entitydefs
-
-import planet
-from planet import config
-from planet.spider import filename
-import feedparser
-log = planet.logger
-options = config.filter_options(sys.argv[0])
-spam = options.get('spam', '').split()
-
-MEMES_ATOM = os.path.join(config.output_dir(),'memes.atom')
-
-now = time.time()
-week = 7 * 86400
-week_ago = now - week
-
-cache = config.cache_directory()
-meme_cache = os.path.join(cache, 'memes')
-if not os.path.exists(meme_cache): os.makedirs(meme_cache)
-
-bom = config.bill_of_materials()
-if not 'images/tcosm11.gif' in bom:
- bom.append('images/tcosm11.gif')
- config.parser.set('Planet', 'bill_of_materials', ' '.join(bom))
-
-all_links = {}
-feed_links = {}
-
-def check_cache(url):
- try:
- file = open(filename(meme_cache, url))
- headers = eval(file.read())
- file.close()
- return headers or {}
- except:
- return {}
-
-def cache_meme(url, headers):
- json = []
- for key,value in headers.items():
- json.append(' %s: %s' % (toj(key), toj(value)))
- file = open(filename(meme_cache, url),'w')
- file.write('{\n' + ',\n'.join(json) + '\n}\n')
- file.close()
-
-urlmap = {}
-revmap = {}
-def canonicalize(url):
- url = urlmap.get(url,url)
- parts = list(urlparse.urlparse(url))
-
- parts[0] = parts[0].lower()
- parts[1] = parts[1].lower()
- if parts[1].startswith('www.'): parts[1]=parts[1][4:]
- if not parts[2]: parts[2] = '/'
- parts[-1] = ''
-
- canonurl = urlparse.urlunparse(parts)
- revmap[canonurl] = url
- return canonurl
-
-def unique_votes(links):
- voters = []
- for weight, entry, feed, title, author, mtime in links:
- if feed not in voters: voters.append(feed)
- return len(voters)
-
-log.debug("Loading cached data")
-for name in glob.glob(os.path.join(cache, '*')):
- # ensure that this is within the past week
- if os.path.isdir(name): continue
- mtime = os.stat(name).st_mtime
- if mtime < week_ago: continue
-
- # parse the file
- try:
- doc = libxml2.parseFile(name)
- except:
- continue
- xp = doc.xpathNewContext()
- xp.xpathRegisterNs("atom", "http://www.w3.org/2005/Atom")
- xp.xpathRegisterNs("planet", "http://planet.intertwingly.net/")
-
- # determine the entry
- entry = xp.xpathEval("/atom:entry/atom:link[@rel='alternate']")
- if not entry: continue
- entry = canonicalize(entry[0].prop("href"))
-
- # determine the title
- title = xp.xpathEval("/atom:entry/atom:title")
- if title:
- if title[0].prop('type') == 'html':
- title = re.sub('<.*?>','',title[0].content)
- else:
- title = title[0].content
- title = str(title or '')
-
- # determine the feed id
- feed = xp.xpathEval("/atom:entry/atom:source/planet:memegroup")
- if not feed: feed = xp.xpathEval("/atom:entry/atom:source/atom:id")
- if not feed: continue
- feed = feed[0].content
-
- # determine the author
- author = xp.xpathEval("/atom:entry/atom:source/planet:name")
- if author:
- author = author[0].content
- else:
- author = ''
-
- # track the feed_links
- if author:
- if not feed_links.has_key(author): feed_links[author] = list()
- feed_links[author].append([mtime, entry, title])
-
- # identify the unique links
- entry_links = []
- for node in doc.xpathEval("//*[@href and not(@rel='source') and not(@rel='license')]"):
- parent = node.parent
- while parent:
- if parent.name == 'source': break
- parent = parent.parent
- else:
- link = canonicalize(node.prop('href'))
- if not link in entry_links:
- entry_links.append(link)
- if node.hasProp('title') and node.prop('title').startswith('http'):
- link = canonicalize(node.prop('title'))
- if not link in entry_links:
- entry_links.append(link)
-
- # add the votes
- weight = 1.0 - (now - mtime)**2 / week**2
- vote = [(weight, str(entry), str(feed), title, author, mtime)]
- for link in entry_links:
- all_links[link] = all_links.get(link,list()) + vote
-
- # free the entry
- doc.freeDoc()
-
-# tally the votes
-weighted_links = []
-for link, votes in all_links.items():
- site = {}
- updated = 0
- for weight, entry, feed, title, author, mtime in votes:
- site[feed] = max(site.get(feed,0), weight)
- if mtime > updated: updated=mtime
- weighted_links.append((sum(site.values()), link, updated))
-weighted_links.sort()
-weighted_links.reverse()
-
-cp1252 = {
- 128: 8364, # euro sign
- 130: 8218, # single low-9 quotation mark
- 131: 402, # latin small letter f with hook
- 132: 8222, # double low-9 quotation mark
- 133: 8230, # horizontal ellipsis
- 134: 8224, # dagger
- 135: 8225, # double dagger
- 136: 710, # modifier letter circumflex accent
- 137: 8240, # per mille sign
- 138: 352, # latin capital letter s with caron
- 139: 8249, # single left-pointing angle quotation mark
- 140: 338, # latin capital ligature oe
- 142: 381, # latin capital letter z with caron
- 145: 8216, # left single quotation mark
- 146: 8217, # right single quotation mark
- 147: 8220, # left double quotation mark
- 148: 8221, # right double quotation mark
- 149: 8226, # bullet
- 150: 8211, # en dash
- 151: 8212, # em dash
- 152: 732, # small tilde
- 153: 8482, # trade mark sign
- 154: 353, # latin small letter s with caron
- 155: 8250, # single right-pointing angle quotation mark
- 156: 339, # latin small ligature oe
- 158: 382, # latin small letter z with caron
- 159: 376} # latin capital letter y with diaeresis
-
-# determine the title for a given url
-class html(sgmllib.SGMLParser):
- def __init__(self, url):
- sgmllib.SGMLParser.__init__(self)
- self.title = ""
- self.feedurl = ""
- self.intitle = False
-
- headers = check_cache(url)
-
- try:
- # fetch the page
- request = urllib2.Request(url)
- request.add_header('User-Agent', 'Venus/MeMeme')
- if headers.has_key('etag'):
- request.add_header('If-None-Match', headers['etag'])
- if headers.has_key('last_modified'):
- request.add_header('If-Modified-Since', headers['last-modified'])
- response = urllib2.urlopen(request)
- self.feed(response.read())
-
- # ensure the data is in utf-8
- try:
- self.title = self.title.decode('utf-8')
- except:
- self.title = ''.join([unichr(cp1252.get(ord(c),ord(c)))
- for c in self.title.decode('iso-8859-1')])
-
- # cache the results
- headers = {}
- if self.feedurl: headers['feedurl'] = self.feedurl
- if self.title: headers['title'] = self.title
- headers.update(response.headers)
- cache_meme(url, headers)
- except:
- self.feedurl = headers.get('feedurl')
- if headers.has_key('title'):
- if isinstance(headers['title'],str):
- self.title=eval('u'+repr(headers['title']).replace('\\\\','\\'))
- else:
- self.title=headers['title']
-
- # if there is a feed, look for an entry that matches, and take that title
- if self.feedurl and not self.title:
- headers = check_cache(self.feedurl)
- data = feedparser.parse(self.feedurl, etag=headers.get('etag'),
- modified=headers.get('last-modified'))
-
- if data.has_key('headers') and data.has_key('status') and \
- data.status in [200, 301, 302]:
-
- titles = {}
- for entry in data.entries:
- if entry.has_key('title_detail') and entry.has_key('link'):
- titles[entry.link] = entry.title_detail.value
- if entry.title_detail.type == 'text/plain':
- titles[entry.link] = escape(titles[entry.link])
-
- if titles.has_key(url): self.title = titles[url]
-
- data.headers.update(titles)
- cache_meme(self.feedurl, data.headers)
- else:
- if headers.has_key(url):
- if isinstance(headers[url],str):
- self.title=eval('u'+repr(headers[url]).replace('\\\\','\\'))
- else:
- self.title=headers[url]
-
- # fallback is the basename of the URI
- if not self.title:
- self.title = escape(url.rstrip('/').split('/')[-1].split('?')[0])
-
- # parse out the first autodiscovery link
- def start_link(self, attrs):
- if self.feedurl: return
- attrs = dict(map(lambda (k,v): (k.lower(),v), attrs))
- if not 'rel' in attrs: return
- rels = attrs['rel'].split(' ')
- if 'alternate' not in rels: return
- if not 'type' in attrs or not attrs['type'].endswith('xml'): return
- if 'href' in attrs:
- self.feedurl = attrs['href']
-
- # parse the page title
- def start_title(self, attributes):
- if not self.title: self.intitle = True
- def end_title(self):
- self.intitle = False
- def handle_data(self, text):
- if self.intitle: self.title += escape(text)
-
-# convert unicode string to a json string
-def toj(value):
- result = repr(value).replace(r'\x',r'\u00')
- if result[:1] == 'u': result=result[1:]
- if result.startswith("'"):
- result = '"%s"' % result.replace('"',r'\"').replace(r"\'","'")[1:-1]
- return result
-
-seenit = []
-count = 0
-
-# construct an empty feed
-feed_doc = libxml2.newDoc("1.0")
-meme_feed = feed_doc.newChild(None, "feed", None)
-meme_feed.newNs('http://www.w3.org/2005/Atom', None)
-meme_feed.newTextChild(None, 'title', config.name() + ': Memes')
-author = meme_feed.newChild(None, 'author', None)
-author.newTextChild(None, 'name', config.owner_name())
-if config.owner_email: author.newTextChild(None, 'email', config.owner_email())
-meme_feed.newTextChild(None, 'id', os.path.join(config.link(), 'memes.atom'))
-link = meme_feed.newChild(None, 'link', None)
-link.setProp('href', os.path.join(config.link(), 'memes.atom'))
-link.setProp('rel', 'self')
-meme_feed.newTextChild(None, 'updated',
- time.strftime('%Y-%m-%dT%H:%M:%SZ', time.gmtime()))
-
-# parse the input
-log.debug("Parse input")
-doc=libxml2.readDoc(sys.stdin.read(), '', 'utf-8', libxml2.XML_PARSE_NONET)
-
-# find the sidebar/footer
-sidebar = options.get('sidebar','//*[@class="sidebar"]')
-footer = doc.xpathEval(sidebar)
-if not hasattr(footer,'__len__') or len(footer) == 0:
- raise Exception(sidebar + ' not found')
-if len(footer) > 1:
- log.info("%d occurrences of %s found, taking last" % (len(footer),sidebar))
- if '@id' in sidebar:
- for element in footer[:-1]:
- element.unsetProp('id')
-footer = footer[-1]
-
-# add up to 10 entry links to each subscription
-subs_ul = footer.children
-while subs_ul.isText() or subs_ul.name != 'ul': subs_ul = subs_ul.next
-child = subs_ul.children
-while child:
- if child.name == 'li':
- if child.lastChild().name == 'ul': child.lastChild().unlinkNode()
- link = child.lastChild()
- while link.isText(): link=link.prev
- author = link.getContent()
- state = 'inactive'
- if feed_links.has_key(author):
- ul2 = child.newChild(None, 'ul', None)
- feed_links[author].sort()
- feed_links[author].reverse()
- link_count = 0
- for mtime, entry, title in feed_links[author]:
- if not title: continue
- li2 = ul2.newChild(None, 'li', None)
- a = li2.newTextChild(None, 'a', title)
- a.setProp('href', revmap.get(entry,entry))
- link_count = link_count + 1
- if link_count >= 10: break
- if link_count > 0: state = None
- if state:
- link.setProp('class',((link.prop('class') or '') + ' ' + state).strip())
- child=child.next
-
-# create a h2 and ul for the memes list
-footer_top = footer.children
-memes = footer_top.addPrevSibling(footer.newTextChild(None, 'h2', 'Memes '))
-memes_ul = footer_top.addPrevSibling(footer.newChild(None, 'ul', None))
-
-# create a header for the memes list
-a = memes.newChild(None, 'a', None)
-a.setProp('href', 'memes.atom')
-img = a.newChild(None, 'img', None)
-img.setProp('src', 'images/feed-icon-10x10.png')
-
-# collect the results
-log.debug("Fetch titles and collect the results")
-from urllib import quote_plus
-for i in range(0,len(weighted_links)):
- weight, link, updated = weighted_links[i]
- if link in spam: continue
-
- # ensure that somebody new points to this entry. This guards against
- # groups of related links which several posts point to all.
- novel = False
- for weight, entry, feed, title, author, mtime in all_links[link]:
- if entry not in seenit:
- seenit.append(entry)
- novel = True
- if not novel: continue
-
- all_links[link].sort()
- all_links[link].reverse()
- cache_file = filename(cache, link)
- title = None
-
- # when possible, take the title from the cache
- if os.path.exists(cache_file):
- entry = feedparser.parse(cache_file).entries[0]
- if entry.has_key('title_detail'):
- title = entry.title_detail.value
- if entry.title_detail.type == 'text/plain': title = escape(title)
-
- # otherwise, parse the html
- if not title:
- title = html(revmap.get(link,link)).title
-
- # dehtmlize
- title = re.sub('&(\w+);',
- lambda n: entitydefs.get(n.group(1), '&'+n.group(1)+';'), title)
- title = re.sub('&#(\d+);',lambda n: unichr(int(n.group(1))), title)
- title = re.sub('&#x(\w+);',lambda n: unichr(int(n.group(1),16)), title)
-
- # title too long? Insert zero width spaces where appropriate
- if max(map(len,title.split())) > 30:
- title=re.sub('(\W+)',u'\\1\u200b',title)
-
- # save the entry title (it is used later)
- entry_title = title.strip()
-
- # add to the memes list
- memes_ul.addContent('\n')
- li = memes_ul.newChild(None, 'li', None)
- memes_ul.addContent('\n')
-
- # technorati link
- a = li.newChild(None, 'a', None)
- tlink = 'http://technorati.com/blogs/'
- if link.startswith('http://'):
- a.setProp('href',tlink + quote_plus(link[7:]))
- else:
- a.setProp('href',tlink + quote_plus(link))
- a.setProp('title','cosmos')
- img = a.newChild(None, 'img', None)
- img.setProp('src','images/tcosm11.gif')
-
- # main link
- a = li.newTextChild(None, 'a', title.strip().encode('utf-8'))
- a.setProp('href',revmap.get(link,link))
- if (((i==0) or (updated>=weighted_links[i-1][2])) and
- (i+1==len(weighted_links) or (updated>=weighted_links[i+1][2]))):
- rank = 0
- for j in range(0,len(weighted_links)):
- if updated < weighted_links[j][2]: rank = rank + 1
- if rank < len(weighted_links)/2:
- a.setProp('class','rising')
-
- # voters
- ul2 = li.newChild(None, 'ul', None)
- voters = []
- for weight, entry, feed, title, author, mtime in all_links[link]:
- if entry in voters: continue
- li2 = ul2.newChild(None, 'li', None)
- a = li2.newTextChild(None, 'a' , author)
- a.setProp('href',revmap.get(entry,entry))
- if title: a.setProp('title',title)
- voters.append(entry)
-
- # add to the meme feed
- if unique_votes(all_links[link]) > 2:
- meme_feed.addContent('\n')
- entry = meme_feed.newChild(None, 'entry', None)
- meme_feed.addContent('\n')
-
- # entry
- tagbase = config.link().split('/')
- if not tagbase[-1]: tagbase = tagbase[:-1]
- tagbase = 'tag:%s,2007:%smeme/%%s' % (tagbase[2],'/'.join(tagbase[3:]))
- entry.newTextChild(None, 'id', tagbase % md5.new(link).hexdigest())
- entry.newTextChild(None, 'title', entry_title.encode('utf-8'))
- meme_link = entry.newTextChild(None, 'link', None)
- meme_link.setProp('href', link)
- entry.newTextChild(None, 'updated',
- time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime(updated)))
-
- # voters
- content = entry.newChild(None, 'content', None)
- content.setProp('type', 'xhtml')
- div = content.newTextChild(None, 'div', 'Spotted by:')
- div.newNs('http://www.w3.org/1999/xhtml', None)
- content_ul = div.newChild(None, 'ul', None)
- for weight, entry, feed, title, author, mtime in all_links[link]:
- li2 = content_ul.newTextChild(None, 'li', author + ": ")
- a = li2.newTextChild(None, 'a' , title or 'untitled')
- a.setProp('href',entry)
-
- count = count + 1
- if count >= 10: break
-
-log.info("Writing " + MEMES_ATOM)
-output=open(MEMES_ATOM,'w')
-output.write(feed_doc.serialize('utf-8'))
-output.close()
-
-sys.stdout.write(doc.serialize('utf-8'))
Copied: trunk/lib/venus/filters/mememe.plugin (from rev 656, branches/sucs-site/lib/venus/filters/mememe.plugin)
===================================================================
--- trunk/lib/venus/filters/mememe.plugin (rev 0)
+++ trunk/lib/venus/filters/mememe.plugin 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,496 @@
+#
+# This Venus output filter will annotate an XHTML page with a list of
+# "memes" (or most popular linked destinations, based on the last week
+# of entries from the cache) and will update the subscription list with
+# links to recent entries from each subscription.
+#
+# Templates that don't produce XHTML natively will need their output passed
+# through html2xhtml.plugin first.
+#
+# Typical configuration (based on classic_fancy):
+#
+# [index.html.tmpl]
+# filters:
+# html2xhtml.plugin
+# mememe.plugin
+#
+# [mememe.plugin]
+# sidebar = @class='sidebar'
+#
+
+import glob, libxml2, os, time, sys, sgmllib, urllib2, urlparse, re, md5
+from xml.sax.saxutils import escape
+from htmlentitydefs import entitydefs
+
+import planet
+from planet import config
+from planet.spider import filename
+import feedparser
+log = planet.logger
+options = config.filter_options(sys.argv[0])
+spam = options.get('spam', '').split()
+
+MEMES_ATOM = os.path.join(config.output_dir(),'memes.atom')
+
+now = time.time()
+week = 7 * 86400
+week_ago = now - week
+
+cache = config.cache_directory()
+meme_cache = os.path.join(cache, 'memes')
+if not os.path.exists(meme_cache): os.makedirs(meme_cache)
+
+bom = config.bill_of_materials()
+if not 'images/tcosm11.gif' in bom:
+ bom.append('images/tcosm11.gif')
+ config.parser.set('Planet', 'bill_of_materials', ' '.join(bom))
+
+all_links = {}
+feed_links = {}
+
+def check_cache(url):
+ try:
+ file = open(filename(meme_cache, url))
+ headers = eval(file.read())
+ file.close()
+ return headers or {}
+ except:
+ return {}
+
+def cache_meme(url, headers):
+ json = []
+ for key,value in headers.items():
+ json.append(' %s: %s' % (toj(key), toj(value)))
+ file = open(filename(meme_cache, url),'w')
+ file.write('{\n' + ',\n'.join(json) + '\n}\n')
+ file.close()
+
+urlmap = {}
+revmap = {}
+def canonicalize(url):
+ url = urlmap.get(url,url)
+ parts = list(urlparse.urlparse(url))
+
+ parts[0] = parts[0].lower()
+ parts[1] = parts[1].lower()
+ if parts[1].startswith('www.'): parts[1]=parts[1][4:]
+ if not parts[2]: parts[2] = '/'
+ parts[-1] = ''
+
+ canonurl = urlparse.urlunparse(parts)
+ revmap[canonurl] = url
+ return canonurl
+
+def unique_votes(links):
+ voters = []
+ for weight, entry, feed, title, author, mtime in links:
+ if feed not in voters: voters.append(feed)
+ return len(voters)
+
+log.debug("Loading cached data")
+for name in glob.glob(os.path.join(cache, '*')):
+ # ensure that this is within the past week
+ if os.path.isdir(name): continue
+ mtime = os.stat(name).st_mtime
+ if mtime < week_ago: continue
+
+ # parse the file
+ try:
+ doc = libxml2.parseFile(name)
+ except:
+ continue
+ xp = doc.xpathNewContext()
+ xp.xpathRegisterNs("atom", "http://www.w3.org/2005/Atom")
+ xp.xpathRegisterNs("planet", "http://planet.intertwingly.net/")
+
+ # determine the entry
+ entry = xp.xpathEval("/atom:entry/atom:link[@rel='alternate']")
+ if not entry: continue
+ entry = canonicalize(entry[0].prop("href"))
+
+ # determine the title
+ title = xp.xpathEval("/atom:entry/atom:title")
+ if title:
+ if title[0].prop('type') == 'html':
+ title = re.sub('<.*?>','',title[0].content)
+ else:
+ title = title[0].content
+ title = str(title or '')
+
+ # determine the feed id
+ feed = xp.xpathEval("/atom:entry/atom:source/planet:memegroup")
+ if not feed: feed = xp.xpathEval("/atom:entry/atom:source/atom:id")
+ if not feed: continue
+ feed = feed[0].content
+
+ # determine the author
+ author = xp.xpathEval("/atom:entry/atom:source/planet:name")
+ if author:
+ author = author[0].content
+ else:
+ author = ''
+
+ # track the feed_links
+ if author:
+ if not feed_links.has_key(author): feed_links[author] = list()
+ feed_links[author].append([mtime, entry, title])
+
+ # identify the unique links
+ entry_links = []
+ for node in doc.xpathEval("//*[@href and not(@rel='source') and not(@rel='license')]"):
+ parent = node.parent
+ while parent:
+ if parent.name == 'source': break
+ parent = parent.parent
+ else:
+ link = canonicalize(node.prop('href'))
+ if not link in entry_links:
+ entry_links.append(link)
+ if node.hasProp('title') and node.prop('title').startswith('http'):
+ link = canonicalize(node.prop('title'))
+ if not link in entry_links:
+ entry_links.append(link)
+
+ # add the votes
+ weight = 1.0 - (now - mtime)**2 / week**2
+ vote = [(weight, str(entry), str(feed), title, author, mtime)]
+ for link in entry_links:
+ all_links[link] = all_links.get(link,list()) + vote
+
+ # free the entry
+ doc.freeDoc()
+
+# tally the votes
+weighted_links = []
+for link, votes in all_links.items():
+ site = {}
+ updated = 0
+ for weight, entry, feed, title, author, mtime in votes:
+ site[feed] = max(site.get(feed,0), weight)
+ if mtime > updated: updated=mtime
+ weighted_links.append((sum(site.values()), link, updated))
+weighted_links.sort()
+weighted_links.reverse()
+
+cp1252 = {
+ 128: 8364, # euro sign
+ 130: 8218, # single low-9 quotation mark
+ 131: 402, # latin small letter f with hook
+ 132: 8222, # double low-9 quotation mark
+ 133: 8230, # horizontal ellipsis
+ 134: 8224, # dagger
+ 135: 8225, # double dagger
+ 136: 710, # modifier letter circumflex accent
+ 137: 8240, # per mille sign
+ 138: 352, # latin capital letter s with caron
+ 139: 8249, # single left-pointing angle quotation mark
+ 140: 338, # latin capital ligature oe
+ 142: 381, # latin capital letter z with caron
+ 145: 8216, # left single quotation mark
+ 146: 8217, # right single quotation mark
+ 147: 8220, # left double quotation mark
+ 148: 8221, # right double quotation mark
+ 149: 8226, # bullet
+ 150: 8211, # en dash
+ 151: 8212, # em dash
+ 152: 732, # small tilde
+ 153: 8482, # trade mark sign
+ 154: 353, # latin small letter s with caron
+ 155: 8250, # single right-pointing angle quotation mark
+ 156: 339, # latin small ligature oe
+ 158: 382, # latin small letter z with caron
+ 159: 376} # latin capital letter y with diaeresis
+
+# determine the title for a given url
+class html(sgmllib.SGMLParser):
+ def __init__(self, url):
+ sgmllib.SGMLParser.__init__(self)
+ self.title = ""
+ self.feedurl = ""
+ self.intitle = False
+
+ headers = check_cache(url)
+
+ try:
+ # fetch the page
+ request = urllib2.Request(url)
+ request.add_header('User-Agent', 'Venus/MeMeme')
+ if headers.has_key('etag'):
+ request.add_header('If-None-Match', headers['etag'])
+ if headers.has_key('last_modified'):
+ request.add_header('If-Modified-Since', headers['last-modified'])
+ response = urllib2.urlopen(request)
+ self.feed(response.read())
+
+ # ensure the data is in utf-8
+ try:
+ self.title = self.title.decode('utf-8')
+ except:
+ self.title = ''.join([unichr(cp1252.get(ord(c),ord(c)))
+ for c in self.title.decode('iso-8859-1')])
+
+ # cache the results
+ headers = {}
+ if self.feedurl: headers['feedurl'] = self.feedurl
+ if self.title: headers['title'] = self.title
+ headers.update(response.headers)
+ cache_meme(url, headers)
+ except:
+ self.feedurl = headers.get('feedurl')
+ if headers.has_key('title'):
+ if isinstance(headers['title'],str):
+ self.title=eval('u'+repr(headers['title']).replace('\\\\','\\'))
+ else:
+ self.title=headers['title']
+
+ # if there is a feed, look for an entry that matches, and take that title
+ if self.feedurl and not self.title:
+ headers = check_cache(self.feedurl)
+ data = feedparser.parse(self.feedurl, etag=headers.get('etag'),
+ modified=headers.get('last-modified'))
+
+ if data.has_key('headers') and data.has_key('status') and \
+ data.status in [200, 301, 302]:
+
+ titles = {}
+ for entry in data.entries:
+ if entry.has_key('title_detail') and entry.has_key('link'):
+ titles[entry.link] = entry.title_detail.value
+ if entry.title_detail.type == 'text/plain':
+ titles[entry.link] = escape(titles[entry.link])
+
+ if titles.has_key(url): self.title = titles[url]
+
+ data.headers.update(titles)
+ cache_meme(self.feedurl, data.headers)
+ else:
+ if headers.has_key(url):
+ if isinstance(headers[url],str):
+ self.title=eval('u'+repr(headers[url]).replace('\\\\','\\'))
+ else:
+ self.title=headers[url]
+
+ # fallback is the basename of the URI
+ if not self.title:
+ self.title = escape(url.rstrip('/').split('/')[-1].split('?')[0])
+
+ # parse out the first autodiscovery link
+ def start_link(self, attrs):
+ if self.feedurl: return
+ attrs = dict(map(lambda (k,v): (k.lower(),v), attrs))
+ if not 'rel' in attrs: return
+ rels = attrs['rel'].split(' ')
+ if 'alternate' not in rels: return
+ if not 'type' in attrs or not attrs['type'].endswith('xml'): return
+ if 'href' in attrs:
+ self.feedurl = attrs['href']
+
+ # parse the page title
+ def start_title(self, attributes):
+ if not self.title: self.intitle = True
+ def end_title(self):
+ self.intitle = False
+ def handle_data(self, text):
+ if self.intitle: self.title += escape(text)
+
+# convert unicode string to a json string
+def toj(value):
+ result = repr(value).replace(r'\x',r'\u00')
+ if result[:1] == 'u': result=result[1:]
+ if result.startswith("'"):
+ result = '"%s"' % result.replace('"',r'\"').replace(r"\'","'")[1:-1]
+ return result
+
+seenit = []
+count = 0
+
+# construct an empty feed
+feed_doc = libxml2.newDoc("1.0")
+meme_feed = feed_doc.newChild(None, "feed", None)
+meme_feed.newNs('http://www.w3.org/2005/Atom', None)
+meme_feed.newTextChild(None, 'title', config.name() + ': Memes')
+author = meme_feed.newChild(None, 'author', None)
+author.newTextChild(None, 'name', config.owner_name())
+if config.owner_email: author.newTextChild(None, 'email', config.owner_email())
+meme_feed.newTextChild(None, 'id', os.path.join(config.link(), 'memes.atom'))
+link = meme_feed.newChild(None, 'link', None)
+link.setProp('href', os.path.join(config.link(), 'memes.atom'))
+link.setProp('rel', 'self')
+meme_feed.newTextChild(None, 'updated',
+ time.strftime('%Y-%m-%dT%H:%M:%SZ', time.gmtime()))
+
+# parse the input
+log.debug("Parse input")
+doc=libxml2.readDoc(sys.stdin.read(), '', 'utf-8', libxml2.XML_PARSE_NONET)
+
+# find the sidebar/footer
+sidebar = options.get('sidebar','//*[@class="sidebar"]')
+footer = doc.xpathEval(sidebar)
+if not hasattr(footer,'__len__') or len(footer) == 0:
+ raise Exception(sidebar + ' not found')
+if len(footer) > 1:
+ log.info("%d occurrences of %s found, taking last" % (len(footer),sidebar))
+ if '@id' in sidebar:
+ for element in footer[:-1]:
+ element.unsetProp('id')
+footer = footer[-1]
+
+# add up to 10 entry links to each subscription
+subs_ul = footer.children
+while subs_ul.isText() or subs_ul.name != 'ul': subs_ul = subs_ul.next
+child = subs_ul.children
+while child:
+ if child.name == 'li':
+ if child.lastChild().name == 'ul': child.lastChild().unlinkNode()
+ link = child.lastChild()
+ while link.isText(): link=link.prev
+ author = link.getContent()
+ state = 'inactive'
+ if feed_links.has_key(author):
+ ul2 = child.newChild(None, 'ul', None)
+ feed_links[author].sort()
+ feed_links[author].reverse()
+ link_count = 0
+ for mtime, entry, title in feed_links[author]:
+ if not title: continue
+ li2 = ul2.newChild(None, 'li', None)
+ a = li2.newTextChild(None, 'a', title)
+ a.setProp('href', revmap.get(entry,entry))
+ link_count = link_count + 1
+ if link_count >= 10: break
+ if link_count > 0: state = None
+ if state:
+ link.setProp('class',((link.prop('class') or '') + ' ' + state).strip())
+ child=child.next
+
+# create a h2 and ul for the memes list
+footer_top = footer.children
+memes = footer_top.addPrevSibling(footer.newTextChild(None, 'h2', 'Memes '))
+memes_ul = footer_top.addPrevSibling(footer.newChild(None, 'ul', None))
+
+# create a header for the memes list
+a = memes.newChild(None, 'a', None)
+a.setProp('href', 'memes.atom')
+img = a.newChild(None, 'img', None)
+img.setProp('src', 'images/feed-icon-10x10.png')
+
+# collect the results
+log.debug("Fetch titles and collect the results")
+from urllib import quote_plus
+for i in range(0,len(weighted_links)):
+ weight, link, updated = weighted_links[i]
+ if link in spam: continue
+
+ # ensure that somebody new points to this entry. This guards against
+ # groups of related links which several posts point to all.
+ novel = False
+ for weight, entry, feed, title, author, mtime in all_links[link]:
+ if entry not in seenit:
+ seenit.append(entry)
+ novel = True
+ if not novel: continue
+
+ all_links[link].sort()
+ all_links[link].reverse()
+ cache_file = filename(cache, link)
+ title = None
+
+ # when possible, take the title from the cache
+ if os.path.exists(cache_file):
+ entry = feedparser.parse(cache_file).entries[0]
+ if entry.has_key('title_detail'):
+ title = entry.title_detail.value
+ if entry.title_detail.type == 'text/plain': title = escape(title)
+
+ # otherwise, parse the html
+ if not title:
+ title = html(revmap.get(link,link)).title
+
+ # dehtmlize
+ title = re.sub('&(\w+);',
+ lambda n: entitydefs.get(n.group(1), '&'+n.group(1)+';'), title)
+ title = re.sub('&#(\d+);',lambda n: unichr(int(n.group(1))), title)
+ title = re.sub('&#x(\w+);',lambda n: unichr(int(n.group(1),16)), title)
+
+ # title too long? Insert zero width spaces where appropriate
+ if max(map(len,title.split())) > 30:
+ title=re.sub('(\W+)',u'\\1\u200b',title)
+
+ # save the entry title (it is used later)
+ entry_title = title.strip()
+
+ # add to the memes list
+ memes_ul.addContent('\n')
+ li = memes_ul.newChild(None, 'li', None)
+ memes_ul.addContent('\n')
+
+ # technorati link
+ a = li.newChild(None, 'a', None)
+ tlink = 'http://technorati.com/blogs/'
+ if link.startswith('http://'):
+ a.setProp('href',tlink + quote_plus(link[7:]))
+ else:
+ a.setProp('href',tlink + quote_plus(link))
+ a.setProp('title','cosmos')
+ img = a.newChild(None, 'img', None)
+ img.setProp('src','images/tcosm11.gif')
+
+ # main link
+ a = li.newTextChild(None, 'a', title.strip().encode('utf-8'))
+ a.setProp('href',revmap.get(link,link))
+ if (((i==0) or (updated>=weighted_links[i-1][2])) and
+ (i+1==len(weighted_links) or (updated>=weighted_links[i+1][2]))):
+ rank = 0
+ for j in range(0,len(weighted_links)):
+ if updated < weighted_links[j][2]: rank = rank + 1
+ if rank < len(weighted_links)/2:
+ a.setProp('class','rising')
+
+ # voters
+ ul2 = li.newChild(None, 'ul', None)
+ voters = []
+ for weight, entry, feed, title, author, mtime in all_links[link]:
+ if entry in voters: continue
+ li2 = ul2.newChild(None, 'li', None)
+ a = li2.newTextChild(None, 'a' , author)
+ a.setProp('href',revmap.get(entry,entry))
+ if title: a.setProp('title',title)
+ voters.append(entry)
+
+ # add to the meme feed
+ if unique_votes(all_links[link]) > 2:
+ meme_feed.addContent('\n')
+ entry = meme_feed.newChild(None, 'entry', None)
+ meme_feed.addContent('\n')
+
+ # entry
+ tagbase = config.link().split('/')
+ if not tagbase[-1]: tagbase = tagbase[:-1]
+ tagbase = 'tag:%s,2007:%smeme/%%s' % (tagbase[2],'/'.join(tagbase[3:]))
+ entry.newTextChild(None, 'id', tagbase % md5.new(link).hexdigest())
+ entry.newTextChild(None, 'title', entry_title.encode('utf-8'))
+ meme_link = entry.newTextChild(None, 'link', None)
+ meme_link.setProp('href', link)
+ entry.newTextChild(None, 'updated',
+ time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime(updated)))
+
+ # voters
+ content = entry.newChild(None, 'content', None)
+ content.setProp('type', 'xhtml')
+ div = content.newTextChild(None, 'div', 'Spotted by:')
+ div.newNs('http://www.w3.org/1999/xhtml', None)
+ content_ul = div.newChild(None, 'ul', None)
+ for weight, entry, feed, title, author, mtime in all_links[link]:
+ li2 = content_ul.newTextChild(None, 'li', author + ": ")
+ a = li2.newTextChild(None, 'a' , title or 'untitled')
+ a.setProp('href',entry)
+
+ count = count + 1
+ if count >= 10: break
+
+log.info("Writing " + MEMES_ATOM)
+output=open(MEMES_ATOM,'w')
+output.write(feed_doc.serialize('utf-8'))
+output.close()
+
+sys.stdout.write(doc.serialize('utf-8'))
Deleted: trunk/lib/venus/filters/minhead.py
===================================================================
--- branches/sucs-site/lib/venus/filters/minhead.py 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/lib/venus/filters/minhead.py 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,36 +0,0 @@
-#
-# Ensure that all headings are below a permissible maximum (like h3).
-# If not, all heading levels will be changed to conform.
-# Note: this may create "illegal" heading levels, like h7 and beyond.
-#
-
-import sys
-from xml.dom import minidom, XHTML_NAMESPACE
-
-# determine permissible minimimum heading
-if '--min' in sys.argv:
- minhead = int(sys.argv[sys.argv.index('--min')+1])
-else:
- minhead=3
-
-# parse input stream
-doc = minidom.parse(sys.stdin)
-
-# search for headings below the permissable minimum
-first=minhead
-for i in range(1,minhead):
- if doc.getElementsByTagName('h%d' % i):
- first=i
- break
-
-# if found, bump all headings so that the top is the permissible minimum
-if first < minhead:
- for i in range(6,0,-1):
- for oldhead in doc.getElementsByTagName('h%d' % i):
- newhead = doc.createElementNS(XHTML_NAMESPACE, 'h%d' % (i+minhead-first))
- for child in oldhead.childNodes:
- newhead.appendChild(child)
- oldhead.parentNode.replaceChild(newhead, oldhead)
-
-# return (possibly modified) document
-print doc.toxml('utf-8')
Copied: trunk/lib/venus/filters/minhead.py (from rev 656, branches/sucs-site/lib/venus/filters/minhead.py)
===================================================================
--- trunk/lib/venus/filters/minhead.py (rev 0)
+++ trunk/lib/venus/filters/minhead.py 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,36 @@
+#
+# Ensure that all headings are below a permissible maximum (like h3).
+# If not, all heading levels will be changed to conform.
+# Note: this may create "illegal" heading levels, like h7 and beyond.
+#
+
+import sys
+from xml.dom import minidom, XHTML_NAMESPACE
+
+# determine permissible minimimum heading
+if '--min' in sys.argv:
+ minhead = int(sys.argv[sys.argv.index('--min')+1])
+else:
+ minhead=3
+
+# parse input stream
+doc = minidom.parse(sys.stdin)
+
+# search for headings below the permissable minimum
+first=minhead
+for i in range(1,minhead):
+ if doc.getElementsByTagName('h%d' % i):
+ first=i
+ break
+
+# if found, bump all headings so that the top is the permissible minimum
+if first < minhead:
+ for i in range(6,0,-1):
+ for oldhead in doc.getElementsByTagName('h%d' % i):
+ newhead = doc.createElementNS(XHTML_NAMESPACE, 'h%d' % (i+minhead-first))
+ for child in oldhead.childNodes:
+ newhead.appendChild(child)
+ oldhead.parentNode.replaceChild(newhead, oldhead)
+
+# return (possibly modified) document
+print doc.toxml('utf-8')
Deleted: trunk/lib/venus/filters/notweets.py
===================================================================
--- branches/sucs-site/lib/venus/filters/notweets.py 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/lib/venus/filters/notweets.py 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,6 +0,0 @@
-#remove all tweets
-import sys
-
-data = sys.stdin.read()
-if data.find('<id>tag:twitter.com,') < 0:
- sys.stdout.write(data)
Copied: trunk/lib/venus/filters/notweets.py (from rev 656, branches/sucs-site/lib/venus/filters/notweets.py)
===================================================================
--- trunk/lib/venus/filters/notweets.py (rev 0)
+++ trunk/lib/venus/filters/notweets.py 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,6 @@
+#remove all tweets
+import sys
+
+data = sys.stdin.read()
+if data.find('<id>tag:twitter.com,') < 0:
+ sys.stdout.write(data)
Deleted: trunk/lib/venus/filters/regexp_sifter.py
===================================================================
--- branches/sucs-site/lib/venus/filters/regexp_sifter.py 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/lib/venus/filters/regexp_sifter.py 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,44 +0,0 @@
-import sys, re
-
-# parse options
-options = dict(zip(sys.argv[1::2],sys.argv[2::2]))
-
-# read entry
-doc = data = sys.stdin.read()
-
-# Apply a sequence of patterns which turn a normalized Atom entry into
-# a stream of text, after removal of non-human metadata.
-for pattern,replacement in [
- (re.compile('<id>.*?</id>'),' '),
- (re.compile('<url>.*?</url>'),' '),
- (re.compile('<source>.*?</source>'),' '),
- (re.compile('<updated.*?</updated>'),' '),
- (re.compile('<published.*?</published>'),' '),
- (re.compile('<link .*?>'),' '),
- (re.compile('''<[^>]* alt=['"]([^'"]*)['"].*?>'''),r' \1 '),
- (re.compile('''<[^>]* title=['"]([^'"]*)['"].*?>'''),r' \1 '),
- (re.compile('''<[^>]* label=['"]([^'"]*)['"].*?>'''),r' \1 '),
- (re.compile('''<[^>]* term=['"]([^'"]*)['"].*?>'''),r' \1 '),
- (re.compile('<.*?>'),' '),
- (re.compile('\s+'),' '),
- (re.compile('>'),'>'),
- (re.compile('<'),'<'),
- (re.compile('''),"'"),
- (re.compile('"'),'"'),
- (re.compile('&'),'&'),
- (re.compile('\s+'),' ')
-]:
- data=pattern.sub(replacement,data)
-
-# process requirements
-if options.has_key('--require'):
- for regexp in options['--require'].split('\n'):
- if regexp and not re.search(regexp,data): sys.exit(1)
-
-# process exclusions
-if options.has_key('--exclude'):
- for regexp in options['--exclude'].split('\n'):
- if regexp and re.search(regexp,data): sys.exit(1)
-
-# if we get this far, the feed is to be included
-print doc
Copied: trunk/lib/venus/filters/regexp_sifter.py (from rev 656, branches/sucs-site/lib/venus/filters/regexp_sifter.py)
===================================================================
--- trunk/lib/venus/filters/regexp_sifter.py (rev 0)
+++ trunk/lib/venus/filters/regexp_sifter.py 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,44 @@
+import sys, re
+
+# parse options
+options = dict(zip(sys.argv[1::2],sys.argv[2::2]))
+
+# read entry
+doc = data = sys.stdin.read()
+
+# Apply a sequence of patterns which turn a normalized Atom entry into
+# a stream of text, after removal of non-human metadata.
+for pattern,replacement in [
+ (re.compile('<id>.*?</id>'),' '),
+ (re.compile('<url>.*?</url>'),' '),
+ (re.compile('<source>.*?</source>'),' '),
+ (re.compile('<updated.*?</updated>'),' '),
+ (re.compile('<published.*?</published>'),' '),
+ (re.compile('<link .*?>'),' '),
+ (re.compile('''<[^>]* alt=['"]([^'"]*)['"].*?>'''),r' \1 '),
+ (re.compile('''<[^>]* title=['"]([^'"]*)['"].*?>'''),r' \1 '),
+ (re.compile('''<[^>]* label=['"]([^'"]*)['"].*?>'''),r' \1 '),
+ (re.compile('''<[^>]* term=['"]([^'"]*)['"].*?>'''),r' \1 '),
+ (re.compile('<.*?>'),' '),
+ (re.compile('\s+'),' '),
+ (re.compile('>'),'>'),
+ (re.compile('<'),'<'),
+ (re.compile('''),"'"),
+ (re.compile('"'),'"'),
+ (re.compile('&'),'&'),
+ (re.compile('\s+'),' ')
+]:
+ data=pattern.sub(replacement,data)
+
+# process requirements
+if options.has_key('--require'):
+ for regexp in options['--require'].split('\n'):
+ if regexp and not re.search(regexp,data): sys.exit(1)
+
+# process exclusions
+if options.has_key('--exclude'):
+ for regexp in options['--exclude'].split('\n'):
+ if regexp and re.search(regexp,data): sys.exit(1)
+
+# if we get this far, the feed is to be included
+print doc
Deleted: trunk/lib/venus/filters/stripAd/feedburner.sed
===================================================================
--- branches/sucs-site/lib/venus/filters/stripAd/feedburner.sed 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/lib/venus/filters/stripAd/feedburner.sed 2015-04-05 16:42:47 UTC (rev 657)
@@ -1 +0,0 @@
-s|<p><a href="http://[a-zA-Z0-9\-\.]*/~a/[a-zA-Z0-9]*?a=[a-zA-Z0-9]*"><img border="0" src="http://[a-zA-Z0-9\.\-]*/~a/[a-zA-Z0-9/]*?i=[a-zA-Z0-9]*"/></a></p>||g
Copied: trunk/lib/venus/filters/stripAd/feedburner.sed (from rev 656, branches/sucs-site/lib/venus/filters/stripAd/feedburner.sed)
===================================================================
--- trunk/lib/venus/filters/stripAd/feedburner.sed (rev 0)
+++ trunk/lib/venus/filters/stripAd/feedburner.sed 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1 @@
+s|<p><a href="http://[a-zA-Z0-9\-\.]*/~a/[a-zA-Z0-9]*?a=[a-zA-Z0-9]*"><img border="0" src="http://[a-zA-Z0-9\.\-]*/~a/[a-zA-Z0-9/]*?i=[a-zA-Z0-9]*"/></a></p>||g
Deleted: trunk/lib/venus/filters/stripAd/google_ad_map.sed
===================================================================
--- branches/sucs-site/lib/venus/filters/stripAd/google_ad_map.sed 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/lib/venus/filters/stripAd/google_ad_map.sed 2015-04-05 16:42:47 UTC (rev 657)
@@ -1 +0,0 @@
-s|<p><map name="google_ad_map.*</p>||
Copied: trunk/lib/venus/filters/stripAd/google_ad_map.sed (from rev 656, branches/sucs-site/lib/venus/filters/stripAd/google_ad_map.sed)
===================================================================
--- trunk/lib/venus/filters/stripAd/google_ad_map.sed (rev 0)
+++ trunk/lib/venus/filters/stripAd/google_ad_map.sed 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1 @@
+s|<p><map name="google_ad_map.*</p>||
Deleted: trunk/lib/venus/filters/stripAd/yahoo.sed
===================================================================
--- branches/sucs-site/lib/venus/filters/stripAd/yahoo.sed 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/lib/venus/filters/stripAd/yahoo.sed 2015-04-05 16:42:47 UTC (rev 657)
@@ -1 +0,0 @@
-s|<p><!-- begin(Yahoo ad) -->.*<!-- end(Yahoo ad) --></p>||
Copied: trunk/lib/venus/filters/stripAd/yahoo.sed (from rev 656, branches/sucs-site/lib/venus/filters/stripAd/yahoo.sed)
===================================================================
--- trunk/lib/venus/filters/stripAd/yahoo.sed (rev 0)
+++ trunk/lib/venus/filters/stripAd/yahoo.sed 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1 @@
+s|<p><!-- begin(Yahoo ad) -->.*<!-- end(Yahoo ad) --></p>||
Deleted: trunk/lib/venus/filters/xhtml2html.plugin
===================================================================
--- branches/sucs-site/lib/venus/filters/xhtml2html.plugin 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/lib/venus/filters/xhtml2html.plugin 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,31 +0,0 @@
-# Example usages:
-#
-# filters:
-# xhtml2html.plugin?quote_attr_values=True"e_char="'"
-#
-# -- or --
-#
-# [xhtml2html.plugin]
-# quote_attr_values=True
-# quote_char="'"
-
-import sys
-opts = {}
-for name,value in zip(sys.argv[1::2],sys.argv[2::2]):
- name = name.lstrip('-')
- try: opts[name] = eval(value)
- except: opts[name] = value
-
-try:
- from xml.dom import minidom
- doc = minidom.parse(sys.stdin)
-except:
- from html5lib import liberalxmlparser, treebuilders
- parser = liberalxmlparser.XHTMLParser(tree=treebuilders.getTreeBuilder('dom'))
- doc = parser.parse(sys.stdin, encoding='utf-8')
-
-from html5lib import treewalkers, serializer
-tokens = treewalkers.getTreeWalker('dom')(doc)
-serializer = serializer.HTMLSerializer(**dict(opts))
-for text in serializer.serialize(tokens, encoding='utf-8'):
- sys.stdout.write(text)
Copied: trunk/lib/venus/filters/xhtml2html.plugin (from rev 656, branches/sucs-site/lib/venus/filters/xhtml2html.plugin)
===================================================================
--- trunk/lib/venus/filters/xhtml2html.plugin (rev 0)
+++ trunk/lib/venus/filters/xhtml2html.plugin 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,31 @@
+# Example usages:
+#
+# filters:
+# xhtml2html.plugin?quote_attr_values=True"e_char="'"
+#
+# -- or --
+#
+# [xhtml2html.plugin]
+# quote_attr_values=True
+# quote_char="'"
+
+import sys
+opts = {}
+for name,value in zip(sys.argv[1::2],sys.argv[2::2]):
+ name = name.lstrip('-')
+ try: opts[name] = eval(value)
+ except: opts[name] = value
+
+try:
+ from xml.dom import minidom
+ doc = minidom.parse(sys.stdin)
+except:
+ from html5lib import liberalxmlparser, treebuilders
+ parser = liberalxmlparser.XHTMLParser(tree=treebuilders.getTreeBuilder('dom'))
+ doc = parser.parse(sys.stdin, encoding='utf-8')
+
+from html5lib import treewalkers, serializer
+tokens = treewalkers.getTreeWalker('dom')(doc)
+serializer = serializer.HTMLSerializer(**dict(opts))
+for text in serializer.serialize(tokens, encoding='utf-8'):
+ sys.stdout.write(text)
Deleted: trunk/lib/venus/filters/xpath_sifter.py
===================================================================
--- branches/sucs-site/lib/venus/filters/xpath_sifter.py 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/lib/venus/filters/xpath_sifter.py 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,23 +0,0 @@
-import sys, libxml2
-
-# parse options
-options = dict(zip(sys.argv[1::2],sys.argv[2::2]))
-
-# parse entry
-doc = libxml2.parseDoc(sys.stdin.read())
-ctxt = doc.xpathNewContext()
-ctxt.xpathRegisterNs('atom','http://www.w3.org/2005/Atom')
-ctxt.xpathRegisterNs('xhtml','http://www.w3.org/1999/xhtml')
-
-# process requirements
-if options.has_key('--require'):
- for xpath in options['--require'].split('\n'):
- if xpath and not ctxt.xpathEval(xpath): sys.exit(1)
-
-# process exclusions
-if options.has_key('--exclude'):
- for xpath in options['--exclude'].split('\n'):
- if xpath and ctxt.xpathEval(xpath): sys.exit(1)
-
-# if we get this far, the feed is to be included
-print doc
Copied: trunk/lib/venus/filters/xpath_sifter.py (from rev 656, branches/sucs-site/lib/venus/filters/xpath_sifter.py)
===================================================================
--- trunk/lib/venus/filters/xpath_sifter.py (rev 0)
+++ trunk/lib/venus/filters/xpath_sifter.py 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,23 @@
+import sys, libxml2
+
+# parse options
+options = dict(zip(sys.argv[1::2],sys.argv[2::2]))
+
+# parse entry
+doc = libxml2.parseDoc(sys.stdin.read())
+ctxt = doc.xpathNewContext()
+ctxt.xpathRegisterNs('atom','http://www.w3.org/2005/Atom')
+ctxt.xpathRegisterNs('xhtml','http://www.w3.org/1999/xhtml')
+
+# process requirements
+if options.has_key('--require'):
+ for xpath in options['--require'].split('\n'):
+ if xpath and not ctxt.xpathEval(xpath): sys.exit(1)
+
+# process exclusions
+if options.has_key('--exclude'):
+ for xpath in options['--exclude'].split('\n'):
+ if xpath and ctxt.xpathEval(xpath): sys.exit(1)
+
+# if we get this far, the feed is to be included
+print doc
Deleted: trunk/lib/venus/planet/__init__.py
===================================================================
--- branches/sucs-site/lib/venus/planet/__init__.py 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/lib/venus/planet/__init__.py 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,40 +0,0 @@
-xmlns = 'http://planet.intertwingly.net/'
-
-logger = None
-loggerParms = None
-
-import os, sys, re
-import config
-config.__init__()
-
-from ConfigParser import ConfigParser
-from urlparse import urljoin
-
-def getLogger(level, format):
- """ get a logger with the specified log level """
- global logger, loggerParms
- if logger and loggerParms == (level,format): return logger
-
- try:
- import logging
- logging.basicConfig(format=format)
- except:
- import compat_logging as logging
- logging.basicConfig(format=format)
-
- logger = logging.getLogger("planet.runner")
- logger.setLevel(logging.getLevelName(level))
- try:
- logger.warning
- except:
- logger.warning = logger.warn
-
- loggerParms = (level,format)
- return logger
-
-sys.path.insert(1, os.path.join(os.path.dirname(__file__),'vendor'))
-
-# Configure feed parser
-import feedparser
-feedparser.SANITIZE_HTML=0
-feedparser.RESOLVE_RELATIVE_URIS=0
Copied: trunk/lib/venus/planet/__init__.py (from rev 656, branches/sucs-site/lib/venus/planet/__init__.py)
===================================================================
--- trunk/lib/venus/planet/__init__.py (rev 0)
+++ trunk/lib/venus/planet/__init__.py 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,40 @@
+xmlns = 'http://planet.intertwingly.net/'
+
+logger = None
+loggerParms = None
+
+import os, sys, re
+import config
+config.__init__()
+
+from ConfigParser import ConfigParser
+from urlparse import urljoin
+
+def getLogger(level, format):
+ """ get a logger with the specified log level """
+ global logger, loggerParms
+ if logger and loggerParms == (level,format): return logger
+
+ try:
+ import logging
+ logging.basicConfig(format=format)
+ except:
+ import compat_logging as logging
+ logging.basicConfig(format=format)
+
+ logger = logging.getLogger("planet.runner")
+ logger.setLevel(logging.getLevelName(level))
+ try:
+ logger.warning
+ except:
+ logger.warning = logger.warn
+
+ loggerParms = (level,format)
+ return logger
+
+sys.path.insert(1, os.path.join(os.path.dirname(__file__),'vendor'))
+
+# Configure feed parser
+import feedparser
+feedparser.SANITIZE_HTML=0
+feedparser.RESOLVE_RELATIVE_URIS=0
Deleted: trunk/lib/venus/planet/config.py
===================================================================
--- branches/sucs-site/lib/venus/planet/config.py 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/lib/venus/planet/config.py 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,400 +0,0 @@
-"""
-Planet Configuration
-
-This module encapsulates all planet configuration. This is not a generic
-configuration parser, it knows everything about configuring a planet - from
-the structure of the ini file, to knowledge of data types, even down to
-what are the defaults.
-
-Usage:
- import config
- config.load('config.ini')
-
- # administrative / structural information
- print config.template_files()
- print config.subscriptions()
-
- # planet wide configuration
- print config.name()
- print config.link()
-
- # per template configuration
- print config.days_per_page('atom.xml.tmpl')
- print config.encoding('index.html.tmpl')
-
-Todo:
- * error handling (example: no planet section)
-"""
-
-import os, sys, re, urllib
-from ConfigParser import ConfigParser
-from urlparse import urljoin
-
-parser = ConfigParser()
-
-planet_predefined_options = ['filters']
-
-def __init__():
- """define the struture of an ini file"""
- import config
-
- # get an option from a section
- def get(section, option, default):
- if section and parser.has_option(section, option):
- return parser.get(section, option)
- elif parser.has_option('Planet', option):
- if option == 'log_format':
- return parser.get('Planet', option, raw=True)
- return parser.get('Planet', option)
- else:
- return default
-
- # expand %(var) in lists
- def expand(list):
- output = []
- wild = re.compile('^(.*)#{(\w+)}(.*)$')
- for file in list.split():
- match = wild.match(file)
- if match:
- pre,var,post = match.groups()
- for sub in subscriptions():
- value = feed_options(sub).get(var,None)
- if value:
- output.append(pre+value+post)
- else:
- output.append(file)
- return output
-
- # define a string planet-level variable
- def define_planet(name, default):
- setattr(config, name, lambda default=default: get(None,name,default))
- planet_predefined_options.append(name)
-
- # define a list planet-level variable
- def define_planet_int(name, default=0):
- setattr(config, name, lambda : int(get(None,name,default)))
- planet_predefined_options.append(name)
-
- # define a list planet-level variable
- def define_planet_list(name, default=''):
- setattr(config, name, lambda : expand(get(None,name,default)))
- planet_predefined_options.append(name)
-
- # define a string template-level variable
- def define_tmpl(name, default):
- setattr(config, name, lambda section, default=default:
- get(section,name,default))
-
- # define an int template-level variable
- def define_tmpl_int(name, default):
- setattr(config, name, lambda section, default=default:
- int(get(section,name,default)))
-
- # planet wide options
- define_planet('name', "Unconfigured Planet")
- define_planet('link', '')
- define_planet('cache_directory', "cache")
- define_planet('log_level', "WARNING")
- define_planet('log_format', "%(levelname)s:%(name)s:%(message)s")
- define_planet('date_format', "%B %d, %Y %I:%M %p")
- define_planet('new_date_format', "%B %d, %Y")
- define_planet('generator', 'Venus')
- define_planet('generator_uri', 'http://intertwingly.net/code/venus/')
- define_planet('owner_name', 'Anonymous Coward')
- define_planet('owner_email', '')
- define_planet('output_theme', '')
- define_planet('output_dir', 'output')
- define_planet('spider_threads', 0)
-
- define_planet_int('new_feed_items', 0)
- define_planet_int('feed_timeout', 20)
- define_planet_int('cache_keep_entries', 10)
-
- define_planet_list('template_files')
- define_planet_list('bill_of_materials')
- define_planet_list('template_directories', '.')
- define_planet_list('filter_directories')
-
- # template options
- define_tmpl_int('days_per_page', 0)
- define_tmpl_int('items_per_page', 60)
- define_tmpl_int('activity_threshold', 0)
- define_tmpl('encoding', 'utf-8')
- define_tmpl('content_type', 'utf-8')
- define_tmpl('ignore_in_feed', '')
- define_tmpl('name_type', '')
- define_tmpl('title_type', '')
- define_tmpl('summary_type', '')
- define_tmpl('content_type', '')
- define_tmpl('future_dates', 'keep')
- define_tmpl('xml_base', '')
- define_tmpl('filter', None)
- define_tmpl('exclude', None)
-
-def load(config_file):
- """ initialize and load a configuration"""
- global parser
- parser = ConfigParser()
- parser.read(config_file)
-
- import config, planet
- from planet import opml, foaf, csv_config
- log = planet.logger
- if not log:
- log = planet.getLogger(config.log_level(),config.log_format())
-
- # Theme support
- theme = config.output_theme()
- if theme:
- for path in ("", os.path.join(sys.path[0],'themes')):
- theme_dir = os.path.join(path,theme)
- theme_file = os.path.join(theme_dir,'config.ini')
- if os.path.exists(theme_file):
- # initial search list for theme directories
- dirs = config.template_directories()
- if theme_dir not in dirs:
- dirs.append(theme_dir)
- if os.path.dirname(config_file) not in dirs:
- dirs.append(os.path.dirname(config_file))
-
- # read in the theme
- parser = ConfigParser()
- parser.read(theme_file)
- bom = config.bill_of_materials()
-
- # complete search list for theme directories
- dirs += [os.path.join(theme_dir,dir) for dir in
- config.template_directories() if dir not in dirs]
-
- # merge configurations, allowing current one to override theme
- template_files = config.template_files()
- parser.set('Planet','template_files','')
- parser.read(config_file)
- for file in config.bill_of_materials():
- if not file in bom: bom.append(file)
- parser.set('Planet', 'bill_of_materials', ' '.join(bom))
- parser.set('Planet', 'template_directories', ' '.join(dirs))
- parser.set('Planet', 'template_files',
- ' '.join(template_files + config.template_files()))
- break
- else:
- log.error('Unable to find theme %s', theme)
-
- # Filter support
- dirs = config.filter_directories()
- filter_dir = os.path.join(sys.path[0],'filters')
- if filter_dir not in dirs and os.path.exists(filter_dir):
- parser.set('Planet', 'filter_directories', ' '.join(dirs+[filter_dir]))
-
- # Reading list support
- reading_lists = config.reading_lists()
- if reading_lists:
- if not os.path.exists(config.cache_lists_directory()):
- os.makedirs(config.cache_lists_directory())
-
- def data2config(data, cached_config):
- if content_type(list).find('opml')>=0:
- opml.opml2config(data, cached_config)
- elif content_type(list).find('foaf')>=0:
- foaf.foaf2config(data, cached_config)
- elif content_type(list).find('csv')>=0:
- csv_config.csv2config(data, cached_config)
- elif content_type(list).find('config')>=0:
- cached_config.readfp(data)
- else:
- from planet import shell
- import StringIO
- cached_config.readfp(StringIO.StringIO(shell.run(
- content_type(list), data.getvalue(), mode="filter")))
-
- if cached_config.sections() in [[], [list]]:
- raise Exception
-
- for list in reading_lists:
- downloadReadingList(list, parser, data2config)
-
-def downloadReadingList(list, orig_config, callback, use_cache=True, re_read=True):
- from planet import logger
- import config
- try:
-
- import urllib2, StringIO
- from planet.spider import filename
-
- # list cache file name
- cache_filename = filename(config.cache_lists_directory(), list)
-
- # retrieve list options (e.g., etag, last-modified) from cache
- options = {}
-
- # add original options
- for key in orig_config.options(list):
- options[key] = orig_config.get(list, key)
-
- try:
- if use_cache:
- cached_config = ConfigParser()
- cached_config.read(cache_filename)
- for option in cached_config.options(list):
- options[option] = cached_config.get(list,option)
- except:
- pass
-
- cached_config = ConfigParser()
- cached_config.add_section(list)
- for key, value in options.items():
- cached_config.set(list, key, value)
-
- # read list
- curdir=getattr(os.path, 'curdir', '.')
- if sys.platform.find('win') < 0:
- base = urljoin('file:', os.path.abspath(curdir))
- else:
- path = os.path.abspath(os.path.curdir)
- base = urljoin('file:///', path.replace(':','|').replace('\\','/'))
-
- request = urllib2.Request(urljoin(base + '/', list))
- if options.has_key("etag"):
- request.add_header('If-None-Match', options['etag'])
- if options.has_key("last-modified"):
- request.add_header('If-Modified-Since',
- options['last-modified'])
- response = urllib2.urlopen(request)
- if response.headers.has_key('etag'):
- cached_config.set(list, 'etag', response.headers['etag'])
- if response.headers.has_key('last-modified'):
- cached_config.set(list, 'last-modified',
- response.headers['last-modified'])
-
- # convert to config.ini
- data = StringIO.StringIO(response.read())
-
- if callback: callback(data, cached_config)
-
- # write to cache
- if use_cache:
- cache = open(cache_filename, 'w')
- cached_config.write(cache)
- cache.close()
-
- # re-parse and proceed
- logger.debug("Using %s readinglist", list)
- if re_read:
- if use_cache:
- orig_config.read(cache_filename)
- else:
- cdata = StringIO.StringIO()
- cached_config.write(cdata)
- cdata.seek(0)
- orig_config.readfp(cdata)
- except:
- try:
- if re_read:
- if use_cache:
- if not orig_config.read(cache_filename): raise Exception()
- else:
- cdata = StringIO.StringIO()
- cached_config.write(cdata)
- cdata.seek(0)
- orig_config.readfp(cdata)
- logger.info("Using cached %s readinglist", list)
- except:
- logger.exception("Unable to read %s readinglist", list)
-
-def http_cache_directory():
- if parser.has_option('Planet', 'http_cache_directory'):
- os.path.join(cache_directory(),
- parser.get('Planet', 'http_cache_directory'))
- else:
- return os.path.join(cache_directory(), "cache")
-
-def cache_sources_directory():
- if parser.has_option('Planet', 'cache_sources_directory'):
- return os.path.join(cache_directory(),
- parser.get('Planet', 'cache_sources_directory'))
- else:
- return os.path.join(cache_directory(), 'sources')
-
-def cache_lists_directory():
- if parser.has_option('Planet', 'cache_lists_directory'):
- parser.get('Planet', 'cache_lists_directory')
- else:
- return os.path.join(cache_directory(), 'lists')
-
-def feed():
- if parser.has_option('Planet', 'feed'):
- return parser.get('Planet', 'feed')
- elif link():
- for template_file in template_files():
- name = os.path.splitext(os.path.basename(template_file))[0]
- if name.find('atom')>=0 or name.find('rss')>=0:
- return urljoin(link(), name)
-
-def feedtype():
- if parser.has_option('Planet', 'feedtype'):
- parser.get('Planet', 'feedtype')
- elif feed() and feed().find('atom')>=0:
- return 'atom'
- elif feed() and feed().find('rss')>=0:
- return 'rss'
-
-def subscriptions():
- """ list the feed subscriptions """
- return __builtins__['filter'](lambda feed: feed!='Planet' and
- feed not in template_files()+filters()+reading_lists(),
- parser.sections())
-
-def reading_lists():
- """ list of lists of feed subscriptions """
- result = []
- for section in parser.sections():
- if parser.has_option(section, 'content_type'):
- type = parser.get(section, 'content_type')
- if type.find('opml')>=0 or type.find('foaf')>=0 or \
- type.find('csv')>=0 or type.find('config')>=0 or \
- type.find('.')>=0:
- result.append(section)
- return result
-
-def filters(section=None):
- filters = []
- if parser.has_option('Planet', 'filters'):
- filters += parser.get('Planet', 'filters').split()
- if filter(section):
- filters.append('regexp_sifter.py?require=' +
- urllib.quote(filter(section)))
- if exclude(section):
- filters.append('regexp_sifter.py?exclude=' +
- urllib.quote(exclude(section)))
- for section in section and [section] or template_files():
- if parser.has_option(section, 'filters'):
- filters += parser.get(section, 'filters').split()
- return filters
-
-def planet_options():
- """ dictionary of planet wide options"""
- return dict(map(lambda opt: (opt,
- parser.get('Planet', opt, raw=(opt=="log_format"))),
- parser.options('Planet')))
-
-def feed_options(section):
- """ dictionary of feed specific options"""
- import config
- options = dict([(key,value) for key,value in planet_options().items()
- if key not in planet_predefined_options])
- if parser.has_section(section):
- options.update(dict(map(lambda opt: (opt, parser.get(section,opt)),
- parser.options(section))))
- return options
-
-def template_options(section):
- """ dictionary of template specific options"""
- return feed_options(section)
-
-def filter_options(section):
- """ dictionary of filter specific options"""
- return feed_options(section)
-
-def write(file=sys.stdout):
- """ write out an updated template """
- print parser.write(file)
Copied: trunk/lib/venus/planet/config.py (from rev 656, branches/sucs-site/lib/venus/planet/config.py)
===================================================================
--- trunk/lib/venus/planet/config.py (rev 0)
+++ trunk/lib/venus/planet/config.py 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,400 @@
+"""
+Planet Configuration
+
+This module encapsulates all planet configuration. This is not a generic
+configuration parser, it knows everything about configuring a planet - from
+the structure of the ini file, to knowledge of data types, even down to
+what are the defaults.
+
+Usage:
+ import config
+ config.load('config.ini')
+
+ # administrative / structural information
+ print config.template_files()
+ print config.subscriptions()
+
+ # planet wide configuration
+ print config.name()
+ print config.link()
+
+ # per template configuration
+ print config.days_per_page('atom.xml.tmpl')
+ print config.encoding('index.html.tmpl')
+
+Todo:
+ * error handling (example: no planet section)
+"""
+
+import os, sys, re, urllib
+from ConfigParser import ConfigParser
+from urlparse import urljoin
+
+parser = ConfigParser()
+
+planet_predefined_options = ['filters']
+
+def __init__():
+ """define the struture of an ini file"""
+ import config
+
+ # get an option from a section
+ def get(section, option, default):
+ if section and parser.has_option(section, option):
+ return parser.get(section, option)
+ elif parser.has_option('Planet', option):
+ if option == 'log_format':
+ return parser.get('Planet', option, raw=True)
+ return parser.get('Planet', option)
+ else:
+ return default
+
+ # expand %(var) in lists
+ def expand(list):
+ output = []
+ wild = re.compile('^(.*)#{(\w+)}(.*)$')
+ for file in list.split():
+ match = wild.match(file)
+ if match:
+ pre,var,post = match.groups()
+ for sub in subscriptions():
+ value = feed_options(sub).get(var,None)
+ if value:
+ output.append(pre+value+post)
+ else:
+ output.append(file)
+ return output
+
+ # define a string planet-level variable
+ def define_planet(name, default):
+ setattr(config, name, lambda default=default: get(None,name,default))
+ planet_predefined_options.append(name)
+
+ # define a list planet-level variable
+ def define_planet_int(name, default=0):
+ setattr(config, name, lambda : int(get(None,name,default)))
+ planet_predefined_options.append(name)
+
+ # define a list planet-level variable
+ def define_planet_list(name, default=''):
+ setattr(config, name, lambda : expand(get(None,name,default)))
+ planet_predefined_options.append(name)
+
+ # define a string template-level variable
+ def define_tmpl(name, default):
+ setattr(config, name, lambda section, default=default:
+ get(section,name,default))
+
+ # define an int template-level variable
+ def define_tmpl_int(name, default):
+ setattr(config, name, lambda section, default=default:
+ int(get(section,name,default)))
+
+ # planet wide options
+ define_planet('name', "Unconfigured Planet")
+ define_planet('link', '')
+ define_planet('cache_directory', "cache")
+ define_planet('log_level', "WARNING")
+ define_planet('log_format', "%(levelname)s:%(name)s:%(message)s")
+ define_planet('date_format', "%B %d, %Y %I:%M %p")
+ define_planet('new_date_format', "%B %d, %Y")
+ define_planet('generator', 'Venus')
+ define_planet('generator_uri', 'http://intertwingly.net/code/venus/')
+ define_planet('owner_name', 'Anonymous Coward')
+ define_planet('owner_email', '')
+ define_planet('output_theme', '')
+ define_planet('output_dir', 'output')
+ define_planet('spider_threads', 0)
+
+ define_planet_int('new_feed_items', 0)
+ define_planet_int('feed_timeout', 20)
+ define_planet_int('cache_keep_entries', 10)
+
+ define_planet_list('template_files')
+ define_planet_list('bill_of_materials')
+ define_planet_list('template_directories', '.')
+ define_planet_list('filter_directories')
+
+ # template options
+ define_tmpl_int('days_per_page', 0)
+ define_tmpl_int('items_per_page', 60)
+ define_tmpl_int('activity_threshold', 0)
+ define_tmpl('encoding', 'utf-8')
+ define_tmpl('content_type', 'utf-8')
+ define_tmpl('ignore_in_feed', '')
+ define_tmpl('name_type', '')
+ define_tmpl('title_type', '')
+ define_tmpl('summary_type', '')
+ define_tmpl('content_type', '')
+ define_tmpl('future_dates', 'keep')
+ define_tmpl('xml_base', '')
+ define_tmpl('filter', None)
+ define_tmpl('exclude', None)
+
+def load(config_file):
+ """ initialize and load a configuration"""
+ global parser
+ parser = ConfigParser()
+ parser.read(config_file)
+
+ import config, planet
+ from planet import opml, foaf, csv_config
+ log = planet.logger
+ if not log:
+ log = planet.getLogger(config.log_level(),config.log_format())
+
+ # Theme support
+ theme = config.output_theme()
+ if theme:
+ for path in ("", os.path.join(sys.path[0],'themes')):
+ theme_dir = os.path.join(path,theme)
+ theme_file = os.path.join(theme_dir,'config.ini')
+ if os.path.exists(theme_file):
+ # initial search list for theme directories
+ dirs = config.template_directories()
+ if theme_dir not in dirs:
+ dirs.append(theme_dir)
+ if os.path.dirname(config_file) not in dirs:
+ dirs.append(os.path.dirname(config_file))
+
+ # read in the theme
+ parser = ConfigParser()
+ parser.read(theme_file)
+ bom = config.bill_of_materials()
+
+ # complete search list for theme directories
+ dirs += [os.path.join(theme_dir,dir) for dir in
+ config.template_directories() if dir not in dirs]
+
+ # merge configurations, allowing current one to override theme
+ template_files = config.template_files()
+ parser.set('Planet','template_files','')
+ parser.read(config_file)
+ for file in config.bill_of_materials():
+ if not file in bom: bom.append(file)
+ parser.set('Planet', 'bill_of_materials', ' '.join(bom))
+ parser.set('Planet', 'template_directories', ' '.join(dirs))
+ parser.set('Planet', 'template_files',
+ ' '.join(template_files + config.template_files()))
+ break
+ else:
+ log.error('Unable to find theme %s', theme)
+
+ # Filter support
+ dirs = config.filter_directories()
+ filter_dir = os.path.join(sys.path[0],'filters')
+ if filter_dir not in dirs and os.path.exists(filter_dir):
+ parser.set('Planet', 'filter_directories', ' '.join(dirs+[filter_dir]))
+
+ # Reading list support
+ reading_lists = config.reading_lists()
+ if reading_lists:
+ if not os.path.exists(config.cache_lists_directory()):
+ os.makedirs(config.cache_lists_directory())
+
+ def data2config(data, cached_config):
+ if content_type(list).find('opml')>=0:
+ opml.opml2config(data, cached_config)
+ elif content_type(list).find('foaf')>=0:
+ foaf.foaf2config(data, cached_config)
+ elif content_type(list).find('csv')>=0:
+ csv_config.csv2config(data, cached_config)
+ elif content_type(list).find('config')>=0:
+ cached_config.readfp(data)
+ else:
+ from planet import shell
+ import StringIO
+ cached_config.readfp(StringIO.StringIO(shell.run(
+ content_type(list), data.getvalue(), mode="filter")))
+
+ if cached_config.sections() in [[], [list]]:
+ raise Exception
+
+ for list in reading_lists:
+ downloadReadingList(list, parser, data2config)
+
+def downloadReadingList(list, orig_config, callback, use_cache=True, re_read=True):
+ from planet import logger
+ import config
+ try:
+
+ import urllib2, StringIO
+ from planet.spider import filename
+
+ # list cache file name
+ cache_filename = filename(config.cache_lists_directory(), list)
+
+ # retrieve list options (e.g., etag, last-modified) from cache
+ options = {}
+
+ # add original options
+ for key in orig_config.options(list):
+ options[key] = orig_config.get(list, key)
+
+ try:
+ if use_cache:
+ cached_config = ConfigParser()
+ cached_config.read(cache_filename)
+ for option in cached_config.options(list):
+ options[option] = cached_config.get(list,option)
+ except:
+ pass
+
+ cached_config = ConfigParser()
+ cached_config.add_section(list)
+ for key, value in options.items():
+ cached_config.set(list, key, value)
+
+ # read list
+ curdir=getattr(os.path, 'curdir', '.')
+ if sys.platform.find('win') < 0:
+ base = urljoin('file:', os.path.abspath(curdir))
+ else:
+ path = os.path.abspath(os.path.curdir)
+ base = urljoin('file:///', path.replace(':','|').replace('\\','/'))
+
+ request = urllib2.Request(urljoin(base + '/', list))
+ if options.has_key("etag"):
+ request.add_header('If-None-Match', options['etag'])
+ if options.has_key("last-modified"):
+ request.add_header('If-Modified-Since',
+ options['last-modified'])
+ response = urllib2.urlopen(request)
+ if response.headers.has_key('etag'):
+ cached_config.set(list, 'etag', response.headers['etag'])
+ if response.headers.has_key('last-modified'):
+ cached_config.set(list, 'last-modified',
+ response.headers['last-modified'])
+
+ # convert to config.ini
+ data = StringIO.StringIO(response.read())
+
+ if callback: callback(data, cached_config)
+
+ # write to cache
+ if use_cache:
+ cache = open(cache_filename, 'w')
+ cached_config.write(cache)
+ cache.close()
+
+ # re-parse and proceed
+ logger.debug("Using %s readinglist", list)
+ if re_read:
+ if use_cache:
+ orig_config.read(cache_filename)
+ else:
+ cdata = StringIO.StringIO()
+ cached_config.write(cdata)
+ cdata.seek(0)
+ orig_config.readfp(cdata)
+ except:
+ try:
+ if re_read:
+ if use_cache:
+ if not orig_config.read(cache_filename): raise Exception()
+ else:
+ cdata = StringIO.StringIO()
+ cached_config.write(cdata)
+ cdata.seek(0)
+ orig_config.readfp(cdata)
+ logger.info("Using cached %s readinglist", list)
+ except:
+ logger.exception("Unable to read %s readinglist", list)
+
+def http_cache_directory():
+ if parser.has_option('Planet', 'http_cache_directory'):
+ os.path.join(cache_directory(),
+ parser.get('Planet', 'http_cache_directory'))
+ else:
+ return os.path.join(cache_directory(), "cache")
+
+def cache_sources_directory():
+ if parser.has_option('Planet', 'cache_sources_directory'):
+ return os.path.join(cache_directory(),
+ parser.get('Planet', 'cache_sources_directory'))
+ else:
+ return os.path.join(cache_directory(), 'sources')
+
+def cache_lists_directory():
+ if parser.has_option('Planet', 'cache_lists_directory'):
+ parser.get('Planet', 'cache_lists_directory')
+ else:
+ return os.path.join(cache_directory(), 'lists')
+
+def feed():
+ if parser.has_option('Planet', 'feed'):
+ return parser.get('Planet', 'feed')
+ elif link():
+ for template_file in template_files():
+ name = os.path.splitext(os.path.basename(template_file))[0]
+ if name.find('atom')>=0 or name.find('rss')>=0:
+ return urljoin(link(), name)
+
+def feedtype():
+ if parser.has_option('Planet', 'feedtype'):
+ parser.get('Planet', 'feedtype')
+ elif feed() and feed().find('atom')>=0:
+ return 'atom'
+ elif feed() and feed().find('rss')>=0:
+ return 'rss'
+
+def subscriptions():
+ """ list the feed subscriptions """
+ return __builtins__['filter'](lambda feed: feed!='Planet' and
+ feed not in template_files()+filters()+reading_lists(),
+ parser.sections())
+
+def reading_lists():
+ """ list of lists of feed subscriptions """
+ result = []
+ for section in parser.sections():
+ if parser.has_option(section, 'content_type'):
+ type = parser.get(section, 'content_type')
+ if type.find('opml')>=0 or type.find('foaf')>=0 or \
+ type.find('csv')>=0 or type.find('config')>=0 or \
+ type.find('.')>=0:
+ result.append(section)
+ return result
+
+def filters(section=None):
+ filters = []
+ if parser.has_option('Planet', 'filters'):
+ filters += parser.get('Planet', 'filters').split()
+ if filter(section):
+ filters.append('regexp_sifter.py?require=' +
+ urllib.quote(filter(section)))
+ if exclude(section):
+ filters.append('regexp_sifter.py?exclude=' +
+ urllib.quote(exclude(section)))
+ for section in section and [section] or template_files():
+ if parser.has_option(section, 'filters'):
+ filters += parser.get(section, 'filters').split()
+ return filters
+
+def planet_options():
+ """ dictionary of planet wide options"""
+ return dict(map(lambda opt: (opt,
+ parser.get('Planet', opt, raw=(opt=="log_format"))),
+ parser.options('Planet')))
+
+def feed_options(section):
+ """ dictionary of feed specific options"""
+ import config
+ options = dict([(key,value) for key,value in planet_options().items()
+ if key not in planet_predefined_options])
+ if parser.has_section(section):
+ options.update(dict(map(lambda opt: (opt, parser.get(section,opt)),
+ parser.options(section))))
+ return options
+
+def template_options(section):
+ """ dictionary of template specific options"""
+ return feed_options(section)
+
+def filter_options(section):
+ """ dictionary of filter specific options"""
+ return feed_options(section)
+
+def write(file=sys.stdout):
+ """ write out an updated template """
+ print parser.write(file)
Deleted: trunk/lib/venus/planet/csv_config.py
===================================================================
--- branches/sucs-site/lib/venus/planet/csv_config.py 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/lib/venus/planet/csv_config.py 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,29 +0,0 @@
-from ConfigParser import ConfigParser
-import csv
-
-# input = csv, output = ConfigParser
-def csv2config(input, config=None):
-
- if not hasattr(input, 'read'):
- input = csv.StringIO(input)
-
- if not config:
- config = ConfigParser()
-
- reader = csv.DictReader(input)
- for row in reader:
- section = row[reader.fieldnames[0]]
- config.add_section(section)
- for name, value in row.items():
- if value and name != reader.fieldnames[0]:
- config.set(section, name, value)
-
- return config
-
-if __name__ == "__main__":
- # small main program which converts CSV into config.ini format
- import sys, urllib
- config = ConfigParser()
- for input in sys.argv[1:]:
- csv2config(urllib.urlopen(input), config)
- config.write(sys.stdout)
Copied: trunk/lib/venus/planet/csv_config.py (from rev 656, branches/sucs-site/lib/venus/planet/csv_config.py)
===================================================================
--- trunk/lib/venus/planet/csv_config.py (rev 0)
+++ trunk/lib/venus/planet/csv_config.py 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,29 @@
+from ConfigParser import ConfigParser
+import csv
+
+# input = csv, output = ConfigParser
+def csv2config(input, config=None):
+
+ if not hasattr(input, 'read'):
+ input = csv.StringIO(input)
+
+ if not config:
+ config = ConfigParser()
+
+ reader = csv.DictReader(input)
+ for row in reader:
+ section = row[reader.fieldnames[0]]
+ config.add_section(section)
+ for name, value in row.items():
+ if value and name != reader.fieldnames[0]:
+ config.set(section, name, value)
+
+ return config
+
+if __name__ == "__main__":
+ # small main program which converts CSV into config.ini format
+ import sys, urllib
+ config = ConfigParser()
+ for input in sys.argv[1:]:
+ csv2config(urllib.urlopen(input), config)
+ config.write(sys.stdout)
Deleted: trunk/lib/venus/planet/expunge.py
===================================================================
--- branches/sucs-site/lib/venus/planet/expunge.py 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/lib/venus/planet/expunge.py 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,67 +0,0 @@
-""" Expunge old entries from a cache of entries """
-import glob, os, planet, config, feedparser
-from xml.dom import minidom
-from spider import filename
-
-def expungeCache():
- """ Expunge old entries from a cache of entries """
- log = planet.logger
-
- log.info("Determining feed subscriptions")
- entry_count = {}
- sources = config.cache_sources_directory()
- for sub in config.subscriptions():
- data=feedparser.parse(filename(sources,sub))
- if not data.feed.has_key('id'): continue
- if config.feed_options(sub).has_key('cache_keep_entries'):
- entry_count[data.feed.id] = int(config.feed_options(sub)['cache_keep_entries'])
- else:
- entry_count[data.feed.id] = config.cache_keep_entries()
-
- log.info("Listing cached entries")
- cache = config.cache_directory()
- dir=[(os.stat(file).st_mtime,file) for file in glob.glob(cache+"/*")
- if not os.path.isdir(file)]
- dir.sort()
- dir.reverse()
-
- for mtime,file in dir:
-
- try:
- entry=minidom.parse(file)
- # determine source of entry
- entry.normalize()
- sources = entry.getElementsByTagName('source')
- if not sources:
- # no source determined, do not delete
- log.debug("No source found for %s", file)
- continue
- ids = sources[0].getElementsByTagName('id')
- if not ids:
- # feed id not found, do not delete
- log.debug("No source feed id found for %s", file)
- continue
- if ids[0].childNodes[0].nodeValue in entry_count:
- # subscribed to feed, update entry count
- entry_count[ids[0].childNodes[0].nodeValue] = entry_count[
- ids[0].childNodes[0].nodeValue] - 1
- if entry_count[ids[0].childNodes[0].nodeValue] >= 0:
- # maximum not reached, do not delete
- log.debug("Maximum not reached for %s from %s",
- file, ids[0].childNodes[0].nodeValue)
- continue
- else:
- # maximum reached
- log.debug("Removing %s, maximum reached for %s",
- file, ids[0].childNodes[0].nodeValue)
- else:
- # not subscribed
- log.debug("Removing %s, not subscribed to %s",
- file, ids[0].childNodes[0].nodeValue)
- # remove old entry
- os.unlink(file)
-
- except:
- log.error("Error parsing %s", file)
-
-# end of expungeCache()
Copied: trunk/lib/venus/planet/expunge.py (from rev 656, branches/sucs-site/lib/venus/planet/expunge.py)
===================================================================
--- trunk/lib/venus/planet/expunge.py (rev 0)
+++ trunk/lib/venus/planet/expunge.py 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,67 @@
+""" Expunge old entries from a cache of entries """
+import glob, os, planet, config, feedparser
+from xml.dom import minidom
+from spider import filename
+
+def expungeCache():
+ """ Expunge old entries from a cache of entries """
+ log = planet.logger
+
+ log.info("Determining feed subscriptions")
+ entry_count = {}
+ sources = config.cache_sources_directory()
+ for sub in config.subscriptions():
+ data=feedparser.parse(filename(sources,sub))
+ if not data.feed.has_key('id'): continue
+ if config.feed_options(sub).has_key('cache_keep_entries'):
+ entry_count[data.feed.id] = int(config.feed_options(sub)['cache_keep_entries'])
+ else:
+ entry_count[data.feed.id] = config.cache_keep_entries()
+
+ log.info("Listing cached entries")
+ cache = config.cache_directory()
+ dir=[(os.stat(file).st_mtime,file) for file in glob.glob(cache+"/*")
+ if not os.path.isdir(file)]
+ dir.sort()
+ dir.reverse()
+
+ for mtime,file in dir:
+
+ try:
+ entry=minidom.parse(file)
+ # determine source of entry
+ entry.normalize()
+ sources = entry.getElementsByTagName('source')
+ if not sources:
+ # no source determined, do not delete
+ log.debug("No source found for %s", file)
+ continue
+ ids = sources[0].getElementsByTagName('id')
+ if not ids:
+ # feed id not found, do not delete
+ log.debug("No source feed id found for %s", file)
+ continue
+ if ids[0].childNodes[0].nodeValue in entry_count:
+ # subscribed to feed, update entry count
+ entry_count[ids[0].childNodes[0].nodeValue] = entry_count[
+ ids[0].childNodes[0].nodeValue] - 1
+ if entry_count[ids[0].childNodes[0].nodeValue] >= 0:
+ # maximum not reached, do not delete
+ log.debug("Maximum not reached for %s from %s",
+ file, ids[0].childNodes[0].nodeValue)
+ continue
+ else:
+ # maximum reached
+ log.debug("Removing %s, maximum reached for %s",
+ file, ids[0].childNodes[0].nodeValue)
+ else:
+ # not subscribed
+ log.debug("Removing %s, not subscribed to %s",
+ file, ids[0].childNodes[0].nodeValue)
+ # remove old entry
+ os.unlink(file)
+
+ except:
+ log.error("Error parsing %s", file)
+
+# end of expungeCache()
Deleted: trunk/lib/venus/planet/foaf.py
===================================================================
--- branches/sucs-site/lib/venus/planet/foaf.py 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/lib/venus/planet/foaf.py 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,197 +0,0 @@
-from ConfigParser import ConfigParser
-
-inheritable_options = [ 'online_accounts' ]
-
-def load_accounts(config, section):
- accounts = {}
- if(config.has_option(section, 'online_accounts')):
- values = config.get(section, 'online_accounts')
- for account_map in values.split('\n'):
- try:
- homepage, map = account_map.split('|')
- accounts[homepage] = map
- except:
- pass
-
- return accounts
-
-def load_model(rdf, base_uri):
-
- if hasattr(rdf, 'find_statements'):
- return rdf
-
- if hasattr(rdf, 'read'):
- rdf = rdf.read()
-
- def handler(code, level, facility, message, line, column, byte, file, uri):
- pass
-
- from RDF import Model, Parser
-
- model = Model()
-
- Parser().parse_string_into_model(model,rdf,base_uri,handler)
-
- return model
-
-# input = foaf, output = ConfigParser
-def foaf2config(rdf, config, subject=None, section=None):
-
- if not config or not config.sections():
- return
-
- # there should be only be 1 section
- if not section: section = config.sections().pop()
-
- try:
- from RDF import Model, NS, Parser, Statement
- except:
- return
-
- # account mappings, none by default
- # form: accounts = {url to service homepage (as found in FOAF)}|{URI template}\n*
- # example: http://del.icio.us/|http://del.icio.us/rss/{foaf:accountName}
- accounts = load_accounts(config, section)
-
- depth = 0
-
- if(config.has_option(section, 'depth')):
- depth = config.getint(section, 'depth')
-
- model = load_model(rdf, section)
-
- dc = NS('http://purl.org/dc/elements/1.1/')
- foaf = NS('http://xmlns.com/foaf/0.1/')
- rdfs = NS('http://www.w3.org/2000/01/rdf-schema#')
- rdf = NS('http://www.w3.org/1999/02/22-rdf-syntax-ns#')
- rss = NS('http://purl.org/rss/1.0/')
-
- for statement in model.find_statements(Statement(subject,foaf.weblog,None)):
-
- # feed owner
- person = statement.subject
-
- # title is required (at the moment)
- title = model.get_target(person,foaf.name)
- if not title: title = model.get_target(statement.object,dc.title)
- if not title:
- continue
-
- # blog is optional
- feed = model.get_target(statement.object,rdfs.seeAlso)
- if feed and rss.channel == model.get_target(feed, rdf.type):
- feed = str(feed.uri)
- if not config.has_section(feed):
- config.add_section(feed)
- config.set(feed, 'name', str(title))
-
- # now look for OnlineAccounts for the same person
- if accounts.keys():
- for statement in model.find_statements(Statement(person,foaf.holdsAccount,None)):
- rdfaccthome = model.get_target(statement.object,foaf.accountServiceHomepage)
- rdfacctname = model.get_target(statement.object,foaf.accountName)
-
- if not rdfaccthome or not rdfacctname: continue
-
- if not rdfaccthome.is_resource() or not accounts.has_key(str(rdfaccthome.uri)): continue
-
- if not rdfacctname.is_literal(): continue
-
- rdfacctname = rdfacctname.literal_value['string']
- rdfaccthome = str(rdfaccthome.uri)
-
- # shorten feed title a bit
- try:
- servicetitle = rdfaccthome.replace('http://','').split('/')[0]
- except:
- servicetitle = rdfaccthome
-
- feed = accounts[rdfaccthome].replace("{foaf:accountName}", rdfacctname)
- if not config.has_section(feed):
- config.add_section(feed)
- config.set(feed, 'name', "%s (%s)" % (title, servicetitle))
-
- if depth > 0:
-
- # now the fun part, let's go after more friends
- for statement in model.find_statements(Statement(person,foaf.knows,None)):
- friend = statement.object
-
- # let's be safe
- if friend.is_literal(): continue
-
- seeAlso = model.get_target(friend,rdfs.seeAlso)
-
- # nothing to see
- if not seeAlso or not seeAlso.is_resource(): continue
-
- seeAlso = str(seeAlso.uri)
-
- if not config.has_section(seeAlso):
- config.add_section(seeAlso)
- copy_options(config, section, seeAlso,
- { 'content_type' : 'foaf',
- 'depth' : str(depth - 1) })
- try:
- from planet.config import downloadReadingList
- downloadReadingList(seeAlso, config,
- lambda data, subconfig : friend2config(model, friend, seeAlso, subconfig, data),
- False)
- except:
- pass
-
- return
-
-def copy_options(config, parent_section, child_section, overrides = {}):
- global inheritable_options
- for option in [x for x in config.options(parent_section) if x in inheritable_options]:
- if not overrides.has_key(option):
- config.set(child_section, option, config.get(parent_section, option))
-
- for option, value in overrides.items():
- config.set(child_section, option, value)
-
-
-def friend2config(friend_model, friend, seeAlso, subconfig, data):
-
- try:
- from RDF import Model, NS, Parser, Statement
- except:
- return
-
- dc = NS('http://purl.org/dc/elements/1.1/')
- foaf = NS('http://xmlns.com/foaf/0.1/')
- rdf = NS('http://www.w3.org/1999/02/22-rdf-syntax-ns#')
- rdfs = NS('http://www.w3.org/2000/01/rdf-schema#')
-
- # FOAF InverseFunctionalProperties
- ifps = [foaf.mbox, foaf.mbox_sha1sum, foaf.jabberID, foaf.aimChatID,
- foaf.icqChatID, foaf.yahooChatID, foaf.msnChatID, foaf.homepage, foaf.weblog]
-
- model = load_model(data, seeAlso)
-
- for statement in model.find_statements(Statement(None,rdf.type,foaf.Person)):
-
- samefriend = statement.subject
-
- # maybe they have the same uri
- if friend.is_resource() and samefriend.is_resource() and friend == samefriend:
- foaf2config(model, subconfig, samefriend)
- return
-
- for ifp in ifps:
- object = model.get_target(samefriend,ifp)
- if object and object == friend_model.get_target(friend, ifp):
- foaf2config(model, subconfig, samefriend)
- return
-
-if __name__ == "__main__":
- import sys, urllib
- config = ConfigParser()
-
- for uri in sys.argv[1:]:
- config.add_section(uri)
- foaf2config(urllib.urlopen(uri), config, section=uri)
- config.remove_section(uri)
-
- config.write(sys.stdout)
Copied: trunk/lib/venus/planet/foaf.py (from rev 656, branches/sucs-site/lib/venus/planet/foaf.py)
===================================================================
--- trunk/lib/venus/planet/foaf.py (rev 0)
+++ trunk/lib/venus/planet/foaf.py 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,197 @@
+from ConfigParser import ConfigParser
+
+inheritable_options = [ 'online_accounts' ]
+
+def load_accounts(config, section):
+ accounts = {}
+ if(config.has_option(section, 'online_accounts')):
+ values = config.get(section, 'online_accounts')
+ for account_map in values.split('\n'):
+ try:
+ homepage, map = account_map.split('|')
+ accounts[homepage] = map
+ except:
+ pass
+
+ return accounts
+
+def load_model(rdf, base_uri):
+
+ if hasattr(rdf, 'find_statements'):
+ return rdf
+
+ if hasattr(rdf, 'read'):
+ rdf = rdf.read()
+
+ def handler(code, level, facility, message, line, column, byte, file, uri):
+ pass
+
+ from RDF import Model, Parser
+
+ model = Model()
+
+ Parser().parse_string_into_model(model,rdf,base_uri,handler)
+
+ return model
+
+# input = foaf, output = ConfigParser
+def foaf2config(rdf, config, subject=None, section=None):
+
+ if not config or not config.sections():
+ return
+
+ # there should be only be 1 section
+ if not section: section = config.sections().pop()
+
+ try:
+ from RDF import Model, NS, Parser, Statement
+ except:
+ return
+
+ # account mappings, none by default
+ # form: accounts = {url to service homepage (as found in FOAF)}|{URI template}\n*
+ # example: http://del.icio.us/|http://del.icio.us/rss/{foaf:accountName}
+ accounts = load_accounts(config, section)
+
+ depth = 0
+
+ if(config.has_option(section, 'depth')):
+ depth = config.getint(section, 'depth')
+
+ model = load_model(rdf, section)
+
+ dc = NS('http://purl.org/dc/elements/1.1/')
+ foaf = NS('http://xmlns.com/foaf/0.1/')
+ rdfs = NS('http://www.w3.org/2000/01/rdf-schema#')
+ rdf = NS('http://www.w3.org/1999/02/22-rdf-syntax-ns#')
+ rss = NS('http://purl.org/rss/1.0/')
+
+ for statement in model.find_statements(Statement(subject,foaf.weblog,None)):
+
+ # feed owner
+ person = statement.subject
+
+ # title is required (at the moment)
+ title = model.get_target(person,foaf.name)
+ if not title: title = model.get_target(statement.object,dc.title)
+ if not title:
+ continue
+
+ # blog is optional
+ feed = model.get_target(statement.object,rdfs.seeAlso)
+ if feed and rss.channel == model.get_target(feed, rdf.type):
+ feed = str(feed.uri)
+ if not config.has_section(feed):
+ config.add_section(feed)
+ config.set(feed, 'name', str(title))
+
+ # now look for OnlineAccounts for the same person
+ if accounts.keys():
+ for statement in model.find_statements(Statement(person,foaf.holdsAccount,None)):
+ rdfaccthome = model.get_target(statement.object,foaf.accountServiceHomepage)
+ rdfacctname = model.get_target(statement.object,foaf.accountName)
+
+ if not rdfaccthome or not rdfacctname: continue
+
+ if not rdfaccthome.is_resource() or not accounts.has_key(str(rdfaccthome.uri)): continue
+
+ if not rdfacctname.is_literal(): continue
+
+ rdfacctname = rdfacctname.literal_value['string']
+ rdfaccthome = str(rdfaccthome.uri)
+
+ # shorten feed title a bit
+ try:
+ servicetitle = rdfaccthome.replace('http://','').split('/')[0]
+ except:
+ servicetitle = rdfaccthome
+
+ feed = accounts[rdfaccthome].replace("{foaf:accountName}", rdfacctname)
+ if not config.has_section(feed):
+ config.add_section(feed)
+ config.set(feed, 'name', "%s (%s)" % (title, servicetitle))
+
+ if depth > 0:
+
+ # now the fun part, let's go after more friends
+ for statement in model.find_statements(Statement(person,foaf.knows,None)):
+ friend = statement.object
+
+ # let's be safe
+ if friend.is_literal(): continue
+
+ seeAlso = model.get_target(friend,rdfs.seeAlso)
+
+ # nothing to see
+ if not seeAlso or not seeAlso.is_resource(): continue
+
+ seeAlso = str(seeAlso.uri)
+
+ if not config.has_section(seeAlso):
+ config.add_section(seeAlso)
+ copy_options(config, section, seeAlso,
+ { 'content_type' : 'foaf',
+ 'depth' : str(depth - 1) })
+ try:
+ from planet.config import downloadReadingList
+ downloadReadingList(seeAlso, config,
+ lambda data, subconfig : friend2config(model, friend, seeAlso, subconfig, data),
+ False)
+ except:
+ pass
+
+ return
+
+def copy_options(config, parent_section, child_section, overrides = {}):
+ global inheritable_options
+ for option in [x for x in config.options(parent_section) if x in inheritable_options]:
+ if not overrides.has_key(option):
+ config.set(child_section, option, config.get(parent_section, option))
+
+ for option, value in overrides.items():
+ config.set(child_section, option, value)
+
+
+def friend2config(friend_model, friend, seeAlso, subconfig, data):
+
+ try:
+ from RDF import Model, NS, Parser, Statement
+ except:
+ return
+
+ dc = NS('http://purl.org/dc/elements/1.1/')
+ foaf = NS('http://xmlns.com/foaf/0.1/')
+ rdf = NS('http://www.w3.org/1999/02/22-rdf-syntax-ns#')
+ rdfs = NS('http://www.w3.org/2000/01/rdf-schema#')
+
+ # FOAF InverseFunctionalProperties
+ ifps = [foaf.mbox, foaf.mbox_sha1sum, foaf.jabberID, foaf.aimChatID,
+ foaf.icqChatID, foaf.yahooChatID, foaf.msnChatID, foaf.homepage, foaf.weblog]
+
+ model = load_model(data, seeAlso)
+
+ for statement in model.find_statements(Statement(None,rdf.type,foaf.Person)):
+
+ samefriend = statement.subject
+
+ # maybe they have the same uri
+ if friend.is_resource() and samefriend.is_resource() and friend == samefriend:
+ foaf2config(model, subconfig, samefriend)
+ return
+
+ for ifp in ifps:
+ object = model.get_target(samefriend,ifp)
+ if object and object == friend_model.get_target(friend, ifp):
+ foaf2config(model, subconfig, samefriend)
+ return
+
+if __name__ == "__main__":
+ import sys, urllib
+ config = ConfigParser()
+
+ for uri in sys.argv[1:]:
+ config.add_section(uri)
+ foaf2config(urllib.urlopen(uri), config, section=uri)
+ config.remove_section(uri)
+
+ config.write(sys.stdout)
Deleted: trunk/lib/venus/planet/idindex.py
===================================================================
--- branches/sucs-site/lib/venus/planet/idindex.py 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/lib/venus/planet/idindex.py 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,99 +0,0 @@
-from glob import glob
-import os, sys
-
-if __name__ == '__main__':
- rootdir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
- sys.path.insert(0, rootdir)
-
-from planet.spider import filename
-from planet import config
-
-def open():
- try:
- cache = config.cache_directory()
- index=os.path.join(cache,'index')
- if not os.path.exists(index): return None
- import dbhash
- return dbhash.open(filename(index, 'id'),'w')
- except Exception, e:
- if e.__class__.__name__ == 'DBError': e = e.args[-1]
- from planet import logger as log
- log.error(str(e))
-
-def destroy():
- from planet import logger as log
- cache = config.cache_directory()
- index=os.path.join(cache,'index')
- if not os.path.exists(index): return None
- idindex = filename(index, 'id')
- if os.path.exists(idindex): os.unlink(idindex)
- os.removedirs(index)
- log.info(idindex + " deleted")
-
-def create():
- from planet import logger as log
- cache = config.cache_directory()
- index=os.path.join(cache,'index')
- if not os.path.exists(index): os.makedirs(index)
- import dbhash
- index = dbhash.open(filename(index, 'id'),'c')
-
- try:
- import libxml2
- except:
- libxml2 = False
- from xml.dom import minidom
-
- for file in glob(cache+"/*"):
- if os.path.isdir(file):
- continue
- elif libxml2:
- try:
- doc = libxml2.parseFile(file)
- ctxt = doc.xpathNewContext()
- ctxt.xpathRegisterNs('atom','http://www.w3.org/2005/Atom')
- entry = ctxt.xpathEval('/atom:entry/atom:id')
- source = ctxt.xpathEval('/atom:entry/atom:source/atom:id')
- if entry and source:
- index[filename('',entry[0].content)] = source[0].content
- doc.freeDoc()
- except:
- log.error(file)
- else:
- try:
- doc = minidom.parse(file)
- doc.normalize()
- ids = doc.getElementsByTagName('id')
- entry = [e for e in ids if e.parentNode.nodeName == 'entry']
- source = [e for e in ids if e.parentNode.nodeName == 'source']
- if entry and source:
- index[filename('',entry[0].childNodes[0].nodeValue)] = \
- source[0].childNodes[0].nodeValue
- doc.freeDoc()
- except:
- log.error(file)
-
- log.info(str(len(index.keys())) + " entries indexed")
- index.close()
-
- return open()
-
-if __name__ == '__main__':
- if len(sys.argv) < 2:
- print 'Usage: %s [-c|-d]' % sys.argv[0]
- sys.exit(1)
-
- config.load(sys.argv[1])
-
- if len(sys.argv) > 2 and sys.argv[2] == '-c':
- create()
- elif len(sys.argv) > 2 and sys.argv[2] == '-d':
- destroy()
- else:
- from planet import logger as log
- index = open()
- if index:
- log.info(str(len(index.keys())) + " entries indexed")
- index.close()
- else:
- log.info("no entries indexed")
Copied: trunk/lib/venus/planet/idindex.py (from rev 656, branches/sucs-site/lib/venus/planet/idindex.py)
===================================================================
--- trunk/lib/venus/planet/idindex.py (rev 0)
+++ trunk/lib/venus/planet/idindex.py 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,99 @@
+from glob import glob
+import os, sys
+
+if __name__ == '__main__':
+ rootdir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
+ sys.path.insert(0, rootdir)
+
+from planet.spider import filename
+from planet import config
+
+def open():
+ try:
+ cache = config.cache_directory()
+ index=os.path.join(cache,'index')
+ if not os.path.exists(index): return None
+ import dbhash
+ return dbhash.open(filename(index, 'id'),'w')
+ except Exception, e:
+ if e.__class__.__name__ == 'DBError': e = e.args[-1]
+ from planet import logger as log
+ log.error(str(e))
+
+def destroy():
+ from planet import logger as log
+ cache = config.cache_directory()
+ index=os.path.join(cache,'index')
+ if not os.path.exists(index): return None
+ idindex = filename(index, 'id')
+ if os.path.exists(idindex): os.unlink(idindex)
+ os.removedirs(index)
+ log.info(idindex + " deleted")
+
+def create():
+ from planet import logger as log
+ cache = config.cache_directory()
+ index=os.path.join(cache,'index')
+ if not os.path.exists(index): os.makedirs(index)
+ import dbhash
+ index = dbhash.open(filename(index, 'id'),'c')
+
+ try:
+ import libxml2
+ except:
+ libxml2 = False
+ from xml.dom import minidom
+
+ for file in glob(cache+"/*"):
+ if os.path.isdir(file):
+ continue
+ elif libxml2:
+ try:
+ doc = libxml2.parseFile(file)
+ ctxt = doc.xpathNewContext()
+ ctxt.xpathRegisterNs('atom','http://www.w3.org/2005/Atom')
+ entry = ctxt.xpathEval('/atom:entry/atom:id')
+ source = ctxt.xpathEval('/atom:entry/atom:source/atom:id')
+ if entry and source:
+ index[filename('',entry[0].content)] = source[0].content
+ doc.freeDoc()
+ except:
+ log.error(file)
+ else:
+ try:
+ doc = minidom.parse(file)
+ doc.normalize()
+ ids = doc.getElementsByTagName('id')
+ entry = [e for e in ids if e.parentNode.nodeName == 'entry']
+ source = [e for e in ids if e.parentNode.nodeName == 'source']
+ if entry and source:
+ index[filename('',entry[0].childNodes[0].nodeValue)] = \
+ source[0].childNodes[0].nodeValue
+ doc.freeDoc()
+ except:
+ log.error(file)
+
+ log.info(str(len(index.keys())) + " entries indexed")
+ index.close()
+
+ return open()
+
+if __name__ == '__main__':
+ if len(sys.argv) < 2:
+ print 'Usage: %s [-c|-d]' % sys.argv[0]
+ sys.exit(1)
+
+ config.load(sys.argv[1])
+
+ if len(sys.argv) > 2 and sys.argv[2] == '-c':
+ create()
+ elif len(sys.argv) > 2 and sys.argv[2] == '-d':
+ destroy()
+ else:
+ from planet import logger as log
+ index = open()
+ if index:
+ log.info(str(len(index.keys())) + " entries indexed")
+ index.close()
+ else:
+ log.info("no entries indexed")
Deleted: trunk/lib/venus/planet/opml.py
===================================================================
--- branches/sucs-site/lib/venus/planet/opml.py 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/lib/venus/planet/opml.py 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,154 +0,0 @@
-from xml.sax import ContentHandler, make_parser, SAXParseException
-from xml.sax.xmlreader import InputSource
-from sgmllib import SGMLParser
-from cStringIO import StringIO
-from ConfigParser import ConfigParser
-from htmlentitydefs import entitydefs
-import re
-
-# input = opml, output = ConfigParser
-def opml2config(opml, config=None):
-
- if hasattr(opml, 'read'):
- opml = opml.read()
-
- if not config:
- config = ConfigParser()
-
- opmlParser = OpmlParser(config)
-
- try:
- # try SAX
- source = InputSource()
- source.setByteStream(StringIO(opml))
- parser = make_parser()
- parser.setContentHandler(opmlParser)
- parser.parse(source)
- except SAXParseException:
- # try as SGML
- opmlParser.feed(opml)
-
- return config
-
-# Parse OPML via either SAX or SGML
-class OpmlParser(ContentHandler,SGMLParser):
- entities = re.compile('&(#?\w+);')
-
- def __init__(self, config):
- ContentHandler.__init__(self)
- SGMLParser.__init__(self)
- self.config = config
-
- def startElement(self, name, attrs):
-
- # we are only looking for data in 'outline' nodes.
- if name != 'outline': return
-
- # A type of 'rss' is meant to be used generically to indicate that
- # this is an entry in a subscription list, but some leave this
- # attribute off, and others have placed 'atom' in here
- if attrs.has_key('type'):
- if attrs['type'] == 'link' and not attrs.has_key('url'):
- # Auto-correct WordPress link manager OPML files
- attrs = dict(attrs.items())
- attrs['type'] = 'rss'
- if attrs['type'].lower() not in['rss','atom']: return
-
- # The feed itself is supposed to be in an attribute named 'xmlUrl'
- # (note the camel casing), but this has proven to be problematic,
- # with the most common misspelling being in all lower-case
- if not attrs.has_key('xmlUrl') or not attrs['xmlUrl'].strip():
- for attribute in attrs.keys():
- if attribute.lower() == 'xmlurl' and attrs[attribute].strip():
- attrs = dict(attrs.items())
- attrs['xmlUrl'] = attrs[attribute]
- break
- else:
- return
-
- # the text attribute is nominally required in OPML, but this
- # data is often found in a title attribute instead
- if not attrs.has_key('text') or not attrs['text'].strip():
- if not attrs.has_key('title') or not attrs['title'].strip(): return
- attrs = dict(attrs.items())
- attrs['text'] = attrs['title']
-
- # if we get this far, we either have a valid subscription list entry,
- # or one with a correctable error. Add it to the configuration, if
- # it is not already there.
- xmlUrl = attrs['xmlUrl']
- if not self.config.has_section(xmlUrl):
- self.config.add_section(xmlUrl)
- self.config.set(xmlUrl, 'name', self.unescape(attrs['text']))
-
- def unescape(self, text):
- parsed = self.entities.split(text)
-
- for i in range(1,len(parsed),2):
-
- if parsed[i] in entitydefs.keys():
- # named entities
- codepoint=entitydefs[parsed[i]]
- match=self.entities.match(codepoint)
- if match:
- parsed[i]=match.group(1)
- else:
- parsed[i]=unichr(ord(codepoint))
-
- # numeric entities
- if parsed[i].startswith('#'):
- if parsed[i].startswith('#x'):
- parsed[i]=unichr(int(parsed[i][2:],16))
- else:
- parsed[i]=unichr(int(parsed[i][1:]))
-
- return u''.join(parsed).encode('utf-8')
- # SGML => SAX
- def unknown_starttag(self, name, attrs):
- attrs = dict(attrs)
- for attribute in attrs:
- try:
- attrs[attribute] = attrs[attribute].decode('utf-8')
- except:
- work = attrs[attribute].decode('iso-8859-1')
- work = u''.join([c in cp1252 and cp1252[c] or c for c in work])
- attrs[attribute] = work
- self.startElement(name, attrs)
-
-# http://www.intertwingly.net/stories/2004/04/14/i18n.html#CleaningWindows
-cp1252 = {
- unichr(128): unichr(8364), # euro sign
- unichr(130): unichr(8218), # single low-9 quotation mark
- unichr(131): unichr( 402), # latin small letter f with hook
- unichr(132): unichr(8222), # double low-9 quotation mark
- unichr(133): unichr(8230), # horizontal ellipsis
- unichr(134): unichr(8224), # dagger
- unichr(135): unichr(8225), # double dagger
- unichr(136): unichr( 710), # modifier letter circumflex accent
- unichr(137): unichr(8240), # per mille sign
- unichr(138): unichr( 352), # latin capital letter s with caron
- unichr(139): unichr(8249), # single left-pointing angle quotation mark
- unichr(140): unichr( 338), # latin capital ligature oe
- unichr(142): unichr( 381), # latin capital letter z with caron
- unichr(145): unichr(8216), # left single quotation mark
- unichr(146): unichr(8217), # right single quotation mark
- unichr(147): unichr(8220), # left double quotation mark
- unichr(148): unichr(8221), # right double quotation mark
- unichr(149): unichr(8226), # bullet
- unichr(150): unichr(8211), # en dash
- unichr(151): unichr(8212), # em dash
- unichr(152): unichr( 732), # small tilde
- unichr(153): unichr(8482), # trade mark sign
- unichr(154): unichr( 353), # latin small letter s with caron
- unichr(155): unichr(8250), # single right-pointing angle quotation mark
- unichr(156): unichr( 339), # latin small ligature oe
- unichr(158): unichr( 382), # latin small letter z with caron
- unichr(159): unichr( 376)} # latin capital letter y with diaeresis
-
-if __name__ == "__main__":
- # small main program which converts OPML into config.ini format
- import sys, urllib
- config = ConfigParser()
- for opml in sys.argv[1:]:
- opml2config(urllib.urlopen(opml), config)
- config.write(sys.stdout)
Copied: trunk/lib/venus/planet/opml.py (from rev 656, branches/sucs-site/lib/venus/planet/opml.py)
===================================================================
--- trunk/lib/venus/planet/opml.py (rev 0)
+++ trunk/lib/venus/planet/opml.py 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,154 @@
+from xml.sax import ContentHandler, make_parser, SAXParseException
+from xml.sax.xmlreader import InputSource
+from sgmllib import SGMLParser
+from cStringIO import StringIO
+from ConfigParser import ConfigParser
+from htmlentitydefs import entitydefs
+import re
+
+# input = opml, output = ConfigParser
+def opml2config(opml, config=None):
+
+ if hasattr(opml, 'read'):
+ opml = opml.read()
+
+ if not config:
+ config = ConfigParser()
+
+ opmlParser = OpmlParser(config)
+
+ try:
+ # try SAX
+ source = InputSource()
+ source.setByteStream(StringIO(opml))
+ parser = make_parser()
+ parser.setContentHandler(opmlParser)
+ parser.parse(source)
+ except SAXParseException:
+ # try as SGML
+ opmlParser.feed(opml)
+
+ return config
+
+# Parse OPML via either SAX or SGML
+class OpmlParser(ContentHandler,SGMLParser):
+ entities = re.compile('&(#?\w+);')
+
+ def __init__(self, config):
+ ContentHandler.__init__(self)
+ SGMLParser.__init__(self)
+ self.config = config
+
+ def startElement(self, name, attrs):
+
+ # we are only looking for data in 'outline' nodes.
+ if name != 'outline': return
+
+ # A type of 'rss' is meant to be used generically to indicate that
+ # this is an entry in a subscription list, but some leave this
+ # attribute off, and others have placed 'atom' in here
+ if attrs.has_key('type'):
+ if attrs['type'] == 'link' and not attrs.has_key('url'):
+ # Auto-correct WordPress link manager OPML files
+ attrs = dict(attrs.items())
+ attrs['type'] = 'rss'
+ if attrs['type'].lower() not in['rss','atom']: return
+
+ # The feed itself is supposed to be in an attribute named 'xmlUrl'
+ # (note the camel casing), but this has proven to be problematic,
+ # with the most common misspelling being in all lower-case
+ if not attrs.has_key('xmlUrl') or not attrs['xmlUrl'].strip():
+ for attribute in attrs.keys():
+ if attribute.lower() == 'xmlurl' and attrs[attribute].strip():
+ attrs = dict(attrs.items())
+ attrs['xmlUrl'] = attrs[attribute]
+ break
+ else:
+ return
+
+ # the text attribute is nominally required in OPML, but this
+ # data is often found in a title attribute instead
+ if not attrs.has_key('text') or not attrs['text'].strip():
+ if not attrs.has_key('title') or not attrs['title'].strip(): return
+ attrs = dict(attrs.items())
+ attrs['text'] = attrs['title']
+
+ # if we get this far, we either have a valid subscription list entry,
+ # or one with a correctable error. Add it to the configuration, if
+ # it is not already there.
+ xmlUrl = attrs['xmlUrl']
+ if not self.config.has_section(xmlUrl):
+ self.config.add_section(xmlUrl)
+ self.config.set(xmlUrl, 'name', self.unescape(attrs['text']))
+
+ def unescape(self, text):
+ parsed = self.entities.split(text)
+
+ for i in range(1,len(parsed),2):
+
+ if parsed[i] in entitydefs.keys():
+ # named entities
+ codepoint=entitydefs[parsed[i]]
+ match=self.entities.match(codepoint)
+ if match:
+ parsed[i]=match.group(1)
+ else:
+ parsed[i]=unichr(ord(codepoint))
+
+ # numeric entities
+ if parsed[i].startswith('#'):
+ if parsed[i].startswith('#x'):
+ parsed[i]=unichr(int(parsed[i][2:],16))
+ else:
+ parsed[i]=unichr(int(parsed[i][1:]))
+
+ return u''.join(parsed).encode('utf-8')
+ # SGML => SAX
+ def unknown_starttag(self, name, attrs):
+ attrs = dict(attrs)
+ for attribute in attrs:
+ try:
+ attrs[attribute] = attrs[attribute].decode('utf-8')
+ except:
+ work = attrs[attribute].decode('iso-8859-1')
+ work = u''.join([c in cp1252 and cp1252[c] or c for c in work])
+ attrs[attribute] = work
+ self.startElement(name, attrs)
+
+# http://www.intertwingly.net/stories/2004/04/14/i18n.html#CleaningWindows
+cp1252 = {
+ unichr(128): unichr(8364), # euro sign
+ unichr(130): unichr(8218), # single low-9 quotation mark
+ unichr(131): unichr( 402), # latin small letter f with hook
+ unichr(132): unichr(8222), # double low-9 quotation mark
+ unichr(133): unichr(8230), # horizontal ellipsis
+ unichr(134): unichr(8224), # dagger
+ unichr(135): unichr(8225), # double dagger
+ unichr(136): unichr( 710), # modifier letter circumflex accent
+ unichr(137): unichr(8240), # per mille sign
+ unichr(138): unichr( 352), # latin capital letter s with caron
+ unichr(139): unichr(8249), # single left-pointing angle quotation mark
+ unichr(140): unichr( 338), # latin capital ligature oe
+ unichr(142): unichr( 381), # latin capital letter z with caron
+ unichr(145): unichr(8216), # left single quotation mark
+ unichr(146): unichr(8217), # right single quotation mark
+ unichr(147): unichr(8220), # left double quotation mark
+ unichr(148): unichr(8221), # right double quotation mark
+ unichr(149): unichr(8226), # bullet
+ unichr(150): unichr(8211), # en dash
+ unichr(151): unichr(8212), # em dash
+ unichr(152): unichr( 732), # small tilde
+ unichr(153): unichr(8482), # trade mark sign
+ unichr(154): unichr( 353), # latin small letter s with caron
+ unichr(155): unichr(8250), # single right-pointing angle quotation mark
+ unichr(156): unichr( 339), # latin small ligature oe
+ unichr(158): unichr( 382), # latin small letter z with caron
+ unichr(159): unichr( 376)} # latin capital letter y with diaeresis
+
+if __name__ == "__main__":
+ # small main program which converts OPML into config.ini format
+ import sys, urllib
+ config = ConfigParser()
+ for opml in sys.argv[1:]:
+ opml2config(urllib.urlopen(opml), config)
+ config.write(sys.stdout)
Deleted: trunk/lib/venus/planet/reconstitute.py
===================================================================
--- branches/sucs-site/lib/venus/planet/reconstitute.py 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/lib/venus/planet/reconstitute.py 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,334 +0,0 @@
-"""
-Reconstitute an entry document from the output of the Universal Feed Parser.
-
-The main entry point is called 'reconstitute'. Input parameters are:
-
- results: this is the entire hash table return by the UFP
- entry: this is the entry in the hash that you want reconstituted
-
-The value returned is an XML DOM. Every effort is made to convert
-everything to unicode, and text fields into either plain text or
-well formed XHTML.
-
-Todo:
- * extension elements
-"""
-import re, time, md5, sgmllib
-from xml.sax.saxutils import escape
-from xml.dom import minidom, Node
-from html5lib import liberalxmlparser
-from html5lib.treebuilders import dom
-import planet, config
-
-illegal_xml_chars = re.compile("[\x01-\x08\x0B\x0C\x0E-\x1F]")
-
-def createTextElement(parent, name, value):
- """ utility function to create a child element with the specified text"""
- if not value: return
- if isinstance(value,str):
- try:
- value=value.decode('utf-8')
- except:
- value=value.decode('iso-8859-1')
- xdoc = parent.ownerDocument
- xelement = xdoc.createElement(name)
- xelement.appendChild(xdoc.createTextNode(value))
- parent.appendChild(xelement)
- return xelement
-
-def invalidate(c):
- """ replace invalid characters """
- return '<acronym title="U+%s">\xef\xbf\xbd</acronym>' % \
- ('000' + hex(ord(c.group(0)))[2:])[-4:]
-
-def ncr2c(value):
- """ convert numeric character references to characters """
- value=value.group(1)
- if value.startswith('x'):
- value=unichr(int(value[1:],16))
- else:
- value=unichr(int(value))
- return value
-
-nonalpha=re.compile('\W+',re.UNICODE)
-def cssid(name):
- """ generate a css id from a name """
- try:
- name = nonalpha.sub('-',name.decode('utf-8')).lower().encode('utf-8')
- except:
- name = nonalpha.sub('-',name).lower()
- return name.strip('-')
-
-def id(xentry, entry):
- """ copy or compute an id for the entry """
-
- if entry.has_key("id") and entry.id:
- entry_id = entry.id
- elif entry.has_key("link") and entry.link:
- entry_id = entry.link
- elif entry.has_key("title") and entry.title:
- entry_id = (entry.title_detail.base + "/" +
- md5.new(entry.title).hexdigest())
- elif entry.has_key("summary") and entry.summary:
- entry_id = (entry.summary_detail.base + "/" +
- md5.new(entry.summary).hexdigest())
- elif entry.has_key("content") and entry.content:
-
- entry_id = (entry.content[0].base + "/" +
- md5.new(entry.content[0].value).hexdigest())
- else:
- return
-
- if xentry: createTextElement(xentry, 'id', entry_id)
- return entry_id
-
-def links(xentry, entry):
- """ copy links to the entry """
- if not entry.has_key('links'):
- entry['links'] = []
- if entry.has_key('link'):
- entry['links'].append({'rel':'alternate', 'href':entry.link})
- xdoc = xentry.ownerDocument
- for link in entry['links']:
- if not 'href' in link.keys(): continue
- xlink = xdoc.createElement('link')
- xlink.setAttribute('href', link.get('href'))
- if link.has_key('type'):
- xlink.setAttribute('type', link.get('type'))
- if link.has_key('rel'):
- xlink.setAttribute('rel', link.get('rel',None))
- if link.has_key('length'):
- xlink.setAttribute('length', link.get('length'))
- xentry.appendChild(xlink)
-
-def date(xentry, name, parsed):
- """ insert a date-formated element into the entry """
- if not parsed: return
- formatted = time.strftime("%Y-%m-%dT%H:%M:%SZ", parsed)
- xdate = createTextElement(xentry, name, formatted)
- formatted = time.strftime(config.date_format(), parsed)
- xdate.setAttribute('planet:format', formatted.decode('utf-8'))
-
-def category(xentry, tag):
- xtag = xentry.ownerDocument.createElement('category')
- if not tag.has_key('term') or not tag.term: return
- xtag.setAttribute('term', tag.get('term'))
- if tag.has_key('scheme') and tag.scheme:
- xtag.setAttribute('scheme', tag.get('scheme'))
- if tag.has_key('label') and tag.label:
- xtag.setAttribute('label', tag.get('label'))
- xentry.appendChild(xtag)
-
-def author(xentry, name, detail):
- """ insert an author-like element into the entry """
- if not detail: return
- xdoc = xentry.ownerDocument
- xauthor = xdoc.createElement(name)
-
- if detail.get('name', None):
- createTextElement(xauthor, 'name', detail.get('name'))
- else:
- xauthor.appendChild(xdoc.createElement('name'))
-
- createTextElement(xauthor, 'email', detail.get('email', None))
- createTextElement(xauthor, 'uri', detail.get('href', None))
-
- xentry.appendChild(xauthor)
-
-def content(xentry, name, detail, bozo):
- """ insert a content-like element into the entry """
- if not detail or not detail.value: return
-
- data = None
- xdiv = '<div xmlns="http://www.w3.org/1999/xhtml">%s</div>'
- xdoc = xentry.ownerDocument
- xcontent = xdoc.createElement(name)
-
- if isinstance(detail.value,unicode):
- detail.value=detail.value.encode('utf-8')
-
- if not detail.has_key('type') or detail.type.lower().find('html')<0:
- detail['value'] = escape(detail.value)
- detail['type'] = 'text/html'
-
- if detail.type.find('xhtml')>=0 and not bozo:
- try:
- data = minidom.parseString(xdiv % detail.value).documentElement
- xcontent.setAttribute('type', 'xhtml')
- except:
- bozo=1
-
- if detail.type.find('xhtml')<0 or bozo:
- parser = liberalxmlparser.XHTMLParser(tree=dom.TreeBuilder)
- html = parser.parse(xdiv % detail.value, encoding="utf-8")
- for body in html.documentElement.childNodes:
- if body.nodeType != Node.ELEMENT_NODE: continue
- if body.nodeName != 'body': continue
- for div in body.childNodes:
- if div.nodeType != Node.ELEMENT_NODE: continue
- if div.nodeName != 'div': continue
- try:
- div.normalize()
- if len(div.childNodes) == 1 and \
- div.firstChild.nodeType == Node.TEXT_NODE:
- data = div.firstChild
- else:
- data = div
- xcontent.setAttribute('type', 'xhtml')
- break
- except:
- # in extremely nested cases, the Python runtime decides
- # that normalize() must be in an infinite loop; mark
- # the content as escaped html and proceed on...
- xcontent.setAttribute('type', 'html')
- data = xdoc.createTextNode(detail.value.decode('utf-8'))
-
- if data: xcontent.appendChild(data)
-
- if detail.get("language"):
- xcontent.setAttribute('xml:lang', detail.language)
-
- xentry.appendChild(xcontent)
-
-def location(xentry, long, lat):
- """ insert geo location into the entry """
- if not lat or not long: return
-
- xlat = createTextElement(xentry, '%s:%s' % ('geo','lat'), '%f' % lat)
- xlat.setAttribute('xmlns:%s' % 'geo', 'http://www.w3.org/2003/01/geo/wgs84_pos#')
- xlong = createTextElement(xentry, '%s:%s' % ('geo','long'), '%f' % long)
- xlong.setAttribute('xmlns:%s' % 'geo', 'http://www.w3.org/2003/01/geo/wgs84_pos#')
-
- xentry.appendChild(xlat)
- xentry.appendChild(xlong)
-
-def source(xsource, source, bozo, format):
- """ copy source information to the entry """
- xdoc = xsource.ownerDocument
-
- createTextElement(xsource, 'id', source.get('id', source.get('link',None)))
- createTextElement(xsource, 'icon', source.get('icon', None))
- createTextElement(xsource, 'logo', source.get('logo', None))
-
- if not source.has_key('logo') and source.has_key('image'):
- createTextElement(xsource, 'logo', source.image.get('href',None))
-
- for tag in source.get('tags',[]):
- category(xsource, tag)
-
- author(xsource, 'author', source.get('author_detail',{}))
- for contributor in source.get('contributors',[]):
- author(xsource, 'contributor', contributor)
-
- links(xsource, source)
-
- content(xsource, 'rights', source.get('rights_detail',None), bozo)
- content(xsource, 'subtitle', source.get('subtitle_detail',None), bozo)
- content(xsource, 'title', source.get('title_detail',None), bozo)
-
- date(xsource, 'updated', source.get('updated_parsed',time.gmtime()))
-
- if format: source['planet_format'] = format
- if not bozo == None: source['planet_bozo'] = bozo and 'true' or 'false'
-
- # propagate planet inserted information
- if source.has_key('planet_name') and not source.has_key('planet_css-id'):
- source['planet_css-id'] = cssid(source['planet_name'])
- for key, value in source.items():
- if key.startswith('planet_'):
- createTextElement(xsource, key.replace('_',':',1), value)
-
-def reconstitute(feed, entry):
- """ create an entry document from a parsed feed """
- xdoc=minidom.parseString('<entry xmlns="http://www.w3.org/2005/Atom"/>\n')
- xentry=xdoc.documentElement
- xentry.setAttribute('xmlns:planet',planet.xmlns)
-
- if entry.has_key('language'):
- xentry.setAttribute('xml:lang', entry.language)
- elif feed.feed.has_key('language'):
- xentry.setAttribute('xml:lang', feed.feed.language)
-
- id(xentry, entry)
- links(xentry, entry)
-
- bozo = feed.bozo
- if not entry.has_key('title') or not entry.title:
- xentry.appendChild(xdoc.createElement('title'))
-
- content(xentry, 'title', entry.get('title_detail',None), bozo)
- content(xentry, 'summary', entry.get('summary_detail',None), bozo)
- content(xentry, 'content', entry.get('content',[None])[0], bozo)
- content(xentry, 'rights', entry.get('rights_detail',None), bozo)
-
- date(xentry, 'updated', entry_updated(feed.feed, entry, time.gmtime()))
- date(xentry, 'published', entry.get('published_parsed',None))
-
- for tag in entry.get('tags',[]):
- category(xentry, tag)
-
- # known, simple text extensions
- for ns,name in [('feedburner','origLink')]:
- if entry.has_key('%s_%s' % (ns,name.lower())) and \
- feed.namespaces.has_key(ns):
- xoriglink = createTextElement(xentry, '%s:%s' % (ns,name),
- entry['%s_%s' % (ns,name.lower())])
- xoriglink.setAttribute('xmlns:%s' % ns, feed.namespaces[ns])
-
- # geo location
- if entry.has_key('where') and \
- entry.get('where',[]).has_key('type') and \
- entry.get('where',[]).has_key('coordinates'):
- where = entry.get('where',[])
- type = where.get('type',None)
- coordinates = where.get('coordinates',None)
- if type == 'Point':
- location(xentry, coordinates[0], coordinates[1])
- elif type == 'Box' or type == 'LineString' or type == 'Polygon':
- location(xentry, coordinates[0][0], coordinates[0][1])
- if entry.has_key('geo_lat') and \
- entry.has_key('geo_long'):
- location(xentry, (float)(entry.get('geo_long',None)), (float)(entry.get('geo_lat',None)))
-
- # author / contributor
- author_detail = entry.get('author_detail',{})
- if author_detail and not author_detail.has_key('name') and \
- feed.feed.has_key('planet_name'):
- author_detail['name'] = feed.feed['planet_name']
- author(xentry, 'author', author_detail)
- for contributor in entry.get('contributors',[]):
- author(xentry, 'contributor', contributor)
-
- # merge in planet:* from feed (or simply use the feed if no source)
- src = entry.get('source')
- if src:
- for name,value in feed.feed.items():
- if name.startswith('planet_'): src[name]=value
- if feed.feed.has_key('id'):
- src['planet_id'] = feed.feed.id
- else:
- src = feed.feed
-
- # source:author
- src_author = src.get('author_detail',{})
- if (not author_detail or not author_detail.has_key('name')) and \
- not src_author.has_key('name') and feed.feed.has_key('planet_name'):
- if src_author: src_author = src_author.__class__(src_author.copy())
- src['author_detail'] = src_author
- src_author['name'] = feed.feed['planet_name']
-
- # source
- xsource = xdoc.createElement('source')
- source(xsource, src, bozo, feed.version)
- xentry.appendChild(xsource)
-
- return xdoc
-
-def entry_updated(feed, entry, default = None):
- chks = ((entry, 'updated_parsed'),
- (entry, 'published_parsed'),
- (feed, 'updated_parsed'),)
- for node, field in chks:
- if node.has_key(field) and node[field]:
- return node[field]
- return default
Copied: trunk/lib/venus/planet/reconstitute.py (from rev 656, branches/sucs-site/lib/venus/planet/reconstitute.py)
===================================================================
--- trunk/lib/venus/planet/reconstitute.py (rev 0)
+++ trunk/lib/venus/planet/reconstitute.py 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,334 @@
+"""
+Reconstitute an entry document from the output of the Universal Feed Parser.
+
+The main entry point is called 'reconstitute'. Input parameters are:
+
+ results: this is the entire hash table return by the UFP
+ entry: this is the entry in the hash that you want reconstituted
+
+The value returned is an XML DOM. Every effort is made to convert
+everything to unicode, and text fields into either plain text or
+well formed XHTML.
+
+Todo:
+ * extension elements
+"""
+import re, time, md5, sgmllib
+from xml.sax.saxutils import escape
+from xml.dom import minidom, Node
+from html5lib import liberalxmlparser
+from html5lib.treebuilders import dom
+import planet, config
+
+illegal_xml_chars = re.compile("[\x01-\x08\x0B\x0C\x0E-\x1F]")
+
+def createTextElement(parent, name, value):
+ """ utility function to create a child element with the specified text"""
+ if not value: return
+ if isinstance(value,str):
+ try:
+ value=value.decode('utf-8')
+ except:
+ value=value.decode('iso-8859-1')
+ xdoc = parent.ownerDocument
+ xelement = xdoc.createElement(name)
+ xelement.appendChild(xdoc.createTextNode(value))
+ parent.appendChild(xelement)
+ return xelement
+
+def invalidate(c):
+ """ replace invalid characters """
+ return '<acronym title="U+%s">\xef\xbf\xbd</acronym>' % \
+ ('000' + hex(ord(c.group(0)))[2:])[-4:]
+
+def ncr2c(value):
+ """ convert numeric character references to characters """
+ value=value.group(1)
+ if value.startswith('x'):
+ value=unichr(int(value[1:],16))
+ else:
+ value=unichr(int(value))
+ return value
+
+nonalpha=re.compile('\W+',re.UNICODE)
+def cssid(name):
+ """ generate a css id from a name """
+ try:
+ name = nonalpha.sub('-',name.decode('utf-8')).lower().encode('utf-8')
+ except:
+ name = nonalpha.sub('-',name).lower()
+ return name.strip('-')
+
+def id(xentry, entry):
+ """ copy or compute an id for the entry """
+
+ if entry.has_key("id") and entry.id:
+ entry_id = entry.id
+ elif entry.has_key("link") and entry.link:
+ entry_id = entry.link
+ elif entry.has_key("title") and entry.title:
+ entry_id = (entry.title_detail.base + "/" +
+ md5.new(entry.title).hexdigest())
+ elif entry.has_key("summary") and entry.summary:
+ entry_id = (entry.summary_detail.base + "/" +
+ md5.new(entry.summary).hexdigest())
+ elif entry.has_key("content") and entry.content:
+
+ entry_id = (entry.content[0].base + "/" +
+ md5.new(entry.content[0].value).hexdigest())
+ else:
+ return
+
+ if xentry: createTextElement(xentry, 'id', entry_id)
+ return entry_id
+
+def links(xentry, entry):
+ """ copy links to the entry """
+ if not entry.has_key('links'):
+ entry['links'] = []
+ if entry.has_key('link'):
+ entry['links'].append({'rel':'alternate', 'href':entry.link})
+ xdoc = xentry.ownerDocument
+ for link in entry['links']:
+ if not 'href' in link.keys(): continue
+ xlink = xdoc.createElement('link')
+ xlink.setAttribute('href', link.get('href'))
+ if link.has_key('type'):
+ xlink.setAttribute('type', link.get('type'))
+ if link.has_key('rel'):
+ xlink.setAttribute('rel', link.get('rel',None))
+ if link.has_key('length'):
+ xlink.setAttribute('length', link.get('length'))
+ xentry.appendChild(xlink)
+
+def date(xentry, name, parsed):
+ """ insert a date-formated element into the entry """
+ if not parsed: return
+ formatted = time.strftime("%Y-%m-%dT%H:%M:%SZ", parsed)
+ xdate = createTextElement(xentry, name, formatted)
+ formatted = time.strftime(config.date_format(), parsed)
+ xdate.setAttribute('planet:format', formatted.decode('utf-8'))
+
+def category(xentry, tag):
+ xtag = xentry.ownerDocument.createElement('category')
+ if not tag.has_key('term') or not tag.term: return
+ xtag.setAttribute('term', tag.get('term'))
+ if tag.has_key('scheme') and tag.scheme:
+ xtag.setAttribute('scheme', tag.get('scheme'))
+ if tag.has_key('label') and tag.label:
+ xtag.setAttribute('label', tag.get('label'))
+ xentry.appendChild(xtag)
+
+def author(xentry, name, detail):
+ """ insert an author-like element into the entry """
+ if not detail: return
+ xdoc = xentry.ownerDocument
+ xauthor = xdoc.createElement(name)
+
+ if detail.get('name', None):
+ createTextElement(xauthor, 'name', detail.get('name'))
+ else:
+ xauthor.appendChild(xdoc.createElement('name'))
+
+ createTextElement(xauthor, 'email', detail.get('email', None))
+ createTextElement(xauthor, 'uri', detail.get('href', None))
+
+ xentry.appendChild(xauthor)
+
+def content(xentry, name, detail, bozo):
+ """ insert a content-like element into the entry """
+ if not detail or not detail.value: return
+
+ data = None
+ xdiv = '<div xmlns="http://www.w3.org/1999/xhtml">%s</div>'
+ xdoc = xentry.ownerDocument
+ xcontent = xdoc.createElement(name)
+
+ if isinstance(detail.value,unicode):
+ detail.value=detail.value.encode('utf-8')
+
+ if not detail.has_key('type') or detail.type.lower().find('html')<0:
+ detail['value'] = escape(detail.value)
+ detail['type'] = 'text/html'
+
+ if detail.type.find('xhtml')>=0 and not bozo:
+ try:
+ data = minidom.parseString(xdiv % detail.value).documentElement
+ xcontent.setAttribute('type', 'xhtml')
+ except:
+ bozo=1
+
+ if detail.type.find('xhtml')<0 or bozo:
+ parser = liberalxmlparser.XHTMLParser(tree=dom.TreeBuilder)
+ html = parser.parse(xdiv % detail.value, encoding="utf-8")
+ for body in html.documentElement.childNodes:
+ if body.nodeType != Node.ELEMENT_NODE: continue
+ if body.nodeName != 'body': continue
+ for div in body.childNodes:
+ if div.nodeType != Node.ELEMENT_NODE: continue
+ if div.nodeName != 'div': continue
+ try:
+ div.normalize()
+ if len(div.childNodes) == 1 and \
+ div.firstChild.nodeType == Node.TEXT_NODE:
+ data = div.firstChild
+ else:
+ data = div
+ xcontent.setAttribute('type', 'xhtml')
+ break
+ except:
+ # in extremely nested cases, the Python runtime decides
+ # that normalize() must be in an infinite loop; mark
+ # the content as escaped html and proceed on...
+ xcontent.setAttribute('type', 'html')
+ data = xdoc.createTextNode(detail.value.decode('utf-8'))
+
+ if data: xcontent.appendChild(data)
+
+ if detail.get("language"):
+ xcontent.setAttribute('xml:lang', detail.language)
+
+ xentry.appendChild(xcontent)
+
+def location(xentry, long, lat):
+ """ insert geo location into the entry """
+ if not lat or not long: return
+
+ xlat = createTextElement(xentry, '%s:%s' % ('geo','lat'), '%f' % lat)
+ xlat.setAttribute('xmlns:%s' % 'geo', 'http://www.w3.org/2003/01/geo/wgs84_pos#')
+ xlong = createTextElement(xentry, '%s:%s' % ('geo','long'), '%f' % long)
+ xlong.setAttribute('xmlns:%s' % 'geo', 'http://www.w3.org/2003/01/geo/wgs84_pos#')
+
+ xentry.appendChild(xlat)
+ xentry.appendChild(xlong)
+
+def source(xsource, source, bozo, format):
+ """ copy source information to the entry """
+ xdoc = xsource.ownerDocument
+
+ createTextElement(xsource, 'id', source.get('id', source.get('link',None)))
+ createTextElement(xsource, 'icon', source.get('icon', None))
+ createTextElement(xsource, 'logo', source.get('logo', None))
+
+ if not source.has_key('logo') and source.has_key('image'):
+ createTextElement(xsource, 'logo', source.image.get('href',None))
+
+ for tag in source.get('tags',[]):
+ category(xsource, tag)
+
+ author(xsource, 'author', source.get('author_detail',{}))
+ for contributor in source.get('contributors',[]):
+ author(xsource, 'contributor', contributor)
+
+ links(xsource, source)
+
+ content(xsource, 'rights', source.get('rights_detail',None), bozo)
+ content(xsource, 'subtitle', source.get('subtitle_detail',None), bozo)
+ content(xsource, 'title', source.get('title_detail',None), bozo)
+
+ date(xsource, 'updated', source.get('updated_parsed',time.gmtime()))
+
+ if format: source['planet_format'] = format
+ if not bozo == None: source['planet_bozo'] = bozo and 'true' or 'false'
+
+ # propagate planet inserted information
+ if source.has_key('planet_name') and not source.has_key('planet_css-id'):
+ source['planet_css-id'] = cssid(source['planet_name'])
+ for key, value in source.items():
+ if key.startswith('planet_'):
+ createTextElement(xsource, key.replace('_',':',1), value)
+
+def reconstitute(feed, entry):
+ """ create an entry document from a parsed feed """
+ xdoc=minidom.parseString('<entry xmlns="http://www.w3.org/2005/Atom"/>\n')
+ xentry=xdoc.documentElement
+ xentry.setAttribute('xmlns:planet',planet.xmlns)
+
+ if entry.has_key('language'):
+ xentry.setAttribute('xml:lang', entry.language)
+ elif feed.feed.has_key('language'):
+ xentry.setAttribute('xml:lang', feed.feed.language)
+
+ id(xentry, entry)
+ links(xentry, entry)
+
+ bozo = feed.bozo
+ if not entry.has_key('title') or not entry.title:
+ xentry.appendChild(xdoc.createElement('title'))
+
+ content(xentry, 'title', entry.get('title_detail',None), bozo)
+ content(xentry, 'summary', entry.get('summary_detail',None), bozo)
+ content(xentry, 'content', entry.get('content',[None])[0], bozo)
+ content(xentry, 'rights', entry.get('rights_detail',None), bozo)
+
+ date(xentry, 'updated', entry_updated(feed.feed, entry, time.gmtime()))
+ date(xentry, 'published', entry.get('published_parsed',None))
+
+ for tag in entry.get('tags',[]):
+ category(xentry, tag)
+
+ # known, simple text extensions
+ for ns,name in [('feedburner','origLink')]:
+ if entry.has_key('%s_%s' % (ns,name.lower())) and \
+ feed.namespaces.has_key(ns):
+ xoriglink = createTextElement(xentry, '%s:%s' % (ns,name),
+ entry['%s_%s' % (ns,name.lower())])
+ xoriglink.setAttribute('xmlns:%s' % ns, feed.namespaces[ns])
+
+ # geo location
+ if entry.has_key('where') and \
+ entry.get('where',[]).has_key('type') and \
+ entry.get('where',[]).has_key('coordinates'):
+ where = entry.get('where',[])
+ type = where.get('type',None)
+ coordinates = where.get('coordinates',None)
+ if type == 'Point':
+ location(xentry, coordinates[0], coordinates[1])
+ elif type == 'Box' or type == 'LineString' or type == 'Polygon':
+ location(xentry, coordinates[0][0], coordinates[0][1])
+ if entry.has_key('geo_lat') and \
+ entry.has_key('geo_long'):
+ location(xentry, (float)(entry.get('geo_long',None)), (float)(entry.get('geo_lat',None)))
+
+ # author / contributor
+ author_detail = entry.get('author_detail',{})
+ if author_detail and not author_detail.has_key('name') and \
+ feed.feed.has_key('planet_name'):
+ author_detail['name'] = feed.feed['planet_name']
+ author(xentry, 'author', author_detail)
+ for contributor in entry.get('contributors',[]):
+ author(xentry, 'contributor', contributor)
+
+ # merge in planet:* from feed (or simply use the feed if no source)
+ src = entry.get('source')
+ if src:
+ for name,value in feed.feed.items():
+ if name.startswith('planet_'): src[name]=value
+ if feed.feed.has_key('id'):
+ src['planet_id'] = feed.feed.id
+ else:
+ src = feed.feed
+
+ # source:author
+ src_author = src.get('author_detail',{})
+ if (not author_detail or not author_detail.has_key('name')) and \
+ not src_author.has_key('name') and feed.feed.has_key('planet_name'):
+ if src_author: src_author = src_author.__class__(src_author.copy())
+ src['author_detail'] = src_author
+ src_author['name'] = feed.feed['planet_name']
+
+ # source
+ xsource = xdoc.createElement('source')
+ source(xsource, src, bozo, feed.version)
+ xentry.appendChild(xsource)
+
+ return xdoc
+
+def entry_updated(feed, entry, default = None):
+ chks = ((entry, 'updated_parsed'),
+ (entry, 'published_parsed'),
+ (feed, 'updated_parsed'),)
+ for node, field in chks:
+ if node.has_key(field) and node[field]:
+ return node[field]
+ return default
Deleted: trunk/lib/venus/planet/scrub.py
===================================================================
--- branches/sucs-site/lib/venus/planet/scrub.py 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/lib/venus/planet/scrub.py 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,132 +0,0 @@
-"""
-Process a set of configuration defined sanitations on a given feed.
-"""
-
-# Standard library modules
-import time
-# Planet modules
-import planet, config, shell
-from planet import feedparser
-
-type_map = {'text': 'text/plain', 'html': 'text/html',
- 'xhtml': 'application/xhtml+xml'}
-
-def scrub(feed_uri, data):
-
- # some data is not trustworthy
- for tag in config.ignore_in_feed(feed_uri).split():
- if tag.find('lang')>=0: tag='language'
- if data.feed.has_key(tag): del data.feed[tag]
- for entry in data.entries:
- if entry.has_key(tag): del entry[tag]
- if entry.has_key(tag + "_detail"): del entry[tag + "_detail"]
- if entry.has_key(tag + "_parsed"): del entry[tag + "_parsed"]
- for key in entry.keys():
- if not key.endswith('_detail'): continue
- for detail in entry[key].copy():
- if detail == tag: del entry[key][detail]
-
- # adjust title types
- if config.title_type(feed_uri):
- title_type = config.title_type(feed_uri)
- title_type = type_map.get(title_type, title_type)
- for entry in data.entries:
- if entry.has_key('title_detail'):
- entry.title_detail['type'] = title_type
-
- # adjust summary types
- if config.summary_type(feed_uri):
- summary_type = config.summary_type(feed_uri)
- summary_type = type_map.get(summary_type, summary_type)
- for entry in data.entries:
- if entry.has_key('summary_detail'):
- entry.summary_detail['type'] = summary_type
-
- # adjust content types
- if config.content_type(feed_uri):
- content_type = config.content_type(feed_uri)
- content_type = type_map.get(content_type, content_type)
- for entry in data.entries:
- if entry.has_key('content'):
- entry.content[0]['type'] = content_type
-
- # some people put html in author names
- if config.name_type(feed_uri).find('html')>=0:
- from shell.tmpl import stripHtml
- if data.feed.has_key('author_detail') and \
- data.feed.author_detail.has_key('name'):
- data.feed.author_detail['name'] = \
- str(stripHtml(data.feed.author_detail.name))
- for entry in data.entries:
- if entry.has_key('author_detail') and \
- entry.author_detail.has_key('name'):
- entry.author_detail['name'] = \
- str(stripHtml(entry.author_detail.name))
- if entry.has_key('source'):
- source = entry.source
- if source.has_key('author_detail') and \
- source.author_detail.has_key('name'):
- source.author_detail['name'] = \
- str(stripHtml(source.author_detail.name))
-
- # handle dates in the future
- future_dates = config.future_dates(feed_uri).lower()
- if future_dates == 'ignore_date':
- now = time.gmtime()
- if data.feed.has_key('updated_parsed') and data.feed['updated_parsed']:
- if data.feed['updated_parsed'] > now: del data.feed['updated_parsed']
- for entry in data.entries:
- if entry.has_key('published_parsed') and entry['published_parsed']:
- if entry['published_parsed'] > now:
- del entry['published_parsed']
- del entry['published']
- if entry.has_key('updated_parsed') and entry['updated_parsed']:
- if entry['updated_parsed'] > now:
- del entry['updated_parsed']
- del entry['updated']
- elif future_dates == 'ignore_entry':
- now = time.time()
- if data.feed.has_key('updated_parsed') and data.feed['updated_parsed']:
- if data.feed['updated_parsed'] > now: del data.feed['updated_parsed']
- data.entries = [entry for entry in data.entries if
- (not entry.has_key('published_parsed') or not entry['published_parsed']
- or entry['published_parsed'] <= now) and
- (not entry.has_key('updated_parsed') or not entry['updated_parsed']
- or entry['updated_parsed'] <= now)]
-
- scrub_xmlbase = config.xml_base(feed_uri)
-
- # resolve relative URIs and sanitize
- for entry in data.entries + [data.feed]:
- for key in entry.keys():
- if key == 'content'and not entry.has_key('content_detail'):
- node = entry.content[0]
- elif key.endswith('_detail'):
- node = entry[key]
- else:
- continue
-
- if not node.has_key('type'): continue
- if not 'html' in node['type']: continue
- if not node.has_key('value'): continue
-
- if node.has_key('base'):
- if scrub_xmlbase:
- if scrub_xmlbase == 'feed_alternate':
- if entry.has_key('source') and \
- entry.source.has_key('link'):
- node['base'] = entry.source.link
- elif data.feed.has_key('link'):
- node['base'] = data.feed.link
- elif scrub_xmlbase == 'entry_alternate':
- if entry.has_key('link'):
- node['base'] = entry.link
- else:
- node['base'] = feedparser._urljoin(
- node['base'], scrub_xmlbase)
-
- node['value'] = feedparser._resolveRelativeURIs(
- node.value, node.base, 'utf-8', node.type)
-
- node['value'] = feedparser._sanitizeHTML(
- node.value, 'utf-8', node.type)
Copied: trunk/lib/venus/planet/scrub.py (from rev 656, branches/sucs-site/lib/venus/planet/scrub.py)
===================================================================
--- trunk/lib/venus/planet/scrub.py (rev 0)
+++ trunk/lib/venus/planet/scrub.py 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,132 @@
+"""
+Process a set of configuration defined sanitations on a given feed.
+"""
+
+# Standard library modules
+import time
+# Planet modules
+import planet, config, shell
+from planet import feedparser
+
+type_map = {'text': 'text/plain', 'html': 'text/html',
+ 'xhtml': 'application/xhtml+xml'}
+
+def scrub(feed_uri, data):
+
+ # some data is not trustworthy
+ for tag in config.ignore_in_feed(feed_uri).split():
+ if tag.find('lang')>=0: tag='language'
+ if data.feed.has_key(tag): del data.feed[tag]
+ for entry in data.entries:
+ if entry.has_key(tag): del entry[tag]
+ if entry.has_key(tag + "_detail"): del entry[tag + "_detail"]
+ if entry.has_key(tag + "_parsed"): del entry[tag + "_parsed"]
+ for key in entry.keys():
+ if not key.endswith('_detail'): continue
+ for detail in entry[key].copy():
+ if detail == tag: del entry[key][detail]
+
+ # adjust title types
+ if config.title_type(feed_uri):
+ title_type = config.title_type(feed_uri)
+ title_type = type_map.get(title_type, title_type)
+ for entry in data.entries:
+ if entry.has_key('title_detail'):
+ entry.title_detail['type'] = title_type
+
+ # adjust summary types
+ if config.summary_type(feed_uri):
+ summary_type = config.summary_type(feed_uri)
+ summary_type = type_map.get(summary_type, summary_type)
+ for entry in data.entries:
+ if entry.has_key('summary_detail'):
+ entry.summary_detail['type'] = summary_type
+
+ # adjust content types
+ if config.content_type(feed_uri):
+ content_type = config.content_type(feed_uri)
+ content_type = type_map.get(content_type, content_type)
+ for entry in data.entries:
+ if entry.has_key('content'):
+ entry.content[0]['type'] = content_type
+
+ # some people put html in author names
+ if config.name_type(feed_uri).find('html')>=0:
+ from shell.tmpl import stripHtml
+ if data.feed.has_key('author_detail') and \
+ data.feed.author_detail.has_key('name'):
+ data.feed.author_detail['name'] = \
+ str(stripHtml(data.feed.author_detail.name))
+ for entry in data.entries:
+ if entry.has_key('author_detail') and \
+ entry.author_detail.has_key('name'):
+ entry.author_detail['name'] = \
+ str(stripHtml(entry.author_detail.name))
+ if entry.has_key('source'):
+ source = entry.source
+ if source.has_key('author_detail') and \
+ source.author_detail.has_key('name'):
+ source.author_detail['name'] = \
+ str(stripHtml(source.author_detail.name))
+
+ # handle dates in the future
+ future_dates = config.future_dates(feed_uri).lower()
+ if future_dates == 'ignore_date':
+ now = time.gmtime()
+ if data.feed.has_key('updated_parsed') and data.feed['updated_parsed']:
+ if data.feed['updated_parsed'] > now: del data.feed['updated_parsed']
+ for entry in data.entries:
+ if entry.has_key('published_parsed') and entry['published_parsed']:
+ if entry['published_parsed'] > now:
+ del entry['published_parsed']
+ del entry['published']
+ if entry.has_key('updated_parsed') and entry['updated_parsed']:
+ if entry['updated_parsed'] > now:
+ del entry['updated_parsed']
+ del entry['updated']
+ elif future_dates == 'ignore_entry':
+ now = time.time()
+ if data.feed.has_key('updated_parsed') and data.feed['updated_parsed']:
+ if data.feed['updated_parsed'] > now: del data.feed['updated_parsed']
+ data.entries = [entry for entry in data.entries if
+ (not entry.has_key('published_parsed') or not entry['published_parsed']
+ or entry['published_parsed'] <= now) and
+ (not entry.has_key('updated_parsed') or not entry['updated_parsed']
+ or entry['updated_parsed'] <= now)]
+
+ scrub_xmlbase = config.xml_base(feed_uri)
+
+ # resolve relative URIs and sanitize
+ for entry in data.entries + [data.feed]:
+ for key in entry.keys():
+ if key == 'content'and not entry.has_key('content_detail'):
+ node = entry.content[0]
+ elif key.endswith('_detail'):
+ node = entry[key]
+ else:
+ continue
+
+ if not node.has_key('type'): continue
+ if not 'html' in node['type']: continue
+ if not node.has_key('value'): continue
+
+ if node.has_key('base'):
+ if scrub_xmlbase:
+ if scrub_xmlbase == 'feed_alternate':
+ if entry.has_key('source') and \
+ entry.source.has_key('link'):
+ node['base'] = entry.source.link
+ elif data.feed.has_key('link'):
+ node['base'] = data.feed.link
+ elif scrub_xmlbase == 'entry_alternate':
+ if entry.has_key('link'):
+ node['base'] = entry.link
+ else:
+ node['base'] = feedparser._urljoin(
+ node['base'], scrub_xmlbase)
+
+ node['value'] = feedparser._resolveRelativeURIs(
+ node.value, node.base, 'utf-8', node.type)
+
+ node['value'] = feedparser._sanitizeHTML(
+ node.value, 'utf-8', node.type)
Deleted: trunk/lib/venus/planet/shell/__init__.py
===================================================================
--- branches/sucs-site/lib/venus/planet/shell/__init__.py 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/lib/venus/planet/shell/__init__.py 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,67 +0,0 @@
-import planet
-import os
-import sys
-
-logged_modes = []
-
-def run(template_file, doc, mode='template'):
- """ select a template module based on file extension and execute it """
- log = planet.logger
-
- if mode == 'template':
- dirs = planet.config.template_directories()
- else:
- dirs = planet.config.filter_directories()
-
- # parse out "extra" options
- if template_file.find('?') < 0:
- extra_options = {}
- else:
- import cgi
- template_file, extra_options = template_file.split('?',1)
- extra_options = dict(cgi.parse_qsl(extra_options))
-
- # see if the template can be located
- for template_dir in dirs:
- template_resolved = os.path.join(template_dir, template_file)
- if os.path.exists(template_resolved): break
- else:
- log.error("Unable to locate %s %s", mode, template_file)
- if not mode in logged_modes:
- log.info("%s search path:", mode)
- for template_dir in dirs:
- log.info(" %s", os.path.realpath(template_dir))
- logged_modes.append(mode)
- return
- template_resolved = os.path.realpath(template_resolved)
-
- # Add shell directory to the path, if not already there
- shellpath = os.path.join(sys.path[0],'planet','shell')
- if shellpath not in sys.path:
- sys.path.append(shellpath)
-
- # Try loading module for processing this template, based on the extension
- base,ext = os.path.splitext(os.path.basename(template_resolved))
- module_name = ext[1:]
- try:
- try:
- module = __import__("_" + module_name)
- except:
- module = __import__(module_name)
- except Exception, inst:
- return log.error("Skipping %s '%s' after failing to load '%s': %s",
- mode, template_resolved, module_name, inst)
-
- # Execute the shell module
- options = planet.config.template_options(template_file)
- if module_name == 'plugin': options['__file__'] = template_file
- options.update(extra_options)
- log.debug("Processing %s %s using %s", mode,
- os.path.realpath(template_resolved), module_name)
- if mode == 'filter':
- return module.run(template_resolved, doc, None, options)
- else:
- output_dir = planet.config.output_dir()
- output_file = os.path.join(output_dir, base)
- module.run(template_resolved, doc, output_file, options)
- return output_file
Copied: trunk/lib/venus/planet/shell/__init__.py (from rev 656, branches/sucs-site/lib/venus/planet/shell/__init__.py)
===================================================================
--- trunk/lib/venus/planet/shell/__init__.py (rev 0)
+++ trunk/lib/venus/planet/shell/__init__.py 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,67 @@
+import planet
+import os
+import sys
+
+logged_modes = []
+
+def run(template_file, doc, mode='template'):
+ """ select a template module based on file extension and execute it """
+ log = planet.logger
+
+ if mode == 'template':
+ dirs = planet.config.template_directories()
+ else:
+ dirs = planet.config.filter_directories()
+
+ # parse out "extra" options
+ if template_file.find('?') < 0:
+ extra_options = {}
+ else:
+ import cgi
+ template_file, extra_options = template_file.split('?',1)
+ extra_options = dict(cgi.parse_qsl(extra_options))
+
+ # see if the template can be located
+ for template_dir in dirs:
+ template_resolved = os.path.join(template_dir, template_file)
+ if os.path.exists(template_resolved): break
+ else:
+ log.error("Unable to locate %s %s", mode, template_file)
+ if not mode in logged_modes:
+ log.info("%s search path:", mode)
+ for template_dir in dirs:
+ log.info(" %s", os.path.realpath(template_dir))
+ logged_modes.append(mode)
+ return
+ template_resolved = os.path.realpath(template_resolved)
+
+ # Add shell directory to the path, if not already there
+ shellpath = os.path.join(sys.path[0],'planet','shell')
+ if shellpath not in sys.path:
+ sys.path.append(shellpath)
+
+ # Try loading module for processing this template, based on the extension
+ base,ext = os.path.splitext(os.path.basename(template_resolved))
+ module_name = ext[1:]
+ try:
+ try:
+ module = __import__("_" + module_name)
+ except:
+ module = __import__(module_name)
+ except Exception, inst:
+ return log.error("Skipping %s '%s' after failing to load '%s': %s",
+ mode, template_resolved, module_name, inst)
+
+ # Execute the shell module
+ options = planet.config.template_options(template_file)
+ if module_name == 'plugin': options['__file__'] = template_file
+ options.update(extra_options)
+ log.debug("Processing %s %s using %s", mode,
+ os.path.realpath(template_resolved), module_name)
+ if mode == 'filter':
+ return module.run(template_resolved, doc, None, options)
+ else:
+ output_dir = planet.config.output_dir()
+ output_file = os.path.join(output_dir, base)
+ module.run(template_resolved, doc, output_file, options)
+ return output_file
Deleted: trunk/lib/venus/planet/shell/_genshi.py
===================================================================
--- branches/sucs-site/lib/venus/planet/shell/_genshi.py 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/lib/venus/planet/shell/_genshi.py 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,143 +0,0 @@
-from StringIO import StringIO
-from xml.sax.saxutils import escape
-
-from genshi.input import HTMLParser, XMLParser
-from genshi.template import Context, MarkupTemplate
-
-subscriptions = []
-feed_types = [
- 'application/atom+xml',
- 'application/rss+xml',
- 'application/rdf+xml'
-]
-
-def norm(value):
- """ Convert to Unicode """
- if hasattr(value,'items'):
- return dict([(norm(n),norm(v)) for n,v in value.items()])
-
- try:
- return value.decode('utf-8')
- except:
- return value.decode('iso-8859-1')
-
-def find_config(config, feed):
- # match based on self link
- for link in feed.links:
- if link.has_key('rel') and link.rel=='self':
- if link.has_key('type') and link.type in feed_types:
- if link.has_key('href') and link.href in subscriptions:
- return norm(dict(config.parser.items(link.href)))
-
- # match based on name
- for sub in subscriptions:
- if config.parser.has_option(sub, 'name') and \
- norm(config.parser.get(sub, 'name')) == feed.planet_name:
- return norm(dict(config.parser.items(sub)))
-
- return {}
-
-class XHTMLParser(object):
- """ parse an XHTML fragment """
- def __init__(self, text):
- self.parser = XMLParser(StringIO("<div>%s</div>" % text))
- self.depth = 0
- def __iter__(self):
- self.iter = self.parser.__iter__()
- return self
- def next(self):
- object = self.iter.next()
- if object[0] == 'END': self.depth = self.depth - 1
- predepth = self.depth
- if object[0] == 'START': self.depth = self.depth + 1
- if predepth: return object
- return self.next()
-
-def streamify(text,bozo):
- """ add a .stream to a _detail textConstruct """
- if text.type == 'text/plain':
- text.stream = HTMLParser(StringIO(escape(text.value)))
- elif text.type == 'text/html' or bozo != 'false':
- text.stream = HTMLParser(StringIO(text.value))
- else:
- text.stream = XHTMLParser(text.value)
-
-def run(script, doc, output_file=None, options={}):
- """ process an Genshi template """
-
- context = Context(**options)
-
- tmpl_fileobj = open(script)
- tmpl = MarkupTemplate(tmpl_fileobj, script)
- tmpl_fileobj.close()
-
- if not output_file:
- # filter
- context.push({'input':XMLParser(StringIO(doc))})
- else:
- # template
- import time
- from planet import config,feedparser
- from planet.spider import filename
-
- # gather a list of subscriptions, feeds
- global subscriptions
- feeds = []
- sources = config.cache_sources_directory()
- for sub in config.subscriptions():
- data=feedparser.parse(filename(sources,sub))
- data.feed.config = norm(dict(config.parser.items(sub)))
- if data.feed.has_key('link'):
- feeds.append((data.feed.config.get('name',''),data.feed))
- subscriptions.append(norm(sub))
- feeds.sort()
-
- # annotate each entry
- new_date_format = config.new_date_format()
- vars = feedparser.parse(StringIO(doc))
- vars.feeds = [value for name,value in feeds]
- last_feed = None
- last_date = None
- for entry in vars.entries:
- entry.source.config = find_config(config, entry.source)
-
- # add new_feed and new_date fields
- entry.new_feed = entry.source.id
- entry.new_date = date = None
- if entry.has_key('published_parsed'): date=entry.published_parsed
- if entry.has_key('updated_parsed'): date=entry.updated_parsed
- if date: entry.new_date = time.strftime(new_date_format, date)
-
- # remove new_feed and new_date fields if not "new"
- if entry.new_date == last_date:
- entry.new_date = None
- if entry.new_feed == last_feed:
- entry.new_feed = None
- else:
- last_feed = entry.new_feed
- elif entry.new_date:
- last_date = entry.new_date
- last_feed = None
-
- # add streams for all text constructs
- for key in entry.keys():
- if key.endswith("_detail") and entry[key].has_key('type') and \
- entry[key].has_key('value'):
- streamify(entry[key],entry.source.planet_bozo)
- if entry.has_key('content'):
- for content in entry.content:
- streamify(content,entry.source.planet_bozo)
-
- # add cumulative feed information to the Genshi context
- vars.feed.config = dict(config.parser.items('Planet',True))
- context.push(vars)
-
- # apply template
- output=tmpl.generate(context).render('xml')
-
- if output_file:
- out_file = open(output_file,'w')
- out_file.write(output)
- out_file.close()
- else:
- return output
Copied: trunk/lib/venus/planet/shell/_genshi.py (from rev 656, branches/sucs-site/lib/venus/planet/shell/_genshi.py)
===================================================================
--- trunk/lib/venus/planet/shell/_genshi.py (rev 0)
+++ trunk/lib/venus/planet/shell/_genshi.py 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,143 @@
+from StringIO import StringIO
+from xml.sax.saxutils import escape
+
+from genshi.input import HTMLParser, XMLParser
+from genshi.template import Context, MarkupTemplate
+
+subscriptions = []
+feed_types = [
+ 'application/atom+xml',
+ 'application/rss+xml',
+ 'application/rdf+xml'
+]
+
+def norm(value):
+ """ Convert to Unicode """
+ if hasattr(value,'items'):
+ return dict([(norm(n),norm(v)) for n,v in value.items()])
+
+ try:
+ return value.decode('utf-8')
+ except:
+ return value.decode('iso-8859-1')
+
+def find_config(config, feed):
+ # match based on self link
+ for link in feed.links:
+ if link.has_key('rel') and link.rel=='self':
+ if link.has_key('type') and link.type in feed_types:
+ if link.has_key('href') and link.href in subscriptions:
+ return norm(dict(config.parser.items(link.href)))
+
+ # match based on name
+ for sub in subscriptions:
+ if config.parser.has_option(sub, 'name') and \
+ norm(config.parser.get(sub, 'name')) == feed.planet_name:
+ return norm(dict(config.parser.items(sub)))
+
+ return {}
+
+class XHTMLParser(object):
+ """ parse an XHTML fragment """
+ def __init__(self, text):
+ self.parser = XMLParser(StringIO("<div>%s</div>" % text))
+ self.depth = 0
+ def __iter__(self):
+ self.iter = self.parser.__iter__()
+ return self
+ def next(self):
+ object = self.iter.next()
+ if object[0] == 'END': self.depth = self.depth - 1
+ predepth = self.depth
+ if object[0] == 'START': self.depth = self.depth + 1
+ if predepth: return object
+ return self.next()
+
+def streamify(text,bozo):
+ """ add a .stream to a _detail textConstruct """
+ if text.type == 'text/plain':
+ text.stream = HTMLParser(StringIO(escape(text.value)))
+ elif text.type == 'text/html' or bozo != 'false':
+ text.stream = HTMLParser(StringIO(text.value))
+ else:
+ text.stream = XHTMLParser(text.value)
+
+def run(script, doc, output_file=None, options={}):
+ """ process an Genshi template """
+
+ context = Context(**options)
+
+ tmpl_fileobj = open(script)
+ tmpl = MarkupTemplate(tmpl_fileobj, script)
+ tmpl_fileobj.close()
+
+ if not output_file:
+ # filter
+ context.push({'input':XMLParser(StringIO(doc))})
+ else:
+ # template
+ import time
+ from planet import config,feedparser
+ from planet.spider import filename
+
+ # gather a list of subscriptions, feeds
+ global subscriptions
+ feeds = []
+ sources = config.cache_sources_directory()
+ for sub in config.subscriptions():
+ data=feedparser.parse(filename(sources,sub))
+ data.feed.config = norm(dict(config.parser.items(sub)))
+ if data.feed.has_key('link'):
+ feeds.append((data.feed.config.get('name',''),data.feed))
+ subscriptions.append(norm(sub))
+ feeds.sort()
+
+ # annotate each entry
+ new_date_format = config.new_date_format()
+ vars = feedparser.parse(StringIO(doc))
+ vars.feeds = [value for name,value in feeds]
+ last_feed = None
+ last_date = None
+ for entry in vars.entries:
+ entry.source.config = find_config(config, entry.source)
+
+ # add new_feed and new_date fields
+ entry.new_feed = entry.source.id
+ entry.new_date = date = None
+ if entry.has_key('published_parsed'): date=entry.published_parsed
+ if entry.has_key('updated_parsed'): date=entry.updated_parsed
+ if date: entry.new_date = time.strftime(new_date_format, date)
+
+ # remove new_feed and new_date fields if not "new"
+ if entry.new_date == last_date:
+ entry.new_date = None
+ if entry.new_feed == last_feed:
+ entry.new_feed = None
+ else:
+ last_feed = entry.new_feed
+ elif entry.new_date:
+ last_date = entry.new_date
+ last_feed = None
+
+ # add streams for all text constructs
+ for key in entry.keys():
+ if key.endswith("_detail") and entry[key].has_key('type') and \
+ entry[key].has_key('value'):
+ streamify(entry[key],entry.source.planet_bozo)
+ if entry.has_key('content'):
+ for content in entry.content:
+ streamify(content,entry.source.planet_bozo)
+
+ # add cumulative feed information to the Genshi context
+ vars.feed.config = dict(config.parser.items('Planet',True))
+ context.push(vars)
+
+ # apply template
+ output=tmpl.generate(context).render('xml')
+
+ if output_file:
+ out_file = open(output_file,'w')
+ out_file.write(output)
+ out_file.close()
+ else:
+ return output
Deleted: trunk/lib/venus/planet/shell/dj.py
===================================================================
--- branches/sucs-site/lib/venus/planet/shell/dj.py 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/lib/venus/planet/shell/dj.py 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,50 +0,0 @@
-import os.path
-import urlparse
-import datetime
-
-import tmpl
-from planet import config
-
-def DjangoPlanetDate(value):
- return datetime.datetime(*value[:6])
-
-# remap PlanetDate to be a datetime, so Django template authors can use
-# the "date" filter on these values
-tmpl.PlanetDate = DjangoPlanetDate
-
-def run(script, doc, output_file=None, options={}):
- """process a Django template file"""
-
- # this is needed to use the Django template system as standalone
- # I need to re-import the settings at every call because I have to
- # set the TEMPLATE_DIRS variable programmatically
- from django.conf import settings
- try:
- settings.configure(
- DEBUG=True, TEMPLATE_DEBUG=True,
- TEMPLATE_DIRS=(os.path.dirname(script),)
- )
- except EnvironmentError:
- pass
- from django.template import Context
- from django.template.loader import get_template
-
- # set up the Django context by using the default htmltmpl
- # datatype converters
- context = Context()
- context.update(tmpl.template_info(doc))
- context['Config'] = config.planet_options()
- t = get_template(script)
-
- if output_file:
- reluri = os.path.splitext(os.path.basename(output_file))[0]
- context['url'] = urlparse.urljoin(config.link(),reluri)
- f = open(output_file, 'w')
- ss = t.render(context)
- if isinstance(ss,unicode): ss=ss.encode('utf-8')
- f.write(ss)
- f.close()
- else:
- # @@this is useful for testing purposes, but does it
- # belong here?
- return t.render(context)
Copied: trunk/lib/venus/planet/shell/dj.py (from rev 656, branches/sucs-site/lib/venus/planet/shell/dj.py)
===================================================================
--- trunk/lib/venus/planet/shell/dj.py (rev 0)
+++ trunk/lib/venus/planet/shell/dj.py 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,50 @@
+import os.path
+import urlparse
+import datetime
+
+import tmpl
+from planet import config
+
+def DjangoPlanetDate(value):
+ return datetime.datetime(*value[:6])
+
+# remap PlanetDate to be a datetime, so Django template authors can use
+# the "date" filter on these values
+tmpl.PlanetDate = DjangoPlanetDate
+
+def run(script, doc, output_file=None, options={}):
+ """process a Django template file"""
+
+ # this is needed to use the Django template system as standalone
+ # I need to re-import the settings at every call because I have to
+ # set the TEMPLATE_DIRS variable programmatically
+ from django.conf import settings
+ try:
+ settings.configure(
+ DEBUG=True, TEMPLATE_DEBUG=True,
+ TEMPLATE_DIRS=(os.path.dirname(script),)
+ )
+ except EnvironmentError:
+ pass
+ from django.template import Context
+ from django.template.loader import get_template
+
+ # set up the Django context by using the default htmltmpl
+ # datatype converters
+ context = Context()
+ context.update(tmpl.template_info(doc))
+ context['Config'] = config.planet_options()
+ t = get_template(script)
+
+ if output_file:
+ reluri = os.path.splitext(os.path.basename(output_file))[0]
+ context['url'] = urlparse.urljoin(config.link(),reluri)
+ f = open(output_file, 'w')
+ ss = t.render(context)
+ if isinstance(ss,unicode): ss=ss.encode('utf-8')
+ f.write(ss)
+ f.close()
+ else:
+ # @@this is useful for testing purposes, but does it
+ # belong here?
+ return t.render(context)
Deleted: trunk/lib/venus/planet/shell/plugin.py
===================================================================
--- branches/sucs-site/lib/venus/planet/shell/plugin.py 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/lib/venus/planet/shell/plugin.py 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,64 +0,0 @@
-import os, sys, imp
-from StringIO import StringIO
-
-def run(script, doc, output_file=None, options={}):
- """ process an Python script using imp """
- save_sys = (sys.stdin, sys.stdout, sys.stderr, sys.argv)
- plugin_stdout = StringIO()
- plugin_stderr = StringIO()
-
- try:
- # redirect stdin
- sys.stdin = StringIO(doc)
-
- # redirect stdout
- if output_file:
- sys.stdout = open(output_file, 'w')
- else:
- sys.stdout = plugin_stdout
-
- # redirect stderr
- sys.stderr = plugin_stderr
-
- # determine __file__ value
- if options.has_key("__file__"):
- plugin_file = options["__file__"]
- del options["__file__"]
- else:
- plugin_file = script
-
- # set sys.argv
- options = sum([['--'+key, value] for key,value in options.items()], [])
- sys.argv = [plugin_file] + options
-
- # import script
- handle = open(script, 'r')
- cwd = os.getcwd()
- try:
- try:
- try:
- description=('.plugin', 'rb', imp.PY_SOURCE)
- imp.load_module('__main__',handle,plugin_file,description)
- except SystemExit,e:
- if e.code: log.error('%s exit rc=%d',(plugin_file,e.code))
- except Exception, e:
- import traceback
- type, value, tb = sys.exc_info()
- plugin_stderr.write(''.join(
- traceback.format_exception_only(type,value) +
- traceback.format_tb(tb)))
- finally:
- handle.close()
- if cwd != os.getcwd(): os.chdir(cwd)
-
- finally:
- # restore system state
- sys.stdin, sys.stdout, sys.stderr, sys.argv = save_sys
-
- # log anything sent to stderr
- if plugin_stderr.getvalue():
- import planet
- planet.logger.error(plugin_stderr.getvalue())
-
- # return stdout
- return plugin_stdout.getvalue()
Copied: trunk/lib/venus/planet/shell/plugin.py (from rev 656, branches/sucs-site/lib/venus/planet/shell/plugin.py)
===================================================================
--- trunk/lib/venus/planet/shell/plugin.py (rev 0)
+++ trunk/lib/venus/planet/shell/plugin.py 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,64 @@
+import os, sys, imp
+from StringIO import StringIO
+
+def run(script, doc, output_file=None, options={}):
+ """ process an Python script using imp """
+ save_sys = (sys.stdin, sys.stdout, sys.stderr, sys.argv)
+ plugin_stdout = StringIO()
+ plugin_stderr = StringIO()
+
+ try:
+ # redirect stdin
+ sys.stdin = StringIO(doc)
+
+ # redirect stdout
+ if output_file:
+ sys.stdout = open(output_file, 'w')
+ else:
+ sys.stdout = plugin_stdout
+
+ # redirect stderr
+ sys.stderr = plugin_stderr
+
+ # determine __file__ value
+ if options.has_key("__file__"):
+ plugin_file = options["__file__"]
+ del options["__file__"]
+ else:
+ plugin_file = script
+
+ # set sys.argv
+ options = sum([['--'+key, value] for key,value in options.items()], [])
+ sys.argv = [plugin_file] + options
+
+ # import script
+ handle = open(script, 'r')
+ cwd = os.getcwd()
+ try:
+ try:
+ try:
+ description=('.plugin', 'rb', imp.PY_SOURCE)
+ imp.load_module('__main__',handle,plugin_file,description)
+ except SystemExit,e:
+ if e.code: log.error('%s exit rc=%d',(plugin_file,e.code))
+ except Exception, e:
+ import traceback
+ type, value, tb = sys.exc_info()
+ plugin_stderr.write(''.join(
+ traceback.format_exception_only(type,value) +
+ traceback.format_tb(tb)))
+ finally:
+ handle.close()
+ if cwd != os.getcwd(): os.chdir(cwd)
+
+ finally:
+ # restore system state
+ sys.stdin, sys.stdout, sys.stderr, sys.argv = save_sys
+
+ # log anything sent to stderr
+ if plugin_stderr.getvalue():
+ import planet
+ planet.logger.error(plugin_stderr.getvalue())
+
+ # return stdout
+ return plugin_stdout.getvalue()
Deleted: trunk/lib/venus/planet/shell/py.py
===================================================================
--- branches/sucs-site/lib/venus/planet/shell/py.py 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/lib/venus/planet/shell/py.py 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,22 +0,0 @@
-from subprocess import Popen, PIPE
-import sys
-
-def run(script, doc, output_file=None, options={}):
- """ process an Python script """
-
- if output_file:
- out = open(output_file, 'w')
- else:
- out = PIPE
-
- options = sum([['--'+key, value] for key,value in options.items()], [])
-
- proc = Popen([sys.executable, script] + options,
- stdin=PIPE, stdout=out, stderr=PIPE)
-
- stdout, stderr = proc.communicate(doc)
- if stderr:
- import planet
- planet.logger.error(stderr)
-
- return stdout
Copied: trunk/lib/venus/planet/shell/py.py (from rev 656, branches/sucs-site/lib/venus/planet/shell/py.py)
===================================================================
--- trunk/lib/venus/planet/shell/py.py (rev 0)
+++ trunk/lib/venus/planet/shell/py.py 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,22 @@
+from subprocess import Popen, PIPE
+import sys
+
+def run(script, doc, output_file=None, options={}):
+ """ process an Python script """
+
+ if output_file:
+ out = open(output_file, 'w')
+ else:
+ out = PIPE
+
+ options = sum([['--'+key, value] for key,value in options.items()], [])
+
+ proc = Popen([sys.executable, script] + options,
+ stdin=PIPE, stdout=out, stderr=PIPE)
+
+ stdout, stderr = proc.communicate(doc)
+ if stderr:
+ import planet
+ planet.logger.error(stderr)
+
+ return stdout
Deleted: trunk/lib/venus/planet/shell/sed.py
===================================================================
--- branches/sucs-site/lib/venus/planet/shell/sed.py 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/lib/venus/planet/shell/sed.py 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,19 +0,0 @@
-from subprocess import Popen, PIPE
-
-def run(script, doc, output_file=None, options={}):
- """ process an Python script """
-
- if output_file:
- out = open(output_file, 'w')
- else:
- out = PIPE
-
- proc = Popen(['sed', '-f', script],
- stdin=PIPE, stdout=out, stderr=PIPE)
-
- stdout, stderr = proc.communicate(doc)
- if stderr:
- import planet
- planet.logger.error(stderr)
-
- return stdout
Copied: trunk/lib/venus/planet/shell/sed.py (from rev 656, branches/sucs-site/lib/venus/planet/shell/sed.py)
===================================================================
--- trunk/lib/venus/planet/shell/sed.py (rev 0)
+++ trunk/lib/venus/planet/shell/sed.py 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,19 @@
+from subprocess import Popen, PIPE
+
+def run(script, doc, output_file=None, options={}):
+ """ process an Python script """
+
+ if output_file:
+ out = open(output_file, 'w')
+ else:
+ out = PIPE
+
+ proc = Popen(['sed', '-f', script],
+ stdin=PIPE, stdout=out, stderr=PIPE)
+
+ stdout, stderr = proc.communicate(doc)
+ if stderr:
+ import planet
+ planet.logger.error(stderr)
+
+ return stdout
Deleted: trunk/lib/venus/planet/shell/tmpl.py
===================================================================
--- branches/sucs-site/lib/venus/planet/shell/tmpl.py 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/lib/venus/planet/shell/tmpl.py 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,272 +0,0 @@
-from xml.sax.saxutils import escape
-import sgmllib, time, os, sys, new, urlparse, re
-from planet import config, feedparser
-import htmltmpl
-
-voids=feedparser._BaseHTMLProcessor.elements_no_end_tag
-empty=re.compile(r"<((%s)[^>]*)></\2>" % '|'.join(voids))
-
-class stripHtml(sgmllib.SGMLParser):
- "remove all tags from the data"
- def __init__(self, data):
- sgmllib.SGMLParser.__init__(self)
- self.result=''
- if isinstance(data, str):
- try:
- self.feed(data.decode('utf-8'))
- except:
- self.feed(data)
- else:
- self.feed(data)
- self.close()
- def __str__(self):
- if isinstance(self.result, unicode):
- return self.result.encode('utf-8')
- return self.result
- def handle_entityref(self, ref):
- import htmlentitydefs
- if ref in htmlentitydefs.entitydefs:
- ref=htmlentitydefs.entitydefs[ref]
- if len(ref)==1:
- self.result+=unichr(ord(ref))
- elif ref.startswith('&#') and ref.endswith(';'):
- self.handle_charref(ref[2:-1])
- else:
- self.result+='&%s;' % ref
- else:
- self.result+='&%s;' % ref
- def handle_charref(self, ref):
- try:
- if ref.startswith('x'):
- self.result+=unichr(int(ref[1:],16))
- else:
- self.result+=unichr(int(ref))
- except:
- self.result+='&#%s;' % ref
- def handle_data(self, data):
- if data: self.result+=data
-
-# Data format mappers
-
-def String(value):
- if isinstance(value, unicode): return value.encode('utf-8')
- return value
-
-def Plain(value):
- return str(stripHtml(value))
-
-def PlanetDate(value):
- return time.strftime(config.date_format(), value)
-
-def NewDate(value):
- return time.strftime(config.new_date_format(), value)
-
-def Rfc822(value):
- return time.strftime("%a, %d %b %Y %H:%M:%S +0000", value)
-
-def Rfc3399(value):
- return time.strftime("%Y-%m-%dT%H:%M:%S+00:00", value)
-
-# Map from FeedParser path to Planet tmpl names
-Base = [
- ['author', String, 'author'],
- ['author_name', String, 'author_detail', 'name'],
- ['generator', String, 'generator'],
- ['id', String, 'id'],
- ['icon', String, 'icon'],
- ['last_updated_822', Rfc822, 'updated_parsed'],
- ['last_updated_iso', Rfc3399, 'updated_parsed'],
- ['last_updated', PlanetDate, 'updated_parsed'],
- ['link', String, 'link'],
- ['logo', String, 'logo'],
- ['rights', String, 'rights_detail', 'value'],
- ['subtitle', String, 'subtitle_detail', 'value'],
- ['title', String, 'title_detail', 'value'],
- ['title_plain', Plain, 'title_detail', 'value'],
- ['url', String, 'links', {'rel':'self'}, 'href'],
- ['url', String, 'planet_http_location'],
-]
-
-Items = [
- ['author', String, 'author'],
- ['author_email', String, 'author_detail', 'email'],
- ['author_name', String, 'author_detail', 'name'],
- ['author_uri', String, 'author_detail', 'href'],
- ['content_language', String, 'content', 0, 'language'],
- ['content', String, 'summary_detail', 'value'],
- ['content', String, 'content', 0, 'value'],
- ['date', PlanetDate, 'published_parsed'],
- ['date', PlanetDate, 'updated_parsed'],
- ['date_822', Rfc822, 'published_parsed'],
- ['date_822', Rfc822, 'updated_parsed'],
- ['date_iso', Rfc3399, 'published_parsed'],
- ['date_iso', Rfc3399, 'updated_parsed'],
- ['enclosure_href', String, 'links', {'rel': 'enclosure'}, 'href'],
- ['enclosure_length', String, 'links', {'rel': 'enclosure'}, 'length'],
- ['enclosure_type', String, 'links', {'rel': 'enclosure'}, 'type'],
- ['id', String, 'id'],
- ['link', String, 'links', {'rel': 'alternate'}, 'href'],
- ['new_channel', String, 'source', 'id'],
- ['new_date', NewDate, 'published_parsed'],
- ['new_date', NewDate, 'updated_parsed'],
- ['rights', String, 'rights_detail', 'value'],
- ['title_language', String, 'title_detail', 'language'],
- ['title_plain', Plain, 'title_detail', 'value'],
- ['title', String, 'title_detail', 'value'],
- ['summary_language', String, 'summary_detail', 'language'],
- ['updated', PlanetDate, 'updated_parsed'],
- ['updated_822', Rfc822, 'updated_parsed'],
- ['updated_iso', Rfc3399, 'updated_parsed'],
- ['published', PlanetDate, 'published_parsed'],
- ['published_822', Rfc822, 'published_parsed'],
- ['published_iso', Rfc3399, 'published_parsed'],
-]
-
-# Add additional rules for source information
-for rule in Base:
- Items.append(['channel_'+rule[0], rule[1], 'source'] + rule[2:])
-
-def tmpl_mapper(source, rules):
- "Apply specified rules to the source, and return a template dictionary"
- output = {}
-
- for rule in rules:
- node = source
- for path in rule[2:]:
- if isinstance(path, str) and path in node:
- if path == 'value':
- if node.get('type','')=='text/plain':
- node['value'] = escape(node['value'])
- node['type'] = 'text/html'
- elif node.get('type','')=='application/xhtml+xml':
- node['value'] = empty.sub(r"<\1 />", node['value'])
- node = node[path]
- elif isinstance(path, int):
- node = node[path]
- elif isinstance(path, dict):
- for test in node:
- for key, value in path.items():
- if test.get(key,None) != value: break
- else:
- node = test
- break
- else:
- break
- else:
- break
- else:
- if node: output[rule[0]] = rule[1](node)
-
- # copy over all planet namespaced elements from parent source
- for name,value in source.items():
- if name.startswith('planet_'):
- output[name[7:]] = String(value)
- if not output.get('name') and source.has_key('title_detail'):
- output['name'] = Plain(source.title_detail.value)
-
- # copy over all planet namespaced elements from child source element
- if 'source' in source:
- for name,value in source.source.items():
- if name.startswith('planet_'):
- output['channel_' + name[7:]] = String(value)
- if not output.get('channel_name') and \
- source.source.has_key('title_detail'):
- output['channel_name'] = Plain(source.source.title_detail.value)
-
- return output
-
-def _end_planet_source(self):
- self._end_source()
- context = self._getContext()
- if not context.has_key('sources'): context['sources'] = []
- context.sources.append(context.source)
- del context['source']
-
-def template_info(source):
- """ get template information from a feedparser output """
-
- # wire in support for planet:source, call feedparser, unplug planet:source
- mixin=feedparser._FeedParserMixin
- mixin._start_planet_source = mixin._start_source
- mixin._end_planet_source = \
- new.instancemethod(_end_planet_source, None, mixin)
- data=feedparser.parse(source)
- del mixin._start_planet_source
- del mixin._end_planet_source
-
- # apply rules to convert feed parser output to htmltmpl input
- output = {'Channels': [], 'Items': []}
- output.update(tmpl_mapper(data.feed, Base))
- sources = [(source.get('planet_name',None),source)
- for source in data.feed.get('sources',[])]
- sources.sort()
- for name, feed in sources:
- output['Channels'].append(tmpl_mapper(feed, Base))
- for entry in data.entries:
- output['Items'].append(tmpl_mapper(entry, Items))
-
- # synthesize isPermaLink attribute
- for item in output['Items']:
- if item.get('id') == item.get('link'):
- item['guid_isPermaLink']='true'
- else:
- item['guid_isPermaLink']='false'
-
- # feed level information
- output['generator'] = config.generator_uri()
- output['name'] = config.name()
- output['link'] = config.link()
- output['owner_name'] = config.owner_name()
- output['owner_email'] = config.owner_email()
- if config.feed():
- output['feed'] = config.feed()
- output['feedtype'] = config.feed().find('rss')>=0 and 'rss' or 'atom'
-
- # date/time information
- date = time.gmtime()
- output['date'] = PlanetDate(date)
- output['date_iso'] = Rfc3399(date)
- output['date_822'] = Rfc822(date)
-
- # remove new_dates and new_channels that aren't "new"
- date = channel = None
- for item in output['Items']:
- if item.has_key('new_date'):
- if item['new_date'] == date:
- del item['new_date']
- else:
- date = item['new_date']
-
- if item.has_key('new_channel'):
- if item['new_channel'] == channel and not item.has_key('new_date'):
- del item['new_channel']
- else:
- channel = item['new_channel']
-
- return output
-
-def run(script, doc, output_file=None, options={}):
- """ process an HTMLTMPL file """
- manager = htmltmpl.TemplateManager()
- template = manager.prepare(script)
- tp = htmltmpl.TemplateProcessor(html_escape=0)
- for key,value in template_info(doc).items():
- tp.set(key, value)
-
- if output_file:
- reluri = os.path.splitext(os.path.basename(output_file))[0]
- tp.set('url', urlparse.urljoin(config.link(),reluri))
-
- output = open(output_file, "w")
- output.write(tp.process(template))
- output.close()
- else:
- return tp.process(template)
-
-if __name__ == '__main__':
- sys.path.insert(0, os.path.split(sys.path[0])[0])
-
- for test in sys.argv[1:]:
- from pprint import pprint
- pprint(template_info('/home/rubys/bzr/venus/tests/data/filter/tmpl/'+test))
-
Copied: trunk/lib/venus/planet/shell/tmpl.py (from rev 656, branches/sucs-site/lib/venus/planet/shell/tmpl.py)
===================================================================
--- trunk/lib/venus/planet/shell/tmpl.py (rev 0)
+++ trunk/lib/venus/planet/shell/tmpl.py 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,272 @@
+from xml.sax.saxutils import escape
+import sgmllib, time, os, sys, new, urlparse, re
+from planet import config, feedparser
+import htmltmpl
+
+voids=feedparser._BaseHTMLProcessor.elements_no_end_tag
+empty=re.compile(r"<((%s)[^>]*)></\2>" % '|'.join(voids))
+
+class stripHtml(sgmllib.SGMLParser):
+ "remove all tags from the data"
+ def __init__(self, data):
+ sgmllib.SGMLParser.__init__(self)
+ self.result=''
+ if isinstance(data, str):
+ try:
+ self.feed(data.decode('utf-8'))
+ except:
+ self.feed(data)
+ else:
+ self.feed(data)
+ self.close()
+ def __str__(self):
+ if isinstance(self.result, unicode):
+ return self.result.encode('utf-8')
+ return self.result
+ def handle_entityref(self, ref):
+ import htmlentitydefs
+ if ref in htmlentitydefs.entitydefs:
+ ref=htmlentitydefs.entitydefs[ref]
+ if len(ref)==1:
+ self.result+=unichr(ord(ref))
+ elif ref.startswith('&#') and ref.endswith(';'):
+ self.handle_charref(ref[2:-1])
+ else:
+ self.result+='&%s;' % ref
+ else:
+ self.result+='&%s;' % ref
+ def handle_charref(self, ref):
+ try:
+ if ref.startswith('x'):
+ self.result+=unichr(int(ref[1:],16))
+ else:
+ self.result+=unichr(int(ref))
+ except:
+ self.result+='&#%s;' % ref
+ def handle_data(self, data):
+ if data: self.result+=data
+
+# Data format mappers
+
+def String(value):
+ if isinstance(value, unicode): return value.encode('utf-8')
+ return value
+
+def Plain(value):
+ return str(stripHtml(value))
+
+def PlanetDate(value):
+ return time.strftime(config.date_format(), value)
+
+def NewDate(value):
+ return time.strftime(config.new_date_format(), value)
+
+def Rfc822(value):
+ return time.strftime("%a, %d %b %Y %H:%M:%S +0000", value)
+
+def Rfc3399(value):
+ return time.strftime("%Y-%m-%dT%H:%M:%S+00:00", value)
+
+# Map from FeedParser path to Planet tmpl names
+Base = [
+ ['author', String, 'author'],
+ ['author_name', String, 'author_detail', 'name'],
+ ['generator', String, 'generator'],
+ ['id', String, 'id'],
+ ['icon', String, 'icon'],
+ ['last_updated_822', Rfc822, 'updated_parsed'],
+ ['last_updated_iso', Rfc3399, 'updated_parsed'],
+ ['last_updated', PlanetDate, 'updated_parsed'],
+ ['link', String, 'link'],
+ ['logo', String, 'logo'],
+ ['rights', String, 'rights_detail', 'value'],
+ ['subtitle', String, 'subtitle_detail', 'value'],
+ ['title', String, 'title_detail', 'value'],
+ ['title_plain', Plain, 'title_detail', 'value'],
+ ['url', String, 'links', {'rel':'self'}, 'href'],
+ ['url', String, 'planet_http_location'],
+]
+
+Items = [
+ ['author', String, 'author'],
+ ['author_email', String, 'author_detail', 'email'],
+ ['author_name', String, 'author_detail', 'name'],
+ ['author_uri', String, 'author_detail', 'href'],
+ ['content_language', String, 'content', 0, 'language'],
+ ['content', String, 'summary_detail', 'value'],
+ ['content', String, 'content', 0, 'value'],
+ ['date', PlanetDate, 'published_parsed'],
+ ['date', PlanetDate, 'updated_parsed'],
+ ['date_822', Rfc822, 'published_parsed'],
+ ['date_822', Rfc822, 'updated_parsed'],
+ ['date_iso', Rfc3399, 'published_parsed'],
+ ['date_iso', Rfc3399, 'updated_parsed'],
+ ['enclosure_href', String, 'links', {'rel': 'enclosure'}, 'href'],
+ ['enclosure_length', String, 'links', {'rel': 'enclosure'}, 'length'],
+ ['enclosure_type', String, 'links', {'rel': 'enclosure'}, 'type'],
+ ['id', String, 'id'],
+ ['link', String, 'links', {'rel': 'alternate'}, 'href'],
+ ['new_channel', String, 'source', 'id'],
+ ['new_date', NewDate, 'published_parsed'],
+ ['new_date', NewDate, 'updated_parsed'],
+ ['rights', String, 'rights_detail', 'value'],
+ ['title_language', String, 'title_detail', 'language'],
+ ['title_plain', Plain, 'title_detail', 'value'],
+ ['title', String, 'title_detail', 'value'],
+ ['summary_language', String, 'summary_detail', 'language'],
+ ['updated', PlanetDate, 'updated_parsed'],
+ ['updated_822', Rfc822, 'updated_parsed'],
+ ['updated_iso', Rfc3399, 'updated_parsed'],
+ ['published', PlanetDate, 'published_parsed'],
+ ['published_822', Rfc822, 'published_parsed'],
+ ['published_iso', Rfc3399, 'published_parsed'],
+]
+
+# Add additional rules for source information
+for rule in Base:
+ Items.append(['channel_'+rule[0], rule[1], 'source'] + rule[2:])
+
+def tmpl_mapper(source, rules):
+ "Apply specified rules to the source, and return a template dictionary"
+ output = {}
+
+ for rule in rules:
+ node = source
+ for path in rule[2:]:
+ if isinstance(path, str) and path in node:
+ if path == 'value':
+ if node.get('type','')=='text/plain':
+ node['value'] = escape(node['value'])
+ node['type'] = 'text/html'
+ elif node.get('type','')=='application/xhtml+xml':
+ node['value'] = empty.sub(r"<\1 />", node['value'])
+ node = node[path]
+ elif isinstance(path, int):
+ node = node[path]
+ elif isinstance(path, dict):
+ for test in node:
+ for key, value in path.items():
+ if test.get(key,None) != value: break
+ else:
+ node = test
+ break
+ else:
+ break
+ else:
+ break
+ else:
+ if node: output[rule[0]] = rule[1](node)
+
+ # copy over all planet namespaced elements from parent source
+ for name,value in source.items():
+ if name.startswith('planet_'):
+ output[name[7:]] = String(value)
+ if not output.get('name') and source.has_key('title_detail'):
+ output['name'] = Plain(source.title_detail.value)
+
+ # copy over all planet namespaced elements from child source element
+ if 'source' in source:
+ for name,value in source.source.items():
+ if name.startswith('planet_'):
+ output['channel_' + name[7:]] = String(value)
+ if not output.get('channel_name') and \
+ source.source.has_key('title_detail'):
+ output['channel_name'] = Plain(source.source.title_detail.value)
+
+ return output
+
+def _end_planet_source(self):
+ self._end_source()
+ context = self._getContext()
+ if not context.has_key('sources'): context['sources'] = []
+ context.sources.append(context.source)
+ del context['source']
+
+def template_info(source):
+ """ get template information from a feedparser output """
+
+ # wire in support for planet:source, call feedparser, unplug planet:source
+ mixin=feedparser._FeedParserMixin
+ mixin._start_planet_source = mixin._start_source
+ mixin._end_planet_source = \
+ new.instancemethod(_end_planet_source, None, mixin)
+ data=feedparser.parse(source)
+ del mixin._start_planet_source
+ del mixin._end_planet_source
+
+ # apply rules to convert feed parser output to htmltmpl input
+ output = {'Channels': [], 'Items': []}
+ output.update(tmpl_mapper(data.feed, Base))
+ sources = [(source.get('planet_name',None),source)
+ for source in data.feed.get('sources',[])]
+ sources.sort()
+ for name, feed in sources:
+ output['Channels'].append(tmpl_mapper(feed, Base))
+ for entry in data.entries:
+ output['Items'].append(tmpl_mapper(entry, Items))
+
+ # synthesize isPermaLink attribute
+ for item in output['Items']:
+ if item.get('id') == item.get('link'):
+ item['guid_isPermaLink']='true'
+ else:
+ item['guid_isPermaLink']='false'
+
+ # feed level information
+ output['generator'] = config.generator_uri()
+ output['name'] = config.name()
+ output['link'] = config.link()
+ output['owner_name'] = config.owner_name()
+ output['owner_email'] = config.owner_email()
+ if config.feed():
+ output['feed'] = config.feed()
+ output['feedtype'] = config.feed().find('rss')>=0 and 'rss' or 'atom'
+
+ # date/time information
+ date = time.gmtime()
+ output['date'] = PlanetDate(date)
+ output['date_iso'] = Rfc3399(date)
+ output['date_822'] = Rfc822(date)
+
+ # remove new_dates and new_channels that aren't "new"
+ date = channel = None
+ for item in output['Items']:
+ if item.has_key('new_date'):
+ if item['new_date'] == date:
+ del item['new_date']
+ else:
+ date = item['new_date']
+
+ if item.has_key('new_channel'):
+ if item['new_channel'] == channel and not item.has_key('new_date'):
+ del item['new_channel']
+ else:
+ channel = item['new_channel']
+
+ return output
+
+def run(script, doc, output_file=None, options={}):
+ """ process an HTMLTMPL file """
+ manager = htmltmpl.TemplateManager()
+ template = manager.prepare(script)
+ tp = htmltmpl.TemplateProcessor(html_escape=0)
+ for key,value in template_info(doc).items():
+ tp.set(key, value)
+
+ if output_file:
+ reluri = os.path.splitext(os.path.basename(output_file))[0]
+ tp.set('url', urlparse.urljoin(config.link(),reluri))
+
+ output = open(output_file, "w")
+ output.write(tp.process(template))
+ output.close()
+ else:
+ return tp.process(template)
+
+if __name__ == '__main__':
+ sys.path.insert(0, os.path.split(sys.path[0])[0])
+
+ for test in sys.argv[1:]:
+ from pprint import pprint
+ pprint(template_info('/home/rubys/bzr/venus/tests/data/filter/tmpl/'+test))
+
Deleted: trunk/lib/venus/planet/shell/xslt.py
===================================================================
--- branches/sucs-site/lib/venus/planet/shell/xslt.py 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/lib/venus/planet/shell/xslt.py 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,78 +0,0 @@
-import os
-
-def quote(string, apos):
- """ quote a string so that it can be passed as a parameter """
- if type(string) == unicode:
- string=string.encode('utf-8')
- if apos.startswith("\\"): string.replace('\\','\\\\')
-
- if string.find("'")<0:
- return "'" + string + "'"
- elif string.find("'")<0:
- return '"' + string + '"'
- else:
- # unclear how to quote strings with both types of quotes for libxslt
- return "'" + string.replace("'",apos) + "'"
-
-def run(script, doc, output_file=None, options={}):
- """ process an XSLT stylesheet """
-
- try:
- # if available, use the python interface to libxslt
- import libxml2
- import libxslt
- dom = libxml2.parseDoc(doc)
- docfile = None
- except:
- # otherwise, use the command line interface
- dom = None
-
- # do it
- result = None
- if dom:
- styledoc = libxml2.parseFile(script)
- style = libxslt.parseStylesheetDoc(styledoc)
- for key in options.keys():
- options[key] = quote(options[key], apos="\xe2\x80\x99")
- output = style.applyStylesheet(dom, options)
- if output_file:
- style.saveResultToFilename(output_file, output, 0)
- else:
- result = output.serialize('utf-8')
- style.freeStylesheet()
- output.freeDoc()
- elif output_file:
- import warnings
- if hasattr(warnings, 'simplefilter'):
- warnings.simplefilter('ignore', RuntimeWarning)
- docfile = os.tmpnam()
- file = open(docfile,'w')
- file.write(doc)
- file.close()
-
- cmdopts = []
- for key,value in options.items():
- if value.find("'")>=0 and value.find('"')>=0: continue
- cmdopts += ['--stringparam', key, quote(value, apos=r"\'")]
-
- os.system('xsltproc %s %s %s > %s' %
- (' '.join(cmdopts), script, docfile, output_file))
- os.unlink(docfile)
- else:
- import sys
- from subprocess import Popen, PIPE
-
- options = sum([['--stringparam', key, value]
- for key,value in options.items()], [])
-
- proc = Popen(['xsltproc'] + options + [script, '-'],
- stdin=PIPE, stdout=PIPE, stderr=PIPE)
-
- result, stderr = proc.communicate(doc)
- if stderr:
- import planet
- planet.logger.error(stderr)
-
- if dom: dom.freeDoc()
-
- return result
Copied: trunk/lib/venus/planet/shell/xslt.py (from rev 656, branches/sucs-site/lib/venus/planet/shell/xslt.py)
===================================================================
--- trunk/lib/venus/planet/shell/xslt.py (rev 0)
+++ trunk/lib/venus/planet/shell/xslt.py 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,78 @@
+import os
+
+def quote(string, apos):
+ """ quote a string so that it can be passed as a parameter """
+ if type(string) == unicode:
+ string=string.encode('utf-8')
+ if apos.startswith("\\"): string.replace('\\','\\\\')
+
+ if string.find("'")<0:
+ return "'" + string + "'"
+ elif string.find("'")<0:
+ return '"' + string + '"'
+ else:
+ # unclear how to quote strings with both types of quotes for libxslt
+ return "'" + string.replace("'",apos) + "'"
+
+def run(script, doc, output_file=None, options={}):
+ """ process an XSLT stylesheet """
+
+ try:
+ # if available, use the python interface to libxslt
+ import libxml2
+ import libxslt
+ dom = libxml2.parseDoc(doc)
+ docfile = None
+ except:
+ # otherwise, use the command line interface
+ dom = None
+
+ # do it
+ result = None
+ if dom:
+ styledoc = libxml2.parseFile(script)
+ style = libxslt.parseStylesheetDoc(styledoc)
+ for key in options.keys():
+ options[key] = quote(options[key], apos="\xe2\x80\x99")
+ output = style.applyStylesheet(dom, options)
+ if output_file:
+ style.saveResultToFilename(output_file, output, 0)
+ else:
+ result = output.serialize('utf-8')
+ style.freeStylesheet()
+ output.freeDoc()
+ elif output_file:
+ import warnings
+ if hasattr(warnings, 'simplefilter'):
+ warnings.simplefilter('ignore', RuntimeWarning)
+ docfile = os.tmpnam()
+ file = open(docfile,'w')
+ file.write(doc)
+ file.close()
+
+ cmdopts = []
+ for key,value in options.items():
+ if value.find("'")>=0 and value.find('"')>=0: continue
+ cmdopts += ['--stringparam', key, quote(value, apos=r"\'")]
+
+ os.system('xsltproc %s %s %s > %s' %
+ (' '.join(cmdopts), script, docfile, output_file))
+ os.unlink(docfile)
+ else:
+ import sys
+ from subprocess import Popen, PIPE
+
+ options = sum([['--stringparam', key, value]
+ for key,value in options.items()], [])
+
+ proc = Popen(['xsltproc'] + options + [script, '-'],
+ stdin=PIPE, stdout=PIPE, stderr=PIPE)
+
+ result, stderr = proc.communicate(doc)
+ if stderr:
+ import planet
+ planet.logger.error(stderr)
+
+ if dom: dom.freeDoc()
+
+ return result
Deleted: trunk/lib/venus/planet/spider.py
===================================================================
--- branches/sucs-site/lib/venus/planet/spider.py 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/lib/venus/planet/spider.py 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,482 +0,0 @@
-"""
-Fetch either a single feed, or a set of feeds, normalize to Atom and XHTML,
-and write each as a set of entries in a cache directory.
-"""
-
-# Standard library modules
-import time, calendar, re, os, urlparse
-from xml.dom import minidom
-# Planet modules
-import planet, config, feedparser, reconstitute, shell, socket, scrub
-from StringIO import StringIO
-
-# Regular expressions to sanitise cache filenames
-re_url_scheme = re.compile(r'^\w+:/*(\w+:|www\.)?')
-re_slash = re.compile(r'[?/:|]+')
-re_initial_cruft = re.compile(r'^[,.]*')
-re_final_cruft = re.compile(r'[,.]*$')
-
-index = True
-
-def filename(directory, filename):
- """Return a filename suitable for the cache.
-
- Strips dangerous and common characters to create a filename we
- can use to store the cache in.
- """
- try:
- if re_url_scheme.match(filename):
- if isinstance(filename,str):
- filename=filename.decode('utf-8').encode('idna')
- else:
- filename=filename.encode('idna')
- except:
- pass
- if isinstance(filename,unicode):
- filename=filename.encode('utf-8')
- filename = re_url_scheme.sub("", filename)
- filename = re_slash.sub(",", filename)
- filename = re_initial_cruft.sub("", filename)
- filename = re_final_cruft.sub("", filename)
-
- # limit length of filename
- if len(filename)>250:
- parts=filename.split(',')
- for i in range(len(parts),0,-1):
- if len(','.join(parts[:i])) < 220:
- import md5
- filename = ','.join(parts[:i]) + ',' + \
- md5.new(','.join(parts[i:])).hexdigest()
- break
-
- return os.path.join(directory, filename)
-
-def write(xdoc, out):
- """ write the document out to disk """
- file = open(out,'w')
- file.write(xdoc)
- file.close()
-
-def _is_http_uri(uri):
- parsed = urlparse.urlparse(uri)
- return parsed[0] in ['http', 'https']
-
-def writeCache(feed_uri, feed_info, data):
- log = planet.logger
- sources = config.cache_sources_directory()
-
- # capture http status
- if not data.has_key("status"):
- if data.has_key("entries") and len(data.entries)>0:
- data.status = 200
- elif data.bozo and \
- data.bozo_exception.__class__.__name__.lower()=='timeout':
- data.status = 408
- else:
- data.status = 500
-
- activity_horizon = \
- time.gmtime(time.time()-86400*config.activity_threshold(feed_uri))
-
- # process based on the HTTP status code
- if data.status == 200 and data.has_key("url"):
- feed_info.feed['planet_http_location'] = data.url
- if data.has_key("entries") and len(data.entries) == 0:
- log.warning("No data %s", feed_uri)
- feed_info.feed['planet_message'] = 'no data'
- elif feed_uri == data.url:
- log.info("Updating feed %s", feed_uri)
- else:
- log.info("Updating feed %s @ %s", feed_uri, data.url)
- elif data.status == 301 and data.has_key("entries") and len(data.entries)>0:
- log.warning("Feed has moved from <%s> to <%s>", feed_uri, data.url)
- data.feed['planet_http_location'] = data.url
- elif data.status == 304 and data.has_key("url"):
- feed_info.feed['planet_http_location'] = data.url
- if feed_uri == data.url:
- log.info("Feed %s unchanged", feed_uri)
- else:
- log.info("Feed %s unchanged @ %s", feed_uri, data.url)
-
- if not feed_info.feed.has_key('planet_message'):
- if feed_info.feed.has_key('planet_updated'):
- updated = feed_info.feed.planet_updated
- if feedparser._parse_date_iso8601(updated) >= activity_horizon:
- return
- else:
- if feed_info.feed.planet_message.startswith("no activity in"):
- return
- if not feed_info.feed.planet_message.startswith("duplicate") and \
- not feed_info.feed.planet_message.startswith("no data"):
- del feed_info.feed['planet_message']
-
- elif data.status == 410:
- log.info("Feed %s gone", feed_uri)
- elif data.status == 408:
- log.warning("Feed %s timed out", feed_uri)
- elif data.status >= 400:
- log.error("Error %d while updating feed %s", data.status, feed_uri)
- else:
- log.info("Updating feed %s", feed_uri)
-
- # if read failed, retain cached information
- if not data.version and feed_info.version:
- data.feed = feed_info.feed
- data.bozo = feed_info.feed.get('planet_bozo','true') == 'true'
- data.version = feed_info.feed.get('planet_format')
- data.feed['planet_http_status'] = str(data.status)
-
- # capture etag and last-modified information
- if data.has_key('headers'):
- if data.has_key('etag') and data.etag:
- data.feed['planet_http_etag'] = data.etag
- elif data.headers.has_key('etag') and data.headers['etag']:
- data.feed['planet_http_etag'] = data.headers['etag']
-
- if data.headers.has_key('last-modified'):
- data.feed['planet_http_last_modified']=data.headers['last-modified']
- elif data.has_key('modified') and data.modified:
- data.feed['planet_http_last_modified'] = time.asctime(data.modified)
-
- if data.headers.has_key('-content-hash'):
- data.feed['planet_content_hash'] = data.headers['-content-hash']
-
- # capture feed and data from the planet configuration file
- if data.version:
- if not data.feed.has_key('links'): data.feed['links'] = list()
- feedtype = 'application/atom+xml'
- if data.version.startswith('rss'): feedtype = 'application/rss+xml'
- if data.version in ['rss090','rss10']: feedtype = 'application/rdf+xml'
- for link in data.feed.links:
- if link.rel == 'self':
- link['type'] = feedtype
- break
- else:
- data.feed.links.append(feedparser.FeedParserDict(
- {'rel':'self', 'type':feedtype, 'href':feed_uri}))
- for name, value in config.feed_options(feed_uri).items():
- data.feed['planet_'+name] = value
-
- # perform user configured scrub operations on the data
- scrub.scrub(feed_uri, data)
-
- from planet import idindex
- global index
- if index != None: index = idindex.open()
-
- # select latest entry for each unique id
- ids = {}
- for entry in data.entries:
- # generate an id, if none is present
- if not entry.has_key('id') or not entry.id:
- entry['id'] = reconstitute.id(None, entry)
- if not entry['id']: continue
-
- # determine updated date for purposes of selection
- updated = ''
- if entry.has_key('published'): updated=entry.published
- if entry.has_key('updated'): updated=entry.updated
-
- # if not seen or newer than last seen, select it
- if updated >= ids.get(entry.id,('',))[0]:
- ids[entry.id] = (updated, entry)
-
- # write each entry to the cache
- cache = config.cache_directory()
- for updated, entry in ids.values():
-
- # compute cache file name based on the id
- cache_file = filename(cache, entry.id)
-
- # get updated-date either from the entry or the cache (default to now)
- mtime = None
- if not entry.has_key('updated_parsed') or not entry['updated_parsed']:
- entry['updated_parsed'] = entry.get('published_parsed',None)
- if entry.has_key('updated_parsed'):
- try:
- mtime = calendar.timegm(entry.updated_parsed)
- except:
- pass
- if not mtime:
- try:
- mtime = os.stat(cache_file).st_mtime
- except:
- if data.feed.has_key('updated_parsed'):
- try:
- mtime = calendar.timegm(data.feed.updated_parsed)
- except:
- pass
- if not mtime: mtime = time.time()
- entry['updated_parsed'] = time.gmtime(mtime)
-
- # apply any filters
- xdoc = reconstitute.reconstitute(data, entry)
- output = xdoc.toxml().encode('utf-8')
- xdoc.unlink()
- for filter in config.filters(feed_uri):
- output = shell.run(filter, output, mode="filter")
- if not output: break
- if not output:
- if os.path.exists(cache_file): os.remove(cache_file)
- continue
-
- # write out and timestamp the results
- write(output, cache_file)
- os.utime(cache_file, (mtime, mtime))
-
- # optionally index
- if index != None:
- feedid = data.feed.get('id', data.feed.get('link',None))
- if feedid:
- if type(feedid) == unicode: feedid = feedid.encode('utf-8')
- index[filename('', entry.id)] = feedid
-
- if index: index.close()
-
- # identify inactive feeds
- if config.activity_threshold(feed_uri):
- updated = [entry.updated_parsed for entry in data.entries
- if entry.has_key('updated_parsed')]
- updated.sort()
-
- if updated:
- data.feed['planet_updated'] = \
- time.strftime("%Y-%m-%dT%H:%M:%SZ", updated[-1])
- elif data.feed.has_key('planet_updated'):
- updated = [feedparser._parse_date_iso8601(data.feed.planet_updated)]
-
- if not updated or updated[-1] < activity_horizon:
- msg = "no activity in %d days" % config.activity_threshold(feed_uri)
- log.info(msg)
- data.feed['planet_message'] = msg
-
- # report channel level errors
- if data.status == 226:
- if data.feed.has_key('planet_message'): del data.feed['planet_message']
- if feed_info.feed.has_key('planet_updated'):
- data.feed['planet_updated'] = feed_info.feed['planet_updated']
- elif data.status == 403:
- data.feed['planet_message'] = "403: forbidden"
- elif data.status == 404:
- data.feed['planet_message'] = "404: not found"
- elif data.status == 408:
- data.feed['planet_message'] = "408: request timeout"
- elif data.status == 410:
- data.feed['planet_message'] = "410: gone"
- elif data.status == 500:
- data.feed['planet_message'] = "internal server error"
- elif data.status >= 400:
- data.feed['planet_message'] = "http status %s" % data.status
-
- # write the feed info to the cache
- if not os.path.exists(sources): os.makedirs(sources)
- xdoc=minidom.parseString('''<feed xmlns:planet="%s"
- xmlns="http://www.w3.org/2005/Atom"/>\n''' % planet.xmlns)
- reconstitute.source(xdoc.documentElement,data.feed,data.bozo,data.version)
- write(xdoc.toxml().encode('utf-8'), filename(sources, feed_uri))
- xdoc.unlink()
-
-def httpThread(thread_index, input_queue, output_queue, log):
- import httplib2, md5
- from httplib import BadStatusLine
-
- h = httplib2.Http(config.http_cache_directory())
- uri, feed_info = input_queue.get(block=True)
- while uri:
- log.info("Fetching %s via %d", uri, thread_index)
- feed = StringIO('')
- setattr(feed, 'url', uri)
- setattr(feed, 'headers',
- feedparser.FeedParserDict({'status':'500'}))
- try:
- # map IRI => URI
- try:
- if isinstance(uri,unicode):
- idna = uri.encode('idna')
- else:
- idna = uri.decode('utf-8').encode('idna')
- if idna != uri: log.info("IRI %s mapped to %s", uri, idna)
- except:
- log.info("unable to map %s to a URI", uri)
- idna = uri
-
- # cache control headers
- headers = {}
- if feed_info.feed.has_key('planet_http_etag'):
- headers['If-None-Match'] = feed_info.feed['planet_http_etag']
- if feed_info.feed.has_key('planet_http_last_modified'):
- headers['If-Modified-Since'] = \
- feed_info.feed['planet_http_last_modified']
-
- # issue request
- (resp, content) = h.request(idna, 'GET', headers=headers)
-
- # unchanged detection
- resp['-content-hash'] = md5.new(content or '').hexdigest()
- if resp.status == 200:
- if resp.fromcache:
- resp.status = 304
- elif feed_info.feed.has_key('planet_content_hash') and \
- feed_info.feed['planet_content_hash'] == \
- resp['-content-hash']:
- resp.status = 304
-
- # build a file-like object
- feed = StringIO(content)
- setattr(feed, 'url', resp.get('content-location', uri))
- if resp.has_key('content-encoding'):
- del resp['content-encoding']
- setattr(feed, 'headers', resp)
- except BadStatusLine:
- log.error("Bad Status Line received for %s via %d",
- uri, thread_index)
- except httplib2.HttpLib2Error, e:
- log.error("HttpLib2Error: %s via %d", str(e), thread_index)
- except socket.error, e:
- if e.__class__.__name__.lower()=='timeout':
- feed.headers['status'] = '408'
- log.warn("Timeout in thread-%d", thread_index)
- else:
- log.error("HTTP Error: %s in thread-%d", str(e), thread_index)
- except Exception, e:
- import sys, traceback
- type, value, tb = sys.exc_info()
- log.error('Error processing %s', uri)
- for line in (traceback.format_exception_only(type, value) +
- traceback.format_tb(tb)):
- log.error(line.rstrip())
-
- output_queue.put(block=True, item=(uri, feed_info, feed))
- uri, feed_info = input_queue.get(block=True)
-
-def spiderPlanet(only_if_new = False):
- """ Spider (fetch) an entire planet """
- log = planet.logger
-
- global index
- index = True
-
- timeout = config.feed_timeout()
- try:
- socket.setdefaulttimeout(float(timeout))
- log.info("Socket timeout set to %d seconds", timeout)
- except:
- try:
- import timeoutsocket
- timeoutsocket.setDefaultSocketTimeout(float(timeout))
- log.info("Socket timeout set to %d seconds", timeout)
- except:
- log.warning("Timeout set to invalid value '%s', skipping", timeout)
-
- from Queue import Queue
- from threading import Thread
-
- fetch_queue = Queue()
- parse_queue = Queue()
-
- threads = {}
- http_cache = config.http_cache_directory()
- # Should this be done in config?
- if http_cache and not os.path.exists(http_cache):
- os.makedirs(http_cache)
-
-
- if int(config.spider_threads()):
- # Start all the worker threads
- for i in range(int(config.spider_threads())):
- threads[i] = Thread(target=httpThread,
- args=(i,fetch_queue, parse_queue, log))
- threads[i].start()
- else:
- log.info("Building work queue")
-
- # Load the fetch and parse work queues
- for uri in config.subscriptions():
- # read cached feed info
- sources = config.cache_sources_directory()
- feed_source = filename(sources, uri)
- feed_info = feedparser.parse(feed_source)
-
- if feed_info.feed and only_if_new:
- log.info("Feed %s already in cache", uri)
- continue
- if feed_info.feed.get('planet_http_status',None) == '410':
- log.info("Feed %s gone", uri)
- continue
-
- if threads and _is_http_uri(uri):
- fetch_queue.put(item=(uri, feed_info))
- else:
- parse_queue.put(item=(uri, feed_info, uri))
-
- # Mark the end of the fetch queue
- for thread in threads.keys():
- fetch_queue.put(item=(None, None))
-
- # Process the results as they arrive
- feeds_seen = {}
- while fetch_queue.qsize() or parse_queue.qsize() or threads:
- while parse_queue.qsize() == 0 and threads:
- time.sleep(0.1)
- while parse_queue.qsize():
- (uri, feed_info, feed) = parse_queue.get(False)
- try:
-
- if not hasattr(feed,'headers') or int(feed.headers.status)<300:
- options = {}
- if hasattr(feed_info,'feed'):
- options['etag'] = \
- feed_info.feed.get('planet_http_etag',None)
- try:
- modified=time.strptime(
- feed_info.feed.get('planet_http_last_modified',
- None))
- except:
- pass
-
- data = feedparser.parse(feed, **options)
- else:
- data = feedparser.FeedParserDict({'version': None,
- 'headers': feed.headers, 'entries': [], 'feed': {},
- 'href': feed.url, 'bozo': 0,
- 'status': int(feed.headers.status)})
-
- # duplicate feed?
- id = data.feed.get('id', None)
- if not id: id = feed_info.feed.get('id', None)
-
- href=uri
- if data.has_key('href'): href=data.href
-
- duplicate = None
- if id and id in feeds_seen:
- duplicate = id
- elif href and href in feeds_seen:
- duplicate = href
-
- if duplicate:
- feed_info.feed['planet_message'] = \
- 'duplicate subscription: ' + feeds_seen[duplicate]
- log.warn('Duplicate subscription: %s and %s' %
- (uri, feeds_seen[duplicate]))
- if href: feed_info.feed['planet_http_location'] = href
-
- if id: feeds_seen[id] = uri
- if href: feeds_seen[href] = uri
-
- # complete processing for the feed
- writeCache(uri, feed_info, data)
-
- except Exception, e:
- import sys, traceback
- type, value, tb = sys.exc_info()
- log.error('Error processing %s', uri)
- for line in (traceback.format_exception_only(type, value) +
- traceback.format_tb(tb)):
- log.error(line.rstrip())
-
- for index in threads.keys():
- if not threads[index].isAlive():
- del threads[index]
- if not threads:
- log.info("Finished threaded part of processing.")
Copied: trunk/lib/venus/planet/spider.py (from rev 656, branches/sucs-site/lib/venus/planet/spider.py)
===================================================================
--- trunk/lib/venus/planet/spider.py (rev 0)
+++ trunk/lib/venus/planet/spider.py 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,482 @@
+"""
+Fetch either a single feed, or a set of feeds, normalize to Atom and XHTML,
+and write each as a set of entries in a cache directory.
+"""
+
+# Standard library modules
+import time, calendar, re, os, urlparse
+from xml.dom import minidom
+# Planet modules
+import planet, config, feedparser, reconstitute, shell, socket, scrub
+from StringIO import StringIO
+
+# Regular expressions to sanitise cache filenames
+re_url_scheme = re.compile(r'^\w+:/*(\w+:|www\.)?')
+re_slash = re.compile(r'[?/:|]+')
+re_initial_cruft = re.compile(r'^[,.]*')
+re_final_cruft = re.compile(r'[,.]*$')
+
+index = True
+
+def filename(directory, filename):
+ """Return a filename suitable for the cache.
+
+ Strips dangerous and common characters to create a filename we
+ can use to store the cache in.
+ """
+ try:
+ if re_url_scheme.match(filename):
+ if isinstance(filename,str):
+ filename=filename.decode('utf-8').encode('idna')
+ else:
+ filename=filename.encode('idna')
+ except:
+ pass
+ if isinstance(filename,unicode):
+ filename=filename.encode('utf-8')
+ filename = re_url_scheme.sub("", filename)
+ filename = re_slash.sub(",", filename)
+ filename = re_initial_cruft.sub("", filename)
+ filename = re_final_cruft.sub("", filename)
+
+ # limit length of filename
+ if len(filename)>250:
+ parts=filename.split(',')
+ for i in range(len(parts),0,-1):
+ if len(','.join(parts[:i])) < 220:
+ import md5
+ filename = ','.join(parts[:i]) + ',' + \
+ md5.new(','.join(parts[i:])).hexdigest()
+ break
+
+ return os.path.join(directory, filename)
+
+def write(xdoc, out):
+ """ write the document out to disk """
+ file = open(out,'w')
+ file.write(xdoc)
+ file.close()
+
+def _is_http_uri(uri):
+ parsed = urlparse.urlparse(uri)
+ return parsed[0] in ['http', 'https']
+
+def writeCache(feed_uri, feed_info, data):
+ log = planet.logger
+ sources = config.cache_sources_directory()
+
+ # capture http status
+ if not data.has_key("status"):
+ if data.has_key("entries") and len(data.entries)>0:
+ data.status = 200
+ elif data.bozo and \
+ data.bozo_exception.__class__.__name__.lower()=='timeout':
+ data.status = 408
+ else:
+ data.status = 500
+
+ activity_horizon = \
+ time.gmtime(time.time()-86400*config.activity_threshold(feed_uri))
+
+ # process based on the HTTP status code
+ if data.status == 200 and data.has_key("url"):
+ feed_info.feed['planet_http_location'] = data.url
+ if data.has_key("entries") and len(data.entries) == 0:
+ log.warning("No data %s", feed_uri)
+ feed_info.feed['planet_message'] = 'no data'
+ elif feed_uri == data.url:
+ log.info("Updating feed %s", feed_uri)
+ else:
+ log.info("Updating feed %s @ %s", feed_uri, data.url)
+ elif data.status == 301 and data.has_key("entries") and len(data.entries)>0:
+ log.warning("Feed has moved from <%s> to <%s>", feed_uri, data.url)
+ data.feed['planet_http_location'] = data.url
+ elif data.status == 304 and data.has_key("url"):
+ feed_info.feed['planet_http_location'] = data.url
+ if feed_uri == data.url:
+ log.info("Feed %s unchanged", feed_uri)
+ else:
+ log.info("Feed %s unchanged @ %s", feed_uri, data.url)
+
+ if not feed_info.feed.has_key('planet_message'):
+ if feed_info.feed.has_key('planet_updated'):
+ updated = feed_info.feed.planet_updated
+ if feedparser._parse_date_iso8601(updated) >= activity_horizon:
+ return
+ else:
+ if feed_info.feed.planet_message.startswith("no activity in"):
+ return
+ if not feed_info.feed.planet_message.startswith("duplicate") and \
+ not feed_info.feed.planet_message.startswith("no data"):
+ del feed_info.feed['planet_message']
+
+ elif data.status == 410:
+ log.info("Feed %s gone", feed_uri)
+ elif data.status == 408:
+ log.warning("Feed %s timed out", feed_uri)
+ elif data.status >= 400:
+ log.error("Error %d while updating feed %s", data.status, feed_uri)
+ else:
+ log.info("Updating feed %s", feed_uri)
+
+ # if read failed, retain cached information
+ if not data.version and feed_info.version:
+ data.feed = feed_info.feed
+ data.bozo = feed_info.feed.get('planet_bozo','true') == 'true'
+ data.version = feed_info.feed.get('planet_format')
+ data.feed['planet_http_status'] = str(data.status)
+
+ # capture etag and last-modified information
+ if data.has_key('headers'):
+ if data.has_key('etag') and data.etag:
+ data.feed['planet_http_etag'] = data.etag
+ elif data.headers.has_key('etag') and data.headers['etag']:
+ data.feed['planet_http_etag'] = data.headers['etag']
+
+ if data.headers.has_key('last-modified'):
+ data.feed['planet_http_last_modified']=data.headers['last-modified']
+ elif data.has_key('modified') and data.modified:
+ data.feed['planet_http_last_modified'] = time.asctime(data.modified)
+
+ if data.headers.has_key('-content-hash'):
+ data.feed['planet_content_hash'] = data.headers['-content-hash']
+
+ # capture feed and data from the planet configuration file
+ if data.version:
+ if not data.feed.has_key('links'): data.feed['links'] = list()
+ feedtype = 'application/atom+xml'
+ if data.version.startswith('rss'): feedtype = 'application/rss+xml'
+ if data.version in ['rss090','rss10']: feedtype = 'application/rdf+xml'
+ for link in data.feed.links:
+ if link.rel == 'self':
+ link['type'] = feedtype
+ break
+ else:
+ data.feed.links.append(feedparser.FeedParserDict(
+ {'rel':'self', 'type':feedtype, 'href':feed_uri}))
+ for name, value in config.feed_options(feed_uri).items():
+ data.feed['planet_'+name] = value
+
+ # perform user configured scrub operations on the data
+ scrub.scrub(feed_uri, data)
+
+ from planet import idindex
+ global index
+ if index != None: index = idindex.open()
+
+ # select latest entry for each unique id
+ ids = {}
+ for entry in data.entries:
+ # generate an id, if none is present
+ if not entry.has_key('id') or not entry.id:
+ entry['id'] = reconstitute.id(None, entry)
+ if not entry['id']: continue
+
+ # determine updated date for purposes of selection
+ updated = ''
+ if entry.has_key('published'): updated=entry.published
+ if entry.has_key('updated'): updated=entry.updated
+
+ # if not seen or newer than last seen, select it
+ if updated >= ids.get(entry.id,('',))[0]:
+ ids[entry.id] = (updated, entry)
+
+ # write each entry to the cache
+ cache = config.cache_directory()
+ for updated, entry in ids.values():
+
+ # compute cache file name based on the id
+ cache_file = filename(cache, entry.id)
+
+ # get updated-date either from the entry or the cache (default to now)
+ mtime = None
+ if not entry.has_key('updated_parsed') or not entry['updated_parsed']:
+ entry['updated_parsed'] = entry.get('published_parsed',None)
+ if entry.has_key('updated_parsed'):
+ try:
+ mtime = calendar.timegm(entry.updated_parsed)
+ except:
+ pass
+ if not mtime:
+ try:
+ mtime = os.stat(cache_file).st_mtime
+ except:
+ if data.feed.has_key('updated_parsed'):
+ try:
+ mtime = calendar.timegm(data.feed.updated_parsed)
+ except:
+ pass
+ if not mtime: mtime = time.time()
+ entry['updated_parsed'] = time.gmtime(mtime)
+
+ # apply any filters
+ xdoc = reconstitute.reconstitute(data, entry)
+ output = xdoc.toxml().encode('utf-8')
+ xdoc.unlink()
+ for filter in config.filters(feed_uri):
+ output = shell.run(filter, output, mode="filter")
+ if not output: break
+ if not output:
+ if os.path.exists(cache_file): os.remove(cache_file)
+ continue
+
+ # write out and timestamp the results
+ write(output, cache_file)
+ os.utime(cache_file, (mtime, mtime))
+
+ # optionally index
+ if index != None:
+ feedid = data.feed.get('id', data.feed.get('link',None))
+ if feedid:
+ if type(feedid) == unicode: feedid = feedid.encode('utf-8')
+ index[filename('', entry.id)] = feedid
+
+ if index: index.close()
+
+ # identify inactive feeds
+ if config.activity_threshold(feed_uri):
+ updated = [entry.updated_parsed for entry in data.entries
+ if entry.has_key('updated_parsed')]
+ updated.sort()
+
+ if updated:
+ data.feed['planet_updated'] = \
+ time.strftime("%Y-%m-%dT%H:%M:%SZ", updated[-1])
+ elif data.feed.has_key('planet_updated'):
+ updated = [feedparser._parse_date_iso8601(data.feed.planet_updated)]
+
+ if not updated or updated[-1] < activity_horizon:
+ msg = "no activity in %d days" % config.activity_threshold(feed_uri)
+ log.info(msg)
+ data.feed['planet_message'] = msg
+
+ # report channel level errors
+ if data.status == 226:
+ if data.feed.has_key('planet_message'): del data.feed['planet_message']
+ if feed_info.feed.has_key('planet_updated'):
+ data.feed['planet_updated'] = feed_info.feed['planet_updated']
+ elif data.status == 403:
+ data.feed['planet_message'] = "403: forbidden"
+ elif data.status == 404:
+ data.feed['planet_message'] = "404: not found"
+ elif data.status == 408:
+ data.feed['planet_message'] = "408: request timeout"
+ elif data.status == 410:
+ data.feed['planet_message'] = "410: gone"
+ elif data.status == 500:
+ data.feed['planet_message'] = "internal server error"
+ elif data.status >= 400:
+ data.feed['planet_message'] = "http status %s" % data.status
+
+ # write the feed info to the cache
+ if not os.path.exists(sources): os.makedirs(sources)
+ xdoc=minidom.parseString('''<feed xmlns:planet="%s"
+ xmlns="http://www.w3.org/2005/Atom"/>\n''' % planet.xmlns)
+ reconstitute.source(xdoc.documentElement,data.feed,data.bozo,data.version)
+ write(xdoc.toxml().encode('utf-8'), filename(sources, feed_uri))
+ xdoc.unlink()
+
+def httpThread(thread_index, input_queue, output_queue, log):
+ import httplib2, md5
+ from httplib import BadStatusLine
+
+ h = httplib2.Http(config.http_cache_directory())
+ uri, feed_info = input_queue.get(block=True)
+ while uri:
+ log.info("Fetching %s via %d", uri, thread_index)
+ feed = StringIO('')
+ setattr(feed, 'url', uri)
+ setattr(feed, 'headers',
+ feedparser.FeedParserDict({'status':'500'}))
+ try:
+ # map IRI => URI
+ try:
+ if isinstance(uri,unicode):
+ idna = uri.encode('idna')
+ else:
+ idna = uri.decode('utf-8').encode('idna')
+ if idna != uri: log.info("IRI %s mapped to %s", uri, idna)
+ except:
+ log.info("unable to map %s to a URI", uri)
+ idna = uri
+
+ # cache control headers
+ headers = {}
+ if feed_info.feed.has_key('planet_http_etag'):
+ headers['If-None-Match'] = feed_info.feed['planet_http_etag']
+ if feed_info.feed.has_key('planet_http_last_modified'):
+ headers['If-Modified-Since'] = \
+ feed_info.feed['planet_http_last_modified']
+
+ # issue request
+ (resp, content) = h.request(idna, 'GET', headers=headers)
+
+ # unchanged detection
+ resp['-content-hash'] = md5.new(content or '').hexdigest()
+ if resp.status == 200:
+ if resp.fromcache:
+ resp.status = 304
+ elif feed_info.feed.has_key('planet_content_hash') and \
+ feed_info.feed['planet_content_hash'] == \
+ resp['-content-hash']:
+ resp.status = 304
+
+ # build a file-like object
+ feed = StringIO(content)
+ setattr(feed, 'url', resp.get('content-location', uri))
+ if resp.has_key('content-encoding'):
+ del resp['content-encoding']
+ setattr(feed, 'headers', resp)
+ except BadStatusLine:
+ log.error("Bad Status Line received for %s via %d",
+ uri, thread_index)
+ except httplib2.HttpLib2Error, e:
+ log.error("HttpLib2Error: %s via %d", str(e), thread_index)
+ except socket.error, e:
+ if e.__class__.__name__.lower()=='timeout':
+ feed.headers['status'] = '408'
+ log.warn("Timeout in thread-%d", thread_index)
+ else:
+ log.error("HTTP Error: %s in thread-%d", str(e), thread_index)
+ except Exception, e:
+ import sys, traceback
+ type, value, tb = sys.exc_info()
+ log.error('Error processing %s', uri)
+ for line in (traceback.format_exception_only(type, value) +
+ traceback.format_tb(tb)):
+ log.error(line.rstrip())
+
+ output_queue.put(block=True, item=(uri, feed_info, feed))
+ uri, feed_info = input_queue.get(block=True)
+
+def spiderPlanet(only_if_new = False):
+ """ Spider (fetch) an entire planet """
+ log = planet.logger
+
+ global index
+ index = True
+
+ timeout = config.feed_timeout()
+ try:
+ socket.setdefaulttimeout(float(timeout))
+ log.info("Socket timeout set to %d seconds", timeout)
+ except:
+ try:
+ import timeoutsocket
+ timeoutsocket.setDefaultSocketTimeout(float(timeout))
+ log.info("Socket timeout set to %d seconds", timeout)
+ except:
+ log.warning("Timeout set to invalid value '%s', skipping", timeout)
+
+ from Queue import Queue
+ from threading import Thread
+
+ fetch_queue = Queue()
+ parse_queue = Queue()
+
+ threads = {}
+ http_cache = config.http_cache_directory()
+ # Should this be done in config?
+ if http_cache and not os.path.exists(http_cache):
+ os.makedirs(http_cache)
+
+
+ if int(config.spider_threads()):
+ # Start all the worker threads
+ for i in range(int(config.spider_threads())):
+ threads[i] = Thread(target=httpThread,
+ args=(i,fetch_queue, parse_queue, log))
+ threads[i].start()
+ else:
+ log.info("Building work queue")
+
+ # Load the fetch and parse work queues
+ for uri in config.subscriptions():
+ # read cached feed info
+ sources = config.cache_sources_directory()
+ feed_source = filename(sources, uri)
+ feed_info = feedparser.parse(feed_source)
+
+ if feed_info.feed and only_if_new:
+ log.info("Feed %s already in cache", uri)
+ continue
+ if feed_info.feed.get('planet_http_status',None) == '410':
+ log.info("Feed %s gone", uri)
+ continue
+
+ if threads and _is_http_uri(uri):
+ fetch_queue.put(item=(uri, feed_info))
+ else:
+ parse_queue.put(item=(uri, feed_info, uri))
+
+ # Mark the end of the fetch queue
+ for thread in threads.keys():
+ fetch_queue.put(item=(None, None))
+
+ # Process the results as they arrive
+ feeds_seen = {}
+ while fetch_queue.qsize() or parse_queue.qsize() or threads:
+ while parse_queue.qsize() == 0 and threads:
+ time.sleep(0.1)
+ while parse_queue.qsize():
+ (uri, feed_info, feed) = parse_queue.get(False)
+ try:
+
+ if not hasattr(feed,'headers') or int(feed.headers.status)<300:
+ options = {}
+ if hasattr(feed_info,'feed'):
+ options['etag'] = \
+ feed_info.feed.get('planet_http_etag',None)
+ try:
+ modified=time.strptime(
+ feed_info.feed.get('planet_http_last_modified',
+ None))
+ except:
+ pass
+
+ data = feedparser.parse(feed, **options)
+ else:
+ data = feedparser.FeedParserDict({'version': None,
+ 'headers': feed.headers, 'entries': [], 'feed': {},
+ 'href': feed.url, 'bozo': 0,
+ 'status': int(feed.headers.status)})
+
+ # duplicate feed?
+ id = data.feed.get('id', None)
+ if not id: id = feed_info.feed.get('id', None)
+
+ href=uri
+ if data.has_key('href'): href=data.href
+
+ duplicate = None
+ if id and id in feeds_seen:
+ duplicate = id
+ elif href and href in feeds_seen:
+ duplicate = href
+
+ if duplicate:
+ feed_info.feed['planet_message'] = \
+ 'duplicate subscription: ' + feeds_seen[duplicate]
+ log.warn('Duplicate subscription: %s and %s' %
+ (uri, feeds_seen[duplicate]))
+ if href: feed_info.feed['planet_http_location'] = href
+
+ if id: feeds_seen[id] = uri
+ if href: feeds_seen[href] = uri
+
+ # complete processing for the feed
+ writeCache(uri, feed_info, data)
+
+ except Exception, e:
+ import sys, traceback
+ type, value, tb = sys.exc_info()
+ log.error('Error processing %s', uri)
+ for line in (traceback.format_exception_only(type, value) +
+ traceback.format_tb(tb)):
+ log.error(line.rstrip())
+
+ for index in threads.keys():
+ if not threads[index].isAlive():
+ del threads[index]
+ if not threads:
+ log.info("Finished threaded part of processing.")
Deleted: trunk/lib/venus/planet/splice.py
===================================================================
--- branches/sucs-site/lib/venus/planet/splice.py 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/lib/venus/planet/splice.py 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,167 +0,0 @@
-""" Splice together a planet from a cache of feed entries """
-import glob, os, time, shutil
-from xml.dom import minidom
-import planet, config, feedparser, reconstitute, shell
-from reconstitute import createTextElement, date
-from spider import filename
-from planet import idindex
-
-def splice():
- """ Splice together a planet from a cache of entries """
- import planet
- log = planet.logger
-
- log.info("Loading cached data")
- cache = config.cache_directory()
- dir=[(os.stat(file).st_mtime,file) for file in glob.glob(cache+"/*")
- if not os.path.isdir(file)]
- dir.sort()
- dir.reverse()
-
- max_items=max([config.items_per_page(templ)
- for templ in config.template_files() or ['Planet']])
-
- doc = minidom.parseString('<feed xmlns="http://www.w3.org/2005/Atom"/>')
- feed = doc.documentElement
-
- # insert feed information
- createTextElement(feed, 'title', config.name())
- date(feed, 'updated', time.gmtime())
- gen = createTextElement(feed, 'generator', config.generator())
- gen.setAttribute('uri', config.generator_uri())
-
- author = doc.createElement('author')
- createTextElement(author, 'name', config.owner_name())
- createTextElement(author, 'email', config.owner_email())
- feed.appendChild(author)
-
- if config.feed():
- createTextElement(feed, 'id', config.feed())
- link = doc.createElement('link')
- link.setAttribute('rel', 'self')
- link.setAttribute('href', config.feed())
- if config.feedtype():
- link.setAttribute('type', "application/%s+xml" % config.feedtype())
- feed.appendChild(link)
-
- if config.link():
- link = doc.createElement('link')
- link.setAttribute('rel', 'alternate')
- link.setAttribute('href', config.link())
- feed.appendChild(link)
-
- # insert subscription information
- sub_ids = []
- feed.setAttribute('xmlns:planet',planet.xmlns)
- sources = config.cache_sources_directory()
- for sub in config.subscriptions():
- data=feedparser.parse(filename(sources,sub))
- if data.feed.has_key('id'): sub_ids.append(data.feed.id)
- if not data.feed: continue
- xdoc=minidom.parseString('''<planet:source xmlns:planet="%s"
- xmlns="http://www.w3.org/2005/Atom"/>\n''' % planet.xmlns)
- reconstitute.source(xdoc.documentElement, data.feed, None, None)
- feed.appendChild(xdoc.documentElement)
-
- index = idindex.open()
-
- # insert entry information
- items = 0
- count = {}
- new_feed_items = config.new_feed_items()
- for mtime,file in dir:
- if index != None:
- base = os.path.basename(file)
- if index.has_key(base) and index[base] not in sub_ids: continue
-
- try:
- entry=minidom.parse(file)
-
- # verify that this entry is currently subscribed to and that the
- # number of entries contributed by this feed does not exceed
- # config.new_feed_items
- entry.normalize()
- sources = entry.getElementsByTagName('source')
- if sources:
- ids = sources[0].getElementsByTagName('id')
- if ids:
- id = ids[0].childNodes[0].nodeValue
- count[id] = count.get(id,0) + 1
- if new_feed_items and count[id] > new_feed_items: continue
-
- if id not in sub_ids:
- ids = sources[0].getElementsByTagName('planet:id')
- if not ids: continue
- id = ids[0].childNodes[0].nodeValue
- if id not in sub_ids: continue
-
- # add entry to feed
- feed.appendChild(entry.documentElement)
- items = items + 1
- if items >= max_items: break
- except:
- log.error("Error parsing %s", file)
-
- if index: index.close()
-
- return doc
-
-def apply(doc):
- output_dir = config.output_dir()
- if not os.path.exists(output_dir): os.makedirs(output_dir)
- log = planet.logger
-
- planet_filters = config.filters('Planet')
-
- # Go-go-gadget-template
- for template_file in config.template_files():
- output_file = shell.run(template_file, doc)
-
- # run any template specific filters
- if config.filters(template_file) != planet_filters:
- output = open(output_file).read()
- for filter in config.filters(template_file):
- if filter in planet_filters: continue
- if filter.find('>')>0:
- # tee'd output
- filter,dest = filter.split('>',1)
- tee = shell.run(filter.strip(), output, mode="filter")
- if tee:
- output_dir = planet.config.output_dir()
- dest_file = os.path.join(output_dir, dest.strip())
- dest_file = open(dest_file,'w')
- dest_file.write(tee)
- dest_file.close()
- else:
- # pipe'd output
- output = shell.run(filter, output, mode="filter")
- if not output:
- os.unlink(output_file)
- break
- else:
- handle = open(output_file,'w')
- handle.write(output)
- handle.close()
-
- # Process bill of materials
- for copy_file in config.bill_of_materials():
- dest = os.path.join(output_dir, copy_file)
- for template_dir in config.template_directories():
- source = os.path.join(template_dir, copy_file)
- if os.path.exists(source): break
- else:
- log.error('Unable to locate %s', copy_file)
- log.info("Template search path:")
- for template_dir in config.template_directories():
- log.info(" %s", os.path.realpath(template_dir))
- continue
-
- mtime = os.stat(source).st_mtime
- if not os.path.exists(dest) or os.stat(dest).st_mtime < mtime:
- dest_dir = os.path.split(dest)[0]
- if not os.path.exists(dest_dir): os.makedirs(dest_dir)
-
- log.info("Copying %s to %s", source, dest)
- if os.path.exists(dest): os.chmod(dest, 0644)
- shutil.copyfile(source, dest)
- shutil.copystat(source, dest)
Copied: trunk/lib/venus/planet/splice.py (from rev 656, branches/sucs-site/lib/venus/planet/splice.py)
===================================================================
--- trunk/lib/venus/planet/splice.py (rev 0)
+++ trunk/lib/venus/planet/splice.py 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,167 @@
+""" Splice together a planet from a cache of feed entries """
+import glob, os, time, shutil
+from xml.dom import minidom
+import planet, config, feedparser, reconstitute, shell
+from reconstitute import createTextElement, date
+from spider import filename
+from planet import idindex
+
+def splice():
+ """ Splice together a planet from a cache of entries """
+ import planet
+ log = planet.logger
+
+ log.info("Loading cached data")
+ cache = config.cache_directory()
+ dir=[(os.stat(file).st_mtime,file) for file in glob.glob(cache+"/*")
+ if not os.path.isdir(file)]
+ dir.sort()
+ dir.reverse()
+
+ max_items=max([config.items_per_page(templ)
+ for templ in config.template_files() or ['Planet']])
+
+ doc = minidom.parseString('<feed xmlns="http://www.w3.org/2005/Atom"/>')
+ feed = doc.documentElement
+
+ # insert feed information
+ createTextElement(feed, 'title', config.name())
+ date(feed, 'updated', time.gmtime())
+ gen = createTextElement(feed, 'generator', config.generator())
+ gen.setAttribute('uri', config.generator_uri())
+
+ author = doc.createElement('author')
+ createTextElement(author, 'name', config.owner_name())
+ createTextElement(author, 'email', config.owner_email())
+ feed.appendChild(author)
+
+ if config.feed():
+ createTextElement(feed, 'id', config.feed())
+ link = doc.createElement('link')
+ link.setAttribute('rel', 'self')
+ link.setAttribute('href', config.feed())
+ if config.feedtype():
+ link.setAttribute('type', "application/%s+xml" % config.feedtype())
+ feed.appendChild(link)
+
+ if config.link():
+ link = doc.createElement('link')
+ link.setAttribute('rel', 'alternate')
+ link.setAttribute('href', config.link())
+ feed.appendChild(link)
+
+ # insert subscription information
+ sub_ids = []
+ feed.setAttribute('xmlns:planet',planet.xmlns)
+ sources = config.cache_sources_directory()
+ for sub in config.subscriptions():
+ data=feedparser.parse(filename(sources,sub))
+ if data.feed.has_key('id'): sub_ids.append(data.feed.id)
+ if not data.feed: continue
+ xdoc=minidom.parseString('''<planet:source xmlns:planet="%s"
+ xmlns="http://www.w3.org/2005/Atom"/>\n''' % planet.xmlns)
+ reconstitute.source(xdoc.documentElement, data.feed, None, None)
+ feed.appendChild(xdoc.documentElement)
+
+ index = idindex.open()
+
+ # insert entry information
+ items = 0
+ count = {}
+ new_feed_items = config.new_feed_items()
+ for mtime,file in dir:
+ if index != None:
+ base = os.path.basename(file)
+ if index.has_key(base) and index[base] not in sub_ids: continue
+
+ try:
+ entry=minidom.parse(file)
+
+ # verify that this entry is currently subscribed to and that the
+ # number of entries contributed by this feed does not exceed
+ # config.new_feed_items
+ entry.normalize()
+ sources = entry.getElementsByTagName('source')
+ if sources:
+ ids = sources[0].getElementsByTagName('id')
+ if ids:
+ id = ids[0].childNodes[0].nodeValue
+ count[id] = count.get(id,0) + 1
+ if new_feed_items and count[id] > new_feed_items: continue
+
+ if id not in sub_ids:
+ ids = sources[0].getElementsByTagName('planet:id')
+ if not ids: continue
+ id = ids[0].childNodes[0].nodeValue
+ if id not in sub_ids: continue
+
+ # add entry to feed
+ feed.appendChild(entry.documentElement)
+ items = items + 1
+ if items >= max_items: break
+ except:
+ log.error("Error parsing %s", file)
+
+ if index: index.close()
+
+ return doc
+
+def apply(doc):
+ output_dir = config.output_dir()
+ if not os.path.exists(output_dir): os.makedirs(output_dir)
+ log = planet.logger
+
+ planet_filters = config.filters('Planet')
+
+ # Go-go-gadget-template
+ for template_file in config.template_files():
+ output_file = shell.run(template_file, doc)
+
+ # run any template specific filters
+ if config.filters(template_file) != planet_filters:
+ output = open(output_file).read()
+ for filter in config.filters(template_file):
+ if filter in planet_filters: continue
+ if filter.find('>')>0:
+ # tee'd output
+ filter,dest = filter.split('>',1)
+ tee = shell.run(filter.strip(), output, mode="filter")
+ if tee:
+ output_dir = planet.config.output_dir()
+ dest_file = os.path.join(output_dir, dest.strip())
+ dest_file = open(dest_file,'w')
+ dest_file.write(tee)
+ dest_file.close()
+ else:
+ # pipe'd output
+ output = shell.run(filter, output, mode="filter")
+ if not output:
+ os.unlink(output_file)
+ break
+ else:
+ handle = open(output_file,'w')
+ handle.write(output)
+ handle.close()
+
+ # Process bill of materials
+ for copy_file in config.bill_of_materials():
+ dest = os.path.join(output_dir, copy_file)
+ for template_dir in config.template_directories():
+ source = os.path.join(template_dir, copy_file)
+ if os.path.exists(source): break
+ else:
+ log.error('Unable to locate %s', copy_file)
+ log.info("Template search path:")
+ for template_dir in config.template_directories():
+ log.info(" %s", os.path.realpath(template_dir))
+ continue
+
+ mtime = os.stat(source).st_mtime
+ if not os.path.exists(dest) or os.stat(dest).st_mtime < mtime:
+ dest_dir = os.path.split(dest)[0]
+ if not os.path.exists(dest_dir): os.makedirs(dest_dir)
+
+ log.info("Copying %s to %s", source, dest)
+ if os.path.exists(dest): os.chmod(dest, 0644)
+ shutil.copyfile(source, dest)
+ shutil.copystat(source, dest)
Deleted: trunk/lib/venus/planet/vendor/compat_logging/__init__.py
===================================================================
--- branches/sucs-site/lib/venus/planet/vendor/compat_logging/__init__.py 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/lib/venus/planet/vendor/compat_logging/__init__.py 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,1196 +0,0 @@
-# Copyright 2001-2002 by Vinay Sajip. All Rights Reserved.
-#
-# Permission to use, copy, modify, and distribute this software and its
-# documentation for any purpose and without fee is hereby granted,
-# provided that the above copyright notice appear in all copies and that
-# both that copyright notice and this permission notice appear in
-# supporting documentation, and that the name of Vinay Sajip
-# not be used in advertising or publicity pertaining to distribution
-# of the software without specific, written prior permission.
-# VINAY SAJIP DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
-# ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL
-# VINAY SAJIP BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
-# ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER
-# IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
-# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-"""
-Logging package for Python. Based on PEP 282 and comments thereto in
-comp.lang.python, and influenced by Apache's log4j system.
-
-Should work under Python versions >= 1.5.2, except that source line
-information is not available unless 'sys._getframe()' is.
-
-Copyright (C) 2001-2002 Vinay Sajip. All Rights Reserved.
-
-To use, simply 'import logging' and log away!
-"""
-
-import sys, os, types, time, string, cStringIO
-
-try:
- import thread
- import threading
-except ImportError:
- thread = None
-
-__author__ = "Vinay Sajip <vinay_sajip at red-dove.com>"
-__status__ = "beta"
-__version__ = "0.4.8.1"
-__date__ = "26 June 2003"
-
-#---------------------------------------------------------------------------
-# Miscellaneous module data
-#---------------------------------------------------------------------------
-
-#
-#_srcfile is used when walking the stack to check when we've got the first
-# caller stack frame.
-#
-if string.lower(__file__[-4:]) in ['.pyc', '.pyo']:
- _srcfile = __file__[:-4] + '.py'
-else:
- _srcfile = __file__
-_srcfile = os.path.normcase(_srcfile)
-
-# _srcfile is only used in conjunction with sys._getframe().
-# To provide compatibility with older versions of Python, set _srcfile
-# to None if _getframe() is not available; this value will prevent
-# findCaller() from being called.
-if not hasattr(sys, "_getframe"):
- _srcfile = None
-
-#
-#_startTime is used as the base when calculating the relative time of events
-#
-_startTime = time.time()
-
-#
-#raiseExceptions is used to see if exceptions during handling should be
-#propagated
-#
-raiseExceptions = 1
-
-#---------------------------------------------------------------------------
-# Level related stuff
-#---------------------------------------------------------------------------
-#
-# Default levels and level names, these can be replaced with any positive set
-# of values having corresponding names. There is a pseudo-level, NOTSET, which
-# is only really there as a lower limit for user-defined levels. Handlers and
-# loggers are initialized with NOTSET so that they will log all messages, even
-# at user-defined levels.
-#
-CRITICAL = 50
-FATAL = CRITICAL
-ERROR = 40
-WARNING = 30
-WARN = WARNING
-INFO = 20
-DEBUG = 10
-NOTSET = 0
-
-_levelNames = {
- CRITICAL : 'CRITICAL',
- ERROR : 'ERROR',
- WARNING : 'WARNING',
- INFO : 'INFO',
- DEBUG : 'DEBUG',
- NOTSET : 'NOTSET',
- 'CRITICAL' : CRITICAL,
- 'ERROR' : ERROR,
- 'WARN' : WARNING,
- 'WARNING' : WARNING,
- 'INFO' : INFO,
- 'DEBUG' : DEBUG,
- 'NOTSET' : NOTSET,
-}
-
-def getLevelName(level):
- """
- Return the textual representation of logging level 'level'.
-
- If the level is one of the predefined levels (CRITICAL, ERROR, WARNING,
- INFO, DEBUG) then you get the corresponding string. If you have
- associated levels with names using addLevelName then the name you have
- associated with 'level' is returned. Otherwise, the string
- "Level %s" % level is returned.
- """
- return _levelNames.get(level, ("Level %s" % level))
-
-def addLevelName(level, levelName):
- """
- Associate 'levelName' with 'level'.
-
- This is used when converting levels to text during message formatting.
- """
- _acquireLock()
- try: #unlikely to cause an exception, but you never know...
- _levelNames[level] = levelName
- _levelNames[levelName] = level
- finally:
- _releaseLock()
-
-#---------------------------------------------------------------------------
-# Thread-related stuff
-#---------------------------------------------------------------------------
-
-#
-#_lock is used to serialize access to shared data structures in this module.
-#This needs to be an RLock because fileConfig() creates Handlers and so
-#might arbitrary user threads. Since Handler.__init__() updates the shared
-#dictionary _handlers, it needs to acquire the lock. But if configuring,
-#the lock would already have been acquired - so we need an RLock.
-#The same argument applies to Loggers and Manager.loggerDict.
-#
-_lock = None
-
-def _acquireLock():
- """
- Acquire the module-level lock for serializing access to shared data.
-
- This should be released with _releaseLock().
- """
- global _lock
- if (not _lock) and thread:
- _lock = threading.RLock()
- if _lock:
- _lock.acquire()
-
-def _releaseLock():
- """
- Release the module-level lock acquired by calling _acquireLock().
- """
- if _lock:
- _lock.release()
-
-#---------------------------------------------------------------------------
-# The logging record
-#---------------------------------------------------------------------------
-
-class LogRecord:
- """
- A LogRecord instance represents an event being logged.
-
- LogRecord instances are created every time something is logged. They
- contain all the information pertinent to the event being logged. The
- main information passed in is in msg and args, which are combined
- using str(msg) % args to create the message field of the record. The
- record also includes information such as when the record was created,
- the source line where the logging call was made, and any exception
- information to be logged.
- """
- def __init__(self, name, level, pathname, lineno, msg, args, exc_info):
- """
- Initialize a logging record with interesting information.
- """
- ct = time.time()
- self.name = name
- self.msg = msg
- self.args = args
- self.levelname = getLevelName(level)
- self.levelno = level
- self.pathname = pathname
- try:
- self.filename = os.path.basename(pathname)
- self.module = os.path.splitext(self.filename)[0]
- except:
- self.filename = pathname
- self.module = "Unknown module"
- self.exc_info = exc_info
- self.lineno = lineno
- self.created = ct
- self.msecs = (ct - long(ct)) * 1000
- self.relativeCreated = (self.created - _startTime) * 1000
- if thread:
- self.thread = thread.get_ident()
- else:
- self.thread = None
- if hasattr(os, 'getpid'):
- self.process = os.getpid()
- else:
- self.process = None
-
- def __str__(self):
- return '<LogRecord: %s, %s, %s, %s, "%s">'%(self.name, self.levelno,
- self.pathname, self.lineno, self.msg)
-
- def getMessage(self):
- """
- Return the message for this LogRecord.
-
- Return the message for this LogRecord after merging any user-supplied
- arguments with the message.
- """
- if not hasattr(types, "UnicodeType"): #if no unicode support...
- msg = str(self.msg)
- else:
- try:
- msg = str(self.msg)
- except UnicodeError:
- msg = self.msg #Defer encoding till later
- if self.args:
- msg = msg % self.args
- return msg
-
-def makeLogRecord(dict):
- """
- Make a LogRecord whose attributes are defined by the specified dictionary,
- This function is useful for converting a logging event received over
- a socket connection (which is sent as a dictionary) into a LogRecord
- instance.
- """
- rv = LogRecord(None, None, "", 0, "", (), None)
- rv.__dict__.update(dict)
- return rv
-
-#---------------------------------------------------------------------------
-# Formatter classes and functions
-#---------------------------------------------------------------------------
-
-class Formatter:
- """
- Formatter instances are used to convert a LogRecord to text.
-
- Formatters need to know how a LogRecord is constructed. They are
- responsible for converting a LogRecord to (usually) a string which can
- be interpreted by either a human or an external system. The base Formatter
- allows a formatting string to be specified. If none is supplied, the
- default value of "%s(message)\\n" is used.
-
- The Formatter can be initialized with a format string which makes use of
- knowledge of the LogRecord attributes - e.g. the default value mentioned
- above makes use of the fact that the user's message and arguments are pre-
- formatted into a LogRecord's message attribute. Currently, the useful
- attributes in a LogRecord are described by:
-
- %(name)s Name of the logger (logging channel)
- %(levelno)s Numeric logging level for the message (DEBUG, INFO,
- WARNING, ERROR, CRITICAL)
- %(levelname)s Text logging level for the message ("DEBUG", "INFO",
- "WARNING", "ERROR", "CRITICAL")
- %(pathname)s Full pathname of the source file where the logging
- call was issued (if available)
- %(filename)s Filename portion of pathname
- %(module)s Module (name portion of filename)
- %(lineno)d Source line number where the logging call was issued
- (if available)
- %(created)f Time when the LogRecord was created (time.time()
- return value)
- %(asctime)s Textual time when the LogRecord was created
- %(msecs)d Millisecond portion of the creation time
- %(relativeCreated)d Time in milliseconds when the LogRecord was created,
- relative to the time the logging module was loaded
- (typically at application startup time)
- %(thread)d Thread ID (if available)
- %(process)d Process ID (if available)
- %(message)s The result of record.getMessage(), computed just as
- the record is emitted
- """
-
- converter = time.localtime
-
- def __init__(self, fmt=None, datefmt=None):
- """
- Initialize the formatter with specified format strings.
-
- Initialize the formatter either with the specified format string, or a
- default as described above. Allow for specialized date formatting with
- the optional datefmt argument (if omitted, you get the ISO8601 format).
- """
- if fmt:
- self._fmt = fmt
- else:
- self._fmt = "%(message)s"
- self.datefmt = datefmt
-
- def formatTime(self, record, datefmt=None):
- """
- Return the creation time of the specified LogRecord as formatted text.
-
- This method should be called from format() by a formatter which
- wants to make use of a formatted time. This method can be overridden
- in formatters to provide for any specific requirement, but the
- basic behaviour is as follows: if datefmt (a string) is specified,
- it is used with time.strftime() to format the creation time of the
- record. Otherwise, the ISO8601 format is used. The resulting
- string is returned. This function uses a user-configurable function
- to convert the creation time to a tuple. By default, time.localtime()
- is used; to change this for a particular formatter instance, set the
- 'converter' attribute to a function with the same signature as
- time.localtime() or time.gmtime(). To change it for all formatters,
- for example if you want all logging times to be shown in GMT,
- set the 'converter' attribute in the Formatter class.
- """
- ct = self.converter(record.created)
- if datefmt:
- s = time.strftime(datefmt, ct)
- else:
- t = time.strftime("%Y-%m-%d %H:%M:%S", ct)
- s = "%s,%03d" % (t, record.msecs)
- return s
-
- def formatException(self, ei):
- """
- Format and return the specified exception information as a string.
-
- This default implementation just uses
- traceback.print_exception()
- """
- import traceback
- sio = cStringIO.StringIO()
- traceback.print_exception(ei[0], ei[1], ei[2], None, sio)
- s = sio.getvalue()
- sio.close()
- if s[-1] == "\n":
- s = s[:-1]
- return s
-
- def format(self, record):
- """
- Format the specified record as text.
-
- The record's attribute dictionary is used as the operand to a
- string formatting operation which yields the returned string.
- Before formatting the dictionary, a couple of preparatory steps
- are carried out. The message attribute of the record is computed
- using LogRecord.getMessage(). If the formatting string contains
- "%(asctime)", formatTime() is called to format the event time.
- If there is exception information, it is formatted using
- formatException() and appended to the message.
- """
- record.message = record.getMessage()
- if string.find(self._fmt,"%(asctime)") >= 0:
- record.asctime = self.formatTime(record, self.datefmt)
- s = self._fmt % record.__dict__
- if record.exc_info:
- if s[-1] != "\n":
- s = s + "\n"
- s = s + self.formatException(record.exc_info)
- return s
-
-#
-# The default formatter to use when no other is specified
-#
-_defaultFormatter = Formatter()
-
-class BufferingFormatter:
- """
- A formatter suitable for formatting a number of records.
- """
- def __init__(self, linefmt=None):
- """
- Optionally specify a formatter which will be used to format each
- individual record.
- """
- if linefmt:
- self.linefmt = linefmt
- else:
- self.linefmt = _defaultFormatter
-
- def formatHeader(self, records):
- """
- Return the header string for the specified records.
- """
- return ""
-
- def formatFooter(self, records):
- """
- Return the footer string for the specified records.
- """
- return ""
-
- def format(self, records):
- """
- Format the specified records and return the result as a string.
- """
- rv = ""
- if len(records) > 0:
- rv = rv + self.formatHeader(records)
- for record in records:
- rv = rv + self.linefmt.format(record)
- rv = rv + self.formatFooter(records)
- return rv
-
-#---------------------------------------------------------------------------
-# Filter classes and functions
-#---------------------------------------------------------------------------
-
-class Filter:
- """
- Filter instances are used to perform arbitrary filtering of LogRecords.
-
- Loggers and Handlers can optionally use Filter instances to filter
- records as desired. The base filter class only allows events which are
- below a certain point in the logger hierarchy. For example, a filter
- initialized with "A.B" will allow events logged by loggers "A.B",
- "A.B.C", "A.B.C.D", "A.B.D" etc. but not "A.BB", "B.A.B" etc. If
- initialized with the empty string, all events are passed.
- """
- def __init__(self, name=''):
- """
- Initialize a filter.
-
- Initialize with the name of the logger which, together with its
- children, will have its events allowed through the filter. If no
- name is specified, allow every event.
- """
- self.name = name
- self.nlen = len(name)
-
- def filter(self, record):
- """
- Determine if the specified record is to be logged.
-
- Is the specified record to be logged? Returns 0 for no, nonzero for
- yes. If deemed appropriate, the record may be modified in-place.
- """
- if self.nlen == 0:
- return 1
- elif self.name == record.name:
- return 1
- elif string.find(record.name, self.name, 0, self.nlen) != 0:
- return 0
- return (record.name[self.nlen] == ".")
-
-class Filterer:
- """
- A base class for loggers and handlers which allows them to share
- common code.
- """
- def __init__(self):
- """
- Initialize the list of filters to be an empty list.
- """
- self.filters = []
-
- def addFilter(self, filter):
- """
- Add the specified filter to this handler.
- """
- if not (filter in self.filters):
- self.filters.append(filter)
-
- def removeFilter(self, filter):
- """
- Remove the specified filter from this handler.
- """
- if filter in self.filters:
- self.filters.remove(filter)
-
- def filter(self, record):
- """
- Determine if a record is loggable by consulting all the filters.
-
- The default is to allow the record to be logged; any filter can veto
- this and the record is then dropped. Returns a zero value if a record
- is to be dropped, else non-zero.
- """
- rv = 1
- for f in self.filters:
- if not f.filter(record):
- rv = 0
- break
- return rv
-
-#---------------------------------------------------------------------------
-# Handler classes and functions
-#---------------------------------------------------------------------------
-
-_handlers = {} #repository of handlers (for flushing when shutdown called)
-
-class Handler(Filterer):
- """
- Handler instances dispatch logging events to specific destinations.
-
- The base handler class. Acts as a placeholder which defines the Handler
- interface. Handlers can optionally use Formatter instances to format
- records as desired. By default, no formatter is specified; in this case,
- the 'raw' message as determined by record.message is logged.
- """
- def __init__(self, level=NOTSET):
- """
- Initializes the instance - basically setting the formatter to None
- and the filter list to empty.
- """
- Filterer.__init__(self)
- self.level = level
- self.formatter = None
- #get the module data lock, as we're updating a shared structure.
- _acquireLock()
- try: #unlikely to raise an exception, but you never know...
- _handlers[self] = 1
- finally:
- _releaseLock()
- self.createLock()
-
- def createLock(self):
- """
- Acquire a thread lock for serializing access to the underlying I/O.
- """
- if thread:
- self.lock = thread.allocate_lock()
- else:
- self.lock = None
-
- def acquire(self):
- """
- Acquire the I/O thread lock.
- """
- if self.lock:
- self.lock.acquire()
-
- def release(self):
- """
- Release the I/O thread lock.
- """
- if self.lock:
- self.lock.release()
-
- def setLevel(self, level):
- """
- Set the logging level of this handler.
- """
- self.level = level
-
- def format(self, record):
- """
- Format the specified record.
-
- If a formatter is set, use it. Otherwise, use the default formatter
- for the module.
- """
- if self.formatter:
- fmt = self.formatter
- else:
- fmt = _defaultFormatter
- return fmt.format(record)
-
- def emit(self, record):
- """
- Do whatever it takes to actually log the specified logging record.
-
- This version is intended to be implemented by subclasses and so
- raises a NotImplementedError.
- """
- raise NotImplementedError, 'emit must be implemented '\
- 'by Handler subclasses'
-
- def handle(self, record):
- """
- Conditionally emit the specified logging record.
-
- Emission depends on filters which may have been added to the handler.
- Wrap the actual emission of the record with acquisition/release of
- the I/O thread lock. Returns whether the filter passed the record for
- emission.
- """
- rv = self.filter(record)
- if rv:
- self.acquire()
- try:
- self.emit(record)
- finally:
- self.release()
- return rv
-
- def setFormatter(self, fmt):
- """
- Set the formatter for this handler.
- """
- self.formatter = fmt
-
- def flush(self):
- """
- Ensure all logging output has been flushed.
-
- This version does nothing and is intended to be implemented by
- subclasses.
- """
- pass
-
- def close(self):
- """
- Tidy up any resources used by the handler.
-
- This version does nothing and is intended to be implemented by
- subclasses.
- """
- pass
-
- def handleError(self, record):
- """
- Handle errors which occur during an emit() call.
-
- This method should be called from handlers when an exception is
- encountered during an emit() call. If raiseExceptions is false,
- exceptions get silently ignored. This is what is mostly wanted
- for a logging system - most users will not care about errors in
- the logging system, they are more interested in application errors.
- You could, however, replace this with a custom handler if you wish.
- The record which was being processed is passed in to this method.
- """
- if raiseExceptions:
- import traceback
- ei = sys.exc_info()
- traceback.print_exception(ei[0], ei[1], ei[2], None, sys.stderr)
- del ei
-
-class StreamHandler(Handler):
- """
- A handler class which writes logging records, appropriately formatted,
- to a stream. Note that this class does not close the stream, as
- sys.stdout or sys.stderr may be used.
- """
- def __init__(self, strm=None):
- """
- Initialize the handler.
-
- If strm is not specified, sys.stderr is used.
- """
- Handler.__init__(self)
- if not strm:
- strm = sys.stderr
- self.stream = strm
- self.formatter = None
-
- def flush(self):
- """
- Flushes the stream.
- """
- self.stream.flush()
-
- def emit(self, record):
- """
- Emit a record.
-
- If a formatter is specified, it is used to format the record.
- The record is then written to the stream with a trailing newline
- [N.B. this may be removed depending on feedback]. If exception
- information is present, it is formatted using
- traceback.print_exception and appended to the stream.
- """
- try:
- msg = self.format(record)
- if not hasattr(types, "UnicodeType"): #if no unicode support...
- self.stream.write("%s\n" % msg)
- else:
- try:
- self.stream.write("%s\n" % msg)
- except UnicodeError:
- self.stream.write("%s\n" % msg.encode("UTF-8"))
- self.flush()
- except:
- self.handleError(record)
-
-class FileHandler(StreamHandler):
- """
- A handler class which writes formatted logging records to disk files.
- """
- def __init__(self, filename, mode="a"):
- """
- Open the specified file and use it as the stream for logging.
- """
- StreamHandler.__init__(self, open(filename, mode))
- self.baseFilename = filename
- self.mode = mode
-
- def close(self):
- """
- Closes the stream.
- """
- self.stream.close()
-
-#---------------------------------------------------------------------------
-# Manager classes and functions
-#---------------------------------------------------------------------------
-
-class PlaceHolder:
- """
- PlaceHolder instances are used in the Manager logger hierarchy to take
- the place of nodes for which no loggers have been defined [FIXME add
- example].
- """
- def __init__(self, alogger):
- """
- Initialize with the specified logger being a child of this placeholder.
- """
- self.loggers = [alogger]
-
- def append(self, alogger):
- """
- Add the specified logger as a child of this placeholder.
- """
- if alogger not in self.loggers:
- self.loggers.append(alogger)
-
-#
-# Determine which class to use when instantiating loggers.
-#
-_loggerClass = None
-
-def setLoggerClass(klass):
- """
- Set the class to be used when instantiating a logger. The class should
- define __init__() such that only a name argument is required, and the
- __init__() should call Logger.__init__()
- """
- if klass != Logger:
- if not issubclass(klass, Logger):
- raise TypeError, "logger not derived from logging.Logger: " + \
- klass.__name__
- global _loggerClass
- _loggerClass = klass
-
-class Manager:
- """
- There is [under normal circumstances] just one Manager instance, which
- holds the hierarchy of loggers.
- """
- def __init__(self, rootnode):
- """
- Initialize the manager with the root node of the logger hierarchy.
- """
- self.root = rootnode
- self.disable = 0
- self.emittedNoHandlerWarning = 0
- self.loggerDict = {}
-
- def getLogger(self, name):
- """
- Get a logger with the specified name (channel name), creating it
- if it doesn't yet exist.
-
- If a PlaceHolder existed for the specified name [i.e. the logger
- didn't exist but a child of it did], replace it with the created
- logger and fix up the parent/child references which pointed to the
- placeholder to now point to the logger.
- """
- rv = None
- _acquireLock()
- try:
- if self.loggerDict.has_key(name):
- rv = self.loggerDict[name]
- if isinstance(rv, PlaceHolder):
- ph = rv
- rv = _loggerClass(name)
- rv.manager = self
- self.loggerDict[name] = rv
- self._fixupChildren(ph, rv)
- self._fixupParents(rv)
- else:
- rv = _loggerClass(name)
- rv.manager = self
- self.loggerDict[name] = rv
- self._fixupParents(rv)
- finally:
- _releaseLock()
- return rv
-
- def _fixupParents(self, alogger):
- """
- Ensure that there are either loggers or placeholders all the way
- from the specified logger to the root of the logger hierarchy.
- """
- name = alogger.name
- i = string.rfind(name, ".")
- rv = None
- while (i > 0) and not rv:
- substr = name[:i]
- if not self.loggerDict.has_key(substr):
- self.loggerDict[substr] = PlaceHolder(alogger)
- else:
- obj = self.loggerDict[substr]
- if isinstance(obj, Logger):
- rv = obj
- else:
- assert isinstance(obj, PlaceHolder)
- obj.append(alogger)
- i = string.rfind(name, ".", 0, i - 1)
- if not rv:
- rv = self.root
- alogger.parent = rv
-
- def _fixupChildren(self, ph, alogger):
- """
- Ensure that children of the placeholder ph are connected to the
- specified logger.
- """
- for c in ph.loggers:
- if string.find(c.parent.name, alogger.name) <> 0:
- alogger.parent = c.parent
- c.parent = alogger
-
-#---------------------------------------------------------------------------
-# Logger classes and functions
-#---------------------------------------------------------------------------
-
-class Logger(Filterer):
- """
- Instances of the Logger class represent a single logging channel. A
- "logging channel" indicates an area of an application. Exactly how an
- "area" is defined is up to the application developer. Since an
- application can have any number of areas, logging channels are identified
- by a unique string. Application areas can be nested (e.g. an area
- of "input processing" might include sub-areas "read CSV files", "read
- XLS files" and "read Gnumeric files"). To cater for this natural nesting,
- channel names are organized into a namespace hierarchy where levels are
- separated by periods, much like the Java or Python package namespace. So
- in the instance given above, channel names might be "input" for the upper
- level, and "input.csv", "input.xls" and "input.gnu" for the sub-levels.
- There is no arbitrary limit to the depth of nesting.
- """
- def __init__(self, name, level=NOTSET):
- """
- Initialize the logger with a name and an optional level.
- """
- Filterer.__init__(self)
- self.name = name
- self.level = level
- self.parent = None
- self.propagate = 1
- self.handlers = []
- self.disabled = 0
-
- def setLevel(self, level):
- """
- Set the logging level of this logger.
- """
- self.level = level
-
-# def getRoot(self):
-# """
-# Get the root of the logger hierarchy.
-# """
-# return Logger.root
-
- def debug(self, msg, *args, **kwargs):
- """
- Log 'msg % args' with severity 'DEBUG'.
-
- To pass exception information, use the keyword argument exc_info with
- a true value, e.g.
-
- logger.debug("Houston, we have a %s", "thorny problem", exc_info=1)
- """
- if self.manager.disable >= DEBUG:
- return
- if DEBUG >= self.getEffectiveLevel():
- apply(self._log, (DEBUG, msg, args), kwargs)
-
- def info(self, msg, *args, **kwargs):
- """
- Log 'msg % args' with severity 'INFO'.
-
- To pass exception information, use the keyword argument exc_info with
- a true value, e.g.
-
- logger.info("Houston, we have a %s", "interesting problem", exc_info=1)
- """
- if self.manager.disable >= INFO:
- return
- if INFO >= self.getEffectiveLevel():
- apply(self._log, (INFO, msg, args), kwargs)
-
- def warning(self, msg, *args, **kwargs):
- """
- Log 'msg % args' with severity 'WARNING'.
-
- To pass exception information, use the keyword argument exc_info with
- a true value, e.g.
-
- logger.warning("Houston, we have a %s", "bit of a problem", exc_info=1)
- """
- if self.manager.disable >= WARNING:
- return
- if self.isEnabledFor(WARNING):
- apply(self._log, (WARNING, msg, args), kwargs)
-
- warn = warning
-
- def error(self, msg, *args, **kwargs):
- """
- Log 'msg % args' with severity 'ERROR'.
-
- To pass exception information, use the keyword argument exc_info with
- a true value, e.g.
-
- logger.error("Houston, we have a %s", "major problem", exc_info=1)
- """
- if self.manager.disable >= ERROR:
- return
- if self.isEnabledFor(ERROR):
- apply(self._log, (ERROR, msg, args), kwargs)
-
- def exception(self, msg, *args):
- """
- Convenience method for logging an ERROR with exception information.
- """
- apply(self.error, (msg,) + args, {'exc_info': 1})
-
- def critical(self, msg, *args, **kwargs):
- """
- Log 'msg % args' with severity 'CRITICAL'.
-
- To pass exception information, use the keyword argument exc_info with
- a true value, e.g.
-
- logger.critical("Houston, we have a %s", "major disaster", exc_info=1)
- """
- if self.manager.disable >= CRITICAL:
- return
- if CRITICAL >= self.getEffectiveLevel():
- apply(self._log, (CRITICAL, msg, args), kwargs)
-
- fatal = critical
-
- def log(self, level, msg, *args, **kwargs):
- """
- Log 'msg % args' with the severity 'level'.
-
- To pass exception information, use the keyword argument exc_info with
- a true value, e.g.
-
- logger.log(level, "We have a %s", "mysterious problem", exc_info=1)
- """
- if self.manager.disable >= level:
- return
- if self.isEnabledFor(level):
- apply(self._log, (level, msg, args), kwargs)
-
- def findCaller(self):
- """
- Find the stack frame of the caller so that we can note the source
- file name and line number.
- """
- f = sys._getframe(1)
- while 1:
- co = f.f_code
- filename = os.path.normcase(co.co_filename)
- if filename == _srcfile:
- f = f.f_back
- continue
- return filename, f.f_lineno
-
- def makeRecord(self, name, level, fn, lno, msg, args, exc_info):
- """
- A factory method which can be overridden in subclasses to create
- specialized LogRecords.
- """
- return LogRecord(name, level, fn, lno, msg, args, exc_info)
-
- def _log(self, level, msg, args, exc_info=None):
- """
- Low-level logging routine which creates a LogRecord and then calls
- all the handlers of this logger to handle the record.
- """
- if _srcfile:
- fn, lno = self.findCaller()
- else:
- fn, lno = "<unknown file>", 0
- if exc_info:
- exc_info = sys.exc_info()
- record = self.makeRecord(self.name, level, fn, lno, msg, args, exc_info)
- self.handle(record)
-
- def handle(self, record):
- """
- Call the handlers for the specified record.
-
- This method is used for unpickled records received from a socket, as
- well as those created locally. Logger-level filtering is applied.
- """
- if (not self.disabled) and self.filter(record):
- self.callHandlers(record)
-
- def addHandler(self, hdlr):
- """
- Add the specified handler to this logger.
- """
- if not (hdlr in self.handlers):
- self.handlers.append(hdlr)
-
- def removeHandler(self, hdlr):
- """
- Remove the specified handler from this logger.
- """
- if hdlr in self.handlers:
- #hdlr.close()
- self.handlers.remove(hdlr)
-
- def callHandlers(self, record):
- """
- Pass a record to all relevant handlers.
-
- Loop through all handlers for this logger and its parents in the
- logger hierarchy. If no handler was found, output a one-off error
- message to sys.stderr. Stop searching up the hierarchy whenever a
- logger with the "propagate" attribute set to zero is found - that
- will be the last logger whose handlers are called.
- """
- c = self
- found = 0
- while c:
- for hdlr in c.handlers:
- found = found + 1
- if record.levelno >= hdlr.level:
- hdlr.handle(record)
- if not c.propagate:
- c = None #break out
- else:
- c = c.parent
- if (found == 0) and not self.manager.emittedNoHandlerWarning:
- sys.stderr.write("No handlers could be found for logger"
- " \"%s\"\n" % self.name)
- self.manager.emittedNoHandlerWarning = 1
-
- def getEffectiveLevel(self):
- """
- Get the effective level for this logger.
-
- Loop through this logger and its parents in the logger hierarchy,
- looking for a non-zero logging level. Return the first one found.
- """
- logger = self
- while logger:
- if logger.level:
- return logger.level
- logger = logger.parent
- return NOTSET
-
- def isEnabledFor(self, level):
- """
- Is this logger enabled for level 'level'?
- """
- if self.manager.disable >= level:
- return 0
- return level >= self.getEffectiveLevel()
-
-class RootLogger(Logger):
- """
- A root logger is not that different to any other logger, except that
- it must have a logging level and there is only one instance of it in
- the hierarchy.
- """
- def __init__(self, level):
- """
- Initialize the logger with the name "root".
- """
- Logger.__init__(self, "root", level)
-
-_loggerClass = Logger
-
-root = RootLogger(WARNING)
-Logger.root = root
-Logger.manager = Manager(Logger.root)
-
-#---------------------------------------------------------------------------
-# Configuration classes and functions
-#---------------------------------------------------------------------------
-
-BASIC_FORMAT = "%(levelname)s:%(name)s:%(message)s"
-
-def basicConfig(format=BASIC_FORMAT):
- """
- Do basic configuration for the logging system by creating a
- StreamHandler with a default Formatter and adding it to the
- root logger.
- """
- if len(root.handlers) == 0:
- hdlr = StreamHandler()
- fmt = Formatter(format)
- hdlr.setFormatter(fmt)
- root.addHandler(hdlr)
-
-#---------------------------------------------------------------------------
-# Utility functions at module level.
-# Basically delegate everything to the root logger.
-#---------------------------------------------------------------------------
-
-def getLogger(name=None):
- """
- Return a logger with the specified name, creating it if necessary.
-
- If no name is specified, return the root logger.
- """
- if name:
- return Logger.manager.getLogger(name)
- else:
- return root
-
-#def getRootLogger():
-# """
-# Return the root logger.
-#
-# Note that getLogger('') now does the same thing, so this function is
-# deprecated and may disappear in the future.
-# """
-# return root
-
-def critical(msg, *args, **kwargs):
- """
- Log a message with severity 'CRITICAL' on the root logger.
- """
- if len(root.handlers) == 0:
- basicConfig()
- apply(root.critical, (msg,)+args, kwargs)
-
-fatal = critical
-
-def error(msg, *args, **kwargs):
- """
- Log a message with severity 'ERROR' on the root logger.
- """
- if len(root.handlers) == 0:
- basicConfig()
- apply(root.error, (msg,)+args, kwargs)
-
-def exception(msg, *args):
- """
- Log a message with severity 'ERROR' on the root logger,
- with exception information.
- """
- apply(error, (msg,)+args, {'exc_info': 1})
-
-def warning(msg, *args, **kwargs):
- """
- Log a message with severity 'WARNING' on the root logger.
- """
- if len(root.handlers) == 0:
- basicConfig()
- apply(root.warning, (msg,)+args, kwargs)
-
-warn = warning
-
-def info(msg, *args, **kwargs):
- """
- Log a message with severity 'INFO' on the root logger.
- """
- if len(root.handlers) == 0:
- basicConfig()
- apply(root.info, (msg,)+args, kwargs)
-
-def debug(msg, *args, **kwargs):
- """
- Log a message with severity 'DEBUG' on the root logger.
- """
- if len(root.handlers) == 0:
- basicConfig()
- apply(root.debug, (msg,)+args, kwargs)
-
-def disable(level):
- """
- Disable all logging calls less severe than 'level'.
- """
- root.manager.disable = level
-
-def shutdown():
- """
- Perform any cleanup actions in the logging system (e.g. flushing
- buffers).
-
- Should be called at application exit.
- """
- for h in _handlers.keys():
- h.flush()
- h.close()
Copied: trunk/lib/venus/planet/vendor/compat_logging/__init__.py (from rev 656, branches/sucs-site/lib/venus/planet/vendor/compat_logging/__init__.py)
===================================================================
--- trunk/lib/venus/planet/vendor/compat_logging/__init__.py (rev 0)
+++ trunk/lib/venus/planet/vendor/compat_logging/__init__.py 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,1196 @@
+# Copyright 2001-2002 by Vinay Sajip. All Rights Reserved.
+#
+# Permission to use, copy, modify, and distribute this software and its
+# documentation for any purpose and without fee is hereby granted,
+# provided that the above copyright notice appear in all copies and that
+# both that copyright notice and this permission notice appear in
+# supporting documentation, and that the name of Vinay Sajip
+# not be used in advertising or publicity pertaining to distribution
+# of the software without specific, written prior permission.
+# VINAY SAJIP DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+# ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL
+# VINAY SAJIP BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+# ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER
+# IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
+# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+"""
+Logging package for Python. Based on PEP 282 and comments thereto in
+comp.lang.python, and influenced by Apache's log4j system.
+
+Should work under Python versions >= 1.5.2, except that source line
+information is not available unless 'sys._getframe()' is.
+
+Copyright (C) 2001-2002 Vinay Sajip. All Rights Reserved.
+
+To use, simply 'import logging' and log away!
+"""
+
+import sys, os, types, time, string, cStringIO
+
+try:
+ import thread
+ import threading
+except ImportError:
+ thread = None
+
+__author__ = "Vinay Sajip <vinay_sajip at red-dove.com>"
+__status__ = "beta"
+__version__ = "0.4.8.1"
+__date__ = "26 June 2003"
+
+#---------------------------------------------------------------------------
+# Miscellaneous module data
+#---------------------------------------------------------------------------
+
+#
+#_srcfile is used when walking the stack to check when we've got the first
+# caller stack frame.
+#
+if string.lower(__file__[-4:]) in ['.pyc', '.pyo']:
+ _srcfile = __file__[:-4] + '.py'
+else:
+ _srcfile = __file__
+_srcfile = os.path.normcase(_srcfile)
+
+# _srcfile is only used in conjunction with sys._getframe().
+# To provide compatibility with older versions of Python, set _srcfile
+# to None if _getframe() is not available; this value will prevent
+# findCaller() from being called.
+if not hasattr(sys, "_getframe"):
+ _srcfile = None
+
+#
+#_startTime is used as the base when calculating the relative time of events
+#
+_startTime = time.time()
+
+#
+#raiseExceptions is used to see if exceptions during handling should be
+#propagated
+#
+raiseExceptions = 1
+
+#---------------------------------------------------------------------------
+# Level related stuff
+#---------------------------------------------------------------------------
+#
+# Default levels and level names, these can be replaced with any positive set
+# of values having corresponding names. There is a pseudo-level, NOTSET, which
+# is only really there as a lower limit for user-defined levels. Handlers and
+# loggers are initialized with NOTSET so that they will log all messages, even
+# at user-defined levels.
+#
+CRITICAL = 50
+FATAL = CRITICAL
+ERROR = 40
+WARNING = 30
+WARN = WARNING
+INFO = 20
+DEBUG = 10
+NOTSET = 0
+
+_levelNames = {
+ CRITICAL : 'CRITICAL',
+ ERROR : 'ERROR',
+ WARNING : 'WARNING',
+ INFO : 'INFO',
+ DEBUG : 'DEBUG',
+ NOTSET : 'NOTSET',
+ 'CRITICAL' : CRITICAL,
+ 'ERROR' : ERROR,
+ 'WARN' : WARNING,
+ 'WARNING' : WARNING,
+ 'INFO' : INFO,
+ 'DEBUG' : DEBUG,
+ 'NOTSET' : NOTSET,
+}
+
+def getLevelName(level):
+ """
+ Return the textual representation of logging level 'level'.
+
+ If the level is one of the predefined levels (CRITICAL, ERROR, WARNING,
+ INFO, DEBUG) then you get the corresponding string. If you have
+ associated levels with names using addLevelName then the name you have
+ associated with 'level' is returned. Otherwise, the string
+ "Level %s" % level is returned.
+ """
+ return _levelNames.get(level, ("Level %s" % level))
+
+def addLevelName(level, levelName):
+ """
+ Associate 'levelName' with 'level'.
+
+ This is used when converting levels to text during message formatting.
+ """
+ _acquireLock()
+ try: #unlikely to cause an exception, but you never know...
+ _levelNames[level] = levelName
+ _levelNames[levelName] = level
+ finally:
+ _releaseLock()
+
+#---------------------------------------------------------------------------
+# Thread-related stuff
+#---------------------------------------------------------------------------
+
+#
+#_lock is used to serialize access to shared data structures in this module.
+#This needs to be an RLock because fileConfig() creates Handlers and so
+#might arbitrary user threads. Since Handler.__init__() updates the shared
+#dictionary _handlers, it needs to acquire the lock. But if configuring,
+#the lock would already have been acquired - so we need an RLock.
+#The same argument applies to Loggers and Manager.loggerDict.
+#
+_lock = None
+
+def _acquireLock():
+ """
+ Acquire the module-level lock for serializing access to shared data.
+
+ This should be released with _releaseLock().
+ """
+ global _lock
+ if (not _lock) and thread:
+ _lock = threading.RLock()
+ if _lock:
+ _lock.acquire()
+
+def _releaseLock():
+ """
+ Release the module-level lock acquired by calling _acquireLock().
+ """
+ if _lock:
+ _lock.release()
+
+#---------------------------------------------------------------------------
+# The logging record
+#---------------------------------------------------------------------------
+
+class LogRecord:
+ """
+ A LogRecord instance represents an event being logged.
+
+ LogRecord instances are created every time something is logged. They
+ contain all the information pertinent to the event being logged. The
+ main information passed in is in msg and args, which are combined
+ using str(msg) % args to create the message field of the record. The
+ record also includes information such as when the record was created,
+ the source line where the logging call was made, and any exception
+ information to be logged.
+ """
+ def __init__(self, name, level, pathname, lineno, msg, args, exc_info):
+ """
+ Initialize a logging record with interesting information.
+ """
+ ct = time.time()
+ self.name = name
+ self.msg = msg
+ self.args = args
+ self.levelname = getLevelName(level)
+ self.levelno = level
+ self.pathname = pathname
+ try:
+ self.filename = os.path.basename(pathname)
+ self.module = os.path.splitext(self.filename)[0]
+ except:
+ self.filename = pathname
+ self.module = "Unknown module"
+ self.exc_info = exc_info
+ self.lineno = lineno
+ self.created = ct
+ self.msecs = (ct - long(ct)) * 1000
+ self.relativeCreated = (self.created - _startTime) * 1000
+ if thread:
+ self.thread = thread.get_ident()
+ else:
+ self.thread = None
+ if hasattr(os, 'getpid'):
+ self.process = os.getpid()
+ else:
+ self.process = None
+
+ def __str__(self):
+ return '<LogRecord: %s, %s, %s, %s, "%s">'%(self.name, self.levelno,
+ self.pathname, self.lineno, self.msg)
+
+ def getMessage(self):
+ """
+ Return the message for this LogRecord.
+
+ Return the message for this LogRecord after merging any user-supplied
+ arguments with the message.
+ """
+ if not hasattr(types, "UnicodeType"): #if no unicode support...
+ msg = str(self.msg)
+ else:
+ try:
+ msg = str(self.msg)
+ except UnicodeError:
+ msg = self.msg #Defer encoding till later
+ if self.args:
+ msg = msg % self.args
+ return msg
+
+def makeLogRecord(dict):
+ """
+ Make a LogRecord whose attributes are defined by the specified dictionary,
+ This function is useful for converting a logging event received over
+ a socket connection (which is sent as a dictionary) into a LogRecord
+ instance.
+ """
+ rv = LogRecord(None, None, "", 0, "", (), None)
+ rv.__dict__.update(dict)
+ return rv
+
+#---------------------------------------------------------------------------
+# Formatter classes and functions
+#---------------------------------------------------------------------------
+
+class Formatter:
+ """
+ Formatter instances are used to convert a LogRecord to text.
+
+ Formatters need to know how a LogRecord is constructed. They are
+ responsible for converting a LogRecord to (usually) a string which can
+ be interpreted by either a human or an external system. The base Formatter
+ allows a formatting string to be specified. If none is supplied, the
+ default value of "%s(message)\\n" is used.
+
+ The Formatter can be initialized with a format string which makes use of
+ knowledge of the LogRecord attributes - e.g. the default value mentioned
+ above makes use of the fact that the user's message and arguments are pre-
+ formatted into a LogRecord's message attribute. Currently, the useful
+ attributes in a LogRecord are described by:
+
+ %(name)s Name of the logger (logging channel)
+ %(levelno)s Numeric logging level for the message (DEBUG, INFO,
+ WARNING, ERROR, CRITICAL)
+ %(levelname)s Text logging level for the message ("DEBUG", "INFO",
+ "WARNING", "ERROR", "CRITICAL")
+ %(pathname)s Full pathname of the source file where the logging
+ call was issued (if available)
+ %(filename)s Filename portion of pathname
+ %(module)s Module (name portion of filename)
+ %(lineno)d Source line number where the logging call was issued
+ (if available)
+ %(created)f Time when the LogRecord was created (time.time()
+ return value)
+ %(asctime)s Textual time when the LogRecord was created
+ %(msecs)d Millisecond portion of the creation time
+ %(relativeCreated)d Time in milliseconds when the LogRecord was created,
+ relative to the time the logging module was loaded
+ (typically at application startup time)
+ %(thread)d Thread ID (if available)
+ %(process)d Process ID (if available)
+ %(message)s The result of record.getMessage(), computed just as
+ the record is emitted
+ """
+
+ converter = time.localtime
+
+ def __init__(self, fmt=None, datefmt=None):
+ """
+ Initialize the formatter with specified format strings.
+
+ Initialize the formatter either with the specified format string, or a
+ default as described above. Allow for specialized date formatting with
+ the optional datefmt argument (if omitted, you get the ISO8601 format).
+ """
+ if fmt:
+ self._fmt = fmt
+ else:
+ self._fmt = "%(message)s"
+ self.datefmt = datefmt
+
+ def formatTime(self, record, datefmt=None):
+ """
+ Return the creation time of the specified LogRecord as formatted text.
+
+ This method should be called from format() by a formatter which
+ wants to make use of a formatted time. This method can be overridden
+ in formatters to provide for any specific requirement, but the
+ basic behaviour is as follows: if datefmt (a string) is specified,
+ it is used with time.strftime() to format the creation time of the
+ record. Otherwise, the ISO8601 format is used. The resulting
+ string is returned. This function uses a user-configurable function
+ to convert the creation time to a tuple. By default, time.localtime()
+ is used; to change this for a particular formatter instance, set the
+ 'converter' attribute to a function with the same signature as
+ time.localtime() or time.gmtime(). To change it for all formatters,
+ for example if you want all logging times to be shown in GMT,
+ set the 'converter' attribute in the Formatter class.
+ """
+ ct = self.converter(record.created)
+ if datefmt:
+ s = time.strftime(datefmt, ct)
+ else:
+ t = time.strftime("%Y-%m-%d %H:%M:%S", ct)
+ s = "%s,%03d" % (t, record.msecs)
+ return s
+
+ def formatException(self, ei):
+ """
+ Format and return the specified exception information as a string.
+
+ This default implementation just uses
+ traceback.print_exception()
+ """
+ import traceback
+ sio = cStringIO.StringIO()
+ traceback.print_exception(ei[0], ei[1], ei[2], None, sio)
+ s = sio.getvalue()
+ sio.close()
+ if s[-1] == "\n":
+ s = s[:-1]
+ return s
+
+ def format(self, record):
+ """
+ Format the specified record as text.
+
+ The record's attribute dictionary is used as the operand to a
+ string formatting operation which yields the returned string.
+ Before formatting the dictionary, a couple of preparatory steps
+ are carried out. The message attribute of the record is computed
+ using LogRecord.getMessage(). If the formatting string contains
+ "%(asctime)", formatTime() is called to format the event time.
+ If there is exception information, it is formatted using
+ formatException() and appended to the message.
+ """
+ record.message = record.getMessage()
+ if string.find(self._fmt,"%(asctime)") >= 0:
+ record.asctime = self.formatTime(record, self.datefmt)
+ s = self._fmt % record.__dict__
+ if record.exc_info:
+ if s[-1] != "\n":
+ s = s + "\n"
+ s = s + self.formatException(record.exc_info)
+ return s
+
+#
+# The default formatter to use when no other is specified
+#
+_defaultFormatter = Formatter()
+
+class BufferingFormatter:
+ """
+ A formatter suitable for formatting a number of records.
+ """
+ def __init__(self, linefmt=None):
+ """
+ Optionally specify a formatter which will be used to format each
+ individual record.
+ """
+ if linefmt:
+ self.linefmt = linefmt
+ else:
+ self.linefmt = _defaultFormatter
+
+ def formatHeader(self, records):
+ """
+ Return the header string for the specified records.
+ """
+ return ""
+
+ def formatFooter(self, records):
+ """
+ Return the footer string for the specified records.
+ """
+ return ""
+
+ def format(self, records):
+ """
+ Format the specified records and return the result as a string.
+ """
+ rv = ""
+ if len(records) > 0:
+ rv = rv + self.formatHeader(records)
+ for record in records:
+ rv = rv + self.linefmt.format(record)
+ rv = rv + self.formatFooter(records)
+ return rv
+
+#---------------------------------------------------------------------------
+# Filter classes and functions
+#---------------------------------------------------------------------------
+
+class Filter:
+ """
+ Filter instances are used to perform arbitrary filtering of LogRecords.
+
+ Loggers and Handlers can optionally use Filter instances to filter
+ records as desired. The base filter class only allows events which are
+ below a certain point in the logger hierarchy. For example, a filter
+ initialized with "A.B" will allow events logged by loggers "A.B",
+ "A.B.C", "A.B.C.D", "A.B.D" etc. but not "A.BB", "B.A.B" etc. If
+ initialized with the empty string, all events are passed.
+ """
+ def __init__(self, name=''):
+ """
+ Initialize a filter.
+
+ Initialize with the name of the logger which, together with its
+ children, will have its events allowed through the filter. If no
+ name is specified, allow every event.
+ """
+ self.name = name
+ self.nlen = len(name)
+
+ def filter(self, record):
+ """
+ Determine if the specified record is to be logged.
+
+ Is the specified record to be logged? Returns 0 for no, nonzero for
+ yes. If deemed appropriate, the record may be modified in-place.
+ """
+ if self.nlen == 0:
+ return 1
+ elif self.name == record.name:
+ return 1
+ elif string.find(record.name, self.name, 0, self.nlen) != 0:
+ return 0
+ return (record.name[self.nlen] == ".")
+
+class Filterer:
+ """
+ A base class for loggers and handlers which allows them to share
+ common code.
+ """
+ def __init__(self):
+ """
+ Initialize the list of filters to be an empty list.
+ """
+ self.filters = []
+
+ def addFilter(self, filter):
+ """
+ Add the specified filter to this handler.
+ """
+ if not (filter in self.filters):
+ self.filters.append(filter)
+
+ def removeFilter(self, filter):
+ """
+ Remove the specified filter from this handler.
+ """
+ if filter in self.filters:
+ self.filters.remove(filter)
+
+ def filter(self, record):
+ """
+ Determine if a record is loggable by consulting all the filters.
+
+ The default is to allow the record to be logged; any filter can veto
+ this and the record is then dropped. Returns a zero value if a record
+ is to be dropped, else non-zero.
+ """
+ rv = 1
+ for f in self.filters:
+ if not f.filter(record):
+ rv = 0
+ break
+ return rv
+
+#---------------------------------------------------------------------------
+# Handler classes and functions
+#---------------------------------------------------------------------------
+
+_handlers = {} #repository of handlers (for flushing when shutdown called)
+
+class Handler(Filterer):
+ """
+ Handler instances dispatch logging events to specific destinations.
+
+ The base handler class. Acts as a placeholder which defines the Handler
+ interface. Handlers can optionally use Formatter instances to format
+ records as desired. By default, no formatter is specified; in this case,
+ the 'raw' message as determined by record.message is logged.
+ """
+ def __init__(self, level=NOTSET):
+ """
+ Initializes the instance - basically setting the formatter to None
+ and the filter list to empty.
+ """
+ Filterer.__init__(self)
+ self.level = level
+ self.formatter = None
+ #get the module data lock, as we're updating a shared structure.
+ _acquireLock()
+ try: #unlikely to raise an exception, but you never know...
+ _handlers[self] = 1
+ finally:
+ _releaseLock()
+ self.createLock()
+
+ def createLock(self):
+ """
+ Acquire a thread lock for serializing access to the underlying I/O.
+ """
+ if thread:
+ self.lock = thread.allocate_lock()
+ else:
+ self.lock = None
+
+ def acquire(self):
+ """
+ Acquire the I/O thread lock.
+ """
+ if self.lock:
+ self.lock.acquire()
+
+ def release(self):
+ """
+ Release the I/O thread lock.
+ """
+ if self.lock:
+ self.lock.release()
+
+ def setLevel(self, level):
+ """
+ Set the logging level of this handler.
+ """
+ self.level = level
+
+ def format(self, record):
+ """
+ Format the specified record.
+
+ If a formatter is set, use it. Otherwise, use the default formatter
+ for the module.
+ """
+ if self.formatter:
+ fmt = self.formatter
+ else:
+ fmt = _defaultFormatter
+ return fmt.format(record)
+
+ def emit(self, record):
+ """
+ Do whatever it takes to actually log the specified logging record.
+
+ This version is intended to be implemented by subclasses and so
+ raises a NotImplementedError.
+ """
+ raise NotImplementedError, 'emit must be implemented '\
+ 'by Handler subclasses'
+
+ def handle(self, record):
+ """
+ Conditionally emit the specified logging record.
+
+ Emission depends on filters which may have been added to the handler.
+ Wrap the actual emission of the record with acquisition/release of
+ the I/O thread lock. Returns whether the filter passed the record for
+ emission.
+ """
+ rv = self.filter(record)
+ if rv:
+ self.acquire()
+ try:
+ self.emit(record)
+ finally:
+ self.release()
+ return rv
+
+ def setFormatter(self, fmt):
+ """
+ Set the formatter for this handler.
+ """
+ self.formatter = fmt
+
+ def flush(self):
+ """
+ Ensure all logging output has been flushed.
+
+ This version does nothing and is intended to be implemented by
+ subclasses.
+ """
+ pass
+
+ def close(self):
+ """
+ Tidy up any resources used by the handler.
+
+ This version does nothing and is intended to be implemented by
+ subclasses.
+ """
+ pass
+
+ def handleError(self, record):
+ """
+ Handle errors which occur during an emit() call.
+
+ This method should be called from handlers when an exception is
+ encountered during an emit() call. If raiseExceptions is false,
+ exceptions get silently ignored. This is what is mostly wanted
+ for a logging system - most users will not care about errors in
+ the logging system, they are more interested in application errors.
+ You could, however, replace this with a custom handler if you wish.
+ The record which was being processed is passed in to this method.
+ """
+ if raiseExceptions:
+ import traceback
+ ei = sys.exc_info()
+ traceback.print_exception(ei[0], ei[1], ei[2], None, sys.stderr)
+ del ei
+
+class StreamHandler(Handler):
+ """
+ A handler class which writes logging records, appropriately formatted,
+ to a stream. Note that this class does not close the stream, as
+ sys.stdout or sys.stderr may be used.
+ """
+ def __init__(self, strm=None):
+ """
+ Initialize the handler.
+
+ If strm is not specified, sys.stderr is used.
+ """
+ Handler.__init__(self)
+ if not strm:
+ strm = sys.stderr
+ self.stream = strm
+ self.formatter = None
+
+ def flush(self):
+ """
+ Flushes the stream.
+ """
+ self.stream.flush()
+
+ def emit(self, record):
+ """
+ Emit a record.
+
+ If a formatter is specified, it is used to format the record.
+ The record is then written to the stream with a trailing newline
+ [N.B. this may be removed depending on feedback]. If exception
+ information is present, it is formatted using
+ traceback.print_exception and appended to the stream.
+ """
+ try:
+ msg = self.format(record)
+ if not hasattr(types, "UnicodeType"): #if no unicode support...
+ self.stream.write("%s\n" % msg)
+ else:
+ try:
+ self.stream.write("%s\n" % msg)
+ except UnicodeError:
+ self.stream.write("%s\n" % msg.encode("UTF-8"))
+ self.flush()
+ except:
+ self.handleError(record)
+
+class FileHandler(StreamHandler):
+ """
+ A handler class which writes formatted logging records to disk files.
+ """
+ def __init__(self, filename, mode="a"):
+ """
+ Open the specified file and use it as the stream for logging.
+ """
+ StreamHandler.__init__(self, open(filename, mode))
+ self.baseFilename = filename
+ self.mode = mode
+
+ def close(self):
+ """
+ Closes the stream.
+ """
+ self.stream.close()
+
+#---------------------------------------------------------------------------
+# Manager classes and functions
+#---------------------------------------------------------------------------
+
+class PlaceHolder:
+ """
+ PlaceHolder instances are used in the Manager logger hierarchy to take
+ the place of nodes for which no loggers have been defined [FIXME add
+ example].
+ """
+ def __init__(self, alogger):
+ """
+ Initialize with the specified logger being a child of this placeholder.
+ """
+ self.loggers = [alogger]
+
+ def append(self, alogger):
+ """
+ Add the specified logger as a child of this placeholder.
+ """
+ if alogger not in self.loggers:
+ self.loggers.append(alogger)
+
+#
+# Determine which class to use when instantiating loggers.
+#
+_loggerClass = None
+
+def setLoggerClass(klass):
+ """
+ Set the class to be used when instantiating a logger. The class should
+ define __init__() such that only a name argument is required, and the
+ __init__() should call Logger.__init__()
+ """
+ if klass != Logger:
+ if not issubclass(klass, Logger):
+ raise TypeError, "logger not derived from logging.Logger: " + \
+ klass.__name__
+ global _loggerClass
+ _loggerClass = klass
+
+class Manager:
+ """
+ There is [under normal circumstances] just one Manager instance, which
+ holds the hierarchy of loggers.
+ """
+ def __init__(self, rootnode):
+ """
+ Initialize the manager with the root node of the logger hierarchy.
+ """
+ self.root = rootnode
+ self.disable = 0
+ self.emittedNoHandlerWarning = 0
+ self.loggerDict = {}
+
+ def getLogger(self, name):
+ """
+ Get a logger with the specified name (channel name), creating it
+ if it doesn't yet exist.
+
+ If a PlaceHolder existed for the specified name [i.e. the logger
+ didn't exist but a child of it did], replace it with the created
+ logger and fix up the parent/child references which pointed to the
+ placeholder to now point to the logger.
+ """
+ rv = None
+ _acquireLock()
+ try:
+ if self.loggerDict.has_key(name):
+ rv = self.loggerDict[name]
+ if isinstance(rv, PlaceHolder):
+ ph = rv
+ rv = _loggerClass(name)
+ rv.manager = self
+ self.loggerDict[name] = rv
+ self._fixupChildren(ph, rv)
+ self._fixupParents(rv)
+ else:
+ rv = _loggerClass(name)
+ rv.manager = self
+ self.loggerDict[name] = rv
+ self._fixupParents(rv)
+ finally:
+ _releaseLock()
+ return rv
+
+ def _fixupParents(self, alogger):
+ """
+ Ensure that there are either loggers or placeholders all the way
+ from the specified logger to the root of the logger hierarchy.
+ """
+ name = alogger.name
+ i = string.rfind(name, ".")
+ rv = None
+ while (i > 0) and not rv:
+ substr = name[:i]
+ if not self.loggerDict.has_key(substr):
+ self.loggerDict[substr] = PlaceHolder(alogger)
+ else:
+ obj = self.loggerDict[substr]
+ if isinstance(obj, Logger):
+ rv = obj
+ else:
+ assert isinstance(obj, PlaceHolder)
+ obj.append(alogger)
+ i = string.rfind(name, ".", 0, i - 1)
+ if not rv:
+ rv = self.root
+ alogger.parent = rv
+
+ def _fixupChildren(self, ph, alogger):
+ """
+ Ensure that children of the placeholder ph are connected to the
+ specified logger.
+ """
+ for c in ph.loggers:
+ if string.find(c.parent.name, alogger.name) <> 0:
+ alogger.parent = c.parent
+ c.parent = alogger
+
+#---------------------------------------------------------------------------
+# Logger classes and functions
+#---------------------------------------------------------------------------
+
+class Logger(Filterer):
+ """
+ Instances of the Logger class represent a single logging channel. A
+ "logging channel" indicates an area of an application. Exactly how an
+ "area" is defined is up to the application developer. Since an
+ application can have any number of areas, logging channels are identified
+ by a unique string. Application areas can be nested (e.g. an area
+ of "input processing" might include sub-areas "read CSV files", "read
+ XLS files" and "read Gnumeric files"). To cater for this natural nesting,
+ channel names are organized into a namespace hierarchy where levels are
+ separated by periods, much like the Java or Python package namespace. So
+ in the instance given above, channel names might be "input" for the upper
+ level, and "input.csv", "input.xls" and "input.gnu" for the sub-levels.
+ There is no arbitrary limit to the depth of nesting.
+ """
+ def __init__(self, name, level=NOTSET):
+ """
+ Initialize the logger with a name and an optional level.
+ """
+ Filterer.__init__(self)
+ self.name = name
+ self.level = level
+ self.parent = None
+ self.propagate = 1
+ self.handlers = []
+ self.disabled = 0
+
+ def setLevel(self, level):
+ """
+ Set the logging level of this logger.
+ """
+ self.level = level
+
+# def getRoot(self):
+# """
+# Get the root of the logger hierarchy.
+# """
+# return Logger.root
+
+ def debug(self, msg, *args, **kwargs):
+ """
+ Log 'msg % args' with severity 'DEBUG'.
+
+ To pass exception information, use the keyword argument exc_info with
+ a true value, e.g.
+
+ logger.debug("Houston, we have a %s", "thorny problem", exc_info=1)
+ """
+ if self.manager.disable >= DEBUG:
+ return
+ if DEBUG >= self.getEffectiveLevel():
+ apply(self._log, (DEBUG, msg, args), kwargs)
+
+ def info(self, msg, *args, **kwargs):
+ """
+ Log 'msg % args' with severity 'INFO'.
+
+ To pass exception information, use the keyword argument exc_info with
+ a true value, e.g.
+
+ logger.info("Houston, we have a %s", "interesting problem", exc_info=1)
+ """
+ if self.manager.disable >= INFO:
+ return
+ if INFO >= self.getEffectiveLevel():
+ apply(self._log, (INFO, msg, args), kwargs)
+
+ def warning(self, msg, *args, **kwargs):
+ """
+ Log 'msg % args' with severity 'WARNING'.
+
+ To pass exception information, use the keyword argument exc_info with
+ a true value, e.g.
+
+ logger.warning("Houston, we have a %s", "bit of a problem", exc_info=1)
+ """
+ if self.manager.disable >= WARNING:
+ return
+ if self.isEnabledFor(WARNING):
+ apply(self._log, (WARNING, msg, args), kwargs)
+
+ warn = warning
+
+ def error(self, msg, *args, **kwargs):
+ """
+ Log 'msg % args' with severity 'ERROR'.
+
+ To pass exception information, use the keyword argument exc_info with
+ a true value, e.g.
+
+ logger.error("Houston, we have a %s", "major problem", exc_info=1)
+ """
+ if self.manager.disable >= ERROR:
+ return
+ if self.isEnabledFor(ERROR):
+ apply(self._log, (ERROR, msg, args), kwargs)
+
+ def exception(self, msg, *args):
+ """
+ Convenience method for logging an ERROR with exception information.
+ """
+ apply(self.error, (msg,) + args, {'exc_info': 1})
+
+ def critical(self, msg, *args, **kwargs):
+ """
+ Log 'msg % args' with severity 'CRITICAL'.
+
+ To pass exception information, use the keyword argument exc_info with
+ a true value, e.g.
+
+ logger.critical("Houston, we have a %s", "major disaster", exc_info=1)
+ """
+ if self.manager.disable >= CRITICAL:
+ return
+ if CRITICAL >= self.getEffectiveLevel():
+ apply(self._log, (CRITICAL, msg, args), kwargs)
+
+ fatal = critical
+
+ def log(self, level, msg, *args, **kwargs):
+ """
+ Log 'msg % args' with the severity 'level'.
+
+ To pass exception information, use the keyword argument exc_info with
+ a true value, e.g.
+
+ logger.log(level, "We have a %s", "mysterious problem", exc_info=1)
+ """
+ if self.manager.disable >= level:
+ return
+ if self.isEnabledFor(level):
+ apply(self._log, (level, msg, args), kwargs)
+
+ def findCaller(self):
+ """
+ Find the stack frame of the caller so that we can note the source
+ file name and line number.
+ """
+ f = sys._getframe(1)
+ while 1:
+ co = f.f_code
+ filename = os.path.normcase(co.co_filename)
+ if filename == _srcfile:
+ f = f.f_back
+ continue
+ return filename, f.f_lineno
+
+ def makeRecord(self, name, level, fn, lno, msg, args, exc_info):
+ """
+ A factory method which can be overridden in subclasses to create
+ specialized LogRecords.
+ """
+ return LogRecord(name, level, fn, lno, msg, args, exc_info)
+
+ def _log(self, level, msg, args, exc_info=None):
+ """
+ Low-level logging routine which creates a LogRecord and then calls
+ all the handlers of this logger to handle the record.
+ """
+ if _srcfile:
+ fn, lno = self.findCaller()
+ else:
+ fn, lno = "<unknown file>", 0
+ if exc_info:
+ exc_info = sys.exc_info()
+ record = self.makeRecord(self.name, level, fn, lno, msg, args, exc_info)
+ self.handle(record)
+
+ def handle(self, record):
+ """
+ Call the handlers for the specified record.
+
+ This method is used for unpickled records received from a socket, as
+ well as those created locally. Logger-level filtering is applied.
+ """
+ if (not self.disabled) and self.filter(record):
+ self.callHandlers(record)
+
+ def addHandler(self, hdlr):
+ """
+ Add the specified handler to this logger.
+ """
+ if not (hdlr in self.handlers):
+ self.handlers.append(hdlr)
+
+ def removeHandler(self, hdlr):
+ """
+ Remove the specified handler from this logger.
+ """
+ if hdlr in self.handlers:
+ #hdlr.close()
+ self.handlers.remove(hdlr)
+
+ def callHandlers(self, record):
+ """
+ Pass a record to all relevant handlers.
+
+ Loop through all handlers for this logger and its parents in the
+ logger hierarchy. If no handler was found, output a one-off error
+ message to sys.stderr. Stop searching up the hierarchy whenever a
+ logger with the "propagate" attribute set to zero is found - that
+ will be the last logger whose handlers are called.
+ """
+ c = self
+ found = 0
+ while c:
+ for hdlr in c.handlers:
+ found = found + 1
+ if record.levelno >= hdlr.level:
+ hdlr.handle(record)
+ if not c.propagate:
+ c = None #break out
+ else:
+ c = c.parent
+ if (found == 0) and not self.manager.emittedNoHandlerWarning:
+ sys.stderr.write("No handlers could be found for logger"
+ " \"%s\"\n" % self.name)
+ self.manager.emittedNoHandlerWarning = 1
+
+ def getEffectiveLevel(self):
+ """
+ Get the effective level for this logger.
+
+ Loop through this logger and its parents in the logger hierarchy,
+ looking for a non-zero logging level. Return the first one found.
+ """
+ logger = self
+ while logger:
+ if logger.level:
+ return logger.level
+ logger = logger.parent
+ return NOTSET
+
+ def isEnabledFor(self, level):
+ """
+ Is this logger enabled for level 'level'?
+ """
+ if self.manager.disable >= level:
+ return 0
+ return level >= self.getEffectiveLevel()
+
+class RootLogger(Logger):
+ """
+ A root logger is not that different to any other logger, except that
+ it must have a logging level and there is only one instance of it in
+ the hierarchy.
+ """
+ def __init__(self, level):
+ """
+ Initialize the logger with the name "root".
+ """
+ Logger.__init__(self, "root", level)
+
+_loggerClass = Logger
+
+root = RootLogger(WARNING)
+Logger.root = root
+Logger.manager = Manager(Logger.root)
+
+#---------------------------------------------------------------------------
+# Configuration classes and functions
+#---------------------------------------------------------------------------
+
+BASIC_FORMAT = "%(levelname)s:%(name)s:%(message)s"
+
+def basicConfig(format=BASIC_FORMAT):
+ """
+ Do basic configuration for the logging system by creating a
+ StreamHandler with a default Formatter and adding it to the
+ root logger.
+ """
+ if len(root.handlers) == 0:
+ hdlr = StreamHandler()
+ fmt = Formatter(format)
+ hdlr.setFormatter(fmt)
+ root.addHandler(hdlr)
+
+#---------------------------------------------------------------------------
+# Utility functions at module level.
+# Basically delegate everything to the root logger.
+#---------------------------------------------------------------------------
+
+def getLogger(name=None):
+ """
+ Return a logger with the specified name, creating it if necessary.
+
+ If no name is specified, return the root logger.
+ """
+ if name:
+ return Logger.manager.getLogger(name)
+ else:
+ return root
+
+#def getRootLogger():
+# """
+# Return the root logger.
+#
+# Note that getLogger('') now does the same thing, so this function is
+# deprecated and may disappear in the future.
+# """
+# return root
+
+def critical(msg, *args, **kwargs):
+ """
+ Log a message with severity 'CRITICAL' on the root logger.
+ """
+ if len(root.handlers) == 0:
+ basicConfig()
+ apply(root.critical, (msg,)+args, kwargs)
+
+fatal = critical
+
+def error(msg, *args, **kwargs):
+ """
+ Log a message with severity 'ERROR' on the root logger.
+ """
+ if len(root.handlers) == 0:
+ basicConfig()
+ apply(root.error, (msg,)+args, kwargs)
+
+def exception(msg, *args):
+ """
+ Log a message with severity 'ERROR' on the root logger,
+ with exception information.
+ """
+ apply(error, (msg,)+args, {'exc_info': 1})
+
+def warning(msg, *args, **kwargs):
+ """
+ Log a message with severity 'WARNING' on the root logger.
+ """
+ if len(root.handlers) == 0:
+ basicConfig()
+ apply(root.warning, (msg,)+args, kwargs)
+
+warn = warning
+
+def info(msg, *args, **kwargs):
+ """
+ Log a message with severity 'INFO' on the root logger.
+ """
+ if len(root.handlers) == 0:
+ basicConfig()
+ apply(root.info, (msg,)+args, kwargs)
+
+def debug(msg, *args, **kwargs):
+ """
+ Log a message with severity 'DEBUG' on the root logger.
+ """
+ if len(root.handlers) == 0:
+ basicConfig()
+ apply(root.debug, (msg,)+args, kwargs)
+
+def disable(level):
+ """
+ Disable all logging calls less severe than 'level'.
+ """
+ root.manager.disable = level
+
+def shutdown():
+ """
+ Perform any cleanup actions in the logging system (e.g. flushing
+ buffers).
+
+ Should be called at application exit.
+ """
+ for h in _handlers.keys():
+ h.flush()
+ h.close()
Deleted: trunk/lib/venus/planet/vendor/compat_logging/config.py
===================================================================
--- branches/sucs-site/lib/venus/planet/vendor/compat_logging/config.py 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/lib/venus/planet/vendor/compat_logging/config.py 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,299 +0,0 @@
-# Copyright 2001-2002 by Vinay Sajip. All Rights Reserved.
-#
-# Permission to use, copy, modify, and distribute this software and its
-# documentation for any purpose and without fee is hereby granted,
-# provided that the above copyright notice appear in all copies and that
-# both that copyright notice and this permission notice appear in
-# supporting documentation, and that the name of Vinay Sajip
-# not be used in advertising or publicity pertaining to distribution
-# of the software without specific, written prior permission.
-# VINAY SAJIP DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
-# ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL
-# VINAY SAJIP BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
-# ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER
-# IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
-# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-"""
-Logging package for Python. Based on PEP 282 and comments thereto in
-comp.lang.python, and influenced by Apache's log4j system.
-
-Should work under Python versions >= 1.5.2, except that source line
-information is not available unless 'inspect' is.
-
-Copyright (C) 2001-2002 Vinay Sajip. All Rights Reserved.
-
-To use, simply 'import logging' and log away!
-"""
-
-import sys, logging, logging.handlers, string, thread, threading, socket, struct, os
-
-from SocketServer import ThreadingTCPServer, StreamRequestHandler
-
-
-DEFAULT_LOGGING_CONFIG_PORT = 9030
-if sys.platform == "win32":
- RESET_ERROR = 10054 #WSAECONNRESET
-else:
- RESET_ERROR = 104 #ECONNRESET
-
-#
-# The following code implements a socket listener for on-the-fly
-# reconfiguration of logging.
-#
-# _listener holds the server object doing the listening
-_listener = None
-
-def fileConfig(fname, defaults=None):
- """
- Read the logging configuration from a ConfigParser-format file.
-
- This can be called several times from an application, allowing an end user
- the ability to select from various pre-canned configurations (if the
- developer provides a mechanism to present the choices and load the chosen
- configuration).
- In versions of ConfigParser which have the readfp method [typically
- shipped in 2.x versions of Python], you can pass in a file-like object
- rather than a filename, in which case the file-like object will be read
- using readfp.
- """
- import ConfigParser
-
- cp = ConfigParser.ConfigParser(defaults)
- if hasattr(cp, 'readfp') and hasattr(fname, 'readline'):
- cp.readfp(fname)
- else:
- cp.read(fname)
- #first, do the formatters...
- flist = cp.get("formatters", "keys")
- if len(flist):
- flist = string.split(flist, ",")
- formatters = {}
- for form in flist:
- sectname = "formatter_%s" % form
- opts = cp.options(sectname)
- if "format" in opts:
- fs = cp.get(sectname, "format", 1)
- else:
- fs = None
- if "datefmt" in opts:
- dfs = cp.get(sectname, "datefmt", 1)
- else:
- dfs = None
- f = logging.Formatter(fs, dfs)
- formatters[form] = f
- #next, do the handlers...
- #critical section...
- logging._acquireLock()
- try:
- try:
- #first, lose the existing handlers...
- logging._handlers.clear()
- #now set up the new ones...
- hlist = cp.get("handlers", "keys")
- if len(hlist):
- hlist = string.split(hlist, ",")
- handlers = {}
- fixups = [] #for inter-handler references
- for hand in hlist:
- sectname = "handler_%s" % hand
- klass = cp.get(sectname, "class")
- opts = cp.options(sectname)
- if "formatter" in opts:
- fmt = cp.get(sectname, "formatter")
- else:
- fmt = ""
- klass = eval(klass, vars(logging))
- args = cp.get(sectname, "args")
- args = eval(args, vars(logging))
- h = apply(klass, args)
- if "level" in opts:
- level = cp.get(sectname, "level")
- h.setLevel(logging._levelNames[level])
- if len(fmt):
- h.setFormatter(formatters[fmt])
- #temporary hack for FileHandler and MemoryHandler.
- if klass == logging.handlers.MemoryHandler:
- if "target" in opts:
- target = cp.get(sectname,"target")
- else:
- target = ""
- if len(target): #the target handler may not be loaded yet, so keep for later...
- fixups.append((h, target))
- handlers[hand] = h
- #now all handlers are loaded, fixup inter-handler references...
- for fixup in fixups:
- h = fixup[0]
- t = fixup[1]
- h.setTarget(handlers[t])
- #at last, the loggers...first the root...
- llist = cp.get("loggers", "keys")
- llist = string.split(llist, ",")
- llist.remove("root")
- sectname = "logger_root"
- root = logging.root
- log = root
- opts = cp.options(sectname)
- if "level" in opts:
- level = cp.get(sectname, "level")
- log.setLevel(logging._levelNames[level])
- for h in root.handlers[:]:
- root.removeHandler(h)
- hlist = cp.get(sectname, "handlers")
- if len(hlist):
- hlist = string.split(hlist, ",")
- for hand in hlist:
- log.addHandler(handlers[hand])
- #and now the others...
- #we don't want to lose the existing loggers,
- #since other threads may have pointers to them.
- #existing is set to contain all existing loggers,
- #and as we go through the new configuration we
- #remove any which are configured. At the end,
- #what's left in existing is the set of loggers
- #which were in the previous configuration but
- #which are not in the new configuration.
- existing = root.manager.loggerDict.keys()
- #now set up the new ones...
- for log in llist:
- sectname = "logger_%s" % log
- qn = cp.get(sectname, "qualname")
- opts = cp.options(sectname)
- if "propagate" in opts:
- propagate = cp.getint(sectname, "propagate")
- else:
- propagate = 1
- logger = logging.getLogger(qn)
- if qn in existing:
- existing.remove(qn)
- if "level" in opts:
- level = cp.get(sectname, "level")
- logger.setLevel(logging._levelNames[level])
- for h in logger.handlers[:]:
- logger.removeHandler(h)
- logger.propagate = propagate
- logger.disabled = 0
- hlist = cp.get(sectname, "handlers")
- if len(hlist):
- hlist = string.split(hlist, ",")
- for hand in hlist:
- logger.addHandler(handlers[hand])
- #Disable any old loggers. There's no point deleting
- #them as other threads may continue to hold references
- #and by disabling them, you stop them doing any logging.
- for log in existing:
- root.manager.loggerDict[log].disabled = 1
- except:
- import traceback
- ei = sys.exc_info()
- traceback.print_exception(ei[0], ei[1], ei[2], None, sys.stderr)
- del ei
- finally:
- logging._releaseLock()
-
-def listen(port=DEFAULT_LOGGING_CONFIG_PORT):
- """
- Start up a socket server on the specified port, and listen for new
- configurations.
-
- These will be sent as a file suitable for processing by fileConfig().
- Returns a Thread object on which you can call start() to start the server,
- and which you can join() when appropriate. To stop the server, call
- stopListening().
- """
- if not thread:
- raise NotImplementedError, "listen() needs threading to work"
-
- class ConfigStreamHandler(StreamRequestHandler):
- """
- Handler for a logging configuration request.
-
- It expects a completely new logging configuration and uses fileConfig
- to install it.
- """
- def handle(self):
- """
- Handle a request.
-
- Each request is expected to be a 4-byte length,
- followed by the config file. Uses fileConfig() to do the
- grunt work.
- """
- import tempfile
- try:
- conn = self.connection
- chunk = conn.recv(4)
- if len(chunk) == 4:
- slen = struct.unpack(">L", chunk)[0]
- chunk = self.connection.recv(slen)
- while len(chunk) < slen:
- chunk = chunk + conn.recv(slen - len(chunk))
- #Apply new configuration. We'd like to be able to
- #create a StringIO and pass that in, but unfortunately
- #1.5.2 ConfigParser does not support reading file
- #objects, only actual files. So we create a temporary
- #file and remove it later.
- file = tempfile.mktemp(".ini")
- f = open(file, "w")
- f.write(chunk)
- f.close()
- fileConfig(file)
- os.remove(file)
- except socket.error, e:
- if type(e.args) != types.TupleType:
- raise
- else:
- errcode = e.args[0]
- if errcode != RESET_ERROR:
- raise
-
- class ConfigSocketReceiver(ThreadingTCPServer):
- """
- A simple TCP socket-based logging config receiver.
- """
-
- allow_reuse_address = 1
-
- def __init__(self, host='localhost', port=DEFAULT_LOGGING_CONFIG_PORT,
- handler=None):
- ThreadingTCPServer.__init__(self, (host, port), handler)
- logging._acquireLock()
- self.abort = 0
- logging._releaseLock()
- self.timeout = 1
-
- def serve_until_stopped(self):
- import select
- abort = 0
- while not abort:
- rd, wr, ex = select.select([self.socket.fileno()],
- [], [],
- self.timeout)
- if rd:
- self.handle_request()
- logging._acquireLock()
- abort = self.abort
- logging._releaseLock()
-
- def serve(rcvr, hdlr, port):
- server = rcvr(port=port, handler=hdlr)
- global _listener
- logging._acquireLock()
- _listener = server
- logging._releaseLock()
- server.serve_until_stopped()
-
- return threading.Thread(target=serve,
- args=(ConfigSocketReceiver,
- ConfigStreamHandler, port))
-
-def stopListening():
- """
- Stop the listening server which was created with a call to listen().
- """
- global _listener
- if _listener:
- logging._acquireLock()
- _listener.abort = 1
- _listener = None
- logging._releaseLock()
Copied: trunk/lib/venus/planet/vendor/compat_logging/config.py (from rev 656, branches/sucs-site/lib/venus/planet/vendor/compat_logging/config.py)
===================================================================
--- trunk/lib/venus/planet/vendor/compat_logging/config.py (rev 0)
+++ trunk/lib/venus/planet/vendor/compat_logging/config.py 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,299 @@
+# Copyright 2001-2002 by Vinay Sajip. All Rights Reserved.
+#
+# Permission to use, copy, modify, and distribute this software and its
+# documentation for any purpose and without fee is hereby granted,
+# provided that the above copyright notice appear in all copies and that
+# both that copyright notice and this permission notice appear in
+# supporting documentation, and that the name of Vinay Sajip
+# not be used in advertising or publicity pertaining to distribution
+# of the software without specific, written prior permission.
+# VINAY SAJIP DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+# ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL
+# VINAY SAJIP BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+# ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER
+# IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
+# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+"""
+Logging package for Python. Based on PEP 282 and comments thereto in
+comp.lang.python, and influenced by Apache's log4j system.
+
+Should work under Python versions >= 1.5.2, except that source line
+information is not available unless 'inspect' is.
+
+Copyright (C) 2001-2002 Vinay Sajip. All Rights Reserved.
+
+To use, simply 'import logging' and log away!
+"""
+
+import sys, logging, logging.handlers, string, thread, threading, socket, struct, os
+
+from SocketServer import ThreadingTCPServer, StreamRequestHandler
+
+
+DEFAULT_LOGGING_CONFIG_PORT = 9030
+if sys.platform == "win32":
+ RESET_ERROR = 10054 #WSAECONNRESET
+else:
+ RESET_ERROR = 104 #ECONNRESET
+
+#
+# The following code implements a socket listener for on-the-fly
+# reconfiguration of logging.
+#
+# _listener holds the server object doing the listening
+_listener = None
+
+def fileConfig(fname, defaults=None):
+ """
+ Read the logging configuration from a ConfigParser-format file.
+
+ This can be called several times from an application, allowing an end user
+ the ability to select from various pre-canned configurations (if the
+ developer provides a mechanism to present the choices and load the chosen
+ configuration).
+ In versions of ConfigParser which have the readfp method [typically
+ shipped in 2.x versions of Python], you can pass in a file-like object
+ rather than a filename, in which case the file-like object will be read
+ using readfp.
+ """
+ import ConfigParser
+
+ cp = ConfigParser.ConfigParser(defaults)
+ if hasattr(cp, 'readfp') and hasattr(fname, 'readline'):
+ cp.readfp(fname)
+ else:
+ cp.read(fname)
+ #first, do the formatters...
+ flist = cp.get("formatters", "keys")
+ if len(flist):
+ flist = string.split(flist, ",")
+ formatters = {}
+ for form in flist:
+ sectname = "formatter_%s" % form
+ opts = cp.options(sectname)
+ if "format" in opts:
+ fs = cp.get(sectname, "format", 1)
+ else:
+ fs = None
+ if "datefmt" in opts:
+ dfs = cp.get(sectname, "datefmt", 1)
+ else:
+ dfs = None
+ f = logging.Formatter(fs, dfs)
+ formatters[form] = f
+ #next, do the handlers...
+ #critical section...
+ logging._acquireLock()
+ try:
+ try:
+ #first, lose the existing handlers...
+ logging._handlers.clear()
+ #now set up the new ones...
+ hlist = cp.get("handlers", "keys")
+ if len(hlist):
+ hlist = string.split(hlist, ",")
+ handlers = {}
+ fixups = [] #for inter-handler references
+ for hand in hlist:
+ sectname = "handler_%s" % hand
+ klass = cp.get(sectname, "class")
+ opts = cp.options(sectname)
+ if "formatter" in opts:
+ fmt = cp.get(sectname, "formatter")
+ else:
+ fmt = ""
+ klass = eval(klass, vars(logging))
+ args = cp.get(sectname, "args")
+ args = eval(args, vars(logging))
+ h = apply(klass, args)
+ if "level" in opts:
+ level = cp.get(sectname, "level")
+ h.setLevel(logging._levelNames[level])
+ if len(fmt):
+ h.setFormatter(formatters[fmt])
+ #temporary hack for FileHandler and MemoryHandler.
+ if klass == logging.handlers.MemoryHandler:
+ if "target" in opts:
+ target = cp.get(sectname,"target")
+ else:
+ target = ""
+ if len(target): #the target handler may not be loaded yet, so keep for later...
+ fixups.append((h, target))
+ handlers[hand] = h
+ #now all handlers are loaded, fixup inter-handler references...
+ for fixup in fixups:
+ h = fixup[0]
+ t = fixup[1]
+ h.setTarget(handlers[t])
+ #at last, the loggers...first the root...
+ llist = cp.get("loggers", "keys")
+ llist = string.split(llist, ",")
+ llist.remove("root")
+ sectname = "logger_root"
+ root = logging.root
+ log = root
+ opts = cp.options(sectname)
+ if "level" in opts:
+ level = cp.get(sectname, "level")
+ log.setLevel(logging._levelNames[level])
+ for h in root.handlers[:]:
+ root.removeHandler(h)
+ hlist = cp.get(sectname, "handlers")
+ if len(hlist):
+ hlist = string.split(hlist, ",")
+ for hand in hlist:
+ log.addHandler(handlers[hand])
+ #and now the others...
+ #we don't want to lose the existing loggers,
+ #since other threads may have pointers to them.
+ #existing is set to contain all existing loggers,
+ #and as we go through the new configuration we
+ #remove any which are configured. At the end,
+ #what's left in existing is the set of loggers
+ #which were in the previous configuration but
+ #which are not in the new configuration.
+ existing = root.manager.loggerDict.keys()
+ #now set up the new ones...
+ for log in llist:
+ sectname = "logger_%s" % log
+ qn = cp.get(sectname, "qualname")
+ opts = cp.options(sectname)
+ if "propagate" in opts:
+ propagate = cp.getint(sectname, "propagate")
+ else:
+ propagate = 1
+ logger = logging.getLogger(qn)
+ if qn in existing:
+ existing.remove(qn)
+ if "level" in opts:
+ level = cp.get(sectname, "level")
+ logger.setLevel(logging._levelNames[level])
+ for h in logger.handlers[:]:
+ logger.removeHandler(h)
+ logger.propagate = propagate
+ logger.disabled = 0
+ hlist = cp.get(sectname, "handlers")
+ if len(hlist):
+ hlist = string.split(hlist, ",")
+ for hand in hlist:
+ logger.addHandler(handlers[hand])
+ #Disable any old loggers. There's no point deleting
+ #them as other threads may continue to hold references
+ #and by disabling them, you stop them doing any logging.
+ for log in existing:
+ root.manager.loggerDict[log].disabled = 1
+ except:
+ import traceback
+ ei = sys.exc_info()
+ traceback.print_exception(ei[0], ei[1], ei[2], None, sys.stderr)
+ del ei
+ finally:
+ logging._releaseLock()
+
+def listen(port=DEFAULT_LOGGING_CONFIG_PORT):
+ """
+ Start up a socket server on the specified port, and listen for new
+ configurations.
+
+ These will be sent as a file suitable for processing by fileConfig().
+ Returns a Thread object on which you can call start() to start the server,
+ and which you can join() when appropriate. To stop the server, call
+ stopListening().
+ """
+ if not thread:
+ raise NotImplementedError, "listen() needs threading to work"
+
+ class ConfigStreamHandler(StreamRequestHandler):
+ """
+ Handler for a logging configuration request.
+
+ It expects a completely new logging configuration and uses fileConfig
+ to install it.
+ """
+ def handle(self):
+ """
+ Handle a request.
+
+ Each request is expected to be a 4-byte length,
+ followed by the config file. Uses fileConfig() to do the
+ grunt work.
+ """
+ import tempfile
+ try:
+ conn = self.connection
+ chunk = conn.recv(4)
+ if len(chunk) == 4:
+ slen = struct.unpack(">L", chunk)[0]
+ chunk = self.connection.recv(slen)
+ while len(chunk) < slen:
+ chunk = chunk + conn.recv(slen - len(chunk))
+ #Apply new configuration. We'd like to be able to
+ #create a StringIO and pass that in, but unfortunately
+ #1.5.2 ConfigParser does not support reading file
+ #objects, only actual files. So we create a temporary
+ #file and remove it later.
+ file = tempfile.mktemp(".ini")
+ f = open(file, "w")
+ f.write(chunk)
+ f.close()
+ fileConfig(file)
+ os.remove(file)
+ except socket.error, e:
+ if type(e.args) != types.TupleType:
+ raise
+ else:
+ errcode = e.args[0]
+ if errcode != RESET_ERROR:
+ raise
+
+ class ConfigSocketReceiver(ThreadingTCPServer):
+ """
+ A simple TCP socket-based logging config receiver.
+ """
+
+ allow_reuse_address = 1
+
+ def __init__(self, host='localhost', port=DEFAULT_LOGGING_CONFIG_PORT,
+ handler=None):
+ ThreadingTCPServer.__init__(self, (host, port), handler)
+ logging._acquireLock()
+ self.abort = 0
+ logging._releaseLock()
+ self.timeout = 1
+
+ def serve_until_stopped(self):
+ import select
+ abort = 0
+ while not abort:
+ rd, wr, ex = select.select([self.socket.fileno()],
+ [], [],
+ self.timeout)
+ if rd:
+ self.handle_request()
+ logging._acquireLock()
+ abort = self.abort
+ logging._releaseLock()
+
+ def serve(rcvr, hdlr, port):
+ server = rcvr(port=port, handler=hdlr)
+ global _listener
+ logging._acquireLock()
+ _listener = server
+ logging._releaseLock()
+ server.serve_until_stopped()
+
+ return threading.Thread(target=serve,
+ args=(ConfigSocketReceiver,
+ ConfigStreamHandler, port))
+
+def stopListening():
+ """
+ Stop the listening server which was created with a call to listen().
+ """
+ global _listener
+ if _listener:
+ logging._acquireLock()
+ _listener.abort = 1
+ _listener = None
+ logging._releaseLock()
Deleted: trunk/lib/venus/planet/vendor/compat_logging/handlers.py
===================================================================
--- branches/sucs-site/lib/venus/planet/vendor/compat_logging/handlers.py 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/lib/venus/planet/vendor/compat_logging/handlers.py 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,728 +0,0 @@
-# Copyright 2001-2002 by Vinay Sajip. All Rights Reserved.
-#
-# Permission to use, copy, modify, and distribute this software and its
-# documentation for any purpose and without fee is hereby granted,
-# provided that the above copyright notice appear in all copies and that
-# both that copyright notice and this permission notice appear in
-# supporting documentation, and that the name of Vinay Sajip
-# not be used in advertising or publicity pertaining to distribution
-# of the software without specific, written prior permission.
-# VINAY SAJIP DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
-# ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL
-# VINAY SAJIP BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
-# ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER
-# IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
-# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-"""
-Logging package for Python. Based on PEP 282 and comments thereto in
-comp.lang.python, and influenced by Apache's log4j system.
-
-Should work under Python versions >= 1.5.2, except that source line
-information is not available unless 'inspect' is.
-
-Copyright (C) 2001-2002 Vinay Sajip. All Rights Reserved.
-
-To use, simply 'import logging' and log away!
-"""
-
-import sys, logging, socket, types, os, string, cPickle, struct, time
-
-from SocketServer import ThreadingTCPServer, StreamRequestHandler
-
-#
-# Some constants...
-#
-
-DEFAULT_TCP_LOGGING_PORT = 9020
-DEFAULT_UDP_LOGGING_PORT = 9021
-DEFAULT_HTTP_LOGGING_PORT = 9022
-DEFAULT_SOAP_LOGGING_PORT = 9023
-SYSLOG_UDP_PORT = 514
-
-
-class RotatingFileHandler(logging.FileHandler):
- def __init__(self, filename, mode="a", maxBytes=0, backupCount=0):
- """
- Open the specified file and use it as the stream for logging.
-
- By default, the file grows indefinitely. You can specify particular
- values of maxBytes and backupCount to allow the file to rollover at
- a predetermined size.
-
- Rollover occurs whenever the current log file is nearly maxBytes in
- length. If backupCount is >= 1, the system will successively create
- new files with the same pathname as the base file, but with extensions
- ".1", ".2" etc. appended to it. For example, with a backupCount of 5
- and a base file name of "app.log", you would get "app.log",
- "app.log.1", "app.log.2", ... through to "app.log.5". The file being
- written to is always "app.log" - when it gets filled up, it is closed
- and renamed to "app.log.1", and if files "app.log.1", "app.log.2" etc.
- exist, then they are renamed to "app.log.2", "app.log.3" etc.
- respectively.
-
- If maxBytes is zero, rollover never occurs.
- """
- logging.FileHandler.__init__(self, filename, mode)
- self.maxBytes = maxBytes
- self.backupCount = backupCount
- if maxBytes > 0:
- self.mode = "a"
-
- def doRollover(self):
- """
- Do a rollover, as described in __init__().
- """
-
- self.stream.close()
- if self.backupCount > 0:
- for i in range(self.backupCount - 1, 0, -1):
- sfn = "%s.%d" % (self.baseFilename, i)
- dfn = "%s.%d" % (self.baseFilename, i + 1)
- if os.path.exists(sfn):
- #print "%s -> %s" % (sfn, dfn)
- if os.path.exists(dfn):
- os.remove(dfn)
- os.rename(sfn, dfn)
- dfn = self.baseFilename + ".1"
- if os.path.exists(dfn):
- os.remove(dfn)
- os.rename(self.baseFilename, dfn)
- #print "%s -> %s" % (self.baseFilename, dfn)
- self.stream = open(self.baseFilename, "w")
-
- def emit(self, record):
- """
- Emit a record.
-
- Output the record to the file, catering for rollover as described
- in doRollover().
- """
- if self.maxBytes > 0: # are we rolling over?
- msg = "%s\n" % self.format(record)
- self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
- if self.stream.tell() + len(msg) >= self.maxBytes:
- self.doRollover()
- logging.FileHandler.emit(self, record)
-
-
-class SocketHandler(logging.Handler):
- """
- A handler class which writes logging records, in pickle format, to
- a streaming socket. The socket is kept open across logging calls.
- If the peer resets it, an attempt is made to reconnect on the next call.
- The pickle which is sent is that of the LogRecord's attribute dictionary
- (__dict__), so that the receiver does not need to have the logging module
- installed in order to process the logging event.
-
- To unpickle the record at the receiving end into a LogRecord, use the
- makeLogRecord function.
- """
-
- def __init__(self, host, port):
- """
- Initializes the handler with a specific host address and port.
-
- The attribute 'closeOnError' is set to 1 - which means that if
- a socket error occurs, the socket is silently closed and then
- reopened on the next logging call.
- """
- logging.Handler.__init__(self)
- self.host = host
- self.port = port
- self.sock = None
- self.closeOnError = 0
-
- def makeSocket(self):
- """
- A factory method which allows subclasses to define the precise
- type of socket they want.
- """
- s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
- s.connect((self.host, self.port))
- return s
-
- def send(self, s):
- """
- Send a pickled string to the socket.
-
- This function allows for partial sends which can happen when the
- network is busy.
- """
- if hasattr(self.sock, "sendall"):
- self.sock.sendall(s)
- else:
- sentsofar = 0
- left = len(s)
- while left > 0:
- sent = self.sock.send(s[sentsofar:])
- sentsofar = sentsofar + sent
- left = left - sent
-
- def makePickle(self, record):
- """
- Pickles the record in binary format with a length prefix, and
- returns it ready for transmission across the socket.
- """
- s = cPickle.dumps(record.__dict__, 1)
- #n = len(s)
- #slen = "%c%c" % ((n >> 8) & 0xFF, n & 0xFF)
- slen = struct.pack(">L", len(s))
- return slen + s
-
- def handleError(self, record):
- """
- Handle an error during logging.
-
- An error has occurred during logging. Most likely cause -
- connection lost. Close the socket so that we can retry on the
- next event.
- """
- if self.closeOnError and self.sock:
- self.sock.close()
- self.sock = None #try to reconnect next time
- else:
- logging.Handler.handleError(self, record)
-
- def emit(self, record):
- """
- Emit a record.
-
- Pickles the record and writes it to the socket in binary format.
- If there is an error with the socket, silently drop the packet.
- If there was a problem with the socket, re-establishes the
- socket.
- """
- try:
- s = self.makePickle(record)
- if not self.sock:
- self.sock = self.makeSocket()
- self.send(s)
- except:
- self.handleError(record)
-
- def close(self):
- """
- Closes the socket.
- """
- if self.sock:
- self.sock.close()
- self.sock = None
-
-class DatagramHandler(SocketHandler):
- """
- A handler class which writes logging records, in pickle format, to
- a datagram socket. The pickle which is sent is that of the LogRecord's
- attribute dictionary (__dict__), so that the receiver does not need to
- have the logging module installed in order to process the logging event.
-
- To unpickle the record at the receiving end into a LogRecord, use the
- makeLogRecord function.
-
- """
- def __init__(self, host, port):
- """
- Initializes the handler with a specific host address and port.
- """
- SocketHandler.__init__(self, host, port)
- self.closeOnError = 0
-
- def makeSocket(self):
- """
- The factory method of SocketHandler is here overridden to create
- a UDP socket (SOCK_DGRAM).
- """
- s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
- return s
-
- def send(self, s):
- """
- Send a pickled string to a socket.
-
- This function no longer allows for partial sends which can happen
- when the network is busy - UDP does not guarantee delivery and
- can deliver packets out of sequence.
- """
- self.sock.sendto(s, (self.host, self.port))
-
-class SysLogHandler(logging.Handler):
- """
- A handler class which sends formatted logging records to a syslog
- server. Based on Sam Rushing's syslog module:
- http://www.nightmare.com/squirl/python-ext/misc/syslog.py
- Contributed by Nicolas Untz (after which minor refactoring changes
- have been made).
- """
-
- # from <linux/sys/syslog.h>:
- # ======================================================================
- # priorities/facilities are encoded into a single 32-bit quantity, where
- # the bottom 3 bits are the priority (0-7) and the top 28 bits are the
- # facility (0-big number). Both the priorities and the facilities map
- # roughly one-to-one to strings in the syslogd(8) source code. This
- # mapping is included in this file.
- #
- # priorities (these are ordered)
-
- LOG_EMERG = 0 # system is unusable
- LOG_ALERT = 1 # action must be taken immediately
- LOG_CRIT = 2 # critical conditions
- LOG_ERR = 3 # error conditions
- LOG_WARNING = 4 # warning conditions
- LOG_NOTICE = 5 # normal but significant condition
- LOG_INFO = 6 # informational
- LOG_DEBUG = 7 # debug-level messages
-
- # facility codes
- LOG_KERN = 0 # kernel messages
- LOG_USER = 1 # random user-level messages
- LOG_MAIL = 2 # mail system
- LOG_DAEMON = 3 # system daemons
- LOG_AUTH = 4 # security/authorization messages
- LOG_SYSLOG = 5 # messages generated internally by syslogd
- LOG_LPR = 6 # line printer subsystem
- LOG_NEWS = 7 # network news subsystem
- LOG_UUCP = 8 # UUCP subsystem
- LOG_CRON = 9 # clock daemon
- LOG_AUTHPRIV = 10 # security/authorization messages (private)
-
- # other codes through 15 reserved for system use
- LOG_LOCAL0 = 16 # reserved for local use
- LOG_LOCAL1 = 17 # reserved for local use
- LOG_LOCAL2 = 18 # reserved for local use
- LOG_LOCAL3 = 19 # reserved for local use
- LOG_LOCAL4 = 20 # reserved for local use
- LOG_LOCAL5 = 21 # reserved for local use
- LOG_LOCAL6 = 22 # reserved for local use
- LOG_LOCAL7 = 23 # reserved for local use
-
- priority_names = {
- "alert": LOG_ALERT,
- "crit": LOG_CRIT,
- "critical": LOG_CRIT,
- "debug": LOG_DEBUG,
- "emerg": LOG_EMERG,
- "err": LOG_ERR,
- "error": LOG_ERR, # DEPRECATED
- "info": LOG_INFO,
- "notice": LOG_NOTICE,
- "panic": LOG_EMERG, # DEPRECATED
- "warn": LOG_WARNING, # DEPRECATED
- "warning": LOG_WARNING,
- }
-
- facility_names = {
- "auth": LOG_AUTH,
- "authpriv": LOG_AUTHPRIV,
- "cron": LOG_CRON,
- "daemon": LOG_DAEMON,
- "kern": LOG_KERN,
- "lpr": LOG_LPR,
- "mail": LOG_MAIL,
- "news": LOG_NEWS,
- "security": LOG_AUTH, # DEPRECATED
- "syslog": LOG_SYSLOG,
- "user": LOG_USER,
- "uucp": LOG_UUCP,
- "local0": LOG_LOCAL0,
- "local1": LOG_LOCAL1,
- "local2": LOG_LOCAL2,
- "local3": LOG_LOCAL3,
- "local4": LOG_LOCAL4,
- "local5": LOG_LOCAL5,
- "local6": LOG_LOCAL6,
- "local7": LOG_LOCAL7,
- }
-
- def __init__(self, address=('localhost', SYSLOG_UDP_PORT), facility=LOG_USER):
- """
- Initialize a handler.
-
- If address is specified as a string, UNIX socket is used.
- If facility is not specified, LOG_USER is used.
- """
- logging.Handler.__init__(self)
-
- self.address = address
- self.facility = facility
- if type(address) == types.StringType:
- self.socket = socket.socket(socket.AF_UNIX, socket.SOCK_DGRAM)
- # syslog may require either DGRAM or STREAM sockets
- try:
- self.socket.connect(address)
- except socket.error:
- self.socket.close()
- self.socket = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
- self.socket.connect(address)
- self.unixsocket = 1
- else:
- self.socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
- self.unixsocket = 0
-
- self.formatter = None
-
- # curious: when talking to the unix-domain '/dev/log' socket, a
- # zero-terminator seems to be required. this string is placed
- # into a class variable so that it can be overridden if
- # necessary.
- log_format_string = '<%d>%s\000'
-
- def encodePriority (self, facility, priority):
- """
- Encode the facility and priority. You can pass in strings or
- integers - if strings are passed, the facility_names and
- priority_names mapping dictionaries are used to convert them to
- integers.
- """
- if type(facility) == types.StringType:
- facility = self.facility_names[facility]
- if type(priority) == types.StringType:
- priority = self.priority_names[priority]
- return (facility << 3) | priority
-
- def close (self):
- """
- Closes the socket.
- """
- if self.unixsocket:
- self.socket.close()
-
- def emit(self, record):
- """
- Emit a record.
-
- The record is formatted, and then sent to the syslog server. If
- exception information is present, it is NOT sent to the server.
- """
- msg = self.format(record)
- """
- We need to convert record level to lowercase, maybe this will
- change in the future.
- """
- msg = self.log_format_string % (
- self.encodePriority(self.facility,
- string.lower(record.levelname)),
- msg)
- try:
- if self.unixsocket:
- self.socket.send(msg)
- else:
- self.socket.sendto(msg, self.address)
- except:
- self.handleError(record)
-
-class SMTPHandler(logging.Handler):
- """
- A handler class which sends an SMTP email for each logging event.
- """
- def __init__(self, mailhost, fromaddr, toaddrs, subject):
- """
- Initialize the handler.
-
- Initialize the instance with the from and to addresses and subject
- line of the email. To specify a non-standard SMTP port, use the
- (host, port) tuple format for the mailhost argument.
- """
- logging.Handler.__init__(self)
- if type(mailhost) == types.TupleType:
- host, port = mailhost
- self.mailhost = host
- self.mailport = port
- else:
- self.mailhost = mailhost
- self.mailport = None
- self.fromaddr = fromaddr
- if type(toaddrs) == types.StringType:
- toaddrs = [toaddrs]
- self.toaddrs = toaddrs
- self.subject = subject
-
- def getSubject(self, record):
- """
- Determine the subject for the email.
-
- If you want to specify a subject line which is record-dependent,
- override this method.
- """
- return self.subject
-
- weekdayname = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
-
- monthname = [None,
- 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
- 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
-
- def date_time(self):
- """Return the current date and time formatted for a MIME header."""
- year, month, day, hh, mm, ss, wd, y, z = time.gmtime(time.time())
- s = "%s, %02d %3s %4d %02d:%02d:%02d GMT" % (
- self.weekdayname[wd],
- day, self.monthname[month], year,
- hh, mm, ss)
- return s
-
- def emit(self, record):
- """
- Emit a record.
-
- Format the record and send it to the specified addressees.
- """
- try:
- import smtplib
- port = self.mailport
- if not port:
- port = smtplib.SMTP_PORT
- smtp = smtplib.SMTP(self.mailhost, port)
- msg = self.format(record)
- msg = "From: %s\r\nTo: %s\r\nSubject: %s\r\nDate: %s\r\n\r\n%s" % (
- self.fromaddr,
- string.join(self.toaddrs, ","),
- self.getSubject(record),
- self.date_time(), msg)
- smtp.sendmail(self.fromaddr, self.toaddrs, msg)
- smtp.quit()
- except:
- self.handleError(record)
-
-class NTEventLogHandler(logging.Handler):
- """
- A handler class which sends events to the NT Event Log. Adds a
- registry entry for the specified application name. If no dllname is
- provided, win32service.pyd (which contains some basic message
- placeholders) is used. Note that use of these placeholders will make
- your event logs big, as the entire message source is held in the log.
- If you want slimmer logs, you have to pass in the name of your own DLL
- which contains the message definitions you want to use in the event log.
- """
- def __init__(self, appname, dllname=None, logtype="Application"):
- logging.Handler.__init__(self)
- try:
- import win32evtlogutil, win32evtlog
- self.appname = appname
- self._welu = win32evtlogutil
- if not dllname:
- dllname = os.path.split(self._welu.__file__)
- dllname = os.path.split(dllname[0])
- dllname = os.path.join(dllname[0], r'win32service.pyd')
- self.dllname = dllname
- self.logtype = logtype
- self._welu.AddSourceToRegistry(appname, dllname, logtype)
- self.deftype = win32evtlog.EVENTLOG_ERROR_TYPE
- self.typemap = {
- logging.DEBUG : win32evtlog.EVENTLOG_INFORMATION_TYPE,
- logging.INFO : win32evtlog.EVENTLOG_INFORMATION_TYPE,
- logging.WARNING : win32evtlog.EVENTLOG_WARNING_TYPE,
- logging.ERROR : win32evtlog.EVENTLOG_ERROR_TYPE,
- logging.CRITICAL: win32evtlog.EVENTLOG_ERROR_TYPE,
- }
- except ImportError:
- print "The Python Win32 extensions for NT (service, event "\
- "logging) appear not to be available."
- self._welu = None
-
- def getMessageID(self, record):
- """
- Return the message ID for the event record. If you are using your
- own messages, you could do this by having the msg passed to the
- logger being an ID rather than a formatting string. Then, in here,
- you could use a dictionary lookup to get the message ID. This
- version returns 1, which is the base message ID in win32service.pyd.
- """
- return 1
-
- def getEventCategory(self, record):
- """
- Return the event category for the record.
-
- Override this if you want to specify your own categories. This version
- returns 0.
- """
- return 0
-
- def getEventType(self, record):
- """
- Return the event type for the record.
-
- Override this if you want to specify your own types. This version does
- a mapping using the handler's typemap attribute, which is set up in
- __init__() to a dictionary which contains mappings for DEBUG, INFO,
- WARNING, ERROR and CRITICAL. If you are using your own levels you will
- either need to override this method or place a suitable dictionary in
- the handler's typemap attribute.
- """
- return self.typemap.get(record.levelno, self.deftype)
-
- def emit(self, record):
- """
- Emit a record.
-
- Determine the message ID, event category and event type. Then
- log the message in the NT event log.
- """
- if self._welu:
- try:
- id = self.getMessageID(record)
- cat = self.getEventCategory(record)
- type = self.getEventType(record)
- msg = self.format(record)
- self._welu.ReportEvent(self.appname, id, cat, type, [msg])
- except:
- self.handleError(record)
-
- def close(self):
- """
- Clean up this handler.
-
- You can remove the application name from the registry as a
- source of event log entries. However, if you do this, you will
- not be able to see the events as you intended in the Event Log
- Viewer - it needs to be able to access the registry to get the
- DLL name.
- """
- #self._welu.RemoveSourceFromRegistry(self.appname, self.logtype)
- pass
-
-class HTTPHandler(logging.Handler):
- """
- A class which sends records to a Web server, using either GET or
- POST semantics.
- """
- def __init__(self, host, url, method="GET"):
- """
- Initialize the instance with the host, the request URL, and the method
- ("GET" or "POST")
- """
- logging.Handler.__init__(self)
- method = string.upper(method)
- if method not in ["GET", "POST"]:
- raise ValueError, "method must be GET or POST"
- self.host = host
- self.url = url
- self.method = method
-
- def mapLogRecord(self, record):
- """
- Default implementation of mapping the log record into a dict
- that is send as the CGI data. Overwrite in your class.
- Contributed by Franz Glasner.
- """
- return record.__dict__
-
- def emit(self, record):
- """
- Emit a record.
-
- Send the record to the Web server as an URL-encoded dictionary
- """
- try:
- import httplib, urllib
- h = httplib.HTTP(self.host)
- url = self.url
- data = urllib.urlencode(self.mapLogRecord(record))
- if self.method == "GET":
- if (string.find(url, '?') >= 0):
- sep = '&'
- else:
- sep = '?'
- url = url + "%c%s" % (sep, data)
- h.putrequest(self.method, url)
- if self.method == "POST":
- h.putheader("Content-length", str(len(data)))
- h.endheaders()
- if self.method == "POST":
- h.send(data)
- h.getreply() #can't do anything with the result
- except:
- self.handleError(record)
-
-class BufferingHandler(logging.Handler):
- """
- A handler class which buffers logging records in memory. Whenever each
- record is added to the buffer, a check is made to see if the buffer should
- be flushed. If it should, then flush() is expected to do what's needed.
- """
- def __init__(self, capacity):
- """
- Initialize the handler with the buffer size.
- """
- logging.Handler.__init__(self)
- self.capacity = capacity
- self.buffer = []
-
- def shouldFlush(self, record):
- """
- Should the handler flush its buffer?
-
- Returns true if the buffer is up to capacity. This method can be
- overridden to implement custom flushing strategies.
- """
- return (len(self.buffer) >= self.capacity)
-
- def emit(self, record):
- """
- Emit a record.
-
- Append the record. If shouldFlush() tells us to, call flush() to process
- the buffer.
- """
- self.buffer.append(record)
- if self.shouldFlush(record):
- self.flush()
-
- def flush(self):
- """
- Override to implement custom flushing behaviour.
-
- This version just zaps the buffer to empty.
- """
- self.buffer = []
-
-class MemoryHandler(BufferingHandler):
- """
- A handler class which buffers logging records in memory, periodically
- flushing them to a target handler. Flushing occurs whenever the buffer
- is full, or when an event of a certain severity or greater is seen.
- """
- def __init__(self, capacity, flushLevel=logging.ERROR, target=None):
- """
- Initialize the handler with the buffer size, the level at which
- flushing should occur and an optional target.
-
- Note that without a target being set either here or via setTarget(),
- a MemoryHandler is no use to anyone!
- """
- BufferingHandler.__init__(self, capacity)
- self.flushLevel = flushLevel
- self.target = target
-
- def shouldFlush(self, record):
- """
- Check for buffer full or a record at the flushLevel or higher.
- """
- return (len(self.buffer) >= self.capacity) or \
- (record.levelno >= self.flushLevel)
-
- def setTarget(self, target):
- """
- Set the target handler for this handler.
- """
- self.target = target
-
- def flush(self):
- """
- For a MemoryHandler, flushing means just sending the buffered
- records to the target, if there is one. Override if you want
- different behaviour.
- """
- if self.target:
- for record in self.buffer:
- self.target.handle(record)
- self.buffer = []
-
- def close(self):
- """
- Flush, set the target to None and lose the buffer.
- """
- self.flush()
- self.target = None
- self.buffer = []
Copied: trunk/lib/venus/planet/vendor/compat_logging/handlers.py (from rev 656, branches/sucs-site/lib/venus/planet/vendor/compat_logging/handlers.py)
===================================================================
--- trunk/lib/venus/planet/vendor/compat_logging/handlers.py (rev 0)
+++ trunk/lib/venus/planet/vendor/compat_logging/handlers.py 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,728 @@
+# Copyright 2001-2002 by Vinay Sajip. All Rights Reserved.
+#
+# Permission to use, copy, modify, and distribute this software and its
+# documentation for any purpose and without fee is hereby granted,
+# provided that the above copyright notice appear in all copies and that
+# both that copyright notice and this permission notice appear in
+# supporting documentation, and that the name of Vinay Sajip
+# not be used in advertising or publicity pertaining to distribution
+# of the software without specific, written prior permission.
+# VINAY SAJIP DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+# ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL
+# VINAY SAJIP BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+# ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER
+# IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
+# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+"""
+Logging package for Python. Based on PEP 282 and comments thereto in
+comp.lang.python, and influenced by Apache's log4j system.
+
+Should work under Python versions >= 1.5.2, except that source line
+information is not available unless 'inspect' is.
+
+Copyright (C) 2001-2002 Vinay Sajip. All Rights Reserved.
+
+To use, simply 'import logging' and log away!
+"""
+
+import sys, logging, socket, types, os, string, cPickle, struct, time
+
+from SocketServer import ThreadingTCPServer, StreamRequestHandler
+
+#
+# Some constants...
+#
+
+DEFAULT_TCP_LOGGING_PORT = 9020
+DEFAULT_UDP_LOGGING_PORT = 9021
+DEFAULT_HTTP_LOGGING_PORT = 9022
+DEFAULT_SOAP_LOGGING_PORT = 9023
+SYSLOG_UDP_PORT = 514
+
+
+class RotatingFileHandler(logging.FileHandler):
+ def __init__(self, filename, mode="a", maxBytes=0, backupCount=0):
+ """
+ Open the specified file and use it as the stream for logging.
+
+ By default, the file grows indefinitely. You can specify particular
+ values of maxBytes and backupCount to allow the file to rollover at
+ a predetermined size.
+
+ Rollover occurs whenever the current log file is nearly maxBytes in
+ length. If backupCount is >= 1, the system will successively create
+ new files with the same pathname as the base file, but with extensions
+ ".1", ".2" etc. appended to it. For example, with a backupCount of 5
+ and a base file name of "app.log", you would get "app.log",
+ "app.log.1", "app.log.2", ... through to "app.log.5". The file being
+ written to is always "app.log" - when it gets filled up, it is closed
+ and renamed to "app.log.1", and if files "app.log.1", "app.log.2" etc.
+ exist, then they are renamed to "app.log.2", "app.log.3" etc.
+ respectively.
+
+ If maxBytes is zero, rollover never occurs.
+ """
+ logging.FileHandler.__init__(self, filename, mode)
+ self.maxBytes = maxBytes
+ self.backupCount = backupCount
+ if maxBytes > 0:
+ self.mode = "a"
+
+ def doRollover(self):
+ """
+ Do a rollover, as described in __init__().
+ """
+
+ self.stream.close()
+ if self.backupCount > 0:
+ for i in range(self.backupCount - 1, 0, -1):
+ sfn = "%s.%d" % (self.baseFilename, i)
+ dfn = "%s.%d" % (self.baseFilename, i + 1)
+ if os.path.exists(sfn):
+ #print "%s -> %s" % (sfn, dfn)
+ if os.path.exists(dfn):
+ os.remove(dfn)
+ os.rename(sfn, dfn)
+ dfn = self.baseFilename + ".1"
+ if os.path.exists(dfn):
+ os.remove(dfn)
+ os.rename(self.baseFilename, dfn)
+ #print "%s -> %s" % (self.baseFilename, dfn)
+ self.stream = open(self.baseFilename, "w")
+
+ def emit(self, record):
+ """
+ Emit a record.
+
+ Output the record to the file, catering for rollover as described
+ in doRollover().
+ """
+ if self.maxBytes > 0: # are we rolling over?
+ msg = "%s\n" % self.format(record)
+ self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+ if self.stream.tell() + len(msg) >= self.maxBytes:
+ self.doRollover()
+ logging.FileHandler.emit(self, record)
+
+
+class SocketHandler(logging.Handler):
+ """
+ A handler class which writes logging records, in pickle format, to
+ a streaming socket. The socket is kept open across logging calls.
+ If the peer resets it, an attempt is made to reconnect on the next call.
+ The pickle which is sent is that of the LogRecord's attribute dictionary
+ (__dict__), so that the receiver does not need to have the logging module
+ installed in order to process the logging event.
+
+ To unpickle the record at the receiving end into a LogRecord, use the
+ makeLogRecord function.
+ """
+
+ def __init__(self, host, port):
+ """
+ Initializes the handler with a specific host address and port.
+
+ The attribute 'closeOnError' is set to 1 - which means that if
+ a socket error occurs, the socket is silently closed and then
+ reopened on the next logging call.
+ """
+ logging.Handler.__init__(self)
+ self.host = host
+ self.port = port
+ self.sock = None
+ self.closeOnError = 0
+
+ def makeSocket(self):
+ """
+ A factory method which allows subclasses to define the precise
+ type of socket they want.
+ """
+ s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+ s.connect((self.host, self.port))
+ return s
+
+ def send(self, s):
+ """
+ Send a pickled string to the socket.
+
+ This function allows for partial sends which can happen when the
+ network is busy.
+ """
+ if hasattr(self.sock, "sendall"):
+ self.sock.sendall(s)
+ else:
+ sentsofar = 0
+ left = len(s)
+ while left > 0:
+ sent = self.sock.send(s[sentsofar:])
+ sentsofar = sentsofar + sent
+ left = left - sent
+
+ def makePickle(self, record):
+ """
+ Pickles the record in binary format with a length prefix, and
+ returns it ready for transmission across the socket.
+ """
+ s = cPickle.dumps(record.__dict__, 1)
+ #n = len(s)
+ #slen = "%c%c" % ((n >> 8) & 0xFF, n & 0xFF)
+ slen = struct.pack(">L", len(s))
+ return slen + s
+
+ def handleError(self, record):
+ """
+ Handle an error during logging.
+
+ An error has occurred during logging. Most likely cause -
+ connection lost. Close the socket so that we can retry on the
+ next event.
+ """
+ if self.closeOnError and self.sock:
+ self.sock.close()
+ self.sock = None #try to reconnect next time
+ else:
+ logging.Handler.handleError(self, record)
+
+ def emit(self, record):
+ """
+ Emit a record.
+
+ Pickles the record and writes it to the socket in binary format.
+ If there is an error with the socket, silently drop the packet.
+ If there was a problem with the socket, re-establishes the
+ socket.
+ """
+ try:
+ s = self.makePickle(record)
+ if not self.sock:
+ self.sock = self.makeSocket()
+ self.send(s)
+ except:
+ self.handleError(record)
+
+ def close(self):
+ """
+ Closes the socket.
+ """
+ if self.sock:
+ self.sock.close()
+ self.sock = None
+
+class DatagramHandler(SocketHandler):
+ """
+ A handler class which writes logging records, in pickle format, to
+ a datagram socket. The pickle which is sent is that of the LogRecord's
+ attribute dictionary (__dict__), so that the receiver does not need to
+ have the logging module installed in order to process the logging event.
+
+ To unpickle the record at the receiving end into a LogRecord, use the
+ makeLogRecord function.
+
+ """
+ def __init__(self, host, port):
+ """
+ Initializes the handler with a specific host address and port.
+ """
+ SocketHandler.__init__(self, host, port)
+ self.closeOnError = 0
+
+ def makeSocket(self):
+ """
+ The factory method of SocketHandler is here overridden to create
+ a UDP socket (SOCK_DGRAM).
+ """
+ s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
+ return s
+
+ def send(self, s):
+ """
+ Send a pickled string to a socket.
+
+ This function no longer allows for partial sends which can happen
+ when the network is busy - UDP does not guarantee delivery and
+ can deliver packets out of sequence.
+ """
+ self.sock.sendto(s, (self.host, self.port))
+
+class SysLogHandler(logging.Handler):
+ """
+ A handler class which sends formatted logging records to a syslog
+ server. Based on Sam Rushing's syslog module:
+ http://www.nightmare.com/squirl/python-ext/misc/syslog.py
+ Contributed by Nicolas Untz (after which minor refactoring changes
+ have been made).
+ """
+
+ # from <linux/sys/syslog.h>:
+ # ======================================================================
+ # priorities/facilities are encoded into a single 32-bit quantity, where
+ # the bottom 3 bits are the priority (0-7) and the top 28 bits are the
+ # facility (0-big number). Both the priorities and the facilities map
+ # roughly one-to-one to strings in the syslogd(8) source code. This
+ # mapping is included in this file.
+ #
+ # priorities (these are ordered)
+
+ LOG_EMERG = 0 # system is unusable
+ LOG_ALERT = 1 # action must be taken immediately
+ LOG_CRIT = 2 # critical conditions
+ LOG_ERR = 3 # error conditions
+ LOG_WARNING = 4 # warning conditions
+ LOG_NOTICE = 5 # normal but significant condition
+ LOG_INFO = 6 # informational
+ LOG_DEBUG = 7 # debug-level messages
+
+ # facility codes
+ LOG_KERN = 0 # kernel messages
+ LOG_USER = 1 # random user-level messages
+ LOG_MAIL = 2 # mail system
+ LOG_DAEMON = 3 # system daemons
+ LOG_AUTH = 4 # security/authorization messages
+ LOG_SYSLOG = 5 # messages generated internally by syslogd
+ LOG_LPR = 6 # line printer subsystem
+ LOG_NEWS = 7 # network news subsystem
+ LOG_UUCP = 8 # UUCP subsystem
+ LOG_CRON = 9 # clock daemon
+ LOG_AUTHPRIV = 10 # security/authorization messages (private)
+
+ # other codes through 15 reserved for system use
+ LOG_LOCAL0 = 16 # reserved for local use
+ LOG_LOCAL1 = 17 # reserved for local use
+ LOG_LOCAL2 = 18 # reserved for local use
+ LOG_LOCAL3 = 19 # reserved for local use
+ LOG_LOCAL4 = 20 # reserved for local use
+ LOG_LOCAL5 = 21 # reserved for local use
+ LOG_LOCAL6 = 22 # reserved for local use
+ LOG_LOCAL7 = 23 # reserved for local use
+
+ priority_names = {
+ "alert": LOG_ALERT,
+ "crit": LOG_CRIT,
+ "critical": LOG_CRIT,
+ "debug": LOG_DEBUG,
+ "emerg": LOG_EMERG,
+ "err": LOG_ERR,
+ "error": LOG_ERR, # DEPRECATED
+ "info": LOG_INFO,
+ "notice": LOG_NOTICE,
+ "panic": LOG_EMERG, # DEPRECATED
+ "warn": LOG_WARNING, # DEPRECATED
+ "warning": LOG_WARNING,
+ }
+
+ facility_names = {
+ "auth": LOG_AUTH,
+ "authpriv": LOG_AUTHPRIV,
+ "cron": LOG_CRON,
+ "daemon": LOG_DAEMON,
+ "kern": LOG_KERN,
+ "lpr": LOG_LPR,
+ "mail": LOG_MAIL,
+ "news": LOG_NEWS,
+ "security": LOG_AUTH, # DEPRECATED
+ "syslog": LOG_SYSLOG,
+ "user": LOG_USER,
+ "uucp": LOG_UUCP,
+ "local0": LOG_LOCAL0,
+ "local1": LOG_LOCAL1,
+ "local2": LOG_LOCAL2,
+ "local3": LOG_LOCAL3,
+ "local4": LOG_LOCAL4,
+ "local5": LOG_LOCAL5,
+ "local6": LOG_LOCAL6,
+ "local7": LOG_LOCAL7,
+ }
+
+ def __init__(self, address=('localhost', SYSLOG_UDP_PORT), facility=LOG_USER):
+ """
+ Initialize a handler.
+
+ If address is specified as a string, UNIX socket is used.
+ If facility is not specified, LOG_USER is used.
+ """
+ logging.Handler.__init__(self)
+
+ self.address = address
+ self.facility = facility
+ if type(address) == types.StringType:
+ self.socket = socket.socket(socket.AF_UNIX, socket.SOCK_DGRAM)
+ # syslog may require either DGRAM or STREAM sockets
+ try:
+ self.socket.connect(address)
+ except socket.error:
+ self.socket.close()
+ self.socket = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
+ self.socket.connect(address)
+ self.unixsocket = 1
+ else:
+ self.socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
+ self.unixsocket = 0
+
+ self.formatter = None
+
+ # curious: when talking to the unix-domain '/dev/log' socket, a
+ # zero-terminator seems to be required. this string is placed
+ # into a class variable so that it can be overridden if
+ # necessary.
+ log_format_string = '<%d>%s\000'
+
+ def encodePriority (self, facility, priority):
+ """
+ Encode the facility and priority. You can pass in strings or
+ integers - if strings are passed, the facility_names and
+ priority_names mapping dictionaries are used to convert them to
+ integers.
+ """
+ if type(facility) == types.StringType:
+ facility = self.facility_names[facility]
+ if type(priority) == types.StringType:
+ priority = self.priority_names[priority]
+ return (facility << 3) | priority
+
+ def close (self):
+ """
+ Closes the socket.
+ """
+ if self.unixsocket:
+ self.socket.close()
+
+ def emit(self, record):
+ """
+ Emit a record.
+
+ The record is formatted, and then sent to the syslog server. If
+ exception information is present, it is NOT sent to the server.
+ """
+ msg = self.format(record)
+ """
+ We need to convert record level to lowercase, maybe this will
+ change in the future.
+ """
+ msg = self.log_format_string % (
+ self.encodePriority(self.facility,
+ string.lower(record.levelname)),
+ msg)
+ try:
+ if self.unixsocket:
+ self.socket.send(msg)
+ else:
+ self.socket.sendto(msg, self.address)
+ except:
+ self.handleError(record)
+
+class SMTPHandler(logging.Handler):
+ """
+ A handler class which sends an SMTP email for each logging event.
+ """
+ def __init__(self, mailhost, fromaddr, toaddrs, subject):
+ """
+ Initialize the handler.
+
+ Initialize the instance with the from and to addresses and subject
+ line of the email. To specify a non-standard SMTP port, use the
+ (host, port) tuple format for the mailhost argument.
+ """
+ logging.Handler.__init__(self)
+ if type(mailhost) == types.TupleType:
+ host, port = mailhost
+ self.mailhost = host
+ self.mailport = port
+ else:
+ self.mailhost = mailhost
+ self.mailport = None
+ self.fromaddr = fromaddr
+ if type(toaddrs) == types.StringType:
+ toaddrs = [toaddrs]
+ self.toaddrs = toaddrs
+ self.subject = subject
+
+ def getSubject(self, record):
+ """
+ Determine the subject for the email.
+
+ If you want to specify a subject line which is record-dependent,
+ override this method.
+ """
+ return self.subject
+
+ weekdayname = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
+
+ monthname = [None,
+ 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
+ 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
+
+ def date_time(self):
+ """Return the current date and time formatted for a MIME header."""
+ year, month, day, hh, mm, ss, wd, y, z = time.gmtime(time.time())
+ s = "%s, %02d %3s %4d %02d:%02d:%02d GMT" % (
+ self.weekdayname[wd],
+ day, self.monthname[month], year,
+ hh, mm, ss)
+ return s
+
+ def emit(self, record):
+ """
+ Emit a record.
+
+ Format the record and send it to the specified addressees.
+ """
+ try:
+ import smtplib
+ port = self.mailport
+ if not port:
+ port = smtplib.SMTP_PORT
+ smtp = smtplib.SMTP(self.mailhost, port)
+ msg = self.format(record)
+ msg = "From: %s\r\nTo: %s\r\nSubject: %s\r\nDate: %s\r\n\r\n%s" % (
+ self.fromaddr,
+ string.join(self.toaddrs, ","),
+ self.getSubject(record),
+ self.date_time(), msg)
+ smtp.sendmail(self.fromaddr, self.toaddrs, msg)
+ smtp.quit()
+ except:
+ self.handleError(record)
+
+class NTEventLogHandler(logging.Handler):
+ """
+ A handler class which sends events to the NT Event Log. Adds a
+ registry entry for the specified application name. If no dllname is
+ provided, win32service.pyd (which contains some basic message
+ placeholders) is used. Note that use of these placeholders will make
+ your event logs big, as the entire message source is held in the log.
+ If you want slimmer logs, you have to pass in the name of your own DLL
+ which contains the message definitions you want to use in the event log.
+ """
+ def __init__(self, appname, dllname=None, logtype="Application"):
+ logging.Handler.__init__(self)
+ try:
+ import win32evtlogutil, win32evtlog
+ self.appname = appname
+ self._welu = win32evtlogutil
+ if not dllname:
+ dllname = os.path.split(self._welu.__file__)
+ dllname = os.path.split(dllname[0])
+ dllname = os.path.join(dllname[0], r'win32service.pyd')
+ self.dllname = dllname
+ self.logtype = logtype
+ self._welu.AddSourceToRegistry(appname, dllname, logtype)
+ self.deftype = win32evtlog.EVENTLOG_ERROR_TYPE
+ self.typemap = {
+ logging.DEBUG : win32evtlog.EVENTLOG_INFORMATION_TYPE,
+ logging.INFO : win32evtlog.EVENTLOG_INFORMATION_TYPE,
+ logging.WARNING : win32evtlog.EVENTLOG_WARNING_TYPE,
+ logging.ERROR : win32evtlog.EVENTLOG_ERROR_TYPE,
+ logging.CRITICAL: win32evtlog.EVENTLOG_ERROR_TYPE,
+ }
+ except ImportError:
+ print "The Python Win32 extensions for NT (service, event "\
+ "logging) appear not to be available."
+ self._welu = None
+
+ def getMessageID(self, record):
+ """
+ Return the message ID for the event record. If you are using your
+ own messages, you could do this by having the msg passed to the
+ logger being an ID rather than a formatting string. Then, in here,
+ you could use a dictionary lookup to get the message ID. This
+ version returns 1, which is the base message ID in win32service.pyd.
+ """
+ return 1
+
+ def getEventCategory(self, record):
+ """
+ Return the event category for the record.
+
+ Override this if you want to specify your own categories. This version
+ returns 0.
+ """
+ return 0
+
+ def getEventType(self, record):
+ """
+ Return the event type for the record.
+
+ Override this if you want to specify your own types. This version does
+ a mapping using the handler's typemap attribute, which is set up in
+ __init__() to a dictionary which contains mappings for DEBUG, INFO,
+ WARNING, ERROR and CRITICAL. If you are using your own levels you will
+ either need to override this method or place a suitable dictionary in
+ the handler's typemap attribute.
+ """
+ return self.typemap.get(record.levelno, self.deftype)
+
+ def emit(self, record):
+ """
+ Emit a record.
+
+ Determine the message ID, event category and event type. Then
+ log the message in the NT event log.
+ """
+ if self._welu:
+ try:
+ id = self.getMessageID(record)
+ cat = self.getEventCategory(record)
+ type = self.getEventType(record)
+ msg = self.format(record)
+ self._welu.ReportEvent(self.appname, id, cat, type, [msg])
+ except:
+ self.handleError(record)
+
+ def close(self):
+ """
+ Clean up this handler.
+
+ You can remove the application name from the registry as a
+ source of event log entries. However, if you do this, you will
+ not be able to see the events as you intended in the Event Log
+ Viewer - it needs to be able to access the registry to get the
+ DLL name.
+ """
+ #self._welu.RemoveSourceFromRegistry(self.appname, self.logtype)
+ pass
+
+class HTTPHandler(logging.Handler):
+ """
+ A class which sends records to a Web server, using either GET or
+ POST semantics.
+ """
+ def __init__(self, host, url, method="GET"):
+ """
+ Initialize the instance with the host, the request URL, and the method
+ ("GET" or "POST")
+ """
+ logging.Handler.__init__(self)
+ method = string.upper(method)
+ if method not in ["GET", "POST"]:
+ raise ValueError, "method must be GET or POST"
+ self.host = host
+ self.url = url
+ self.method = method
+
+ def mapLogRecord(self, record):
+ """
+ Default implementation of mapping the log record into a dict
+ that is send as the CGI data. Overwrite in your class.
+ Contributed by Franz Glasner.
+ """
+ return record.__dict__
+
+ def emit(self, record):
+ """
+ Emit a record.
+
+ Send the record to the Web server as an URL-encoded dictionary
+ """
+ try:
+ import httplib, urllib
+ h = httplib.HTTP(self.host)
+ url = self.url
+ data = urllib.urlencode(self.mapLogRecord(record))
+ if self.method == "GET":
+ if (string.find(url, '?') >= 0):
+ sep = '&'
+ else:
+ sep = '?'
+ url = url + "%c%s" % (sep, data)
+ h.putrequest(self.method, url)
+ if self.method == "POST":
+ h.putheader("Content-length", str(len(data)))
+ h.endheaders()
+ if self.method == "POST":
+ h.send(data)
+ h.getreply() #can't do anything with the result
+ except:
+ self.handleError(record)
+
+class BufferingHandler(logging.Handler):
+ """
+ A handler class which buffers logging records in memory. Whenever each
+ record is added to the buffer, a check is made to see if the buffer should
+ be flushed. If it should, then flush() is expected to do what's needed.
+ """
+ def __init__(self, capacity):
+ """
+ Initialize the handler with the buffer size.
+ """
+ logging.Handler.__init__(self)
+ self.capacity = capacity
+ self.buffer = []
+
+ def shouldFlush(self, record):
+ """
+ Should the handler flush its buffer?
+
+ Returns true if the buffer is up to capacity. This method can be
+ overridden to implement custom flushing strategies.
+ """
+ return (len(self.buffer) >= self.capacity)
+
+ def emit(self, record):
+ """
+ Emit a record.
+
+ Append the record. If shouldFlush() tells us to, call flush() to process
+ the buffer.
+ """
+ self.buffer.append(record)
+ if self.shouldFlush(record):
+ self.flush()
+
+ def flush(self):
+ """
+ Override to implement custom flushing behaviour.
+
+ This version just zaps the buffer to empty.
+ """
+ self.buffer = []
+
+class MemoryHandler(BufferingHandler):
+ """
+ A handler class which buffers logging records in memory, periodically
+ flushing them to a target handler. Flushing occurs whenever the buffer
+ is full, or when an event of a certain severity or greater is seen.
+ """
+ def __init__(self, capacity, flushLevel=logging.ERROR, target=None):
+ """
+ Initialize the handler with the buffer size, the level at which
+ flushing should occur and an optional target.
+
+ Note that without a target being set either here or via setTarget(),
+ a MemoryHandler is no use to anyone!
+ """
+ BufferingHandler.__init__(self, capacity)
+ self.flushLevel = flushLevel
+ self.target = target
+
+ def shouldFlush(self, record):
+ """
+ Check for buffer full or a record at the flushLevel or higher.
+ """
+ return (len(self.buffer) >= self.capacity) or \
+ (record.levelno >= self.flushLevel)
+
+ def setTarget(self, target):
+ """
+ Set the target handler for this handler.
+ """
+ self.target = target
+
+ def flush(self):
+ """
+ For a MemoryHandler, flushing means just sending the buffered
+ records to the target, if there is one. Override if you want
+ different behaviour.
+ """
+ if self.target:
+ for record in self.buffer:
+ self.target.handle(record)
+ self.buffer = []
+
+ def close(self):
+ """
+ Flush, set the target to None and lose the buffer.
+ """
+ self.flush()
+ self.target = None
+ self.buffer = []
Deleted: trunk/lib/venus/planet/vendor/feedparser.py
===================================================================
--- branches/sucs-site/lib/venus/planet/vendor/feedparser.py 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/lib/venus/planet/vendor/feedparser.py 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,3612 +0,0 @@
-#!/usr/bin/env python
-"""Universal feed parser
-
-Handles RSS 0.9x, RSS 1.0, RSS 2.0, CDF, Atom 0.3, and Atom 1.0 feeds
-
-Visit http://feedparser.org/ for the latest version
-Visit http://feedparser.org/docs/ for the latest documentation
-
-Required: Python 2.1 or later
-Recommended: Python 2.3 or later
-Recommended: CJKCodecs and iconv_codec <http://cjkpython.i18n.org/>
-"""
-
-__version__ = "4.2-pre-" + "$Revision: 291 $"[11:14] + "-svn"
-__license__ = """Copyright (c) 2002-2008, Mark Pilgrim, All rights reserved.
-
-Redistribution and use in source and binary forms, with or without modification,
-are permitted provided that the following conditions are met:
-
-* Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-* Redistributions in binary form must reproduce the above copyright notice,
- this list of conditions and the following disclaimer in the documentation
- and/or other materials provided with the distribution.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS'
-AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
-LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-POSSIBILITY OF SUCH DAMAGE."""
-__author__ = "Mark Pilgrim <http://diveintomark.org/>"
-__contributors__ = ["Jason Diamond <http://injektilo.org/>",
- "John Beimler <http://john.beimler.org/>",
- "Fazal Majid <http://www.majid.info/mylos/weblog/>",
- "Aaron Swartz <http://aaronsw.com/>",
- "Kevin Marks <http://epeus.blogspot.com/>",
- "Sam Ruby <http://intertwingly.net/>"]
-_debug = 0
-
-# HTTP "User-Agent" header to send to servers when downloading feeds.
-# If you are embedding feedparser in a larger application, you should
-# change this to your application name and URL.
-USER_AGENT = "UniversalFeedParser/%s +http://feedparser.org/" % __version__
-
-# HTTP "Accept" header to send to servers when downloading feeds. If you don't
-# want to send an Accept header, set this to None.
-ACCEPT_HEADER = "application/atom+xml,application/rdf+xml,application/rss+xml,application/x-netcdf,application/xml;q=0.9,text/xml;q=0.2,*/*;q=0.1"
-
-# List of preferred XML parsers, by SAX driver name. These will be tried first,
-# but if they're not installed, Python will keep searching through its own list
-# of pre-installed parsers until it finds one that supports everything we need.
-PREFERRED_XML_PARSERS = ["drv_libxml2"]
-
-# If you want feedparser to automatically run HTML markup through HTML Tidy, set
-# this to 1. Requires mxTidy <http://www.egenix.com/files/python/mxTidy.html>
-# or utidylib <http://utidylib.berlios.de/>.
-TIDY_MARKUP = 0
-
-# List of Python interfaces for HTML Tidy, in order of preference. Only useful
-# if TIDY_MARKUP = 1
-PREFERRED_TIDY_INTERFACES = ["uTidy", "mxTidy"]
-
-# If you want feedparser to automatically resolve all relative URIs, set this
-# to 1.
-RESOLVE_RELATIVE_URIS = 1
-
-# If you want feedparser to automatically sanitize all potentially unsafe
-# HTML content, set this to 1.
-SANITIZE_HTML = 1
-
-# ---------- required modules (should come with any Python distribution) ----------
-import sgmllib, re, sys, copy, urlparse, time, rfc822, types, cgi, urllib, urllib2
-try:
- from cStringIO import StringIO as _StringIO
-except:
- from StringIO import StringIO as _StringIO
-
-# ---------- optional modules (feedparser will work without these, but with reduced functionality) ----------
-
-# gzip is included with most Python distributions, but may not be available if you compiled your own
-try:
- import gzip
-except:
- gzip = None
-try:
- import zlib
-except:
- zlib = None
-
-# If a real XML parser is available, feedparser will attempt to use it. feedparser has
-# been tested with the built-in SAX parser, PyXML, and libxml2. On platforms where the
-# Python distribution does not come with an XML parser (such as Mac OS X 10.2 and some
-# versions of FreeBSD), feedparser will quietly fall back on regex-based parsing.
-try:
- import xml.sax
- xml.sax.make_parser(PREFERRED_XML_PARSERS) # test for valid parsers
- from xml.sax.saxutils import escape as _xmlescape
- _XML_AVAILABLE = 1
-except:
- _XML_AVAILABLE = 0
- def _xmlescape(data,entities={}):
- data = data.replace('&', '&')
- data = data.replace('>', '>')
- data = data.replace('<', '<')
- for char, entity in entities:
- data = data.replace(char, entity)
- return data
-
-# base64 support for Atom feeds that contain embedded binary data
-try:
- import base64, binascii
-except:
- base64 = binascii = None
-
-# cjkcodecs and iconv_codec provide support for more character encodings.
-# Both are available from http://cjkpython.i18n.org/
-try:
- import cjkcodecs.aliases
-except:
- pass
-try:
- import iconv_codec
-except:
- pass
-
-# chardet library auto-detects character encodings
-# Download from http://chardet.feedparser.org/
-try:
- import chardet
- if _debug:
- import chardet.constants
- chardet.constants._debug = 1
-except:
- chardet = None
-
-# reversable htmlentitydefs mappings for Python 2.2
-try:
- from htmlentitydefs import name2codepoint, codepoint2name
-except:
- import htmlentitydefs
- name2codepoint={}
- codepoint2name={}
- for (name,codepoint) in htmlentitydefs.entitydefs.iteritems():
- if codepoint.startswith('&#'): codepoint=unichr(int(codepoint[2:-1]))
- name2codepoint[name]=ord(codepoint)
- codepoint2name[ord(codepoint)]=name
-
-# BeautifulSoup parser used for parsing microformats from embedded HTML content
-# http://www.crummy.com/software/BeautifulSoup/
-# feedparser is tested with BeautifulSoup 3.0.x, but it might work with the
-# older 2.x series. If it doesn't, and you can figure out why, I'll accept a
-# patch and modify the compatibility statement accordingly.
-try:
- import BeautifulSoup
-except:
- BeautifulSoup = None
-
-# ---------- don't touch these ----------
-class ThingsNobodyCaresAboutButMe(Exception): pass
-class CharacterEncodingOverride(ThingsNobodyCaresAboutButMe): pass
-class CharacterEncodingUnknown(ThingsNobodyCaresAboutButMe): pass
-class NonXMLContentType(ThingsNobodyCaresAboutButMe): pass
-class UndeclaredNamespace(Exception): pass
-
-sgmllib.tagfind = re.compile('[a-zA-Z][-_.:a-zA-Z0-9]*')
-sgmllib.special = re.compile('<!')
-sgmllib.charref = re.compile('&#(\d+|x[0-9a-fA-F]+);')
-
-if sgmllib.endbracket.search(' <').start(0):
- class EndBracketMatch:
- endbracket = re.compile('''([^'"<>]|"[^"]*"(?=>|/|\s|\w+=)|'[^']*'(?=>|/|\s|\w+=))*(?=[<>])|.*?(?=[<>])''')
- def search(self,string,index=0):
- self.match = self.endbracket.match(string,index)
- if self.match: return self
- def start(self,n):
- return self.match.end(n)
- sgmllib.endbracket = EndBracketMatch()
-
-SUPPORTED_VERSIONS = {'': 'unknown',
- 'rss090': 'RSS 0.90',
- 'rss091n': 'RSS 0.91 (Netscape)',
- 'rss091u': 'RSS 0.91 (Userland)',
- 'rss092': 'RSS 0.92',
- 'rss093': 'RSS 0.93',
- 'rss094': 'RSS 0.94',
- 'rss20': 'RSS 2.0',
- 'rss10': 'RSS 1.0',
- 'rss': 'RSS (unknown version)',
- 'atom01': 'Atom 0.1',
- 'atom02': 'Atom 0.2',
- 'atom03': 'Atom 0.3',
- 'atom10': 'Atom 1.0',
- 'atom': 'Atom (unknown version)',
- 'cdf': 'CDF',
- 'hotrss': 'Hot RSS'
- }
-
-try:
- UserDict = dict
-except NameError:
- # Python 2.1 does not have dict
- from UserDict import UserDict
- def dict(aList):
- rc = {}
- for k, v in aList:
- rc[k] = v
- return rc
-
-class FeedParserDict(UserDict):
- keymap = {'channel': 'feed',
- 'items': 'entries',
- 'guid': 'id',
- 'date': 'updated',
- 'date_parsed': 'updated_parsed',
- 'description': ['subtitle', 'summary'],
- 'url': ['href'],
- 'modified': 'updated',
- 'modified_parsed': 'updated_parsed',
- 'issued': 'published',
- 'issued_parsed': 'published_parsed',
- 'copyright': 'rights',
- 'copyright_detail': 'rights_detail',
- 'tagline': 'subtitle',
- 'tagline_detail': 'subtitle_detail'}
- def __getitem__(self, key):
- if key == 'category':
- return UserDict.__getitem__(self, 'tags')[0]['term']
- if key == 'enclosures':
- norel = lambda link: FeedParserDict([(name,value) for (name,value) in link.items() if name!='rel'])
- return [norel(link) for link in UserDict.__getitem__(self, 'links') if link['rel']=='enclosure']
- if key == 'license':
- for link in UserDict.__getitem__(self, 'links'):
- if link['rel']=='license' and link.has_key('href'):
- return link['href']
- if key == 'categories':
- return [(tag['scheme'], tag['term']) for tag in UserDict.__getitem__(self, 'tags')]
- realkey = self.keymap.get(key, key)
- if type(realkey) == types.ListType:
- for k in realkey:
- if UserDict.has_key(self, k):
- return UserDict.__getitem__(self, k)
- if UserDict.has_key(self, key):
- return UserDict.__getitem__(self, key)
- return UserDict.__getitem__(self, realkey)
-
- def __setitem__(self, key, value):
- for k in self.keymap.keys():
- if key == k:
- key = self.keymap[k]
- if type(key) == types.ListType:
- key = key[0]
- return UserDict.__setitem__(self, key, value)
-
- def get(self, key, default=None):
- if self.has_key(key):
- return self[key]
- else:
- return default
-
- def setdefault(self, key, value):
- if not self.has_key(key):
- self[key] = value
- return self[key]
-
- def has_key(self, key):
- try:
- return hasattr(self, key) or UserDict.has_key(self, key)
- except AttributeError:
- return False
-
- def __getattr__(self, key):
- try:
- return self.__dict__[key]
- except KeyError:
- pass
- try:
- assert not key.startswith('_')
- return self.__getitem__(key)
- except:
- raise AttributeError, "object has no attribute '%s'" % key
-
- def __setattr__(self, key, value):
- if key.startswith('_') or key == 'data':
- self.__dict__[key] = value
- else:
- return self.__setitem__(key, value)
-
- def __contains__(self, key):
- return self.has_key(key)
-
-def zopeCompatibilityHack():
- global FeedParserDict
- del FeedParserDict
- def FeedParserDict(aDict=None):
- rc = {}
- if aDict:
- rc.update(aDict)
- return rc
-
-_ebcdic_to_ascii_map = None
-def _ebcdic_to_ascii(s):
- global _ebcdic_to_ascii_map
- if not _ebcdic_to_ascii_map:
- emap = (
- 0,1,2,3,156,9,134,127,151,141,142,11,12,13,14,15,
- 16,17,18,19,157,133,8,135,24,25,146,143,28,29,30,31,
- 128,129,130,131,132,10,23,27,136,137,138,139,140,5,6,7,
- 144,145,22,147,148,149,150,4,152,153,154,155,20,21,158,26,
- 32,160,161,162,163,164,165,166,167,168,91,46,60,40,43,33,
- 38,169,170,171,172,173,174,175,176,177,93,36,42,41,59,94,
- 45,47,178,179,180,181,182,183,184,185,124,44,37,95,62,63,
- 186,187,188,189,190,191,192,193,194,96,58,35,64,39,61,34,
- 195,97,98,99,100,101,102,103,104,105,196,197,198,199,200,201,
- 202,106,107,108,109,110,111,112,113,114,203,204,205,206,207,208,
- 209,126,115,116,117,118,119,120,121,122,210,211,212,213,214,215,
- 216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,
- 123,65,66,67,68,69,70,71,72,73,232,233,234,235,236,237,
- 125,74,75,76,77,78,79,80,81,82,238,239,240,241,242,243,
- 92,159,83,84,85,86,87,88,89,90,244,245,246,247,248,249,
- 48,49,50,51,52,53,54,55,56,57,250,251,252,253,254,255
- )
- import string
- _ebcdic_to_ascii_map = string.maketrans( \
- ''.join(map(chr, range(256))), ''.join(map(chr, emap)))
- return s.translate(_ebcdic_to_ascii_map)
-
-_cp1252 = {
- unichr(128): unichr(8364), # euro sign
- unichr(130): unichr(8218), # single low-9 quotation mark
- unichr(131): unichr( 402), # latin small letter f with hook
- unichr(132): unichr(8222), # double low-9 quotation mark
- unichr(133): unichr(8230), # horizontal ellipsis
- unichr(134): unichr(8224), # dagger
- unichr(135): unichr(8225), # double dagger
- unichr(136): unichr( 710), # modifier letter circumflex accent
- unichr(137): unichr(8240), # per mille sign
- unichr(138): unichr( 352), # latin capital letter s with caron
- unichr(139): unichr(8249), # single left-pointing angle quotation mark
- unichr(140): unichr( 338), # latin capital ligature oe
- unichr(142): unichr( 381), # latin capital letter z with caron
- unichr(145): unichr(8216), # left single quotation mark
- unichr(146): unichr(8217), # right single quotation mark
- unichr(147): unichr(8220), # left double quotation mark
- unichr(148): unichr(8221), # right double quotation mark
- unichr(149): unichr(8226), # bullet
- unichr(150): unichr(8211), # en dash
- unichr(151): unichr(8212), # em dash
- unichr(152): unichr( 732), # small tilde
- unichr(153): unichr(8482), # trade mark sign
- unichr(154): unichr( 353), # latin small letter s with caron
- unichr(155): unichr(8250), # single right-pointing angle quotation mark
- unichr(156): unichr( 339), # latin small ligature oe
- unichr(158): unichr( 382), # latin small letter z with caron
- unichr(159): unichr( 376)} # latin capital letter y with diaeresis
-
-_urifixer = re.compile('^([A-Za-z][A-Za-z0-9+-.]*://)(/*)(.*?)')
-def _urljoin(base, uri):
- uri = _urifixer.sub(r'\1\3', uri)
- try:
- return urlparse.urljoin(base, uri)
- except:
- uri = urlparse.urlunparse([urllib.quote(part) for part in urlparse.urlparse(uri)])
- return urlparse.urljoin(base, uri)
-
-class _FeedParserMixin:
- namespaces = {'': '',
- 'http://backend.userland.com/rss': '',
- 'http://blogs.law.harvard.edu/tech/rss': '',
- 'http://purl.org/rss/1.0/': '',
- 'http://my.netscape.com/rdf/simple/0.9/': '',
- 'http://example.com/newformat#': '',
- 'http://example.com/necho': '',
- 'http://purl.org/echo/': '',
- 'uri/of/echo/namespace#': '',
- 'http://purl.org/pie/': '',
- 'http://purl.org/atom/ns#': '',
- 'http://www.w3.org/2005/Atom': '',
- 'http://purl.org/rss/1.0/modules/rss091#': '',
-
- 'http://webns.net/mvcb/': 'admin',
- 'http://purl.org/rss/1.0/modules/aggregation/': 'ag',
- 'http://purl.org/rss/1.0/modules/annotate/': 'annotate',
- 'http://media.tangent.org/rss/1.0/': 'audio',
- 'http://backend.userland.com/blogChannelModule': 'blogChannel',
- 'http://web.resource.org/cc/': 'cc',
- 'http://backend.userland.com/creativeCommonsRssModule': 'creativeCommons',
- 'http://purl.org/rss/1.0/modules/company': 'co',
- 'http://purl.org/rss/1.0/modules/content/': 'content',
- 'http://my.theinfo.org/changed/1.0/rss/': 'cp',
- 'http://purl.org/dc/elements/1.1/': 'dc',
- 'http://purl.org/dc/terms/': 'dcterms',
- 'http://purl.org/rss/1.0/modules/email/': 'email',
- 'http://purl.org/rss/1.0/modules/event/': 'ev',
- 'http://rssnamespace.org/feedburner/ext/1.0': 'feedburner',
- 'http://freshmeat.net/rss/fm/': 'fm',
- 'http://xmlns.com/foaf/0.1/': 'foaf',
- 'http://www.w3.org/2003/01/geo/wgs84_pos#': 'geo',
- 'http://postneo.com/icbm/': 'icbm',
- 'http://purl.org/rss/1.0/modules/image/': 'image',
- 'http://www.itunes.com/DTDs/PodCast-1.0.dtd': 'itunes',
- 'http://example.com/DTDs/PodCast-1.0.dtd': 'itunes',
- 'http://purl.org/rss/1.0/modules/link/': 'l',
- 'http://search.yahoo.com/mrss': 'media',
- 'http://madskills.com/public/xml/rss/module/pingback/': 'pingback',
- 'http://prismstandard.org/namespaces/1.2/basic/': 'prism',
- 'http://www.w3.org/1999/02/22-rdf-syntax-ns#': 'rdf',
- 'http://www.w3.org/2000/01/rdf-schema#': 'rdfs',
- 'http://purl.org/rss/1.0/modules/reference/': 'ref',
- 'http://purl.org/rss/1.0/modules/richequiv/': 'reqv',
- 'http://purl.org/rss/1.0/modules/search/': 'search',
- 'http://purl.org/rss/1.0/modules/slash/': 'slash',
- 'http://schemas.xmlsoap.org/soap/envelope/': 'soap',
- 'http://purl.org/rss/1.0/modules/servicestatus/': 'ss',
- 'http://hacks.benhammersley.com/rss/streaming/': 'str',
- 'http://purl.org/rss/1.0/modules/subscription/': 'sub',
- 'http://purl.org/rss/1.0/modules/syndication/': 'sy',
- 'http://schemas.pocketsoap.com/rss/myDescModule/': 'szf',
- 'http://purl.org/rss/1.0/modules/taxonomy/': 'taxo',
- 'http://purl.org/rss/1.0/modules/threading/': 'thr',
- 'http://purl.org/rss/1.0/modules/textinput/': 'ti',
- 'http://madskills.com/public/xml/rss/module/trackback/':'trackback',
- 'http://wellformedweb.org/commentAPI/': 'wfw',
- 'http://purl.org/rss/1.0/modules/wiki/': 'wiki',
- 'http://www.w3.org/1999/xhtml': 'xhtml',
- 'http://www.w3.org/1999/xlink': 'xlink',
- 'http://www.w3.org/XML/1998/namespace': 'xml'
-}
- _matchnamespaces = {}
-
- can_be_relative_uri = ['link', 'id', 'wfw_comment', 'wfw_commentrss', 'docs', 'url', 'href', 'comments', 'icon', 'logo']
- can_contain_relative_uris = ['content', 'title', 'summary', 'info', 'tagline', 'subtitle', 'copyright', 'rights', 'description']
- can_contain_dangerous_markup = ['content', 'title', 'summary', 'info', 'tagline', 'subtitle', 'copyright', 'rights', 'description']
- html_types = ['text/html', 'application/xhtml+xml']
-
- def __init__(self, baseuri=None, baselang=None, encoding='utf-8'):
- if _debug: sys.stderr.write('initializing FeedParser\n')
- if not self._matchnamespaces:
- for k, v in self.namespaces.items():
- self._matchnamespaces[k.lower()] = v
- self.feeddata = FeedParserDict() # feed-level data
- self.encoding = encoding # character encoding
- self.entries = [] # list of entry-level data
- self.version = '' # feed type/version, see SUPPORTED_VERSIONS
- self.namespacesInUse = {} # dictionary of namespaces defined by the feed
-
- # the following are used internally to track state;
- # this is really out of control and should be refactored
- self.infeed = 0
- self.inentry = 0
- self.incontent = 0
- self.intextinput = 0
- self.inimage = 0
- self.inauthor = 0
- self.incontributor = 0
- self.inpublisher = 0
- self.insource = 0
- self.sourcedata = FeedParserDict()
- self.contentparams = FeedParserDict()
- self._summaryKey = None
- self.namespacemap = {}
- self.elementstack = []
- self.basestack = []
- self.langstack = []
- self.baseuri = baseuri or ''
- self.lang = baselang or None
- self.svgOK = 0
- self.hasTitle = 0
- if baselang:
- self.feeddata['language'] = baselang.replace('_','-')
-
- def unknown_starttag(self, tag, attrs):
- if _debug: sys.stderr.write('start %s with %s\n' % (tag, attrs))
- # normalize attrs
- attrs = [(k.lower(), v) for k, v in attrs]
- attrs = [(k, k in ('rel', 'type') and v.lower() or v) for k, v in attrs]
-
- # track xml:base and xml:lang
- attrsD = dict(attrs)
- baseuri = attrsD.get('xml:base', attrsD.get('base')) or self.baseuri
- if type(baseuri) != type(u''):
- try:
- baseuri = unicode(baseuri, self.encoding)
- except:
- baseuri = unicode(baseuri, 'iso-8859-1')
- self.baseuri = _urljoin(self.baseuri, baseuri)
- lang = attrsD.get('xml:lang', attrsD.get('lang'))
- if lang == '':
- # xml:lang could be explicitly set to '', we need to capture that
- lang = None
- elif lang is None:
- # if no xml:lang is specified, use parent lang
- lang = self.lang
- if lang:
- if tag in ('feed', 'rss', 'rdf:RDF'):
- self.feeddata['language'] = lang.replace('_','-')
- self.lang = lang
- self.basestack.append(self.baseuri)
- self.langstack.append(lang)
-
- # track namespaces
- for prefix, uri in attrs:
- if prefix.startswith('xmlns:'):
- self.trackNamespace(prefix[6:], uri)
- elif prefix == 'xmlns':
- self.trackNamespace(None, uri)
-
- # track inline content
- if self.incontent and self.contentparams.has_key('type') and not self.contentparams.get('type', 'xml').endswith('xml'):
- if tag in ['xhtml:div', 'div']: return # typepad does this 10/2007
- # element declared itself as escaped markup, but it isn't really
- self.contentparams['type'] = 'application/xhtml+xml'
- if self.incontent and self.contentparams.get('type') == 'application/xhtml+xml':
- if tag.find(':') <> -1:
- prefix, tag = tag.split(':', 1)
- namespace = self.namespacesInUse.get(prefix, '')
- if tag=='math' and namespace=='http://www.w3.org/1998/Math/MathML':
- attrs.append(('xmlns',namespace))
- if tag=='svg' and namespace=='http://www.w3.org/2000/svg':
- attrs.append(('xmlns',namespace))
- if tag == 'svg': self.svgOK += 1
- return self.handle_data('<%s%s>' % (tag, self.strattrs(attrs)), escape=0)
-
- # match namespaces
- if tag.find(':') <> -1:
- prefix, suffix = tag.split(':', 1)
- else:
- prefix, suffix = '', tag
- prefix = self.namespacemap.get(prefix, prefix)
- if prefix:
- prefix = prefix + '_'
-
- # special hack for better tracking of empty textinput/image elements in illformed feeds
- if (not prefix) and tag not in ('title', 'link', 'description', 'name'):
- self.intextinput = 0
- if (not prefix) and tag not in ('title', 'link', 'description', 'url', 'href', 'width', 'height'):
- self.inimage = 0
-
- # call special handler (if defined) or default handler
- methodname = '_start_' + prefix + suffix
- try:
- method = getattr(self, methodname)
- return method(attrsD)
- except AttributeError:
- return self.push(prefix + suffix, 1)
-
- def unknown_endtag(self, tag):
- if _debug: sys.stderr.write('end %s\n' % tag)
- # match namespaces
- if tag.find(':') <> -1:
- prefix, suffix = tag.split(':', 1)
- else:
- prefix, suffix = '', tag
- prefix = self.namespacemap.get(prefix, prefix)
- if prefix:
- prefix = prefix + '_'
- if suffix == 'svg' and self.svgOK: self.svgOK -= 1
-
- # call special handler (if defined) or default handler
- methodname = '_end_' + prefix + suffix
- try:
- if self.svgOK: raise AttributeError()
- method = getattr(self, methodname)
- method()
- except AttributeError:
- self.pop(prefix + suffix)
-
- # track inline content
- if self.incontent and self.contentparams.has_key('type') and not self.contentparams.get('type', 'xml').endswith('xml'):
- # element declared itself as escaped markup, but it isn't really
- if tag in ['xhtml:div', 'div']: return # typepad does this 10/2007
- self.contentparams['type'] = 'application/xhtml+xml'
- if self.incontent and self.contentparams.get('type') == 'application/xhtml+xml':
- tag = tag.split(':')[-1]
- self.handle_data('</%s>' % tag, escape=0)
-
- # track xml:base and xml:lang going out of scope
- if self.basestack:
- self.basestack.pop()
- if self.basestack and self.basestack[-1]:
- self.baseuri = self.basestack[-1]
- if self.langstack:
- self.langstack.pop()
- if self.langstack: # and (self.langstack[-1] is not None):
- self.lang = self.langstack[-1]
-
- def handle_charref(self, ref):
- # called for each character reference, e.g. for ' ', ref will be '160'
- if not self.elementstack: return
- ref = ref.lower()
- if ref in ('34', '38', '39', '60', '62', 'x22', 'x26', 'x27', 'x3c', 'x3e'):
- text = '&#%s;' % ref
- else:
- if ref[0] == 'x':
- c = int(ref[1:], 16)
- else:
- c = int(ref)
- text = unichr(c).encode('utf-8')
- self.elementstack[-1][2].append(text)
-
- def handle_entityref(self, ref):
- # called for each entity reference, e.g. for '©', ref will be 'copy'
- if not self.elementstack: return
- if _debug: sys.stderr.write('entering handle_entityref with %s\n' % ref)
- if ref in ('lt', 'gt', 'quot', 'amp', 'apos'):
- text = '&%s;' % ref
- elif ref in self.entities.keys():
- text = self.entities[ref]
- if text.startswith('&#') and text.endswith(';'):
- return self.handle_entityref(text)
- else:
- try: name2codepoint[ref]
- except KeyError: text = '&%s;' % ref
- else: text = unichr(name2codepoint[ref]).encode('utf-8')
- self.elementstack[-1][2].append(text)
-
- def handle_data(self, text, escape=1):
- # called for each block of plain text, i.e. outside of any tag and
- # not containing any character or entity references
- if not self.elementstack: return
- if escape and self.contentparams.get('type') == 'application/xhtml+xml':
- text = _xmlescape(text)
- self.elementstack[-1][2].append(text)
-
- def handle_comment(self, text):
- # called for each comment, e.g. <!-- insert message here -->
- pass
-
- def handle_pi(self, text):
- # called for each processing instruction, e.g. <?instruction>
- pass
-
- def handle_decl(self, text):
- pass
-
- def parse_declaration(self, i):
- # override internal declaration handler to handle CDATA blocks
- if _debug: sys.stderr.write('entering parse_declaration\n')
- if self.rawdata[i:i+9] == '<![CDATA[':
- k = self.rawdata.find(']]>', i)
- if k == -1: k = len(self.rawdata)
- self.handle_data(_xmlescape(self.rawdata[i+9:k]), 0)
- return k+3
- else:
- k = self.rawdata.find('>', i)
- return k+1
-
- def mapContentType(self, contentType):
- contentType = contentType.lower()
- if contentType == 'text':
- contentType = 'text/plain'
- elif contentType == 'html':
- contentType = 'text/html'
- elif contentType == 'xhtml':
- contentType = 'application/xhtml+xml'
- return contentType
-
- def trackNamespace(self, prefix, uri):
- loweruri = uri.lower()
- if (prefix, loweruri) == (None, 'http://my.netscape.com/rdf/simple/0.9/') and not self.version:
- self.version = 'rss090'
- if loweruri == 'http://purl.org/rss/1.0/' and not self.version:
- self.version = 'rss10'
- if loweruri == 'http://www.w3.org/2005/atom' and not self.version:
- self.version = 'atom10'
- if loweruri.find('backend.userland.com/rss') <> -1:
- # match any backend.userland.com namespace
- uri = 'http://backend.userland.com/rss'
- loweruri = uri
- if self._matchnamespaces.has_key(loweruri):
- self.namespacemap[prefix] = self._matchnamespaces[loweruri]
- self.namespacesInUse[self._matchnamespaces[loweruri]] = uri
- else:
- self.namespacesInUse[prefix or ''] = uri
-
- def resolveURI(self, uri):
- return _urljoin(self.baseuri or '', uri)
-
- def decodeEntities(self, element, data):
- return data
-
- def strattrs(self, attrs):
- return ''.join([' %s="%s"' % (t[0],_xmlescape(t[1],{'"':'"'})) for t in attrs])
-
- def push(self, element, expectingText):
- self.elementstack.append([element, expectingText, []])
-
- def pop(self, element, stripWhitespace=1):
- if not self.elementstack: return
- if self.elementstack[-1][0] != element: return
-
- element, expectingText, pieces = self.elementstack.pop()
-
- if self.version == 'atom10' and self.contentparams.get('type','text') == 'application/xhtml+xml':
- # remove enclosing child element, but only if it is a <div> and
- # only if all the remaining content is nested underneath it.
- # This means that the divs would be retained in the following:
- # <div>foo</div><div>bar</div>
- while pieces and len(pieces)>1 and not pieces[-1].strip():
- del pieces[-1]
- while pieces and len(pieces)>1 and not pieces[0].strip():
- del pieces[0]
- if pieces and (pieces[0] == '<div>' or pieces[0].startswith('<div ')) and pieces[-1]=='</div>':
- depth = 0
- for piece in pieces[:-1]:
- if piece.startswith('</'):
- depth -= 1
- if depth == 0: break
- elif piece.startswith('<') and not piece.endswith('/>'):
- depth += 1
- else:
- pieces = pieces[1:-1]
-
- output = ''.join(pieces)
- if stripWhitespace:
- output = output.strip()
- if not expectingText: return output
-
- # decode base64 content
- if base64 and self.contentparams.get('base64', 0):
- try:
- output = base64.decodestring(output)
- except binascii.Error:
- pass
- except binascii.Incomplete:
- pass
-
- # resolve relative URIs
- if (element in self.can_be_relative_uri) and output:
- output = self.resolveURI(output)
-
- # decode entities within embedded markup
- if not self.contentparams.get('base64', 0):
- output = self.decodeEntities(element, output)
-
- if self.lookslikehtml(output):
- self.contentparams['type']='text/html'
-
- # remove temporary cruft from contentparams
- try:
- del self.contentparams['mode']
- except KeyError:
- pass
- try:
- del self.contentparams['base64']
- except KeyError:
- pass
-
- is_htmlish = self.mapContentType(self.contentparams.get('type', 'text/html')) in self.html_types
- # resolve relative URIs within embedded markup
- if is_htmlish and RESOLVE_RELATIVE_URIS:
- if element in self.can_contain_relative_uris:
- output = _resolveRelativeURIs(output, self.baseuri, self.encoding, self.contentparams.get('type', 'text/html'))
-
- # parse microformats
- # (must do this before sanitizing because some microformats
- # rely on elements that we sanitize)
- if is_htmlish and element in ['content', 'description', 'summary']:
- mfresults = _parseMicroformats(output, self.baseuri, self.encoding)
- if mfresults:
- for tag in mfresults.get('tags', []):
- self._addTag(tag['term'], tag['scheme'], tag['label'])
- for enclosure in mfresults.get('enclosures', []):
- self._start_enclosure(enclosure)
- for xfn in mfresults.get('xfn', []):
- self._addXFN(xfn['relationships'], xfn['href'], xfn['name'])
- vcard = mfresults.get('vcard')
- if vcard:
- self._getContext()['vcard'] = vcard
-
- # sanitize embedded markup
- if is_htmlish and SANITIZE_HTML:
- if element in self.can_contain_dangerous_markup:
- output = _sanitizeHTML(output, self.encoding, self.contentparams.get('type', 'text/html'))
-
- if self.encoding and type(output) != type(u''):
- try:
- output = unicode(output, self.encoding)
- except:
- pass
-
- # address common error where people take data that is already
- # utf-8, presume that it is iso-8859-1, and re-encode it.
- if self.encoding=='utf-8' and type(output) == type(u''):
- try:
- output = unicode(output.encode('iso-8859-1'), 'utf-8')
- except:
- pass
-
- # map win-1252 extensions to the proper code points
- if type(output) == type(u''):
- output = u''.join([c in _cp1252.keys() and _cp1252[c] or c for c in output])
-
- # categories/tags/keywords/whatever are handled in _end_category
- if element == 'category':
- return output
-
- if element == 'title' and self.hasTitle:
- return output
-
- # store output in appropriate place(s)
- if self.inentry and not self.insource:
- if element == 'content':
- self.entries[-1].setdefault(element, [])
- contentparams = copy.deepcopy(self.contentparams)
- contentparams['value'] = output
- self.entries[-1][element].append(contentparams)
- elif element == 'link':
- self.entries[-1][element] = output
- if output:
- self.entries[-1]['links'][-1]['href'] = output
- else:
- if element == 'description':
- element = 'summary'
- self.entries[-1][element] = output
- if self.incontent:
- contentparams = copy.deepcopy(self.contentparams)
- contentparams['value'] = output
- self.entries[-1][element + '_detail'] = contentparams
- elif (self.infeed or self.insource):# and (not self.intextinput) and (not self.inimage):
- context = self._getContext()
- if element == 'description':
- element = 'subtitle'
- context[element] = output
- if element == 'link':
- context['links'][-1]['href'] = output
- elif self.incontent:
- contentparams = copy.deepcopy(self.contentparams)
- contentparams['value'] = output
- context[element + '_detail'] = contentparams
- return output
-
- def pushContent(self, tag, attrsD, defaultContentType, expectingText):
- self.incontent += 1
- if self.lang: self.lang=self.lang.replace('_','-')
- self.contentparams = FeedParserDict({
- 'type': self.mapContentType(attrsD.get('type', defaultContentType)),
- 'language': self.lang,
- 'base': self.baseuri})
- self.contentparams['base64'] = self._isBase64(attrsD, self.contentparams)
- self.push(tag, expectingText)
-
- def popContent(self, tag):
- value = self.pop(tag)
- self.incontent -= 1
- self.contentparams.clear()
- return value
-
- # a number of elements in a number of RSS variants are nominally plain
- # text, but this is routinely ignored. This is an attempt to detect
- # the most common cases. As false positives often result in silent
- # data loss, this function errs on the conservative side.
- def lookslikehtml(self, str):
- if self.version.startswith('atom'): return
- if self.contentparams.get('type','text/html') != 'text/plain': return
-
- # must have a close tag or a entity reference to qualify
- if not (re.search(r'</(\w+)>',str) or re.search("&#?\w+;",str)): return
-
- # all tags must be in a restricted subset of valid HTML tags
- if filter(lambda t: t.lower() not in _HTMLSanitizer.acceptable_elements,
- re.findall(r'</?(\w+)',str)): return
-
- # all entities must have been defined as valid HTML entities
- from htmlentitydefs import entitydefs
- if filter(lambda e: e not in entitydefs.keys(),
- re.findall(r'&(\w+);',str)): return
-
- return 1
-
- def _mapToStandardPrefix(self, name):
- colonpos = name.find(':')
- if colonpos <> -1:
- prefix = name[:colonpos]
- suffix = name[colonpos+1:]
- prefix = self.namespacemap.get(prefix, prefix)
- name = prefix + ':' + suffix
- return name
-
- def _getAttribute(self, attrsD, name):
- return attrsD.get(self._mapToStandardPrefix(name))
-
- def _isBase64(self, attrsD, contentparams):
- if attrsD.get('mode', '') == 'base64':
- return 1
- if self.contentparams['type'].startswith('text/'):
- return 0
- if self.contentparams['type'].endswith('+xml'):
- return 0
- if self.contentparams['type'].endswith('/xml'):
- return 0
- return 1
-
- def _itsAnHrefDamnIt(self, attrsD):
- href = attrsD.get('url', attrsD.get('uri', attrsD.get('href', None)))
- if href:
- try:
- del attrsD['url']
- except KeyError:
- pass
- try:
- del attrsD['uri']
- except KeyError:
- pass
- attrsD['href'] = href
- return attrsD
-
- def _save(self, key, value):
- context = self._getContext()
- context.setdefault(key, value)
-
- def _start_rss(self, attrsD):
- versionmap = {'0.91': 'rss091u',
- '0.92': 'rss092',
- '0.93': 'rss093',
- '0.94': 'rss094'}
- if not self.version:
- attr_version = attrsD.get('version', '')
- version = versionmap.get(attr_version)
- if version:
- self.version = version
- elif attr_version.startswith('2.'):
- self.version = 'rss20'
- else:
- self.version = 'rss'
-
- def _start_dlhottitles(self, attrsD):
- self.version = 'hotrss'
-
- def _start_channel(self, attrsD):
- self.infeed = 1
- self._cdf_common(attrsD)
- _start_feedinfo = _start_channel
-
- def _cdf_common(self, attrsD):
- if attrsD.has_key('lastmod'):
- self._start_modified({})
- self.elementstack[-1][-1] = attrsD['lastmod']
- self._end_modified()
- if attrsD.has_key('href'):
- self._start_link({})
- self.elementstack[-1][-1] = attrsD['href']
- self._end_link()
-
- def _start_feed(self, attrsD):
- self.infeed = 1
- versionmap = {'0.1': 'atom01',
- '0.2': 'atom02',
- '0.3': 'atom03'}
- if not self.version:
- attr_version = attrsD.get('version')
- version = versionmap.get(attr_version)
- if version:
- self.version = version
- else:
- self.version = 'atom'
-
- def _end_channel(self):
- self.infeed = 0
- _end_feed = _end_channel
-
- def _start_image(self, attrsD):
- context = self._getContext()
- context.setdefault('image', FeedParserDict())
- self.inimage = 1
- self.hasTitle = 0
- self.push('image', 0)
-
- def _end_image(self):
- self.pop('image')
- self.inimage = 0
-
- def _start_textinput(self, attrsD):
- context = self._getContext()
- context.setdefault('textinput', FeedParserDict())
- self.intextinput = 1
- self.hasTitle = 0
- self.push('textinput', 0)
- _start_textInput = _start_textinput
-
- def _end_textinput(self):
- self.pop('textinput')
- self.intextinput = 0
- _end_textInput = _end_textinput
-
- def _start_author(self, attrsD):
- self.inauthor = 1
- self.push('author', 1)
- _start_managingeditor = _start_author
- _start_dc_author = _start_author
- _start_dc_creator = _start_author
- _start_itunes_author = _start_author
-
- def _end_author(self):
- self.pop('author')
- self.inauthor = 0
- self._sync_author_detail()
- _end_managingeditor = _end_author
- _end_dc_author = _end_author
- _end_dc_creator = _end_author
- _end_itunes_author = _end_author
-
- def _start_itunes_owner(self, attrsD):
- self.inpublisher = 1
- self.push('publisher', 0)
-
- def _end_itunes_owner(self):
- self.pop('publisher')
- self.inpublisher = 0
- self._sync_author_detail('publisher')
-
- def _start_contributor(self, attrsD):
- self.incontributor = 1
- context = self._getContext()
- context.setdefault('contributors', [])
- context['contributors'].append(FeedParserDict())
- self.push('contributor', 0)
-
- def _end_contributor(self):
- self.pop('contributor')
- self.incontributor = 0
-
- def _start_dc_contributor(self, attrsD):
- self.incontributor = 1
- context = self._getContext()
- context.setdefault('contributors', [])
- context['contributors'].append(FeedParserDict())
- self.push('name', 0)
-
- def _end_dc_contributor(self):
- self._end_name()
- self.incontributor = 0
-
- def _start_name(self, attrsD):
- self.push('name', 0)
- _start_itunes_name = _start_name
-
- def _end_name(self):
- value = self.pop('name')
- if self.inpublisher:
- self._save_author('name', value, 'publisher')
- elif self.inauthor:
- self._save_author('name', value)
- elif self.incontributor:
- self._save_contributor('name', value)
- elif self.intextinput:
- context = self._getContext()
- context['name'] = value
- _end_itunes_name = _end_name
-
- def _start_width(self, attrsD):
- self.push('width', 0)
-
- def _end_width(self):
- value = self.pop('width')
- try:
- value = int(value)
- except:
- value = 0
- if self.inimage:
- context = self._getContext()
- context['width'] = value
-
- def _start_height(self, attrsD):
- self.push('height', 0)
-
- def _end_height(self):
- value = self.pop('height')
- try:
- value = int(value)
- except:
- value = 0
- if self.inimage:
- context = self._getContext()
- context['height'] = value
-
- def _start_url(self, attrsD):
- self.push('href', 1)
- _start_homepage = _start_url
- _start_uri = _start_url
-
- def _end_url(self):
- value = self.pop('href')
- if self.inauthor:
- self._save_author('href', value)
- elif self.incontributor:
- self._save_contributor('href', value)
- _end_homepage = _end_url
- _end_uri = _end_url
-
- def _start_email(self, attrsD):
- self.push('email', 0)
- _start_itunes_email = _start_email
-
- def _end_email(self):
- value = self.pop('email')
- if self.inpublisher:
- self._save_author('email', value, 'publisher')
- elif self.inauthor:
- self._save_author('email', value)
- elif self.incontributor:
- self._save_contributor('email', value)
- _end_itunes_email = _end_email
-
- def _getContext(self):
- if self.insource:
- context = self.sourcedata
- elif self.inimage:
- context = self.feeddata['image']
- elif self.intextinput:
- context = self.feeddata['textinput']
- elif self.inentry:
- context = self.entries[-1]
- else:
- context = self.feeddata
- return context
-
- def _save_author(self, key, value, prefix='author'):
- context = self._getContext()
- context.setdefault(prefix + '_detail', FeedParserDict())
- context[prefix + '_detail'][key] = value
- self._sync_author_detail()
-
- def _save_contributor(self, key, value):
- context = self._getContext()
- context.setdefault('contributors', [FeedParserDict()])
- context['contributors'][-1][key] = value
-
- def _sync_author_detail(self, key='author'):
- context = self._getContext()
- detail = context.get('%s_detail' % key)
- if detail:
- name = detail.get('name')
- email = detail.get('email')
- if name and email:
- context[key] = '%s (%s)' % (name, email)
- elif name:
- context[key] = name
- elif email:
- context[key] = email
- else:
- author, email = context.get(key), None
- if not author: return
- emailmatch = re.search(r'''(([a-zA-Z0-9\_\-\.\+]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?))(\?subject=\S+)?''', author)
- if emailmatch:
- email = emailmatch.group(0)
- # probably a better way to do the following, but it passes all the tests
- author = author.replace(email, '')
- author = author.replace('()', '')
- author = author.replace('<>', '')
- author = author.replace('<>', '')
- author = author.strip()
- if author and (author[0] == '('):
- author = author[1:]
- if author and (author[-1] == ')'):
- author = author[:-1]
- author = author.strip()
- if author or email:
- context.setdefault('%s_detail' % key, FeedParserDict())
- if author:
- context['%s_detail' % key]['name'] = author
- if email:
- context['%s_detail' % key]['email'] = email
-
- def _start_subtitle(self, attrsD):
- self.pushContent('subtitle', attrsD, 'text/plain', 1)
- _start_tagline = _start_subtitle
- _start_itunes_subtitle = _start_subtitle
-
- def _end_subtitle(self):
- self.popContent('subtitle')
- _end_tagline = _end_subtitle
- _end_itunes_subtitle = _end_subtitle
-
- def _start_rights(self, attrsD):
- self.pushContent('rights', attrsD, 'text/plain', 1)
- _start_dc_rights = _start_rights
- _start_copyright = _start_rights
-
- def _end_rights(self):
- self.popContent('rights')
- _end_dc_rights = _end_rights
- _end_copyright = _end_rights
-
- def _start_item(self, attrsD):
- self.entries.append(FeedParserDict())
- self.push('item', 0)
- self.inentry = 1
- self.guidislink = 0
- self.hasTitle = 0
- id = self._getAttribute(attrsD, 'rdf:about')
- if id:
- context = self._getContext()
- context['id'] = id
- self._cdf_common(attrsD)
- _start_entry = _start_item
- _start_product = _start_item
-
- def _end_item(self):
- self.pop('item')
- self.inentry = 0
- _end_entry = _end_item
-
- def _start_dc_language(self, attrsD):
- self.push('language', 1)
- _start_language = _start_dc_language
-
- def _end_dc_language(self):
- self.lang = self.pop('language')
- _end_language = _end_dc_language
-
- def _start_dc_publisher(self, attrsD):
- self.push('publisher', 1)
- _start_webmaster = _start_dc_publisher
-
- def _end_dc_publisher(self):
- self.pop('publisher')
- self._sync_author_detail('publisher')
- _end_webmaster = _end_dc_publisher
-
- def _start_published(self, attrsD):
- self.push('published', 1)
- _start_dcterms_issued = _start_published
- _start_issued = _start_published
-
- def _end_published(self):
- value = self.pop('published')
- self._save('published_parsed', _parse_date(value))
- _end_dcterms_issued = _end_published
- _end_issued = _end_published
-
- def _start_updated(self, attrsD):
- self.push('updated', 1)
- _start_modified = _start_updated
- _start_dcterms_modified = _start_updated
- _start_pubdate = _start_updated
- _start_dc_date = _start_updated
-
- def _end_updated(self):
- value = self.pop('updated')
- parsed_value = _parse_date(value)
- self._save('updated_parsed', parsed_value)
- _end_modified = _end_updated
- _end_dcterms_modified = _end_updated
- _end_pubdate = _end_updated
- _end_dc_date = _end_updated
-
- def _start_created(self, attrsD):
- self.push('created', 1)
- _start_dcterms_created = _start_created
-
- def _end_created(self):
- value = self.pop('created')
- self._save('created_parsed', _parse_date(value))
- _end_dcterms_created = _end_created
-
- def _start_expirationdate(self, attrsD):
- self.push('expired', 1)
-
- def _end_expirationdate(self):
- self._save('expired_parsed', _parse_date(self.pop('expired')))
-
- def _start_cc_license(self, attrsD):
- context = self._getContext()
- value = self._getAttribute(attrsD, 'rdf:resource')
- attrsD = FeedParserDict()
- attrsD['rel']='license'
- if value: attrsD['href']=value
- context.setdefault('links', []).append(attrsD)
-
- def _start_creativecommons_license(self, attrsD):
- self.push('license', 1)
- _start_creativeCommons_license = _start_creativecommons_license
-
- def _end_creativecommons_license(self):
- value = self.pop('license')
- context = self._getContext()
- attrsD = FeedParserDict()
- attrsD['rel']='license'
- if value: attrsD['href']=value
- context.setdefault('links', []).append(attrsD)
- del context['license']
- _end_creativeCommons_license = _end_creativecommons_license
-
- def _addXFN(self, relationships, href, name):
- context = self._getContext()
- xfn = context.setdefault('xfn', [])
- value = FeedParserDict({'relationships': relationships, 'href': href, 'name': name})
- if value not in xfn:
- xfn.append(value)
-
- def _addTag(self, term, scheme, label):
- context = self._getContext()
- tags = context.setdefault('tags', [])
- if (not term) and (not scheme) and (not label): return
- value = FeedParserDict({'term': term, 'scheme': scheme, 'label': label})
- if value not in tags:
- tags.append(value)
-
- def _start_category(self, attrsD):
- if _debug: sys.stderr.write('entering _start_category with %s\n' % repr(attrsD))
- term = attrsD.get('term')
- scheme = attrsD.get('scheme', attrsD.get('domain'))
- label = attrsD.get('label')
- self._addTag(term, scheme, label)
- self.push('category', 1)
- _start_dc_subject = _start_category
- _start_keywords = _start_category
-
- def _end_itunes_keywords(self):
- for term in self.pop('itunes_keywords').split():
- self._addTag(term, 'http://www.itunes.com/', None)
-
- def _start_itunes_category(self, attrsD):
- self._addTag(attrsD.get('text'), 'http://www.itunes.com/', None)
- self.push('category', 1)
-
- def _end_category(self):
- value = self.pop('category')
- if not value: return
- context = self._getContext()
- tags = context['tags']
- if value and len(tags) and not tags[-1]['term']:
- tags[-1]['term'] = value
- else:
- self._addTag(value, None, None)
- _end_dc_subject = _end_category
- _end_keywords = _end_category
- _end_itunes_category = _end_category
-
- def _start_cloud(self, attrsD):
- self._getContext()['cloud'] = FeedParserDict(attrsD)
-
- def _start_link(self, attrsD):
- attrsD.setdefault('rel', 'alternate')
- if attrsD['rel'] == 'self':
- attrsD.setdefault('type', 'application/atom+xml')
- else:
- attrsD.setdefault('type', 'text/html')
- context = self._getContext()
- attrsD = self._itsAnHrefDamnIt(attrsD)
- if attrsD.has_key('href'):
- attrsD['href'] = self.resolveURI(attrsD['href'])
- if attrsD.get('rel')=='enclosure' and not context.get('id'):
- context['id'] = attrsD.get('href')
- expectingText = self.infeed or self.inentry or self.insource
- context.setdefault('links', [])
- context['links'].append(FeedParserDict(attrsD))
- if attrsD.has_key('href'):
- expectingText = 0
- if (attrsD.get('rel') == 'alternate') and (self.mapContentType(attrsD.get('type')) in self.html_types):
- context['link'] = attrsD['href']
- else:
- self.push('link', expectingText)
- _start_producturl = _start_link
-
- def _end_link(self):
- value = self.pop('link')
- context = self._getContext()
- _end_producturl = _end_link
-
- def _start_guid(self, attrsD):
- self.guidislink = (attrsD.get('ispermalink', 'true') == 'true')
- self.push('id', 1)
-
- def _end_guid(self):
- value = self.pop('id')
- self._save('guidislink', self.guidislink and not self._getContext().has_key('link'))
- if self.guidislink:
- # guid acts as link, but only if 'ispermalink' is not present or is 'true',
- # and only if the item doesn't already have a link element
- self._save('link', value)
-
- def _start_title(self, attrsD):
- if self.svgOK: return self.unknown_starttag('title', attrsD.items())
- self.pushContent('title', attrsD, 'text/plain', self.infeed or self.inentry or self.insource)
- _start_dc_title = _start_title
- _start_media_title = _start_title
-
- def _end_title(self):
- if self.svgOK: return
- value = self.popContent('title')
- if not value: return
- context = self._getContext()
- self.hasTitle = 1
- _end_dc_title = _end_title
-
- def _end_media_title(self):
- hasTitle = self.hasTitle
- self._end_title()
- self.hasTitle = hasTitle
-
- def _start_description(self, attrsD):
- context = self._getContext()
- if context.has_key('summary'):
- self._summaryKey = 'content'
- self._start_content(attrsD)
- else:
- self.pushContent('description', attrsD, 'text/html', self.infeed or self.inentry or self.insource)
- _start_dc_description = _start_description
-
- def _start_abstract(self, attrsD):
- self.pushContent('description', attrsD, 'text/plain', self.infeed or self.inentry or self.insource)
-
- def _end_description(self):
- if self._summaryKey == 'content':
- self._end_content()
- else:
- value = self.popContent('description')
- self._summaryKey = None
- _end_abstract = _end_description
- _end_dc_description = _end_description
-
- def _start_info(self, attrsD):
- self.pushContent('info', attrsD, 'text/plain', 1)
- _start_feedburner_browserfriendly = _start_info
-
- def _end_info(self):
- self.popContent('info')
- _end_feedburner_browserfriendly = _end_info
-
- def _start_generator(self, attrsD):
- if attrsD:
- attrsD = self._itsAnHrefDamnIt(attrsD)
- if attrsD.has_key('href'):
- attrsD['href'] = self.resolveURI(attrsD['href'])
- self._getContext()['generator_detail'] = FeedParserDict(attrsD)
- self.push('generator', 1)
-
- def _end_generator(self):
- value = self.pop('generator')
- context = self._getContext()
- if context.has_key('generator_detail'):
- context['generator_detail']['name'] = value
-
- def _start_admin_generatoragent(self, attrsD):
- self.push('generator', 1)
- value = self._getAttribute(attrsD, 'rdf:resource')
- if value:
- self.elementstack[-1][2].append(value)
- self.pop('generator')
- self._getContext()['generator_detail'] = FeedParserDict({'href': value})
-
- def _start_admin_errorreportsto(self, attrsD):
- self.push('errorreportsto', 1)
- value = self._getAttribute(attrsD, 'rdf:resource')
- if value:
- self.elementstack[-1][2].append(value)
- self.pop('errorreportsto')
-
- def _start_summary(self, attrsD):
- context = self._getContext()
- if context.has_key('summary'):
- self._summaryKey = 'content'
- self._start_content(attrsD)
- else:
- self._summaryKey = 'summary'
- self.pushContent(self._summaryKey, attrsD, 'text/plain', 1)
- _start_itunes_summary = _start_summary
-
- def _end_summary(self):
- if self._summaryKey == 'content':
- self._end_content()
- else:
- self.popContent(self._summaryKey or 'summary')
- self._summaryKey = None
- _end_itunes_summary = _end_summary
-
- def _start_enclosure(self, attrsD):
- attrsD = self._itsAnHrefDamnIt(attrsD)
- context = self._getContext()
- attrsD['rel']='enclosure'
- context.setdefault('links', []).append(FeedParserDict(attrsD))
- href = attrsD.get('href')
- if href and not context.get('id'):
- context['id'] = href
-
- def _start_source(self, attrsD):
- self.insource = 1
- self.hasTitle = 0
-
- def _end_source(self):
- self.insource = 0
- self._getContext()['source'] = copy.deepcopy(self.sourcedata)
- self.sourcedata.clear()
-
- def _start_content(self, attrsD):
- self.pushContent('content', attrsD, 'text/plain', 1)
- src = attrsD.get('src')
- if src:
- self.contentparams['src'] = src
- self.push('content', 1)
-
- def _start_prodlink(self, attrsD):
- self.pushContent('content', attrsD, 'text/html', 1)
-
- def _start_body(self, attrsD):
- self.pushContent('content', attrsD, 'application/xhtml+xml', 1)
- _start_xhtml_body = _start_body
-
- def _start_content_encoded(self, attrsD):
- self.pushContent('content', attrsD, 'text/html', 1)
- _start_fullitem = _start_content_encoded
-
- def _end_content(self):
- copyToDescription = self.mapContentType(self.contentparams.get('type')) in (['text/plain'] + self.html_types)
- value = self.popContent('content')
- if copyToDescription:
- self._save('description', value)
-
- _end_body = _end_content
- _end_xhtml_body = _end_content
- _end_content_encoded = _end_content
- _end_fullitem = _end_content
- _end_prodlink = _end_content
-
- def _start_itunes_image(self, attrsD):
- self.push('itunes_image', 0)
- self._getContext()['image'] = FeedParserDict({'href': attrsD.get('href')})
- _start_itunes_link = _start_itunes_image
-
- def _end_itunes_block(self):
- value = self.pop('itunes_block', 0)
- self._getContext()['itunes_block'] = (value == 'yes') and 1 or 0
-
- def _end_itunes_explicit(self):
- value = self.pop('itunes_explicit', 0)
- self._getContext()['itunes_explicit'] = (value == 'yes') and 1 or 0
-
-if _XML_AVAILABLE:
- class _StrictFeedParser(_FeedParserMixin, xml.sax.handler.ContentHandler):
- def __init__(self, baseuri, baselang, encoding):
- if _debug: sys.stderr.write('trying StrictFeedParser\n')
- xml.sax.handler.ContentHandler.__init__(self)
- _FeedParserMixin.__init__(self, baseuri, baselang, encoding)
- self.bozo = 0
- self.exc = None
-
- def startPrefixMapping(self, prefix, uri):
- self.trackNamespace(prefix, uri)
-
- def startElementNS(self, name, qname, attrs):
- namespace, localname = name
- lowernamespace = str(namespace or '').lower()
- if lowernamespace.find('backend.userland.com/rss') <> -1:
- # match any backend.userland.com namespace
- namespace = 'http://backend.userland.com/rss'
- lowernamespace = namespace
- if qname and qname.find(':') > 0:
- givenprefix = qname.split(':')[0]
- else:
- givenprefix = None
- prefix = self._matchnamespaces.get(lowernamespace, givenprefix)
- if givenprefix and (prefix == None or (prefix == '' and lowernamespace == '')) and not self.namespacesInUse.has_key(givenprefix):
- raise UndeclaredNamespace, "'%s' is not associated with a namespace" % givenprefix
- localname = str(localname).lower()
-
- # qname implementation is horribly broken in Python 2.1 (it
- # doesn't report any), and slightly broken in Python 2.2 (it
- # doesn't report the xml: namespace). So we match up namespaces
- # with a known list first, and then possibly override them with
- # the qnames the SAX parser gives us (if indeed it gives us any
- # at all). Thanks to MatejC for helping me test this and
- # tirelessly telling me that it didn't work yet.
- attrsD = {}
- if localname=='math' and namespace=='http://www.w3.org/1998/Math/MathML':
- attrsD['xmlns']=namespace
- if localname=='svg' and namespace=='http://www.w3.org/2000/svg':
- attrsD['xmlns']=namespace
-
- if prefix:
- localname = prefix.lower() + ':' + localname
- elif namespace and not qname: #Expat
- for name,value in self.namespacesInUse.items():
- if name and value == namespace:
- localname = name + ':' + localname
- break
- if _debug: sys.stderr.write('startElementNS: qname = %s, namespace = %s, givenprefix = %s, prefix = %s, attrs = %s, localname = %s\n' % (qname, namespace, givenprefix, prefix, attrs.items(), localname))
-
- for (namespace, attrlocalname), attrvalue in attrs._attrs.items():
- lowernamespace = (namespace or '').lower()
- prefix = self._matchnamespaces.get(lowernamespace, '')
- if prefix:
- attrlocalname = prefix + ':' + attrlocalname
- attrsD[str(attrlocalname).lower()] = attrvalue
- for qname in attrs.getQNames():
- attrsD[str(qname).lower()] = attrs.getValueByQName(qname)
- self.unknown_starttag(localname, attrsD.items())
-
- def characters(self, text):
- self.handle_data(text)
-
- def endElementNS(self, name, qname):
- namespace, localname = name
- lowernamespace = str(namespace or '').lower()
- if qname and qname.find(':') > 0:
- givenprefix = qname.split(':')[0]
- else:
- givenprefix = ''
- prefix = self._matchnamespaces.get(lowernamespace, givenprefix)
- if prefix:
- localname = prefix + ':' + localname
- elif namespace and not qname: #Expat
- for name,value in self.namespacesInUse.items():
- if name and value == namespace:
- localname = name + ':' + localname
- break
- localname = str(localname).lower()
- self.unknown_endtag(localname)
-
- def error(self, exc):
- self.bozo = 1
- self.exc = exc
-
- def fatalError(self, exc):
- self.error(exc)
- raise exc
-
-class _BaseHTMLProcessor(sgmllib.SGMLParser):
- special = re.compile('''[<>'"]''')
- bare_ampersand = re.compile("&(?!#\d+;|#x[0-9a-fA-F]+;|\w+;)")
- elements_no_end_tag = ['area', 'base', 'basefont', 'br', 'col', 'frame', 'hr',
- 'img', 'input', 'isindex', 'link', 'meta', 'param']
-
- def __init__(self, encoding, type):
- self.encoding = encoding
- self.type = type
- if _debug: sys.stderr.write('entering BaseHTMLProcessor, encoding=%s\n' % self.encoding)
- sgmllib.SGMLParser.__init__(self)
-
- def reset(self):
- self.pieces = []
- sgmllib.SGMLParser.reset(self)
-
- def _shorttag_replace(self, match):
- tag = match.group(1)
- if tag in self.elements_no_end_tag:
- return '<' + tag + ' />'
- else:
- return '<' + tag + '></' + tag + '>'
-
- def parse_starttag(self,i):
- j=sgmllib.SGMLParser.parse_starttag(self, i)
- if self.type == 'application/xhtml+xml':
- if j>2 and self.rawdata[j-2:j]=='/>':
- self.unknown_endtag(self.lasttag)
- return j
-
- def feed(self, data):
- data = re.compile(r'<!((?!DOCTYPE|--|\[))', re.IGNORECASE).sub(r'<!\1', data)
- #data = re.sub(r'<(\S+?)\s*?/>', self._shorttag_replace, data) # bug [ 1399464 ] Bad regexp for _shorttag_replace
- data = re.sub(r'<([^<\s]+?)\s*/>', self._shorttag_replace, data)
- data = data.replace(''', "'")
- data = data.replace('"', '"')
- if self.encoding and type(data) == type(u''):
- data = data.encode(self.encoding)
- sgmllib.SGMLParser.feed(self, data)
- sgmllib.SGMLParser.close(self)
-
- def normalize_attrs(self, attrs):
- if not attrs: return attrs
- # utility method to be called by descendants
- attrs = dict([(k.lower(), v) for k, v in attrs]).items()
- attrs = [(k, k in ('rel', 'type') and v.lower() or v) for k, v in attrs]
- attrs.sort()
- return attrs
-
- def unknown_starttag(self, tag, attrs):
- # called for each start tag
- # attrs is a list of (attr, value) tuples
- # e.g. for <pre class='screen'>, tag='pre', attrs=[('class', 'screen')]
- if _debug: sys.stderr.write('_BaseHTMLProcessor, unknown_starttag, tag=%s\n' % tag)
- uattrs = []
- strattrs=''
- if attrs:
- for key, value in attrs:
- value=value.replace('>','>').replace('<','<').replace('"','"')
- value = self.bare_ampersand.sub("&", value)
- # thanks to Kevin Marks for this breathtaking hack to deal with (valid) high-bit attribute values in UTF-8 feeds
- if type(value) != type(u''):
- try:
- value = unicode(value, self.encoding)
- except:
- value = unicode(value, 'iso-8859-1')
- uattrs.append((unicode(key, self.encoding), value))
- strattrs = u''.join([u' %s="%s"' % (key, value) for key, value in uattrs])
- if self.encoding:
- try:
- strattrs=strattrs.encode(self.encoding)
- except:
- pass
- if tag in self.elements_no_end_tag:
- self.pieces.append('<%(tag)s%(strattrs)s />' % locals())
- else:
- self.pieces.append('<%(tag)s%(strattrs)s>' % locals())
-
- def unknown_endtag(self, tag):
- # called for each end tag, e.g. for </pre>, tag will be 'pre'
- # Reconstruct the original end tag.
- if tag not in self.elements_no_end_tag:
- self.pieces.append("</%(tag)s>" % locals())
-
- def handle_charref(self, ref):
- # called for each character reference, e.g. for ' ', ref will be '160'
- # Reconstruct the original character reference.
- if ref.startswith('x'):
- value = unichr(int(ref[1:],16))
- else:
- value = unichr(int(ref))
-
- if value in _cp1252.keys():
- self.pieces.append('&#%s;' % hex(ord(_cp1252[value]))[1:])
- else:
- self.pieces.append('&#%(ref)s;' % locals())
-
- def handle_entityref(self, ref):
- # called for each entity reference, e.g. for '©', ref will be 'copy'
- # Reconstruct the original entity reference.
- if name2codepoint.has_key(ref):
- self.pieces.append('&%(ref)s;' % locals())
- else:
- self.pieces.append('&%(ref)s' % locals())
-
- def handle_data(self, text):
- # called for each block of plain text, i.e. outside of any tag and
- # not containing any character or entity references
- # Store the original text verbatim.
- if _debug: sys.stderr.write('_BaseHTMLProcessor, handle_text, text=%s\n' % text)
- self.pieces.append(text)
-
- def handle_comment(self, text):
- # called for each HTML comment, e.g. <!-- insert Javascript code here -->
- # Reconstruct the original comment.
- self.pieces.append('<!--%(text)s-->' % locals())
-
- def handle_pi(self, text):
- # called for each processing instruction, e.g. <?instruction>
- # Reconstruct original processing instruction.
- self.pieces.append('<?%(text)s>' % locals())
-
- def handle_decl(self, text):
- # called for the DOCTYPE, if present, e.g.
- # <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
- # "http://www.w3.org/TR/html4/loose.dtd">
- # Reconstruct original DOCTYPE
- self.pieces.append('<!%(text)s>' % locals())
-
- _new_declname_match = re.compile(r'[a-zA-Z][-_.a-zA-Z0-9:]*\s*').match
- def _scan_name(self, i, declstartpos):
- rawdata = self.rawdata
- n = len(rawdata)
- if i == n:
- return None, -1
- m = self._new_declname_match(rawdata, i)
- if m:
- s = m.group()
- name = s.strip()
- if (i + len(s)) == n:
- return None, -1 # end of buffer
- return name.lower(), m.end()
- else:
- self.handle_data(rawdata)
-# self.updatepos(declstartpos, i)
- return None, -1
-
- def convert_charref(self, name):
- return '&#%s;' % name
-
- def convert_entityref(self, name):
- return '&%s;' % name
-
- def output(self):
- '''Return processed HTML as a single string'''
- return ''.join([str(p) for p in self.pieces])
-
-class _LooseFeedParser(_FeedParserMixin, _BaseHTMLProcessor):
- def __init__(self, baseuri, baselang, encoding, entities):
- sgmllib.SGMLParser.__init__(self)
- _FeedParserMixin.__init__(self, baseuri, baselang, encoding)
- _BaseHTMLProcessor.__init__(self, encoding, 'application/xhtml+xml')
- self.entities=entities
-
- def decodeEntities(self, element, data):
- data = data.replace('<', '<')
- data = data.replace('<', '<')
- data = data.replace('<', '<')
- data = data.replace('>', '>')
- data = data.replace('>', '>')
- data = data.replace('>', '>')
- data = data.replace('&', '&')
- data = data.replace('&', '&')
- data = data.replace('"', '"')
- data = data.replace('"', '"')
- data = data.replace(''', ''')
- data = data.replace(''', ''')
- if self.contentparams.has_key('type') and not self.contentparams.get('type', 'xml').endswith('xml'):
- data = data.replace('<', '<')
- data = data.replace('>', '>')
- data = data.replace('&', '&')
- data = data.replace('"', '"')
- data = data.replace(''', "'")
- return data
-
- def strattrs(self, attrs):
- return ''.join([' %s="%s"' % (n,v.replace('"','"')) for n,v in attrs])
-
-class _MicroformatsParser:
- STRING = 1
- DATE = 2
- URI = 3
- NODE = 4
- EMAIL = 5
-
- known_xfn_relationships = ['contact', 'acquaintance', 'friend', 'met', 'co-worker', 'coworker', 'colleague', 'co-resident', 'coresident', 'neighbor', 'child', 'parent', 'sibling', 'brother', 'sister', 'spouse', 'wife', 'husband', 'kin', 'relative', 'muse', 'crush', 'date', 'sweetheart', 'me']
- known_binary_extensions = ['zip','rar','exe','gz','tar','tgz','tbz2','bz2','z','7z','dmg','img','sit','sitx','hqx','deb','rpm','bz2','jar','rar','iso','bin','msi','mp2','mp3','ogg','ogm','mp4','m4v','m4a','avi','wma','wmv']
-
- def __init__(self, data, baseuri, encoding):
- self.document = BeautifulSoup.BeautifulSoup(data)
- self.baseuri = baseuri
- self.encoding = encoding
- if type(data) == type(u''):
- data = data.encode(encoding)
- self.tags = []
- self.enclosures = []
- self.xfn = []
- self.vcard = None
-
- def vcardEscape(self, s):
- if type(s) in (type(''), type(u'')):
- s = s.replace(',', '\\,').replace(';', '\\;').replace('\n', '\\n')
- return s
-
- def vcardFold(self, s):
- s = re.sub(';+$', '', s)
- sFolded = ''
- iMax = 75
- sPrefix = ''
- while len(s) > iMax:
- sFolded += sPrefix + s[:iMax] + '\n'
- s = s[iMax:]
- sPrefix = ' '
- iMax = 74
- sFolded += sPrefix + s
- return sFolded
-
- def normalize(self, s):
- return re.sub(r'\s+', ' ', s).strip()
-
- def unique(self, aList):
- results = []
- for element in aList:
- if element not in results:
- results.append(element)
- return results
-
- def toISO8601(self, dt):
- return time.strftime('%Y-%m-%dT%H:%M:%SZ', dt)
-
- def getPropertyValue(self, elmRoot, sProperty, iPropertyType=4, bAllowMultiple=0, bAutoEscape=0):
- all = lambda x: 1
- sProperty = sProperty.lower()
- bFound = 0
- bNormalize = 1
- propertyMatch = {'class': re.compile(r'\b%s\b' % sProperty)}
- if bAllowMultiple and (iPropertyType != self.NODE):
- snapResults = []
- containers = elmRoot(['ul', 'ol'], propertyMatch)
- for container in containers:
- snapResults.extend(container('li'))
- bFound = (len(snapResults) != 0)
- if not bFound:
- snapResults = elmRoot(all, propertyMatch)
- bFound = (len(snapResults) != 0)
- if (not bFound) and (sProperty == 'value'):
- snapResults = elmRoot('pre')
- bFound = (len(snapResults) != 0)
- bNormalize = not bFound
- if not bFound:
- snapResults = [elmRoot]
- bFound = (len(snapResults) != 0)
- arFilter = []
- if sProperty == 'vcard':
- snapFilter = elmRoot(all, propertyMatch)
- for node in snapFilter:
- if node.findParent(all, propertyMatch):
- arFilter.append(node)
- arResults = []
- for node in snapResults:
- if node not in arFilter:
- arResults.append(node)
- bFound = (len(arResults) != 0)
- if not bFound:
- if bAllowMultiple: return []
- elif iPropertyType == self.STRING: return ''
- elif iPropertyType == self.DATE: return None
- elif iPropertyType == self.URI: return ''
- elif iPropertyType == self.NODE: return None
- else: return None
- arValues = []
- for elmResult in arResults:
- sValue = None
- if iPropertyType == self.NODE:
- if bAllowMultiple:
- arValues.append(elmResult)
- continue
- else:
- return elmResult
- sNodeName = elmResult.name.lower()
- if (iPropertyType == self.EMAIL) and (sNodeName == 'a'):
- sValue = (elmResult.get('href') or '').split('mailto:').pop().split('?')[0]
- if sValue:
- sValue = bNormalize and self.normalize(sValue) or sValue.strip()
- if (not sValue) and (sNodeName == 'abbr'):
- sValue = elmResult.get('title')
- if sValue:
- sValue = bNormalize and self.normalize(sValue) or sValue.strip()
- if (not sValue) and (iPropertyType == self.URI):
- if sNodeName == 'a': sValue = elmResult.get('href')
- elif sNodeName == 'img': sValue = elmResult.get('src')
- elif sNodeName == 'object': sValue = elmResult.get('data')
- if sValue:
- sValue = bNormalize and self.normalize(sValue) or sValue.strip()
- if (not sValue) and (sNodeName == 'img'):
- sValue = elmResult.get('alt')
- if sValue:
- sValue = bNormalize and self.normalize(sValue) or sValue.strip()
- if not sValue:
- sValue = elmResult.renderContents()
- sValue = re.sub(r'<\S[^>]*>', '', sValue)
- sValue = sValue.replace('\r\n', '\n')
- sValue = sValue.replace('\r', '\n')
- if sValue:
- sValue = bNormalize and self.normalize(sValue) or sValue.strip()
- if not sValue: continue
- if iPropertyType == self.DATE:
- sValue = _parse_date_iso8601(sValue)
- if bAllowMultiple:
- arValues.append(bAutoEscape and self.vcardEscape(sValue) or sValue)
- else:
- return bAutoEscape and self.vcardEscape(sValue) or sValue
- return arValues
-
- def findVCards(self, elmRoot, bAgentParsing=0):
- sVCards = ''
-
- if not bAgentParsing:
- arCards = self.getPropertyValue(elmRoot, 'vcard', bAllowMultiple=1)
- else:
- arCards = [elmRoot]
-
- for elmCard in arCards:
- arLines = []
-
- def processSingleString(sProperty):
- sValue = self.getPropertyValue(elmCard, sProperty, self.STRING, bAutoEscape=1)
- if sValue:
- arLines.append(self.vcardFold(sProperty.upper() + ':' + sValue))
- return sValue or ''
-
- def processSingleURI(sProperty):
- sValue = self.getPropertyValue(elmCard, sProperty, self.URI)
- if sValue:
- sContentType = ''
- sEncoding = ''
- sValueKey = ''
- if sValue.startswith('data:'):
- sEncoding = ';ENCODING=b'
- sContentType = sValue.split(';')[0].split('/').pop()
- sValue = sValue.split(',', 1).pop()
- else:
- elmValue = self.getPropertyValue(elmCard, sProperty)
- if elmValue:
- if sProperty != 'url':
- sValueKey = ';VALUE=uri'
- sContentType = elmValue.get('type', '').strip().split('/').pop().strip()
- sContentType = sContentType.upper()
- if sContentType == 'OCTET-STREAM':
- sContentType = ''
- if sContentType:
- sContentType = ';TYPE=' + sContentType.upper()
- arLines.append(self.vcardFold(sProperty.upper() + sEncoding + sContentType + sValueKey + ':' + sValue))
-
- def processTypeValue(sProperty, arDefaultType, arForceType=None):
- arResults = self.getPropertyValue(elmCard, sProperty, bAllowMultiple=1)
- for elmResult in arResults:
- arType = self.getPropertyValue(elmResult, 'type', self.STRING, 1, 1)
- if arForceType:
- arType = self.unique(arForceType + arType)
- if not arType:
- arType = arDefaultType
- sValue = self.getPropertyValue(elmResult, 'value', self.EMAIL, 0)
- if sValue:
- arLines.append(self.vcardFold(sProperty.upper() + ';TYPE=' + ','.join(arType) + ':' + sValue))
-
- # AGENT
- # must do this before all other properties because it is destructive
- # (removes nested class="vcard" nodes so they don't interfere with
- # this vcard's other properties)
- arAgent = self.getPropertyValue(elmCard, 'agent', bAllowMultiple=1)
- for elmAgent in arAgent:
- if re.compile(r'\bvcard\b').search(elmAgent.get('class')):
- sAgentValue = self.findVCards(elmAgent, 1) + '\n'
- sAgentValue = sAgentValue.replace('\n', '\\n')
- sAgentValue = sAgentValue.replace(';', '\\;')
- if sAgentValue:
- arLines.append(self.vcardFold('AGENT:' + sAgentValue))
- elmAgent['class'] = ''
- elmAgent.contents = []
- else:
- sAgentValue = self.getPropertyValue(elmAgent, 'value', self.URI, bAutoEscape=1);
- if sAgentValue:
- arLines.append(self.vcardFold('AGENT;VALUE=uri:' + sAgentValue))
-
- # FN (full name)
- sFN = processSingleString('fn')
-
- # N (name)
- elmName = self.getPropertyValue(elmCard, 'n')
- if elmName:
- sFamilyName = self.getPropertyValue(elmName, 'family-name', self.STRING, bAutoEscape=1)
- sGivenName = self.getPropertyValue(elmName, 'given-name', self.STRING, bAutoEscape=1)
- arAdditionalNames = self.getPropertyValue(elmName, 'additional-name', self.STRING, 1, 1) + self.getPropertyValue(elmName, 'additional-names', self.STRING, 1, 1)
- arHonorificPrefixes = self.getPropertyValue(elmName, 'honorific-prefix', self.STRING, 1, 1) + self.getPropertyValue(elmName, 'honorific-prefixes', self.STRING, 1, 1)
- arHonorificSuffixes = self.getPropertyValue(elmName, 'honorific-suffix', self.STRING, 1, 1) + self.getPropertyValue(elmName, 'honorific-suffixes', self.STRING, 1, 1)
- arLines.append(self.vcardFold('N:' + sFamilyName + ';' +
- sGivenName + ';' +
- ','.join(arAdditionalNames) + ';' +
- ','.join(arHonorificPrefixes) + ';' +
- ','.join(arHonorificSuffixes)))
- elif sFN:
- # implied "N" optimization
- # http://microformats.org/wiki/hcard#Implied_.22N.22_Optimization
- arNames = self.normalize(sFN).split()
- if len(arNames) == 2:
- bFamilyNameFirst = (arNames[0].endswith(',') or
- len(arNames[1]) == 1 or
- ((len(arNames[1]) == 2) and (arNames[1].endswith('.'))))
- if bFamilyNameFirst:
- arLines.append(self.vcardFold('N:' + arNames[0] + ';' + arNames[1]))
- else:
- arLines.append(self.vcardFold('N:' + arNames[1] + ';' + arNames[0]))
-
- # SORT-STRING
- sSortString = self.getPropertyValue(elmCard, 'sort-string', self.STRING, bAutoEscape=1)
- if sSortString:
- arLines.append(self.vcardFold('SORT-STRING:' + sSortString))
-
- # NICKNAME
- arNickname = self.getPropertyValue(elmCard, 'nickname', self.STRING, 1, 1)
- if arNickname:
- arLines.append(self.vcardFold('NICKNAME:' + ','.join(arNickname)))
-
- # PHOTO
- processSingleURI('photo')
-
- # BDAY
- dtBday = self.getPropertyValue(elmCard, 'bday', self.DATE)
- if dtBday:
- arLines.append(self.vcardFold('BDAY:' + self.toISO8601(dtBday)))
-
- # ADR (address)
- arAdr = self.getPropertyValue(elmCard, 'adr', bAllowMultiple=1)
- for elmAdr in arAdr:
- arType = self.getPropertyValue(elmAdr, 'type', self.STRING, 1, 1)
- if not arType:
- arType = ['intl','postal','parcel','work'] # default adr types, see RFC 2426 section 3.2.1
- sPostOfficeBox = self.getPropertyValue(elmAdr, 'post-office-box', self.STRING, 0, 1)
- sExtendedAddress = self.getPropertyValue(elmAdr, 'extended-address', self.STRING, 0, 1)
- sStreetAddress = self.getPropertyValue(elmAdr, 'street-address', self.STRING, 0, 1)
- sLocality = self.getPropertyValue(elmAdr, 'locality', self.STRING, 0, 1)
- sRegion = self.getPropertyValue(elmAdr, 'region', self.STRING, 0, 1)
- sPostalCode = self.getPropertyValue(elmAdr, 'postal-code', self.STRING, 0, 1)
- sCountryName = self.getPropertyValue(elmAdr, 'country-name', self.STRING, 0, 1)
- arLines.append(self.vcardFold('ADR;TYPE=' + ','.join(arType) + ':' +
- sPostOfficeBox + ';' +
- sExtendedAddress + ';' +
- sStreetAddress + ';' +
- sLocality + ';' +
- sRegion + ';' +
- sPostalCode + ';' +
- sCountryName))
-
- # LABEL
- processTypeValue('label', ['intl','postal','parcel','work'])
-
- # TEL (phone number)
- processTypeValue('tel', ['voice'])
-
- # EMAIL
- processTypeValue('email', ['internet'], ['internet'])
-
- # MAILER
- processSingleString('mailer')
-
- # TZ (timezone)
- processSingleString('tz')
-
- # GEO (geographical information)
- elmGeo = self.getPropertyValue(elmCard, 'geo')
- if elmGeo:
- sLatitude = self.getPropertyValue(elmGeo, 'latitude', self.STRING, 0, 1)
- sLongitude = self.getPropertyValue(elmGeo, 'longitude', self.STRING, 0, 1)
- arLines.append(self.vcardFold('GEO:' + sLatitude + ';' + sLongitude))
-
- # TITLE
- processSingleString('title')
-
- # ROLE
- processSingleString('role')
-
- # LOGO
- processSingleURI('logo')
-
- # ORG (organization)
- elmOrg = self.getPropertyValue(elmCard, 'org')
- if elmOrg:
- sOrganizationName = self.getPropertyValue(elmOrg, 'organization-name', self.STRING, 0, 1)
- if not sOrganizationName:
- # implied "organization-name" optimization
- # http://microformats.org/wiki/hcard#Implied_.22organization-name.22_Optimization
- sOrganizationName = self.getPropertyValue(elmCard, 'org', self.STRING, 0, 1)
- if sOrganizationName:
- arLines.append(self.vcardFold('ORG:' + sOrganizationName))
- else:
- arOrganizationUnit = self.getPropertyValue(elmOrg, 'organization-unit', self.STRING, 1, 1)
- arLines.append(self.vcardFold('ORG:' + sOrganizationName + ';' + ';'.join(arOrganizationUnit)))
-
- # CATEGORY
- arCategory = self.getPropertyValue(elmCard, 'category', self.STRING, 1, 1) + self.getPropertyValue(elmCard, 'categories', self.STRING, 1, 1)
- if arCategory:
- arLines.append(self.vcardFold('CATEGORIES:' + ','.join(arCategory)))
-
- # NOTE
- processSingleString('note')
-
- # REV
- processSingleString('rev')
-
- # SOUND
- processSingleURI('sound')
-
- # UID
- processSingleString('uid')
-
- # URL
- processSingleURI('url')
-
- # CLASS
- processSingleString('class')
-
- # KEY
- processSingleURI('key')
-
- if arLines:
- arLines = ['BEGIN:vCard','VERSION:3.0'] + arLines + ['END:vCard']
- sVCards += '\n'.join(arLines) + '\n'
-
- return sVCards.strip()
-
- def isProbablyDownloadable(self, elm):
- attrsD = elm.attrMap
- if not attrsD.has_key('href'): return 0
- linktype = attrsD.get('type', '').strip()
- if linktype.startswith('audio/') or \
- linktype.startswith('video/') or \
- (linktype.startswith('application/') and not linktype.endswith('xml')):
- return 1
- path = urlparse.urlparse(attrsD['href'])[2]
- if path.find('.') == -1: return 0
- fileext = path.split('.').pop().lower()
- return fileext in self.known_binary_extensions
-
- def findTags(self):
- all = lambda x: 1
- for elm in self.document(all, {'rel': re.compile(r'\btag\b')}):
- href = elm.get('href')
- if not href: continue
- urlscheme, domain, path, params, query, fragment = \
- urlparse.urlparse(_urljoin(self.baseuri, href))
- segments = path.split('/')
- tag = segments.pop()
- if not tag:
- tag = segments.pop()
- tagscheme = urlparse.urlunparse((urlscheme, domain, '/'.join(segments), '', '', ''))
- if not tagscheme.endswith('/'):
- tagscheme += '/'
- self.tags.append(FeedParserDict({"term": tag, "scheme": tagscheme, "label": elm.string or ''}))
-
- def findEnclosures(self):
- all = lambda x: 1
- enclosure_match = re.compile(r'\benclosure\b')
- for elm in self.document(all, {'href': re.compile(r'.+')}):
- if not enclosure_match.search(elm.get('rel', '')) and not self.isProbablyDownloadable(elm): continue
- if elm.attrMap not in self.enclosures:
- self.enclosures.append(elm.attrMap)
- if elm.string and not elm.get('title'):
- self.enclosures[-1]['title'] = elm.string
-
- def findXFN(self):
- all = lambda x: 1
- for elm in self.document(all, {'rel': re.compile('.+'), 'href': re.compile('.+')}):
- rels = elm.get('rel', '').split()
- xfn_rels = []
- for rel in rels:
- if rel in self.known_xfn_relationships:
- xfn_rels.append(rel)
- if xfn_rels:
- self.xfn.append({"relationships": xfn_rels, "href": elm.get('href', ''), "name": elm.string})
-
-def _parseMicroformats(htmlSource, baseURI, encoding):
- if not BeautifulSoup: return
- if _debug: sys.stderr.write('entering _parseMicroformats\n')
- p = _MicroformatsParser(htmlSource, baseURI, encoding)
- p.vcard = p.findVCards(p.document)
- p.findTags()
- p.findEnclosures()
- p.findXFN()
- return {"tags": p.tags, "enclosures": p.enclosures, "xfn": p.xfn, "vcard": p.vcard}
-
-class _RelativeURIResolver(_BaseHTMLProcessor):
- relative_uris = [('a', 'href'),
- ('applet', 'codebase'),
- ('area', 'href'),
- ('blockquote', 'cite'),
- ('body', 'background'),
- ('del', 'cite'),
- ('form', 'action'),
- ('frame', 'longdesc'),
- ('frame', 'src'),
- ('iframe', 'longdesc'),
- ('iframe', 'src'),
- ('head', 'profile'),
- ('img', 'longdesc'),
- ('img', 'src'),
- ('img', 'usemap'),
- ('input', 'src'),
- ('input', 'usemap'),
- ('ins', 'cite'),
- ('link', 'href'),
- ('object', 'classid'),
- ('object', 'codebase'),
- ('object', 'data'),
- ('object', 'usemap'),
- ('q', 'cite'),
- ('script', 'src')]
-
- def __init__(self, baseuri, encoding, type):
- _BaseHTMLProcessor.__init__(self, encoding, type)
- self.baseuri = baseuri
-
- def resolveURI(self, uri):
- return _urljoin(self.baseuri, uri.strip())
-
- def unknown_starttag(self, tag, attrs):
- attrs = self.normalize_attrs(attrs)
- attrs = [(key, ((tag, key) in self.relative_uris) and self.resolveURI(value) or value) for key, value in attrs]
- _BaseHTMLProcessor.unknown_starttag(self, tag, attrs)
-
-def _resolveRelativeURIs(htmlSource, baseURI, encoding, type):
- if _debug: sys.stderr.write('entering _resolveRelativeURIs\n')
- p = _RelativeURIResolver(baseURI, encoding, type)
- p.feed(htmlSource)
- return p.output()
-
-class _HTMLSanitizer(_BaseHTMLProcessor):
- acceptable_elements = ['a', 'abbr', 'acronym', 'address', 'area', 'article',
- 'aside', 'audio', 'b', 'big', 'blockquote', 'br', 'button', 'canvas',
- 'caption', 'center', 'cite', 'code', 'col', 'colgroup', 'command',
- 'datagrid', 'datalist', 'dd', 'del', 'details', 'dfn', 'dialog', 'dir',
- 'div', 'dl', 'dt', 'em', 'event-source', 'fieldset', 'figure', 'footer',
- 'font', 'form', 'header', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'hr', 'i',
- 'img', 'input', 'ins', 'keygen', 'kbd', 'label', 'legend', 'li', 'm', 'map',
- 'menu', 'meter', 'multicol', 'nav', 'nextid', 'ol', 'output', 'optgroup',
- 'option', 'p', 'pre', 'progress', 'q', 's', 'samp', 'section', 'select',
- 'small', 'sound', 'source', 'spacer', 'span', 'strike', 'strong', 'sub',
- 'sup', 'table', 'tbody', 'td', 'textarea', 'time', 'tfoot', 'th', 'thead',
- 'tr', 'tt', 'u', 'ul', 'var', 'video', 'noscript']
-
- acceptable_attributes = ['abbr', 'accept', 'accept-charset', 'accesskey',
- 'action', 'align', 'alt', 'autoplay', 'autocomplete', 'autofocus', 'axis',
- 'background', 'balance', 'bgcolor', 'bgproperties', 'border',
- 'bordercolor', 'bordercolordark', 'bordercolorlight', 'bottompadding',
- 'cellpadding', 'cellspacing', 'ch', 'challenge', 'char', 'charoff',
- 'choff', 'charset', 'checked', 'cite', 'class', 'clear', 'color', 'cols',
- 'colspan', 'compact', 'contenteditable', 'coords', 'data', 'datafld',
- 'datapagesize', 'datasrc', 'datetime', 'default', 'delay', 'dir',
- 'disabled', 'draggable', 'dynsrc', 'enctype', 'end', 'face', 'for',
- 'form', 'frame', 'galleryimg', 'gutter', 'headers', 'height', 'hidefocus',
- 'hidden', 'high', 'href', 'hreflang', 'hspace', 'icon', 'id', 'inputmode',
- 'ismap', 'keytype', 'label', 'leftspacing', 'lang', 'list', 'longdesc',
- 'loop', 'loopcount', 'loopend', 'loopstart', 'low', 'lowsrc', 'max',
- 'maxlength', 'media', 'method', 'min', 'multiple', 'name', 'nohref',
- 'noshade', 'nowrap', 'open', 'optimum', 'pattern', 'ping', 'point-size',
- 'prompt', 'pqg', 'radiogroup', 'readonly', 'rel', 'repeat-max',
- 'repeat-min', 'replace', 'required', 'rev', 'rightspacing', 'rows',
- 'rowspan', 'rules', 'scope', 'selected', 'shape', 'size', 'span', 'src',
- 'start', 'step', 'summary', 'suppress', 'tabindex', 'target', 'template',
- 'title', 'toppadding', 'type', 'unselectable', 'usemap', 'urn', 'valign',
- 'value', 'variable', 'volume', 'vspace', 'vrml', 'width', 'wrap',
- 'xml:lang']
-
- unacceptable_elements_with_end_tag = ['script', 'applet', 'style']
-
- acceptable_css_properties = ['azimuth', 'background-color',
- 'border-bottom-color', 'border-collapse', 'border-color',
- 'border-left-color', 'border-right-color', 'border-top-color', 'clear',
- 'color', 'cursor', 'direction', 'display', 'elevation', 'float', 'font',
- 'font-family', 'font-size', 'font-style', 'font-variant', 'font-weight',
- 'height', 'letter-spacing', 'line-height', 'overflow', 'pause',
- 'pause-after', 'pause-before', 'pitch', 'pitch-range', 'richness',
- 'speak', 'speak-header', 'speak-numeral', 'speak-punctuation',
- 'speech-rate', 'stress', 'text-align', 'text-decoration', 'text-indent',
- 'unicode-bidi', 'vertical-align', 'voice-family', 'volume',
- 'white-space', 'width']
-
- # survey of common keywords found in feeds
- acceptable_css_keywords = ['auto', 'aqua', 'black', 'block', 'blue',
- 'bold', 'both', 'bottom', 'brown', 'center', 'collapse', 'dashed',
- 'dotted', 'fuchsia', 'gray', 'green', '!important', 'italic', 'left',
- 'lime', 'maroon', 'medium', 'none', 'navy', 'normal', 'nowrap', 'olive',
- 'pointer', 'purple', 'red', 'right', 'solid', 'silver', 'teal', 'top',
- 'transparent', 'underline', 'white', 'yellow']
-
- valid_css_values = re.compile('^(#[0-9a-f]+|rgb\(\d+%?,\d*%?,?\d*%?\)?|' +
- '\d{0,2}\.?\d{0,2}(cm|em|ex|in|mm|pc|pt|px|%|,|\))?)$')
-
- mathml_elements = ['annotation', 'annotation-xml', 'maction', 'math',
- 'merror', 'mfenced', 'mfrac', 'mi', 'mmultiscripts', 'mn', 'mo', 'mover', 'mpadded',
- 'mphantom', 'mprescripts', 'mroot', 'mrow', 'mspace', 'msqrt', 'mstyle',
- 'msub', 'msubsup', 'msup', 'mtable', 'mtd', 'mtext', 'mtr', 'munder',
- 'munderover', 'none', 'semantics']
-
- mathml_attributes = ['actiontype', 'align', 'columnalign', 'columnalign',
- 'columnalign', 'close', 'columnlines', 'columnspacing', 'columnspan', 'depth',
- 'display', 'displaystyle', 'encoding', 'equalcolumns', 'equalrows',
- 'fence', 'fontstyle', 'fontweight', 'frame', 'height', 'linethickness',
- 'lspace', 'mathbackground', 'mathcolor', 'mathvariant', 'mathvariant',
- 'maxsize', 'minsize', 'open', 'other', 'rowalign', 'rowalign', 'rowalign',
- 'rowlines', 'rowspacing', 'rowspan', 'rspace', 'scriptlevel', 'selection',
- 'separator', 'separators', 'stretchy', 'width', 'width', 'xlink:href',
- 'xlink:show', 'xlink:type', 'xmlns', 'xmlns:xlink']
-
- # svgtiny - foreignObject + linearGradient + radialGradient + stop
- svg_elements = ['a', 'animate', 'animateColor', 'animateMotion',
- 'animateTransform', 'circle', 'defs', 'desc', 'ellipse', 'foreignObject',
- 'font-face', 'font-face-name', 'font-face-src', 'g', 'glyph', 'hkern',
- 'linearGradient', 'line', 'marker', 'metadata', 'missing-glyph', 'mpath',
- 'path', 'polygon', 'polyline', 'radialGradient', 'rect', 'set', 'stop',
- 'svg', 'switch', 'text', 'title', 'tspan', 'use']
-
- # svgtiny + class + opacity + offset + xmlns + xmlns:xlink
- svg_attributes = ['accent-height', 'accumulate', 'additive', 'alphabetic',
- 'arabic-form', 'ascent', 'attributeName', 'attributeType',
- 'baseProfile', 'bbox', 'begin', 'by', 'calcMode', 'cap-height',
- 'class', 'color', 'color-rendering', 'content', 'cx', 'cy', 'd', 'dx',
- 'dy', 'descent', 'display', 'dur', 'end', 'fill', 'fill-opacity',
- 'fill-rule', 'font-family', 'font-size', 'font-stretch', 'font-style',
- 'font-variant', 'font-weight', 'from', 'fx', 'fy', 'g1', 'g2',
- 'glyph-name', 'gradientUnits', 'hanging', 'height', 'horiz-adv-x',
- 'horiz-origin-x', 'id', 'ideographic', 'k', 'keyPoints', 'keySplines',
- 'keyTimes', 'lang', 'mathematical', 'marker-end', 'marker-mid',
- 'marker-start', 'markerHeight', 'markerUnits', 'markerWidth', 'max',
- 'min', 'name', 'offset', 'opacity', 'orient', 'origin',
- 'overline-position', 'overline-thickness', 'panose-1', 'path',
- 'pathLength', 'points', 'preserveAspectRatio', 'r', 'refX', 'refY',
- 'repeatCount', 'repeatDur', 'requiredExtensions', 'requiredFeatures',
- 'restart', 'rotate', 'rx', 'ry', 'slope', 'stemh', 'stemv',
- 'stop-color', 'stop-opacity', 'strikethrough-position',
- 'strikethrough-thickness', 'stroke', 'stroke-dasharray',
- 'stroke-dashoffset', 'stroke-linecap', 'stroke-linejoin',
- 'stroke-miterlimit', 'stroke-opacity', 'stroke-width', 'systemLanguage',
- 'target', 'text-anchor', 'to', 'transform', 'type', 'u1', 'u2',
- 'underline-position', 'underline-thickness', 'unicode', 'unicode-range',
- 'units-per-em', 'values', 'version', 'viewBox', 'visibility', 'width',
- 'widths', 'x', 'x-height', 'x1', 'x2', 'xlink:actuate', 'xlink:arcrole',
- 'xlink:href', 'xlink:role', 'xlink:show', 'xlink:title', 'xlink:type',
- 'xml:base', 'xml:lang', 'xml:space', 'xmlns', 'xmlns:xlink', 'y', 'y1',
- 'y2', 'zoomAndPan']
-
- svg_attr_map = None
- svg_elem_map = None
-
- acceptable_svg_properties = [ 'fill', 'fill-opacity', 'fill-rule',
- 'stroke', 'stroke-width', 'stroke-linecap', 'stroke-linejoin',
- 'stroke-opacity']
-
- def reset(self):
- _BaseHTMLProcessor.reset(self)
- self.unacceptablestack = 0
- self.mathmlOK = 0
- self.svgOK = 0
-
- def unknown_starttag(self, tag, attrs):
- acceptable_attributes = self.acceptable_attributes
- keymap = {}
- if not tag in self.acceptable_elements or self.svgOK:
- if tag in self.unacceptable_elements_with_end_tag:
- self.unacceptablestack += 1
-
- # not otherwise acceptable, perhaps it is MathML or SVG?
- if tag=='math' and ('xmlns','http://www.w3.org/1998/Math/MathML') in attrs:
- self.mathmlOK += 1
- if tag=='svg' and ('xmlns','http://www.w3.org/2000/svg') in attrs:
- self.svgOK += 1
-
- # chose acceptable attributes based on tag class, else bail
- if self.mathmlOK and tag in self.mathml_elements:
- acceptable_attributes = self.mathml_attributes
- elif self.svgOK and tag in self.svg_elements:
- # for most vocabularies, lowercasing is a good idea. Many
- # svg elements, however, are camel case
- if not self.svg_attr_map:
- lower=[attr.lower() for attr in self.svg_attributes]
- mix=[a for a in self.svg_attributes if a not in lower]
- self.svg_attributes = lower
- self.svg_attr_map = dict([(a.lower(),a) for a in mix])
-
- lower=[attr.lower() for attr in self.svg_elements]
- mix=[a for a in self.svg_elements if a not in lower]
- self.svg_elements = lower
- self.svg_elem_map = dict([(a.lower(),a) for a in mix])
- acceptable_attributes = self.svg_attributes
- tag = self.svg_elem_map.get(tag,tag)
- keymap = self.svg_attr_map
- elif not tag in self.acceptable_elements:
- return
-
- # declare xlink namespace, if needed
- if self.mathmlOK or self.svgOK:
- if filter(lambda (n,v): n.startswith('xlink:'),attrs):
- if not ('xmlns:xlink','http://www.w3.org/1999/xlink') in attrs:
- attrs.append(('xmlns:xlink','http://www.w3.org/1999/xlink'))
-
- clean_attrs = []
- for key, value in self.normalize_attrs(attrs):
- if key in acceptable_attributes:
- key=keymap.get(key,key)
- clean_attrs.append((key,value))
- elif key=='style':
- clean_value = self.sanitize_style(value)
- if clean_value: clean_attrs.append((key,clean_value))
- _BaseHTMLProcessor.unknown_starttag(self, tag, clean_attrs)
-
- def unknown_endtag(self, tag):
- if not tag in self.acceptable_elements:
- if tag in self.unacceptable_elements_with_end_tag:
- self.unacceptablestack -= 1
- if self.mathmlOK and tag in self.mathml_elements:
- if tag == 'math' and self.mathmlOK: self.mathmlOK -= 1
- elif self.svgOK and tag in self.svg_elements:
- tag = self.svg_elem_map.get(tag,tag)
- if tag == 'svg' and self.svgOK: self.svgOK -= 1
- else:
- return
- _BaseHTMLProcessor.unknown_endtag(self, tag)
-
- def handle_pi(self, text):
- pass
-
- def handle_decl(self, text):
- pass
-
- def handle_data(self, text):
- if not self.unacceptablestack:
- _BaseHTMLProcessor.handle_data(self, text)
-
- def sanitize_style(self, style):
- # disallow urls
- style=re.compile('url\s*\(\s*[^\s)]+?\s*\)\s*').sub(' ',style)
-
- # gauntlet
- if not re.match("""^([:,;#%.\sa-zA-Z0-9!]|\w-\w|'[\s\w]+'|"[\s\w]+"|\([\d,\s]+\))*$""", style): return ''
- if not re.match("^(\s*[-\w]+\s*:\s*[^:;]*(;|$))*$", style): return ''
-
- clean = []
- for prop,value in re.findall("([-\w]+)\s*:\s*([^:;]*)",style):
- if not value: continue
- if prop.lower() in self.acceptable_css_properties:
- clean.append(prop + ': ' + value + ';')
- elif prop.split('-')[0].lower() in ['background','border','margin','padding']:
- for keyword in value.split():
- if not keyword in self.acceptable_css_keywords and \
- not self.valid_css_values.match(keyword):
- break
- else:
- clean.append(prop + ': ' + value + ';')
- elif self.svgOK and prop.lower() in self.acceptable_svg_properties:
- clean.append(prop + ': ' + value + ';')
-
- return ' '.join(clean)
-
-
-def _sanitizeHTML(htmlSource, encoding, type):
- p = _HTMLSanitizer(encoding, type)
- p.feed(htmlSource)
- data = p.output()
- if TIDY_MARKUP:
- # loop through list of preferred Tidy interfaces looking for one that's installed,
- # then set up a common _tidy function to wrap the interface-specific API.
- _tidy = None
- for tidy_interface in PREFERRED_TIDY_INTERFACES:
- try:
- if tidy_interface == "uTidy":
- from tidy import parseString as _utidy
- def _tidy(data, **kwargs):
- return str(_utidy(data, **kwargs))
- break
- elif tidy_interface == "mxTidy":
- from mx.Tidy import Tidy as _mxtidy
- def _tidy(data, **kwargs):
- nerrors, nwarnings, data, errordata = _mxtidy.tidy(data, **kwargs)
- return data
- break
- except:
- pass
- if _tidy:
- utf8 = type(data) == type(u'')
- if utf8:
- data = data.encode('utf-8')
- data = _tidy(data, output_xhtml=1, numeric_entities=1, wrap=0, char_encoding="utf8")
- if utf8:
- data = unicode(data, 'utf-8')
- if data.count('<body'):
- data = data.split('<body', 1)[1]
- if data.count('>'):
- data = data.split('>', 1)[1]
- if data.count('</body'):
- data = data.split('</body', 1)[0]
- data = data.strip().replace('\r\n', '\n')
- return data
-
-class _FeedURLHandler(urllib2.HTTPDigestAuthHandler, urllib2.HTTPRedirectHandler, urllib2.HTTPDefaultErrorHandler):
- def http_error_default(self, req, fp, code, msg, headers):
- if ((code / 100) == 3) and (code != 304):
- return self.http_error_302(req, fp, code, msg, headers)
- infourl = urllib.addinfourl(fp, headers, req.get_full_url())
- infourl.status = code
- return infourl
-
- def http_error_302(self, req, fp, code, msg, headers):
- if headers.dict.has_key('location'):
- infourl = urllib2.HTTPRedirectHandler.http_error_302(self, req, fp, code, msg, headers)
- else:
- infourl = urllib.addinfourl(fp, headers, req.get_full_url())
- if not hasattr(infourl, 'status'):
- infourl.status = code
- return infourl
-
- def http_error_301(self, req, fp, code, msg, headers):
- if headers.dict.has_key('location'):
- infourl = urllib2.HTTPRedirectHandler.http_error_301(self, req, fp, code, msg, headers)
- else:
- infourl = urllib.addinfourl(fp, headers, req.get_full_url())
- if not hasattr(infourl, 'status'):
- infourl.status = code
- return infourl
-
- http_error_300 = http_error_302
- http_error_303 = http_error_302
- http_error_307 = http_error_302
-
- def http_error_401(self, req, fp, code, msg, headers):
- # Check if
- # - server requires digest auth, AND
- # - we tried (unsuccessfully) with basic auth, AND
- # - we're using Python 2.3.3 or later (digest auth is irreparably broken in earlier versions)
- # If all conditions hold, parse authentication information
- # out of the Authorization header we sent the first time
- # (for the username and password) and the WWW-Authenticate
- # header the server sent back (for the realm) and retry
- # the request with the appropriate digest auth headers instead.
- # This evil genius hack has been brought to you by Aaron Swartz.
- host = urlparse.urlparse(req.get_full_url())[1]
- try:
- assert sys.version.split()[0] >= '2.3.3'
- assert base64 != None
- user, passw = base64.decodestring(req.headers['Authorization'].split(' ')[1]).split(':')
- realm = re.findall('realm="([^"]*)"', headers['WWW-Authenticate'])[0]
- self.add_password(realm, host, user, passw)
- retry = self.http_error_auth_reqed('www-authenticate', host, req, headers)
- self.reset_retry_count()
- return retry
- except:
- return self.http_error_default(req, fp, code, msg, headers)
-
-def _open_resource(url_file_stream_or_string, etag, modified, agent, referrer, handlers):
- """URL, filename, or string --> stream
-
- This function lets you define parsers that take any input source
- (URL, pathname to local or network file, or actual data as a string)
- and deal with it in a uniform manner. Returned object is guaranteed
- to have all the basic stdio read methods (read, readline, readlines).
- Just .close() the object when you're done with it.
-
- If the etag argument is supplied, it will be used as the value of an
- If-None-Match request header.
-
- If the modified argument is supplied, it can be a tuple of 9 integers
- (as returned by gmtime() in the standard Python time module) or a date
- string in any format supported by feedparser. Regardless, it MUST
- be in GMT (Greenwich Mean Time). It will be reformatted into an
- RFC 1123-compliant date and used as the value of an If-Modified-Since
- request header.
-
- If the agent argument is supplied, it will be used as the value of a
- User-Agent request header.
-
- If the referrer argument is supplied, it will be used as the value of a
- Referer[sic] request header.
-
- If handlers is supplied, it is a list of handlers used to build a
- urllib2 opener.
- """
-
- if hasattr(url_file_stream_or_string, 'read'):
- return url_file_stream_or_string
-
- if url_file_stream_or_string == '-':
- return sys.stdin
-
- if urlparse.urlparse(url_file_stream_or_string)[0] in ('http', 'https', 'ftp'):
- if not agent:
- agent = USER_AGENT
- # test for inline user:password for basic auth
- auth = None
- if base64:
- urltype, rest = urllib.splittype(url_file_stream_or_string)
- realhost, rest = urllib.splithost(rest)
- if realhost:
- user_passwd, realhost = urllib.splituser(realhost)
- if user_passwd:
- url_file_stream_or_string = '%s://%s%s' % (urltype, realhost, rest)
- auth = base64.encodestring(user_passwd).strip()
-
- # iri support
- try:
- if isinstance(url_file_stream_or_string,unicode):
- url_file_stream_or_string = url_file_stream_or_string.encode('idna')
- else:
- url_file_stream_or_string = url_file_stream_or_string.decode('utf-8').encode('idna')
- except:
- pass
-
- # try to open with urllib2 (to use optional headers)
- request = urllib2.Request(url_file_stream_or_string)
- request.add_header('User-Agent', agent)
- if etag:
- request.add_header('If-None-Match', etag)
- if type(modified) == type(''):
- modified = _parse_date(modified)
- if modified:
- # format into an RFC 1123-compliant timestamp. We can't use
- # time.strftime() since the %a and %b directives can be affected
- # by the current locale, but RFC 2616 states that dates must be
- # in English.
- short_weekdays = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
- months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
- request.add_header('If-Modified-Since', '%s, %02d %s %04d %02d:%02d:%02d GMT' % (short_weekdays[modified[6]], modified[2], months[modified[1] - 1], modified[0], modified[3], modified[4], modified[5]))
- if referrer:
- request.add_header('Referer', referrer)
- if gzip and zlib:
- request.add_header('Accept-encoding', 'gzip, deflate')
- elif gzip:
- request.add_header('Accept-encoding', 'gzip')
- elif zlib:
- request.add_header('Accept-encoding', 'deflate')
- else:
- request.add_header('Accept-encoding', '')
- if auth:
- request.add_header('Authorization', 'Basic %s' % auth)
- if ACCEPT_HEADER:
- request.add_header('Accept', ACCEPT_HEADER)
- request.add_header('A-IM', 'feed') # RFC 3229 support
- opener = apply(urllib2.build_opener, tuple([_FeedURLHandler()] + handlers))
- opener.addheaders = [] # RMK - must clear so we only send our custom User-Agent
- try:
- return opener.open(request)
- finally:
- opener.close() # JohnD
-
- # try to open with native open function (if url_file_stream_or_string is a filename)
- try:
- return open(url_file_stream_or_string)
- except:
- pass
-
- # treat url_file_stream_or_string as string
- return _StringIO(str(url_file_stream_or_string))
-
-_date_handlers = []
-def registerDateHandler(func):
- '''Register a date handler function (takes string, returns 9-tuple date in GMT)'''
- _date_handlers.insert(0, func)
-
-# ISO-8601 date parsing routines written by Fazal Majid.
-# The ISO 8601 standard is very convoluted and irregular - a full ISO 8601
-# parser is beyond the scope of feedparser and would be a worthwhile addition
-# to the Python library.
-# A single regular expression cannot parse ISO 8601 date formats into groups
-# as the standard is highly irregular (for instance is 030104 2003-01-04 or
-# 0301-04-01), so we use templates instead.
-# Please note the order in templates is significant because we need a
-# greedy match.
-_iso8601_tmpl = ['YYYY-?MM-?DD', 'YYYY-0MM?-?DD', 'YYYY-MM', 'YYYY-?OOO',
- 'YY-?MM-?DD', 'YY-?OOO', 'YYYY',
- '-YY-?MM', '-OOO', '-YY',
- '--MM-?DD', '--MM',
- '---DD',
- 'CC', '']
-_iso8601_re = [
- tmpl.replace(
- 'YYYY', r'(?P<year>\d{4})').replace(
- 'YY', r'(?P<year>\d\d)').replace(
- 'MM', r'(?P<month>[01]\d)').replace(
- 'DD', r'(?P<day>[0123]\d)').replace(
- 'OOO', r'(?P<ordinal>[0123]\d\d)').replace(
- 'CC', r'(?P<century>\d\d$)')
- + r'(T?(?P<hour>\d{2}):(?P<minute>\d{2})'
- + r'(:(?P<second>\d{2}(\.\d*)?))?'
- + r'(?P<tz>[+-](?P<tzhour>\d{2})(:(?P<tzmin>\d{2}))?|Z)?)?'
- for tmpl in _iso8601_tmpl]
-del tmpl
-_iso8601_matches = [re.compile(regex).match for regex in _iso8601_re]
-del regex
-def _parse_date_iso8601(dateString):
- '''Parse a variety of ISO-8601-compatible formats like 20040105'''
- m = None
- for _iso8601_match in _iso8601_matches:
- m = _iso8601_match(dateString)
- if m: break
- if not m: return
- if m.span() == (0, 0): return
- params = m.groupdict()
- ordinal = params.get('ordinal', 0)
- if ordinal:
- ordinal = int(ordinal)
- else:
- ordinal = 0
- year = params.get('year', '--')
- if not year or year == '--':
- year = time.gmtime()[0]
- elif len(year) == 2:
- # ISO 8601 assumes current century, i.e. 93 -> 2093, NOT 1993
- year = 100 * int(time.gmtime()[0] / 100) + int(year)
- else:
- year = int(year)
- month = params.get('month', '-')
- if not month or month == '-':
- # ordinals are NOT normalized by mktime, we simulate them
- # by setting month=1, day=ordinal
- if ordinal:
- month = 1
- else:
- month = time.gmtime()[1]
- month = int(month)
- day = params.get('day', 0)
- if not day:
- # see above
- if ordinal:
- day = ordinal
- elif params.get('century', 0) or \
- params.get('year', 0) or params.get('month', 0):
- day = 1
- else:
- day = time.gmtime()[2]
- else:
- day = int(day)
- # special case of the century - is the first year of the 21st century
- # 2000 or 2001 ? The debate goes on...
- if 'century' in params.keys():
- year = (int(params['century']) - 1) * 100 + 1
- # in ISO 8601 most fields are optional
- for field in ['hour', 'minute', 'second', 'tzhour', 'tzmin']:
- if not params.get(field, None):
- params[field] = 0
- hour = int(params.get('hour', 0))
- minute = int(params.get('minute', 0))
- second = int(float(params.get('second', 0)))
- # weekday is normalized by mktime(), we can ignore it
- weekday = 0
- daylight_savings_flag = -1
- tm = [year, month, day, hour, minute, second, weekday,
- ordinal, daylight_savings_flag]
- # ISO 8601 time zone adjustments
- tz = params.get('tz')
- if tz and tz != 'Z':
- if tz[0] == '-':
- tm[3] += int(params.get('tzhour', 0))
- tm[4] += int(params.get('tzmin', 0))
- elif tz[0] == '+':
- tm[3] -= int(params.get('tzhour', 0))
- tm[4] -= int(params.get('tzmin', 0))
- else:
- return None
- # Python's time.mktime() is a wrapper around the ANSI C mktime(3c)
- # which is guaranteed to normalize d/m/y/h/m/s.
- # Many implementations have bugs, but we'll pretend they don't.
- return time.localtime(time.mktime(tm))
-registerDateHandler(_parse_date_iso8601)
-
-# 8-bit date handling routines written by ytrewq1.
-_korean_year = u'\ub144' # b3e2 in euc-kr
-_korean_month = u'\uc6d4' # bff9 in euc-kr
-_korean_day = u'\uc77c' # c0cf in euc-kr
-_korean_am = u'\uc624\uc804' # bfc0 c0fc in euc-kr
-_korean_pm = u'\uc624\ud6c4' # bfc0 c8c4 in euc-kr
-
-_korean_onblog_date_re = \
- re.compile('(\d{4})%s\s+(\d{2})%s\s+(\d{2})%s\s+(\d{2}):(\d{2}):(\d{2})' % \
- (_korean_year, _korean_month, _korean_day))
-_korean_nate_date_re = \
- re.compile(u'(\d{4})-(\d{2})-(\d{2})\s+(%s|%s)\s+(\d{,2}):(\d{,2}):(\d{,2})' % \
- (_korean_am, _korean_pm))
-def _parse_date_onblog(dateString):
- '''Parse a string according to the OnBlog 8-bit date format'''
- m = _korean_onblog_date_re.match(dateString)
- if not m: return
- w3dtfdate = '%(year)s-%(month)s-%(day)sT%(hour)s:%(minute)s:%(second)s%(zonediff)s' % \
- {'year': m.group(1), 'month': m.group(2), 'day': m.group(3),\
- 'hour': m.group(4), 'minute': m.group(5), 'second': m.group(6),\
- 'zonediff': '+09:00'}
- if _debug: sys.stderr.write('OnBlog date parsed as: %s\n' % w3dtfdate)
- return _parse_date_w3dtf(w3dtfdate)
-registerDateHandler(_parse_date_onblog)
-
-def _parse_date_nate(dateString):
- '''Parse a string according to the Nate 8-bit date format'''
- m = _korean_nate_date_re.match(dateString)
- if not m: return
- hour = int(m.group(5))
- ampm = m.group(4)
- if (ampm == _korean_pm):
- hour += 12
- hour = str(hour)
- if len(hour) == 1:
- hour = '0' + hour
- w3dtfdate = '%(year)s-%(month)s-%(day)sT%(hour)s:%(minute)s:%(second)s%(zonediff)s' % \
- {'year': m.group(1), 'month': m.group(2), 'day': m.group(3),\
- 'hour': hour, 'minute': m.group(6), 'second': m.group(7),\
- 'zonediff': '+09:00'}
- if _debug: sys.stderr.write('Nate date parsed as: %s\n' % w3dtfdate)
- return _parse_date_w3dtf(w3dtfdate)
-registerDateHandler(_parse_date_nate)
-
-_mssql_date_re = \
- re.compile('(\d{4})-(\d{2})-(\d{2})\s+(\d{2}):(\d{2}):(\d{2})(\.\d+)?')
-def _parse_date_mssql(dateString):
- '''Parse a string according to the MS SQL date format'''
- m = _mssql_date_re.match(dateString)
- if not m: return
- w3dtfdate = '%(year)s-%(month)s-%(day)sT%(hour)s:%(minute)s:%(second)s%(zonediff)s' % \
- {'year': m.group(1), 'month': m.group(2), 'day': m.group(3),\
- 'hour': m.group(4), 'minute': m.group(5), 'second': m.group(6),\
- 'zonediff': '+09:00'}
- if _debug: sys.stderr.write('MS SQL date parsed as: %s\n' % w3dtfdate)
- return _parse_date_w3dtf(w3dtfdate)
-registerDateHandler(_parse_date_mssql)
-
-# Unicode strings for Greek date strings
-_greek_months = \
- { \
- u'\u0399\u03b1\u03bd': u'Jan', # c9e1ed in iso-8859-7
- u'\u03a6\u03b5\u03b2': u'Feb', # d6e5e2 in iso-8859-7
- u'\u039c\u03ac\u03ce': u'Mar', # ccdcfe in iso-8859-7
- u'\u039c\u03b1\u03ce': u'Mar', # cce1fe in iso-8859-7
- u'\u0391\u03c0\u03c1': u'Apr', # c1f0f1 in iso-8859-7
- u'\u039c\u03ac\u03b9': u'May', # ccdce9 in iso-8859-7
- u'\u039c\u03b1\u03ca': u'May', # cce1fa in iso-8859-7
- u'\u039c\u03b1\u03b9': u'May', # cce1e9 in iso-8859-7
- u'\u0399\u03bf\u03cd\u03bd': u'Jun', # c9effded in iso-8859-7
- u'\u0399\u03bf\u03bd': u'Jun', # c9efed in iso-8859-7
- u'\u0399\u03bf\u03cd\u03bb': u'Jul', # c9effdeb in iso-8859-7
- u'\u0399\u03bf\u03bb': u'Jul', # c9f9eb in iso-8859-7
- u'\u0391\u03cd\u03b3': u'Aug', # c1fde3 in iso-8859-7
- u'\u0391\u03c5\u03b3': u'Aug', # c1f5e3 in iso-8859-7
- u'\u03a3\u03b5\u03c0': u'Sep', # d3e5f0 in iso-8859-7
- u'\u039f\u03ba\u03c4': u'Oct', # cfeaf4 in iso-8859-7
- u'\u039d\u03bf\u03ad': u'Nov', # cdefdd in iso-8859-7
- u'\u039d\u03bf\u03b5': u'Nov', # cdefe5 in iso-8859-7
- u'\u0394\u03b5\u03ba': u'Dec', # c4e5ea in iso-8859-7
- }
-
-_greek_wdays = \
- { \
- u'\u039a\u03c5\u03c1': u'Sun', # caf5f1 in iso-8859-7
- u'\u0394\u03b5\u03c5': u'Mon', # c4e5f5 in iso-8859-7
- u'\u03a4\u03c1\u03b9': u'Tue', # d4f1e9 in iso-8859-7
- u'\u03a4\u03b5\u03c4': u'Wed', # d4e5f4 in iso-8859-7
- u'\u03a0\u03b5\u03bc': u'Thu', # d0e5ec in iso-8859-7
- u'\u03a0\u03b1\u03c1': u'Fri', # d0e1f1 in iso-8859-7
- u'\u03a3\u03b1\u03b2': u'Sat', # d3e1e2 in iso-8859-7
- }
-
-_greek_date_format_re = \
- re.compile(u'([^,]+),\s+(\d{2})\s+([^\s]+)\s+(\d{4})\s+(\d{2}):(\d{2}):(\d{2})\s+([^\s]+)')
-
-def _parse_date_greek(dateString):
- '''Parse a string according to a Greek 8-bit date format.'''
- m = _greek_date_format_re.match(dateString)
- if not m: return
- try:
- wday = _greek_wdays[m.group(1)]
- month = _greek_months[m.group(3)]
- except:
- return
- rfc822date = '%(wday)s, %(day)s %(month)s %(year)s %(hour)s:%(minute)s:%(second)s %(zonediff)s' % \
- {'wday': wday, 'day': m.group(2), 'month': month, 'year': m.group(4),\
- 'hour': m.group(5), 'minute': m.group(6), 'second': m.group(7),\
- 'zonediff': m.group(8)}
- if _debug: sys.stderr.write('Greek date parsed as: %s\n' % rfc822date)
- return _parse_date_rfc822(rfc822date)
-registerDateHandler(_parse_date_greek)
-
-# Unicode strings for Hungarian date strings
-_hungarian_months = \
- { \
- u'janu\u00e1r': u'01', # e1 in iso-8859-2
- u'febru\u00e1ri': u'02', # e1 in iso-8859-2
- u'm\u00e1rcius': u'03', # e1 in iso-8859-2
- u'\u00e1prilis': u'04', # e1 in iso-8859-2
- u'm\u00e1ujus': u'05', # e1 in iso-8859-2
- u'j\u00fanius': u'06', # fa in iso-8859-2
- u'j\u00falius': u'07', # fa in iso-8859-2
- u'augusztus': u'08',
- u'szeptember': u'09',
- u'okt\u00f3ber': u'10', # f3 in iso-8859-2
- u'november': u'11',
- u'december': u'12',
- }
-
-_hungarian_date_format_re = \
- re.compile(u'(\d{4})-([^-]+)-(\d{,2})T(\d{,2}):(\d{2})((\+|-)(\d{,2}:\d{2}))')
-
-def _parse_date_hungarian(dateString):
- '''Parse a string according to a Hungarian 8-bit date format.'''
- m = _hungarian_date_format_re.match(dateString)
- if not m: return
- try:
- month = _hungarian_months[m.group(2)]
- day = m.group(3)
- if len(day) == 1:
- day = '0' + day
- hour = m.group(4)
- if len(hour) == 1:
- hour = '0' + hour
- except:
- return
- w3dtfdate = '%(year)s-%(month)s-%(day)sT%(hour)s:%(minute)s%(zonediff)s' % \
- {'year': m.group(1), 'month': month, 'day': day,\
- 'hour': hour, 'minute': m.group(5),\
- 'zonediff': m.group(6)}
- if _debug: sys.stderr.write('Hungarian date parsed as: %s\n' % w3dtfdate)
- return _parse_date_w3dtf(w3dtfdate)
-registerDateHandler(_parse_date_hungarian)
-
-# W3DTF-style date parsing adapted from PyXML xml.utils.iso8601, written by
-# Drake and licensed under the Python license. Removed all range checking
-# for month, day, hour, minute, and second, since mktime will normalize
-# these later
-def _parse_date_w3dtf(dateString):
- def __extract_date(m):
- year = int(m.group('year'))
- if year < 100:
- year = 100 * int(time.gmtime()[0] / 100) + int(year)
- if year < 1000:
- return 0, 0, 0
- julian = m.group('julian')
- if julian:
- julian = int(julian)
- month = julian / 30 + 1
- day = julian % 30 + 1
- jday = None
- while jday != julian:
- t = time.mktime((year, month, day, 0, 0, 0, 0, 0, 0))
- jday = time.gmtime(t)[-2]
- diff = abs(jday - julian)
- if jday > julian:
- if diff < day:
- day = day - diff
- else:
- month = month - 1
- day = 31
- elif jday < julian:
- if day + diff < 28:
- day = day + diff
- else:
- month = month + 1
- return year, month, day
- month = m.group('month')
- day = 1
- if month is None:
- month = 1
- else:
- month = int(month)
- day = m.group('day')
- if day:
- day = int(day)
- else:
- day = 1
- return year, month, day
-
- def __extract_time(m):
- if not m:
- return 0, 0, 0
- hours = m.group('hours')
- if not hours:
- return 0, 0, 0
- hours = int(hours)
- minutes = int(m.group('minutes'))
- seconds = m.group('seconds')
- if seconds:
- seconds = int(seconds)
- else:
- seconds = 0
- return hours, minutes, seconds
-
- def __extract_tzd(m):
- '''Return the Time Zone Designator as an offset in seconds from UTC.'''
- if not m:
- return 0
- tzd = m.group('tzd')
- if not tzd:
- return 0
- if tzd == 'Z':
- return 0
- hours = int(m.group('tzdhours'))
- minutes = m.group('tzdminutes')
- if minutes:
- minutes = int(minutes)
- else:
- minutes = 0
- offset = (hours*60 + minutes) * 60
- if tzd[0] == '+':
- return -offset
- return offset
-
- __date_re = ('(?P<year>\d\d\d\d)'
- '(?:(?P<dsep>-|)'
- '(?:(?P<julian>\d\d\d)'
- '|(?P<month>\d\d)(?:(?P=dsep)(?P<day>\d\d))?))?')
- __tzd_re = '(?P<tzd>[-+](?P<tzdhours>\d\d)(?::?(?P<tzdminutes>\d\d))|Z)'
- __tzd_rx = re.compile(__tzd_re)
- __time_re = ('(?P<hours>\d\d)(?P<tsep>:|)(?P<minutes>\d\d)'
- '(?:(?P=tsep)(?P<seconds>\d\d(?:[.,]\d+)?))?'
- + __tzd_re)
- __datetime_re = '%s(?:T%s)?' % (__date_re, __time_re)
- __datetime_rx = re.compile(__datetime_re)
- m = __datetime_rx.match(dateString)
- if (m is None) or (m.group() != dateString): return
- gmt = __extract_date(m) + __extract_time(m) + (0, 0, 0)
- if gmt[0] == 0: return
- return time.gmtime(time.mktime(gmt) + __extract_tzd(m) - time.timezone)
-registerDateHandler(_parse_date_w3dtf)
-
-def _parse_date_rfc822(dateString):
- '''Parse an RFC822, RFC1123, RFC2822, or asctime-style date'''
- data = dateString.split()
- if data[0][-1] in (',', '.') or data[0].lower() in rfc822._daynames:
- del data[0]
- if len(data) == 4:
- s = data[3]
- i = s.find('+')
- if i > 0:
- data[3:] = [s[:i], s[i+1:]]
- else:
- data.append('')
- dateString = " ".join(data)
- if len(data) < 5:
- dateString += ' 00:00:00 GMT'
- tm = rfc822.parsedate_tz(dateString)
- if tm:
- return time.gmtime(rfc822.mktime_tz(tm))
-# rfc822.py defines several time zones, but we define some extra ones.
-# 'ET' is equivalent to 'EST', etc.
-_additional_timezones = {'AT': -400, 'ET': -500, 'CT': -600, 'MT': -700, 'PT': -800}
-rfc822._timezones.update(_additional_timezones)
-registerDateHandler(_parse_date_rfc822)
-
-def _parse_date_perforce(aDateString):
- """parse a date in yyyy/mm/dd hh:mm:ss TTT format"""
- # Fri, 2006/09/15 08:19:53 EDT
- _my_date_pattern = re.compile( \
- r'(\w{,3}), (\d{,4})/(\d{,2})/(\d{2}) (\d{,2}):(\d{2}):(\d{2}) (\w{,3})')
-
- dow, year, month, day, hour, minute, second, tz = \
- _my_date_pattern.search(aDateString).groups()
- months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
- dateString = "%s, %s %s %s %s:%s:%s %s" % (dow, day, months[int(month) - 1], year, hour, minute, second, tz)
- tm = rfc822.parsedate_tz(dateString)
- if tm:
- return time.gmtime(rfc822.mktime_tz(tm))
-registerDateHandler(_parse_date_perforce)
-
-def _parse_date(dateString):
- '''Parses a variety of date formats into a 9-tuple in GMT'''
- for handler in _date_handlers:
- try:
- date9tuple = handler(dateString)
- if not date9tuple: continue
- if len(date9tuple) != 9:
- if _debug: sys.stderr.write('date handler function must return 9-tuple\n')
- raise ValueError
- map(int, date9tuple)
- return date9tuple
- except Exception, e:
- if _debug: sys.stderr.write('%s raised %s\n' % (handler.__name__, repr(e)))
- pass
- return None
-
-def _getCharacterEncoding(http_headers, xml_data):
- '''Get the character encoding of the XML document
-
- http_headers is a dictionary
- xml_data is a raw string (not Unicode)
-
- This is so much trickier than it sounds, it's not even funny.
- According to RFC 3023 ('XML Media Types'), if the HTTP Content-Type
- is application/xml, application/*+xml,
- application/xml-external-parsed-entity, or application/xml-dtd,
- the encoding given in the charset parameter of the HTTP Content-Type
- takes precedence over the encoding given in the XML prefix within the
- document, and defaults to 'utf-8' if neither are specified. But, if
- the HTTP Content-Type is text/xml, text/*+xml, or
- text/xml-external-parsed-entity, the encoding given in the XML prefix
- within the document is ALWAYS IGNORED and only the encoding given in
- the charset parameter of the HTTP Content-Type header should be
- respected, and it defaults to 'us-ascii' if not specified.
-
- Furthermore, discussion on the atom-syntax mailing list with the
- author of RFC 3023 leads me to the conclusion that any document
- served with a Content-Type of text/* and no charset parameter
- must be treated as us-ascii. (We now do this.) And also that it
- must always be flagged as non-well-formed. (We now do this too.)
-
- If Content-Type is unspecified (input was local file or non-HTTP source)
- or unrecognized (server just got it totally wrong), then go by the
- encoding given in the XML prefix of the document and default to
- 'iso-8859-1' as per the HTTP specification (RFC 2616).
-
- Then, assuming we didn't find a character encoding in the HTTP headers
- (and the HTTP Content-type allowed us to look in the body), we need
- to sniff the first few bytes of the XML data and try to determine
- whether the encoding is ASCII-compatible. Section F of the XML
- specification shows the way here:
- http://www.w3.org/TR/REC-xml/#sec-guessing-no-ext-info
-
- If the sniffed encoding is not ASCII-compatible, we need to make it
- ASCII compatible so that we can sniff further into the XML declaration
- to find the encoding attribute, which will tell us the true encoding.
-
- Of course, none of this guarantees that we will be able to parse the
- feed in the declared character encoding (assuming it was declared
- correctly, which many are not). CJKCodecs and iconv_codec help a lot;
- you should definitely install them if you can.
- http://cjkpython.i18n.org/
- '''
-
- def _parseHTTPContentType(content_type):
- '''takes HTTP Content-Type header and returns (content type, charset)
-
- If no charset is specified, returns (content type, '')
- If no content type is specified, returns ('', '')
- Both return parameters are guaranteed to be lowercase strings
- '''
- content_type = content_type or ''
- content_type, params = cgi.parse_header(content_type)
- return content_type, params.get('charset', '').replace("'", '')
-
- sniffed_xml_encoding = ''
- xml_encoding = ''
- true_encoding = ''
- http_content_type, http_encoding = _parseHTTPContentType(http_headers.get('content-type'))
- # Must sniff for non-ASCII-compatible character encodings before
- # searching for XML declaration. This heuristic is defined in
- # section F of the XML specification:
- # http://www.w3.org/TR/REC-xml/#sec-guessing-no-ext-info
- try:
- if xml_data[:4] == '\x4c\x6f\xa7\x94':
- # EBCDIC
- xml_data = _ebcdic_to_ascii(xml_data)
- elif xml_data[:4] == '\x00\x3c\x00\x3f':
- # UTF-16BE
- sniffed_xml_encoding = 'utf-16be'
- xml_data = unicode(xml_data, 'utf-16be').encode('utf-8')
- elif (len(xml_data) >= 4) and (xml_data[:2] == '\xfe\xff') and (xml_data[2:4] != '\x00\x00'):
- # UTF-16BE with BOM
- sniffed_xml_encoding = 'utf-16be'
- xml_data = unicode(xml_data[2:], 'utf-16be').encode('utf-8')
- elif xml_data[:4] == '\x3c\x00\x3f\x00':
- # UTF-16LE
- sniffed_xml_encoding = 'utf-16le'
- xml_data = unicode(xml_data, 'utf-16le').encode('utf-8')
- elif (len(xml_data) >= 4) and (xml_data[:2] == '\xff\xfe') and (xml_data[2:4] != '\x00\x00'):
- # UTF-16LE with BOM
- sniffed_xml_encoding = 'utf-16le'
- xml_data = unicode(xml_data[2:], 'utf-16le').encode('utf-8')
- elif xml_data[:4] == '\x00\x00\x00\x3c':
- # UTF-32BE
- sniffed_xml_encoding = 'utf-32be'
- xml_data = unicode(xml_data, 'utf-32be').encode('utf-8')
- elif xml_data[:4] == '\x3c\x00\x00\x00':
- # UTF-32LE
- sniffed_xml_encoding = 'utf-32le'
- xml_data = unicode(xml_data, 'utf-32le').encode('utf-8')
- elif xml_data[:4] == '\x00\x00\xfe\xff':
- # UTF-32BE with BOM
- sniffed_xml_encoding = 'utf-32be'
- xml_data = unicode(xml_data[4:], 'utf-32be').encode('utf-8')
- elif xml_data[:4] == '\xff\xfe\x00\x00':
- # UTF-32LE with BOM
- sniffed_xml_encoding = 'utf-32le'
- xml_data = unicode(xml_data[4:], 'utf-32le').encode('utf-8')
- elif xml_data[:3] == '\xef\xbb\xbf':
- # UTF-8 with BOM
- sniffed_xml_encoding = 'utf-8'
- xml_data = unicode(xml_data[3:], 'utf-8').encode('utf-8')
- else:
- # ASCII-compatible
- pass
- xml_encoding_match = re.compile('^<\?.*encoding=[\'"](.*?)[\'"].*\?>').match(xml_data)
- except:
- xml_encoding_match = None
- if xml_encoding_match:
- xml_encoding = xml_encoding_match.groups()[0].lower()
- if sniffed_xml_encoding and (xml_encoding in ('iso-10646-ucs-2', 'ucs-2', 'csunicode', 'iso-10646-ucs-4', 'ucs-4', 'csucs4', 'utf-16', 'utf-32', 'utf_16', 'utf_32', 'utf16', 'u16')):
- xml_encoding = sniffed_xml_encoding
- acceptable_content_type = 0
- application_content_types = ('application/xml', 'application/xml-dtd', 'application/xml-external-parsed-entity')
- text_content_types = ('text/xml', 'text/xml-external-parsed-entity')
- if (http_content_type in application_content_types) or \
- (http_content_type.startswith('application/') and http_content_type.endswith('+xml')):
- acceptable_content_type = 1
- true_encoding = http_encoding or xml_encoding or 'utf-8'
- elif (http_content_type in text_content_types) or \
- (http_content_type.startswith('text/')) and http_content_type.endswith('+xml'):
- acceptable_content_type = 1
- true_encoding = http_encoding or 'us-ascii'
- elif http_content_type.startswith('text/'):
- true_encoding = http_encoding or 'us-ascii'
- elif http_headers and (not http_headers.has_key('content-type')):
- true_encoding = xml_encoding or 'iso-8859-1'
- else:
- true_encoding = xml_encoding or 'utf-8'
- # some feeds claim to be gb2312 but are actually gb18030.
- # apparently MSIE and Firefox both do the following switch:
- if true_encoding.lower() == 'gb2312':
- true_encoding = 'gb18030'
- return true_encoding, http_encoding, xml_encoding, sniffed_xml_encoding, acceptable_content_type
-
-def _toUTF8(data, encoding):
- '''Changes an XML data stream on the fly to specify a new encoding
-
- data is a raw sequence of bytes (not Unicode) that is presumed to be in %encoding already
- encoding is a string recognized by encodings.aliases
- '''
- if _debug: sys.stderr.write('entering _toUTF8, trying encoding %s\n' % encoding)
- # strip Byte Order Mark (if present)
- if (len(data) >= 4) and (data[:2] == '\xfe\xff') and (data[2:4] != '\x00\x00'):
- if _debug:
- sys.stderr.write('stripping BOM\n')
- if encoding != 'utf-16be':
- sys.stderr.write('trying utf-16be instead\n')
- encoding = 'utf-16be'
- data = data[2:]
- elif (len(data) >= 4) and (data[:2] == '\xff\xfe') and (data[2:4] != '\x00\x00'):
- if _debug:
- sys.stderr.write('stripping BOM\n')
- if encoding != 'utf-16le':
- sys.stderr.write('trying utf-16le instead\n')
- encoding = 'utf-16le'
- data = data[2:]
- elif data[:3] == '\xef\xbb\xbf':
- if _debug:
- sys.stderr.write('stripping BOM\n')
- if encoding != 'utf-8':
- sys.stderr.write('trying utf-8 instead\n')
- encoding = 'utf-8'
- data = data[3:]
- elif data[:4] == '\x00\x00\xfe\xff':
- if _debug:
- sys.stderr.write('stripping BOM\n')
- if encoding != 'utf-32be':
- sys.stderr.write('trying utf-32be instead\n')
- encoding = 'utf-32be'
- data = data[4:]
- elif data[:4] == '\xff\xfe\x00\x00':
- if _debug:
- sys.stderr.write('stripping BOM\n')
- if encoding != 'utf-32le':
- sys.stderr.write('trying utf-32le instead\n')
- encoding = 'utf-32le'
- data = data[4:]
- newdata = unicode(data, encoding)
- if _debug: sys.stderr.write('successfully converted %s data to unicode\n' % encoding)
- declmatch = re.compile('^<\?xml[^>]*?>')
- newdecl = '''<?xml version='1.0' encoding='utf-8'?>'''
- if declmatch.search(newdata):
- newdata = declmatch.sub(newdecl, newdata)
- else:
- newdata = newdecl + u'\n' + newdata
- return newdata.encode('utf-8')
-
-def _stripDoctype(data):
- '''Strips DOCTYPE from XML document, returns (rss_version, stripped_data)
-
- rss_version may be 'rss091n' or None
- stripped_data is the same XML document, minus the DOCTYPE
- '''
- start = re.search('<\w',data)
- start = start and start.start() or -1
- head,data = data[:start+1], data[start+1:]
-
- entity_pattern = re.compile(r'^\s*<!ENTITY([^>]*?)>', re.MULTILINE)
- entity_results=entity_pattern.findall(head)
- head = entity_pattern.sub('', head)
- doctype_pattern = re.compile(r'^\s*<!DOCTYPE([^>]*?)>', re.MULTILINE)
- doctype_results = doctype_pattern.findall(head)
- doctype = doctype_results and doctype_results[0] or ''
- if doctype.lower().count('netscape'):
- version = 'rss091n'
- else:
- version = None
-
- # only allow in 'safe' inline entity definitions
- replacement=''
- if len(doctype_results)==1 and entity_results:
- safe_pattern=re.compile('\s+(\w+)\s+"(&#\w+;|[^&"]*)"')
- safe_entities=filter(lambda e: safe_pattern.match(e),entity_results)
- if safe_entities:
- replacement='<!DOCTYPE feed [\n <!ENTITY %s>\n]>' % '>\n <!ENTITY '.join(safe_entities)
- data = doctype_pattern.sub(replacement, head) + data
-
- return version, data, dict(replacement and safe_pattern.findall(replacement))
-
-def parse(url_file_stream_or_string, etag=None, modified=None, agent=None, referrer=None, handlers=[]):
- '''Parse a feed from a URL, file, stream, or string'''
- result = FeedParserDict()
- result['feed'] = FeedParserDict()
- result['entries'] = []
- if _XML_AVAILABLE:
- result['bozo'] = 0
- if type(handlers) == types.InstanceType:
- handlers = [handlers]
- try:
- f = _open_resource(url_file_stream_or_string, etag, modified, agent, referrer, handlers)
- data = f.read()
- except Exception, e:
- result['bozo'] = 1
- result['bozo_exception'] = e
- data = ''
- f = None
-
- # if feed is gzip-compressed, decompress it
- if f and data and hasattr(f, 'headers'):
- if gzip and f.headers.get('content-encoding', '') == 'gzip':
- try:
- data = gzip.GzipFile(fileobj=_StringIO(data)).read()
- except Exception, e:
- # Some feeds claim to be gzipped but they're not, so
- # we get garbage. Ideally, we should re-request the
- # feed without the 'Accept-encoding: gzip' header,
- # but we don't.
- result['bozo'] = 1
- result['bozo_exception'] = e
- data = ''
- elif zlib and f.headers.get('content-encoding', '') == 'deflate':
- try:
- data = zlib.decompress(data, -zlib.MAX_WBITS)
- except Exception, e:
- result['bozo'] = 1
- result['bozo_exception'] = e
- data = ''
-
- # save HTTP headers
- if hasattr(f, 'info'):
- info = f.info()
- etag = info.getheader('ETag')
- if etag:
- result['etag'] = etag
- last_modified = info.getheader('Last-Modified')
- if last_modified:
- result['modified'] = _parse_date(last_modified)
- if hasattr(f, 'url'):
- result['href'] = f.url
- result['status'] = 200
- if hasattr(f, 'status'):
- result['status'] = f.status
- if hasattr(f, 'headers'):
- result['headers'] = f.headers.dict
- if hasattr(f, 'close'):
- f.close()
-
- # there are four encodings to keep track of:
- # - http_encoding is the encoding declared in the Content-Type HTTP header
- # - xml_encoding is the encoding declared in the <?xml declaration
- # - sniffed_encoding is the encoding sniffed from the first 4 bytes of the XML data
- # - result['encoding'] is the actual encoding, as per RFC 3023 and a variety of other conflicting specifications
- http_headers = result.get('headers', {})
- result['encoding'], http_encoding, xml_encoding, sniffed_xml_encoding, acceptable_content_type = \
- _getCharacterEncoding(http_headers, data)
- if http_headers and (not acceptable_content_type):
- if http_headers.has_key('content-type'):
- bozo_message = '%s is not an XML media type' % http_headers['content-type']
- else:
- bozo_message = 'no Content-type specified'
- result['bozo'] = 1
- result['bozo_exception'] = NonXMLContentType(bozo_message)
-
- result['version'], data, entities = _stripDoctype(data)
-
- baseuri = http_headers.get('content-location', result.get('href'))
- baselang = http_headers.get('content-language', None)
-
- # if server sent 304, we're done
- if result.get('status', 0) == 304:
- result['version'] = ''
- result['debug_message'] = 'The feed has not changed since you last checked, ' + \
- 'so the server sent no data. This is a feature, not a bug!'
- return result
-
- # if there was a problem downloading, we're done
- if not data:
- return result
-
- # determine character encoding
- use_strict_parser = 0
- known_encoding = 0
- tried_encodings = []
- # try: HTTP encoding, declared XML encoding, encoding sniffed from BOM
- for proposed_encoding in (result['encoding'], xml_encoding, sniffed_xml_encoding):
- if not proposed_encoding: continue
- if proposed_encoding in tried_encodings: continue
- tried_encodings.append(proposed_encoding)
- try:
- data = _toUTF8(data, proposed_encoding)
- known_encoding = use_strict_parser = 1
- break
- except:
- pass
- # if no luck and we have auto-detection library, try that
- if (not known_encoding) and chardet:
- try:
- proposed_encoding = chardet.detect(data)['encoding']
- if proposed_encoding and (proposed_encoding not in tried_encodings):
- tried_encodings.append(proposed_encoding)
- data = _toUTF8(data, proposed_encoding)
- known_encoding = use_strict_parser = 1
- except:
- pass
- # if still no luck and we haven't tried utf-8 yet, try that
- if (not known_encoding) and ('utf-8' not in tried_encodings):
- try:
- proposed_encoding = 'utf-8'
- tried_encodings.append(proposed_encoding)
- data = _toUTF8(data, proposed_encoding)
- known_encoding = use_strict_parser = 1
- except:
- pass
- # if still no luck and we haven't tried windows-1252 yet, try that
- if (not known_encoding) and ('windows-1252' not in tried_encodings):
- try:
- proposed_encoding = 'windows-1252'
- tried_encodings.append(proposed_encoding)
- data = _toUTF8(data, proposed_encoding)
- known_encoding = use_strict_parser = 1
- except:
- pass
- # if still no luck and we haven't tried iso-8859-2 yet, try that.
- if (not known_encoding) and ('iso-8859-2' not in tried_encodings):
- try:
- proposed_encoding = 'iso-8859-2'
- tried_encodings.append(proposed_encoding)
- data = _toUTF8(data, proposed_encoding)
- known_encoding = use_strict_parser = 1
- except:
- pass
- # if still no luck, give up
- if not known_encoding:
- result['bozo'] = 1
- result['bozo_exception'] = CharacterEncodingUnknown( \
- 'document encoding unknown, I tried ' + \
- '%s, %s, utf-8, windows-1252, and iso-8859-2 but nothing worked' % \
- (result['encoding'], xml_encoding))
- result['encoding'] = ''
- elif proposed_encoding != result['encoding']:
- result['bozo'] = 1
- result['bozo_exception'] = CharacterEncodingOverride( \
- 'documented declared as %s, but parsed as %s' % \
- (result['encoding'], proposed_encoding))
- result['encoding'] = proposed_encoding
-
- if not _XML_AVAILABLE:
- use_strict_parser = 0
- if use_strict_parser:
- # initialize the SAX parser
- feedparser = _StrictFeedParser(baseuri, baselang, 'utf-8')
- saxparser = xml.sax.make_parser(PREFERRED_XML_PARSERS)
- saxparser.setFeature(xml.sax.handler.feature_namespaces, 1)
- saxparser.setContentHandler(feedparser)
- saxparser.setErrorHandler(feedparser)
- source = xml.sax.xmlreader.InputSource()
- source.setByteStream(_StringIO(data))
- if hasattr(saxparser, '_ns_stack'):
- # work around bug in built-in SAX parser (doesn't recognize xml: namespace)
- # PyXML doesn't have this problem, and it doesn't have _ns_stack either
- saxparser._ns_stack.append({'http://www.w3.org/XML/1998/namespace':'xml'})
- try:
- saxparser.parse(source)
- except Exception, e:
- if _debug:
- import traceback
- traceback.print_stack()
- traceback.print_exc()
- sys.stderr.write('xml parsing failed\n')
- result['bozo'] = 1
- result['bozo_exception'] = feedparser.exc or e
- use_strict_parser = 0
- if not use_strict_parser:
- feedparser = _LooseFeedParser(baseuri, baselang, known_encoding and 'utf-8' or '', entities)
- feedparser.feed(data)
- result['feed'] = feedparser.feeddata
- result['entries'] = feedparser.entries
- result['version'] = result['version'] or feedparser.version
- result['namespaces'] = feedparser.namespacesInUse
- return result
-
-class Serializer:
- def __init__(self, results):
- self.results = results
-
-class TextSerializer(Serializer):
- def write(self, stream=sys.stdout):
- self._writer(stream, self.results, '')
-
- def _writer(self, stream, node, prefix):
- if not node: return
- if hasattr(node, 'keys'):
- keys = node.keys()
- keys.sort()
- for k in keys:
- if k in ('description', 'link'): continue
- if node.has_key(k + '_detail'): continue
- if node.has_key(k + '_parsed'): continue
- self._writer(stream, node[k], prefix + k + '.')
- elif type(node) == types.ListType:
- index = 0
- for n in node:
- self._writer(stream, n, prefix[:-1] + '[' + str(index) + '].')
- index += 1
- else:
- try:
- s = str(node).encode('utf-8')
- s = s.replace('\\', '\\\\')
- s = s.replace('\r', '')
- s = s.replace('\n', r'\n')
- stream.write(prefix[:-1])
- stream.write('=')
- stream.write(s)
- stream.write('\n')
- except:
- pass
-
-class PprintSerializer(Serializer):
- def write(self, stream=sys.stdout):
- if self.results.has_key('href'):
- stream.write(self.results['href'] + '\n\n')
- from pprint import pprint
- pprint(self.results, stream)
- stream.write('\n')
-
-if __name__ == '__main__':
- try:
- from optparse import OptionParser
- except:
- OptionParser = None
-
- if OptionParser:
- optionParser = OptionParser(version=__version__, usage="%prog [options] url_or_filename_or_-")
- optionParser.set_defaults(format="pprint")
- optionParser.add_option("-A", "--user-agent", dest="agent", metavar="AGENT", help="User-Agent for HTTP URLs")
- optionParser.add_option("-e", "--referer", "--referrer", dest="referrer", metavar="URL", help="Referrer for HTTP URLs")
- optionParser.add_option("-t", "--etag", dest="etag", metavar="TAG", help="ETag/If-None-Match for HTTP URLs")
- optionParser.add_option("-m", "--last-modified", dest="modified", metavar="DATE", help="Last-modified/If-Modified-Since for HTTP URLs (any supported date format)")
- optionParser.add_option("-f", "--format", dest="format", metavar="FORMAT", help="output results in FORMAT (text, pprint)")
- optionParser.add_option("-v", "--verbose", action="store_true", dest="verbose", default=False, help="write debugging information to stderr")
- (options, urls) = optionParser.parse_args()
- if options.verbose:
- _debug = 1
- if not urls:
- optionParser.print_help()
- sys.exit(0)
- else:
- if not sys.argv[1:]:
- print __doc__
- sys.exit(0)
- class _Options:
- etag = modified = agent = referrer = None
- format = 'pprint'
- options = _Options()
- urls = sys.argv[1:]
-
- zopeCompatibilityHack()
-
- serializer = globals().get(options.format.capitalize() + 'Serializer', Serializer)
- for url in urls:
- results = parse(url, etag=options.etag, modified=options.modified, agent=options.agent, referrer=options.referrer)
- serializer(results).write(sys.stdout)
Copied: trunk/lib/venus/planet/vendor/feedparser.py (from rev 656, branches/sucs-site/lib/venus/planet/vendor/feedparser.py)
===================================================================
--- trunk/lib/venus/planet/vendor/feedparser.py (rev 0)
+++ trunk/lib/venus/planet/vendor/feedparser.py 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,3612 @@
+#!/usr/bin/env python
+"""Universal feed parser
+
+Handles RSS 0.9x, RSS 1.0, RSS 2.0, CDF, Atom 0.3, and Atom 1.0 feeds
+
+Visit http://feedparser.org/ for the latest version
+Visit http://feedparser.org/docs/ for the latest documentation
+
+Required: Python 2.1 or later
+Recommended: Python 2.3 or later
+Recommended: CJKCodecs and iconv_codec <http://cjkpython.i18n.org/>
+"""
+
+__version__ = "4.2-pre-" + "$Revision: 291 $"[11:14] + "-svn"
+__license__ = """Copyright (c) 2002-2008, Mark Pilgrim, All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS'
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE."""
+__author__ = "Mark Pilgrim <http://diveintomark.org/>"
+__contributors__ = ["Jason Diamond <http://injektilo.org/>",
+ "John Beimler <http://john.beimler.org/>",
+ "Fazal Majid <http://www.majid.info/mylos/weblog/>",
+ "Aaron Swartz <http://aaronsw.com/>",
+ "Kevin Marks <http://epeus.blogspot.com/>",
+ "Sam Ruby <http://intertwingly.net/>"]
+_debug = 0
+
+# HTTP "User-Agent" header to send to servers when downloading feeds.
+# If you are embedding feedparser in a larger application, you should
+# change this to your application name and URL.
+USER_AGENT = "UniversalFeedParser/%s +http://feedparser.org/" % __version__
+
+# HTTP "Accept" header to send to servers when downloading feeds. If you don't
+# want to send an Accept header, set this to None.
+ACCEPT_HEADER = "application/atom+xml,application/rdf+xml,application/rss+xml,application/x-netcdf,application/xml;q=0.9,text/xml;q=0.2,*/*;q=0.1"
+
+# List of preferred XML parsers, by SAX driver name. These will be tried first,
+# but if they're not installed, Python will keep searching through its own list
+# of pre-installed parsers until it finds one that supports everything we need.
+PREFERRED_XML_PARSERS = ["drv_libxml2"]
+
+# If you want feedparser to automatically run HTML markup through HTML Tidy, set
+# this to 1. Requires mxTidy <http://www.egenix.com/files/python/mxTidy.html>
+# or utidylib <http://utidylib.berlios.de/>.
+TIDY_MARKUP = 0
+
+# List of Python interfaces for HTML Tidy, in order of preference. Only useful
+# if TIDY_MARKUP = 1
+PREFERRED_TIDY_INTERFACES = ["uTidy", "mxTidy"]
+
+# If you want feedparser to automatically resolve all relative URIs, set this
+# to 1.
+RESOLVE_RELATIVE_URIS = 1
+
+# If you want feedparser to automatically sanitize all potentially unsafe
+# HTML content, set this to 1.
+SANITIZE_HTML = 1
+
+# ---------- required modules (should come with any Python distribution) ----------
+import sgmllib, re, sys, copy, urlparse, time, rfc822, types, cgi, urllib, urllib2
+try:
+ from cStringIO import StringIO as _StringIO
+except:
+ from StringIO import StringIO as _StringIO
+
+# ---------- optional modules (feedparser will work without these, but with reduced functionality) ----------
+
+# gzip is included with most Python distributions, but may not be available if you compiled your own
+try:
+ import gzip
+except:
+ gzip = None
+try:
+ import zlib
+except:
+ zlib = None
+
+# If a real XML parser is available, feedparser will attempt to use it. feedparser has
+# been tested with the built-in SAX parser, PyXML, and libxml2. On platforms where the
+# Python distribution does not come with an XML parser (such as Mac OS X 10.2 and some
+# versions of FreeBSD), feedparser will quietly fall back on regex-based parsing.
+try:
+ import xml.sax
+ xml.sax.make_parser(PREFERRED_XML_PARSERS) # test for valid parsers
+ from xml.sax.saxutils import escape as _xmlescape
+ _XML_AVAILABLE = 1
+except:
+ _XML_AVAILABLE = 0
+ def _xmlescape(data,entities={}):
+ data = data.replace('&', '&')
+ data = data.replace('>', '>')
+ data = data.replace('<', '<')
+ for char, entity in entities:
+ data = data.replace(char, entity)
+ return data
+
+# base64 support for Atom feeds that contain embedded binary data
+try:
+ import base64, binascii
+except:
+ base64 = binascii = None
+
+# cjkcodecs and iconv_codec provide support for more character encodings.
+# Both are available from http://cjkpython.i18n.org/
+try:
+ import cjkcodecs.aliases
+except:
+ pass
+try:
+ import iconv_codec
+except:
+ pass
+
+# chardet library auto-detects character encodings
+# Download from http://chardet.feedparser.org/
+try:
+ import chardet
+ if _debug:
+ import chardet.constants
+ chardet.constants._debug = 1
+except:
+ chardet = None
+
+# reversable htmlentitydefs mappings for Python 2.2
+try:
+ from htmlentitydefs import name2codepoint, codepoint2name
+except:
+ import htmlentitydefs
+ name2codepoint={}
+ codepoint2name={}
+ for (name,codepoint) in htmlentitydefs.entitydefs.iteritems():
+ if codepoint.startswith('&#'): codepoint=unichr(int(codepoint[2:-1]))
+ name2codepoint[name]=ord(codepoint)
+ codepoint2name[ord(codepoint)]=name
+
+# BeautifulSoup parser used for parsing microformats from embedded HTML content
+# http://www.crummy.com/software/BeautifulSoup/
+# feedparser is tested with BeautifulSoup 3.0.x, but it might work with the
+# older 2.x series. If it doesn't, and you can figure out why, I'll accept a
+# patch and modify the compatibility statement accordingly.
+try:
+ import BeautifulSoup
+except:
+ BeautifulSoup = None
+
+# ---------- don't touch these ----------
+class ThingsNobodyCaresAboutButMe(Exception): pass
+class CharacterEncodingOverride(ThingsNobodyCaresAboutButMe): pass
+class CharacterEncodingUnknown(ThingsNobodyCaresAboutButMe): pass
+class NonXMLContentType(ThingsNobodyCaresAboutButMe): pass
+class UndeclaredNamespace(Exception): pass
+
+sgmllib.tagfind = re.compile('[a-zA-Z][-_.:a-zA-Z0-9]*')
+sgmllib.special = re.compile('<!')
+sgmllib.charref = re.compile('&#(\d+|x[0-9a-fA-F]+);')
+
+if sgmllib.endbracket.search(' <').start(0):
+ class EndBracketMatch:
+ endbracket = re.compile('''([^'"<>]|"[^"]*"(?=>|/|\s|\w+=)|'[^']*'(?=>|/|\s|\w+=))*(?=[<>])|.*?(?=[<>])''')
+ def search(self,string,index=0):
+ self.match = self.endbracket.match(string,index)
+ if self.match: return self
+ def start(self,n):
+ return self.match.end(n)
+ sgmllib.endbracket = EndBracketMatch()
+
+SUPPORTED_VERSIONS = {'': 'unknown',
+ 'rss090': 'RSS 0.90',
+ 'rss091n': 'RSS 0.91 (Netscape)',
+ 'rss091u': 'RSS 0.91 (Userland)',
+ 'rss092': 'RSS 0.92',
+ 'rss093': 'RSS 0.93',
+ 'rss094': 'RSS 0.94',
+ 'rss20': 'RSS 2.0',
+ 'rss10': 'RSS 1.0',
+ 'rss': 'RSS (unknown version)',
+ 'atom01': 'Atom 0.1',
+ 'atom02': 'Atom 0.2',
+ 'atom03': 'Atom 0.3',
+ 'atom10': 'Atom 1.0',
+ 'atom': 'Atom (unknown version)',
+ 'cdf': 'CDF',
+ 'hotrss': 'Hot RSS'
+ }
+
+try:
+ UserDict = dict
+except NameError:
+ # Python 2.1 does not have dict
+ from UserDict import UserDict
+ def dict(aList):
+ rc = {}
+ for k, v in aList:
+ rc[k] = v
+ return rc
+
+class FeedParserDict(UserDict):
+ keymap = {'channel': 'feed',
+ 'items': 'entries',
+ 'guid': 'id',
+ 'date': 'updated',
+ 'date_parsed': 'updated_parsed',
+ 'description': ['subtitle', 'summary'],
+ 'url': ['href'],
+ 'modified': 'updated',
+ 'modified_parsed': 'updated_parsed',
+ 'issued': 'published',
+ 'issued_parsed': 'published_parsed',
+ 'copyright': 'rights',
+ 'copyright_detail': 'rights_detail',
+ 'tagline': 'subtitle',
+ 'tagline_detail': 'subtitle_detail'}
+ def __getitem__(self, key):
+ if key == 'category':
+ return UserDict.__getitem__(self, 'tags')[0]['term']
+ if key == 'enclosures':
+ norel = lambda link: FeedParserDict([(name,value) for (name,value) in link.items() if name!='rel'])
+ return [norel(link) for link in UserDict.__getitem__(self, 'links') if link['rel']=='enclosure']
+ if key == 'license':
+ for link in UserDict.__getitem__(self, 'links'):
+ if link['rel']=='license' and link.has_key('href'):
+ return link['href']
+ if key == 'categories':
+ return [(tag['scheme'], tag['term']) for tag in UserDict.__getitem__(self, 'tags')]
+ realkey = self.keymap.get(key, key)
+ if type(realkey) == types.ListType:
+ for k in realkey:
+ if UserDict.has_key(self, k):
+ return UserDict.__getitem__(self, k)
+ if UserDict.has_key(self, key):
+ return UserDict.__getitem__(self, key)
+ return UserDict.__getitem__(self, realkey)
+
+ def __setitem__(self, key, value):
+ for k in self.keymap.keys():
+ if key == k:
+ key = self.keymap[k]
+ if type(key) == types.ListType:
+ key = key[0]
+ return UserDict.__setitem__(self, key, value)
+
+ def get(self, key, default=None):
+ if self.has_key(key):
+ return self[key]
+ else:
+ return default
+
+ def setdefault(self, key, value):
+ if not self.has_key(key):
+ self[key] = value
+ return self[key]
+
+ def has_key(self, key):
+ try:
+ return hasattr(self, key) or UserDict.has_key(self, key)
+ except AttributeError:
+ return False
+
+ def __getattr__(self, key):
+ try:
+ return self.__dict__[key]
+ except KeyError:
+ pass
+ try:
+ assert not key.startswith('_')
+ return self.__getitem__(key)
+ except:
+ raise AttributeError, "object has no attribute '%s'" % key
+
+ def __setattr__(self, key, value):
+ if key.startswith('_') or key == 'data':
+ self.__dict__[key] = value
+ else:
+ return self.__setitem__(key, value)
+
+ def __contains__(self, key):
+ return self.has_key(key)
+
+def zopeCompatibilityHack():
+ global FeedParserDict
+ del FeedParserDict
+ def FeedParserDict(aDict=None):
+ rc = {}
+ if aDict:
+ rc.update(aDict)
+ return rc
+
+_ebcdic_to_ascii_map = None
+def _ebcdic_to_ascii(s):
+ global _ebcdic_to_ascii_map
+ if not _ebcdic_to_ascii_map:
+ emap = (
+ 0,1,2,3,156,9,134,127,151,141,142,11,12,13,14,15,
+ 16,17,18,19,157,133,8,135,24,25,146,143,28,29,30,31,
+ 128,129,130,131,132,10,23,27,136,137,138,139,140,5,6,7,
+ 144,145,22,147,148,149,150,4,152,153,154,155,20,21,158,26,
+ 32,160,161,162,163,164,165,166,167,168,91,46,60,40,43,33,
+ 38,169,170,171,172,173,174,175,176,177,93,36,42,41,59,94,
+ 45,47,178,179,180,181,182,183,184,185,124,44,37,95,62,63,
+ 186,187,188,189,190,191,192,193,194,96,58,35,64,39,61,34,
+ 195,97,98,99,100,101,102,103,104,105,196,197,198,199,200,201,
+ 202,106,107,108,109,110,111,112,113,114,203,204,205,206,207,208,
+ 209,126,115,116,117,118,119,120,121,122,210,211,212,213,214,215,
+ 216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,
+ 123,65,66,67,68,69,70,71,72,73,232,233,234,235,236,237,
+ 125,74,75,76,77,78,79,80,81,82,238,239,240,241,242,243,
+ 92,159,83,84,85,86,87,88,89,90,244,245,246,247,248,249,
+ 48,49,50,51,52,53,54,55,56,57,250,251,252,253,254,255
+ )
+ import string
+ _ebcdic_to_ascii_map = string.maketrans( \
+ ''.join(map(chr, range(256))), ''.join(map(chr, emap)))
+ return s.translate(_ebcdic_to_ascii_map)
+
+_cp1252 = {
+ unichr(128): unichr(8364), # euro sign
+ unichr(130): unichr(8218), # single low-9 quotation mark
+ unichr(131): unichr( 402), # latin small letter f with hook
+ unichr(132): unichr(8222), # double low-9 quotation mark
+ unichr(133): unichr(8230), # horizontal ellipsis
+ unichr(134): unichr(8224), # dagger
+ unichr(135): unichr(8225), # double dagger
+ unichr(136): unichr( 710), # modifier letter circumflex accent
+ unichr(137): unichr(8240), # per mille sign
+ unichr(138): unichr( 352), # latin capital letter s with caron
+ unichr(139): unichr(8249), # single left-pointing angle quotation mark
+ unichr(140): unichr( 338), # latin capital ligature oe
+ unichr(142): unichr( 381), # latin capital letter z with caron
+ unichr(145): unichr(8216), # left single quotation mark
+ unichr(146): unichr(8217), # right single quotation mark
+ unichr(147): unichr(8220), # left double quotation mark
+ unichr(148): unichr(8221), # right double quotation mark
+ unichr(149): unichr(8226), # bullet
+ unichr(150): unichr(8211), # en dash
+ unichr(151): unichr(8212), # em dash
+ unichr(152): unichr( 732), # small tilde
+ unichr(153): unichr(8482), # trade mark sign
+ unichr(154): unichr( 353), # latin small letter s with caron
+ unichr(155): unichr(8250), # single right-pointing angle quotation mark
+ unichr(156): unichr( 339), # latin small ligature oe
+ unichr(158): unichr( 382), # latin small letter z with caron
+ unichr(159): unichr( 376)} # latin capital letter y with diaeresis
+
+_urifixer = re.compile('^([A-Za-z][A-Za-z0-9+-.]*://)(/*)(.*?)')
+def _urljoin(base, uri):
+ uri = _urifixer.sub(r'\1\3', uri)
+ try:
+ return urlparse.urljoin(base, uri)
+ except:
+ uri = urlparse.urlunparse([urllib.quote(part) for part in urlparse.urlparse(uri)])
+ return urlparse.urljoin(base, uri)
+
+class _FeedParserMixin:
+ namespaces = {'': '',
+ 'http://backend.userland.com/rss': '',
+ 'http://blogs.law.harvard.edu/tech/rss': '',
+ 'http://purl.org/rss/1.0/': '',
+ 'http://my.netscape.com/rdf/simple/0.9/': '',
+ 'http://example.com/newformat#': '',
+ 'http://example.com/necho': '',
+ 'http://purl.org/echo/': '',
+ 'uri/of/echo/namespace#': '',
+ 'http://purl.org/pie/': '',
+ 'http://purl.org/atom/ns#': '',
+ 'http://www.w3.org/2005/Atom': '',
+ 'http://purl.org/rss/1.0/modules/rss091#': '',
+
+ 'http://webns.net/mvcb/': 'admin',
+ 'http://purl.org/rss/1.0/modules/aggregation/': 'ag',
+ 'http://purl.org/rss/1.0/modules/annotate/': 'annotate',
+ 'http://media.tangent.org/rss/1.0/': 'audio',
+ 'http://backend.userland.com/blogChannelModule': 'blogChannel',
+ 'http://web.resource.org/cc/': 'cc',
+ 'http://backend.userland.com/creativeCommonsRssModule': 'creativeCommons',
+ 'http://purl.org/rss/1.0/modules/company': 'co',
+ 'http://purl.org/rss/1.0/modules/content/': 'content',
+ 'http://my.theinfo.org/changed/1.0/rss/': 'cp',
+ 'http://purl.org/dc/elements/1.1/': 'dc',
+ 'http://purl.org/dc/terms/': 'dcterms',
+ 'http://purl.org/rss/1.0/modules/email/': 'email',
+ 'http://purl.org/rss/1.0/modules/event/': 'ev',
+ 'http://rssnamespace.org/feedburner/ext/1.0': 'feedburner',
+ 'http://freshmeat.net/rss/fm/': 'fm',
+ 'http://xmlns.com/foaf/0.1/': 'foaf',
+ 'http://www.w3.org/2003/01/geo/wgs84_pos#': 'geo',
+ 'http://postneo.com/icbm/': 'icbm',
+ 'http://purl.org/rss/1.0/modules/image/': 'image',
+ 'http://www.itunes.com/DTDs/PodCast-1.0.dtd': 'itunes',
+ 'http://example.com/DTDs/PodCast-1.0.dtd': 'itunes',
+ 'http://purl.org/rss/1.0/modules/link/': 'l',
+ 'http://search.yahoo.com/mrss': 'media',
+ 'http://madskills.com/public/xml/rss/module/pingback/': 'pingback',
+ 'http://prismstandard.org/namespaces/1.2/basic/': 'prism',
+ 'http://www.w3.org/1999/02/22-rdf-syntax-ns#': 'rdf',
+ 'http://www.w3.org/2000/01/rdf-schema#': 'rdfs',
+ 'http://purl.org/rss/1.0/modules/reference/': 'ref',
+ 'http://purl.org/rss/1.0/modules/richequiv/': 'reqv',
+ 'http://purl.org/rss/1.0/modules/search/': 'search',
+ 'http://purl.org/rss/1.0/modules/slash/': 'slash',
+ 'http://schemas.xmlsoap.org/soap/envelope/': 'soap',
+ 'http://purl.org/rss/1.0/modules/servicestatus/': 'ss',
+ 'http://hacks.benhammersley.com/rss/streaming/': 'str',
+ 'http://purl.org/rss/1.0/modules/subscription/': 'sub',
+ 'http://purl.org/rss/1.0/modules/syndication/': 'sy',
+ 'http://schemas.pocketsoap.com/rss/myDescModule/': 'szf',
+ 'http://purl.org/rss/1.0/modules/taxonomy/': 'taxo',
+ 'http://purl.org/rss/1.0/modules/threading/': 'thr',
+ 'http://purl.org/rss/1.0/modules/textinput/': 'ti',
+ 'http://madskills.com/public/xml/rss/module/trackback/':'trackback',
+ 'http://wellformedweb.org/commentAPI/': 'wfw',
+ 'http://purl.org/rss/1.0/modules/wiki/': 'wiki',
+ 'http://www.w3.org/1999/xhtml': 'xhtml',
+ 'http://www.w3.org/1999/xlink': 'xlink',
+ 'http://www.w3.org/XML/1998/namespace': 'xml'
+}
+ _matchnamespaces = {}
+
+ can_be_relative_uri = ['link', 'id', 'wfw_comment', 'wfw_commentrss', 'docs', 'url', 'href', 'comments', 'icon', 'logo']
+ can_contain_relative_uris = ['content', 'title', 'summary', 'info', 'tagline', 'subtitle', 'copyright', 'rights', 'description']
+ can_contain_dangerous_markup = ['content', 'title', 'summary', 'info', 'tagline', 'subtitle', 'copyright', 'rights', 'description']
+ html_types = ['text/html', 'application/xhtml+xml']
+
+ def __init__(self, baseuri=None, baselang=None, encoding='utf-8'):
+ if _debug: sys.stderr.write('initializing FeedParser\n')
+ if not self._matchnamespaces:
+ for k, v in self.namespaces.items():
+ self._matchnamespaces[k.lower()] = v
+ self.feeddata = FeedParserDict() # feed-level data
+ self.encoding = encoding # character encoding
+ self.entries = [] # list of entry-level data
+ self.version = '' # feed type/version, see SUPPORTED_VERSIONS
+ self.namespacesInUse = {} # dictionary of namespaces defined by the feed
+
+ # the following are used internally to track state;
+ # this is really out of control and should be refactored
+ self.infeed = 0
+ self.inentry = 0
+ self.incontent = 0
+ self.intextinput = 0
+ self.inimage = 0
+ self.inauthor = 0
+ self.incontributor = 0
+ self.inpublisher = 0
+ self.insource = 0
+ self.sourcedata = FeedParserDict()
+ self.contentparams = FeedParserDict()
+ self._summaryKey = None
+ self.namespacemap = {}
+ self.elementstack = []
+ self.basestack = []
+ self.langstack = []
+ self.baseuri = baseuri or ''
+ self.lang = baselang or None
+ self.svgOK = 0
+ self.hasTitle = 0
+ if baselang:
+ self.feeddata['language'] = baselang.replace('_','-')
+
+ def unknown_starttag(self, tag, attrs):
+ if _debug: sys.stderr.write('start %s with %s\n' % (tag, attrs))
+ # normalize attrs
+ attrs = [(k.lower(), v) for k, v in attrs]
+ attrs = [(k, k in ('rel', 'type') and v.lower() or v) for k, v in attrs]
+
+ # track xml:base and xml:lang
+ attrsD = dict(attrs)
+ baseuri = attrsD.get('xml:base', attrsD.get('base')) or self.baseuri
+ if type(baseuri) != type(u''):
+ try:
+ baseuri = unicode(baseuri, self.encoding)
+ except:
+ baseuri = unicode(baseuri, 'iso-8859-1')
+ self.baseuri = _urljoin(self.baseuri, baseuri)
+ lang = attrsD.get('xml:lang', attrsD.get('lang'))
+ if lang == '':
+ # xml:lang could be explicitly set to '', we need to capture that
+ lang = None
+ elif lang is None:
+ # if no xml:lang is specified, use parent lang
+ lang = self.lang
+ if lang:
+ if tag in ('feed', 'rss', 'rdf:RDF'):
+ self.feeddata['language'] = lang.replace('_','-')
+ self.lang = lang
+ self.basestack.append(self.baseuri)
+ self.langstack.append(lang)
+
+ # track namespaces
+ for prefix, uri in attrs:
+ if prefix.startswith('xmlns:'):
+ self.trackNamespace(prefix[6:], uri)
+ elif prefix == 'xmlns':
+ self.trackNamespace(None, uri)
+
+ # track inline content
+ if self.incontent and self.contentparams.has_key('type') and not self.contentparams.get('type', 'xml').endswith('xml'):
+ if tag in ['xhtml:div', 'div']: return # typepad does this 10/2007
+ # element declared itself as escaped markup, but it isn't really
+ self.contentparams['type'] = 'application/xhtml+xml'
+ if self.incontent and self.contentparams.get('type') == 'application/xhtml+xml':
+ if tag.find(':') <> -1:
+ prefix, tag = tag.split(':', 1)
+ namespace = self.namespacesInUse.get(prefix, '')
+ if tag=='math' and namespace=='http://www.w3.org/1998/Math/MathML':
+ attrs.append(('xmlns',namespace))
+ if tag=='svg' and namespace=='http://www.w3.org/2000/svg':
+ attrs.append(('xmlns',namespace))
+ if tag == 'svg': self.svgOK += 1
+ return self.handle_data('<%s%s>' % (tag, self.strattrs(attrs)), escape=0)
+
+ # match namespaces
+ if tag.find(':') <> -1:
+ prefix, suffix = tag.split(':', 1)
+ else:
+ prefix, suffix = '', tag
+ prefix = self.namespacemap.get(prefix, prefix)
+ if prefix:
+ prefix = prefix + '_'
+
+ # special hack for better tracking of empty textinput/image elements in illformed feeds
+ if (not prefix) and tag not in ('title', 'link', 'description', 'name'):
+ self.intextinput = 0
+ if (not prefix) and tag not in ('title', 'link', 'description', 'url', 'href', 'width', 'height'):
+ self.inimage = 0
+
+ # call special handler (if defined) or default handler
+ methodname = '_start_' + prefix + suffix
+ try:
+ method = getattr(self, methodname)
+ return method(attrsD)
+ except AttributeError:
+ return self.push(prefix + suffix, 1)
+
+ def unknown_endtag(self, tag):
+ if _debug: sys.stderr.write('end %s\n' % tag)
+ # match namespaces
+ if tag.find(':') <> -1:
+ prefix, suffix = tag.split(':', 1)
+ else:
+ prefix, suffix = '', tag
+ prefix = self.namespacemap.get(prefix, prefix)
+ if prefix:
+ prefix = prefix + '_'
+ if suffix == 'svg' and self.svgOK: self.svgOK -= 1
+
+ # call special handler (if defined) or default handler
+ methodname = '_end_' + prefix + suffix
+ try:
+ if self.svgOK: raise AttributeError()
+ method = getattr(self, methodname)
+ method()
+ except AttributeError:
+ self.pop(prefix + suffix)
+
+ # track inline content
+ if self.incontent and self.contentparams.has_key('type') and not self.contentparams.get('type', 'xml').endswith('xml'):
+ # element declared itself as escaped markup, but it isn't really
+ if tag in ['xhtml:div', 'div']: return # typepad does this 10/2007
+ self.contentparams['type'] = 'application/xhtml+xml'
+ if self.incontent and self.contentparams.get('type') == 'application/xhtml+xml':
+ tag = tag.split(':')[-1]
+ self.handle_data('</%s>' % tag, escape=0)
+
+ # track xml:base and xml:lang going out of scope
+ if self.basestack:
+ self.basestack.pop()
+ if self.basestack and self.basestack[-1]:
+ self.baseuri = self.basestack[-1]
+ if self.langstack:
+ self.langstack.pop()
+ if self.langstack: # and (self.langstack[-1] is not None):
+ self.lang = self.langstack[-1]
+
+ def handle_charref(self, ref):
+ # called for each character reference, e.g. for ' ', ref will be '160'
+ if not self.elementstack: return
+ ref = ref.lower()
+ if ref in ('34', '38', '39', '60', '62', 'x22', 'x26', 'x27', 'x3c', 'x3e'):
+ text = '&#%s;' % ref
+ else:
+ if ref[0] == 'x':
+ c = int(ref[1:], 16)
+ else:
+ c = int(ref)
+ text = unichr(c).encode('utf-8')
+ self.elementstack[-1][2].append(text)
+
+ def handle_entityref(self, ref):
+ # called for each entity reference, e.g. for '©', ref will be 'copy'
+ if not self.elementstack: return
+ if _debug: sys.stderr.write('entering handle_entityref with %s\n' % ref)
+ if ref in ('lt', 'gt', 'quot', 'amp', 'apos'):
+ text = '&%s;' % ref
+ elif ref in self.entities.keys():
+ text = self.entities[ref]
+ if text.startswith('&#') and text.endswith(';'):
+ return self.handle_entityref(text)
+ else:
+ try: name2codepoint[ref]
+ except KeyError: text = '&%s;' % ref
+ else: text = unichr(name2codepoint[ref]).encode('utf-8')
+ self.elementstack[-1][2].append(text)
+
+ def handle_data(self, text, escape=1):
+ # called for each block of plain text, i.e. outside of any tag and
+ # not containing any character or entity references
+ if not self.elementstack: return
+ if escape and self.contentparams.get('type') == 'application/xhtml+xml':
+ text = _xmlescape(text)
+ self.elementstack[-1][2].append(text)
+
+ def handle_comment(self, text):
+ # called for each comment, e.g. <!-- insert message here -->
+ pass
+
+ def handle_pi(self, text):
+ # called for each processing instruction, e.g. <?instruction>
+ pass
+
+ def handle_decl(self, text):
+ pass
+
+ def parse_declaration(self, i):
+ # override internal declaration handler to handle CDATA blocks
+ if _debug: sys.stderr.write('entering parse_declaration\n')
+ if self.rawdata[i:i+9] == '<![CDATA[':
+ k = self.rawdata.find(']]>', i)
+ if k == -1: k = len(self.rawdata)
+ self.handle_data(_xmlescape(self.rawdata[i+9:k]), 0)
+ return k+3
+ else:
+ k = self.rawdata.find('>', i)
+ return k+1
+
+ def mapContentType(self, contentType):
+ contentType = contentType.lower()
+ if contentType == 'text':
+ contentType = 'text/plain'
+ elif contentType == 'html':
+ contentType = 'text/html'
+ elif contentType == 'xhtml':
+ contentType = 'application/xhtml+xml'
+ return contentType
+
+ def trackNamespace(self, prefix, uri):
+ loweruri = uri.lower()
+ if (prefix, loweruri) == (None, 'http://my.netscape.com/rdf/simple/0.9/') and not self.version:
+ self.version = 'rss090'
+ if loweruri == 'http://purl.org/rss/1.0/' and not self.version:
+ self.version = 'rss10'
+ if loweruri == 'http://www.w3.org/2005/atom' and not self.version:
+ self.version = 'atom10'
+ if loweruri.find('backend.userland.com/rss') <> -1:
+ # match any backend.userland.com namespace
+ uri = 'http://backend.userland.com/rss'
+ loweruri = uri
+ if self._matchnamespaces.has_key(loweruri):
+ self.namespacemap[prefix] = self._matchnamespaces[loweruri]
+ self.namespacesInUse[self._matchnamespaces[loweruri]] = uri
+ else:
+ self.namespacesInUse[prefix or ''] = uri
+
+ def resolveURI(self, uri):
+ return _urljoin(self.baseuri or '', uri)
+
+ def decodeEntities(self, element, data):
+ return data
+
+ def strattrs(self, attrs):
+ return ''.join([' %s="%s"' % (t[0],_xmlescape(t[1],{'"':'"'})) for t in attrs])
+
+ def push(self, element, expectingText):
+ self.elementstack.append([element, expectingText, []])
+
+ def pop(self, element, stripWhitespace=1):
+ if not self.elementstack: return
+ if self.elementstack[-1][0] != element: return
+
+ element, expectingText, pieces = self.elementstack.pop()
+
+ if self.version == 'atom10' and self.contentparams.get('type','text') == 'application/xhtml+xml':
+ # remove enclosing child element, but only if it is a <div> and
+ # only if all the remaining content is nested underneath it.
+ # This means that the divs would be retained in the following:
+ # <div>foo</div><div>bar</div>
+ while pieces and len(pieces)>1 and not pieces[-1].strip():
+ del pieces[-1]
+ while pieces and len(pieces)>1 and not pieces[0].strip():
+ del pieces[0]
+ if pieces and (pieces[0] == '<div>' or pieces[0].startswith('<div ')) and pieces[-1]=='</div>':
+ depth = 0
+ for piece in pieces[:-1]:
+ if piece.startswith('</'):
+ depth -= 1
+ if depth == 0: break
+ elif piece.startswith('<') and not piece.endswith('/>'):
+ depth += 1
+ else:
+ pieces = pieces[1:-1]
+
+ output = ''.join(pieces)
+ if stripWhitespace:
+ output = output.strip()
+ if not expectingText: return output
+
+ # decode base64 content
+ if base64 and self.contentparams.get('base64', 0):
+ try:
+ output = base64.decodestring(output)
+ except binascii.Error:
+ pass
+ except binascii.Incomplete:
+ pass
+
+ # resolve relative URIs
+ if (element in self.can_be_relative_uri) and output:
+ output = self.resolveURI(output)
+
+ # decode entities within embedded markup
+ if not self.contentparams.get('base64', 0):
+ output = self.decodeEntities(element, output)
+
+ if self.lookslikehtml(output):
+ self.contentparams['type']='text/html'
+
+ # remove temporary cruft from contentparams
+ try:
+ del self.contentparams['mode']
+ except KeyError:
+ pass
+ try:
+ del self.contentparams['base64']
+ except KeyError:
+ pass
+
+ is_htmlish = self.mapContentType(self.contentparams.get('type', 'text/html')) in self.html_types
+ # resolve relative URIs within embedded markup
+ if is_htmlish and RESOLVE_RELATIVE_URIS:
+ if element in self.can_contain_relative_uris:
+ output = _resolveRelativeURIs(output, self.baseuri, self.encoding, self.contentparams.get('type', 'text/html'))
+
+ # parse microformats
+ # (must do this before sanitizing because some microformats
+ # rely on elements that we sanitize)
+ if is_htmlish and element in ['content', 'description', 'summary']:
+ mfresults = _parseMicroformats(output, self.baseuri, self.encoding)
+ if mfresults:
+ for tag in mfresults.get('tags', []):
+ self._addTag(tag['term'], tag['scheme'], tag['label'])
+ for enclosure in mfresults.get('enclosures', []):
+ self._start_enclosure(enclosure)
+ for xfn in mfresults.get('xfn', []):
+ self._addXFN(xfn['relationships'], xfn['href'], xfn['name'])
+ vcard = mfresults.get('vcard')
+ if vcard:
+ self._getContext()['vcard'] = vcard
+
+ # sanitize embedded markup
+ if is_htmlish and SANITIZE_HTML:
+ if element in self.can_contain_dangerous_markup:
+ output = _sanitizeHTML(output, self.encoding, self.contentparams.get('type', 'text/html'))
+
+ if self.encoding and type(output) != type(u''):
+ try:
+ output = unicode(output, self.encoding)
+ except:
+ pass
+
+ # address common error where people take data that is already
+ # utf-8, presume that it is iso-8859-1, and re-encode it.
+ if self.encoding=='utf-8' and type(output) == type(u''):
+ try:
+ output = unicode(output.encode('iso-8859-1'), 'utf-8')
+ except:
+ pass
+
+ # map win-1252 extensions to the proper code points
+ if type(output) == type(u''):
+ output = u''.join([c in _cp1252.keys() and _cp1252[c] or c for c in output])
+
+ # categories/tags/keywords/whatever are handled in _end_category
+ if element == 'category':
+ return output
+
+ if element == 'title' and self.hasTitle:
+ return output
+
+ # store output in appropriate place(s)
+ if self.inentry and not self.insource:
+ if element == 'content':
+ self.entries[-1].setdefault(element, [])
+ contentparams = copy.deepcopy(self.contentparams)
+ contentparams['value'] = output
+ self.entries[-1][element].append(contentparams)
+ elif element == 'link':
+ self.entries[-1][element] = output
+ if output:
+ self.entries[-1]['links'][-1]['href'] = output
+ else:
+ if element == 'description':
+ element = 'summary'
+ self.entries[-1][element] = output
+ if self.incontent:
+ contentparams = copy.deepcopy(self.contentparams)
+ contentparams['value'] = output
+ self.entries[-1][element + '_detail'] = contentparams
+ elif (self.infeed or self.insource):# and (not self.intextinput) and (not self.inimage):
+ context = self._getContext()
+ if element == 'description':
+ element = 'subtitle'
+ context[element] = output
+ if element == 'link':
+ context['links'][-1]['href'] = output
+ elif self.incontent:
+ contentparams = copy.deepcopy(self.contentparams)
+ contentparams['value'] = output
+ context[element + '_detail'] = contentparams
+ return output
+
+ def pushContent(self, tag, attrsD, defaultContentType, expectingText):
+ self.incontent += 1
+ if self.lang: self.lang=self.lang.replace('_','-')
+ self.contentparams = FeedParserDict({
+ 'type': self.mapContentType(attrsD.get('type', defaultContentType)),
+ 'language': self.lang,
+ 'base': self.baseuri})
+ self.contentparams['base64'] = self._isBase64(attrsD, self.contentparams)
+ self.push(tag, expectingText)
+
+ def popContent(self, tag):
+ value = self.pop(tag)
+ self.incontent -= 1
+ self.contentparams.clear()
+ return value
+
+ # a number of elements in a number of RSS variants are nominally plain
+ # text, but this is routinely ignored. This is an attempt to detect
+ # the most common cases. As false positives often result in silent
+ # data loss, this function errs on the conservative side.
+ def lookslikehtml(self, str):
+ if self.version.startswith('atom'): return
+ if self.contentparams.get('type','text/html') != 'text/plain': return
+
+ # must have a close tag or a entity reference to qualify
+ if not (re.search(r'</(\w+)>',str) or re.search("&#?\w+;",str)): return
+
+ # all tags must be in a restricted subset of valid HTML tags
+ if filter(lambda t: t.lower() not in _HTMLSanitizer.acceptable_elements,
+ re.findall(r'</?(\w+)',str)): return
+
+ # all entities must have been defined as valid HTML entities
+ from htmlentitydefs import entitydefs
+ if filter(lambda e: e not in entitydefs.keys(),
+ re.findall(r'&(\w+);',str)): return
+
+ return 1
+
+ def _mapToStandardPrefix(self, name):
+ colonpos = name.find(':')
+ if colonpos <> -1:
+ prefix = name[:colonpos]
+ suffix = name[colonpos+1:]
+ prefix = self.namespacemap.get(prefix, prefix)
+ name = prefix + ':' + suffix
+ return name
+
+ def _getAttribute(self, attrsD, name):
+ return attrsD.get(self._mapToStandardPrefix(name))
+
+ def _isBase64(self, attrsD, contentparams):
+ if attrsD.get('mode', '') == 'base64':
+ return 1
+ if self.contentparams['type'].startswith('text/'):
+ return 0
+ if self.contentparams['type'].endswith('+xml'):
+ return 0
+ if self.contentparams['type'].endswith('/xml'):
+ return 0
+ return 1
+
+ def _itsAnHrefDamnIt(self, attrsD):
+ href = attrsD.get('url', attrsD.get('uri', attrsD.get('href', None)))
+ if href:
+ try:
+ del attrsD['url']
+ except KeyError:
+ pass
+ try:
+ del attrsD['uri']
+ except KeyError:
+ pass
+ attrsD['href'] = href
+ return attrsD
+
+ def _save(self, key, value):
+ context = self._getContext()
+ context.setdefault(key, value)
+
+ def _start_rss(self, attrsD):
+ versionmap = {'0.91': 'rss091u',
+ '0.92': 'rss092',
+ '0.93': 'rss093',
+ '0.94': 'rss094'}
+ if not self.version:
+ attr_version = attrsD.get('version', '')
+ version = versionmap.get(attr_version)
+ if version:
+ self.version = version
+ elif attr_version.startswith('2.'):
+ self.version = 'rss20'
+ else:
+ self.version = 'rss'
+
+ def _start_dlhottitles(self, attrsD):
+ self.version = 'hotrss'
+
+ def _start_channel(self, attrsD):
+ self.infeed = 1
+ self._cdf_common(attrsD)
+ _start_feedinfo = _start_channel
+
+ def _cdf_common(self, attrsD):
+ if attrsD.has_key('lastmod'):
+ self._start_modified({})
+ self.elementstack[-1][-1] = attrsD['lastmod']
+ self._end_modified()
+ if attrsD.has_key('href'):
+ self._start_link({})
+ self.elementstack[-1][-1] = attrsD['href']
+ self._end_link()
+
+ def _start_feed(self, attrsD):
+ self.infeed = 1
+ versionmap = {'0.1': 'atom01',
+ '0.2': 'atom02',
+ '0.3': 'atom03'}
+ if not self.version:
+ attr_version = attrsD.get('version')
+ version = versionmap.get(attr_version)
+ if version:
+ self.version = version
+ else:
+ self.version = 'atom'
+
+ def _end_channel(self):
+ self.infeed = 0
+ _end_feed = _end_channel
+
+ def _start_image(self, attrsD):
+ context = self._getContext()
+ context.setdefault('image', FeedParserDict())
+ self.inimage = 1
+ self.hasTitle = 0
+ self.push('image', 0)
+
+ def _end_image(self):
+ self.pop('image')
+ self.inimage = 0
+
+ def _start_textinput(self, attrsD):
+ context = self._getContext()
+ context.setdefault('textinput', FeedParserDict())
+ self.intextinput = 1
+ self.hasTitle = 0
+ self.push('textinput', 0)
+ _start_textInput = _start_textinput
+
+ def _end_textinput(self):
+ self.pop('textinput')
+ self.intextinput = 0
+ _end_textInput = _end_textinput
+
+ def _start_author(self, attrsD):
+ self.inauthor = 1
+ self.push('author', 1)
+ _start_managingeditor = _start_author
+ _start_dc_author = _start_author
+ _start_dc_creator = _start_author
+ _start_itunes_author = _start_author
+
+ def _end_author(self):
+ self.pop('author')
+ self.inauthor = 0
+ self._sync_author_detail()
+ _end_managingeditor = _end_author
+ _end_dc_author = _end_author
+ _end_dc_creator = _end_author
+ _end_itunes_author = _end_author
+
+ def _start_itunes_owner(self, attrsD):
+ self.inpublisher = 1
+ self.push('publisher', 0)
+
+ def _end_itunes_owner(self):
+ self.pop('publisher')
+ self.inpublisher = 0
+ self._sync_author_detail('publisher')
+
+ def _start_contributor(self, attrsD):
+ self.incontributor = 1
+ context = self._getContext()
+ context.setdefault('contributors', [])
+ context['contributors'].append(FeedParserDict())
+ self.push('contributor', 0)
+
+ def _end_contributor(self):
+ self.pop('contributor')
+ self.incontributor = 0
+
+ def _start_dc_contributor(self, attrsD):
+ self.incontributor = 1
+ context = self._getContext()
+ context.setdefault('contributors', [])
+ context['contributors'].append(FeedParserDict())
+ self.push('name', 0)
+
+ def _end_dc_contributor(self):
+ self._end_name()
+ self.incontributor = 0
+
+ def _start_name(self, attrsD):
+ self.push('name', 0)
+ _start_itunes_name = _start_name
+
+ def _end_name(self):
+ value = self.pop('name')
+ if self.inpublisher:
+ self._save_author('name', value, 'publisher')
+ elif self.inauthor:
+ self._save_author('name', value)
+ elif self.incontributor:
+ self._save_contributor('name', value)
+ elif self.intextinput:
+ context = self._getContext()
+ context['name'] = value
+ _end_itunes_name = _end_name
+
+ def _start_width(self, attrsD):
+ self.push('width', 0)
+
+ def _end_width(self):
+ value = self.pop('width')
+ try:
+ value = int(value)
+ except:
+ value = 0
+ if self.inimage:
+ context = self._getContext()
+ context['width'] = value
+
+ def _start_height(self, attrsD):
+ self.push('height', 0)
+
+ def _end_height(self):
+ value = self.pop('height')
+ try:
+ value = int(value)
+ except:
+ value = 0
+ if self.inimage:
+ context = self._getContext()
+ context['height'] = value
+
+ def _start_url(self, attrsD):
+ self.push('href', 1)
+ _start_homepage = _start_url
+ _start_uri = _start_url
+
+ def _end_url(self):
+ value = self.pop('href')
+ if self.inauthor:
+ self._save_author('href', value)
+ elif self.incontributor:
+ self._save_contributor('href', value)
+ _end_homepage = _end_url
+ _end_uri = _end_url
+
+ def _start_email(self, attrsD):
+ self.push('email', 0)
+ _start_itunes_email = _start_email
+
+ def _end_email(self):
+ value = self.pop('email')
+ if self.inpublisher:
+ self._save_author('email', value, 'publisher')
+ elif self.inauthor:
+ self._save_author('email', value)
+ elif self.incontributor:
+ self._save_contributor('email', value)
+ _end_itunes_email = _end_email
+
+ def _getContext(self):
+ if self.insource:
+ context = self.sourcedata
+ elif self.inimage:
+ context = self.feeddata['image']
+ elif self.intextinput:
+ context = self.feeddata['textinput']
+ elif self.inentry:
+ context = self.entries[-1]
+ else:
+ context = self.feeddata
+ return context
+
+ def _save_author(self, key, value, prefix='author'):
+ context = self._getContext()
+ context.setdefault(prefix + '_detail', FeedParserDict())
+ context[prefix + '_detail'][key] = value
+ self._sync_author_detail()
+
+ def _save_contributor(self, key, value):
+ context = self._getContext()
+ context.setdefault('contributors', [FeedParserDict()])
+ context['contributors'][-1][key] = value
+
+ def _sync_author_detail(self, key='author'):
+ context = self._getContext()
+ detail = context.get('%s_detail' % key)
+ if detail:
+ name = detail.get('name')
+ email = detail.get('email')
+ if name and email:
+ context[key] = '%s (%s)' % (name, email)
+ elif name:
+ context[key] = name
+ elif email:
+ context[key] = email
+ else:
+ author, email = context.get(key), None
+ if not author: return
+ emailmatch = re.search(r'''(([a-zA-Z0-9\_\-\.\+]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?))(\?subject=\S+)?''', author)
+ if emailmatch:
+ email = emailmatch.group(0)
+ # probably a better way to do the following, but it passes all the tests
+ author = author.replace(email, '')
+ author = author.replace('()', '')
+ author = author.replace('<>', '')
+ author = author.replace('<>', '')
+ author = author.strip()
+ if author and (author[0] == '('):
+ author = author[1:]
+ if author and (author[-1] == ')'):
+ author = author[:-1]
+ author = author.strip()
+ if author or email:
+ context.setdefault('%s_detail' % key, FeedParserDict())
+ if author:
+ context['%s_detail' % key]['name'] = author
+ if email:
+ context['%s_detail' % key]['email'] = email
+
+ def _start_subtitle(self, attrsD):
+ self.pushContent('subtitle', attrsD, 'text/plain', 1)
+ _start_tagline = _start_subtitle
+ _start_itunes_subtitle = _start_subtitle
+
+ def _end_subtitle(self):
+ self.popContent('subtitle')
+ _end_tagline = _end_subtitle
+ _end_itunes_subtitle = _end_subtitle
+
+ def _start_rights(self, attrsD):
+ self.pushContent('rights', attrsD, 'text/plain', 1)
+ _start_dc_rights = _start_rights
+ _start_copyright = _start_rights
+
+ def _end_rights(self):
+ self.popContent('rights')
+ _end_dc_rights = _end_rights
+ _end_copyright = _end_rights
+
+ def _start_item(self, attrsD):
+ self.entries.append(FeedParserDict())
+ self.push('item', 0)
+ self.inentry = 1
+ self.guidislink = 0
+ self.hasTitle = 0
+ id = self._getAttribute(attrsD, 'rdf:about')
+ if id:
+ context = self._getContext()
+ context['id'] = id
+ self._cdf_common(attrsD)
+ _start_entry = _start_item
+ _start_product = _start_item
+
+ def _end_item(self):
+ self.pop('item')
+ self.inentry = 0
+ _end_entry = _end_item
+
+ def _start_dc_language(self, attrsD):
+ self.push('language', 1)
+ _start_language = _start_dc_language
+
+ def _end_dc_language(self):
+ self.lang = self.pop('language')
+ _end_language = _end_dc_language
+
+ def _start_dc_publisher(self, attrsD):
+ self.push('publisher', 1)
+ _start_webmaster = _start_dc_publisher
+
+ def _end_dc_publisher(self):
+ self.pop('publisher')
+ self._sync_author_detail('publisher')
+ _end_webmaster = _end_dc_publisher
+
+ def _start_published(self, attrsD):
+ self.push('published', 1)
+ _start_dcterms_issued = _start_published
+ _start_issued = _start_published
+
+ def _end_published(self):
+ value = self.pop('published')
+ self._save('published_parsed', _parse_date(value))
+ _end_dcterms_issued = _end_published
+ _end_issued = _end_published
+
+ def _start_updated(self, attrsD):
+ self.push('updated', 1)
+ _start_modified = _start_updated
+ _start_dcterms_modified = _start_updated
+ _start_pubdate = _start_updated
+ _start_dc_date = _start_updated
+
+ def _end_updated(self):
+ value = self.pop('updated')
+ parsed_value = _parse_date(value)
+ self._save('updated_parsed', parsed_value)
+ _end_modified = _end_updated
+ _end_dcterms_modified = _end_updated
+ _end_pubdate = _end_updated
+ _end_dc_date = _end_updated
+
+ def _start_created(self, attrsD):
+ self.push('created', 1)
+ _start_dcterms_created = _start_created
+
+ def _end_created(self):
+ value = self.pop('created')
+ self._save('created_parsed', _parse_date(value))
+ _end_dcterms_created = _end_created
+
+ def _start_expirationdate(self, attrsD):
+ self.push('expired', 1)
+
+ def _end_expirationdate(self):
+ self._save('expired_parsed', _parse_date(self.pop('expired')))
+
+ def _start_cc_license(self, attrsD):
+ context = self._getContext()
+ value = self._getAttribute(attrsD, 'rdf:resource')
+ attrsD = FeedParserDict()
+ attrsD['rel']='license'
+ if value: attrsD['href']=value
+ context.setdefault('links', []).append(attrsD)
+
+ def _start_creativecommons_license(self, attrsD):
+ self.push('license', 1)
+ _start_creativeCommons_license = _start_creativecommons_license
+
+ def _end_creativecommons_license(self):
+ value = self.pop('license')
+ context = self._getContext()
+ attrsD = FeedParserDict()
+ attrsD['rel']='license'
+ if value: attrsD['href']=value
+ context.setdefault('links', []).append(attrsD)
+ del context['license']
+ _end_creativeCommons_license = _end_creativecommons_license
+
+ def _addXFN(self, relationships, href, name):
+ context = self._getContext()
+ xfn = context.setdefault('xfn', [])
+ value = FeedParserDict({'relationships': relationships, 'href': href, 'name': name})
+ if value not in xfn:
+ xfn.append(value)
+
+ def _addTag(self, term, scheme, label):
+ context = self._getContext()
+ tags = context.setdefault('tags', [])
+ if (not term) and (not scheme) and (not label): return
+ value = FeedParserDict({'term': term, 'scheme': scheme, 'label': label})
+ if value not in tags:
+ tags.append(value)
+
+ def _start_category(self, attrsD):
+ if _debug: sys.stderr.write('entering _start_category with %s\n' % repr(attrsD))
+ term = attrsD.get('term')
+ scheme = attrsD.get('scheme', attrsD.get('domain'))
+ label = attrsD.get('label')
+ self._addTag(term, scheme, label)
+ self.push('category', 1)
+ _start_dc_subject = _start_category
+ _start_keywords = _start_category
+
+ def _end_itunes_keywords(self):
+ for term in self.pop('itunes_keywords').split():
+ self._addTag(term, 'http://www.itunes.com/', None)
+
+ def _start_itunes_category(self, attrsD):
+ self._addTag(attrsD.get('text'), 'http://www.itunes.com/', None)
+ self.push('category', 1)
+
+ def _end_category(self):
+ value = self.pop('category')
+ if not value: return
+ context = self._getContext()
+ tags = context['tags']
+ if value and len(tags) and not tags[-1]['term']:
+ tags[-1]['term'] = value
+ else:
+ self._addTag(value, None, None)
+ _end_dc_subject = _end_category
+ _end_keywords = _end_category
+ _end_itunes_category = _end_category
+
+ def _start_cloud(self, attrsD):
+ self._getContext()['cloud'] = FeedParserDict(attrsD)
+
+ def _start_link(self, attrsD):
+ attrsD.setdefault('rel', 'alternate')
+ if attrsD['rel'] == 'self':
+ attrsD.setdefault('type', 'application/atom+xml')
+ else:
+ attrsD.setdefault('type', 'text/html')
+ context = self._getContext()
+ attrsD = self._itsAnHrefDamnIt(attrsD)
+ if attrsD.has_key('href'):
+ attrsD['href'] = self.resolveURI(attrsD['href'])
+ if attrsD.get('rel')=='enclosure' and not context.get('id'):
+ context['id'] = attrsD.get('href')
+ expectingText = self.infeed or self.inentry or self.insource
+ context.setdefault('links', [])
+ context['links'].append(FeedParserDict(attrsD))
+ if attrsD.has_key('href'):
+ expectingText = 0
+ if (attrsD.get('rel') == 'alternate') and (self.mapContentType(attrsD.get('type')) in self.html_types):
+ context['link'] = attrsD['href']
+ else:
+ self.push('link', expectingText)
+ _start_producturl = _start_link
+
+ def _end_link(self):
+ value = self.pop('link')
+ context = self._getContext()
+ _end_producturl = _end_link
+
+ def _start_guid(self, attrsD):
+ self.guidislink = (attrsD.get('ispermalink', 'true') == 'true')
+ self.push('id', 1)
+
+ def _end_guid(self):
+ value = self.pop('id')
+ self._save('guidislink', self.guidislink and not self._getContext().has_key('link'))
+ if self.guidislink:
+ # guid acts as link, but only if 'ispermalink' is not present or is 'true',
+ # and only if the item doesn't already have a link element
+ self._save('link', value)
+
+ def _start_title(self, attrsD):
+ if self.svgOK: return self.unknown_starttag('title', attrsD.items())
+ self.pushContent('title', attrsD, 'text/plain', self.infeed or self.inentry or self.insource)
+ _start_dc_title = _start_title
+ _start_media_title = _start_title
+
+ def _end_title(self):
+ if self.svgOK: return
+ value = self.popContent('title')
+ if not value: return
+ context = self._getContext()
+ self.hasTitle = 1
+ _end_dc_title = _end_title
+
+ def _end_media_title(self):
+ hasTitle = self.hasTitle
+ self._end_title()
+ self.hasTitle = hasTitle
+
+ def _start_description(self, attrsD):
+ context = self._getContext()
+ if context.has_key('summary'):
+ self._summaryKey = 'content'
+ self._start_content(attrsD)
+ else:
+ self.pushContent('description', attrsD, 'text/html', self.infeed or self.inentry or self.insource)
+ _start_dc_description = _start_description
+
+ def _start_abstract(self, attrsD):
+ self.pushContent('description', attrsD, 'text/plain', self.infeed or self.inentry or self.insource)
+
+ def _end_description(self):
+ if self._summaryKey == 'content':
+ self._end_content()
+ else:
+ value = self.popContent('description')
+ self._summaryKey = None
+ _end_abstract = _end_description
+ _end_dc_description = _end_description
+
+ def _start_info(self, attrsD):
+ self.pushContent('info', attrsD, 'text/plain', 1)
+ _start_feedburner_browserfriendly = _start_info
+
+ def _end_info(self):
+ self.popContent('info')
+ _end_feedburner_browserfriendly = _end_info
+
+ def _start_generator(self, attrsD):
+ if attrsD:
+ attrsD = self._itsAnHrefDamnIt(attrsD)
+ if attrsD.has_key('href'):
+ attrsD['href'] = self.resolveURI(attrsD['href'])
+ self._getContext()['generator_detail'] = FeedParserDict(attrsD)
+ self.push('generator', 1)
+
+ def _end_generator(self):
+ value = self.pop('generator')
+ context = self._getContext()
+ if context.has_key('generator_detail'):
+ context['generator_detail']['name'] = value
+
+ def _start_admin_generatoragent(self, attrsD):
+ self.push('generator', 1)
+ value = self._getAttribute(attrsD, 'rdf:resource')
+ if value:
+ self.elementstack[-1][2].append(value)
+ self.pop('generator')
+ self._getContext()['generator_detail'] = FeedParserDict({'href': value})
+
+ def _start_admin_errorreportsto(self, attrsD):
+ self.push('errorreportsto', 1)
+ value = self._getAttribute(attrsD, 'rdf:resource')
+ if value:
+ self.elementstack[-1][2].append(value)
+ self.pop('errorreportsto')
+
+ def _start_summary(self, attrsD):
+ context = self._getContext()
+ if context.has_key('summary'):
+ self._summaryKey = 'content'
+ self._start_content(attrsD)
+ else:
+ self._summaryKey = 'summary'
+ self.pushContent(self._summaryKey, attrsD, 'text/plain', 1)
+ _start_itunes_summary = _start_summary
+
+ def _end_summary(self):
+ if self._summaryKey == 'content':
+ self._end_content()
+ else:
+ self.popContent(self._summaryKey or 'summary')
+ self._summaryKey = None
+ _end_itunes_summary = _end_summary
+
+ def _start_enclosure(self, attrsD):
+ attrsD = self._itsAnHrefDamnIt(attrsD)
+ context = self._getContext()
+ attrsD['rel']='enclosure'
+ context.setdefault('links', []).append(FeedParserDict(attrsD))
+ href = attrsD.get('href')
+ if href and not context.get('id'):
+ context['id'] = href
+
+ def _start_source(self, attrsD):
+ self.insource = 1
+ self.hasTitle = 0
+
+ def _end_source(self):
+ self.insource = 0
+ self._getContext()['source'] = copy.deepcopy(self.sourcedata)
+ self.sourcedata.clear()
+
+ def _start_content(self, attrsD):
+ self.pushContent('content', attrsD, 'text/plain', 1)
+ src = attrsD.get('src')
+ if src:
+ self.contentparams['src'] = src
+ self.push('content', 1)
+
+ def _start_prodlink(self, attrsD):
+ self.pushContent('content', attrsD, 'text/html', 1)
+
+ def _start_body(self, attrsD):
+ self.pushContent('content', attrsD, 'application/xhtml+xml', 1)
+ _start_xhtml_body = _start_body
+
+ def _start_content_encoded(self, attrsD):
+ self.pushContent('content', attrsD, 'text/html', 1)
+ _start_fullitem = _start_content_encoded
+
+ def _end_content(self):
+ copyToDescription = self.mapContentType(self.contentparams.get('type')) in (['text/plain'] + self.html_types)
+ value = self.popContent('content')
+ if copyToDescription:
+ self._save('description', value)
+
+ _end_body = _end_content
+ _end_xhtml_body = _end_content
+ _end_content_encoded = _end_content
+ _end_fullitem = _end_content
+ _end_prodlink = _end_content
+
+ def _start_itunes_image(self, attrsD):
+ self.push('itunes_image', 0)
+ self._getContext()['image'] = FeedParserDict({'href': attrsD.get('href')})
+ _start_itunes_link = _start_itunes_image
+
+ def _end_itunes_block(self):
+ value = self.pop('itunes_block', 0)
+ self._getContext()['itunes_block'] = (value == 'yes') and 1 or 0
+
+ def _end_itunes_explicit(self):
+ value = self.pop('itunes_explicit', 0)
+ self._getContext()['itunes_explicit'] = (value == 'yes') and 1 or 0
+
+if _XML_AVAILABLE:
+ class _StrictFeedParser(_FeedParserMixin, xml.sax.handler.ContentHandler):
+ def __init__(self, baseuri, baselang, encoding):
+ if _debug: sys.stderr.write('trying StrictFeedParser\n')
+ xml.sax.handler.ContentHandler.__init__(self)
+ _FeedParserMixin.__init__(self, baseuri, baselang, encoding)
+ self.bozo = 0
+ self.exc = None
+
+ def startPrefixMapping(self, prefix, uri):
+ self.trackNamespace(prefix, uri)
+
+ def startElementNS(self, name, qname, attrs):
+ namespace, localname = name
+ lowernamespace = str(namespace or '').lower()
+ if lowernamespace.find('backend.userland.com/rss') <> -1:
+ # match any backend.userland.com namespace
+ namespace = 'http://backend.userland.com/rss'
+ lowernamespace = namespace
+ if qname and qname.find(':') > 0:
+ givenprefix = qname.split(':')[0]
+ else:
+ givenprefix = None
+ prefix = self._matchnamespaces.get(lowernamespace, givenprefix)
+ if givenprefix and (prefix == None or (prefix == '' and lowernamespace == '')) and not self.namespacesInUse.has_key(givenprefix):
+ raise UndeclaredNamespace, "'%s' is not associated with a namespace" % givenprefix
+ localname = str(localname).lower()
+
+ # qname implementation is horribly broken in Python 2.1 (it
+ # doesn't report any), and slightly broken in Python 2.2 (it
+ # doesn't report the xml: namespace). So we match up namespaces
+ # with a known list first, and then possibly override them with
+ # the qnames the SAX parser gives us (if indeed it gives us any
+ # at all). Thanks to MatejC for helping me test this and
+ # tirelessly telling me that it didn't work yet.
+ attrsD = {}
+ if localname=='math' and namespace=='http://www.w3.org/1998/Math/MathML':
+ attrsD['xmlns']=namespace
+ if localname=='svg' and namespace=='http://www.w3.org/2000/svg':
+ attrsD['xmlns']=namespace
+
+ if prefix:
+ localname = prefix.lower() + ':' + localname
+ elif namespace and not qname: #Expat
+ for name,value in self.namespacesInUse.items():
+ if name and value == namespace:
+ localname = name + ':' + localname
+ break
+ if _debug: sys.stderr.write('startElementNS: qname = %s, namespace = %s, givenprefix = %s, prefix = %s, attrs = %s, localname = %s\n' % (qname, namespace, givenprefix, prefix, attrs.items(), localname))
+
+ for (namespace, attrlocalname), attrvalue in attrs._attrs.items():
+ lowernamespace = (namespace or '').lower()
+ prefix = self._matchnamespaces.get(lowernamespace, '')
+ if prefix:
+ attrlocalname = prefix + ':' + attrlocalname
+ attrsD[str(attrlocalname).lower()] = attrvalue
+ for qname in attrs.getQNames():
+ attrsD[str(qname).lower()] = attrs.getValueByQName(qname)
+ self.unknown_starttag(localname, attrsD.items())
+
+ def characters(self, text):
+ self.handle_data(text)
+
+ def endElementNS(self, name, qname):
+ namespace, localname = name
+ lowernamespace = str(namespace or '').lower()
+ if qname and qname.find(':') > 0:
+ givenprefix = qname.split(':')[0]
+ else:
+ givenprefix = ''
+ prefix = self._matchnamespaces.get(lowernamespace, givenprefix)
+ if prefix:
+ localname = prefix + ':' + localname
+ elif namespace and not qname: #Expat
+ for name,value in self.namespacesInUse.items():
+ if name and value == namespace:
+ localname = name + ':' + localname
+ break
+ localname = str(localname).lower()
+ self.unknown_endtag(localname)
+
+ def error(self, exc):
+ self.bozo = 1
+ self.exc = exc
+
+ def fatalError(self, exc):
+ self.error(exc)
+ raise exc
+
+class _BaseHTMLProcessor(sgmllib.SGMLParser):
+ special = re.compile('''[<>'"]''')
+ bare_ampersand = re.compile("&(?!#\d+;|#x[0-9a-fA-F]+;|\w+;)")
+ elements_no_end_tag = ['area', 'base', 'basefont', 'br', 'col', 'frame', 'hr',
+ 'img', 'input', 'isindex', 'link', 'meta', 'param']
+
+ def __init__(self, encoding, type):
+ self.encoding = encoding
+ self.type = type
+ if _debug: sys.stderr.write('entering BaseHTMLProcessor, encoding=%s\n' % self.encoding)
+ sgmllib.SGMLParser.__init__(self)
+
+ def reset(self):
+ self.pieces = []
+ sgmllib.SGMLParser.reset(self)
+
+ def _shorttag_replace(self, match):
+ tag = match.group(1)
+ if tag in self.elements_no_end_tag:
+ return '<' + tag + ' />'
+ else:
+ return '<' + tag + '></' + tag + '>'
+
+ def parse_starttag(self,i):
+ j=sgmllib.SGMLParser.parse_starttag(self, i)
+ if self.type == 'application/xhtml+xml':
+ if j>2 and self.rawdata[j-2:j]=='/>':
+ self.unknown_endtag(self.lasttag)
+ return j
+
+ def feed(self, data):
+ data = re.compile(r'<!((?!DOCTYPE|--|\[))', re.IGNORECASE).sub(r'<!\1', data)
+ #data = re.sub(r'<(\S+?)\s*?/>', self._shorttag_replace, data) # bug [ 1399464 ] Bad regexp for _shorttag_replace
+ data = re.sub(r'<([^<\s]+?)\s*/>', self._shorttag_replace, data)
+ data = data.replace(''', "'")
+ data = data.replace('"', '"')
+ if self.encoding and type(data) == type(u''):
+ data = data.encode(self.encoding)
+ sgmllib.SGMLParser.feed(self, data)
+ sgmllib.SGMLParser.close(self)
+
+ def normalize_attrs(self, attrs):
+ if not attrs: return attrs
+ # utility method to be called by descendants
+ attrs = dict([(k.lower(), v) for k, v in attrs]).items()
+ attrs = [(k, k in ('rel', 'type') and v.lower() or v) for k, v in attrs]
+ attrs.sort()
+ return attrs
+
+ def unknown_starttag(self, tag, attrs):
+ # called for each start tag
+ # attrs is a list of (attr, value) tuples
+ # e.g. for <pre class='screen'>, tag='pre', attrs=[('class', 'screen')]
+ if _debug: sys.stderr.write('_BaseHTMLProcessor, unknown_starttag, tag=%s\n' % tag)
+ uattrs = []
+ strattrs=''
+ if attrs:
+ for key, value in attrs:
+ value=value.replace('>','>').replace('<','<').replace('"','"')
+ value = self.bare_ampersand.sub("&", value)
+ # thanks to Kevin Marks for this breathtaking hack to deal with (valid) high-bit attribute values in UTF-8 feeds
+ if type(value) != type(u''):
+ try:
+ value = unicode(value, self.encoding)
+ except:
+ value = unicode(value, 'iso-8859-1')
+ uattrs.append((unicode(key, self.encoding), value))
+ strattrs = u''.join([u' %s="%s"' % (key, value) for key, value in uattrs])
+ if self.encoding:
+ try:
+ strattrs=strattrs.encode(self.encoding)
+ except:
+ pass
+ if tag in self.elements_no_end_tag:
+ self.pieces.append('<%(tag)s%(strattrs)s />' % locals())
+ else:
+ self.pieces.append('<%(tag)s%(strattrs)s>' % locals())
+
+ def unknown_endtag(self, tag):
+ # called for each end tag, e.g. for </pre>, tag will be 'pre'
+ # Reconstruct the original end tag.
+ if tag not in self.elements_no_end_tag:
+ self.pieces.append("</%(tag)s>" % locals())
+
+ def handle_charref(self, ref):
+ # called for each character reference, e.g. for ' ', ref will be '160'
+ # Reconstruct the original character reference.
+ if ref.startswith('x'):
+ value = unichr(int(ref[1:],16))
+ else:
+ value = unichr(int(ref))
+
+ if value in _cp1252.keys():
+ self.pieces.append('&#%s;' % hex(ord(_cp1252[value]))[1:])
+ else:
+ self.pieces.append('&#%(ref)s;' % locals())
+
+ def handle_entityref(self, ref):
+ # called for each entity reference, e.g. for '©', ref will be 'copy'
+ # Reconstruct the original entity reference.
+ if name2codepoint.has_key(ref):
+ self.pieces.append('&%(ref)s;' % locals())
+ else:
+ self.pieces.append('&%(ref)s' % locals())
+
+ def handle_data(self, text):
+ # called for each block of plain text, i.e. outside of any tag and
+ # not containing any character or entity references
+ # Store the original text verbatim.
+ if _debug: sys.stderr.write('_BaseHTMLProcessor, handle_text, text=%s\n' % text)
+ self.pieces.append(text)
+
+ def handle_comment(self, text):
+ # called for each HTML comment, e.g. <!-- insert Javascript code here -->
+ # Reconstruct the original comment.
+ self.pieces.append('<!--%(text)s-->' % locals())
+
+ def handle_pi(self, text):
+ # called for each processing instruction, e.g. <?instruction>
+ # Reconstruct original processing instruction.
+ self.pieces.append('<?%(text)s>' % locals())
+
+ def handle_decl(self, text):
+ # called for the DOCTYPE, if present, e.g.
+ # <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
+ # "http://www.w3.org/TR/html4/loose.dtd">
+ # Reconstruct original DOCTYPE
+ self.pieces.append('<!%(text)s>' % locals())
+
+ _new_declname_match = re.compile(r'[a-zA-Z][-_.a-zA-Z0-9:]*\s*').match
+ def _scan_name(self, i, declstartpos):
+ rawdata = self.rawdata
+ n = len(rawdata)
+ if i == n:
+ return None, -1
+ m = self._new_declname_match(rawdata, i)
+ if m:
+ s = m.group()
+ name = s.strip()
+ if (i + len(s)) == n:
+ return None, -1 # end of buffer
+ return name.lower(), m.end()
+ else:
+ self.handle_data(rawdata)
+# self.updatepos(declstartpos, i)
+ return None, -1
+
+ def convert_charref(self, name):
+ return '&#%s;' % name
+
+ def convert_entityref(self, name):
+ return '&%s;' % name
+
+ def output(self):
+ '''Return processed HTML as a single string'''
+ return ''.join([str(p) for p in self.pieces])
+
+class _LooseFeedParser(_FeedParserMixin, _BaseHTMLProcessor):
+ def __init__(self, baseuri, baselang, encoding, entities):
+ sgmllib.SGMLParser.__init__(self)
+ _FeedParserMixin.__init__(self, baseuri, baselang, encoding)
+ _BaseHTMLProcessor.__init__(self, encoding, 'application/xhtml+xml')
+ self.entities=entities
+
+ def decodeEntities(self, element, data):
+ data = data.replace('<', '<')
+ data = data.replace('<', '<')
+ data = data.replace('<', '<')
+ data = data.replace('>', '>')
+ data = data.replace('>', '>')
+ data = data.replace('>', '>')
+ data = data.replace('&', '&')
+ data = data.replace('&', '&')
+ data = data.replace('"', '"')
+ data = data.replace('"', '"')
+ data = data.replace(''', ''')
+ data = data.replace(''', ''')
+ if self.contentparams.has_key('type') and not self.contentparams.get('type', 'xml').endswith('xml'):
+ data = data.replace('<', '<')
+ data = data.replace('>', '>')
+ data = data.replace('&', '&')
+ data = data.replace('"', '"')
+ data = data.replace(''', "'")
+ return data
+
+ def strattrs(self, attrs):
+ return ''.join([' %s="%s"' % (n,v.replace('"','"')) for n,v in attrs])
+
+class _MicroformatsParser:
+ STRING = 1
+ DATE = 2
+ URI = 3
+ NODE = 4
+ EMAIL = 5
+
+ known_xfn_relationships = ['contact', 'acquaintance', 'friend', 'met', 'co-worker', 'coworker', 'colleague', 'co-resident', 'coresident', 'neighbor', 'child', 'parent', 'sibling', 'brother', 'sister', 'spouse', 'wife', 'husband', 'kin', 'relative', 'muse', 'crush', 'date', 'sweetheart', 'me']
+ known_binary_extensions = ['zip','rar','exe','gz','tar','tgz','tbz2','bz2','z','7z','dmg','img','sit','sitx','hqx','deb','rpm','bz2','jar','rar','iso','bin','msi','mp2','mp3','ogg','ogm','mp4','m4v','m4a','avi','wma','wmv']
+
+ def __init__(self, data, baseuri, encoding):
+ self.document = BeautifulSoup.BeautifulSoup(data)
+ self.baseuri = baseuri
+ self.encoding = encoding
+ if type(data) == type(u''):
+ data = data.encode(encoding)
+ self.tags = []
+ self.enclosures = []
+ self.xfn = []
+ self.vcard = None
+
+ def vcardEscape(self, s):
+ if type(s) in (type(''), type(u'')):
+ s = s.replace(',', '\\,').replace(';', '\\;').replace('\n', '\\n')
+ return s
+
+ def vcardFold(self, s):
+ s = re.sub(';+$', '', s)
+ sFolded = ''
+ iMax = 75
+ sPrefix = ''
+ while len(s) > iMax:
+ sFolded += sPrefix + s[:iMax] + '\n'
+ s = s[iMax:]
+ sPrefix = ' '
+ iMax = 74
+ sFolded += sPrefix + s
+ return sFolded
+
+ def normalize(self, s):
+ return re.sub(r'\s+', ' ', s).strip()
+
+ def unique(self, aList):
+ results = []
+ for element in aList:
+ if element not in results:
+ results.append(element)
+ return results
+
+ def toISO8601(self, dt):
+ return time.strftime('%Y-%m-%dT%H:%M:%SZ', dt)
+
+ def getPropertyValue(self, elmRoot, sProperty, iPropertyType=4, bAllowMultiple=0, bAutoEscape=0):
+ all = lambda x: 1
+ sProperty = sProperty.lower()
+ bFound = 0
+ bNormalize = 1
+ propertyMatch = {'class': re.compile(r'\b%s\b' % sProperty)}
+ if bAllowMultiple and (iPropertyType != self.NODE):
+ snapResults = []
+ containers = elmRoot(['ul', 'ol'], propertyMatch)
+ for container in containers:
+ snapResults.extend(container('li'))
+ bFound = (len(snapResults) != 0)
+ if not bFound:
+ snapResults = elmRoot(all, propertyMatch)
+ bFound = (len(snapResults) != 0)
+ if (not bFound) and (sProperty == 'value'):
+ snapResults = elmRoot('pre')
+ bFound = (len(snapResults) != 0)
+ bNormalize = not bFound
+ if not bFound:
+ snapResults = [elmRoot]
+ bFound = (len(snapResults) != 0)
+ arFilter = []
+ if sProperty == 'vcard':
+ snapFilter = elmRoot(all, propertyMatch)
+ for node in snapFilter:
+ if node.findParent(all, propertyMatch):
+ arFilter.append(node)
+ arResults = []
+ for node in snapResults:
+ if node not in arFilter:
+ arResults.append(node)
+ bFound = (len(arResults) != 0)
+ if not bFound:
+ if bAllowMultiple: return []
+ elif iPropertyType == self.STRING: return ''
+ elif iPropertyType == self.DATE: return None
+ elif iPropertyType == self.URI: return ''
+ elif iPropertyType == self.NODE: return None
+ else: return None
+ arValues = []
+ for elmResult in arResults:
+ sValue = None
+ if iPropertyType == self.NODE:
+ if bAllowMultiple:
+ arValues.append(elmResult)
+ continue
+ else:
+ return elmResult
+ sNodeName = elmResult.name.lower()
+ if (iPropertyType == self.EMAIL) and (sNodeName == 'a'):
+ sValue = (elmResult.get('href') or '').split('mailto:').pop().split('?')[0]
+ if sValue:
+ sValue = bNormalize and self.normalize(sValue) or sValue.strip()
+ if (not sValue) and (sNodeName == 'abbr'):
+ sValue = elmResult.get('title')
+ if sValue:
+ sValue = bNormalize and self.normalize(sValue) or sValue.strip()
+ if (not sValue) and (iPropertyType == self.URI):
+ if sNodeName == 'a': sValue = elmResult.get('href')
+ elif sNodeName == 'img': sValue = elmResult.get('src')
+ elif sNodeName == 'object': sValue = elmResult.get('data')
+ if sValue:
+ sValue = bNormalize and self.normalize(sValue) or sValue.strip()
+ if (not sValue) and (sNodeName == 'img'):
+ sValue = elmResult.get('alt')
+ if sValue:
+ sValue = bNormalize and self.normalize(sValue) or sValue.strip()
+ if not sValue:
+ sValue = elmResult.renderContents()
+ sValue = re.sub(r'<\S[^>]*>', '', sValue)
+ sValue = sValue.replace('\r\n', '\n')
+ sValue = sValue.replace('\r', '\n')
+ if sValue:
+ sValue = bNormalize and self.normalize(sValue) or sValue.strip()
+ if not sValue: continue
+ if iPropertyType == self.DATE:
+ sValue = _parse_date_iso8601(sValue)
+ if bAllowMultiple:
+ arValues.append(bAutoEscape and self.vcardEscape(sValue) or sValue)
+ else:
+ return bAutoEscape and self.vcardEscape(sValue) or sValue
+ return arValues
+
+ def findVCards(self, elmRoot, bAgentParsing=0):
+ sVCards = ''
+
+ if not bAgentParsing:
+ arCards = self.getPropertyValue(elmRoot, 'vcard', bAllowMultiple=1)
+ else:
+ arCards = [elmRoot]
+
+ for elmCard in arCards:
+ arLines = []
+
+ def processSingleString(sProperty):
+ sValue = self.getPropertyValue(elmCard, sProperty, self.STRING, bAutoEscape=1)
+ if sValue:
+ arLines.append(self.vcardFold(sProperty.upper() + ':' + sValue))
+ return sValue or ''
+
+ def processSingleURI(sProperty):
+ sValue = self.getPropertyValue(elmCard, sProperty, self.URI)
+ if sValue:
+ sContentType = ''
+ sEncoding = ''
+ sValueKey = ''
+ if sValue.startswith('data:'):
+ sEncoding = ';ENCODING=b'
+ sContentType = sValue.split(';')[0].split('/').pop()
+ sValue = sValue.split(',', 1).pop()
+ else:
+ elmValue = self.getPropertyValue(elmCard, sProperty)
+ if elmValue:
+ if sProperty != 'url':
+ sValueKey = ';VALUE=uri'
+ sContentType = elmValue.get('type', '').strip().split('/').pop().strip()
+ sContentType = sContentType.upper()
+ if sContentType == 'OCTET-STREAM':
+ sContentType = ''
+ if sContentType:
+ sContentType = ';TYPE=' + sContentType.upper()
+ arLines.append(self.vcardFold(sProperty.upper() + sEncoding + sContentType + sValueKey + ':' + sValue))
+
+ def processTypeValue(sProperty, arDefaultType, arForceType=None):
+ arResults = self.getPropertyValue(elmCard, sProperty, bAllowMultiple=1)
+ for elmResult in arResults:
+ arType = self.getPropertyValue(elmResult, 'type', self.STRING, 1, 1)
+ if arForceType:
+ arType = self.unique(arForceType + arType)
+ if not arType:
+ arType = arDefaultType
+ sValue = self.getPropertyValue(elmResult, 'value', self.EMAIL, 0)
+ if sValue:
+ arLines.append(self.vcardFold(sProperty.upper() + ';TYPE=' + ','.join(arType) + ':' + sValue))
+
+ # AGENT
+ # must do this before all other properties because it is destructive
+ # (removes nested class="vcard" nodes so they don't interfere with
+ # this vcard's other properties)
+ arAgent = self.getPropertyValue(elmCard, 'agent', bAllowMultiple=1)
+ for elmAgent in arAgent:
+ if re.compile(r'\bvcard\b').search(elmAgent.get('class')):
+ sAgentValue = self.findVCards(elmAgent, 1) + '\n'
+ sAgentValue = sAgentValue.replace('\n', '\\n')
+ sAgentValue = sAgentValue.replace(';', '\\;')
+ if sAgentValue:
+ arLines.append(self.vcardFold('AGENT:' + sAgentValue))
+ elmAgent['class'] = ''
+ elmAgent.contents = []
+ else:
+ sAgentValue = self.getPropertyValue(elmAgent, 'value', self.URI, bAutoEscape=1);
+ if sAgentValue:
+ arLines.append(self.vcardFold('AGENT;VALUE=uri:' + sAgentValue))
+
+ # FN (full name)
+ sFN = processSingleString('fn')
+
+ # N (name)
+ elmName = self.getPropertyValue(elmCard, 'n')
+ if elmName:
+ sFamilyName = self.getPropertyValue(elmName, 'family-name', self.STRING, bAutoEscape=1)
+ sGivenName = self.getPropertyValue(elmName, 'given-name', self.STRING, bAutoEscape=1)
+ arAdditionalNames = self.getPropertyValue(elmName, 'additional-name', self.STRING, 1, 1) + self.getPropertyValue(elmName, 'additional-names', self.STRING, 1, 1)
+ arHonorificPrefixes = self.getPropertyValue(elmName, 'honorific-prefix', self.STRING, 1, 1) + self.getPropertyValue(elmName, 'honorific-prefixes', self.STRING, 1, 1)
+ arHonorificSuffixes = self.getPropertyValue(elmName, 'honorific-suffix', self.STRING, 1, 1) + self.getPropertyValue(elmName, 'honorific-suffixes', self.STRING, 1, 1)
+ arLines.append(self.vcardFold('N:' + sFamilyName + ';' +
+ sGivenName + ';' +
+ ','.join(arAdditionalNames) + ';' +
+ ','.join(arHonorificPrefixes) + ';' +
+ ','.join(arHonorificSuffixes)))
+ elif sFN:
+ # implied "N" optimization
+ # http://microformats.org/wiki/hcard#Implied_.22N.22_Optimization
+ arNames = self.normalize(sFN).split()
+ if len(arNames) == 2:
+ bFamilyNameFirst = (arNames[0].endswith(',') or
+ len(arNames[1]) == 1 or
+ ((len(arNames[1]) == 2) and (arNames[1].endswith('.'))))
+ if bFamilyNameFirst:
+ arLines.append(self.vcardFold('N:' + arNames[0] + ';' + arNames[1]))
+ else:
+ arLines.append(self.vcardFold('N:' + arNames[1] + ';' + arNames[0]))
+
+ # SORT-STRING
+ sSortString = self.getPropertyValue(elmCard, 'sort-string', self.STRING, bAutoEscape=1)
+ if sSortString:
+ arLines.append(self.vcardFold('SORT-STRING:' + sSortString))
+
+ # NICKNAME
+ arNickname = self.getPropertyValue(elmCard, 'nickname', self.STRING, 1, 1)
+ if arNickname:
+ arLines.append(self.vcardFold('NICKNAME:' + ','.join(arNickname)))
+
+ # PHOTO
+ processSingleURI('photo')
+
+ # BDAY
+ dtBday = self.getPropertyValue(elmCard, 'bday', self.DATE)
+ if dtBday:
+ arLines.append(self.vcardFold('BDAY:' + self.toISO8601(dtBday)))
+
+ # ADR (address)
+ arAdr = self.getPropertyValue(elmCard, 'adr', bAllowMultiple=1)
+ for elmAdr in arAdr:
+ arType = self.getPropertyValue(elmAdr, 'type', self.STRING, 1, 1)
+ if not arType:
+ arType = ['intl','postal','parcel','work'] # default adr types, see RFC 2426 section 3.2.1
+ sPostOfficeBox = self.getPropertyValue(elmAdr, 'post-office-box', self.STRING, 0, 1)
+ sExtendedAddress = self.getPropertyValue(elmAdr, 'extended-address', self.STRING, 0, 1)
+ sStreetAddress = self.getPropertyValue(elmAdr, 'street-address', self.STRING, 0, 1)
+ sLocality = self.getPropertyValue(elmAdr, 'locality', self.STRING, 0, 1)
+ sRegion = self.getPropertyValue(elmAdr, 'region', self.STRING, 0, 1)
+ sPostalCode = self.getPropertyValue(elmAdr, 'postal-code', self.STRING, 0, 1)
+ sCountryName = self.getPropertyValue(elmAdr, 'country-name', self.STRING, 0, 1)
+ arLines.append(self.vcardFold('ADR;TYPE=' + ','.join(arType) + ':' +
+ sPostOfficeBox + ';' +
+ sExtendedAddress + ';' +
+ sStreetAddress + ';' +
+ sLocality + ';' +
+ sRegion + ';' +
+ sPostalCode + ';' +
+ sCountryName))
+
+ # LABEL
+ processTypeValue('label', ['intl','postal','parcel','work'])
+
+ # TEL (phone number)
+ processTypeValue('tel', ['voice'])
+
+ # EMAIL
+ processTypeValue('email', ['internet'], ['internet'])
+
+ # MAILER
+ processSingleString('mailer')
+
+ # TZ (timezone)
+ processSingleString('tz')
+
+ # GEO (geographical information)
+ elmGeo = self.getPropertyValue(elmCard, 'geo')
+ if elmGeo:
+ sLatitude = self.getPropertyValue(elmGeo, 'latitude', self.STRING, 0, 1)
+ sLongitude = self.getPropertyValue(elmGeo, 'longitude', self.STRING, 0, 1)
+ arLines.append(self.vcardFold('GEO:' + sLatitude + ';' + sLongitude))
+
+ # TITLE
+ processSingleString('title')
+
+ # ROLE
+ processSingleString('role')
+
+ # LOGO
+ processSingleURI('logo')
+
+ # ORG (organization)
+ elmOrg = self.getPropertyValue(elmCard, 'org')
+ if elmOrg:
+ sOrganizationName = self.getPropertyValue(elmOrg, 'organization-name', self.STRING, 0, 1)
+ if not sOrganizationName:
+ # implied "organization-name" optimization
+ # http://microformats.org/wiki/hcard#Implied_.22organization-name.22_Optimization
+ sOrganizationName = self.getPropertyValue(elmCard, 'org', self.STRING, 0, 1)
+ if sOrganizationName:
+ arLines.append(self.vcardFold('ORG:' + sOrganizationName))
+ else:
+ arOrganizationUnit = self.getPropertyValue(elmOrg, 'organization-unit', self.STRING, 1, 1)
+ arLines.append(self.vcardFold('ORG:' + sOrganizationName + ';' + ';'.join(arOrganizationUnit)))
+
+ # CATEGORY
+ arCategory = self.getPropertyValue(elmCard, 'category', self.STRING, 1, 1) + self.getPropertyValue(elmCard, 'categories', self.STRING, 1, 1)
+ if arCategory:
+ arLines.append(self.vcardFold('CATEGORIES:' + ','.join(arCategory)))
+
+ # NOTE
+ processSingleString('note')
+
+ # REV
+ processSingleString('rev')
+
+ # SOUND
+ processSingleURI('sound')
+
+ # UID
+ processSingleString('uid')
+
+ # URL
+ processSingleURI('url')
+
+ # CLASS
+ processSingleString('class')
+
+ # KEY
+ processSingleURI('key')
+
+ if arLines:
+ arLines = ['BEGIN:vCard','VERSION:3.0'] + arLines + ['END:vCard']
+ sVCards += '\n'.join(arLines) + '\n'
+
+ return sVCards.strip()
+
+ def isProbablyDownloadable(self, elm):
+ attrsD = elm.attrMap
+ if not attrsD.has_key('href'): return 0
+ linktype = attrsD.get('type', '').strip()
+ if linktype.startswith('audio/') or \
+ linktype.startswith('video/') or \
+ (linktype.startswith('application/') and not linktype.endswith('xml')):
+ return 1
+ path = urlparse.urlparse(attrsD['href'])[2]
+ if path.find('.') == -1: return 0
+ fileext = path.split('.').pop().lower()
+ return fileext in self.known_binary_extensions
+
+ def findTags(self):
+ all = lambda x: 1
+ for elm in self.document(all, {'rel': re.compile(r'\btag\b')}):
+ href = elm.get('href')
+ if not href: continue
+ urlscheme, domain, path, params, query, fragment = \
+ urlparse.urlparse(_urljoin(self.baseuri, href))
+ segments = path.split('/')
+ tag = segments.pop()
+ if not tag:
+ tag = segments.pop()
+ tagscheme = urlparse.urlunparse((urlscheme, domain, '/'.join(segments), '', '', ''))
+ if not tagscheme.endswith('/'):
+ tagscheme += '/'
+ self.tags.append(FeedParserDict({"term": tag, "scheme": tagscheme, "label": elm.string or ''}))
+
+ def findEnclosures(self):
+ all = lambda x: 1
+ enclosure_match = re.compile(r'\benclosure\b')
+ for elm in self.document(all, {'href': re.compile(r'.+')}):
+ if not enclosure_match.search(elm.get('rel', '')) and not self.isProbablyDownloadable(elm): continue
+ if elm.attrMap not in self.enclosures:
+ self.enclosures.append(elm.attrMap)
+ if elm.string and not elm.get('title'):
+ self.enclosures[-1]['title'] = elm.string
+
+ def findXFN(self):
+ all = lambda x: 1
+ for elm in self.document(all, {'rel': re.compile('.+'), 'href': re.compile('.+')}):
+ rels = elm.get('rel', '').split()
+ xfn_rels = []
+ for rel in rels:
+ if rel in self.known_xfn_relationships:
+ xfn_rels.append(rel)
+ if xfn_rels:
+ self.xfn.append({"relationships": xfn_rels, "href": elm.get('href', ''), "name": elm.string})
+
+def _parseMicroformats(htmlSource, baseURI, encoding):
+ if not BeautifulSoup: return
+ if _debug: sys.stderr.write('entering _parseMicroformats\n')
+ p = _MicroformatsParser(htmlSource, baseURI, encoding)
+ p.vcard = p.findVCards(p.document)
+ p.findTags()
+ p.findEnclosures()
+ p.findXFN()
+ return {"tags": p.tags, "enclosures": p.enclosures, "xfn": p.xfn, "vcard": p.vcard}
+
+class _RelativeURIResolver(_BaseHTMLProcessor):
+ relative_uris = [('a', 'href'),
+ ('applet', 'codebase'),
+ ('area', 'href'),
+ ('blockquote', 'cite'),
+ ('body', 'background'),
+ ('del', 'cite'),
+ ('form', 'action'),
+ ('frame', 'longdesc'),
+ ('frame', 'src'),
+ ('iframe', 'longdesc'),
+ ('iframe', 'src'),
+ ('head', 'profile'),
+ ('img', 'longdesc'),
+ ('img', 'src'),
+ ('img', 'usemap'),
+ ('input', 'src'),
+ ('input', 'usemap'),
+ ('ins', 'cite'),
+ ('link', 'href'),
+ ('object', 'classid'),
+ ('object', 'codebase'),
+ ('object', 'data'),
+ ('object', 'usemap'),
+ ('q', 'cite'),
+ ('script', 'src')]
+
+ def __init__(self, baseuri, encoding, type):
+ _BaseHTMLProcessor.__init__(self, encoding, type)
+ self.baseuri = baseuri
+
+ def resolveURI(self, uri):
+ return _urljoin(self.baseuri, uri.strip())
+
+ def unknown_starttag(self, tag, attrs):
+ attrs = self.normalize_attrs(attrs)
+ attrs = [(key, ((tag, key) in self.relative_uris) and self.resolveURI(value) or value) for key, value in attrs]
+ _BaseHTMLProcessor.unknown_starttag(self, tag, attrs)
+
+def _resolveRelativeURIs(htmlSource, baseURI, encoding, type):
+ if _debug: sys.stderr.write('entering _resolveRelativeURIs\n')
+ p = _RelativeURIResolver(baseURI, encoding, type)
+ p.feed(htmlSource)
+ return p.output()
+
+class _HTMLSanitizer(_BaseHTMLProcessor):
+ acceptable_elements = ['a', 'abbr', 'acronym', 'address', 'area', 'article',
+ 'aside', 'audio', 'b', 'big', 'blockquote', 'br', 'button', 'canvas',
+ 'caption', 'center', 'cite', 'code', 'col', 'colgroup', 'command',
+ 'datagrid', 'datalist', 'dd', 'del', 'details', 'dfn', 'dialog', 'dir',
+ 'div', 'dl', 'dt', 'em', 'event-source', 'fieldset', 'figure', 'footer',
+ 'font', 'form', 'header', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'hr', 'i',
+ 'img', 'input', 'ins', 'keygen', 'kbd', 'label', 'legend', 'li', 'm', 'map',
+ 'menu', 'meter', 'multicol', 'nav', 'nextid', 'ol', 'output', 'optgroup',
+ 'option', 'p', 'pre', 'progress', 'q', 's', 'samp', 'section', 'select',
+ 'small', 'sound', 'source', 'spacer', 'span', 'strike', 'strong', 'sub',
+ 'sup', 'table', 'tbody', 'td', 'textarea', 'time', 'tfoot', 'th', 'thead',
+ 'tr', 'tt', 'u', 'ul', 'var', 'video', 'noscript']
+
+ acceptable_attributes = ['abbr', 'accept', 'accept-charset', 'accesskey',
+ 'action', 'align', 'alt', 'autoplay', 'autocomplete', 'autofocus', 'axis',
+ 'background', 'balance', 'bgcolor', 'bgproperties', 'border',
+ 'bordercolor', 'bordercolordark', 'bordercolorlight', 'bottompadding',
+ 'cellpadding', 'cellspacing', 'ch', 'challenge', 'char', 'charoff',
+ 'choff', 'charset', 'checked', 'cite', 'class', 'clear', 'color', 'cols',
+ 'colspan', 'compact', 'contenteditable', 'coords', 'data', 'datafld',
+ 'datapagesize', 'datasrc', 'datetime', 'default', 'delay', 'dir',
+ 'disabled', 'draggable', 'dynsrc', 'enctype', 'end', 'face', 'for',
+ 'form', 'frame', 'galleryimg', 'gutter', 'headers', 'height', 'hidefocus',
+ 'hidden', 'high', 'href', 'hreflang', 'hspace', 'icon', 'id', 'inputmode',
+ 'ismap', 'keytype', 'label', 'leftspacing', 'lang', 'list', 'longdesc',
+ 'loop', 'loopcount', 'loopend', 'loopstart', 'low', 'lowsrc', 'max',
+ 'maxlength', 'media', 'method', 'min', 'multiple', 'name', 'nohref',
+ 'noshade', 'nowrap', 'open', 'optimum', 'pattern', 'ping', 'point-size',
+ 'prompt', 'pqg', 'radiogroup', 'readonly', 'rel', 'repeat-max',
+ 'repeat-min', 'replace', 'required', 'rev', 'rightspacing', 'rows',
+ 'rowspan', 'rules', 'scope', 'selected', 'shape', 'size', 'span', 'src',
+ 'start', 'step', 'summary', 'suppress', 'tabindex', 'target', 'template',
+ 'title', 'toppadding', 'type', 'unselectable', 'usemap', 'urn', 'valign',
+ 'value', 'variable', 'volume', 'vspace', 'vrml', 'width', 'wrap',
+ 'xml:lang']
+
+ unacceptable_elements_with_end_tag = ['script', 'applet', 'style']
+
+ acceptable_css_properties = ['azimuth', 'background-color',
+ 'border-bottom-color', 'border-collapse', 'border-color',
+ 'border-left-color', 'border-right-color', 'border-top-color', 'clear',
+ 'color', 'cursor', 'direction', 'display', 'elevation', 'float', 'font',
+ 'font-family', 'font-size', 'font-style', 'font-variant', 'font-weight',
+ 'height', 'letter-spacing', 'line-height', 'overflow', 'pause',
+ 'pause-after', 'pause-before', 'pitch', 'pitch-range', 'richness',
+ 'speak', 'speak-header', 'speak-numeral', 'speak-punctuation',
+ 'speech-rate', 'stress', 'text-align', 'text-decoration', 'text-indent',
+ 'unicode-bidi', 'vertical-align', 'voice-family', 'volume',
+ 'white-space', 'width']
+
+ # survey of common keywords found in feeds
+ acceptable_css_keywords = ['auto', 'aqua', 'black', 'block', 'blue',
+ 'bold', 'both', 'bottom', 'brown', 'center', 'collapse', 'dashed',
+ 'dotted', 'fuchsia', 'gray', 'green', '!important', 'italic', 'left',
+ 'lime', 'maroon', 'medium', 'none', 'navy', 'normal', 'nowrap', 'olive',
+ 'pointer', 'purple', 'red', 'right', 'solid', 'silver', 'teal', 'top',
+ 'transparent', 'underline', 'white', 'yellow']
+
+ valid_css_values = re.compile('^(#[0-9a-f]+|rgb\(\d+%?,\d*%?,?\d*%?\)?|' +
+ '\d{0,2}\.?\d{0,2}(cm|em|ex|in|mm|pc|pt|px|%|,|\))?)$')
+
+ mathml_elements = ['annotation', 'annotation-xml', 'maction', 'math',
+ 'merror', 'mfenced', 'mfrac', 'mi', 'mmultiscripts', 'mn', 'mo', 'mover', 'mpadded',
+ 'mphantom', 'mprescripts', 'mroot', 'mrow', 'mspace', 'msqrt', 'mstyle',
+ 'msub', 'msubsup', 'msup', 'mtable', 'mtd', 'mtext', 'mtr', 'munder',
+ 'munderover', 'none', 'semantics']
+
+ mathml_attributes = ['actiontype', 'align', 'columnalign', 'columnalign',
+ 'columnalign', 'close', 'columnlines', 'columnspacing', 'columnspan', 'depth',
+ 'display', 'displaystyle', 'encoding', 'equalcolumns', 'equalrows',
+ 'fence', 'fontstyle', 'fontweight', 'frame', 'height', 'linethickness',
+ 'lspace', 'mathbackground', 'mathcolor', 'mathvariant', 'mathvariant',
+ 'maxsize', 'minsize', 'open', 'other', 'rowalign', 'rowalign', 'rowalign',
+ 'rowlines', 'rowspacing', 'rowspan', 'rspace', 'scriptlevel', 'selection',
+ 'separator', 'separators', 'stretchy', 'width', 'width', 'xlink:href',
+ 'xlink:show', 'xlink:type', 'xmlns', 'xmlns:xlink']
+
+ # svgtiny - foreignObject + linearGradient + radialGradient + stop
+ svg_elements = ['a', 'animate', 'animateColor', 'animateMotion',
+ 'animateTransform', 'circle', 'defs', 'desc', 'ellipse', 'foreignObject',
+ 'font-face', 'font-face-name', 'font-face-src', 'g', 'glyph', 'hkern',
+ 'linearGradient', 'line', 'marker', 'metadata', 'missing-glyph', 'mpath',
+ 'path', 'polygon', 'polyline', 'radialGradient', 'rect', 'set', 'stop',
+ 'svg', 'switch', 'text', 'title', 'tspan', 'use']
+
+ # svgtiny + class + opacity + offset + xmlns + xmlns:xlink
+ svg_attributes = ['accent-height', 'accumulate', 'additive', 'alphabetic',
+ 'arabic-form', 'ascent', 'attributeName', 'attributeType',
+ 'baseProfile', 'bbox', 'begin', 'by', 'calcMode', 'cap-height',
+ 'class', 'color', 'color-rendering', 'content', 'cx', 'cy', 'd', 'dx',
+ 'dy', 'descent', 'display', 'dur', 'end', 'fill', 'fill-opacity',
+ 'fill-rule', 'font-family', 'font-size', 'font-stretch', 'font-style',
+ 'font-variant', 'font-weight', 'from', 'fx', 'fy', 'g1', 'g2',
+ 'glyph-name', 'gradientUnits', 'hanging', 'height', 'horiz-adv-x',
+ 'horiz-origin-x', 'id', 'ideographic', 'k', 'keyPoints', 'keySplines',
+ 'keyTimes', 'lang', 'mathematical', 'marker-end', 'marker-mid',
+ 'marker-start', 'markerHeight', 'markerUnits', 'markerWidth', 'max',
+ 'min', 'name', 'offset', 'opacity', 'orient', 'origin',
+ 'overline-position', 'overline-thickness', 'panose-1', 'path',
+ 'pathLength', 'points', 'preserveAspectRatio', 'r', 'refX', 'refY',
+ 'repeatCount', 'repeatDur', 'requiredExtensions', 'requiredFeatures',
+ 'restart', 'rotate', 'rx', 'ry', 'slope', 'stemh', 'stemv',
+ 'stop-color', 'stop-opacity', 'strikethrough-position',
+ 'strikethrough-thickness', 'stroke', 'stroke-dasharray',
+ 'stroke-dashoffset', 'stroke-linecap', 'stroke-linejoin',
+ 'stroke-miterlimit', 'stroke-opacity', 'stroke-width', 'systemLanguage',
+ 'target', 'text-anchor', 'to', 'transform', 'type', 'u1', 'u2',
+ 'underline-position', 'underline-thickness', 'unicode', 'unicode-range',
+ 'units-per-em', 'values', 'version', 'viewBox', 'visibility', 'width',
+ 'widths', 'x', 'x-height', 'x1', 'x2', 'xlink:actuate', 'xlink:arcrole',
+ 'xlink:href', 'xlink:role', 'xlink:show', 'xlink:title', 'xlink:type',
+ 'xml:base', 'xml:lang', 'xml:space', 'xmlns', 'xmlns:xlink', 'y', 'y1',
+ 'y2', 'zoomAndPan']
+
+ svg_attr_map = None
+ svg_elem_map = None
+
+ acceptable_svg_properties = [ 'fill', 'fill-opacity', 'fill-rule',
+ 'stroke', 'stroke-width', 'stroke-linecap', 'stroke-linejoin',
+ 'stroke-opacity']
+
+ def reset(self):
+ _BaseHTMLProcessor.reset(self)
+ self.unacceptablestack = 0
+ self.mathmlOK = 0
+ self.svgOK = 0
+
+ def unknown_starttag(self, tag, attrs):
+ acceptable_attributes = self.acceptable_attributes
+ keymap = {}
+ if not tag in self.acceptable_elements or self.svgOK:
+ if tag in self.unacceptable_elements_with_end_tag:
+ self.unacceptablestack += 1
+
+ # not otherwise acceptable, perhaps it is MathML or SVG?
+ if tag=='math' and ('xmlns','http://www.w3.org/1998/Math/MathML') in attrs:
+ self.mathmlOK += 1
+ if tag=='svg' and ('xmlns','http://www.w3.org/2000/svg') in attrs:
+ self.svgOK += 1
+
+ # chose acceptable attributes based on tag class, else bail
+ if self.mathmlOK and tag in self.mathml_elements:
+ acceptable_attributes = self.mathml_attributes
+ elif self.svgOK and tag in self.svg_elements:
+ # for most vocabularies, lowercasing is a good idea. Many
+ # svg elements, however, are camel case
+ if not self.svg_attr_map:
+ lower=[attr.lower() for attr in self.svg_attributes]
+ mix=[a for a in self.svg_attributes if a not in lower]
+ self.svg_attributes = lower
+ self.svg_attr_map = dict([(a.lower(),a) for a in mix])
+
+ lower=[attr.lower() for attr in self.svg_elements]
+ mix=[a for a in self.svg_elements if a not in lower]
+ self.svg_elements = lower
+ self.svg_elem_map = dict([(a.lower(),a) for a in mix])
+ acceptable_attributes = self.svg_attributes
+ tag = self.svg_elem_map.get(tag,tag)
+ keymap = self.svg_attr_map
+ elif not tag in self.acceptable_elements:
+ return
+
+ # declare xlink namespace, if needed
+ if self.mathmlOK or self.svgOK:
+ if filter(lambda (n,v): n.startswith('xlink:'),attrs):
+ if not ('xmlns:xlink','http://www.w3.org/1999/xlink') in attrs:
+ attrs.append(('xmlns:xlink','http://www.w3.org/1999/xlink'))
+
+ clean_attrs = []
+ for key, value in self.normalize_attrs(attrs):
+ if key in acceptable_attributes:
+ key=keymap.get(key,key)
+ clean_attrs.append((key,value))
+ elif key=='style':
+ clean_value = self.sanitize_style(value)
+ if clean_value: clean_attrs.append((key,clean_value))
+ _BaseHTMLProcessor.unknown_starttag(self, tag, clean_attrs)
+
+ def unknown_endtag(self, tag):
+ if not tag in self.acceptable_elements:
+ if tag in self.unacceptable_elements_with_end_tag:
+ self.unacceptablestack -= 1
+ if self.mathmlOK and tag in self.mathml_elements:
+ if tag == 'math' and self.mathmlOK: self.mathmlOK -= 1
+ elif self.svgOK and tag in self.svg_elements:
+ tag = self.svg_elem_map.get(tag,tag)
+ if tag == 'svg' and self.svgOK: self.svgOK -= 1
+ else:
+ return
+ _BaseHTMLProcessor.unknown_endtag(self, tag)
+
+ def handle_pi(self, text):
+ pass
+
+ def handle_decl(self, text):
+ pass
+
+ def handle_data(self, text):
+ if not self.unacceptablestack:
+ _BaseHTMLProcessor.handle_data(self, text)
+
+ def sanitize_style(self, style):
+ # disallow urls
+ style=re.compile('url\s*\(\s*[^\s)]+?\s*\)\s*').sub(' ',style)
+
+ # gauntlet
+ if not re.match("""^([:,;#%.\sa-zA-Z0-9!]|\w-\w|'[\s\w]+'|"[\s\w]+"|\([\d,\s]+\))*$""", style): return ''
+ if not re.match("^(\s*[-\w]+\s*:\s*[^:;]*(;|$))*$", style): return ''
+
+ clean = []
+ for prop,value in re.findall("([-\w]+)\s*:\s*([^:;]*)",style):
+ if not value: continue
+ if prop.lower() in self.acceptable_css_properties:
+ clean.append(prop + ': ' + value + ';')
+ elif prop.split('-')[0].lower() in ['background','border','margin','padding']:
+ for keyword in value.split():
+ if not keyword in self.acceptable_css_keywords and \
+ not self.valid_css_values.match(keyword):
+ break
+ else:
+ clean.append(prop + ': ' + value + ';')
+ elif self.svgOK and prop.lower() in self.acceptable_svg_properties:
+ clean.append(prop + ': ' + value + ';')
+
+ return ' '.join(clean)
+
+
+def _sanitizeHTML(htmlSource, encoding, type):
+ p = _HTMLSanitizer(encoding, type)
+ p.feed(htmlSource)
+ data = p.output()
+ if TIDY_MARKUP:
+ # loop through list of preferred Tidy interfaces looking for one that's installed,
+ # then set up a common _tidy function to wrap the interface-specific API.
+ _tidy = None
+ for tidy_interface in PREFERRED_TIDY_INTERFACES:
+ try:
+ if tidy_interface == "uTidy":
+ from tidy import parseString as _utidy
+ def _tidy(data, **kwargs):
+ return str(_utidy(data, **kwargs))
+ break
+ elif tidy_interface == "mxTidy":
+ from mx.Tidy import Tidy as _mxtidy
+ def _tidy(data, **kwargs):
+ nerrors, nwarnings, data, errordata = _mxtidy.tidy(data, **kwargs)
+ return data
+ break
+ except:
+ pass
+ if _tidy:
+ utf8 = type(data) == type(u'')
+ if utf8:
+ data = data.encode('utf-8')
+ data = _tidy(data, output_xhtml=1, numeric_entities=1, wrap=0, char_encoding="utf8")
+ if utf8:
+ data = unicode(data, 'utf-8')
+ if data.count('<body'):
+ data = data.split('<body', 1)[1]
+ if data.count('>'):
+ data = data.split('>', 1)[1]
+ if data.count('</body'):
+ data = data.split('</body', 1)[0]
+ data = data.strip().replace('\r\n', '\n')
+ return data
+
+class _FeedURLHandler(urllib2.HTTPDigestAuthHandler, urllib2.HTTPRedirectHandler, urllib2.HTTPDefaultErrorHandler):
+ def http_error_default(self, req, fp, code, msg, headers):
+ if ((code / 100) == 3) and (code != 304):
+ return self.http_error_302(req, fp, code, msg, headers)
+ infourl = urllib.addinfourl(fp, headers, req.get_full_url())
+ infourl.status = code
+ return infourl
+
+ def http_error_302(self, req, fp, code, msg, headers):
+ if headers.dict.has_key('location'):
+ infourl = urllib2.HTTPRedirectHandler.http_error_302(self, req, fp, code, msg, headers)
+ else:
+ infourl = urllib.addinfourl(fp, headers, req.get_full_url())
+ if not hasattr(infourl, 'status'):
+ infourl.status = code
+ return infourl
+
+ def http_error_301(self, req, fp, code, msg, headers):
+ if headers.dict.has_key('location'):
+ infourl = urllib2.HTTPRedirectHandler.http_error_301(self, req, fp, code, msg, headers)
+ else:
+ infourl = urllib.addinfourl(fp, headers, req.get_full_url())
+ if not hasattr(infourl, 'status'):
+ infourl.status = code
+ return infourl
+
+ http_error_300 = http_error_302
+ http_error_303 = http_error_302
+ http_error_307 = http_error_302
+
+ def http_error_401(self, req, fp, code, msg, headers):
+ # Check if
+ # - server requires digest auth, AND
+ # - we tried (unsuccessfully) with basic auth, AND
+ # - we're using Python 2.3.3 or later (digest auth is irreparably broken in earlier versions)
+ # If all conditions hold, parse authentication information
+ # out of the Authorization header we sent the first time
+ # (for the username and password) and the WWW-Authenticate
+ # header the server sent back (for the realm) and retry
+ # the request with the appropriate digest auth headers instead.
+ # This evil genius hack has been brought to you by Aaron Swartz.
+ host = urlparse.urlparse(req.get_full_url())[1]
+ try:
+ assert sys.version.split()[0] >= '2.3.3'
+ assert base64 != None
+ user, passw = base64.decodestring(req.headers['Authorization'].split(' ')[1]).split(':')
+ realm = re.findall('realm="([^"]*)"', headers['WWW-Authenticate'])[0]
+ self.add_password(realm, host, user, passw)
+ retry = self.http_error_auth_reqed('www-authenticate', host, req, headers)
+ self.reset_retry_count()
+ return retry
+ except:
+ return self.http_error_default(req, fp, code, msg, headers)
+
+def _open_resource(url_file_stream_or_string, etag, modified, agent, referrer, handlers):
+ """URL, filename, or string --> stream
+
+ This function lets you define parsers that take any input source
+ (URL, pathname to local or network file, or actual data as a string)
+ and deal with it in a uniform manner. Returned object is guaranteed
+ to have all the basic stdio read methods (read, readline, readlines).
+ Just .close() the object when you're done with it.
+
+ If the etag argument is supplied, it will be used as the value of an
+ If-None-Match request header.
+
+ If the modified argument is supplied, it can be a tuple of 9 integers
+ (as returned by gmtime() in the standard Python time module) or a date
+ string in any format supported by feedparser. Regardless, it MUST
+ be in GMT (Greenwich Mean Time). It will be reformatted into an
+ RFC 1123-compliant date and used as the value of an If-Modified-Since
+ request header.
+
+ If the agent argument is supplied, it will be used as the value of a
+ User-Agent request header.
+
+ If the referrer argument is supplied, it will be used as the value of a
+ Referer[sic] request header.
+
+ If handlers is supplied, it is a list of handlers used to build a
+ urllib2 opener.
+ """
+
+ if hasattr(url_file_stream_or_string, 'read'):
+ return url_file_stream_or_string
+
+ if url_file_stream_or_string == '-':
+ return sys.stdin
+
+ if urlparse.urlparse(url_file_stream_or_string)[0] in ('http', 'https', 'ftp'):
+ if not agent:
+ agent = USER_AGENT
+ # test for inline user:password for basic auth
+ auth = None
+ if base64:
+ urltype, rest = urllib.splittype(url_file_stream_or_string)
+ realhost, rest = urllib.splithost(rest)
+ if realhost:
+ user_passwd, realhost = urllib.splituser(realhost)
+ if user_passwd:
+ url_file_stream_or_string = '%s://%s%s' % (urltype, realhost, rest)
+ auth = base64.encodestring(user_passwd).strip()
+
+ # iri support
+ try:
+ if isinstance(url_file_stream_or_string,unicode):
+ url_file_stream_or_string = url_file_stream_or_string.encode('idna')
+ else:
+ url_file_stream_or_string = url_file_stream_or_string.decode('utf-8').encode('idna')
+ except:
+ pass
+
+ # try to open with urllib2 (to use optional headers)
+ request = urllib2.Request(url_file_stream_or_string)
+ request.add_header('User-Agent', agent)
+ if etag:
+ request.add_header('If-None-Match', etag)
+ if type(modified) == type(''):
+ modified = _parse_date(modified)
+ if modified:
+ # format into an RFC 1123-compliant timestamp. We can't use
+ # time.strftime() since the %a and %b directives can be affected
+ # by the current locale, but RFC 2616 states that dates must be
+ # in English.
+ short_weekdays = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
+ months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
+ request.add_header('If-Modified-Since', '%s, %02d %s %04d %02d:%02d:%02d GMT' % (short_weekdays[modified[6]], modified[2], months[modified[1] - 1], modified[0], modified[3], modified[4], modified[5]))
+ if referrer:
+ request.add_header('Referer', referrer)
+ if gzip and zlib:
+ request.add_header('Accept-encoding', 'gzip, deflate')
+ elif gzip:
+ request.add_header('Accept-encoding', 'gzip')
+ elif zlib:
+ request.add_header('Accept-encoding', 'deflate')
+ else:
+ request.add_header('Accept-encoding', '')
+ if auth:
+ request.add_header('Authorization', 'Basic %s' % auth)
+ if ACCEPT_HEADER:
+ request.add_header('Accept', ACCEPT_HEADER)
+ request.add_header('A-IM', 'feed') # RFC 3229 support
+ opener = apply(urllib2.build_opener, tuple([_FeedURLHandler()] + handlers))
+ opener.addheaders = [] # RMK - must clear so we only send our custom User-Agent
+ try:
+ return opener.open(request)
+ finally:
+ opener.close() # JohnD
+
+ # try to open with native open function (if url_file_stream_or_string is a filename)
+ try:
+ return open(url_file_stream_or_string)
+ except:
+ pass
+
+ # treat url_file_stream_or_string as string
+ return _StringIO(str(url_file_stream_or_string))
+
+_date_handlers = []
+def registerDateHandler(func):
+ '''Register a date handler function (takes string, returns 9-tuple date in GMT)'''
+ _date_handlers.insert(0, func)
+
+# ISO-8601 date parsing routines written by Fazal Majid.
+# The ISO 8601 standard is very convoluted and irregular - a full ISO 8601
+# parser is beyond the scope of feedparser and would be a worthwhile addition
+# to the Python library.
+# A single regular expression cannot parse ISO 8601 date formats into groups
+# as the standard is highly irregular (for instance is 030104 2003-01-04 or
+# 0301-04-01), so we use templates instead.
+# Please note the order in templates is significant because we need a
+# greedy match.
+_iso8601_tmpl = ['YYYY-?MM-?DD', 'YYYY-0MM?-?DD', 'YYYY-MM', 'YYYY-?OOO',
+ 'YY-?MM-?DD', 'YY-?OOO', 'YYYY',
+ '-YY-?MM', '-OOO', '-YY',
+ '--MM-?DD', '--MM',
+ '---DD',
+ 'CC', '']
+_iso8601_re = [
+ tmpl.replace(
+ 'YYYY', r'(?P<year>\d{4})').replace(
+ 'YY', r'(?P<year>\d\d)').replace(
+ 'MM', r'(?P<month>[01]\d)').replace(
+ 'DD', r'(?P<day>[0123]\d)').replace(
+ 'OOO', r'(?P<ordinal>[0123]\d\d)').replace(
+ 'CC', r'(?P<century>\d\d$)')
+ + r'(T?(?P<hour>\d{2}):(?P<minute>\d{2})'
+ + r'(:(?P<second>\d{2}(\.\d*)?))?'
+ + r'(?P<tz>[+-](?P<tzhour>\d{2})(:(?P<tzmin>\d{2}))?|Z)?)?'
+ for tmpl in _iso8601_tmpl]
+del tmpl
+_iso8601_matches = [re.compile(regex).match for regex in _iso8601_re]
+del regex
+def _parse_date_iso8601(dateString):
+ '''Parse a variety of ISO-8601-compatible formats like 20040105'''
+ m = None
+ for _iso8601_match in _iso8601_matches:
+ m = _iso8601_match(dateString)
+ if m: break
+ if not m: return
+ if m.span() == (0, 0): return
+ params = m.groupdict()
+ ordinal = params.get('ordinal', 0)
+ if ordinal:
+ ordinal = int(ordinal)
+ else:
+ ordinal = 0
+ year = params.get('year', '--')
+ if not year or year == '--':
+ year = time.gmtime()[0]
+ elif len(year) == 2:
+ # ISO 8601 assumes current century, i.e. 93 -> 2093, NOT 1993
+ year = 100 * int(time.gmtime()[0] / 100) + int(year)
+ else:
+ year = int(year)
+ month = params.get('month', '-')
+ if not month or month == '-':
+ # ordinals are NOT normalized by mktime, we simulate them
+ # by setting month=1, day=ordinal
+ if ordinal:
+ month = 1
+ else:
+ month = time.gmtime()[1]
+ month = int(month)
+ day = params.get('day', 0)
+ if not day:
+ # see above
+ if ordinal:
+ day = ordinal
+ elif params.get('century', 0) or \
+ params.get('year', 0) or params.get('month', 0):
+ day = 1
+ else:
+ day = time.gmtime()[2]
+ else:
+ day = int(day)
+ # special case of the century - is the first year of the 21st century
+ # 2000 or 2001 ? The debate goes on...
+ if 'century' in params.keys():
+ year = (int(params['century']) - 1) * 100 + 1
+ # in ISO 8601 most fields are optional
+ for field in ['hour', 'minute', 'second', 'tzhour', 'tzmin']:
+ if not params.get(field, None):
+ params[field] = 0
+ hour = int(params.get('hour', 0))
+ minute = int(params.get('minute', 0))
+ second = int(float(params.get('second', 0)))
+ # weekday is normalized by mktime(), we can ignore it
+ weekday = 0
+ daylight_savings_flag = -1
+ tm = [year, month, day, hour, minute, second, weekday,
+ ordinal, daylight_savings_flag]
+ # ISO 8601 time zone adjustments
+ tz = params.get('tz')
+ if tz and tz != 'Z':
+ if tz[0] == '-':
+ tm[3] += int(params.get('tzhour', 0))
+ tm[4] += int(params.get('tzmin', 0))
+ elif tz[0] == '+':
+ tm[3] -= int(params.get('tzhour', 0))
+ tm[4] -= int(params.get('tzmin', 0))
+ else:
+ return None
+ # Python's time.mktime() is a wrapper around the ANSI C mktime(3c)
+ # which is guaranteed to normalize d/m/y/h/m/s.
+ # Many implementations have bugs, but we'll pretend they don't.
+ return time.localtime(time.mktime(tm))
+registerDateHandler(_parse_date_iso8601)
+
+# 8-bit date handling routines written by ytrewq1.
+_korean_year = u'\ub144' # b3e2 in euc-kr
+_korean_month = u'\uc6d4' # bff9 in euc-kr
+_korean_day = u'\uc77c' # c0cf in euc-kr
+_korean_am = u'\uc624\uc804' # bfc0 c0fc in euc-kr
+_korean_pm = u'\uc624\ud6c4' # bfc0 c8c4 in euc-kr
+
+_korean_onblog_date_re = \
+ re.compile('(\d{4})%s\s+(\d{2})%s\s+(\d{2})%s\s+(\d{2}):(\d{2}):(\d{2})' % \
+ (_korean_year, _korean_month, _korean_day))
+_korean_nate_date_re = \
+ re.compile(u'(\d{4})-(\d{2})-(\d{2})\s+(%s|%s)\s+(\d{,2}):(\d{,2}):(\d{,2})' % \
+ (_korean_am, _korean_pm))
+def _parse_date_onblog(dateString):
+ '''Parse a string according to the OnBlog 8-bit date format'''
+ m = _korean_onblog_date_re.match(dateString)
+ if not m: return
+ w3dtfdate = '%(year)s-%(month)s-%(day)sT%(hour)s:%(minute)s:%(second)s%(zonediff)s' % \
+ {'year': m.group(1), 'month': m.group(2), 'day': m.group(3),\
+ 'hour': m.group(4), 'minute': m.group(5), 'second': m.group(6),\
+ 'zonediff': '+09:00'}
+ if _debug: sys.stderr.write('OnBlog date parsed as: %s\n' % w3dtfdate)
+ return _parse_date_w3dtf(w3dtfdate)
+registerDateHandler(_parse_date_onblog)
+
+def _parse_date_nate(dateString):
+ '''Parse a string according to the Nate 8-bit date format'''
+ m = _korean_nate_date_re.match(dateString)
+ if not m: return
+ hour = int(m.group(5))
+ ampm = m.group(4)
+ if (ampm == _korean_pm):
+ hour += 12
+ hour = str(hour)
+ if len(hour) == 1:
+ hour = '0' + hour
+ w3dtfdate = '%(year)s-%(month)s-%(day)sT%(hour)s:%(minute)s:%(second)s%(zonediff)s' % \
+ {'year': m.group(1), 'month': m.group(2), 'day': m.group(3),\
+ 'hour': hour, 'minute': m.group(6), 'second': m.group(7),\
+ 'zonediff': '+09:00'}
+ if _debug: sys.stderr.write('Nate date parsed as: %s\n' % w3dtfdate)
+ return _parse_date_w3dtf(w3dtfdate)
+registerDateHandler(_parse_date_nate)
+
+_mssql_date_re = \
+ re.compile('(\d{4})-(\d{2})-(\d{2})\s+(\d{2}):(\d{2}):(\d{2})(\.\d+)?')
+def _parse_date_mssql(dateString):
+ '''Parse a string according to the MS SQL date format'''
+ m = _mssql_date_re.match(dateString)
+ if not m: return
+ w3dtfdate = '%(year)s-%(month)s-%(day)sT%(hour)s:%(minute)s:%(second)s%(zonediff)s' % \
+ {'year': m.group(1), 'month': m.group(2), 'day': m.group(3),\
+ 'hour': m.group(4), 'minute': m.group(5), 'second': m.group(6),\
+ 'zonediff': '+09:00'}
+ if _debug: sys.stderr.write('MS SQL date parsed as: %s\n' % w3dtfdate)
+ return _parse_date_w3dtf(w3dtfdate)
+registerDateHandler(_parse_date_mssql)
+
+# Unicode strings for Greek date strings
+_greek_months = \
+ { \
+ u'\u0399\u03b1\u03bd': u'Jan', # c9e1ed in iso-8859-7
+ u'\u03a6\u03b5\u03b2': u'Feb', # d6e5e2 in iso-8859-7
+ u'\u039c\u03ac\u03ce': u'Mar', # ccdcfe in iso-8859-7
+ u'\u039c\u03b1\u03ce': u'Mar', # cce1fe in iso-8859-7
+ u'\u0391\u03c0\u03c1': u'Apr', # c1f0f1 in iso-8859-7
+ u'\u039c\u03ac\u03b9': u'May', # ccdce9 in iso-8859-7
+ u'\u039c\u03b1\u03ca': u'May', # cce1fa in iso-8859-7
+ u'\u039c\u03b1\u03b9': u'May', # cce1e9 in iso-8859-7
+ u'\u0399\u03bf\u03cd\u03bd': u'Jun', # c9effded in iso-8859-7
+ u'\u0399\u03bf\u03bd': u'Jun', # c9efed in iso-8859-7
+ u'\u0399\u03bf\u03cd\u03bb': u'Jul', # c9effdeb in iso-8859-7
+ u'\u0399\u03bf\u03bb': u'Jul', # c9f9eb in iso-8859-7
+ u'\u0391\u03cd\u03b3': u'Aug', # c1fde3 in iso-8859-7
+ u'\u0391\u03c5\u03b3': u'Aug', # c1f5e3 in iso-8859-7
+ u'\u03a3\u03b5\u03c0': u'Sep', # d3e5f0 in iso-8859-7
+ u'\u039f\u03ba\u03c4': u'Oct', # cfeaf4 in iso-8859-7
+ u'\u039d\u03bf\u03ad': u'Nov', # cdefdd in iso-8859-7
+ u'\u039d\u03bf\u03b5': u'Nov', # cdefe5 in iso-8859-7
+ u'\u0394\u03b5\u03ba': u'Dec', # c4e5ea in iso-8859-7
+ }
+
+_greek_wdays = \
+ { \
+ u'\u039a\u03c5\u03c1': u'Sun', # caf5f1 in iso-8859-7
+ u'\u0394\u03b5\u03c5': u'Mon', # c4e5f5 in iso-8859-7
+ u'\u03a4\u03c1\u03b9': u'Tue', # d4f1e9 in iso-8859-7
+ u'\u03a4\u03b5\u03c4': u'Wed', # d4e5f4 in iso-8859-7
+ u'\u03a0\u03b5\u03bc': u'Thu', # d0e5ec in iso-8859-7
+ u'\u03a0\u03b1\u03c1': u'Fri', # d0e1f1 in iso-8859-7
+ u'\u03a3\u03b1\u03b2': u'Sat', # d3e1e2 in iso-8859-7
+ }
+
+_greek_date_format_re = \
+ re.compile(u'([^,]+),\s+(\d{2})\s+([^\s]+)\s+(\d{4})\s+(\d{2}):(\d{2}):(\d{2})\s+([^\s]+)')
+
+def _parse_date_greek(dateString):
+ '''Parse a string according to a Greek 8-bit date format.'''
+ m = _greek_date_format_re.match(dateString)
+ if not m: return
+ try:
+ wday = _greek_wdays[m.group(1)]
+ month = _greek_months[m.group(3)]
+ except:
+ return
+ rfc822date = '%(wday)s, %(day)s %(month)s %(year)s %(hour)s:%(minute)s:%(second)s %(zonediff)s' % \
+ {'wday': wday, 'day': m.group(2), 'month': month, 'year': m.group(4),\
+ 'hour': m.group(5), 'minute': m.group(6), 'second': m.group(7),\
+ 'zonediff': m.group(8)}
+ if _debug: sys.stderr.write('Greek date parsed as: %s\n' % rfc822date)
+ return _parse_date_rfc822(rfc822date)
+registerDateHandler(_parse_date_greek)
+
+# Unicode strings for Hungarian date strings
+_hungarian_months = \
+ { \
+ u'janu\u00e1r': u'01', # e1 in iso-8859-2
+ u'febru\u00e1ri': u'02', # e1 in iso-8859-2
+ u'm\u00e1rcius': u'03', # e1 in iso-8859-2
+ u'\u00e1prilis': u'04', # e1 in iso-8859-2
+ u'm\u00e1ujus': u'05', # e1 in iso-8859-2
+ u'j\u00fanius': u'06', # fa in iso-8859-2
+ u'j\u00falius': u'07', # fa in iso-8859-2
+ u'augusztus': u'08',
+ u'szeptember': u'09',
+ u'okt\u00f3ber': u'10', # f3 in iso-8859-2
+ u'november': u'11',
+ u'december': u'12',
+ }
+
+_hungarian_date_format_re = \
+ re.compile(u'(\d{4})-([^-]+)-(\d{,2})T(\d{,2}):(\d{2})((\+|-)(\d{,2}:\d{2}))')
+
+def _parse_date_hungarian(dateString):
+ '''Parse a string according to a Hungarian 8-bit date format.'''
+ m = _hungarian_date_format_re.match(dateString)
+ if not m: return
+ try:
+ month = _hungarian_months[m.group(2)]
+ day = m.group(3)
+ if len(day) == 1:
+ day = '0' + day
+ hour = m.group(4)
+ if len(hour) == 1:
+ hour = '0' + hour
+ except:
+ return
+ w3dtfdate = '%(year)s-%(month)s-%(day)sT%(hour)s:%(minute)s%(zonediff)s' % \
+ {'year': m.group(1), 'month': month, 'day': day,\
+ 'hour': hour, 'minute': m.group(5),\
+ 'zonediff': m.group(6)}
+ if _debug: sys.stderr.write('Hungarian date parsed as: %s\n' % w3dtfdate)
+ return _parse_date_w3dtf(w3dtfdate)
+registerDateHandler(_parse_date_hungarian)
+
+# W3DTF-style date parsing adapted from PyXML xml.utils.iso8601, written by
+# Drake and licensed under the Python license. Removed all range checking
+# for month, day, hour, minute, and second, since mktime will normalize
+# these later
+def _parse_date_w3dtf(dateString):
+ def __extract_date(m):
+ year = int(m.group('year'))
+ if year < 100:
+ year = 100 * int(time.gmtime()[0] / 100) + int(year)
+ if year < 1000:
+ return 0, 0, 0
+ julian = m.group('julian')
+ if julian:
+ julian = int(julian)
+ month = julian / 30 + 1
+ day = julian % 30 + 1
+ jday = None
+ while jday != julian:
+ t = time.mktime((year, month, day, 0, 0, 0, 0, 0, 0))
+ jday = time.gmtime(t)[-2]
+ diff = abs(jday - julian)
+ if jday > julian:
+ if diff < day:
+ day = day - diff
+ else:
+ month = month - 1
+ day = 31
+ elif jday < julian:
+ if day + diff < 28:
+ day = day + diff
+ else:
+ month = month + 1
+ return year, month, day
+ month = m.group('month')
+ day = 1
+ if month is None:
+ month = 1
+ else:
+ month = int(month)
+ day = m.group('day')
+ if day:
+ day = int(day)
+ else:
+ day = 1
+ return year, month, day
+
+ def __extract_time(m):
+ if not m:
+ return 0, 0, 0
+ hours = m.group('hours')
+ if not hours:
+ return 0, 0, 0
+ hours = int(hours)
+ minutes = int(m.group('minutes'))
+ seconds = m.group('seconds')
+ if seconds:
+ seconds = int(seconds)
+ else:
+ seconds = 0
+ return hours, minutes, seconds
+
+ def __extract_tzd(m):
+ '''Return the Time Zone Designator as an offset in seconds from UTC.'''
+ if not m:
+ return 0
+ tzd = m.group('tzd')
+ if not tzd:
+ return 0
+ if tzd == 'Z':
+ return 0
+ hours = int(m.group('tzdhours'))
+ minutes = m.group('tzdminutes')
+ if minutes:
+ minutes = int(minutes)
+ else:
+ minutes = 0
+ offset = (hours*60 + minutes) * 60
+ if tzd[0] == '+':
+ return -offset
+ return offset
+
+ __date_re = ('(?P<year>\d\d\d\d)'
+ '(?:(?P<dsep>-|)'
+ '(?:(?P<julian>\d\d\d)'
+ '|(?P<month>\d\d)(?:(?P=dsep)(?P<day>\d\d))?))?')
+ __tzd_re = '(?P<tzd>[-+](?P<tzdhours>\d\d)(?::?(?P<tzdminutes>\d\d))|Z)'
+ __tzd_rx = re.compile(__tzd_re)
+ __time_re = ('(?P<hours>\d\d)(?P<tsep>:|)(?P<minutes>\d\d)'
+ '(?:(?P=tsep)(?P<seconds>\d\d(?:[.,]\d+)?))?'
+ + __tzd_re)
+ __datetime_re = '%s(?:T%s)?' % (__date_re, __time_re)
+ __datetime_rx = re.compile(__datetime_re)
+ m = __datetime_rx.match(dateString)
+ if (m is None) or (m.group() != dateString): return
+ gmt = __extract_date(m) + __extract_time(m) + (0, 0, 0)
+ if gmt[0] == 0: return
+ return time.gmtime(time.mktime(gmt) + __extract_tzd(m) - time.timezone)
+registerDateHandler(_parse_date_w3dtf)
+
+def _parse_date_rfc822(dateString):
+ '''Parse an RFC822, RFC1123, RFC2822, or asctime-style date'''
+ data = dateString.split()
+ if data[0][-1] in (',', '.') or data[0].lower() in rfc822._daynames:
+ del data[0]
+ if len(data) == 4:
+ s = data[3]
+ i = s.find('+')
+ if i > 0:
+ data[3:] = [s[:i], s[i+1:]]
+ else:
+ data.append('')
+ dateString = " ".join(data)
+ if len(data) < 5:
+ dateString += ' 00:00:00 GMT'
+ tm = rfc822.parsedate_tz(dateString)
+ if tm:
+ return time.gmtime(rfc822.mktime_tz(tm))
+# rfc822.py defines several time zones, but we define some extra ones.
+# 'ET' is equivalent to 'EST', etc.
+_additional_timezones = {'AT': -400, 'ET': -500, 'CT': -600, 'MT': -700, 'PT': -800}
+rfc822._timezones.update(_additional_timezones)
+registerDateHandler(_parse_date_rfc822)
+
+def _parse_date_perforce(aDateString):
+ """parse a date in yyyy/mm/dd hh:mm:ss TTT format"""
+ # Fri, 2006/09/15 08:19:53 EDT
+ _my_date_pattern = re.compile( \
+ r'(\w{,3}), (\d{,4})/(\d{,2})/(\d{2}) (\d{,2}):(\d{2}):(\d{2}) (\w{,3})')
+
+ dow, year, month, day, hour, minute, second, tz = \
+ _my_date_pattern.search(aDateString).groups()
+ months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
+ dateString = "%s, %s %s %s %s:%s:%s %s" % (dow, day, months[int(month) - 1], year, hour, minute, second, tz)
+ tm = rfc822.parsedate_tz(dateString)
+ if tm:
+ return time.gmtime(rfc822.mktime_tz(tm))
+registerDateHandler(_parse_date_perforce)
+
+def _parse_date(dateString):
+ '''Parses a variety of date formats into a 9-tuple in GMT'''
+ for handler in _date_handlers:
+ try:
+ date9tuple = handler(dateString)
+ if not date9tuple: continue
+ if len(date9tuple) != 9:
+ if _debug: sys.stderr.write('date handler function must return 9-tuple\n')
+ raise ValueError
+ map(int, date9tuple)
+ return date9tuple
+ except Exception, e:
+ if _debug: sys.stderr.write('%s raised %s\n' % (handler.__name__, repr(e)))
+ pass
+ return None
+
+def _getCharacterEncoding(http_headers, xml_data):
+ '''Get the character encoding of the XML document
+
+ http_headers is a dictionary
+ xml_data is a raw string (not Unicode)
+
+ This is so much trickier than it sounds, it's not even funny.
+ According to RFC 3023 ('XML Media Types'), if the HTTP Content-Type
+ is application/xml, application/*+xml,
+ application/xml-external-parsed-entity, or application/xml-dtd,
+ the encoding given in the charset parameter of the HTTP Content-Type
+ takes precedence over the encoding given in the XML prefix within the
+ document, and defaults to 'utf-8' if neither are specified. But, if
+ the HTTP Content-Type is text/xml, text/*+xml, or
+ text/xml-external-parsed-entity, the encoding given in the XML prefix
+ within the document is ALWAYS IGNORED and only the encoding given in
+ the charset parameter of the HTTP Content-Type header should be
+ respected, and it defaults to 'us-ascii' if not specified.
+
+ Furthermore, discussion on the atom-syntax mailing list with the
+ author of RFC 3023 leads me to the conclusion that any document
+ served with a Content-Type of text/* and no charset parameter
+ must be treated as us-ascii. (We now do this.) And also that it
+ must always be flagged as non-well-formed. (We now do this too.)
+
+ If Content-Type is unspecified (input was local file or non-HTTP source)
+ or unrecognized (server just got it totally wrong), then go by the
+ encoding given in the XML prefix of the document and default to
+ 'iso-8859-1' as per the HTTP specification (RFC 2616).
+
+ Then, assuming we didn't find a character encoding in the HTTP headers
+ (and the HTTP Content-type allowed us to look in the body), we need
+ to sniff the first few bytes of the XML data and try to determine
+ whether the encoding is ASCII-compatible. Section F of the XML
+ specification shows the way here:
+ http://www.w3.org/TR/REC-xml/#sec-guessing-no-ext-info
+
+ If the sniffed encoding is not ASCII-compatible, we need to make it
+ ASCII compatible so that we can sniff further into the XML declaration
+ to find the encoding attribute, which will tell us the true encoding.
+
+ Of course, none of this guarantees that we will be able to parse the
+ feed in the declared character encoding (assuming it was declared
+ correctly, which many are not). CJKCodecs and iconv_codec help a lot;
+ you should definitely install them if you can.
+ http://cjkpython.i18n.org/
+ '''
+
+ def _parseHTTPContentType(content_type):
+ '''takes HTTP Content-Type header and returns (content type, charset)
+
+ If no charset is specified, returns (content type, '')
+ If no content type is specified, returns ('', '')
+ Both return parameters are guaranteed to be lowercase strings
+ '''
+ content_type = content_type or ''
+ content_type, params = cgi.parse_header(content_type)
+ return content_type, params.get('charset', '').replace("'", '')
+
+ sniffed_xml_encoding = ''
+ xml_encoding = ''
+ true_encoding = ''
+ http_content_type, http_encoding = _parseHTTPContentType(http_headers.get('content-type'))
+ # Must sniff for non-ASCII-compatible character encodings before
+ # searching for XML declaration. This heuristic is defined in
+ # section F of the XML specification:
+ # http://www.w3.org/TR/REC-xml/#sec-guessing-no-ext-info
+ try:
+ if xml_data[:4] == '\x4c\x6f\xa7\x94':
+ # EBCDIC
+ xml_data = _ebcdic_to_ascii(xml_data)
+ elif xml_data[:4] == '\x00\x3c\x00\x3f':
+ # UTF-16BE
+ sniffed_xml_encoding = 'utf-16be'
+ xml_data = unicode(xml_data, 'utf-16be').encode('utf-8')
+ elif (len(xml_data) >= 4) and (xml_data[:2] == '\xfe\xff') and (xml_data[2:4] != '\x00\x00'):
+ # UTF-16BE with BOM
+ sniffed_xml_encoding = 'utf-16be'
+ xml_data = unicode(xml_data[2:], 'utf-16be').encode('utf-8')
+ elif xml_data[:4] == '\x3c\x00\x3f\x00':
+ # UTF-16LE
+ sniffed_xml_encoding = 'utf-16le'
+ xml_data = unicode(xml_data, 'utf-16le').encode('utf-8')
+ elif (len(xml_data) >= 4) and (xml_data[:2] == '\xff\xfe') and (xml_data[2:4] != '\x00\x00'):
+ # UTF-16LE with BOM
+ sniffed_xml_encoding = 'utf-16le'
+ xml_data = unicode(xml_data[2:], 'utf-16le').encode('utf-8')
+ elif xml_data[:4] == '\x00\x00\x00\x3c':
+ # UTF-32BE
+ sniffed_xml_encoding = 'utf-32be'
+ xml_data = unicode(xml_data, 'utf-32be').encode('utf-8')
+ elif xml_data[:4] == '\x3c\x00\x00\x00':
+ # UTF-32LE
+ sniffed_xml_encoding = 'utf-32le'
+ xml_data = unicode(xml_data, 'utf-32le').encode('utf-8')
+ elif xml_data[:4] == '\x00\x00\xfe\xff':
+ # UTF-32BE with BOM
+ sniffed_xml_encoding = 'utf-32be'
+ xml_data = unicode(xml_data[4:], 'utf-32be').encode('utf-8')
+ elif xml_data[:4] == '\xff\xfe\x00\x00':
+ # UTF-32LE with BOM
+ sniffed_xml_encoding = 'utf-32le'
+ xml_data = unicode(xml_data[4:], 'utf-32le').encode('utf-8')
+ elif xml_data[:3] == '\xef\xbb\xbf':
+ # UTF-8 with BOM
+ sniffed_xml_encoding = 'utf-8'
+ xml_data = unicode(xml_data[3:], 'utf-8').encode('utf-8')
+ else:
+ # ASCII-compatible
+ pass
+ xml_encoding_match = re.compile('^<\?.*encoding=[\'"](.*?)[\'"].*\?>').match(xml_data)
+ except:
+ xml_encoding_match = None
+ if xml_encoding_match:
+ xml_encoding = xml_encoding_match.groups()[0].lower()
+ if sniffed_xml_encoding and (xml_encoding in ('iso-10646-ucs-2', 'ucs-2', 'csunicode', 'iso-10646-ucs-4', 'ucs-4', 'csucs4', 'utf-16', 'utf-32', 'utf_16', 'utf_32', 'utf16', 'u16')):
+ xml_encoding = sniffed_xml_encoding
+ acceptable_content_type = 0
+ application_content_types = ('application/xml', 'application/xml-dtd', 'application/xml-external-parsed-entity')
+ text_content_types = ('text/xml', 'text/xml-external-parsed-entity')
+ if (http_content_type in application_content_types) or \
+ (http_content_type.startswith('application/') and http_content_type.endswith('+xml')):
+ acceptable_content_type = 1
+ true_encoding = http_encoding or xml_encoding or 'utf-8'
+ elif (http_content_type in text_content_types) or \
+ (http_content_type.startswith('text/')) and http_content_type.endswith('+xml'):
+ acceptable_content_type = 1
+ true_encoding = http_encoding or 'us-ascii'
+ elif http_content_type.startswith('text/'):
+ true_encoding = http_encoding or 'us-ascii'
+ elif http_headers and (not http_headers.has_key('content-type')):
+ true_encoding = xml_encoding or 'iso-8859-1'
+ else:
+ true_encoding = xml_encoding or 'utf-8'
+ # some feeds claim to be gb2312 but are actually gb18030.
+ # apparently MSIE and Firefox both do the following switch:
+ if true_encoding.lower() == 'gb2312':
+ true_encoding = 'gb18030'
+ return true_encoding, http_encoding, xml_encoding, sniffed_xml_encoding, acceptable_content_type
+
+def _toUTF8(data, encoding):
+ '''Changes an XML data stream on the fly to specify a new encoding
+
+ data is a raw sequence of bytes (not Unicode) that is presumed to be in %encoding already
+ encoding is a string recognized by encodings.aliases
+ '''
+ if _debug: sys.stderr.write('entering _toUTF8, trying encoding %s\n' % encoding)
+ # strip Byte Order Mark (if present)
+ if (len(data) >= 4) and (data[:2] == '\xfe\xff') and (data[2:4] != '\x00\x00'):
+ if _debug:
+ sys.stderr.write('stripping BOM\n')
+ if encoding != 'utf-16be':
+ sys.stderr.write('trying utf-16be instead\n')
+ encoding = 'utf-16be'
+ data = data[2:]
+ elif (len(data) >= 4) and (data[:2] == '\xff\xfe') and (data[2:4] != '\x00\x00'):
+ if _debug:
+ sys.stderr.write('stripping BOM\n')
+ if encoding != 'utf-16le':
+ sys.stderr.write('trying utf-16le instead\n')
+ encoding = 'utf-16le'
+ data = data[2:]
+ elif data[:3] == '\xef\xbb\xbf':
+ if _debug:
+ sys.stderr.write('stripping BOM\n')
+ if encoding != 'utf-8':
+ sys.stderr.write('trying utf-8 instead\n')
+ encoding = 'utf-8'
+ data = data[3:]
+ elif data[:4] == '\x00\x00\xfe\xff':
+ if _debug:
+ sys.stderr.write('stripping BOM\n')
+ if encoding != 'utf-32be':
+ sys.stderr.write('trying utf-32be instead\n')
+ encoding = 'utf-32be'
+ data = data[4:]
+ elif data[:4] == '\xff\xfe\x00\x00':
+ if _debug:
+ sys.stderr.write('stripping BOM\n')
+ if encoding != 'utf-32le':
+ sys.stderr.write('trying utf-32le instead\n')
+ encoding = 'utf-32le'
+ data = data[4:]
+ newdata = unicode(data, encoding)
+ if _debug: sys.stderr.write('successfully converted %s data to unicode\n' % encoding)
+ declmatch = re.compile('^<\?xml[^>]*?>')
+ newdecl = '''<?xml version='1.0' encoding='utf-8'?>'''
+ if declmatch.search(newdata):
+ newdata = declmatch.sub(newdecl, newdata)
+ else:
+ newdata = newdecl + u'\n' + newdata
+ return newdata.encode('utf-8')
+
+def _stripDoctype(data):
+ '''Strips DOCTYPE from XML document, returns (rss_version, stripped_data)
+
+ rss_version may be 'rss091n' or None
+ stripped_data is the same XML document, minus the DOCTYPE
+ '''
+ start = re.search('<\w',data)
+ start = start and start.start() or -1
+ head,data = data[:start+1], data[start+1:]
+
+ entity_pattern = re.compile(r'^\s*<!ENTITY([^>]*?)>', re.MULTILINE)
+ entity_results=entity_pattern.findall(head)
+ head = entity_pattern.sub('', head)
+ doctype_pattern = re.compile(r'^\s*<!DOCTYPE([^>]*?)>', re.MULTILINE)
+ doctype_results = doctype_pattern.findall(head)
+ doctype = doctype_results and doctype_results[0] or ''
+ if doctype.lower().count('netscape'):
+ version = 'rss091n'
+ else:
+ version = None
+
+ # only allow in 'safe' inline entity definitions
+ replacement=''
+ if len(doctype_results)==1 and entity_results:
+ safe_pattern=re.compile('\s+(\w+)\s+"(&#\w+;|[^&"]*)"')
+ safe_entities=filter(lambda e: safe_pattern.match(e),entity_results)
+ if safe_entities:
+ replacement='<!DOCTYPE feed [\n <!ENTITY %s>\n]>' % '>\n <!ENTITY '.join(safe_entities)
+ data = doctype_pattern.sub(replacement, head) + data
+
+ return version, data, dict(replacement and safe_pattern.findall(replacement))
+
+def parse(url_file_stream_or_string, etag=None, modified=None, agent=None, referrer=None, handlers=[]):
+ '''Parse a feed from a URL, file, stream, or string'''
+ result = FeedParserDict()
+ result['feed'] = FeedParserDict()
+ result['entries'] = []
+ if _XML_AVAILABLE:
+ result['bozo'] = 0
+ if type(handlers) == types.InstanceType:
+ handlers = [handlers]
+ try:
+ f = _open_resource(url_file_stream_or_string, etag, modified, agent, referrer, handlers)
+ data = f.read()
+ except Exception, e:
+ result['bozo'] = 1
+ result['bozo_exception'] = e
+ data = ''
+ f = None
+
+ # if feed is gzip-compressed, decompress it
+ if f and data and hasattr(f, 'headers'):
+ if gzip and f.headers.get('content-encoding', '') == 'gzip':
+ try:
+ data = gzip.GzipFile(fileobj=_StringIO(data)).read()
+ except Exception, e:
+ # Some feeds claim to be gzipped but they're not, so
+ # we get garbage. Ideally, we should re-request the
+ # feed without the 'Accept-encoding: gzip' header,
+ # but we don't.
+ result['bozo'] = 1
+ result['bozo_exception'] = e
+ data = ''
+ elif zlib and f.headers.get('content-encoding', '') == 'deflate':
+ try:
+ data = zlib.decompress(data, -zlib.MAX_WBITS)
+ except Exception, e:
+ result['bozo'] = 1
+ result['bozo_exception'] = e
+ data = ''
+
+ # save HTTP headers
+ if hasattr(f, 'info'):
+ info = f.info()
+ etag = info.getheader('ETag')
+ if etag:
+ result['etag'] = etag
+ last_modified = info.getheader('Last-Modified')
+ if last_modified:
+ result['modified'] = _parse_date(last_modified)
+ if hasattr(f, 'url'):
+ result['href'] = f.url
+ result['status'] = 200
+ if hasattr(f, 'status'):
+ result['status'] = f.status
+ if hasattr(f, 'headers'):
+ result['headers'] = f.headers.dict
+ if hasattr(f, 'close'):
+ f.close()
+
+ # there are four encodings to keep track of:
+ # - http_encoding is the encoding declared in the Content-Type HTTP header
+ # - xml_encoding is the encoding declared in the <?xml declaration
+ # - sniffed_encoding is the encoding sniffed from the first 4 bytes of the XML data
+ # - result['encoding'] is the actual encoding, as per RFC 3023 and a variety of other conflicting specifications
+ http_headers = result.get('headers', {})
+ result['encoding'], http_encoding, xml_encoding, sniffed_xml_encoding, acceptable_content_type = \
+ _getCharacterEncoding(http_headers, data)
+ if http_headers and (not acceptable_content_type):
+ if http_headers.has_key('content-type'):
+ bozo_message = '%s is not an XML media type' % http_headers['content-type']
+ else:
+ bozo_message = 'no Content-type specified'
+ result['bozo'] = 1
+ result['bozo_exception'] = NonXMLContentType(bozo_message)
+
+ result['version'], data, entities = _stripDoctype(data)
+
+ baseuri = http_headers.get('content-location', result.get('href'))
+ baselang = http_headers.get('content-language', None)
+
+ # if server sent 304, we're done
+ if result.get('status', 0) == 304:
+ result['version'] = ''
+ result['debug_message'] = 'The feed has not changed since you last checked, ' + \
+ 'so the server sent no data. This is a feature, not a bug!'
+ return result
+
+ # if there was a problem downloading, we're done
+ if not data:
+ return result
+
+ # determine character encoding
+ use_strict_parser = 0
+ known_encoding = 0
+ tried_encodings = []
+ # try: HTTP encoding, declared XML encoding, encoding sniffed from BOM
+ for proposed_encoding in (result['encoding'], xml_encoding, sniffed_xml_encoding):
+ if not proposed_encoding: continue
+ if proposed_encoding in tried_encodings: continue
+ tried_encodings.append(proposed_encoding)
+ try:
+ data = _toUTF8(data, proposed_encoding)
+ known_encoding = use_strict_parser = 1
+ break
+ except:
+ pass
+ # if no luck and we have auto-detection library, try that
+ if (not known_encoding) and chardet:
+ try:
+ proposed_encoding = chardet.detect(data)['encoding']
+ if proposed_encoding and (proposed_encoding not in tried_encodings):
+ tried_encodings.append(proposed_encoding)
+ data = _toUTF8(data, proposed_encoding)
+ known_encoding = use_strict_parser = 1
+ except:
+ pass
+ # if still no luck and we haven't tried utf-8 yet, try that
+ if (not known_encoding) and ('utf-8' not in tried_encodings):
+ try:
+ proposed_encoding = 'utf-8'
+ tried_encodings.append(proposed_encoding)
+ data = _toUTF8(data, proposed_encoding)
+ known_encoding = use_strict_parser = 1
+ except:
+ pass
+ # if still no luck and we haven't tried windows-1252 yet, try that
+ if (not known_encoding) and ('windows-1252' not in tried_encodings):
+ try:
+ proposed_encoding = 'windows-1252'
+ tried_encodings.append(proposed_encoding)
+ data = _toUTF8(data, proposed_encoding)
+ known_encoding = use_strict_parser = 1
+ except:
+ pass
+ # if still no luck and we haven't tried iso-8859-2 yet, try that.
+ if (not known_encoding) and ('iso-8859-2' not in tried_encodings):
+ try:
+ proposed_encoding = 'iso-8859-2'
+ tried_encodings.append(proposed_encoding)
+ data = _toUTF8(data, proposed_encoding)
+ known_encoding = use_strict_parser = 1
+ except:
+ pass
+ # if still no luck, give up
+ if not known_encoding:
+ result['bozo'] = 1
+ result['bozo_exception'] = CharacterEncodingUnknown( \
+ 'document encoding unknown, I tried ' + \
+ '%s, %s, utf-8, windows-1252, and iso-8859-2 but nothing worked' % \
+ (result['encoding'], xml_encoding))
+ result['encoding'] = ''
+ elif proposed_encoding != result['encoding']:
+ result['bozo'] = 1
+ result['bozo_exception'] = CharacterEncodingOverride( \
+ 'documented declared as %s, but parsed as %s' % \
+ (result['encoding'], proposed_encoding))
+ result['encoding'] = proposed_encoding
+
+ if not _XML_AVAILABLE:
+ use_strict_parser = 0
+ if use_strict_parser:
+ # initialize the SAX parser
+ feedparser = _StrictFeedParser(baseuri, baselang, 'utf-8')
+ saxparser = xml.sax.make_parser(PREFERRED_XML_PARSERS)
+ saxparser.setFeature(xml.sax.handler.feature_namespaces, 1)
+ saxparser.setContentHandler(feedparser)
+ saxparser.setErrorHandler(feedparser)
+ source = xml.sax.xmlreader.InputSource()
+ source.setByteStream(_StringIO(data))
+ if hasattr(saxparser, '_ns_stack'):
+ # work around bug in built-in SAX parser (doesn't recognize xml: namespace)
+ # PyXML doesn't have this problem, and it doesn't have _ns_stack either
+ saxparser._ns_stack.append({'http://www.w3.org/XML/1998/namespace':'xml'})
+ try:
+ saxparser.parse(source)
+ except Exception, e:
+ if _debug:
+ import traceback
+ traceback.print_stack()
+ traceback.print_exc()
+ sys.stderr.write('xml parsing failed\n')
+ result['bozo'] = 1
+ result['bozo_exception'] = feedparser.exc or e
+ use_strict_parser = 0
+ if not use_strict_parser:
+ feedparser = _LooseFeedParser(baseuri, baselang, known_encoding and 'utf-8' or '', entities)
+ feedparser.feed(data)
+ result['feed'] = feedparser.feeddata
+ result['entries'] = feedparser.entries
+ result['version'] = result['version'] or feedparser.version
+ result['namespaces'] = feedparser.namespacesInUse
+ return result
+
+class Serializer:
+ def __init__(self, results):
+ self.results = results
+
+class TextSerializer(Serializer):
+ def write(self, stream=sys.stdout):
+ self._writer(stream, self.results, '')
+
+ def _writer(self, stream, node, prefix):
+ if not node: return
+ if hasattr(node, 'keys'):
+ keys = node.keys()
+ keys.sort()
+ for k in keys:
+ if k in ('description', 'link'): continue
+ if node.has_key(k + '_detail'): continue
+ if node.has_key(k + '_parsed'): continue
+ self._writer(stream, node[k], prefix + k + '.')
+ elif type(node) == types.ListType:
+ index = 0
+ for n in node:
+ self._writer(stream, n, prefix[:-1] + '[' + str(index) + '].')
+ index += 1
+ else:
+ try:
+ s = str(node).encode('utf-8')
+ s = s.replace('\\', '\\\\')
+ s = s.replace('\r', '')
+ s = s.replace('\n', r'\n')
+ stream.write(prefix[:-1])
+ stream.write('=')
+ stream.write(s)
+ stream.write('\n')
+ except:
+ pass
+
+class PprintSerializer(Serializer):
+ def write(self, stream=sys.stdout):
+ if self.results.has_key('href'):
+ stream.write(self.results['href'] + '\n\n')
+ from pprint import pprint
+ pprint(self.results, stream)
+ stream.write('\n')
+
+if __name__ == '__main__':
+ try:
+ from optparse import OptionParser
+ except:
+ OptionParser = None
+
+ if OptionParser:
+ optionParser = OptionParser(version=__version__, usage="%prog [options] url_or_filename_or_-")
+ optionParser.set_defaults(format="pprint")
+ optionParser.add_option("-A", "--user-agent", dest="agent", metavar="AGENT", help="User-Agent for HTTP URLs")
+ optionParser.add_option("-e", "--referer", "--referrer", dest="referrer", metavar="URL", help="Referrer for HTTP URLs")
+ optionParser.add_option("-t", "--etag", dest="etag", metavar="TAG", help="ETag/If-None-Match for HTTP URLs")
+ optionParser.add_option("-m", "--last-modified", dest="modified", metavar="DATE", help="Last-modified/If-Modified-Since for HTTP URLs (any supported date format)")
+ optionParser.add_option("-f", "--format", dest="format", metavar="FORMAT", help="output results in FORMAT (text, pprint)")
+ optionParser.add_option("-v", "--verbose", action="store_true", dest="verbose", default=False, help="write debugging information to stderr")
+ (options, urls) = optionParser.parse_args()
+ if options.verbose:
+ _debug = 1
+ if not urls:
+ optionParser.print_help()
+ sys.exit(0)
+ else:
+ if not sys.argv[1:]:
+ print __doc__
+ sys.exit(0)
+ class _Options:
+ etag = modified = agent = referrer = None
+ format = 'pprint'
+ options = _Options()
+ urls = sys.argv[1:]
+
+ zopeCompatibilityHack()
+
+ serializer = globals().get(options.format.capitalize() + 'Serializer', Serializer)
+ for url in urls:
+ results = parse(url, etag=options.etag, modified=options.modified, agent=options.agent, referrer=options.referrer)
+ serializer(results).write(sys.stdout)
Deleted: trunk/lib/venus/planet/vendor/html5lib/__init__.py
===================================================================
--- branches/sucs-site/lib/venus/planet/vendor/html5lib/__init__.py 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/lib/venus/planet/vendor/html5lib/__init__.py 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,15 +0,0 @@
-"""
-HTML parsing library based on the WHATWG "HTML5"
-specification. The parser is designed to be compatible with existing
-HTML found in the wild and implements well-defined error recovery that
-is largely compatible with modern desktop web browsers.
-
-Example usage:
-
-import html5lib
-f = open("my_document.html")
-p = html5lib.HTMLParser()
-tree = p.parse(f)
-"""
-from html5parser import HTMLParser
-from liberalxmlparser import XMLParser, XHTMLParser
Copied: trunk/lib/venus/planet/vendor/html5lib/__init__.py (from rev 656, branches/sucs-site/lib/venus/planet/vendor/html5lib/__init__.py)
===================================================================
--- trunk/lib/venus/planet/vendor/html5lib/__init__.py (rev 0)
+++ trunk/lib/venus/planet/vendor/html5lib/__init__.py 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,15 @@
+"""
+HTML parsing library based on the WHATWG "HTML5"
+specification. The parser is designed to be compatible with existing
+HTML found in the wild and implements well-defined error recovery that
+is largely compatible with modern desktop web browsers.
+
+Example usage:
+
+import html5lib
+f = open("my_document.html")
+p = html5lib.HTMLParser()
+tree = p.parse(f)
+"""
+from html5parser import HTMLParser
+from liberalxmlparser import XMLParser, XHTMLParser
Deleted: trunk/lib/venus/planet/vendor/html5lib/constants.py
===================================================================
--- branches/sucs-site/lib/venus/planet/vendor/html5lib/constants.py 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/lib/venus/planet/vendor/html5lib/constants.py 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,816 +0,0 @@
-import string
-
-try:
- frozenset
-except NameError:
- # Import from the sets module for python 2.3
- from sets import Set as set
- from sets import ImmutableSet as frozenset
-
-EOF = None
-
-contentModelFlags = {
- "PCDATA":0,
- "RCDATA":1,
- "CDATA":2,
- "PLAINTEXT":3
-}
-
-scopingElements = frozenset((
- "button",
- "caption",
- "html",
- "marquee",
- "object",
- "table",
- "td",
- "th"
-))
-
-formattingElements = frozenset((
- "a",
- "b",
- "big",
- "em",
- "font",
- "i",
- "nobr",
- "s",
- "small",
- "strike",
- "strong",
- "tt",
- "u"
-))
-
-specialElements = frozenset((
- "address",
- "area",
- "base",
- "basefont",
- "bgsound",
- "blockquote",
- "body",
- "br",
- "center",
- "col",
- "colgroup",
- "dd",
- "dir",
- "div",
- "dl",
- "dt",
- "embed",
- "fieldset",
- "form",
- "frame",
- "frameset",
- "h1",
- "h2",
- "h3",
- "h4",
- "h5",
- "h6",
- "head",
- "hr",
- "iframe",
- "image",
- "img",
- "input",
- "isindex",
- "li",
- "link",
- "listing",
- "menu",
- "meta",
- "noembed",
- "noframes",
- "noscript",
- "ol",
- "optgroup",
- "option",
- "p",
- "param",
- "plaintext",
- "pre",
- "script",
- "select",
- "spacer",
- "style",
- "tbody",
- "textarea",
- "tfoot",
- "thead",
- "title",
- "tr",
- "ul",
- "wbr"
-))
-
-spaceCharacters = frozenset((
- u"\t",
- u"\n",
- u"\u000B",
- u"\u000C",
- u" ",
- u"\r"
-))
-
-tableInsertModeElements = frozenset((
- "table",
- "tbody",
- "tfoot",
- "thead",
- "tr"
-))
-
-asciiLowercase = frozenset(string.ascii_lowercase)
-asciiUppercase = frozenset(string.ascii_uppercase)
-asciiLetters = frozenset(string.ascii_letters)
-digits = frozenset(string.digits)
-hexDigits = frozenset(string.hexdigits)
-
-asciiUpper2Lower = dict([(ord(c),ord(c.lower()))
- for c in string.ascii_uppercase])
-
-# Heading elements need to be ordered
-headingElements = (
- "h1",
- "h2",
- "h3",
- "h4",
- "h5",
- "h6"
-)
-
-# XXX What about event-source and command?
-voidElements = frozenset((
- "base",
- "link",
- "meta",
- "hr",
- "br",
- "img",
- "embed",
- "param",
- "area",
- "col",
- "input"
-))
-
-cdataElements = frozenset(('title', 'textarea'))
-
-rcdataElements = frozenset((
- 'style',
- 'script',
- 'xmp',
- 'iframe',
- 'noembed',
- 'noframes',
- 'noscript'
-))
-
-booleanAttributes = {
- "": frozenset(("irrelevant",)),
- "style": frozenset(("scoped",)),
- "img": frozenset(("ismap",)),
- "audio": frozenset(("autoplay","controls")),
- "video": frozenset(("autoplay","controls")),
- "script": frozenset(("defer", "async")),
- "details": frozenset(("open",)),
- "datagrid": frozenset(("multiple", "disabled")),
- "command": frozenset(("hidden", "disabled", "checked", "default")),
- "menu": frozenset(("autosubmit",)),
- "fieldset": frozenset(("disabled", "readonly")),
- "option": frozenset(("disabled", "readonly", "selected")),
- "optgroup": frozenset(("disabled", "readonly")),
- "button": frozenset(("disabled", "autofocus")),
- "input": frozenset(("disabled", "readonly", "required", "autofocus", "checked", "ismap")),
- "select": frozenset(("disabled", "readonly", "autofocus", "multiple")),
- "output": frozenset(("disabled", "readonly")),
-}
-
-# entitiesWindows1252 has to be _ordered_ and needs to have an index. It
-# therefore can't be a frozenset.
-entitiesWindows1252 = (
- 8364, # 0x80 0x20AC EURO SIGN
- 65533, # 0x81 UNDEFINED
- 8218, # 0x82 0x201A SINGLE LOW-9 QUOTATION MARK
- 402, # 0x83 0x0192 LATIN SMALL LETTER F WITH HOOK
- 8222, # 0x84 0x201E DOUBLE LOW-9 QUOTATION MARK
- 8230, # 0x85 0x2026 HORIZONTAL ELLIPSIS
- 8224, # 0x86 0x2020 DAGGER
- 8225, # 0x87 0x2021 DOUBLE DAGGER
- 710, # 0x88 0x02C6 MODIFIER LETTER CIRCUMFLEX ACCENT
- 8240, # 0x89 0x2030 PER MILLE SIGN
- 352, # 0x8A 0x0160 LATIN CAPITAL LETTER S WITH CARON
- 8249, # 0x8B 0x2039 SINGLE LEFT-POINTING ANGLE QUOTATION MARK
- 338, # 0x8C 0x0152 LATIN CAPITAL LIGATURE OE
- 65533, # 0x8D UNDEFINED
- 381, # 0x8E 0x017D LATIN CAPITAL LETTER Z WITH CARON
- 65533, # 0x8F UNDEFINED
- 65533, # 0x90 UNDEFINED
- 8216, # 0x91 0x2018 LEFT SINGLE QUOTATION MARK
- 8217, # 0x92 0x2019 RIGHT SINGLE QUOTATION MARK
- 8220, # 0x93 0x201C LEFT DOUBLE QUOTATION MARK
- 8221, # 0x94 0x201D RIGHT DOUBLE QUOTATION MARK
- 8226, # 0x95 0x2022 BULLET
- 8211, # 0x96 0x2013 EN DASH
- 8212, # 0x97 0x2014 EM DASH
- 732, # 0x98 0x02DC SMALL TILDE
- 8482, # 0x99 0x2122 TRADE MARK SIGN
- 353, # 0x9A 0x0161 LATIN SMALL LETTER S WITH CARON
- 8250, # 0x9B 0x203A SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
- 339, # 0x9C 0x0153 LATIN SMALL LIGATURE OE
- 65533, # 0x9D UNDEFINED
- 382, # 0x9E 0x017E LATIN SMALL LETTER Z WITH CARON
- 376 # 0x9F 0x0178 LATIN CAPITAL LETTER Y WITH DIAERESIS
-)
-
-entities = {
- "AElig;": u"\u00C6",
- "AElig": u"\u00C6",
- "AMP;": u"\u0026",
- "AMP": u"\u0026",
- "Aacute;": u"\u00C1",
- "Aacute": u"\u00C1",
- "Acirc;": u"\u00C2",
- "Acirc": u"\u00C2",
- "Agrave;": u"\u00C0",
- "Agrave": u"\u00C0",
- "Alpha;": u"\u0391",
- "Aring;": u"\u00C5",
- "Aring": u"\u00C5",
- "Atilde;": u"\u00C3",
- "Atilde": u"\u00C3",
- "Auml;": u"\u00C4",
- "Auml": u"\u00C4",
- "Beta;": u"\u0392",
- "COPY;": u"\u00A9",
- "COPY": u"\u00A9",
- "Ccedil;": u"\u00C7",
- "Ccedil": u"\u00C7",
- "Chi;": u"\u03A7",
- "Dagger;": u"\u2021",
- "Delta;": u"\u0394",
- "ETH;": u"\u00D0",
- "ETH": u"\u00D0",
- "Eacute;": u"\u00C9",
- "Eacute": u"\u00C9",
- "Ecirc;": u"\u00CA",
- "Ecirc": u"\u00CA",
- "Egrave;": u"\u00C8",
- "Egrave": u"\u00C8",
- "Epsilon;": u"\u0395",
- "Eta;": u"\u0397",
- "Euml;": u"\u00CB",
- "Euml": u"\u00CB",
- "GT;": u"\u003E",
- "GT": u"\u003E",
- "Gamma;": u"\u0393",
- "Iacute;": u"\u00CD",
- "Iacute": u"\u00CD",
- "Icirc;": u"\u00CE",
- "Icirc": u"\u00CE",
- "Igrave;": u"\u00CC",
- "Igrave": u"\u00CC",
- "Iota;": u"\u0399",
- "Iuml;": u"\u00CF",
- "Iuml": u"\u00CF",
- "Kappa;": u"\u039A",
- "LT;": u"\u003C",
- "LT": u"\u003C",
- "Lambda;": u"\u039B",
- "Mu;": u"\u039C",
- "Ntilde;": u"\u00D1",
- "Ntilde": u"\u00D1",
- "Nu;": u"\u039D",
- "OElig;": u"\u0152",
- "Oacute;": u"\u00D3",
- "Oacute": u"\u00D3",
- "Ocirc;": u"\u00D4",
- "Ocirc": u"\u00D4",
- "Ograve;": u"\u00D2",
- "Ograve": u"\u00D2",
- "Omega;": u"\u03A9",
- "Omicron;": u"\u039F",
- "Oslash;": u"\u00D8",
- "Oslash": u"\u00D8",
- "Otilde;": u"\u00D5",
- "Otilde": u"\u00D5",
- "Ouml;": u"\u00D6",
- "Ouml": u"\u00D6",
- "Phi;": u"\u03A6",
- "Pi;": u"\u03A0",
- "Prime;": u"\u2033",
- "Psi;": u"\u03A8",
- "QUOT;": u"\u0022",
- "QUOT": u"\u0022",
- "REG;": u"\u00AE",
- "REG": u"\u00AE",
- "Rho;": u"\u03A1",
- "Scaron;": u"\u0160",
- "Sigma;": u"\u03A3",
- "THORN;": u"\u00DE",
- "THORN": u"\u00DE",
- "TRADE;": u"\u2122",
- "Tau;": u"\u03A4",
- "Theta;": u"\u0398",
- "Uacute;": u"\u00DA",
- "Uacute": u"\u00DA",
- "Ucirc;": u"\u00DB",
- "Ucirc": u"\u00DB",
- "Ugrave;": u"\u00D9",
- "Ugrave": u"\u00D9",
- "Upsilon;": u"\u03A5",
- "Uuml;": u"\u00DC",
- "Uuml": u"\u00DC",
- "Xi;": u"\u039E",
- "Yacute;": u"\u00DD",
- "Yacute": u"\u00DD",
- "Yuml;": u"\u0178",
- "Zeta;": u"\u0396",
- "aacute;": u"\u00E1",
- "aacute": u"\u00E1",
- "acirc;": u"\u00E2",
- "acirc": u"\u00E2",
- "acute;": u"\u00B4",
- "acute": u"\u00B4",
- "aelig;": u"\u00E6",
- "aelig": u"\u00E6",
- "agrave;": u"\u00E0",
- "agrave": u"\u00E0",
- "alefsym;": u"\u2135",
- "alpha;": u"\u03B1",
- "amp;": u"\u0026",
- "amp": u"\u0026",
- "and;": u"\u2227",
- "ang;": u"\u2220",
- "apos;": u"\u0027",
- "aring;": u"\u00E5",
- "aring": u"\u00E5",
- "asymp;": u"\u2248",
- "atilde;": u"\u00E3",
- "atilde": u"\u00E3",
- "auml;": u"\u00E4",
- "auml": u"\u00E4",
- "bdquo;": u"\u201E",
- "beta;": u"\u03B2",
- "brvbar;": u"\u00A6",
- "brvbar": u"\u00A6",
- "bull;": u"\u2022",
- "cap;": u"\u2229",
- "ccedil;": u"\u00E7",
- "ccedil": u"\u00E7",
- "cedil;": u"\u00B8",
- "cedil": u"\u00B8",
- "cent;": u"\u00A2",
- "cent": u"\u00A2",
- "chi;": u"\u03C7",
- "circ;": u"\u02C6",
- "clubs;": u"\u2663",
- "cong;": u"\u2245",
- "copy;": u"\u00A9",
- "copy": u"\u00A9",
- "crarr;": u"\u21B5",
- "cup;": u"\u222A",
- "curren;": u"\u00A4",
- "curren": u"\u00A4",
- "dArr;": u"\u21D3",
- "dagger;": u"\u2020",
- "darr;": u"\u2193",
- "deg;": u"\u00B0",
- "deg": u"\u00B0",
- "delta;": u"\u03B4",
- "diams;": u"\u2666",
- "divide;": u"\u00F7",
- "divide": u"\u00F7",
- "eacute;": u"\u00E9",
- "eacute": u"\u00E9",
- "ecirc;": u"\u00EA",
- "ecirc": u"\u00EA",
- "egrave;": u"\u00E8",
- "egrave": u"\u00E8",
- "empty;": u"\u2205",
- "emsp;": u"\u2003",
- "ensp;": u"\u2002",
- "epsilon;": u"\u03B5",
- "equiv;": u"\u2261",
- "eta;": u"\u03B7",
- "eth;": u"\u00F0",
- "eth": u"\u00F0",
- "euml;": u"\u00EB",
- "euml": u"\u00EB",
- "euro;": u"\u20AC",
- "exist;": u"\u2203",
- "fnof;": u"\u0192",
- "forall;": u"\u2200",
- "frac12;": u"\u00BD",
- "frac12": u"\u00BD",
- "frac14;": u"\u00BC",
- "frac14": u"\u00BC",
- "frac34;": u"\u00BE",
- "frac34": u"\u00BE",
- "frasl;": u"\u2044",
- "gamma;": u"\u03B3",
- "ge;": u"\u2265",
- "gt;": u"\u003E",
- "gt": u"\u003E",
- "hArr;": u"\u21D4",
- "harr;": u"\u2194",
- "hearts;": u"\u2665",
- "hellip;": u"\u2026",
- "iacute;": u"\u00ED",
- "iacute": u"\u00ED",
- "icirc;": u"\u00EE",
- "icirc": u"\u00EE",
- "iexcl;": u"\u00A1",
- "iexcl": u"\u00A1",
- "igrave;": u"\u00EC",
- "igrave": u"\u00EC",
- "image;": u"\u2111",
- "infin;": u"\u221E",
- "int;": u"\u222B",
- "iota;": u"\u03B9",
- "iquest;": u"\u00BF",
- "iquest": u"\u00BF",
- "isin;": u"\u2208",
- "iuml;": u"\u00EF",
- "iuml": u"\u00EF",
- "kappa;": u"\u03BA",
- "lArr;": u"\u21D0",
- "lambda;": u"\u03BB",
- "lang;": u"\u3008",
- "laquo;": u"\u00AB",
- "laquo": u"\u00AB",
- "larr;": u"\u2190",
- "lceil;": u"\u2308",
- "ldquo;": u"\u201C",
- "le;": u"\u2264",
- "lfloor;": u"\u230A",
- "lowast;": u"\u2217",
- "loz;": u"\u25CA",
- "lrm;": u"\u200E",
- "lsaquo;": u"\u2039",
- "lsquo;": u"\u2018",
- "lt;": u"\u003C",
- "lt": u"\u003C",
- "macr;": u"\u00AF",
- "macr": u"\u00AF",
- "mdash;": u"\u2014",
- "micro;": u"\u00B5",
- "micro": u"\u00B5",
- "middot;": u"\u00B7",
- "middot": u"\u00B7",
- "minus;": u"\u2212",
- "mu;": u"\u03BC",
- "nabla;": u"\u2207",
- "nbsp;": u"\u00A0",
- "nbsp": u"\u00A0",
- "ndash;": u"\u2013",
- "ne;": u"\u2260",
- "ni;": u"\u220B",
- "not;": u"\u00AC",
- "not": u"\u00AC",
- "notin;": u"\u2209",
- "nsub;": u"\u2284",
- "ntilde;": u"\u00F1",
- "ntilde": u"\u00F1",
- "nu;": u"\u03BD",
- "oacute;": u"\u00F3",
- "oacute": u"\u00F3",
- "ocirc;": u"\u00F4",
- "ocirc": u"\u00F4",
- "oelig;": u"\u0153",
- "ograve;": u"\u00F2",
- "ograve": u"\u00F2",
- "oline;": u"\u203E",
- "omega;": u"\u03C9",
- "omicron;": u"\u03BF",
- "oplus;": u"\u2295",
- "or;": u"\u2228",
- "ordf;": u"\u00AA",
- "ordf": u"\u00AA",
- "ordm;": u"\u00BA",
- "ordm": u"\u00BA",
- "oslash;": u"\u00F8",
- "oslash": u"\u00F8",
- "otilde;": u"\u00F5",
- "otilde": u"\u00F5",
- "otimes;": u"\u2297",
- "ouml;": u"\u00F6",
- "ouml": u"\u00F6",
- "para;": u"\u00B6",
- "para": u"\u00B6",
- "part;": u"\u2202",
- "permil;": u"\u2030",
- "perp;": u"\u22A5",
- "phi;": u"\u03C6",
- "pi;": u"\u03C0",
- "piv;": u"\u03D6",
- "plusmn;": u"\u00B1",
- "plusmn": u"\u00B1",
- "pound;": u"\u00A3",
- "pound": u"\u00A3",
- "prime;": u"\u2032",
- "prod;": u"\u220F",
- "prop;": u"\u221D",
- "psi;": u"\u03C8",
- "quot;": u"\u0022",
- "quot": u"\u0022",
- "rArr;": u"\u21D2",
- "radic;": u"\u221A",
- "rang;": u"\u3009",
- "raquo;": u"\u00BB",
- "raquo": u"\u00BB",
- "rarr;": u"\u2192",
- "rceil;": u"\u2309",
- "rdquo;": u"\u201D",
- "real;": u"\u211C",
- "reg;": u"\u00AE",
- "reg": u"\u00AE",
- "rfloor;": u"\u230B",
- "rho;": u"\u03C1",
- "rlm;": u"\u200F",
- "rsaquo;": u"\u203A",
- "rsquo;": u"\u2019",
- "sbquo;": u"\u201A",
- "scaron;": u"\u0161",
- "sdot;": u"\u22C5",
- "sect;": u"\u00A7",
- "sect": u"\u00A7",
- "shy;": u"\u00AD",
- "shy": u"\u00AD",
- "sigma;": u"\u03C3",
- "sigmaf;": u"\u03C2",
- "sim;": u"\u223C",
- "spades;": u"\u2660",
- "sub;": u"\u2282",
- "sube;": u"\u2286",
- "sum;": u"\u2211",
- "sup1;": u"\u00B9",
- "sup1": u"\u00B9",
- "sup2;": u"\u00B2",
- "sup2": u"\u00B2",
- "sup3;": u"\u00B3",
- "sup3": u"\u00B3",
- "sup;": u"\u2283",
- "supe;": u"\u2287",
- "szlig;": u"\u00DF",
- "szlig": u"\u00DF",
- "tau;": u"\u03C4",
- "there4;": u"\u2234",
- "theta;": u"\u03B8",
- "thetasym;": u"\u03D1",
- "thinsp;": u"\u2009",
- "thorn;": u"\u00FE",
- "thorn": u"\u00FE",
- "tilde;": u"\u02DC",
- "times;": u"\u00D7",
- "times": u"\u00D7",
- "trade;": u"\u2122",
- "uArr;": u"\u21D1",
- "uacute;": u"\u00FA",
- "uacute": u"\u00FA",
- "uarr;": u"\u2191",
- "ucirc;": u"\u00FB",
- "ucirc": u"\u00FB",
- "ugrave;": u"\u00F9",
- "ugrave": u"\u00F9",
- "uml;": u"\u00A8",
- "uml": u"\u00A8",
- "upsih;": u"\u03D2",
- "upsilon;": u"\u03C5",
- "uuml;": u"\u00FC",
- "uuml": u"\u00FC",
- "weierp;": u"\u2118",
- "xi;": u"\u03BE",
- "yacute;": u"\u00FD",
- "yacute": u"\u00FD",
- "yen;": u"\u00A5",
- "yen": u"\u00A5",
- "yuml;": u"\u00FF",
- "yuml": u"\u00FF",
- "zeta;": u"\u03B6",
- "zwj;": u"\u200D",
- "zwnj;": u"\u200C"
-}
-
-encodings = frozenset((
- "ansi_x3.4-1968",
- "iso-ir-6",
- "ansi_x3.4-1986",
- "iso_646.irv:1991",
- "ascii",
- "iso646-us",
- "us-ascii",
- "us",
- "ibm367",
- "cp367",
- "csascii",
- "ks_c_5601-1987",
- "korean",
- "iso-2022-kr",
- "csiso2022kr",
- "euc-kr",
- "iso-2022-jp",
- "csiso2022jp",
- "iso-2022-jp-2",
- "iso-ir-58",
- "chinese",
- "csiso58gb231280",
- "iso_8859-1:1987",
- "iso-ir-100",
- "iso_8859-1",
- "iso-8859-1",
- "latin1",
- "l1",
- "ibm819",
- "cp819",
- "csisolatin1",
- "iso_8859-2:1987",
- "iso-ir-101",
- "iso_8859-2",
- "iso-8859-2",
- "latin2",
- "l2",
- "csisolatin2",
- "iso_8859-3:1988",
- "iso-ir-109",
- "iso_8859-3",
- "iso-8859-3",
- "latin3",
- "l3",
- "csisolatin3",
- "iso_8859-4:1988",
- "iso-ir-110",
- "iso_8859-4",
- "iso-8859-4",
- "latin4",
- "l4",
- "csisolatin4",
- "iso_8859-6:1987",
- "iso-ir-127",
- "iso_8859-6",
- "iso-8859-6",
- "ecma-114",
- "asmo-708",
- "arabic",
- "csisolatinarabic",
- "iso_8859-7:1987",
- "iso-ir-126",
- "iso_8859-7",
- "iso-8859-7",
- "elot_928",
- "ecma-118",
- "greek",
- "greek8",
- "csisolatingreek",
- "iso_8859-8:1988",
- "iso-ir-138",
- "iso_8859-8",
- "iso-8859-8",
- "hebrew",
- "csisolatinhebrew",
- "iso_8859-5:1988",
- "iso-ir-144",
- "iso_8859-5",
- "iso-8859-5",
- "cyrillic",
- "csisolatincyrillic",
- "iso_8859-9:1989",
- "iso-ir-148",
- "iso_8859-9",
- "iso-8859-9",
- "latin5",
- "l5",
- "csisolatin5",
- "iso-8859-10",
- "iso-ir-157",
- "l6",
- "iso_8859-10:1992",
- "csisolatin6",
- "latin6",
- "hp-roman8",
- "roman8",
- "r8",
- "ibm037",
- "cp037",
- "csibm037",
- "ibm424",
- "cp424",
- "csibm424",
- "ibm437",
- "cp437",
- "437",
- "cspc8codepage437",
- "ibm500",
- "cp500",
- "csibm500",
- "ibm775",
- "cp775",
- "cspc775baltic",
- "ibm850",
- "cp850",
- "850",
- "cspc850multilingual",
- "ibm852",
- "cp852",
- "852",
- "cspcp852",
- "ibm855",
- "cp855",
- "855",
- "csibm855",
- "ibm857",
- "cp857",
- "857",
- "csibm857",
- "ibm860",
- "cp860",
- "860",
- "csibm860",
- "ibm861",
- "cp861",
- "861",
- "cp-is",
- "csibm861",
- "ibm862",
- "cp862",
- "862",
- "cspc862latinhebrew",
- "ibm863",
- "cp863",
- "863",
- "csibm863",
- "ibm864",
- "cp864",
- "csibm864",
- "ibm865",
- "cp865",
- "865",
- "csibm865",
- "ibm866",
- "cp866",
- "866",
- "csibm866",
- "ibm869",
- "cp869",
- "869",
- "cp-gr",
- "csibm869",
- "ibm1026",
- "cp1026",
- "csibm1026",
- "koi8-r",
- "cskoi8r",
- "koi8-u",
- "big5-hkscs",
- "ptcp154",
- "csptcp154",
- "pt154",
- "cp154",
- "utf-7",
- "utf-16be",
- "utf-16le",
- "utf-16",
- "utf-8",
- "iso-8859-13",
- "iso-8859-14",
- "iso-ir-199",
- "iso_8859-14:1998",
- "iso_8859-14",
- "latin8",
- "iso-celtic",
- "l8",
- "iso-8859-15",
- "iso_8859-15",
- "iso-8859-16",
- "iso-ir-226",
- "iso_8859-16:2001",
- "iso_8859-16",
- "latin10",
- "l10",
- "gbk",
- "cp936",
- "ms936",
- "gb18030",
- "shift_jis",
- "ms_kanji",
- "csshiftjis",
- "euc-jp",
- "gb2312",
- "big5",
- "csbig5",
- "windows-1250",
- "windows-1251",
- "windows-1252",
- "windows-1253",
- "windows-1254",
- "windows-1255",
- "windows-1256",
- "windows-1257",
- "windows-1258",
- "tis-620",
- "hz-gb-2312",
- ))
\ No newline at end of file
Copied: trunk/lib/venus/planet/vendor/html5lib/constants.py (from rev 656, branches/sucs-site/lib/venus/planet/vendor/html5lib/constants.py)
===================================================================
--- trunk/lib/venus/planet/vendor/html5lib/constants.py (rev 0)
+++ trunk/lib/venus/planet/vendor/html5lib/constants.py 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,816 @@
+import string
+
+try:
+ frozenset
+except NameError:
+ # Import from the sets module for python 2.3
+ from sets import Set as set
+ from sets import ImmutableSet as frozenset
+
+EOF = None
+
+contentModelFlags = {
+ "PCDATA":0,
+ "RCDATA":1,
+ "CDATA":2,
+ "PLAINTEXT":3
+}
+
+scopingElements = frozenset((
+ "button",
+ "caption",
+ "html",
+ "marquee",
+ "object",
+ "table",
+ "td",
+ "th"
+))
+
+formattingElements = frozenset((
+ "a",
+ "b",
+ "big",
+ "em",
+ "font",
+ "i",
+ "nobr",
+ "s",
+ "small",
+ "strike",
+ "strong",
+ "tt",
+ "u"
+))
+
+specialElements = frozenset((
+ "address",
+ "area",
+ "base",
+ "basefont",
+ "bgsound",
+ "blockquote",
+ "body",
+ "br",
+ "center",
+ "col",
+ "colgroup",
+ "dd",
+ "dir",
+ "div",
+ "dl",
+ "dt",
+ "embed",
+ "fieldset",
+ "form",
+ "frame",
+ "frameset",
+ "h1",
+ "h2",
+ "h3",
+ "h4",
+ "h5",
+ "h6",
+ "head",
+ "hr",
+ "iframe",
+ "image",
+ "img",
+ "input",
+ "isindex",
+ "li",
+ "link",
+ "listing",
+ "menu",
+ "meta",
+ "noembed",
+ "noframes",
+ "noscript",
+ "ol",
+ "optgroup",
+ "option",
+ "p",
+ "param",
+ "plaintext",
+ "pre",
+ "script",
+ "select",
+ "spacer",
+ "style",
+ "tbody",
+ "textarea",
+ "tfoot",
+ "thead",
+ "title",
+ "tr",
+ "ul",
+ "wbr"
+))
+
+spaceCharacters = frozenset((
+ u"\t",
+ u"\n",
+ u"\u000B",
+ u"\u000C",
+ u" ",
+ u"\r"
+))
+
+tableInsertModeElements = frozenset((
+ "table",
+ "tbody",
+ "tfoot",
+ "thead",
+ "tr"
+))
+
+asciiLowercase = frozenset(string.ascii_lowercase)
+asciiUppercase = frozenset(string.ascii_uppercase)
+asciiLetters = frozenset(string.ascii_letters)
+digits = frozenset(string.digits)
+hexDigits = frozenset(string.hexdigits)
+
+asciiUpper2Lower = dict([(ord(c),ord(c.lower()))
+ for c in string.ascii_uppercase])
+
+# Heading elements need to be ordered
+headingElements = (
+ "h1",
+ "h2",
+ "h3",
+ "h4",
+ "h5",
+ "h6"
+)
+
+# XXX What about event-source and command?
+voidElements = frozenset((
+ "base",
+ "link",
+ "meta",
+ "hr",
+ "br",
+ "img",
+ "embed",
+ "param",
+ "area",
+ "col",
+ "input"
+))
+
+cdataElements = frozenset(('title', 'textarea'))
+
+rcdataElements = frozenset((
+ 'style',
+ 'script',
+ 'xmp',
+ 'iframe',
+ 'noembed',
+ 'noframes',
+ 'noscript'
+))
+
+booleanAttributes = {
+ "": frozenset(("irrelevant",)),
+ "style": frozenset(("scoped",)),
+ "img": frozenset(("ismap",)),
+ "audio": frozenset(("autoplay","controls")),
+ "video": frozenset(("autoplay","controls")),
+ "script": frozenset(("defer", "async")),
+ "details": frozenset(("open",)),
+ "datagrid": frozenset(("multiple", "disabled")),
+ "command": frozenset(("hidden", "disabled", "checked", "default")),
+ "menu": frozenset(("autosubmit",)),
+ "fieldset": frozenset(("disabled", "readonly")),
+ "option": frozenset(("disabled", "readonly", "selected")),
+ "optgroup": frozenset(("disabled", "readonly")),
+ "button": frozenset(("disabled", "autofocus")),
+ "input": frozenset(("disabled", "readonly", "required", "autofocus", "checked", "ismap")),
+ "select": frozenset(("disabled", "readonly", "autofocus", "multiple")),
+ "output": frozenset(("disabled", "readonly")),
+}
+
+# entitiesWindows1252 has to be _ordered_ and needs to have an index. It
+# therefore can't be a frozenset.
+entitiesWindows1252 = (
+ 8364, # 0x80 0x20AC EURO SIGN
+ 65533, # 0x81 UNDEFINED
+ 8218, # 0x82 0x201A SINGLE LOW-9 QUOTATION MARK
+ 402, # 0x83 0x0192 LATIN SMALL LETTER F WITH HOOK
+ 8222, # 0x84 0x201E DOUBLE LOW-9 QUOTATION MARK
+ 8230, # 0x85 0x2026 HORIZONTAL ELLIPSIS
+ 8224, # 0x86 0x2020 DAGGER
+ 8225, # 0x87 0x2021 DOUBLE DAGGER
+ 710, # 0x88 0x02C6 MODIFIER LETTER CIRCUMFLEX ACCENT
+ 8240, # 0x89 0x2030 PER MILLE SIGN
+ 352, # 0x8A 0x0160 LATIN CAPITAL LETTER S WITH CARON
+ 8249, # 0x8B 0x2039 SINGLE LEFT-POINTING ANGLE QUOTATION MARK
+ 338, # 0x8C 0x0152 LATIN CAPITAL LIGATURE OE
+ 65533, # 0x8D UNDEFINED
+ 381, # 0x8E 0x017D LATIN CAPITAL LETTER Z WITH CARON
+ 65533, # 0x8F UNDEFINED
+ 65533, # 0x90 UNDEFINED
+ 8216, # 0x91 0x2018 LEFT SINGLE QUOTATION MARK
+ 8217, # 0x92 0x2019 RIGHT SINGLE QUOTATION MARK
+ 8220, # 0x93 0x201C LEFT DOUBLE QUOTATION MARK
+ 8221, # 0x94 0x201D RIGHT DOUBLE QUOTATION MARK
+ 8226, # 0x95 0x2022 BULLET
+ 8211, # 0x96 0x2013 EN DASH
+ 8212, # 0x97 0x2014 EM DASH
+ 732, # 0x98 0x02DC SMALL TILDE
+ 8482, # 0x99 0x2122 TRADE MARK SIGN
+ 353, # 0x9A 0x0161 LATIN SMALL LETTER S WITH CARON
+ 8250, # 0x9B 0x203A SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
+ 339, # 0x9C 0x0153 LATIN SMALL LIGATURE OE
+ 65533, # 0x9D UNDEFINED
+ 382, # 0x9E 0x017E LATIN SMALL LETTER Z WITH CARON
+ 376 # 0x9F 0x0178 LATIN CAPITAL LETTER Y WITH DIAERESIS
+)
+
+entities = {
+ "AElig;": u"\u00C6",
+ "AElig": u"\u00C6",
+ "AMP;": u"\u0026",
+ "AMP": u"\u0026",
+ "Aacute;": u"\u00C1",
+ "Aacute": u"\u00C1",
+ "Acirc;": u"\u00C2",
+ "Acirc": u"\u00C2",
+ "Agrave;": u"\u00C0",
+ "Agrave": u"\u00C0",
+ "Alpha;": u"\u0391",
+ "Aring;": u"\u00C5",
+ "Aring": u"\u00C5",
+ "Atilde;": u"\u00C3",
+ "Atilde": u"\u00C3",
+ "Auml;": u"\u00C4",
+ "Auml": u"\u00C4",
+ "Beta;": u"\u0392",
+ "COPY;": u"\u00A9",
+ "COPY": u"\u00A9",
+ "Ccedil;": u"\u00C7",
+ "Ccedil": u"\u00C7",
+ "Chi;": u"\u03A7",
+ "Dagger;": u"\u2021",
+ "Delta;": u"\u0394",
+ "ETH;": u"\u00D0",
+ "ETH": u"\u00D0",
+ "Eacute;": u"\u00C9",
+ "Eacute": u"\u00C9",
+ "Ecirc;": u"\u00CA",
+ "Ecirc": u"\u00CA",
+ "Egrave;": u"\u00C8",
+ "Egrave": u"\u00C8",
+ "Epsilon;": u"\u0395",
+ "Eta;": u"\u0397",
+ "Euml;": u"\u00CB",
+ "Euml": u"\u00CB",
+ "GT;": u"\u003E",
+ "GT": u"\u003E",
+ "Gamma;": u"\u0393",
+ "Iacute;": u"\u00CD",
+ "Iacute": u"\u00CD",
+ "Icirc;": u"\u00CE",
+ "Icirc": u"\u00CE",
+ "Igrave;": u"\u00CC",
+ "Igrave": u"\u00CC",
+ "Iota;": u"\u0399",
+ "Iuml;": u"\u00CF",
+ "Iuml": u"\u00CF",
+ "Kappa;": u"\u039A",
+ "LT;": u"\u003C",
+ "LT": u"\u003C",
+ "Lambda;": u"\u039B",
+ "Mu;": u"\u039C",
+ "Ntilde;": u"\u00D1",
+ "Ntilde": u"\u00D1",
+ "Nu;": u"\u039D",
+ "OElig;": u"\u0152",
+ "Oacute;": u"\u00D3",
+ "Oacute": u"\u00D3",
+ "Ocirc;": u"\u00D4",
+ "Ocirc": u"\u00D4",
+ "Ograve;": u"\u00D2",
+ "Ograve": u"\u00D2",
+ "Omega;": u"\u03A9",
+ "Omicron;": u"\u039F",
+ "Oslash;": u"\u00D8",
+ "Oslash": u"\u00D8",
+ "Otilde;": u"\u00D5",
+ "Otilde": u"\u00D5",
+ "Ouml;": u"\u00D6",
+ "Ouml": u"\u00D6",
+ "Phi;": u"\u03A6",
+ "Pi;": u"\u03A0",
+ "Prime;": u"\u2033",
+ "Psi;": u"\u03A8",
+ "QUOT;": u"\u0022",
+ "QUOT": u"\u0022",
+ "REG;": u"\u00AE",
+ "REG": u"\u00AE",
+ "Rho;": u"\u03A1",
+ "Scaron;": u"\u0160",
+ "Sigma;": u"\u03A3",
+ "THORN;": u"\u00DE",
+ "THORN": u"\u00DE",
+ "TRADE;": u"\u2122",
+ "Tau;": u"\u03A4",
+ "Theta;": u"\u0398",
+ "Uacute;": u"\u00DA",
+ "Uacute": u"\u00DA",
+ "Ucirc;": u"\u00DB",
+ "Ucirc": u"\u00DB",
+ "Ugrave;": u"\u00D9",
+ "Ugrave": u"\u00D9",
+ "Upsilon;": u"\u03A5",
+ "Uuml;": u"\u00DC",
+ "Uuml": u"\u00DC",
+ "Xi;": u"\u039E",
+ "Yacute;": u"\u00DD",
+ "Yacute": u"\u00DD",
+ "Yuml;": u"\u0178",
+ "Zeta;": u"\u0396",
+ "aacute;": u"\u00E1",
+ "aacute": u"\u00E1",
+ "acirc;": u"\u00E2",
+ "acirc": u"\u00E2",
+ "acute;": u"\u00B4",
+ "acute": u"\u00B4",
+ "aelig;": u"\u00E6",
+ "aelig": u"\u00E6",
+ "agrave;": u"\u00E0",
+ "agrave": u"\u00E0",
+ "alefsym;": u"\u2135",
+ "alpha;": u"\u03B1",
+ "amp;": u"\u0026",
+ "amp": u"\u0026",
+ "and;": u"\u2227",
+ "ang;": u"\u2220",
+ "apos;": u"\u0027",
+ "aring;": u"\u00E5",
+ "aring": u"\u00E5",
+ "asymp;": u"\u2248",
+ "atilde;": u"\u00E3",
+ "atilde": u"\u00E3",
+ "auml;": u"\u00E4",
+ "auml": u"\u00E4",
+ "bdquo;": u"\u201E",
+ "beta;": u"\u03B2",
+ "brvbar;": u"\u00A6",
+ "brvbar": u"\u00A6",
+ "bull;": u"\u2022",
+ "cap;": u"\u2229",
+ "ccedil;": u"\u00E7",
+ "ccedil": u"\u00E7",
+ "cedil;": u"\u00B8",
+ "cedil": u"\u00B8",
+ "cent;": u"\u00A2",
+ "cent": u"\u00A2",
+ "chi;": u"\u03C7",
+ "circ;": u"\u02C6",
+ "clubs;": u"\u2663",
+ "cong;": u"\u2245",
+ "copy;": u"\u00A9",
+ "copy": u"\u00A9",
+ "crarr;": u"\u21B5",
+ "cup;": u"\u222A",
+ "curren;": u"\u00A4",
+ "curren": u"\u00A4",
+ "dArr;": u"\u21D3",
+ "dagger;": u"\u2020",
+ "darr;": u"\u2193",
+ "deg;": u"\u00B0",
+ "deg": u"\u00B0",
+ "delta;": u"\u03B4",
+ "diams;": u"\u2666",
+ "divide;": u"\u00F7",
+ "divide": u"\u00F7",
+ "eacute;": u"\u00E9",
+ "eacute": u"\u00E9",
+ "ecirc;": u"\u00EA",
+ "ecirc": u"\u00EA",
+ "egrave;": u"\u00E8",
+ "egrave": u"\u00E8",
+ "empty;": u"\u2205",
+ "emsp;": u"\u2003",
+ "ensp;": u"\u2002",
+ "epsilon;": u"\u03B5",
+ "equiv;": u"\u2261",
+ "eta;": u"\u03B7",
+ "eth;": u"\u00F0",
+ "eth": u"\u00F0",
+ "euml;": u"\u00EB",
+ "euml": u"\u00EB",
+ "euro;": u"\u20AC",
+ "exist;": u"\u2203",
+ "fnof;": u"\u0192",
+ "forall;": u"\u2200",
+ "frac12;": u"\u00BD",
+ "frac12": u"\u00BD",
+ "frac14;": u"\u00BC",
+ "frac14": u"\u00BC",
+ "frac34;": u"\u00BE",
+ "frac34": u"\u00BE",
+ "frasl;": u"\u2044",
+ "gamma;": u"\u03B3",
+ "ge;": u"\u2265",
+ "gt;": u"\u003E",
+ "gt": u"\u003E",
+ "hArr;": u"\u21D4",
+ "harr;": u"\u2194",
+ "hearts;": u"\u2665",
+ "hellip;": u"\u2026",
+ "iacute;": u"\u00ED",
+ "iacute": u"\u00ED",
+ "icirc;": u"\u00EE",
+ "icirc": u"\u00EE",
+ "iexcl;": u"\u00A1",
+ "iexcl": u"\u00A1",
+ "igrave;": u"\u00EC",
+ "igrave": u"\u00EC",
+ "image;": u"\u2111",
+ "infin;": u"\u221E",
+ "int;": u"\u222B",
+ "iota;": u"\u03B9",
+ "iquest;": u"\u00BF",
+ "iquest": u"\u00BF",
+ "isin;": u"\u2208",
+ "iuml;": u"\u00EF",
+ "iuml": u"\u00EF",
+ "kappa;": u"\u03BA",
+ "lArr;": u"\u21D0",
+ "lambda;": u"\u03BB",
+ "lang;": u"\u3008",
+ "laquo;": u"\u00AB",
+ "laquo": u"\u00AB",
+ "larr;": u"\u2190",
+ "lceil;": u"\u2308",
+ "ldquo;": u"\u201C",
+ "le;": u"\u2264",
+ "lfloor;": u"\u230A",
+ "lowast;": u"\u2217",
+ "loz;": u"\u25CA",
+ "lrm;": u"\u200E",
+ "lsaquo;": u"\u2039",
+ "lsquo;": u"\u2018",
+ "lt;": u"\u003C",
+ "lt": u"\u003C",
+ "macr;": u"\u00AF",
+ "macr": u"\u00AF",
+ "mdash;": u"\u2014",
+ "micro;": u"\u00B5",
+ "micro": u"\u00B5",
+ "middot;": u"\u00B7",
+ "middot": u"\u00B7",
+ "minus;": u"\u2212",
+ "mu;": u"\u03BC",
+ "nabla;": u"\u2207",
+ "nbsp;": u"\u00A0",
+ "nbsp": u"\u00A0",
+ "ndash;": u"\u2013",
+ "ne;": u"\u2260",
+ "ni;": u"\u220B",
+ "not;": u"\u00AC",
+ "not": u"\u00AC",
+ "notin;": u"\u2209",
+ "nsub;": u"\u2284",
+ "ntilde;": u"\u00F1",
+ "ntilde": u"\u00F1",
+ "nu;": u"\u03BD",
+ "oacute;": u"\u00F3",
+ "oacute": u"\u00F3",
+ "ocirc;": u"\u00F4",
+ "ocirc": u"\u00F4",
+ "oelig;": u"\u0153",
+ "ograve;": u"\u00F2",
+ "ograve": u"\u00F2",
+ "oline;": u"\u203E",
+ "omega;": u"\u03C9",
+ "omicron;": u"\u03BF",
+ "oplus;": u"\u2295",
+ "or;": u"\u2228",
+ "ordf;": u"\u00AA",
+ "ordf": u"\u00AA",
+ "ordm;": u"\u00BA",
+ "ordm": u"\u00BA",
+ "oslash;": u"\u00F8",
+ "oslash": u"\u00F8",
+ "otilde;": u"\u00F5",
+ "otilde": u"\u00F5",
+ "otimes;": u"\u2297",
+ "ouml;": u"\u00F6",
+ "ouml": u"\u00F6",
+ "para;": u"\u00B6",
+ "para": u"\u00B6",
+ "part;": u"\u2202",
+ "permil;": u"\u2030",
+ "perp;": u"\u22A5",
+ "phi;": u"\u03C6",
+ "pi;": u"\u03C0",
+ "piv;": u"\u03D6",
+ "plusmn;": u"\u00B1",
+ "plusmn": u"\u00B1",
+ "pound;": u"\u00A3",
+ "pound": u"\u00A3",
+ "prime;": u"\u2032",
+ "prod;": u"\u220F",
+ "prop;": u"\u221D",
+ "psi;": u"\u03C8",
+ "quot;": u"\u0022",
+ "quot": u"\u0022",
+ "rArr;": u"\u21D2",
+ "radic;": u"\u221A",
+ "rang;": u"\u3009",
+ "raquo;": u"\u00BB",
+ "raquo": u"\u00BB",
+ "rarr;": u"\u2192",
+ "rceil;": u"\u2309",
+ "rdquo;": u"\u201D",
+ "real;": u"\u211C",
+ "reg;": u"\u00AE",
+ "reg": u"\u00AE",
+ "rfloor;": u"\u230B",
+ "rho;": u"\u03C1",
+ "rlm;": u"\u200F",
+ "rsaquo;": u"\u203A",
+ "rsquo;": u"\u2019",
+ "sbquo;": u"\u201A",
+ "scaron;": u"\u0161",
+ "sdot;": u"\u22C5",
+ "sect;": u"\u00A7",
+ "sect": u"\u00A7",
+ "shy;": u"\u00AD",
+ "shy": u"\u00AD",
+ "sigma;": u"\u03C3",
+ "sigmaf;": u"\u03C2",
+ "sim;": u"\u223C",
+ "spades;": u"\u2660",
+ "sub;": u"\u2282",
+ "sube;": u"\u2286",
+ "sum;": u"\u2211",
+ "sup1;": u"\u00B9",
+ "sup1": u"\u00B9",
+ "sup2;": u"\u00B2",
+ "sup2": u"\u00B2",
+ "sup3;": u"\u00B3",
+ "sup3": u"\u00B3",
+ "sup;": u"\u2283",
+ "supe;": u"\u2287",
+ "szlig;": u"\u00DF",
+ "szlig": u"\u00DF",
+ "tau;": u"\u03C4",
+ "there4;": u"\u2234",
+ "theta;": u"\u03B8",
+ "thetasym;": u"\u03D1",
+ "thinsp;": u"\u2009",
+ "thorn;": u"\u00FE",
+ "thorn": u"\u00FE",
+ "tilde;": u"\u02DC",
+ "times;": u"\u00D7",
+ "times": u"\u00D7",
+ "trade;": u"\u2122",
+ "uArr;": u"\u21D1",
+ "uacute;": u"\u00FA",
+ "uacute": u"\u00FA",
+ "uarr;": u"\u2191",
+ "ucirc;": u"\u00FB",
+ "ucirc": u"\u00FB",
+ "ugrave;": u"\u00F9",
+ "ugrave": u"\u00F9",
+ "uml;": u"\u00A8",
+ "uml": u"\u00A8",
+ "upsih;": u"\u03D2",
+ "upsilon;": u"\u03C5",
+ "uuml;": u"\u00FC",
+ "uuml": u"\u00FC",
+ "weierp;": u"\u2118",
+ "xi;": u"\u03BE",
+ "yacute;": u"\u00FD",
+ "yacute": u"\u00FD",
+ "yen;": u"\u00A5",
+ "yen": u"\u00A5",
+ "yuml;": u"\u00FF",
+ "yuml": u"\u00FF",
+ "zeta;": u"\u03B6",
+ "zwj;": u"\u200D",
+ "zwnj;": u"\u200C"
+}
+
+encodings = frozenset((
+ "ansi_x3.4-1968",
+ "iso-ir-6",
+ "ansi_x3.4-1986",
+ "iso_646.irv:1991",
+ "ascii",
+ "iso646-us",
+ "us-ascii",
+ "us",
+ "ibm367",
+ "cp367",
+ "csascii",
+ "ks_c_5601-1987",
+ "korean",
+ "iso-2022-kr",
+ "csiso2022kr",
+ "euc-kr",
+ "iso-2022-jp",
+ "csiso2022jp",
+ "iso-2022-jp-2",
+ "iso-ir-58",
+ "chinese",
+ "csiso58gb231280",
+ "iso_8859-1:1987",
+ "iso-ir-100",
+ "iso_8859-1",
+ "iso-8859-1",
+ "latin1",
+ "l1",
+ "ibm819",
+ "cp819",
+ "csisolatin1",
+ "iso_8859-2:1987",
+ "iso-ir-101",
+ "iso_8859-2",
+ "iso-8859-2",
+ "latin2",
+ "l2",
+ "csisolatin2",
+ "iso_8859-3:1988",
+ "iso-ir-109",
+ "iso_8859-3",
+ "iso-8859-3",
+ "latin3",
+ "l3",
+ "csisolatin3",
+ "iso_8859-4:1988",
+ "iso-ir-110",
+ "iso_8859-4",
+ "iso-8859-4",
+ "latin4",
+ "l4",
+ "csisolatin4",
+ "iso_8859-6:1987",
+ "iso-ir-127",
+ "iso_8859-6",
+ "iso-8859-6",
+ "ecma-114",
+ "asmo-708",
+ "arabic",
+ "csisolatinarabic",
+ "iso_8859-7:1987",
+ "iso-ir-126",
+ "iso_8859-7",
+ "iso-8859-7",
+ "elot_928",
+ "ecma-118",
+ "greek",
+ "greek8",
+ "csisolatingreek",
+ "iso_8859-8:1988",
+ "iso-ir-138",
+ "iso_8859-8",
+ "iso-8859-8",
+ "hebrew",
+ "csisolatinhebrew",
+ "iso_8859-5:1988",
+ "iso-ir-144",
+ "iso_8859-5",
+ "iso-8859-5",
+ "cyrillic",
+ "csisolatincyrillic",
+ "iso_8859-9:1989",
+ "iso-ir-148",
+ "iso_8859-9",
+ "iso-8859-9",
+ "latin5",
+ "l5",
+ "csisolatin5",
+ "iso-8859-10",
+ "iso-ir-157",
+ "l6",
+ "iso_8859-10:1992",
+ "csisolatin6",
+ "latin6",
+ "hp-roman8",
+ "roman8",
+ "r8",
+ "ibm037",
+ "cp037",
+ "csibm037",
+ "ibm424",
+ "cp424",
+ "csibm424",
+ "ibm437",
+ "cp437",
+ "437",
+ "cspc8codepage437",
+ "ibm500",
+ "cp500",
+ "csibm500",
+ "ibm775",
+ "cp775",
+ "cspc775baltic",
+ "ibm850",
+ "cp850",
+ "850",
+ "cspc850multilingual",
+ "ibm852",
+ "cp852",
+ "852",
+ "cspcp852",
+ "ibm855",
+ "cp855",
+ "855",
+ "csibm855",
+ "ibm857",
+ "cp857",
+ "857",
+ "csibm857",
+ "ibm860",
+ "cp860",
+ "860",
+ "csibm860",
+ "ibm861",
+ "cp861",
+ "861",
+ "cp-is",
+ "csibm861",
+ "ibm862",
+ "cp862",
+ "862",
+ "cspc862latinhebrew",
+ "ibm863",
+ "cp863",
+ "863",
+ "csibm863",
+ "ibm864",
+ "cp864",
+ "csibm864",
+ "ibm865",
+ "cp865",
+ "865",
+ "csibm865",
+ "ibm866",
+ "cp866",
+ "866",
+ "csibm866",
+ "ibm869",
+ "cp869",
+ "869",
+ "cp-gr",
+ "csibm869",
+ "ibm1026",
+ "cp1026",
+ "csibm1026",
+ "koi8-r",
+ "cskoi8r",
+ "koi8-u",
+ "big5-hkscs",
+ "ptcp154",
+ "csptcp154",
+ "pt154",
+ "cp154",
+ "utf-7",
+ "utf-16be",
+ "utf-16le",
+ "utf-16",
+ "utf-8",
+ "iso-8859-13",
+ "iso-8859-14",
+ "iso-ir-199",
+ "iso_8859-14:1998",
+ "iso_8859-14",
+ "latin8",
+ "iso-celtic",
+ "l8",
+ "iso-8859-15",
+ "iso_8859-15",
+ "iso-8859-16",
+ "iso-ir-226",
+ "iso_8859-16:2001",
+ "iso_8859-16",
+ "latin10",
+ "l10",
+ "gbk",
+ "cp936",
+ "ms936",
+ "gb18030",
+ "shift_jis",
+ "ms_kanji",
+ "csshiftjis",
+ "euc-jp",
+ "gb2312",
+ "big5",
+ "csbig5",
+ "windows-1250",
+ "windows-1251",
+ "windows-1252",
+ "windows-1253",
+ "windows-1254",
+ "windows-1255",
+ "windows-1256",
+ "windows-1257",
+ "windows-1258",
+ "tis-620",
+ "hz-gb-2312",
+ ))
\ No newline at end of file
Deleted: trunk/lib/venus/planet/vendor/html5lib/filters/__init__.py
===================================================================
Copied: trunk/lib/venus/planet/vendor/html5lib/filters/__init__.py (from rev 656, branches/sucs-site/lib/venus/planet/vendor/html5lib/filters/__init__.py)
===================================================================
Deleted: trunk/lib/venus/planet/vendor/html5lib/filters/_base.py
===================================================================
--- branches/sucs-site/lib/venus/planet/vendor/html5lib/filters/_base.py 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/lib/venus/planet/vendor/html5lib/filters/_base.py 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,10 +0,0 @@
-
-class Filter(object):
- def __init__(self, source):
- self.source = source
-
- def __iter__(self):
- return iter(self.source)
-
- def __getattr__(self, name):
- return getattr(self.source, name)
Copied: trunk/lib/venus/planet/vendor/html5lib/filters/_base.py (from rev 656, branches/sucs-site/lib/venus/planet/vendor/html5lib/filters/_base.py)
===================================================================
--- trunk/lib/venus/planet/vendor/html5lib/filters/_base.py (rev 0)
+++ trunk/lib/venus/planet/vendor/html5lib/filters/_base.py 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,10 @@
+
+class Filter(object):
+ def __init__(self, source):
+ self.source = source
+
+ def __iter__(self):
+ return iter(self.source)
+
+ def __getattr__(self, name):
+ return getattr(self.source, name)
Deleted: trunk/lib/venus/planet/vendor/html5lib/filters/inject_meta_charset.py
===================================================================
--- branches/sucs-site/lib/venus/planet/vendor/html5lib/filters/inject_meta_charset.py 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/lib/venus/planet/vendor/html5lib/filters/inject_meta_charset.py 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,63 +0,0 @@
-import _base
-
-class Filter(_base.Filter):
- def __init__(self, source, encoding):
- _base.Filter.__init__(self, source)
- self.encoding = encoding
-
- def __iter__(self):
- state = "pre_head"
- meta_found = (self.encoding is None)
- pending = []
-
- for token in _base.Filter.__iter__(self):
- type = token["type"]
- if type == "StartTag":
- if token["name"].lower() == "head":
- state = "in_head"
-
- elif type == "EmptyTag":
- if token["name"].lower() == "meta":
- # replace charset with actual encoding
- has_http_equiv_content_type = False
- content_index = -1
- for i,(name,value) in enumerate(token["data"]):
- if name.lower() == 'charset':
- token["data"][i] = (u'charset', self.encoding)
- meta_found = True
- break
- elif name == 'http-equiv' and value.lower() == 'content-type':
- has_http_equiv_content_type = True
- elif name == 'content':
- content_index = i
- else:
- if has_http_equiv_content_type and content_index >= 0:
- token["data"][content_index] = (u'content', u'text/html; charset=%s' % self.encoding)
- meta_found = True
-
- elif token["name"].lower() == "head" and not meta_found:
- # insert meta into empty head
- yield {"type": "StartTag", "name": "head",
- "data": token["data"]}
- yield {"type": "EmptyTag", "name": "meta",
- "data": [["charset", self.encoding]]}
- yield {"type": "EndTag", "name": "head"}
- meta_found = True
- continue
-
- elif type == "EndTag":
- if token["name"].lower() == "head" and pending:
- # insert meta into head (if necessary) and flush pending queue
- yield pending.pop(0)
- if not meta_found:
- yield {"type": "EmptyTag", "name": "meta",
- "data": [["charset", self.encoding]]}
- while pending:
- yield pending.pop(0)
- meta_found = True
- state = "post_head"
-
- if state == "in_head":
- pending.append(token)
- else:
- yield token
Copied: trunk/lib/venus/planet/vendor/html5lib/filters/inject_meta_charset.py (from rev 656, branches/sucs-site/lib/venus/planet/vendor/html5lib/filters/inject_meta_charset.py)
===================================================================
--- trunk/lib/venus/planet/vendor/html5lib/filters/inject_meta_charset.py (rev 0)
+++ trunk/lib/venus/planet/vendor/html5lib/filters/inject_meta_charset.py 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,63 @@
+import _base
+
+class Filter(_base.Filter):
+ def __init__(self, source, encoding):
+ _base.Filter.__init__(self, source)
+ self.encoding = encoding
+
+ def __iter__(self):
+ state = "pre_head"
+ meta_found = (self.encoding is None)
+ pending = []
+
+ for token in _base.Filter.__iter__(self):
+ type = token["type"]
+ if type == "StartTag":
+ if token["name"].lower() == "head":
+ state = "in_head"
+
+ elif type == "EmptyTag":
+ if token["name"].lower() == "meta":
+ # replace charset with actual encoding
+ has_http_equiv_content_type = False
+ content_index = -1
+ for i,(name,value) in enumerate(token["data"]):
+ if name.lower() == 'charset':
+ token["data"][i] = (u'charset', self.encoding)
+ meta_found = True
+ break
+ elif name == 'http-equiv' and value.lower() == 'content-type':
+ has_http_equiv_content_type = True
+ elif name == 'content':
+ content_index = i
+ else:
+ if has_http_equiv_content_type and content_index >= 0:
+ token["data"][content_index] = (u'content', u'text/html; charset=%s' % self.encoding)
+ meta_found = True
+
+ elif token["name"].lower() == "head" and not meta_found:
+ # insert meta into empty head
+ yield {"type": "StartTag", "name": "head",
+ "data": token["data"]}
+ yield {"type": "EmptyTag", "name": "meta",
+ "data": [["charset", self.encoding]]}
+ yield {"type": "EndTag", "name": "head"}
+ meta_found = True
+ continue
+
+ elif type == "EndTag":
+ if token["name"].lower() == "head" and pending:
+ # insert meta into head (if necessary) and flush pending queue
+ yield pending.pop(0)
+ if not meta_found:
+ yield {"type": "EmptyTag", "name": "meta",
+ "data": [["charset", self.encoding]]}
+ while pending:
+ yield pending.pop(0)
+ meta_found = True
+ state = "post_head"
+
+ if state == "in_head":
+ pending.append(token)
+ else:
+ yield token
Deleted: trunk/lib/venus/planet/vendor/html5lib/filters/lint.py
===================================================================
--- branches/sucs-site/lib/venus/planet/vendor/html5lib/filters/lint.py 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/lib/venus/planet/vendor/html5lib/filters/lint.py 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,88 +0,0 @@
-from gettext import gettext
-_ = gettext
-
-import _base
-from html5lib.constants import cdataElements, rcdataElements, voidElements
-
-from html5lib.constants import spaceCharacters
-spaceCharacters = u"".join(spaceCharacters)
-
-class LintError(Exception): pass
-
-class Filter(_base.Filter):
- def __iter__(self):
- open_elements = []
- contentModelFlag = "PCDATA"
- for token in _base.Filter.__iter__(self):
- type = token["type"]
- if type in ("StartTag", "EmptyTag"):
- name = token["name"]
- if contentModelFlag != "PCDATA":
- raise LintError(_("StartTag not in PCDATA content model flag: %s") % name)
- if not isinstance(name, unicode):
- raise LintError(_(u"Tag name is not a string: %r") % name)
- if not name:
- raise LintError(_(u"Empty tag name"))
- if type == "StartTag" and name in voidElements:
- raise LintError(_(u"Void element reported as StartTag token: %s") % name)
- elif type == "EmptyTag" and name not in voidElements:
- raise LintError(_(u"Non-void element reported as EmptyTag token: %s") % token["name"])
- if type == "StartTag":
- open_elements.append(name)
- for name, value in token["data"]:
- if not isinstance(name, unicode):
- raise LintError(_("Attribute name is not a string: %r") % name)
- if not name:
- raise LintError(_(u"Empty attribute name"))
- if not isinstance(value, unicode):
- raise LintError(_("Attribute value is not a string: %r") % value)
- if name in cdataElements:
- contentModelFlag = "CDATA"
- elif name in rcdataElements:
- contentModelFlag = "RCDATA"
- elif name == "plaintext":
- contentModelFlag = "PLAINTEXT"
-
- elif type == "EndTag":
- name = token["name"]
- if not isinstance(name, unicode):
- raise LintError(_(u"Tag name is not a string: %r") % name)
- if not name:
- raise LintError(_(u"Empty tag name"))
- if name in voidElements:
- raise LintError(_(u"Void element reported as EndTag token: %s") % name)
- start_name = open_elements.pop()
- if start_name != name:
- raise LintError(_(u"EndTag (%s) does not match StartTag (%s)") % (name, start_name))
- contentModelFlag = "PCDATA"
-
- elif type == "Comment":
- if contentModelFlag != "PCDATA":
- raise LintError(_("Comment not in PCDATA content model flag"))
-
- elif type in ("Characters", "SpaceCharacters"):
- data = token["data"]
- if not isinstance(data, unicode):
- raise LintError(_("Attribute name is not a string: %r") % data)
- if not data:
- raise LintError(_(u"%s token with empty data") % type)
- if type == "SpaceCharacters":
- data = data.strip(spaceCharacters)
- if data:
- raise LintError(_(u"Non-space character(s) found in SpaceCharacters token: ") % data)
-
- elif type == "Doctype":
- name = token["name"]
- if contentModelFlag != "PCDATA":
- raise LintError(_("Doctype not in PCDATA content model flag: %s") % name)
- if not isinstance(name, unicode):
- raise LintError(_(u"Tag name is not a string: %r") % name)
- # XXX: what to do with token["data"] ?
-
- elif type in ("ParseError", "SerializeError"):
- pass
-
- else:
- raise LintError(_(u"Unknown token type: %s") % type)
-
- yield token
Copied: trunk/lib/venus/planet/vendor/html5lib/filters/lint.py (from rev 656, branches/sucs-site/lib/venus/planet/vendor/html5lib/filters/lint.py)
===================================================================
--- trunk/lib/venus/planet/vendor/html5lib/filters/lint.py (rev 0)
+++ trunk/lib/venus/planet/vendor/html5lib/filters/lint.py 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,88 @@
+from gettext import gettext
+_ = gettext
+
+import _base
+from html5lib.constants import cdataElements, rcdataElements, voidElements
+
+from html5lib.constants import spaceCharacters
+spaceCharacters = u"".join(spaceCharacters)
+
+class LintError(Exception): pass
+
+class Filter(_base.Filter):
+ def __iter__(self):
+ open_elements = []
+ contentModelFlag = "PCDATA"
+ for token in _base.Filter.__iter__(self):
+ type = token["type"]
+ if type in ("StartTag", "EmptyTag"):
+ name = token["name"]
+ if contentModelFlag != "PCDATA":
+ raise LintError(_("StartTag not in PCDATA content model flag: %s") % name)
+ if not isinstance(name, unicode):
+ raise LintError(_(u"Tag name is not a string: %r") % name)
+ if not name:
+ raise LintError(_(u"Empty tag name"))
+ if type == "StartTag" and name in voidElements:
+ raise LintError(_(u"Void element reported as StartTag token: %s") % name)
+ elif type == "EmptyTag" and name not in voidElements:
+ raise LintError(_(u"Non-void element reported as EmptyTag token: %s") % token["name"])
+ if type == "StartTag":
+ open_elements.append(name)
+ for name, value in token["data"]:
+ if not isinstance(name, unicode):
+ raise LintError(_("Attribute name is not a string: %r") % name)
+ if not name:
+ raise LintError(_(u"Empty attribute name"))
+ if not isinstance(value, unicode):
+ raise LintError(_("Attribute value is not a string: %r") % value)
+ if name in cdataElements:
+ contentModelFlag = "CDATA"
+ elif name in rcdataElements:
+ contentModelFlag = "RCDATA"
+ elif name == "plaintext":
+ contentModelFlag = "PLAINTEXT"
+
+ elif type == "EndTag":
+ name = token["name"]
+ if not isinstance(name, unicode):
+ raise LintError(_(u"Tag name is not a string: %r") % name)
+ if not name:
+ raise LintError(_(u"Empty tag name"))
+ if name in voidElements:
+ raise LintError(_(u"Void element reported as EndTag token: %s") % name)
+ start_name = open_elements.pop()
+ if start_name != name:
+ raise LintError(_(u"EndTag (%s) does not match StartTag (%s)") % (name, start_name))
+ contentModelFlag = "PCDATA"
+
+ elif type == "Comment":
+ if contentModelFlag != "PCDATA":
+ raise LintError(_("Comment not in PCDATA content model flag"))
+
+ elif type in ("Characters", "SpaceCharacters"):
+ data = token["data"]
+ if not isinstance(data, unicode):
+ raise LintError(_("Attribute name is not a string: %r") % data)
+ if not data:
+ raise LintError(_(u"%s token with empty data") % type)
+ if type == "SpaceCharacters":
+ data = data.strip(spaceCharacters)
+ if data:
+ raise LintError(_(u"Non-space character(s) found in SpaceCharacters token: ") % data)
+
+ elif type == "Doctype":
+ name = token["name"]
+ if contentModelFlag != "PCDATA":
+ raise LintError(_("Doctype not in PCDATA content model flag: %s") % name)
+ if not isinstance(name, unicode):
+ raise LintError(_(u"Tag name is not a string: %r") % name)
+ # XXX: what to do with token["data"] ?
+
+ elif type in ("ParseError", "SerializeError"):
+ pass
+
+ else:
+ raise LintError(_(u"Unknown token type: %s") % type)
+
+ yield token
Deleted: trunk/lib/venus/planet/vendor/html5lib/filters/optionaltags.py
===================================================================
--- branches/sucs-site/lib/venus/planet/vendor/html5lib/filters/optionaltags.py 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/lib/venus/planet/vendor/html5lib/filters/optionaltags.py 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,175 +0,0 @@
-import _base
-
-class Filter(_base.Filter):
- def slider(self):
- previous1 = previous2 = None
- for token in self.source:
- if previous1 is not None:
- yield previous2, previous1, token
- previous2 = previous1
- previous1 = token
- yield previous2, previous1, None
-
- def __iter__(self):
- for previous, token, next in self.slider():
- type = token["type"]
- if type == "StartTag":
- if token["data"] or not self.is_optional_start(token["name"], previous, next):
- yield token
- elif type == "EndTag":
- if not self.is_optional_end(token["name"], next):
- yield token
- else:
- yield token
-
- def is_optional_start(self, tagname, previous, next):
- type = next and next["type"] or None
- if tagname in 'html':
- # An html element's start tag may be omitted if the first thing
- # inside the html element is not a space character or a comment.
- return type not in ("Comment", "SpaceCharacters")
- elif tagname == 'head':
- # A head element's start tag may be omitted if the first thing
- # inside the head element is an element.
- return type == "StartTag"
- elif tagname == 'body':
- # A body element's start tag may be omitted if the first thing
- # inside the body element is not a space character or a comment,
- # except if the first thing inside the body element is a script
- # or style element and the node immediately preceding the body
- # element is a head element whose end tag has been omitted.
- if type in ("Comment", "SpaceCharacters"):
- return False
- elif type == "StartTag":
- # XXX: we do not look at the preceding event, so we never omit
- # the body element's start tag if it's followed by a script or
- # a style element.
- return next["name"] not in ('script', 'style')
- else:
- return True
- elif tagname == 'colgroup':
- # A colgroup element's start tag may be omitted if the first thing
- # inside the colgroup element is a col element, and if the element
- # is not immediately preceeded by another colgroup element whose
- # end tag has been omitted.
- if type == "StartTag":
- # XXX: we do not look at the preceding event, so instead we never
- # omit the colgroup element's end tag when it is immediately
- # followed by another colgroup element. See is_optional_end.
- return next["name"] == "col"
- else:
- return False
- elif tagname == 'tbody':
- # A tbody element's start tag may be omitted if the first thing
- # inside the tbody element is a tr element, and if the element is
- # not immediately preceeded by a tbody, thead, or tfoot element
- # whose end tag has been omitted.
- if type == "StartTag":
- # omit the thead and tfoot elements' end tag when they are
- # immediately followed by a tbody element. See is_optional_end.
- if previous and previous['type'] == 'EndTag' and \
- previous['name'] in ('tbody','thead','tfoot'):
- return False
- return next["name"] == 'tr'
- else:
- return False
- return False
-
- def is_optional_end(self, tagname, next):
- type = next and next["type"] or None
- if tagname in ('html', 'head', 'body'):
- # An html element's end tag may be omitted if the html element
- # is not immediately followed by a space character or a comment.
- return type not in ("Comment", "SpaceCharacters")
- elif tagname in ('li', 'optgroup', 'option', 'tr'):
- # A li element's end tag may be omitted if the li element is
- # immediately followed by another li element or if there is
- # no more content in the parent element.
- # An optgroup element's end tag may be omitted if the optgroup
- # element is immediately followed by another optgroup element,
- # or if there is no more content in the parent element.
- # An option element's end tag may be omitted if the option
- # element is immediately followed by another option element,
- # or if there is no more content in the parent element.
- # A tr element's end tag may be omitted if the tr element is
- # immediately followed by another tr element, or if there is
- # no more content in the parent element.
- if type == "StartTag":
- return next["name"] == tagname
- else:
- return type == "EndTag" or type is None
- elif tagname in ('dt', 'dd'):
- # A dt element's end tag may be omitted if the dt element is
- # immediately followed by another dt element or a dd element.
- # A dd element's end tag may be omitted if the dd element is
- # immediately followed by another dd element or a dt element,
- # or if there is no more content in the parent element.
- if type == "StartTag":
- return next["name"] in ('dt', 'dd')
- elif tagname == 'dd':
- return type == "EndTag" or type is None
- else:
- return False
- elif tagname == 'p':
- # A p element's end tag may be omitted if the p element is
- # immediately followed by an address, blockquote, dl, fieldset,
- # form, h1, h2, h3, h4, h5, h6, hr, menu, ol, p, pre, table,
- # or ul element, or if there is no more content in the parent
- # element.
- if type == "StartTag":
- return next["name"] in ('address', 'blockquote', \
- 'dl', 'fieldset', 'form', 'h1', 'h2', 'h3', 'h4', 'h5', \
- 'h6', 'hr', 'menu', 'ol', 'p', 'pre', 'table', 'ul')
- else:
- return type == "EndTag" or type is None
- elif tagname == 'colgroup':
- # A colgroup element's end tag may be omitted if the colgroup
- # element is not immediately followed by a space character or
- # a comment.
- if type in ("Comment", "SpaceCharacters"):
- return False
- elif type == "StartTag":
- # XXX: we also look for an immediately following colgroup
- # element. See is_optional_start.
- return next["name"] != 'colgroup'
- else:
- return True
- elif tagname in ('thead', 'tbody'):
- # A thead element's end tag may be omitted if the thead element
- # is immediately followed by a tbody or tfoot element.
- # A tbody element's end tag may be omitted if the tbody element
- # is immediately followed by a tbody or tfoot element, or if
- # there is no more content in the parent element.
- # A tfoot element's end tag may be omitted if the tfoot element
- # is immediately followed by a tbody element, or if there is no
- # more content in the parent element.
- # XXX: we never omit the end tag when the following element is
- # a tbody. See is_optional_start.
- if type == "StartTag":
- return next["name"] in ['tbody', 'tfoot']
- elif tagname == 'tbody':
- return type == "EndTag" or type is None
- else:
- return False
- elif tagname == 'tfoot':
- # A tfoot element's end tag may be omitted if the tfoot element
- # is immediately followed by a tbody element, or if there is no
- # more content in the parent element.
- # XXX: we never omit the end tag when the following element is
- # a tbody. See is_optional_start.
- if type == "StartTag":
- return next["name"] == 'tbody'
- else:
- return type == "EndTag" or type is None
- elif tagname in ('td', 'th'):
- # A td element's end tag may be omitted if the td element is
- # immediately followed by a td or th element, or if there is
- # no more content in the parent element.
- # A th element's end tag may be omitted if the th element is
- # immediately followed by a td or th element, or if there is
- # no more content in the parent element.
- if type == "StartTag":
- return next["name"] in ('td', 'th')
- else:
- return type == "EndTag" or type is None
- return False
Copied: trunk/lib/venus/planet/vendor/html5lib/filters/optionaltags.py (from rev 656, branches/sucs-site/lib/venus/planet/vendor/html5lib/filters/optionaltags.py)
===================================================================
--- trunk/lib/venus/planet/vendor/html5lib/filters/optionaltags.py (rev 0)
+++ trunk/lib/venus/planet/vendor/html5lib/filters/optionaltags.py 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,175 @@
+import _base
+
+class Filter(_base.Filter):
+ def slider(self):
+ previous1 = previous2 = None
+ for token in self.source:
+ if previous1 is not None:
+ yield previous2, previous1, token
+ previous2 = previous1
+ previous1 = token
+ yield previous2, previous1, None
+
+ def __iter__(self):
+ for previous, token, next in self.slider():
+ type = token["type"]
+ if type == "StartTag":
+ if token["data"] or not self.is_optional_start(token["name"], previous, next):
+ yield token
+ elif type == "EndTag":
+ if not self.is_optional_end(token["name"], next):
+ yield token
+ else:
+ yield token
+
+ def is_optional_start(self, tagname, previous, next):
+ type = next and next["type"] or None
+ if tagname in 'html':
+ # An html element's start tag may be omitted if the first thing
+ # inside the html element is not a space character or a comment.
+ return type not in ("Comment", "SpaceCharacters")
+ elif tagname == 'head':
+ # A head element's start tag may be omitted if the first thing
+ # inside the head element is an element.
+ return type == "StartTag"
+ elif tagname == 'body':
+ # A body element's start tag may be omitted if the first thing
+ # inside the body element is not a space character or a comment,
+ # except if the first thing inside the body element is a script
+ # or style element and the node immediately preceding the body
+ # element is a head element whose end tag has been omitted.
+ if type in ("Comment", "SpaceCharacters"):
+ return False
+ elif type == "StartTag":
+ # XXX: we do not look at the preceding event, so we never omit
+ # the body element's start tag if it's followed by a script or
+ # a style element.
+ return next["name"] not in ('script', 'style')
+ else:
+ return True
+ elif tagname == 'colgroup':
+ # A colgroup element's start tag may be omitted if the first thing
+ # inside the colgroup element is a col element, and if the element
+ # is not immediately preceeded by another colgroup element whose
+ # end tag has been omitted.
+ if type == "StartTag":
+ # XXX: we do not look at the preceding event, so instead we never
+ # omit the colgroup element's end tag when it is immediately
+ # followed by another colgroup element. See is_optional_end.
+ return next["name"] == "col"
+ else:
+ return False
+ elif tagname == 'tbody':
+ # A tbody element's start tag may be omitted if the first thing
+ # inside the tbody element is a tr element, and if the element is
+ # not immediately preceeded by a tbody, thead, or tfoot element
+ # whose end tag has been omitted.
+ if type == "StartTag":
+ # omit the thead and tfoot elements' end tag when they are
+ # immediately followed by a tbody element. See is_optional_end.
+ if previous and previous['type'] == 'EndTag' and \
+ previous['name'] in ('tbody','thead','tfoot'):
+ return False
+ return next["name"] == 'tr'
+ else:
+ return False
+ return False
+
+ def is_optional_end(self, tagname, next):
+ type = next and next["type"] or None
+ if tagname in ('html', 'head', 'body'):
+ # An html element's end tag may be omitted if the html element
+ # is not immediately followed by a space character or a comment.
+ return type not in ("Comment", "SpaceCharacters")
+ elif tagname in ('li', 'optgroup', 'option', 'tr'):
+ # A li element's end tag may be omitted if the li element is
+ # immediately followed by another li element or if there is
+ # no more content in the parent element.
+ # An optgroup element's end tag may be omitted if the optgroup
+ # element is immediately followed by another optgroup element,
+ # or if there is no more content in the parent element.
+ # An option element's end tag may be omitted if the option
+ # element is immediately followed by another option element,
+ # or if there is no more content in the parent element.
+ # A tr element's end tag may be omitted if the tr element is
+ # immediately followed by another tr element, or if there is
+ # no more content in the parent element.
+ if type == "StartTag":
+ return next["name"] == tagname
+ else:
+ return type == "EndTag" or type is None
+ elif tagname in ('dt', 'dd'):
+ # A dt element's end tag may be omitted if the dt element is
+ # immediately followed by another dt element or a dd element.
+ # A dd element's end tag may be omitted if the dd element is
+ # immediately followed by another dd element or a dt element,
+ # or if there is no more content in the parent element.
+ if type == "StartTag":
+ return next["name"] in ('dt', 'dd')
+ elif tagname == 'dd':
+ return type == "EndTag" or type is None
+ else:
+ return False
+ elif tagname == 'p':
+ # A p element's end tag may be omitted if the p element is
+ # immediately followed by an address, blockquote, dl, fieldset,
+ # form, h1, h2, h3, h4, h5, h6, hr, menu, ol, p, pre, table,
+ # or ul element, or if there is no more content in the parent
+ # element.
+ if type == "StartTag":
+ return next["name"] in ('address', 'blockquote', \
+ 'dl', 'fieldset', 'form', 'h1', 'h2', 'h3', 'h4', 'h5', \
+ 'h6', 'hr', 'menu', 'ol', 'p', 'pre', 'table', 'ul')
+ else:
+ return type == "EndTag" or type is None
+ elif tagname == 'colgroup':
+ # A colgroup element's end tag may be omitted if the colgroup
+ # element is not immediately followed by a space character or
+ # a comment.
+ if type in ("Comment", "SpaceCharacters"):
+ return False
+ elif type == "StartTag":
+ # XXX: we also look for an immediately following colgroup
+ # element. See is_optional_start.
+ return next["name"] != 'colgroup'
+ else:
+ return True
+ elif tagname in ('thead', 'tbody'):
+ # A thead element's end tag may be omitted if the thead element
+ # is immediately followed by a tbody or tfoot element.
+ # A tbody element's end tag may be omitted if the tbody element
+ # is immediately followed by a tbody or tfoot element, or if
+ # there is no more content in the parent element.
+ # A tfoot element's end tag may be omitted if the tfoot element
+ # is immediately followed by a tbody element, or if there is no
+ # more content in the parent element.
+ # XXX: we never omit the end tag when the following element is
+ # a tbody. See is_optional_start.
+ if type == "StartTag":
+ return next["name"] in ['tbody', 'tfoot']
+ elif tagname == 'tbody':
+ return type == "EndTag" or type is None
+ else:
+ return False
+ elif tagname == 'tfoot':
+ # A tfoot element's end tag may be omitted if the tfoot element
+ # is immediately followed by a tbody element, or if there is no
+ # more content in the parent element.
+ # XXX: we never omit the end tag when the following element is
+ # a tbody. See is_optional_start.
+ if type == "StartTag":
+ return next["name"] == 'tbody'
+ else:
+ return type == "EndTag" or type is None
+ elif tagname in ('td', 'th'):
+ # A td element's end tag may be omitted if the td element is
+ # immediately followed by a td or th element, or if there is
+ # no more content in the parent element.
+ # A th element's end tag may be omitted if the th element is
+ # immediately followed by a td or th element, or if there is
+ # no more content in the parent element.
+ if type == "StartTag":
+ return next["name"] in ('td', 'th')
+ else:
+ return type == "EndTag" or type is None
+ return False
Deleted: trunk/lib/venus/planet/vendor/html5lib/filters/whitespace.py
===================================================================
--- branches/sucs-site/lib/venus/planet/vendor/html5lib/filters/whitespace.py 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/lib/venus/planet/vendor/html5lib/filters/whitespace.py 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,41 +0,0 @@
-try:
- frozenset
-except NameError:
- # Import from the sets module for python 2.3
- from sets import ImmutableSet as frozenset
-
-import re
-
-import _base
-from html5lib.constants import rcdataElements, spaceCharacters
-spaceCharacters = u"".join(spaceCharacters)
-
-SPACES_REGEX = re.compile(u"[%s]+" % spaceCharacters)
-
-class Filter(_base.Filter):
-
- spacePreserveElements = frozenset(["pre", "textarea"] + list(rcdataElements))
-
- def __iter__(self):
- preserve = 0
- for token in _base.Filter.__iter__(self):
- type = token["type"]
- if type == "StartTag" \
- and (preserve or token["name"] in self.spacePreserveElements):
- preserve += 1
-
- elif type == "EndTag" and preserve:
- preserve -= 1
-
- elif not preserve and type == "SpaceCharacters" and token["data"]:
- # Test on token["data"] above to not introduce spaces where there were not
- token["data"] = u" "
-
- elif not preserve and type == "Characters":
- token["data"] = collapse_spaces(token["data"])
-
- yield token
-
-def collapse_spaces(text):
- return SPACES_REGEX.sub(' ', text)
-
Copied: trunk/lib/venus/planet/vendor/html5lib/filters/whitespace.py (from rev 656, branches/sucs-site/lib/venus/planet/vendor/html5lib/filters/whitespace.py)
===================================================================
--- trunk/lib/venus/planet/vendor/html5lib/filters/whitespace.py (rev 0)
+++ trunk/lib/venus/planet/vendor/html5lib/filters/whitespace.py 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,41 @@
+try:
+ frozenset
+except NameError:
+ # Import from the sets module for python 2.3
+ from sets import ImmutableSet as frozenset
+
+import re
+
+import _base
+from html5lib.constants import rcdataElements, spaceCharacters
+spaceCharacters = u"".join(spaceCharacters)
+
+SPACES_REGEX = re.compile(u"[%s]+" % spaceCharacters)
+
+class Filter(_base.Filter):
+
+ spacePreserveElements = frozenset(["pre", "textarea"] + list(rcdataElements))
+
+ def __iter__(self):
+ preserve = 0
+ for token in _base.Filter.__iter__(self):
+ type = token["type"]
+ if type == "StartTag" \
+ and (preserve or token["name"] in self.spacePreserveElements):
+ preserve += 1
+
+ elif type == "EndTag" and preserve:
+ preserve -= 1
+
+ elif not preserve and type == "SpaceCharacters" and token["data"]:
+ # Test on token["data"] above to not introduce spaces where there were not
+ token["data"] = u" "
+
+ elif not preserve and type == "Characters":
+ token["data"] = collapse_spaces(token["data"])
+
+ yield token
+
+def collapse_spaces(text):
+ return SPACES_REGEX.sub(' ', text)
+
Deleted: trunk/lib/venus/planet/vendor/html5lib/html5parser.py
===================================================================
--- branches/sucs-site/lib/venus/planet/vendor/html5lib/html5parser.py 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/lib/venus/planet/vendor/html5lib/html5parser.py 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,1985 +0,0 @@
-# Differences from the current specification are as follows:
-# * Phases and insertion modes are one concept in parser.py.
-# * EOF handling is slightly different to make sure <html>, <head> and <body>
-# always exist.
-
-
-try:
- frozenset
-except NameError:
- # Import from the sets module for python 2.3
- from sets import Set as set
- from sets import ImmutableSet as frozenset
-import gettext
-_ = gettext.gettext
-import sys
-
-import tokenizer
-
-import treebuilders
-from treebuilders._base import Marker
-from treebuilders import simpletree
-
-import utils
-from constants import contentModelFlags, spaceCharacters, asciiUpper2Lower
-from constants import scopingElements, formattingElements, specialElements
-from constants import headingElements, tableInsertModeElements
-from constants import cdataElements, rcdataElements, voidElements
-
-class HTMLParser(object):
- """HTML parser. Generates a tree structure from a stream of (possibly
- malformed) HTML"""
-
- def __init__(self, strict = False, tree=simpletree.TreeBuilder,
- tokenizer=tokenizer.HTMLTokenizer):
- """
- strict - raise an exception when a parse error is encountered
-
- tree - a treebuilder class controlling the type of tree that will be
- returned. Built in treebuilders can be accessed through
- html5lib.treebuilders.getTreeBuilder(treeType)
- """
-
- # Raise an exception on the first error encountered
- self.strict = strict
-
- self.tree = tree()
- self.tokenizer_class = tokenizer
- self.errors = []
-
- # "quirks" / "almost-standards" / "standards"
- self.quirksMode = "standards"
-
- self.phases = {
- "initial": InitialPhase(self, self.tree),
- "rootElement": RootElementPhase(self, self.tree),
- "beforeHead": BeforeHeadPhase(self, self.tree),
- "inHead": InHeadPhase(self, self.tree),
- # XXX "inHeadNoscript": InHeadNoScriptPhase(self, self.tree),
- "afterHead": AfterHeadPhase(self, self.tree),
- "inBody": InBodyPhase(self, self.tree),
- "inTable": InTablePhase(self, self.tree),
- "inCaption": InCaptionPhase(self, self.tree),
- "inColumnGroup": InColumnGroupPhase(self, self.tree),
- "inTableBody": InTableBodyPhase(self, self.tree),
- "inRow": InRowPhase(self, self.tree),
- "inCell": InCellPhase(self, self.tree),
- "inSelect": InSelectPhase(self, self.tree),
- "afterBody": AfterBodyPhase(self, self.tree),
- "inFrameset": InFramesetPhase(self, self.tree),
- "afterFrameset": AfterFramesetPhase(self, self.tree),
- "trailingEnd": TrailingEndPhase(self, self.tree)
- }
-
- def _parse(self, stream, innerHTML=False, container="div",
- encoding=None, **kwargs):
-
- self.tree.reset()
- self.firstStartTag = False
- self.errors = []
-
- self.tokenizer = self.tokenizer_class(stream, encoding=encoding,
- parseMeta=not innerHTML, **kwargs)
-
- if innerHTML:
- self.innerHTML = container.lower()
-
- if self.innerHTML in cdataElements:
- self.tokenizer.contentModelFlag = tokenizer.contentModelFlags["RCDATA"]
- elif self.innerHTML in rcdataElements:
- self.tokenizer.contentModelFlag = tokenizer.contentModelFlags["CDATA"]
- elif self.innerHTML == 'plaintext':
- self.tokenizer.contentModelFlag = tokenizer.contentModelFlags["PLAINTEXT"]
- else:
- # contentModelFlag already is PCDATA
- #self.tokenizer.contentModelFlag = tokenizer.contentModelFlags["PCDATA"]
- pass
- self.phase = self.phases["rootElement"]
- self.phase.insertHtmlElement()
- self.resetInsertionMode()
- else:
- self.innerHTML = False
- self.phase = self.phases["initial"]
-
- # We only seem to have InBodyPhase testcases where the following is
- # relevant ... need others too
- self.lastPhase = None
-
- # XXX This is temporary for the moment so there isn't any other
- # changes needed for the parser to work with the iterable tokenizer
- for token in self.tokenizer:
- token = self.normalizeToken(token)
- type = token["type"]
- method = getattr(self.phase, "process%s" % type, None)
- if type in ("Characters", "SpaceCharacters", "Comment"):
- method(token["data"])
- elif type == "StartTag":
- method(token["name"], token["data"])
- elif type == "EndTag":
- method(token["name"])
- elif type == "Doctype":
- method(token["name"], token["publicId"], token["systemId"], token["correct"])
- else:
- self.parseError(token["data"])
-
- # When the loop finishes it's EOF
- self.phase.processEOF()
-
- def parse(self, stream, encoding=None):
- """Parse a HTML document into a well-formed tree
-
- stream - a filelike object or string containing the HTML to be parsed
-
- The optional encoding parameter must be a string that indicates
- the encoding. If specified, that encoding will be used,
- regardless of any BOM or later declaration (such as in a meta
- element)
- """
- self._parse(stream, innerHTML=False, encoding=encoding)
- return self.tree.getDocument()
-
- def parseFragment(self, stream, container="div", encoding=None):
- """Parse a HTML fragment into a well-formed tree fragment
-
- container - name of the element we're setting the innerHTML property
- if set to None, default to 'div'
-
- stream - a filelike object or string containing the HTML to be parsed
-
- The optional encoding parameter must be a string that indicates
- the encoding. If specified, that encoding will be used,
- regardless of any BOM or later declaration (such as in a meta
- element)
- """
- self._parse(stream, True, container=container, encoding=encoding)
- return self.tree.getFragment()
-
- def parseError(self, data="XXX ERROR MESSAGE NEEDED"):
- # XXX The idea is to make data mandatory.
- self.errors.append((self.tokenizer.stream.position(), data))
- if self.strict:
- raise ParseError
-
- def normalizeToken(self, token):
- """ HTML5 specific normalizations to the token stream """
-
- if token["type"] == "EmptyTag":
- # When a solidus (/) is encountered within a tag name what happens
- # depends on whether the current tag name matches that of a void
- # element. If it matches a void element atheists did the wrong
- # thing and if it doesn't it's wrong for everyone.
-
- if token["name"] not in voidElements:
- self.parseError(_(u"Solidus (/) incorrectly placed in tag."))
-
- token["type"] = "StartTag"
-
- if token["type"] == "StartTag":
- token["data"] = dict(token["data"][::-1])
-
- return token
-
-
- def resetInsertionMode(self):
- # The name of this method is mostly historical. (It's also used in the
- # specification.)
- last = False
- newModes = {
- "select":"inSelect",
- "td":"inCell",
- "th":"inCell",
- "tr":"inRow",
- "tbody":"inTableBody",
- "thead":"inTableBody",
- "tfoot":"inTableBody",
- "caption":"inCaption",
- "colgroup":"inColumnGroup",
- "table":"inTable",
- "head":"inBody",
- "body":"inBody",
- "frameset":"inFrameset"
- }
- for node in self.tree.openElements[::-1]:
- nodeName = node.name
- if node == self.tree.openElements[0]:
- last = True
- if nodeName not in ['td', 'th']:
- # XXX
- assert self.innerHTML
- nodeName = self.innerHTML
- # Check for conditions that should only happen in the innerHTML
- # case
- if nodeName in ("select", "colgroup", "head", "frameset"):
- # XXX
- assert self.innerHTML
- if nodeName in newModes:
- self.phase = self.phases[newModes[nodeName]]
- break
- elif nodeName == "html":
- if self.tree.headPointer is None:
- self.phase = self.phases["beforeHead"]
- else:
- self.phase = self.phases["afterHead"]
- break
- elif last:
- self.phase = self.phases["inBody"]
- break
-
-class Phase(object):
- """Base class for helper object that implements each phase of processing
- """
- # Order should be (they can be omitted):
- # * EOF
- # * Comment
- # * Doctype
- # * SpaceCharacters
- # * Characters
- # * StartTag
- # - startTag* methods
- # * EndTag
- # - endTag* methods
-
- def __init__(self, parser, tree):
- self.parser = parser
- self.tree = tree
-
- def processEOF(self):
- self.tree.generateImpliedEndTags()
- if len(self.tree.openElements) > 2:
- self.parser.parseError(_(u"Unexpected end of file. "
- u"Missing closing tags."))
- elif len(self.tree.openElements) == 2 and\
- self.tree.openElements[1].name != "body":
- # This happens for framesets or something?
- self.parser.parseError(_(u"Unexpected end of file. Expected end "
- u"tag (%s) first.") % (self.tree.openElements[1].name,))
- elif self.parser.innerHTML and len(self.tree.openElements) > 1 :
- # XXX This is not what the specification says. Not sure what to do
- # here.
- self.parser.parseError(_(u"XXX innerHTML EOF"))
- # Betting ends.
-
- def processComment(self, data):
- # For most phases the following is correct. Where it's not it will be
- # overridden.
- self.tree.insertComment(data, self.tree.openElements[-1])
-
- def processDoctype(self, name, publicId, systemId, correct):
- self.parser.parseError(_(u"Unexpected DOCTYPE. Ignored."))
-
- def processSpaceCharacters(self, data):
- self.tree.insertText(data)
-
- def processStartTag(self, name, attributes):
- self.startTagHandler[name](name, attributes)
-
- def startTagHtml(self, name, attributes):
- if self.parser.firstStartTag == False and name == "html":
- self.parser.parseError(_(u"html needs to be the first start tag."))
- # XXX Need a check here to see if the first start tag token emitted is
- # this token... If it's not, invoke self.parser.parseError().
- for attr, value in attributes.iteritems():
- if attr not in self.tree.openElements[0].attributes:
- self.tree.openElements[0].attributes[attr] = value
- self.parser.firstStartTag = False
-
- def processEndTag(self, name):
- self.endTagHandler[name](name)
-
-
-class InitialPhase(Phase):
- # This phase deals with error handling as well which is currently not
- # covered in the specification. The error handling is typically known as
- # "quirks mode". It is expected that a future version of HTML5 will defin
- # this.
- def processEOF(self):
- self.parser.parseError(_(u"Unexpected End of file. Expected DOCTYPE."))
- self.parser.phase = self.parser.phases["rootElement"]
- self.parser.phase.processEOF()
-
- def processComment(self, data):
- self.tree.insertComment(data, self.tree.document)
-
- def processDoctype(self, name, publicId, systemId, correct):
- nameLower = name.translate(asciiUpper2Lower)
- if nameLower != "html" or publicId != None or\
- systemId != None:
- self.parser.parseError(_(u"Erroneous DOCTYPE."))
- # XXX need to update DOCTYPE tokens
- self.tree.insertDoctype(name, publicId, systemId)
-
- if publicId == None:
- publicId = ""
- if publicId != "":
- publicId = publicId.translate(asciiUpper2Lower)
-
- if nameLower != "html":
- # XXX quirks mode
- pass
- else:
- if publicId in\
- ("+//silmaril//dtd html pro v0r11 19970101//en",
- "-//advasoft ltd//dtd html 3.0 aswedit + extensions//en",
- "-//as//dtd html 3.0 aswedit + extensions//en",
- "-//ietf//dtd html 2.0 level 1//en",
- "-//ietf//dtd html 2.0 level 2//en",
- "-//ietf//dtd html 2.0 strict level 1//en",
- "-//ietf//dtd html 2.0 strict level 2//en",
- "-//ietf//dtd html 2.0 strict//en",
- "-//ietf//dtd html 2.0//en",
- "-//ietf//dtd html 2.1e//en",
- "-//ietf//dtd html 3.0//en",
- "-//ietf//dtd html 3.0//en//",
- "-//ietf//dtd html 3.2 final//en",
- "-//ietf//dtd html 3.2//en",
- "-//ietf//dtd html 3//en",
- "-//ietf//dtd html level 0//en",
- "-//ietf//dtd html level 0//en//2.0",
- "-//ietf//dtd html level 1//en",
- "-//ietf//dtd html level 1//en//2.0",
- "-//ietf//dtd html level 2//en",
- "-//ietf//dtd html level 2//en//2.0",
- "-//ietf//dtd html level 3//en",
- "-//ietf//dtd html level 3//en//3.0",
- "-//ietf//dtd html strict level 0//en",
- "-//ietf//dtd html strict level 0//en//2.0",
- "-//ietf//dtd html strict level 1//en",
- "-//ietf//dtd html strict level 1//en//2.0",
- "-//ietf//dtd html strict level 2//en",
- "-//ietf//dtd html strict level 2//en//2.0",
- "-//ietf//dtd html strict level 3//en",
- "-//ietf//dtd html strict level 3//en//3.0",
- "-//ietf//dtd html strict//en",
- "-//ietf//dtd html strict//en//2.0",
- "-//ietf//dtd html strict//en//3.0",
- "-//ietf//dtd html//en",
- "-//ietf//dtd html//en//2.0",
- "-//ietf//dtd html//en//3.0",
- "-//metrius//dtd metrius presentational//en",
- "-//microsoft//dtd internet explorer 2.0 html strict//en",
- "-//microsoft//dtd internet explorer 2.0 html//en",
- "-//microsoft//dtd internet explorer 2.0 tables//en",
- "-//microsoft//dtd internet explorer 3.0 html strict//en",
- "-//microsoft//dtd internet explorer 3.0 html//en",
- "-//microsoft//dtd internet explorer 3.0 tables//en",
- "-//netscape comm. corp.//dtd html//en",
- "-//netscape comm. corp.//dtd strict html//en",
- "-//o'reilly and associates//dtd html 2.0//en",
- "-//o'reilly and associates//dtd html extended 1.0//en",
- "-//spyglass//dtd html 2.0 extended//en",
- "-//sq//dtd html 2.0 hotmetal + extensions//en",
- "-//sun microsystems corp.//dtd hotjava html//en",
- "-//sun microsystems corp.//dtd hotjava strict html//en",
- "-//w3c//dtd html 3 1995-03-24//en",
- "-//w3c//dtd html 3.2 draft//en",
- "-//w3c//dtd html 3.2 final//en",
- "-//w3c//dtd html 3.2//en",
- "-//w3c//dtd html 3.2s draft//en",
- "-//w3c//dtd html 4.0 frameset//en",
- "-//w3c//dtd html 4.0 transitional//en",
- "-//w3c//dtd html experimental 19960712//en",
- "-//w3c//dtd html experimental 970421//en",
- "-//w3c//dtd w3 html//en",
- "-//w3o//dtd w3 html 3.0//en",
- "-//w3o//dtd w3 html 3.0//en//",
- "-//w3o//dtd w3 html strict 3.0//en//",
- "-//webtechs//dtd mozilla html 2.0//en",
- "-//webtechs//dtd mozilla html//en",
- "-/w3c/dtd html 4.0 transitional/en",
- "html")\
- or (publicId in\
- ("-//w3c//dtd html 4.01 frameset//EN",
- "-//w3c//dtd html 4.01 transitional//EN") and systemId == None)\
- or (systemId != None and\
- systemId == "http://www.ibm.com/data/dtd/v11/ibmxhtml1-transitional.dtd"):
- #XXX quirks mode
- pass
-
- self.parser.phase = self.parser.phases["rootElement"]
-
- def processSpaceCharacters(self, data):
- pass
-
- def processCharacters(self, data):
- self.parser.parseError(_(u"Unexpected non-space characters. "
- u"Expected DOCTYPE."))
- self.parser.phase = self.parser.phases["rootElement"]
- self.parser.phase.processCharacters(data)
-
- def processStartTag(self, name, attributes):
- self.parser.parseError(_(u"Unexpected start tag (%s). Expected DOCTYPE.") % (name,))
- self.parser.phase = self.parser.phases["rootElement"]
- self.parser.phase.processStartTag(name, attributes)
-
- def processEndTag(self, name):
- self.parser.parseError(_(u"Unexpected end tag (%s). Expected DOCTYPE.") % (name,))
- self.parser.phase = self.parser.phases["rootElement"]
- self.parser.phase.processEndTag(name)
-
-
-class RootElementPhase(Phase):
- # helper methods
- def insertHtmlElement(self):
- element = self.tree.createElement("html", {})
- self.tree.openElements.append(element)
- self.tree.document.appendChild(element)
- self.parser.phase = self.parser.phases["beforeHead"]
-
- # other
- def processEOF(self):
- self.insertHtmlElement()
- self.parser.phase.processEOF()
-
- def processComment(self, data):
- self.tree.insertComment(data, self.tree.document)
-
- def processSpaceCharacters(self, data):
- pass
-
- def processCharacters(self, data):
- self.insertHtmlElement()
- self.parser.phase.processCharacters(data)
-
- def processStartTag(self, name, attributes):
- if name == "html":
- self.parser.firstStartTag = True
- self.insertHtmlElement()
- self.parser.phase.processStartTag(name, attributes)
-
- def processEndTag(self, name):
- self.insertHtmlElement()
- self.parser.phase.processEndTag(name)
-
-
-class BeforeHeadPhase(Phase):
- def __init__(self, parser, tree):
- Phase.__init__(self, parser, tree)
-
- self.startTagHandler = utils.MethodDispatcher([
- ("html", self.startTagHtml),
- ("head", self.startTagHead)
- ])
- self.startTagHandler.default = self.startTagOther
-
- self.endTagHandler = utils.MethodDispatcher([
- (("html", "head", "body", "br", "p"), self.endTagImplyHead)
- ])
- self.endTagHandler.default = self.endTagOther
-
- def processEOF(self):
- self.startTagHead("head", {})
- self.parser.phase.processEOF()
-
- def processCharacters(self, data):
- self.startTagHead("head", {})
- self.parser.phase.processCharacters(data)
-
- def startTagHead(self, name, attributes):
- self.tree.insertElement(name, attributes)
- self.tree.headPointer = self.tree.openElements[-1]
- self.parser.phase = self.parser.phases["inHead"]
-
- def startTagOther(self, name, attributes):
- self.startTagHead("head", {})
- self.parser.phase.processStartTag(name, attributes)
-
- def endTagImplyHead(self, name):
- self.startTagHead("head", {})
- self.parser.phase.processEndTag(name)
-
- def endTagOther(self, name):
- self.parser.parseError(_(u"Unexpected end tag (%s) after the (implied) root element.") % (name,))
-
-class InHeadPhase(Phase):
- def __init__(self, parser, tree):
- Phase.__init__(self, parser, tree)
-
- self.startTagHandler = utils.MethodDispatcher([
- ("html", self.startTagHtml),
- ("title", self.startTagTitle),
- ("style", self.startTagStyle),
- ("noscript", self.startTagNoScript),
- ("script", self.startTagScript),
- (("base", "link", "meta"), self.startTagBaseLinkMeta),
- ("head", self.startTagHead)
- ])
- self.startTagHandler.default = self.startTagOther
-
- self. endTagHandler = utils.MethodDispatcher([
- ("head", self.endTagHead),
- (("html", "body", "br", "p"), self.endTagImplyAfterHead),
- (("title", "style", "script", "noscript"),
- self.endTagTitleStyleScriptNoScript)
- ])
- self.endTagHandler.default = self.endTagOther
-
- # helper
- def appendToHead(self, element):
- if self.tree.headPointer is not None:
- self.tree.headPointer.appendChild(element)
- else:
- assert self.parser.innerHTML
- self.tree.openElements[-1].appendChild(element)
-
- # the real thing
- def processEOF(self):
- if self.tree.openElements[-1].name in ("title", "style", "script"):
- self.parser.parseError(_(u"Unexpected end of file. "
- u"Expected end tag (%s).") % (self.tree.openElements[-1].name,))
- self.tree.openElements.pop()
- self.anythingElse()
- self.parser.phase.processEOF()
-
- def processCharacters(self, data):
- if self.tree.openElements[-1].name in\
- ("title", "style", "script", "noscript"):
- self.tree.insertText(data)
- else:
- self.anythingElse()
- self.parser.phase.processCharacters(data)
-
- def startTagHead(self, name, attributes):
- self.parser.parseError(_(u"Unexpected start tag head in existing head. Ignored"))
-
- def startTagTitle(self, name, attributes):
- element = self.tree.createElement(name, attributes)
- self.appendToHead(element)
- self.tree.openElements.append(element)
- self.parser.tokenizer.contentModelFlag = contentModelFlags["RCDATA"]
-
- def startTagStyle(self, name, attributes):
- element = self.tree.createElement(name, attributes)
- if self.tree.headPointer is not None and\
- self.parser.phase == self.parser.phases["inHead"]:
- self.appendToHead(element)
- else:
- self.tree.openElements[-1].appendChild(element)
- self.tree.openElements.append(element)
- self.parser.tokenizer.contentModelFlag = contentModelFlags["CDATA"]
-
- def startTagNoScript(self, name, attributes):
- # XXX Need to decide whether to implement the scripting disabled case.
- element = self.tree.createElement(name, attributes)
- if self.tree.headPointer is not None and\
- self.parser.phase == self.parser.phases["inHead"]:
- self.appendToHead(element)
- else:
- self.tree.openElements[-1].appendChild(element)
- self.tree.openElements.append(element)
- self.parser.tokenizer.contentModelFlag = contentModelFlags["CDATA"]
-
- def startTagScript(self, name, attributes):
- #XXX Inner HTML case may be wrong
- element = self.tree.createElement(name, attributes)
- element._flags.append("parser-inserted")
- if (self.tree.headPointer is not None and
- self.parser.phase == self.parser.phases["inHead"]):
- self.appendToHead(element)
- else:
- self.tree.openElements[-1].appendChild(element)
- self.tree.openElements.append(element)
- self.parser.tokenizer.contentModelFlag = contentModelFlags["CDATA"]
-
- def startTagBaseLinkMeta(self, name, attributes):
- element = self.tree.createElement(name, attributes)
- if (self.tree.headPointer is not None and
- self.parser.phase == self.parser.phases["inHead"]):
- self.appendToHead(element)
- else:
- self.tree.openElements[-1].appendChild(element)
-
- def startTagOther(self, name, attributes):
- self.anythingElse()
- self.parser.phase.processStartTag(name, attributes)
-
- def endTagHead(self, name):
- if self.tree.openElements[-1].name == "head":
- self.tree.openElements.pop()
- else:
- self.parser.parseError(_(u"Unexpected end tag (%s). Ignored.") % u'head')
- self.parser.phase = self.parser.phases["afterHead"]
-
- def endTagImplyAfterHead(self, name):
- self.anythingElse()
- self.parser.phase.processEndTag(name)
-
- def endTagTitleStyleScriptNoScript(self, name):
- if self.tree.openElements[-1].name == name:
- self.tree.openElements.pop()
- else:
- self.parser.parseError(_(u"Unexpected end tag (%s). Ignored.") % (name,))
-
- def endTagOther(self, name):
- self.parser.parseError(_(u"Unexpected end tag (%s). Ignored.") % (name,))
-
- def anythingElse(self):
- if self.tree.openElements[-1].name == "head":
- self.endTagHead("head")
- else:
- self.parser.phase = self.parser.phases["afterHead"]
-
-# XXX If we implement a parser for which scripting is disabled we need to
-# implement this phase.
-#
-# class InHeadNoScriptPhase(Phase):
-
-class AfterHeadPhase(Phase):
- def __init__(self, parser, tree):
- Phase.__init__(self, parser, tree)
-
- self.startTagHandler = utils.MethodDispatcher([
- ("html", self.startTagHtml),
- ("body", self.startTagBody),
- ("frameset", self.startTagFrameset),
- (("base", "link", "meta", "script", "style", "title"),
- self.startTagFromHead)
- ])
- self.startTagHandler.default = self.startTagOther
-
- def processEOF(self):
- self.anythingElse()
- self.parser.phase.processEOF()
-
- def processCharacters(self, data):
- self.anythingElse()
- self.parser.phase.processCharacters(data)
-
- def startTagBody(self, name, attributes):
- self.tree.insertElement(name, attributes)
- self.parser.phase = self.parser.phases["inBody"]
-
- def startTagFrameset(self, name, attributes):
- self.tree.insertElement(name, attributes)
- self.parser.phase = self.parser.phases["inFrameset"]
-
- def startTagFromHead(self, name, attributes):
- self.parser.parseError(_(u"Unexpected start tag (%s) that can be in head. Moved.") % (name,))
- self.parser.phase = self.parser.phases["inHead"]
- self.parser.phase.processStartTag(name, attributes)
-
- def startTagOther(self, name, attributes):
- self.anythingElse()
- self.parser.phase.processStartTag(name, attributes)
-
- def processEndTag(self, name):
- self.anythingElse()
- self.parser.phase.processEndTag(name)
-
- def anythingElse(self):
- self.tree.insertElement("body", {})
- self.parser.phase = self.parser.phases["inBody"]
-
-
-class InBodyPhase(Phase):
- # http://www.whatwg.org/specs/web-apps/current-work/#in-body
- # the crazy mode
- def __init__(self, parser, tree):
- Phase.__init__(self, parser, tree)
-
- #Keep a ref to this for special handling of whitespace in <pre>
- self.processSpaceCharactersNonPre = self.processSpaceCharacters
-
- self.startTagHandler = utils.MethodDispatcher([
- ("html", self.startTagHtml),
- (("base", "link", "meta", "script", "style"),
- self.startTagProcessInHead),
- ("title", self.startTagTitle),
- ("body", self.startTagBody),
- (("address", "blockquote", "center", "dir", "div", "dl",
- "fieldset", "listing", "menu", "ol", "p", "pre", "ul"),
- self.startTagCloseP),
- ("form", self.startTagForm),
- (("li", "dd", "dt"), self.startTagListItem),
- ("plaintext",self.startTagPlaintext),
- (headingElements, self.startTagHeading),
- ("a", self.startTagA),
- (("b", "big", "em", "font", "i", "s", "small", "strike", "strong",
- "tt", "u"),self.startTagFormatting),
- ("nobr", self.startTagNobr),
- ("button", self.startTagButton),
- (("marquee", "object"), self.startTagMarqueeObject),
- ("xmp", self.startTagXmp),
- ("table", self.startTagTable),
- (("area", "basefont", "bgsound", "br", "embed", "img", "param",
- "spacer", "wbr"), self.startTagVoidFormatting),
- ("hr", self.startTagHr),
- ("image", self.startTagImage),
- ("input", self.startTagInput),
- ("isindex", self.startTagIsIndex),
- ("textarea", self.startTagTextarea),
- (("iframe", "noembed", "noframes", "noscript"), self.startTagCdata),
- ("select", self.startTagSelect),
- (("caption", "col", "colgroup", "frame", "frameset", "head",
- "option", "optgroup", "tbody", "td", "tfoot", "th", "thead",
- "tr"), self.startTagMisplaced),
- (("event-source", "section", "nav", "article", "aside", "header",
- "footer", "datagrid", "command"), self.startTagNew)
- ])
- self.startTagHandler.default = self.startTagOther
-
- self.endTagHandler = utils.MethodDispatcher([
- ("p",self.endTagP),
- ("body",self.endTagBody),
- ("html",self.endTagHtml),
- (("address", "blockquote", "center", "div", "dl", "fieldset",
- "listing", "menu", "ol", "pre", "ul"), self.endTagBlock),
- ("form", self.endTagForm),
- (("dd", "dt", "li"), self.endTagListItem),
- (headingElements, self.endTagHeading),
- (("a", "b", "big", "em", "font", "i", "nobr", "s", "small",
- "strike", "strong", "tt", "u"), self.endTagFormatting),
- (("marquee", "object", "button"), self.endTagButtonMarqueeObject),
- (("head", "frameset", "select", "optgroup", "option", "table",
- "caption", "colgroup", "col", "thead", "tfoot", "tbody", "tr",
- "td", "th"), self.endTagMisplaced),
- ("br", self.endTagBr),
- (("area", "basefont", "bgsound", "embed", "hr", "image",
- "img", "input", "isindex", "param", "spacer", "wbr", "frame"),
- self.endTagNone),
- (("noframes", "noscript", "noembed", "textarea", "xmp", "iframe"),
- self.endTagCdataTextAreaXmp),
- (("event-source", "section", "nav", "article", "aside", "header",
- "footer", "datagrid", "command"), self.endTagNew)
- ])
- self.endTagHandler.default = self.endTagOther
-
- # helper
- def addFormattingElement(self, name, attributes):
- self.tree.insertElement(name, attributes)
- self.tree.activeFormattingElements.append(
- self.tree.openElements[-1])
-
- # the real deal
- def processSpaceCharactersDropNewline(self, data):
- # Sometimes (start of <pre> and <textarea> blocks) we want to drop
- # leading newlines
- self.processSpaceCharacters = self.processSpaceCharactersNonPre
- if (data.startswith("\n") and
- self.tree.openElements[-1].name in ("pre", "textarea") and
- not self.tree.openElements[-1].hasContent()):
- data = data[1:]
- if data:
- self.tree.reconstructActiveFormattingElements()
- self.tree.insertText(data)
-
- def processCharacters(self, data):
- # XXX The specification says to do this for every character at the
- # moment, but apparently that doesn't match the real world so we don't
- # do it for space characters.
- self.tree.reconstructActiveFormattingElements()
- self.tree.insertText(data)
-
- #This matches the current spec but may not match the real world
- def processSpaceCharacters(self, data):
- self.tree.reconstructActiveFormattingElements()
- self.tree.insertText(data)
-
- def startTagProcessInHead(self, name, attributes):
- self.parser.phases["inHead"].processStartTag(name, attributes)
-
- def startTagTitle(self, name, attributes):
- self.parser.parseError(_(u"Unexpected start tag (%s) that belongs in the head. Moved.") % (name,))
- self.parser.phases["inHead"].processStartTag(name, attributes)
-
- def startTagBody(self, name, attributes):
- self.parser.parseError(_(u"Unexpected start tag (body)."))
- if (len(self.tree.openElements) == 1
- or self.tree.openElements[1].name != "body"):
- assert self.parser.innerHTML
- else:
- for attr, value in attributes.iteritems():
- if attr not in self.tree.openElements[1].attributes:
- self.tree.openElements[1].attributes[attr] = value
-
- def startTagCloseP(self, name, attributes):
- if self.tree.elementInScope("p"):
- self.endTagP("p")
- self.tree.insertElement(name, attributes)
- if name == "pre":
- self.processSpaceCharacters = self.processSpaceCharactersDropNewline
-
- def startTagForm(self, name, attributes):
- if self.tree.formPointer:
- self.parser.parseError("Unexpected start tag (form). Ignored.")
- else:
- if self.tree.elementInScope("p"):
- self.endTagP("p")
- self.tree.insertElement(name, attributes)
- self.tree.formPointer = self.tree.openElements[-1]
-
- def startTagListItem(self, name, attributes):
- if self.tree.elementInScope("p"):
- self.endTagP("p")
- stopNames = {"li":("li"), "dd":("dd", "dt"), "dt":("dd", "dt")}
- stopName = stopNames[name]
- # AT Use reversed in Python 2.4...
- for i, node in enumerate(self.tree.openElements[::-1]):
- if node.name in stopName:
- poppedNodes = []
- for j in range(i+1):
- poppedNodes.append(self.tree.openElements.pop())
- if i >= 1:
- self.parser.parseError(
- (i == 1 and _(u"Missing end tag (%s)") or _(u"Missing end tags (%s)"))
- % u", ".join([item.name for item in poppedNodes[:-1]]))
- break
-
-
- # Phrasing elements are all non special, non scoping, non
- # formatting elements
- if (node.name in (specialElements | scopingElements)
- and node.name not in ("address", "div")):
- break
- # Always insert an <li> element.
- self.tree.insertElement(name, attributes)
-
- def startTagPlaintext(self, name, attributes):
- if self.tree.elementInScope("p"):
- self.endTagP("p")
- self.tree.insertElement(name, attributes)
- self.parser.tokenizer.contentModelFlag = contentModelFlags["PLAINTEXT"]
-
- def startTagHeading(self, name, attributes):
- if self.tree.elementInScope("p"):
- self.endTagP("p")
- # Uncomment the following for IE7 behavior:
- #
- #for item in headingElements:
- # if self.tree.elementInScope(item):
- # self.parser.parseError(_(u"Unexpected start tag (" + name +\
- # ")."))
- # item = self.tree.openElements.pop()
- # while item.name not in headingElements:
- # item = self.tree.openElements.pop()
- # break
- self.tree.insertElement(name, attributes)
-
- def startTagA(self, name, attributes):
- afeAElement = self.tree.elementInActiveFormattingElements("a")
- if afeAElement:
- self.parser.parseError(_(u"Unexpected start tag (%s) implies "
- u"end tag (%s).") % (u'a', u'a'))
- self.endTagFormatting("a")
- if afeAElement in self.tree.openElements:
- self.tree.openElements.remove(afeAElement)
- if afeAElement in self.tree.activeFormattingElements:
- self.tree.activeFormattingElements.remove(afeAElement)
- self.tree.reconstructActiveFormattingElements()
- self.addFormattingElement(name, attributes)
-
- def startTagFormatting(self, name, attributes):
- self.tree.reconstructActiveFormattingElements()
- self.addFormattingElement(name, attributes)
-
- def startTagNobr(self, name, attributes):
- self.tree.reconstructActiveFormattingElements()
- if self.tree.elementInScope("nobr"):
- self.parser.parseError(_(u"Unexpected start tag (%s) implies "
- u"end tag (%s).") % (u'nobr', u'nobr'))
- self.processEndTag("nobr")
- # XXX Need tests that trigger the following
- self.tree.reconstructActiveFormattingElements()
- self.addFormattingElement(name, attributes)
-
- def startTagButton(self, name, attributes):
- if self.tree.elementInScope("button"):
- self.parser.parseError(_(u"Unexpected start tag (%s) implied "
- u"end tag (%s).") % (u'button', u'button'))
- self.processEndTag("button")
- self.parser.phase.processStartTag(name, attributes)
- else:
- self.tree.reconstructActiveFormattingElements()
- self.tree.insertElement(name, attributes)
- self.tree.activeFormattingElements.append(Marker)
-
- def startTagMarqueeObject(self, name, attributes):
- self.tree.reconstructActiveFormattingElements()
- self.tree.insertElement(name, attributes)
- self.tree.activeFormattingElements.append(Marker)
-
- def startTagXmp(self, name, attributes):
- self.tree.reconstructActiveFormattingElements()
- self.tree.insertElement(name, attributes)
- self.parser.tokenizer.contentModelFlag = contentModelFlags["CDATA"]
-
- def startTagTable(self, name, attributes):
- if self.tree.elementInScope("p"):
- self.processEndTag("p")
- self.tree.insertElement(name, attributes)
- self.parser.phase = self.parser.phases["inTable"]
-
- def startTagVoidFormatting(self, name, attributes):
- self.tree.reconstructActiveFormattingElements()
- self.tree.insertElement(name, attributes)
- self.tree.openElements.pop()
-
- def startTagHr(self, name, attributes):
- if self.tree.elementInScope("p"):
- self.endTagP("p")
- self.tree.insertElement(name, attributes)
- self.tree.openElements.pop()
-
- def startTagImage(self, name, attributes):
- # No really...
- self.parser.parseError(_(u"Unexpected start tag (image). Treated "
- u"as img."))
- self.processStartTag("img", attributes)
-
- def startTagInput(self, name, attributes):
- self.tree.reconstructActiveFormattingElements()
- self.tree.insertElement(name, attributes)
- if self.tree.formPointer:
- # XXX Not exactly sure what to do here
- self.tree.openElements[-1].form = self.tree.formPointer
- self.tree.openElements.pop()
-
- def startTagIsIndex(self, name, attributes):
- self.parser.parseError("Unexpected start tag isindex. Don't use it!")
- if self.tree.formPointer:
- return
- self.processStartTag("form", {})
- self.processStartTag("hr", {})
- self.processStartTag("p", {})
- self.processStartTag("label", {})
- # XXX Localization ...
- self.processCharacters(
- "This is a searchable index. Insert your search keywords here: ")
- attributes["name"] = "isindex"
- attrs = [[key,value] for key,value in attributes.iteritems()]
- self.processStartTag("input", dict(attrs))
- self.processEndTag("label")
- self.processEndTag("p")
- self.processStartTag("hr", {})
- self.processEndTag("form")
-
- def startTagTextarea(self, name, attributes):
- # XXX Form element pointer checking here as well...
- self.tree.insertElement(name, attributes)
- self.parser.tokenizer.contentModelFlag = contentModelFlags["RCDATA"]
- self.processSpaceCharacters = self.processSpaceCharactersDropNewline
-
- def startTagCdata(self, name, attributes):
- """iframe, noembed noframes, noscript(if scripting enabled)"""
- self.tree.insertElement(name, attributes)
- self.parser.tokenizer.contentModelFlag = contentModelFlags["CDATA"]
-
- def startTagSelect(self, name, attributes):
- self.tree.reconstructActiveFormattingElements()
- self.tree.insertElement(name, attributes)
- self.parser.phase = self.parser.phases["inSelect"]
-
- def startTagMisplaced(self, name, attributes):
- """ Elements that should be children of other elements that have a
- different insertion mode; here they are ignored
- "caption", "col", "colgroup", "frame", "frameset", "head",
- "option", "optgroup", "tbody", "td", "tfoot", "th", "thead",
- "tr", "noscript"
- """
- self.parser.parseError(_(u"Unexpected start tag (%s). Ignored.") % (name,))
-
- def startTagNew(self, name, attributes):
- """New HTML5 elements, "event-source", "section", "nav",
- "article", "aside", "header", "footer", "datagrid", "command"
- """
- sys.stderr.write("Warning: Undefined behaviour for start tag %s"%name)
- self.startTagOther(name, attributes)
- #raise NotImplementedError
-
- def startTagOther(self, name, attributes):
- self.tree.reconstructActiveFormattingElements()
- self.tree.insertElement(name, attributes)
-
- def endTagP(self, name):
- if self.tree.elementInScope("p"):
- self.tree.generateImpliedEndTags("p")
- if self.tree.openElements[-1].name != "p":
- self.parser.parseError(_(u"Unexpected end tag (%s).") % (u'p',))
- if self.tree.elementInScope("p"):
- while self.tree.elementInScope("p"):
- self.tree.openElements.pop()
- else:
- self.startTagCloseP("p", {})
- self.endTagP("p")
-
- def endTagBody(self, name):
- # XXX Need to take open <p> tags into account here. We shouldn't imply
- # </p> but we should not throw a parse error either. Specification is
- # likely to be updated.
- if self.tree.openElements[1].name != "body":
- # innerHTML case
- self.parser.parseError()
- return
- if self.tree.openElements[-1].name != "body":
- self.parser.parseError(_(u"Unexpected end tag (%s). Missing "
- u"end tag (%s).") % (u'body', self.tree.openElements[-1].name))
- self.parser.phase = self.parser.phases["afterBody"]
-
- def endTagHtml(self, name):
- self.endTagBody(name)
- if not self.parser.innerHTML:
- self.parser.phase.processEndTag(name)
-
- def endTagBlock(self, name):
- #Put us back in the right whitespace handling mode
- if name == "pre":
- self.processSpaceCharacters = self.processSpaceCharactersNonPre
- inScope = self.tree.elementInScope(name)
- if inScope:
- self.tree.generateImpliedEndTags()
- if self.tree.openElements[-1].name != name:
- self.parser.parseError(_(u"End tag (%s) seen too "
- u"early. Expected other end tag.") % (name,))
- if inScope:
- node = self.tree.openElements.pop()
- while node.name != name:
- node = self.tree.openElements.pop()
-
- def endTagForm(self, name):
- if self.tree.elementInScope(name):
- self.tree.generateImpliedEndTags()
- if self.tree.openElements[-1].name != name:
- self.parser.parseError(_(u"End tag (form) seen too early. Ignored."))
- else:
- self.tree.openElements.pop()
- self.tree.formPointer = None
-
- def endTagListItem(self, name):
- # AT Could merge this with the Block case
- if self.tree.elementInScope(name):
- self.tree.generateImpliedEndTags(name)
-
- if self.tree.openElements[-1].name != name:
- self.parser.parseError(_(u"End tag (%s) seen too "
- u"early. Expected other end tag.") % (name,))
-
- if self.tree.elementInScope(name):
- node = self.tree.openElements.pop()
- while node.name != name:
- node = self.tree.openElements.pop()
-
- def endTagHeading(self, name):
- for item in headingElements:
- if self.tree.elementInScope(item):
- self.tree.generateImpliedEndTags()
- break
- if self.tree.openElements[-1].name != name:
- self.parser.parseError(_(u"Unexpected end tag (%s). "
- u"Expected other end tag.") % (name,))
-
- for item in headingElements:
- if self.tree.elementInScope(item):
- item = self.tree.openElements.pop()
- while item.name not in headingElements:
- item = self.tree.openElements.pop()
- break
-
- def endTagFormatting(self, name):
- """The much-feared adoption agency algorithm
- """
- # http://www.whatwg.org/specs/web-apps/current-work/#adoptionAgency
- # XXX Better parseError messages appreciated.
- while True:
- # Step 1 paragraph 1
- afeElement = self.tree.elementInActiveFormattingElements(name)
- if not afeElement or (afeElement in self.tree.openElements and
- not self.tree.elementInScope(afeElement.name)):
- self.parser.parseError(_(u"End tag (%s) violates "
- u" step 1, paragraph 1 of the adoption agency algorithm.") % (name,))
- return
-
- # Step 1 paragraph 2
- elif afeElement not in self.tree.openElements:
- self.parser.parseError(_(u"End tag (%s) violates "
- u" step 1, paragraph 2 of the adoption agency algorithm.") % (name,))
- self.tree.activeFormattingElements.remove(afeElement)
- return
-
- # Step 1 paragraph 3
- if afeElement != self.tree.openElements[-1]:
- self.parser.parseError(_(u"End tag (%s) violates "
- u" step 1, paragraph 3 of the adoption agency algorithm.") % (name,))
-
- # Step 2
- # Start of the adoption agency algorithm proper
- afeIndex = self.tree.openElements.index(afeElement)
- furthestBlock = None
- for element in self.tree.openElements[afeIndex:]:
- if element.name in specialElements | scopingElements:
- furthestBlock = element
- break
-
- # Step 3
- if furthestBlock is None:
- element = self.tree.openElements.pop()
- while element != afeElement:
- element = self.tree.openElements.pop()
- self.tree.activeFormattingElements.remove(element)
- return
- commonAncestor = self.tree.openElements[afeIndex-1]
-
- # Step 5
- if furthestBlock.parent:
- furthestBlock.parent.removeChild(furthestBlock)
-
- # Step 6
- # The bookmark is supposed to help us identify where to reinsert
- # nodes in step 12. We have to ensure that we reinsert nodes after
- # the node before the active formatting element. Note the bookmark
- # can move in step 7.4
- bookmark = self.tree.activeFormattingElements.index(afeElement)
-
- # Step 7
- lastNode = node = furthestBlock
- while True:
- # AT replace this with a function and recursion?
- # Node is element before node in open elements
- node = self.tree.openElements[
- self.tree.openElements.index(node)-1]
- while node not in self.tree.activeFormattingElements:
- tmpNode = node
- node = self.tree.openElements[
- self.tree.openElements.index(node)-1]
- self.tree.openElements.remove(tmpNode)
- # Step 7.3
- if node == afeElement:
- break
- # Step 7.4
- if lastNode == furthestBlock:
- # XXX should this be index(node) or index(node)+1
- # Anne: I think +1 is ok. Given x = [2,3,4,5]
- # x.index(3) gives 1 and then x[1 +1] gives 4...
- bookmark = self.tree.activeFormattingElements.\
- index(node) + 1
- # Step 7.5
- cite = node.parent
- if node.hasContent():
- clone = node.cloneNode()
- # Replace node with clone
- self.tree.activeFormattingElements[
- self.tree.activeFormattingElements.index(node)] = clone
- self.tree.openElements[
- self.tree.openElements.index(node)] = clone
- node = clone
- # Step 7.6
- # Remove lastNode from its parents, if any
- if lastNode.parent:
- lastNode.parent.removeChild(lastNode)
- node.appendChild(lastNode)
- # Step 7.7
- lastNode = node
- # End of inner loop
-
- # Step 8
- if lastNode.parent:
- lastNode.parent.removeChild(lastNode)
- commonAncestor.appendChild(lastNode)
-
- # Step 9
- clone = afeElement.cloneNode()
-
- # Step 10
- furthestBlock.reparentChildren(clone)
-
- # Step 11
- furthestBlock.appendChild(clone)
-
- # Step 12
- self.tree.activeFormattingElements.remove(afeElement)
- self.tree.activeFormattingElements.insert(bookmark, clone)
-
- # Step 13
- self.tree.openElements.remove(afeElement)
- self.tree.openElements.insert(
- self.tree.openElements.index(furthestBlock) + 1, clone)
-
- def endTagButtonMarqueeObject(self, name):
- if self.tree.elementInScope(name):
- self.tree.generateImpliedEndTags()
- if self.tree.openElements[-1].name != name:
- self.parser.parseError(_(u"Unexpected end tag (%s). Expected other end tag first.") % (name,))
-
- if self.tree.elementInScope(name):
- element = self.tree.openElements.pop()
- while element.name != name:
- element = self.tree.openElements.pop()
- self.tree.clearActiveFormattingElements()
-
- def endTagMisplaced(self, name):
- # This handles elements with end tags in other insertion modes.
- self.parser.parseError(_(u"Unexpected end tag (%s). Ignored.") % (name,))
-
- def endTagBr(self, name):
- self.parser.parseError(_(u"Unexpected end tag (br). Treated as br element."))
- self.tree.reconstructActiveFormattingElements()
- self.tree.insertElement(name, {})
- self.tree.openElements.pop()
-
- def endTagNone(self, name):
- # This handles elements with no end tag.
- self.parser.parseError(_(u"This tag (%s) has no end tag") % (name,))
-
- def endTagCdataTextAreaXmp(self, name):
- if self.tree.openElements[-1].name == name:
- self.tree.openElements.pop()
- else:
- self.parser.parseError(_(u"Unexpected end tag (%s). Ignored.") % (name,))
-
- def endTagNew(self, name):
- """New HTML5 elements, "event-source", "section", "nav",
- "article", "aside", "header", "footer", "datagrid", "command"
- """
- sys.stderr.write("Warning: Undefined behaviour for end tag %s"%name)
- self.endTagOther(name)
- #raise NotImplementedError
-
- def endTagOther(self, name):
- # XXX This logic should be moved into the treebuilder
- # AT should use reversed instead of [::-1] when Python 2.4 == True.
- for node in self.tree.openElements[::-1]:
- if node.name == name:
- self.tree.generateImpliedEndTags()
- if self.tree.openElements[-1].name != name:
- self.parser.parseError(_(u"Unexpected end tag (%s).") % (name,))
- while self.tree.openElements.pop() != node:
- pass
- break
- else:
- if node.name in specialElements | scopingElements:
- self.parser.parseError(_(u"Unexpected end tag (%s). Ignored.") % (name,))
- break
-
-class InTablePhase(Phase):
- # http://www.whatwg.org/specs/web-apps/current-work/#in-table
- def __init__(self, parser, tree):
- Phase.__init__(self, parser, tree)
- self.startTagHandler = utils.MethodDispatcher([
- ("html", self.startTagHtml),
- ("caption", self.startTagCaption),
- ("colgroup", self.startTagColgroup),
- ("col", self.startTagCol),
- (("tbody", "tfoot", "thead"), self.startTagRowGroup),
- (("td", "th", "tr"), self.startTagImplyTbody),
- ("table", self.startTagTable)
- ])
- self.startTagHandler.default = self.startTagOther
-
- self.endTagHandler = utils.MethodDispatcher([
- ("table", self.endTagTable),
- (("body", "caption", "col", "colgroup", "html", "tbody", "td",
- "tfoot", "th", "thead", "tr"), self.endTagIgnore)
- ])
- self.endTagHandler.default = self.endTagOther
-
- # helper methods
- def clearStackToTableContext(self):
- # "clear the stack back to a table context"
- while self.tree.openElements[-1].name not in ("table", "html"):
- self.parser.parseError(_(u"Unexpected implied end tag (%s) in the table phase.") % (self.tree.openElements[-1].name,))
- self.tree.openElements.pop()
- # When the current node is <html> it's an innerHTML case
-
- # processing methods
- def processCharacters(self, data):
- self.parser.parseError(_(u"Unexpected non-space characters in "
- u"table context caused voodoo mode."))
- # Make all the special element rearranging voodoo kick in
- self.tree.insertFromTable = True
- # Process the character in the "in body" mode
- self.parser.phases["inBody"].processCharacters(data)
- self.tree.insertFromTable = False
-
- def startTagCaption(self, name, attributes):
- self.clearStackToTableContext()
- self.tree.activeFormattingElements.append(Marker)
- self.tree.insertElement(name, attributes)
- self.parser.phase = self.parser.phases["inCaption"]
-
- def startTagColgroup(self, name, attributes):
- self.clearStackToTableContext()
- self.tree.insertElement(name, attributes)
- self.parser.phase = self.parser.phases["inColumnGroup"]
-
- def startTagCol(self, name, attributes):
- self.startTagColgroup("colgroup", {})
- self.parser.phase.processStartTag(name, attributes)
-
- def startTagRowGroup(self, name, attributes):
- self.clearStackToTableContext()
- self.tree.insertElement(name, attributes)
- self.parser.phase = self.parser.phases["inTableBody"]
-
- def startTagImplyTbody(self, name, attributes):
- self.startTagRowGroup("tbody", {})
- self.parser.phase.processStartTag(name, attributes)
-
- def startTagTable(self, name, attributes):
- self.parser.parseError(_(u"Unexpected start tag (table) in table "
- u"phase. Implies end tag (table)."))
- self.parser.phase.processEndTag("table")
- if not self.parser.innerHTML:
- self.parser.phase.processStartTag(name, attributes)
-
- def startTagOther(self, name, attributes):
- self.parser.parseError(_(u"Unexpected start tag (%s) in "
- u"table context caused voodoo mode.") % (name,))
- # Make all the special element rearranging voodoo kick in
- self.tree.insertFromTable = True
- # Process the start tag in the "in body" mode
- self.parser.phases["inBody"].processStartTag(name, attributes)
- self.tree.insertFromTable = False
-
- def endTagTable(self, name):
- if self.tree.elementInScope("table", True):
- self.tree.generateImpliedEndTags()
- if self.tree.openElements[-1].name != "table":
- self.parser.parseError(_(u"Unexpected end tag (table). "
- u"Expected end tag (%s).") % (self.tree.openElements[-1].name,))
- while self.tree.openElements[-1].name != "table":
- self.tree.openElements.pop()
- self.tree.openElements.pop()
- self.parser.resetInsertionMode()
- else:
- # innerHTML case
- assert self.parser.innerHTML
- self.parser.parseError()
-
- def endTagIgnore(self, name):
- self.parser.parseError(_(u"Unexpected end tag (%s). Ignored.") % (name,))
-
- def endTagOther(self, name):
- self.parser.parseError(_(u"Unexpected end tag (%s) in "
- u"table context caused voodoo mode.") % (name,))
- # Make all the special element rearranging voodoo kick in
- self.tree.insertFromTable = True
- # Process the end tag in the "in body" mode
- self.parser.phases["inBody"].processEndTag(name)
- self.tree.insertFromTable = False
-
-
-class InCaptionPhase(Phase):
- # http://www.whatwg.org/specs/web-apps/current-work/#in-caption
- def __init__(self, parser, tree):
- Phase.__init__(self, parser, tree)
-
- self.startTagHandler = utils.MethodDispatcher([
- ("html", self.startTagHtml),
- (("caption", "col", "colgroup", "tbody", "td", "tfoot", "th",
- "thead", "tr"), self.startTagTableElement)
- ])
- self.startTagHandler.default = self.startTagOther
-
- self.endTagHandler = utils.MethodDispatcher([
- ("caption", self.endTagCaption),
- ("table", self.endTagTable),
- (("body", "col", "colgroup", "html", "tbody", "td", "tfoot", "th",
- "thead", "tr"), self.endTagIgnore)
- ])
- self.endTagHandler.default = self.endTagOther
-
- def ignoreEndTagCaption(self):
- return not self.tree.elementInScope("caption", True)
-
- def processCharacters(self, data):
- self.parser.phases["inBody"].processCharacters(data)
-
- def startTagTableElement(self, name, attributes):
- self.parser.parseError()
- #XXX Have to duplicate logic here to find out if the tag is ignored
- ignoreEndTag = self.ignoreEndTagCaption()
- self.parser.phase.processEndTag("caption")
- if not ignoreEndTag:
- self.parser.phase.processStartTag(name, attributes)
-
- def startTagOther(self, name, attributes):
- self.parser.phases["inBody"].processStartTag(name, attributes)
-
- def endTagCaption(self, name):
- if not self.ignoreEndTagCaption():
- # AT this code is quite similar to endTagTable in "InTable"
- self.tree.generateImpliedEndTags()
- if self.tree.openElements[-1].name != "caption":
- self.parser.parseError(_(u"Unexpected end tag (caption). "
- u"Missing end tags."))
- while self.tree.openElements[-1].name != "caption":
- self.tree.openElements.pop()
- self.tree.openElements.pop()
- self.tree.clearActiveFormattingElements()
- self.parser.phase = self.parser.phases["inTable"]
- else:
- # innerHTML case
- assert self.parser.innerHTML
- self.parser.parseError()
-
- def endTagTable(self, name):
- self.parser.parseError()
- ignoreEndTag = self.ignoreEndTagCaption()
- self.parser.phase.processEndTag("caption")
- if not ignoreEndTag:
- self.parser.phase.processEndTag(name)
-
- def endTagIgnore(self, name):
- self.parser.parseError(_(u"Unexpected end tag (%s). Ignored.") % (name,))
-
- def endTagOther(self, name):
- self.parser.phases["inBody"].processEndTag(name)
-
-
-class InColumnGroupPhase(Phase):
- # http://www.whatwg.org/specs/web-apps/current-work/#in-column
-
- def __init__(self, parser, tree):
- Phase.__init__(self, parser, tree)
-
- self.startTagHandler = utils.MethodDispatcher([
- ("html", self.startTagHtml),
- ("col", self.startTagCol)
- ])
- self.startTagHandler.default = self.startTagOther
-
- self.endTagHandler = utils.MethodDispatcher([
- ("colgroup", self.endTagColgroup),
- ("col", self.endTagCol)
- ])
- self.endTagHandler.default = self.endTagOther
-
- def ignoreEndTagColgroup(self):
- return self.tree.openElements[-1].name == "html"
-
- def processCharacters(self, data):
- ignoreEndTag = self.ignoreEndTagColgroup()
- self.endTagColgroup("colgroup")
- if not ignoreEndTag:
- self.parser.phase.processCharacters(data)
-
- def startTagCol(self, name ,attributes):
- self.tree.insertElement(name, attributes)
- self.tree.openElements.pop()
-
- def startTagOther(self, name, attributes):
- ignoreEndTag = self.ignoreEndTagColgroup()
- self.endTagColgroup("colgroup")
- if not ignoreEndTag:
- self.parser.phase.processStartTag(name, attributes)
-
- def endTagColgroup(self, name):
- if self.ignoreEndTagColgroup():
- # innerHTML case
- assert self.parser.innerHTML
- self.parser.parseError()
- else:
- self.tree.openElements.pop()
- self.parser.phase = self.parser.phases["inTable"]
-
- def endTagCol(self, name):
- self.parser.parseError(_(u"Unexpected end tag (col). "
- u"col has no end tag."))
-
- def endTagOther(self, name):
- ignoreEndTag = self.ignoreEndTagColgroup()
- self.endTagColgroup("colgroup")
- if not ignoreEndTag:
- self.parser.phase.processEndTag(name)
-
-
-class InTableBodyPhase(Phase):
- # http://www.whatwg.org/specs/web-apps/current-work/#in-table0
- def __init__(self, parser, tree):
- Phase.__init__(self, parser, tree)
- self.startTagHandler = utils.MethodDispatcher([
- ("html", self.startTagHtml),
- ("tr", self.startTagTr),
- (("td", "th"), self.startTagTableCell),
- (("caption", "col", "colgroup", "tbody", "tfoot", "thead"), self.startTagTableOther)
- ])
- self.startTagHandler.default = self.startTagOther
-
- self.endTagHandler = utils.MethodDispatcher([
- (("tbody", "tfoot", "thead"), self.endTagTableRowGroup),
- ("table", self.endTagTable),
- (("body", "caption", "col", "colgroup", "html", "td", "th",
- "tr"), self.endTagIgnore)
- ])
- self.endTagHandler.default = self.endTagOther
-
- # helper methods
- def clearStackToTableBodyContext(self):
- while self.tree.openElements[-1].name not in ("tbody", "tfoot",
- "thead", "html"):
- self.parser.parseError(_(u"Unexpected implied end tag (%s) in the table body phase.") % (self.tree.openElements[-1].name,))
- self.tree.openElements.pop()
-
- # the rest
- def processCharacters(self,data):
- self.parser.phases["inTable"].processCharacters(data)
-
- def startTagTr(self, name, attributes):
- self.clearStackToTableBodyContext()
- self.tree.insertElement(name, attributes)
- self.parser.phase = self.parser.phases["inRow"]
-
- def startTagTableCell(self, name, attributes):
- self.parser.parseError(_(u"Unexpected table cell start tag (%s) in the table body phase.") % (name,))
- self.startTagTr("tr", {})
- self.parser.phase.processStartTag(name, attributes)
-
- def startTagTableOther(self, name, attributes):
- # XXX AT Any ideas on how to share this with endTagTable?
- if (self.tree.elementInScope("tbody", True) or
- self.tree.elementInScope("thead", True) or
- self.tree.elementInScope("tfoot", True)):
- self.clearStackToTableBodyContext()
- self.endTagTableRowGroup(self.tree.openElements[-1].name)
- self.parser.phase.processStartTag(name, attributes)
- else:
- # innerHTML case
- self.parser.parseError()
-
- def startTagOther(self, name, attributes):
- self.parser.phases["inTable"].processStartTag(name, attributes)
-
- def endTagTableRowGroup(self, name):
- if self.tree.elementInScope(name, True):
- self.clearStackToTableBodyContext()
- self.tree.openElements.pop()
- self.parser.phase = self.parser.phases["inTable"]
- else:
- self.parser.parseError(_(u"Unexpected end tag (%s) in the table body phase. Ignored.") % (name,))
-
- def endTagTable(self, name):
- if (self.tree.elementInScope("tbody", True) or
- self.tree.elementInScope("thead", True) or
- self.tree.elementInScope("tfoot", True)):
- self.clearStackToTableBodyContext()
- self.endTagTableRowGroup(self.tree.openElements[-1].name)
- self.parser.phase.processEndTag(name)
- else:
- # innerHTML case
- self.parser.parseError()
-
- def endTagIgnore(self, name):
- self.parser.parseError(_(u"Unexpected end tag (%s) in the table body phase. Ignored.") % (name,))
-
- def endTagOther(self, name):
- self.parser.phases["inTable"].processEndTag(name)
-
-
-class InRowPhase(Phase):
- # http://www.whatwg.org/specs/web-apps/current-work/#in-row
- def __init__(self, parser, tree):
- Phase.__init__(self, parser, tree)
- self.startTagHandler = utils.MethodDispatcher([
- ("html", self.startTagHtml),
- (("td", "th"), self.startTagTableCell),
- (("caption", "col", "colgroup", "tbody", "tfoot", "thead",
- "tr"), self.startTagTableOther)
- ])
- self.startTagHandler.default = self.startTagOther
-
- self.endTagHandler = utils.MethodDispatcher([
- ("tr", self.endTagTr),
- ("table", self.endTagTable),
- (("tbody", "tfoot", "thead"), self.endTagTableRowGroup),
- (("body", "caption", "col", "colgroup", "html", "td", "th"),
- self.endTagIgnore)
- ])
- self.endTagHandler.default = self.endTagOther
-
- # helper methods (XXX unify this with other table helper methods)
- def clearStackToTableRowContext(self):
- while self.tree.openElements[-1].name not in ("tr", "html"):
- self.parser.parseError(_(u"Unexpected implied end tag (%s) in the row phase.") % (self.tree.openElements[-1].name,))
- self.tree.openElements.pop()
-
- def ignoreEndTagTr(self):
- return not self.tree.elementInScope("tr", tableVariant=True)
-
- # the rest
- def processCharacters(self, data):
- self.parser.phases["inTable"].processCharacters(data)
-
- def startTagTableCell(self, name, attributes):
- self.clearStackToTableRowContext()
- self.tree.insertElement(name, attributes)
- self.parser.phase = self.parser.phases["inCell"]
- self.tree.activeFormattingElements.append(Marker)
-
- def startTagTableOther(self, name, attributes):
- ignoreEndTag = self.ignoreEndTagTr()
- self.endTagTr("tr")
- # XXX how are we sure it's always ignored in the innerHTML case?
- if not ignoreEndTag:
- self.parser.phase.processStartTag(name, attributes)
-
- def startTagOther(self, name, attributes):
- self.parser.phases["inTable"].processStartTag(name, attributes)
-
- def endTagTr(self, name):
- if not self.ignoreEndTagTr():
- self.clearStackToTableRowContext()
- self.tree.openElements.pop()
- self.parser.phase = self.parser.phases["inTableBody"]
- else:
- # innerHTML case
- assert self.parser.innerHTML
- self.parser.parseError()
-
- def endTagTable(self, name):
- ignoreEndTag = self.ignoreEndTagTr()
- self.endTagTr("tr")
- # Reprocess the current tag if the tr end tag was not ignored
- # XXX how are we sure it's always ignored in the innerHTML case?
- if not ignoreEndTag:
- self.parser.phase.processEndTag(name)
-
- def endTagTableRowGroup(self, name):
- if self.tree.elementInScope(name, True):
- self.endTagTr("tr")
- self.parser.phase.processEndTag(name)
- else:
- # innerHTML case
- self.parser.parseError()
-
- def endTagIgnore(self, name):
- self.parser.parseError(_(u"Unexpected end tag (%s) in the row phase. Ignored.") % (name,))
-
- def endTagOther(self, name):
- self.parser.phases["inTable"].processEndTag(name)
-
-class InCellPhase(Phase):
- # http://www.whatwg.org/specs/web-apps/current-work/#in-cell
- def __init__(self, parser, tree):
- Phase.__init__(self, parser, tree)
- self.startTagHandler = utils.MethodDispatcher([
- ("html", self.startTagHtml),
- (("caption", "col", "colgroup", "tbody", "td", "tfoot", "th",
- "thead", "tr"), self.startTagTableOther)
- ])
- self.startTagHandler.default = self.startTagOther
-
- self.endTagHandler = utils.MethodDispatcher([
- (("td", "th"), self.endTagTableCell),
- (("body", "caption", "col", "colgroup", "html"), self.endTagIgnore),
- (("table", "tbody", "tfoot", "thead", "tr"), self.endTagImply)
- ])
- self.endTagHandler.default = self.endTagOther
-
- # helper
- def closeCell(self):
- if self.tree.elementInScope("td", True):
- self.endTagTableCell("td")
- elif self.tree.elementInScope("th", True):
- self.endTagTableCell("th")
-
- # the rest
- def processCharacters(self, data):
- self.parser.phases["inBody"].processCharacters(data)
-
- def startTagTableOther(self, name, attributes):
- if self.tree.elementInScope("td", True) or \
- self.tree.elementInScope("th", True):
- self.closeCell()
- self.parser.phase.processStartTag(name, attributes)
- else:
- # innerHTML case
- self.parser.parseError()
-
- def startTagOther(self, name, attributes):
- self.parser.phases["inBody"].processStartTag(name, attributes)
- # Optimize this for subsequent invocations. Can't do this initially
- # because self.phases doesn't really exist at that point.
- self.startTagHandler.default =\
- self.parser.phases["inBody"].processStartTag
-
- def endTagTableCell(self, name):
- if self.tree.elementInScope(name, True):
- self.tree.generateImpliedEndTags(name)
- if self.tree.openElements[-1].name != name:
- self.parser.parseError("Got table cell end tag (" + name +\
- ") while required end tags are missing.")
- while True:
- node = self.tree.openElements.pop()
- if node.name == name:
- break
- else:
- self.tree.openElements.pop()
- self.tree.clearActiveFormattingElements()
- self.parser.phase = self.parser.phases["inRow"]
- else:
- self.parser.parseError(_(u"Unexpected end tag (%s). Ignored.") % (name,))
-
- def endTagIgnore(self, name):
- self.parser.parseError(_(u"Unexpected end tag (%s). Ignored.") % (name,))
-
- def endTagImply(self, name):
- if self.tree.elementInScope(name, True):
- self.closeCell()
- self.parser.phase.processEndTag(name)
- else:
- # sometimes innerHTML case
- self.parser.parseError()
-
- def endTagOther(self, name):
- self.parser.phases["inBody"].processEndTag(name)
- # Optimize this for subsequent invocations. Can't do this initially
- # because self.phases doesn't really exist at that point.
- self.endTagHandler.default = self.parser.phases["inBody"].processEndTag
-
-
-class InSelectPhase(Phase):
- def __init__(self, parser, tree):
- Phase.__init__(self, parser, tree)
-
- self.startTagHandler = utils.MethodDispatcher([
- ("html", self.startTagHtml),
- ("option", self.startTagOption),
- ("optgroup", self.startTagOptgroup),
- ("select", self.startTagSelect)
- ])
- self.startTagHandler.default = self.startTagOther
-
- self.endTagHandler = utils.MethodDispatcher([
- ("option", self.endTagOption),
- ("optgroup", self.endTagOptgroup),
- ("select", self.endTagSelect),
- (("caption", "table", "tbody", "tfoot", "thead", "tr", "td",
- "th"), self.endTagTableElements)
- ])
- self.endTagHandler.default = self.endTagOther
-
- # http://www.whatwg.org/specs/web-apps/current-work/#in-select
- def processCharacters(self, data):
- self.tree.insertText(data)
-
- def startTagOption(self, name, attributes):
- # We need to imply </option> if <option> is the current node.
- if self.tree.openElements[-1].name == "option":
- self.tree.openElements.pop()
- self.tree.insertElement(name, attributes)
-
- def startTagOptgroup(self, name, attributes):
- if self.tree.openElements[-1].name == "option":
- self.tree.openElements.pop()
- if self.tree.openElements[-1].name == "optgroup":
- self.tree.openElements.pop()
- self.tree.insertElement(name, attributes)
-
- def startTagSelect(self, name, attributes):
- self.parser.parseError(_(u"Unexpected start tag (select) in the "
- u"select phase implies select start tag."))
- self.endTagSelect("select")
-
- def startTagOther(self, name, attributes):
- self.parser.parseError(_(u"Unexpected start tag token (%s)"
- u" in the select phase. Ignored.") % (name,))
-
- def endTagOption(self, name):
- if self.tree.openElements[-1].name == "option":
- self.tree.openElements.pop()
- else:
- self.parser.parseError(_(u"Unexpected end tag (%s) in the "
- u"select phase. Ignored.") % u'option')
-
- def endTagOptgroup(self, name):
- # </optgroup> implicitly closes <option>
- if self.tree.openElements[-1].name == "option" and \
- self.tree.openElements[-2].name == "optgroup":
- self.tree.openElements.pop()
- # It also closes </optgroup>
- if self.tree.openElements[-1].name == "optgroup":
- self.tree.openElements.pop()
- # But nothing else
- else:
- self.parser.parseError(_(u"Unexpected end tag (%s) in the "
- u"select phase. Ignored.") % u'optgroup')
-
- def endTagSelect(self, name):
- if self.tree.elementInScope("select", True):
- node = self.tree.openElements.pop()
- while node.name != "select":
- node = self.tree.openElements.pop()
- self.parser.resetInsertionMode()
- else:
- # innerHTML case
- self.parser.parseError()
-
- def endTagTableElements(self, name):
- self.parser.parseError(_(u"Unexpected table end tag (%s)"
- u" in the select phase.") % (name,))
- if self.tree.elementInScope(name, True):
- self.endTagSelect("select")
- self.parser.phase.processEndTag(name)
-
- def endTagOther(self, name):
- self.parser.parseError(_(u"Unexpected end tag token (%s)"
- u" in the select phase. Ignored.") % (name,))
-
-
-class AfterBodyPhase(Phase):
- def __init__(self, parser, tree):
- Phase.__init__(self, parser, tree)
-
- # XXX We should prolly add a handler for here as well...
- self.endTagHandler = utils.MethodDispatcher([("html", self.endTagHtml)])
- self.endTagHandler.default = self.endTagOther
-
- def processComment(self, data):
- # This is needed because data is to be appended to the <html> element
- # here and not to whatever is currently open.
- self.tree.insertComment(data, self.tree.openElements[0])
-
- def processCharacters(self, data):
- self.parser.parseError(_(u"Unexpected non-space characters in the "
- u"after body phase."))
- self.parser.phase = self.parser.phases["inBody"]
- self.parser.phase.processCharacters(data)
-
- def processStartTag(self, name, attributes):
- self.parser.parseError(_(u"Unexpected start tag token (%s)"
- u" in the after body phase.") % (name,))
- self.parser.phase = self.parser.phases["inBody"]
- self.parser.phase.processStartTag(name, attributes)
-
- def endTagHtml(self,name):
- if self.parser.innerHTML:
- self.parser.parseError()
- else:
- # XXX: This may need to be done, not sure:
- # Don't set lastPhase to the current phase but to the inBody phase
- # instead. No need for extra parse errors if there's something
- # after </html>.
- # Try "<!doctype html>X</html>X" for instance.
- self.parser.lastPhase = self.parser.phase
- self.parser.phase = self.parser.phases["trailingEnd"]
-
- def endTagOther(self, name):
- self.parser.parseError(_(u"Unexpected end tag token (%s)"
- u" in the after body phase.") % (name,))
- self.parser.phase = self.parser.phases["inBody"]
- self.parser.phase.processEndTag(name)
-
-class InFramesetPhase(Phase):
- # http://www.whatwg.org/specs/web-apps/current-work/#in-frameset
- def __init__(self, parser, tree):
- Phase.__init__(self, parser, tree)
-
- self.startTagHandler = utils.MethodDispatcher([
- ("html", self.startTagHtml),
- ("frameset", self.startTagFrameset),
- ("frame", self.startTagFrame),
- ("noframes", self.startTagNoframes)
- ])
- self.startTagHandler.default = self.startTagOther
-
- self.endTagHandler = utils.MethodDispatcher([
- ("frameset", self.endTagFrameset),
- ("noframes", self.endTagNoframes)
- ])
- self.endTagHandler.default = self.endTagOther
-
- def processCharacters(self, data):
- self.parser.parseError(_(u"Unepxected characters in "
- u"the frameset phase. Characters ignored."))
-
- def startTagFrameset(self, name, attributes):
- self.tree.insertElement(name, attributes)
-
- def startTagFrame(self, name, attributes):
- self.tree.insertElement(name, attributes)
- self.tree.openElements.pop()
-
- def startTagNoframes(self, name, attributes):
- self.parser.phases["inBody"].processStartTag(name, attributes)
-
- def startTagOther(self, name, attributes):
- self.parser.parseError(_(u"Unexpected start tag token (%s)"
- u" in the frameset phase. Ignored") % (name,))
-
- def endTagFrameset(self, name):
- if self.tree.openElements[-1].name == "html":
- # innerHTML case
- self.parser.parseError(_(u"Unexpected end tag token (frameset)"
- u"in the frameset phase (innerHTML)."))
- else:
- self.tree.openElements.pop()
- if (not self.parser.innerHTML and
- self.tree.openElements[-1].name != "frameset"):
- # If we're not in innerHTML mode and the the current node is not a
- # "frameset" element (anymore) then switch.
- self.parser.phase = self.parser.phases["afterFrameset"]
-
- def endTagNoframes(self, name):
- self.parser.phases["inBody"].processEndTag(name)
-
- def endTagOther(self, name):
- self.parser.parseError(_(u"Unexpected end tag token (%s)"
- u" in the frameset phase. Ignored.") % (name,))
-
-
-class AfterFramesetPhase(Phase):
- # http://www.whatwg.org/specs/web-apps/current-work/#after3
- def __init__(self, parser, tree):
- Phase.__init__(self, parser, tree)
-
- self.startTagHandler = utils.MethodDispatcher([
- ("html", self.startTagHtml),
- ("noframes", self.startTagNoframes)
- ])
- self.startTagHandler.default = self.startTagOther
-
- self.endTagHandler = utils.MethodDispatcher([
- ("html", self.endTagHtml)
- ])
- self.endTagHandler.default = self.endTagOther
-
- def processCharacters(self, data):
- self.parser.parseError(_(u"Unexpected non-space characters in the "
- u"after frameset phase. Ignored."))
-
- def startTagNoframes(self, name, attributes):
- self.parser.phases["inBody"].processStartTag(name, attributes)
-
- def startTagOther(self, name, attributes):
- self.parser.parseError(_(u"Unexpected start tag (%s)"
- u" in the after frameset phase. Ignored.") % (name,))
-
- def endTagHtml(self, name):
- self.parser.lastPhase = self.parser.phase
- self.parser.phase = self.parser.phases["trailingEnd"]
-
- def endTagOther(self, name):
- self.parser.parseError(_(u"Unexpected end tag (%s)"
- u" in the after frameset phase. Ignored.") % (name,))
-
-
-class TrailingEndPhase(Phase):
- def processEOF(self):
- pass
-
- def processComment(self, data):
- self.tree.insertComment(data, self.tree.document)
-
- def processSpaceCharacters(self, data):
- self.parser.lastPhase.processSpaceCharacters(data)
-
- def processCharacters(self, data):
- self.parser.parseError(_(u"Unexpected non-space characters. "
- u"Expected end of file."))
- self.parser.phase = self.parser.lastPhase
- self.parser.phase.processCharacters(data)
-
- def processStartTag(self, name, attributes):
- self.parser.parseError(_(u"Unexpected start tag (%s)"
- u". Expected end of file.") % (name,))
- self.parser.phase = self.parser.lastPhase
- self.parser.phase.processStartTag(name, attributes)
-
- def processEndTag(self, name):
- self.parser.parseError(_(u"Unexpected end tag (%s)"
- u". Expected end of file.") % (name,))
- self.parser.phase = self.parser.lastPhase
- self.parser.phase.processEndTag(name)
-
-
-class ParseError(Exception):
- """Error in parsed document"""
- pass
Copied: trunk/lib/venus/planet/vendor/html5lib/html5parser.py (from rev 656, branches/sucs-site/lib/venus/planet/vendor/html5lib/html5parser.py)
===================================================================
--- trunk/lib/venus/planet/vendor/html5lib/html5parser.py (rev 0)
+++ trunk/lib/venus/planet/vendor/html5lib/html5parser.py 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,1985 @@
+# Differences from the current specification are as follows:
+# * Phases and insertion modes are one concept in parser.py.
+# * EOF handling is slightly different to make sure <html>, <head> and <body>
+# always exist.
+
+
+try:
+ frozenset
+except NameError:
+ # Import from the sets module for python 2.3
+ from sets import Set as set
+ from sets import ImmutableSet as frozenset
+import gettext
+_ = gettext.gettext
+import sys
+
+import tokenizer
+
+import treebuilders
+from treebuilders._base import Marker
+from treebuilders import simpletree
+
+import utils
+from constants import contentModelFlags, spaceCharacters, asciiUpper2Lower
+from constants import scopingElements, formattingElements, specialElements
+from constants import headingElements, tableInsertModeElements
+from constants import cdataElements, rcdataElements, voidElements
+
+class HTMLParser(object):
+ """HTML parser. Generates a tree structure from a stream of (possibly
+ malformed) HTML"""
+
+ def __init__(self, strict = False, tree=simpletree.TreeBuilder,
+ tokenizer=tokenizer.HTMLTokenizer):
+ """
+ strict - raise an exception when a parse error is encountered
+
+ tree - a treebuilder class controlling the type of tree that will be
+ returned. Built in treebuilders can be accessed through
+ html5lib.treebuilders.getTreeBuilder(treeType)
+ """
+
+ # Raise an exception on the first error encountered
+ self.strict = strict
+
+ self.tree = tree()
+ self.tokenizer_class = tokenizer
+ self.errors = []
+
+ # "quirks" / "almost-standards" / "standards"
+ self.quirksMode = "standards"
+
+ self.phases = {
+ "initial": InitialPhase(self, self.tree),
+ "rootElement": RootElementPhase(self, self.tree),
+ "beforeHead": BeforeHeadPhase(self, self.tree),
+ "inHead": InHeadPhase(self, self.tree),
+ # XXX "inHeadNoscript": InHeadNoScriptPhase(self, self.tree),
+ "afterHead": AfterHeadPhase(self, self.tree),
+ "inBody": InBodyPhase(self, self.tree),
+ "inTable": InTablePhase(self, self.tree),
+ "inCaption": InCaptionPhase(self, self.tree),
+ "inColumnGroup": InColumnGroupPhase(self, self.tree),
+ "inTableBody": InTableBodyPhase(self, self.tree),
+ "inRow": InRowPhase(self, self.tree),
+ "inCell": InCellPhase(self, self.tree),
+ "inSelect": InSelectPhase(self, self.tree),
+ "afterBody": AfterBodyPhase(self, self.tree),
+ "inFrameset": InFramesetPhase(self, self.tree),
+ "afterFrameset": AfterFramesetPhase(self, self.tree),
+ "trailingEnd": TrailingEndPhase(self, self.tree)
+ }
+
+ def _parse(self, stream, innerHTML=False, container="div",
+ encoding=None, **kwargs):
+
+ self.tree.reset()
+ self.firstStartTag = False
+ self.errors = []
+
+ self.tokenizer = self.tokenizer_class(stream, encoding=encoding,
+ parseMeta=not innerHTML, **kwargs)
+
+ if innerHTML:
+ self.innerHTML = container.lower()
+
+ if self.innerHTML in cdataElements:
+ self.tokenizer.contentModelFlag = tokenizer.contentModelFlags["RCDATA"]
+ elif self.innerHTML in rcdataElements:
+ self.tokenizer.contentModelFlag = tokenizer.contentModelFlags["CDATA"]
+ elif self.innerHTML == 'plaintext':
+ self.tokenizer.contentModelFlag = tokenizer.contentModelFlags["PLAINTEXT"]
+ else:
+ # contentModelFlag already is PCDATA
+ #self.tokenizer.contentModelFlag = tokenizer.contentModelFlags["PCDATA"]
+ pass
+ self.phase = self.phases["rootElement"]
+ self.phase.insertHtmlElement()
+ self.resetInsertionMode()
+ else:
+ self.innerHTML = False
+ self.phase = self.phases["initial"]
+
+ # We only seem to have InBodyPhase testcases where the following is
+ # relevant ... need others too
+ self.lastPhase = None
+
+ # XXX This is temporary for the moment so there isn't any other
+ # changes needed for the parser to work with the iterable tokenizer
+ for token in self.tokenizer:
+ token = self.normalizeToken(token)
+ type = token["type"]
+ method = getattr(self.phase, "process%s" % type, None)
+ if type in ("Characters", "SpaceCharacters", "Comment"):
+ method(token["data"])
+ elif type == "StartTag":
+ method(token["name"], token["data"])
+ elif type == "EndTag":
+ method(token["name"])
+ elif type == "Doctype":
+ method(token["name"], token["publicId"], token["systemId"], token["correct"])
+ else:
+ self.parseError(token["data"])
+
+ # When the loop finishes it's EOF
+ self.phase.processEOF()
+
+ def parse(self, stream, encoding=None):
+ """Parse a HTML document into a well-formed tree
+
+ stream - a filelike object or string containing the HTML to be parsed
+
+ The optional encoding parameter must be a string that indicates
+ the encoding. If specified, that encoding will be used,
+ regardless of any BOM or later declaration (such as in a meta
+ element)
+ """
+ self._parse(stream, innerHTML=False, encoding=encoding)
+ return self.tree.getDocument()
+
+ def parseFragment(self, stream, container="div", encoding=None):
+ """Parse a HTML fragment into a well-formed tree fragment
+
+ container - name of the element we're setting the innerHTML property
+ if set to None, default to 'div'
+
+ stream - a filelike object or string containing the HTML to be parsed
+
+ The optional encoding parameter must be a string that indicates
+ the encoding. If specified, that encoding will be used,
+ regardless of any BOM or later declaration (such as in a meta
+ element)
+ """
+ self._parse(stream, True, container=container, encoding=encoding)
+ return self.tree.getFragment()
+
+ def parseError(self, data="XXX ERROR MESSAGE NEEDED"):
+ # XXX The idea is to make data mandatory.
+ self.errors.append((self.tokenizer.stream.position(), data))
+ if self.strict:
+ raise ParseError
+
+ def normalizeToken(self, token):
+ """ HTML5 specific normalizations to the token stream """
+
+ if token["type"] == "EmptyTag":
+ # When a solidus (/) is encountered within a tag name what happens
+ # depends on whether the current tag name matches that of a void
+ # element. If it matches a void element atheists did the wrong
+ # thing and if it doesn't it's wrong for everyone.
+
+ if token["name"] not in voidElements:
+ self.parseError(_(u"Solidus (/) incorrectly placed in tag."))
+
+ token["type"] = "StartTag"
+
+ if token["type"] == "StartTag":
+ token["data"] = dict(token["data"][::-1])
+
+ return token
+
+
+ def resetInsertionMode(self):
+ # The name of this method is mostly historical. (It's also used in the
+ # specification.)
+ last = False
+ newModes = {
+ "select":"inSelect",
+ "td":"inCell",
+ "th":"inCell",
+ "tr":"inRow",
+ "tbody":"inTableBody",
+ "thead":"inTableBody",
+ "tfoot":"inTableBody",
+ "caption":"inCaption",
+ "colgroup":"inColumnGroup",
+ "table":"inTable",
+ "head":"inBody",
+ "body":"inBody",
+ "frameset":"inFrameset"
+ }
+ for node in self.tree.openElements[::-1]:
+ nodeName = node.name
+ if node == self.tree.openElements[0]:
+ last = True
+ if nodeName not in ['td', 'th']:
+ # XXX
+ assert self.innerHTML
+ nodeName = self.innerHTML
+ # Check for conditions that should only happen in the innerHTML
+ # case
+ if nodeName in ("select", "colgroup", "head", "frameset"):
+ # XXX
+ assert self.innerHTML
+ if nodeName in newModes:
+ self.phase = self.phases[newModes[nodeName]]
+ break
+ elif nodeName == "html":
+ if self.tree.headPointer is None:
+ self.phase = self.phases["beforeHead"]
+ else:
+ self.phase = self.phases["afterHead"]
+ break
+ elif last:
+ self.phase = self.phases["inBody"]
+ break
+
+class Phase(object):
+ """Base class for helper object that implements each phase of processing
+ """
+ # Order should be (they can be omitted):
+ # * EOF
+ # * Comment
+ # * Doctype
+ # * SpaceCharacters
+ # * Characters
+ # * StartTag
+ # - startTag* methods
+ # * EndTag
+ # - endTag* methods
+
+ def __init__(self, parser, tree):
+ self.parser = parser
+ self.tree = tree
+
+ def processEOF(self):
+ self.tree.generateImpliedEndTags()
+ if len(self.tree.openElements) > 2:
+ self.parser.parseError(_(u"Unexpected end of file. "
+ u"Missing closing tags."))
+ elif len(self.tree.openElements) == 2 and\
+ self.tree.openElements[1].name != "body":
+ # This happens for framesets or something?
+ self.parser.parseError(_(u"Unexpected end of file. Expected end "
+ u"tag (%s) first.") % (self.tree.openElements[1].name,))
+ elif self.parser.innerHTML and len(self.tree.openElements) > 1 :
+ # XXX This is not what the specification says. Not sure what to do
+ # here.
+ self.parser.parseError(_(u"XXX innerHTML EOF"))
+ # Betting ends.
+
+ def processComment(self, data):
+ # For most phases the following is correct. Where it's not it will be
+ # overridden.
+ self.tree.insertComment(data, self.tree.openElements[-1])
+
+ def processDoctype(self, name, publicId, systemId, correct):
+ self.parser.parseError(_(u"Unexpected DOCTYPE. Ignored."))
+
+ def processSpaceCharacters(self, data):
+ self.tree.insertText(data)
+
+ def processStartTag(self, name, attributes):
+ self.startTagHandler[name](name, attributes)
+
+ def startTagHtml(self, name, attributes):
+ if self.parser.firstStartTag == False and name == "html":
+ self.parser.parseError(_(u"html needs to be the first start tag."))
+ # XXX Need a check here to see if the first start tag token emitted is
+ # this token... If it's not, invoke self.parser.parseError().
+ for attr, value in attributes.iteritems():
+ if attr not in self.tree.openElements[0].attributes:
+ self.tree.openElements[0].attributes[attr] = value
+ self.parser.firstStartTag = False
+
+ def processEndTag(self, name):
+ self.endTagHandler[name](name)
+
+
+class InitialPhase(Phase):
+ # This phase deals with error handling as well which is currently not
+ # covered in the specification. The error handling is typically known as
+ # "quirks mode". It is expected that a future version of HTML5 will defin
+ # this.
+ def processEOF(self):
+ self.parser.parseError(_(u"Unexpected End of file. Expected DOCTYPE."))
+ self.parser.phase = self.parser.phases["rootElement"]
+ self.parser.phase.processEOF()
+
+ def processComment(self, data):
+ self.tree.insertComment(data, self.tree.document)
+
+ def processDoctype(self, name, publicId, systemId, correct):
+ nameLower = name.translate(asciiUpper2Lower)
+ if nameLower != "html" or publicId != None or\
+ systemId != None:
+ self.parser.parseError(_(u"Erroneous DOCTYPE."))
+ # XXX need to update DOCTYPE tokens
+ self.tree.insertDoctype(name, publicId, systemId)
+
+ if publicId == None:
+ publicId = ""
+ if publicId != "":
+ publicId = publicId.translate(asciiUpper2Lower)
+
+ if nameLower != "html":
+ # XXX quirks mode
+ pass
+ else:
+ if publicId in\
+ ("+//silmaril//dtd html pro v0r11 19970101//en",
+ "-//advasoft ltd//dtd html 3.0 aswedit + extensions//en",
+ "-//as//dtd html 3.0 aswedit + extensions//en",
+ "-//ietf//dtd html 2.0 level 1//en",
+ "-//ietf//dtd html 2.0 level 2//en",
+ "-//ietf//dtd html 2.0 strict level 1//en",
+ "-//ietf//dtd html 2.0 strict level 2//en",
+ "-//ietf//dtd html 2.0 strict//en",
+ "-//ietf//dtd html 2.0//en",
+ "-//ietf//dtd html 2.1e//en",
+ "-//ietf//dtd html 3.0//en",
+ "-//ietf//dtd html 3.0//en//",
+ "-//ietf//dtd html 3.2 final//en",
+ "-//ietf//dtd html 3.2//en",
+ "-//ietf//dtd html 3//en",
+ "-//ietf//dtd html level 0//en",
+ "-//ietf//dtd html level 0//en//2.0",
+ "-//ietf//dtd html level 1//en",
+ "-//ietf//dtd html level 1//en//2.0",
+ "-//ietf//dtd html level 2//en",
+ "-//ietf//dtd html level 2//en//2.0",
+ "-//ietf//dtd html level 3//en",
+ "-//ietf//dtd html level 3//en//3.0",
+ "-//ietf//dtd html strict level 0//en",
+ "-//ietf//dtd html strict level 0//en//2.0",
+ "-//ietf//dtd html strict level 1//en",
+ "-//ietf//dtd html strict level 1//en//2.0",
+ "-//ietf//dtd html strict level 2//en",
+ "-//ietf//dtd html strict level 2//en//2.0",
+ "-//ietf//dtd html strict level 3//en",
+ "-//ietf//dtd html strict level 3//en//3.0",
+ "-//ietf//dtd html strict//en",
+ "-//ietf//dtd html strict//en//2.0",
+ "-//ietf//dtd html strict//en//3.0",
+ "-//ietf//dtd html//en",
+ "-//ietf//dtd html//en//2.0",
+ "-//ietf//dtd html//en//3.0",
+ "-//metrius//dtd metrius presentational//en",
+ "-//microsoft//dtd internet explorer 2.0 html strict//en",
+ "-//microsoft//dtd internet explorer 2.0 html//en",
+ "-//microsoft//dtd internet explorer 2.0 tables//en",
+ "-//microsoft//dtd internet explorer 3.0 html strict//en",
+ "-//microsoft//dtd internet explorer 3.0 html//en",
+ "-//microsoft//dtd internet explorer 3.0 tables//en",
+ "-//netscape comm. corp.//dtd html//en",
+ "-//netscape comm. corp.//dtd strict html//en",
+ "-//o'reilly and associates//dtd html 2.0//en",
+ "-//o'reilly and associates//dtd html extended 1.0//en",
+ "-//spyglass//dtd html 2.0 extended//en",
+ "-//sq//dtd html 2.0 hotmetal + extensions//en",
+ "-//sun microsystems corp.//dtd hotjava html//en",
+ "-//sun microsystems corp.//dtd hotjava strict html//en",
+ "-//w3c//dtd html 3 1995-03-24//en",
+ "-//w3c//dtd html 3.2 draft//en",
+ "-//w3c//dtd html 3.2 final//en",
+ "-//w3c//dtd html 3.2//en",
+ "-//w3c//dtd html 3.2s draft//en",
+ "-//w3c//dtd html 4.0 frameset//en",
+ "-//w3c//dtd html 4.0 transitional//en",
+ "-//w3c//dtd html experimental 19960712//en",
+ "-//w3c//dtd html experimental 970421//en",
+ "-//w3c//dtd w3 html//en",
+ "-//w3o//dtd w3 html 3.0//en",
+ "-//w3o//dtd w3 html 3.0//en//",
+ "-//w3o//dtd w3 html strict 3.0//en//",
+ "-//webtechs//dtd mozilla html 2.0//en",
+ "-//webtechs//dtd mozilla html//en",
+ "-/w3c/dtd html 4.0 transitional/en",
+ "html")\
+ or (publicId in\
+ ("-//w3c//dtd html 4.01 frameset//EN",
+ "-//w3c//dtd html 4.01 transitional//EN") and systemId == None)\
+ or (systemId != None and\
+ systemId == "http://www.ibm.com/data/dtd/v11/ibmxhtml1-transitional.dtd"):
+ #XXX quirks mode
+ pass
+
+ self.parser.phase = self.parser.phases["rootElement"]
+
+ def processSpaceCharacters(self, data):
+ pass
+
+ def processCharacters(self, data):
+ self.parser.parseError(_(u"Unexpected non-space characters. "
+ u"Expected DOCTYPE."))
+ self.parser.phase = self.parser.phases["rootElement"]
+ self.parser.phase.processCharacters(data)
+
+ def processStartTag(self, name, attributes):
+ self.parser.parseError(_(u"Unexpected start tag (%s). Expected DOCTYPE.") % (name,))
+ self.parser.phase = self.parser.phases["rootElement"]
+ self.parser.phase.processStartTag(name, attributes)
+
+ def processEndTag(self, name):
+ self.parser.parseError(_(u"Unexpected end tag (%s). Expected DOCTYPE.") % (name,))
+ self.parser.phase = self.parser.phases["rootElement"]
+ self.parser.phase.processEndTag(name)
+
+
+class RootElementPhase(Phase):
+ # helper methods
+ def insertHtmlElement(self):
+ element = self.tree.createElement("html", {})
+ self.tree.openElements.append(element)
+ self.tree.document.appendChild(element)
+ self.parser.phase = self.parser.phases["beforeHead"]
+
+ # other
+ def processEOF(self):
+ self.insertHtmlElement()
+ self.parser.phase.processEOF()
+
+ def processComment(self, data):
+ self.tree.insertComment(data, self.tree.document)
+
+ def processSpaceCharacters(self, data):
+ pass
+
+ def processCharacters(self, data):
+ self.insertHtmlElement()
+ self.parser.phase.processCharacters(data)
+
+ def processStartTag(self, name, attributes):
+ if name == "html":
+ self.parser.firstStartTag = True
+ self.insertHtmlElement()
+ self.parser.phase.processStartTag(name, attributes)
+
+ def processEndTag(self, name):
+ self.insertHtmlElement()
+ self.parser.phase.processEndTag(name)
+
+
+class BeforeHeadPhase(Phase):
+ def __init__(self, parser, tree):
+ Phase.__init__(self, parser, tree)
+
+ self.startTagHandler = utils.MethodDispatcher([
+ ("html", self.startTagHtml),
+ ("head", self.startTagHead)
+ ])
+ self.startTagHandler.default = self.startTagOther
+
+ self.endTagHandler = utils.MethodDispatcher([
+ (("html", "head", "body", "br", "p"), self.endTagImplyHead)
+ ])
+ self.endTagHandler.default = self.endTagOther
+
+ def processEOF(self):
+ self.startTagHead("head", {})
+ self.parser.phase.processEOF()
+
+ def processCharacters(self, data):
+ self.startTagHead("head", {})
+ self.parser.phase.processCharacters(data)
+
+ def startTagHead(self, name, attributes):
+ self.tree.insertElement(name, attributes)
+ self.tree.headPointer = self.tree.openElements[-1]
+ self.parser.phase = self.parser.phases["inHead"]
+
+ def startTagOther(self, name, attributes):
+ self.startTagHead("head", {})
+ self.parser.phase.processStartTag(name, attributes)
+
+ def endTagImplyHead(self, name):
+ self.startTagHead("head", {})
+ self.parser.phase.processEndTag(name)
+
+ def endTagOther(self, name):
+ self.parser.parseError(_(u"Unexpected end tag (%s) after the (implied) root element.") % (name,))
+
+class InHeadPhase(Phase):
+ def __init__(self, parser, tree):
+ Phase.__init__(self, parser, tree)
+
+ self.startTagHandler = utils.MethodDispatcher([
+ ("html", self.startTagHtml),
+ ("title", self.startTagTitle),
+ ("style", self.startTagStyle),
+ ("noscript", self.startTagNoScript),
+ ("script", self.startTagScript),
+ (("base", "link", "meta"), self.startTagBaseLinkMeta),
+ ("head", self.startTagHead)
+ ])
+ self.startTagHandler.default = self.startTagOther
+
+ self. endTagHandler = utils.MethodDispatcher([
+ ("head", self.endTagHead),
+ (("html", "body", "br", "p"), self.endTagImplyAfterHead),
+ (("title", "style", "script", "noscript"),
+ self.endTagTitleStyleScriptNoScript)
+ ])
+ self.endTagHandler.default = self.endTagOther
+
+ # helper
+ def appendToHead(self, element):
+ if self.tree.headPointer is not None:
+ self.tree.headPointer.appendChild(element)
+ else:
+ assert self.parser.innerHTML
+ self.tree.openElements[-1].appendChild(element)
+
+ # the real thing
+ def processEOF(self):
+ if self.tree.openElements[-1].name in ("title", "style", "script"):
+ self.parser.parseError(_(u"Unexpected end of file. "
+ u"Expected end tag (%s).") % (self.tree.openElements[-1].name,))
+ self.tree.openElements.pop()
+ self.anythingElse()
+ self.parser.phase.processEOF()
+
+ def processCharacters(self, data):
+ if self.tree.openElements[-1].name in\
+ ("title", "style", "script", "noscript"):
+ self.tree.insertText(data)
+ else:
+ self.anythingElse()
+ self.parser.phase.processCharacters(data)
+
+ def startTagHead(self, name, attributes):
+ self.parser.parseError(_(u"Unexpected start tag head in existing head. Ignored"))
+
+ def startTagTitle(self, name, attributes):
+ element = self.tree.createElement(name, attributes)
+ self.appendToHead(element)
+ self.tree.openElements.append(element)
+ self.parser.tokenizer.contentModelFlag = contentModelFlags["RCDATA"]
+
+ def startTagStyle(self, name, attributes):
+ element = self.tree.createElement(name, attributes)
+ if self.tree.headPointer is not None and\
+ self.parser.phase == self.parser.phases["inHead"]:
+ self.appendToHead(element)
+ else:
+ self.tree.openElements[-1].appendChild(element)
+ self.tree.openElements.append(element)
+ self.parser.tokenizer.contentModelFlag = contentModelFlags["CDATA"]
+
+ def startTagNoScript(self, name, attributes):
+ # XXX Need to decide whether to implement the scripting disabled case.
+ element = self.tree.createElement(name, attributes)
+ if self.tree.headPointer is not None and\
+ self.parser.phase == self.parser.phases["inHead"]:
+ self.appendToHead(element)
+ else:
+ self.tree.openElements[-1].appendChild(element)
+ self.tree.openElements.append(element)
+ self.parser.tokenizer.contentModelFlag = contentModelFlags["CDATA"]
+
+ def startTagScript(self, name, attributes):
+ #XXX Inner HTML case may be wrong
+ element = self.tree.createElement(name, attributes)
+ element._flags.append("parser-inserted")
+ if (self.tree.headPointer is not None and
+ self.parser.phase == self.parser.phases["inHead"]):
+ self.appendToHead(element)
+ else:
+ self.tree.openElements[-1].appendChild(element)
+ self.tree.openElements.append(element)
+ self.parser.tokenizer.contentModelFlag = contentModelFlags["CDATA"]
+
+ def startTagBaseLinkMeta(self, name, attributes):
+ element = self.tree.createElement(name, attributes)
+ if (self.tree.headPointer is not None and
+ self.parser.phase == self.parser.phases["inHead"]):
+ self.appendToHead(element)
+ else:
+ self.tree.openElements[-1].appendChild(element)
+
+ def startTagOther(self, name, attributes):
+ self.anythingElse()
+ self.parser.phase.processStartTag(name, attributes)
+
+ def endTagHead(self, name):
+ if self.tree.openElements[-1].name == "head":
+ self.tree.openElements.pop()
+ else:
+ self.parser.parseError(_(u"Unexpected end tag (%s). Ignored.") % u'head')
+ self.parser.phase = self.parser.phases["afterHead"]
+
+ def endTagImplyAfterHead(self, name):
+ self.anythingElse()
+ self.parser.phase.processEndTag(name)
+
+ def endTagTitleStyleScriptNoScript(self, name):
+ if self.tree.openElements[-1].name == name:
+ self.tree.openElements.pop()
+ else:
+ self.parser.parseError(_(u"Unexpected end tag (%s). Ignored.") % (name,))
+
+ def endTagOther(self, name):
+ self.parser.parseError(_(u"Unexpected end tag (%s). Ignored.") % (name,))
+
+ def anythingElse(self):
+ if self.tree.openElements[-1].name == "head":
+ self.endTagHead("head")
+ else:
+ self.parser.phase = self.parser.phases["afterHead"]
+
+# XXX If we implement a parser for which scripting is disabled we need to
+# implement this phase.
+#
+# class InHeadNoScriptPhase(Phase):
+
+class AfterHeadPhase(Phase):
+ def __init__(self, parser, tree):
+ Phase.__init__(self, parser, tree)
+
+ self.startTagHandler = utils.MethodDispatcher([
+ ("html", self.startTagHtml),
+ ("body", self.startTagBody),
+ ("frameset", self.startTagFrameset),
+ (("base", "link", "meta", "script", "style", "title"),
+ self.startTagFromHead)
+ ])
+ self.startTagHandler.default = self.startTagOther
+
+ def processEOF(self):
+ self.anythingElse()
+ self.parser.phase.processEOF()
+
+ def processCharacters(self, data):
+ self.anythingElse()
+ self.parser.phase.processCharacters(data)
+
+ def startTagBody(self, name, attributes):
+ self.tree.insertElement(name, attributes)
+ self.parser.phase = self.parser.phases["inBody"]
+
+ def startTagFrameset(self, name, attributes):
+ self.tree.insertElement(name, attributes)
+ self.parser.phase = self.parser.phases["inFrameset"]
+
+ def startTagFromHead(self, name, attributes):
+ self.parser.parseError(_(u"Unexpected start tag (%s) that can be in head. Moved.") % (name,))
+ self.parser.phase = self.parser.phases["inHead"]
+ self.parser.phase.processStartTag(name, attributes)
+
+ def startTagOther(self, name, attributes):
+ self.anythingElse()
+ self.parser.phase.processStartTag(name, attributes)
+
+ def processEndTag(self, name):
+ self.anythingElse()
+ self.parser.phase.processEndTag(name)
+
+ def anythingElse(self):
+ self.tree.insertElement("body", {})
+ self.parser.phase = self.parser.phases["inBody"]
+
+
+class InBodyPhase(Phase):
+ # http://www.whatwg.org/specs/web-apps/current-work/#in-body
+ # the crazy mode
+ def __init__(self, parser, tree):
+ Phase.__init__(self, parser, tree)
+
+ #Keep a ref to this for special handling of whitespace in <pre>
+ self.processSpaceCharactersNonPre = self.processSpaceCharacters
+
+ self.startTagHandler = utils.MethodDispatcher([
+ ("html", self.startTagHtml),
+ (("base", "link", "meta", "script", "style"),
+ self.startTagProcessInHead),
+ ("title", self.startTagTitle),
+ ("body", self.startTagBody),
+ (("address", "blockquote", "center", "dir", "div", "dl",
+ "fieldset", "listing", "menu", "ol", "p", "pre", "ul"),
+ self.startTagCloseP),
+ ("form", self.startTagForm),
+ (("li", "dd", "dt"), self.startTagListItem),
+ ("plaintext",self.startTagPlaintext),
+ (headingElements, self.startTagHeading),
+ ("a", self.startTagA),
+ (("b", "big", "em", "font", "i", "s", "small", "strike", "strong",
+ "tt", "u"),self.startTagFormatting),
+ ("nobr", self.startTagNobr),
+ ("button", self.startTagButton),
+ (("marquee", "object"), self.startTagMarqueeObject),
+ ("xmp", self.startTagXmp),
+ ("table", self.startTagTable),
+ (("area", "basefont", "bgsound", "br", "embed", "img", "param",
+ "spacer", "wbr"), self.startTagVoidFormatting),
+ ("hr", self.startTagHr),
+ ("image", self.startTagImage),
+ ("input", self.startTagInput),
+ ("isindex", self.startTagIsIndex),
+ ("textarea", self.startTagTextarea),
+ (("iframe", "noembed", "noframes", "noscript"), self.startTagCdata),
+ ("select", self.startTagSelect),
+ (("caption", "col", "colgroup", "frame", "frameset", "head",
+ "option", "optgroup", "tbody", "td", "tfoot", "th", "thead",
+ "tr"), self.startTagMisplaced),
+ (("event-source", "section", "nav", "article", "aside", "header",
+ "footer", "datagrid", "command"), self.startTagNew)
+ ])
+ self.startTagHandler.default = self.startTagOther
+
+ self.endTagHandler = utils.MethodDispatcher([
+ ("p",self.endTagP),
+ ("body",self.endTagBody),
+ ("html",self.endTagHtml),
+ (("address", "blockquote", "center", "div", "dl", "fieldset",
+ "listing", "menu", "ol", "pre", "ul"), self.endTagBlock),
+ ("form", self.endTagForm),
+ (("dd", "dt", "li"), self.endTagListItem),
+ (headingElements, self.endTagHeading),
+ (("a", "b", "big", "em", "font", "i", "nobr", "s", "small",
+ "strike", "strong", "tt", "u"), self.endTagFormatting),
+ (("marquee", "object", "button"), self.endTagButtonMarqueeObject),
+ (("head", "frameset", "select", "optgroup", "option", "table",
+ "caption", "colgroup", "col", "thead", "tfoot", "tbody", "tr",
+ "td", "th"), self.endTagMisplaced),
+ ("br", self.endTagBr),
+ (("area", "basefont", "bgsound", "embed", "hr", "image",
+ "img", "input", "isindex", "param", "spacer", "wbr", "frame"),
+ self.endTagNone),
+ (("noframes", "noscript", "noembed", "textarea", "xmp", "iframe"),
+ self.endTagCdataTextAreaXmp),
+ (("event-source", "section", "nav", "article", "aside", "header",
+ "footer", "datagrid", "command"), self.endTagNew)
+ ])
+ self.endTagHandler.default = self.endTagOther
+
+ # helper
+ def addFormattingElement(self, name, attributes):
+ self.tree.insertElement(name, attributes)
+ self.tree.activeFormattingElements.append(
+ self.tree.openElements[-1])
+
+ # the real deal
+ def processSpaceCharactersDropNewline(self, data):
+ # Sometimes (start of <pre> and <textarea> blocks) we want to drop
+ # leading newlines
+ self.processSpaceCharacters = self.processSpaceCharactersNonPre
+ if (data.startswith("\n") and
+ self.tree.openElements[-1].name in ("pre", "textarea") and
+ not self.tree.openElements[-1].hasContent()):
+ data = data[1:]
+ if data:
+ self.tree.reconstructActiveFormattingElements()
+ self.tree.insertText(data)
+
+ def processCharacters(self, data):
+ # XXX The specification says to do this for every character at the
+ # moment, but apparently that doesn't match the real world so we don't
+ # do it for space characters.
+ self.tree.reconstructActiveFormattingElements()
+ self.tree.insertText(data)
+
+ #This matches the current spec but may not match the real world
+ def processSpaceCharacters(self, data):
+ self.tree.reconstructActiveFormattingElements()
+ self.tree.insertText(data)
+
+ def startTagProcessInHead(self, name, attributes):
+ self.parser.phases["inHead"].processStartTag(name, attributes)
+
+ def startTagTitle(self, name, attributes):
+ self.parser.parseError(_(u"Unexpected start tag (%s) that belongs in the head. Moved.") % (name,))
+ self.parser.phases["inHead"].processStartTag(name, attributes)
+
+ def startTagBody(self, name, attributes):
+ self.parser.parseError(_(u"Unexpected start tag (body)."))
+ if (len(self.tree.openElements) == 1
+ or self.tree.openElements[1].name != "body"):
+ assert self.parser.innerHTML
+ else:
+ for attr, value in attributes.iteritems():
+ if attr not in self.tree.openElements[1].attributes:
+ self.tree.openElements[1].attributes[attr] = value
+
+ def startTagCloseP(self, name, attributes):
+ if self.tree.elementInScope("p"):
+ self.endTagP("p")
+ self.tree.insertElement(name, attributes)
+ if name == "pre":
+ self.processSpaceCharacters = self.processSpaceCharactersDropNewline
+
+ def startTagForm(self, name, attributes):
+ if self.tree.formPointer:
+ self.parser.parseError("Unexpected start tag (form). Ignored.")
+ else:
+ if self.tree.elementInScope("p"):
+ self.endTagP("p")
+ self.tree.insertElement(name, attributes)
+ self.tree.formPointer = self.tree.openElements[-1]
+
+ def startTagListItem(self, name, attributes):
+ if self.tree.elementInScope("p"):
+ self.endTagP("p")
+ stopNames = {"li":("li"), "dd":("dd", "dt"), "dt":("dd", "dt")}
+ stopName = stopNames[name]
+ # AT Use reversed in Python 2.4...
+ for i, node in enumerate(self.tree.openElements[::-1]):
+ if node.name in stopName:
+ poppedNodes = []
+ for j in range(i+1):
+ poppedNodes.append(self.tree.openElements.pop())
+ if i >= 1:
+ self.parser.parseError(
+ (i == 1 and _(u"Missing end tag (%s)") or _(u"Missing end tags (%s)"))
+ % u", ".join([item.name for item in poppedNodes[:-1]]))
+ break
+
+
+ # Phrasing elements are all non special, non scoping, non
+ # formatting elements
+ if (node.name in (specialElements | scopingElements)
+ and node.name not in ("address", "div")):
+ break
+ # Always insert an <li> element.
+ self.tree.insertElement(name, attributes)
+
+ def startTagPlaintext(self, name, attributes):
+ if self.tree.elementInScope("p"):
+ self.endTagP("p")
+ self.tree.insertElement(name, attributes)
+ self.parser.tokenizer.contentModelFlag = contentModelFlags["PLAINTEXT"]
+
+ def startTagHeading(self, name, attributes):
+ if self.tree.elementInScope("p"):
+ self.endTagP("p")
+ # Uncomment the following for IE7 behavior:
+ #
+ #for item in headingElements:
+ # if self.tree.elementInScope(item):
+ # self.parser.parseError(_(u"Unexpected start tag (" + name +\
+ # ")."))
+ # item = self.tree.openElements.pop()
+ # while item.name not in headingElements:
+ # item = self.tree.openElements.pop()
+ # break
+ self.tree.insertElement(name, attributes)
+
+ def startTagA(self, name, attributes):
+ afeAElement = self.tree.elementInActiveFormattingElements("a")
+ if afeAElement:
+ self.parser.parseError(_(u"Unexpected start tag (%s) implies "
+ u"end tag (%s).") % (u'a', u'a'))
+ self.endTagFormatting("a")
+ if afeAElement in self.tree.openElements:
+ self.tree.openElements.remove(afeAElement)
+ if afeAElement in self.tree.activeFormattingElements:
+ self.tree.activeFormattingElements.remove(afeAElement)
+ self.tree.reconstructActiveFormattingElements()
+ self.addFormattingElement(name, attributes)
+
+ def startTagFormatting(self, name, attributes):
+ self.tree.reconstructActiveFormattingElements()
+ self.addFormattingElement(name, attributes)
+
+ def startTagNobr(self, name, attributes):
+ self.tree.reconstructActiveFormattingElements()
+ if self.tree.elementInScope("nobr"):
+ self.parser.parseError(_(u"Unexpected start tag (%s) implies "
+ u"end tag (%s).") % (u'nobr', u'nobr'))
+ self.processEndTag("nobr")
+ # XXX Need tests that trigger the following
+ self.tree.reconstructActiveFormattingElements()
+ self.addFormattingElement(name, attributes)
+
+ def startTagButton(self, name, attributes):
+ if self.tree.elementInScope("button"):
+ self.parser.parseError(_(u"Unexpected start tag (%s) implied "
+ u"end tag (%s).") % (u'button', u'button'))
+ self.processEndTag("button")
+ self.parser.phase.processStartTag(name, attributes)
+ else:
+ self.tree.reconstructActiveFormattingElements()
+ self.tree.insertElement(name, attributes)
+ self.tree.activeFormattingElements.append(Marker)
+
+ def startTagMarqueeObject(self, name, attributes):
+ self.tree.reconstructActiveFormattingElements()
+ self.tree.insertElement(name, attributes)
+ self.tree.activeFormattingElements.append(Marker)
+
+ def startTagXmp(self, name, attributes):
+ self.tree.reconstructActiveFormattingElements()
+ self.tree.insertElement(name, attributes)
+ self.parser.tokenizer.contentModelFlag = contentModelFlags["CDATA"]
+
+ def startTagTable(self, name, attributes):
+ if self.tree.elementInScope("p"):
+ self.processEndTag("p")
+ self.tree.insertElement(name, attributes)
+ self.parser.phase = self.parser.phases["inTable"]
+
+ def startTagVoidFormatting(self, name, attributes):
+ self.tree.reconstructActiveFormattingElements()
+ self.tree.insertElement(name, attributes)
+ self.tree.openElements.pop()
+
+ def startTagHr(self, name, attributes):
+ if self.tree.elementInScope("p"):
+ self.endTagP("p")
+ self.tree.insertElement(name, attributes)
+ self.tree.openElements.pop()
+
+ def startTagImage(self, name, attributes):
+ # No really...
+ self.parser.parseError(_(u"Unexpected start tag (image). Treated "
+ u"as img."))
+ self.processStartTag("img", attributes)
+
+ def startTagInput(self, name, attributes):
+ self.tree.reconstructActiveFormattingElements()
+ self.tree.insertElement(name, attributes)
+ if self.tree.formPointer:
+ # XXX Not exactly sure what to do here
+ self.tree.openElements[-1].form = self.tree.formPointer
+ self.tree.openElements.pop()
+
+ def startTagIsIndex(self, name, attributes):
+ self.parser.parseError("Unexpected start tag isindex. Don't use it!")
+ if self.tree.formPointer:
+ return
+ self.processStartTag("form", {})
+ self.processStartTag("hr", {})
+ self.processStartTag("p", {})
+ self.processStartTag("label", {})
+ # XXX Localization ...
+ self.processCharacters(
+ "This is a searchable index. Insert your search keywords here: ")
+ attributes["name"] = "isindex"
+ attrs = [[key,value] for key,value in attributes.iteritems()]
+ self.processStartTag("input", dict(attrs))
+ self.processEndTag("label")
+ self.processEndTag("p")
+ self.processStartTag("hr", {})
+ self.processEndTag("form")
+
+ def startTagTextarea(self, name, attributes):
+ # XXX Form element pointer checking here as well...
+ self.tree.insertElement(name, attributes)
+ self.parser.tokenizer.contentModelFlag = contentModelFlags["RCDATA"]
+ self.processSpaceCharacters = self.processSpaceCharactersDropNewline
+
+ def startTagCdata(self, name, attributes):
+ """iframe, noembed noframes, noscript(if scripting enabled)"""
+ self.tree.insertElement(name, attributes)
+ self.parser.tokenizer.contentModelFlag = contentModelFlags["CDATA"]
+
+ def startTagSelect(self, name, attributes):
+ self.tree.reconstructActiveFormattingElements()
+ self.tree.insertElement(name, attributes)
+ self.parser.phase = self.parser.phases["inSelect"]
+
+ def startTagMisplaced(self, name, attributes):
+ """ Elements that should be children of other elements that have a
+ different insertion mode; here they are ignored
+ "caption", "col", "colgroup", "frame", "frameset", "head",
+ "option", "optgroup", "tbody", "td", "tfoot", "th", "thead",
+ "tr", "noscript"
+ """
+ self.parser.parseError(_(u"Unexpected start tag (%s). Ignored.") % (name,))
+
+ def startTagNew(self, name, attributes):
+ """New HTML5 elements, "event-source", "section", "nav",
+ "article", "aside", "header", "footer", "datagrid", "command"
+ """
+ sys.stderr.write("Warning: Undefined behaviour for start tag %s"%name)
+ self.startTagOther(name, attributes)
+ #raise NotImplementedError
+
+ def startTagOther(self, name, attributes):
+ self.tree.reconstructActiveFormattingElements()
+ self.tree.insertElement(name, attributes)
+
+ def endTagP(self, name):
+ if self.tree.elementInScope("p"):
+ self.tree.generateImpliedEndTags("p")
+ if self.tree.openElements[-1].name != "p":
+ self.parser.parseError(_(u"Unexpected end tag (%s).") % (u'p',))
+ if self.tree.elementInScope("p"):
+ while self.tree.elementInScope("p"):
+ self.tree.openElements.pop()
+ else:
+ self.startTagCloseP("p", {})
+ self.endTagP("p")
+
+ def endTagBody(self, name):
+ # XXX Need to take open <p> tags into account here. We shouldn't imply
+ # </p> but we should not throw a parse error either. Specification is
+ # likely to be updated.
+ if self.tree.openElements[1].name != "body":
+ # innerHTML case
+ self.parser.parseError()
+ return
+ if self.tree.openElements[-1].name != "body":
+ self.parser.parseError(_(u"Unexpected end tag (%s). Missing "
+ u"end tag (%s).") % (u'body', self.tree.openElements[-1].name))
+ self.parser.phase = self.parser.phases["afterBody"]
+
+ def endTagHtml(self, name):
+ self.endTagBody(name)
+ if not self.parser.innerHTML:
+ self.parser.phase.processEndTag(name)
+
+ def endTagBlock(self, name):
+ #Put us back in the right whitespace handling mode
+ if name == "pre":
+ self.processSpaceCharacters = self.processSpaceCharactersNonPre
+ inScope = self.tree.elementInScope(name)
+ if inScope:
+ self.tree.generateImpliedEndTags()
+ if self.tree.openElements[-1].name != name:
+ self.parser.parseError(_(u"End tag (%s) seen too "
+ u"early. Expected other end tag.") % (name,))
+ if inScope:
+ node = self.tree.openElements.pop()
+ while node.name != name:
+ node = self.tree.openElements.pop()
+
+ def endTagForm(self, name):
+ if self.tree.elementInScope(name):
+ self.tree.generateImpliedEndTags()
+ if self.tree.openElements[-1].name != name:
+ self.parser.parseError(_(u"End tag (form) seen too early. Ignored."))
+ else:
+ self.tree.openElements.pop()
+ self.tree.formPointer = None
+
+ def endTagListItem(self, name):
+ # AT Could merge this with the Block case
+ if self.tree.elementInScope(name):
+ self.tree.generateImpliedEndTags(name)
+
+ if self.tree.openElements[-1].name != name:
+ self.parser.parseError(_(u"End tag (%s) seen too "
+ u"early. Expected other end tag.") % (name,))
+
+ if self.tree.elementInScope(name):
+ node = self.tree.openElements.pop()
+ while node.name != name:
+ node = self.tree.openElements.pop()
+
+ def endTagHeading(self, name):
+ for item in headingElements:
+ if self.tree.elementInScope(item):
+ self.tree.generateImpliedEndTags()
+ break
+ if self.tree.openElements[-1].name != name:
+ self.parser.parseError(_(u"Unexpected end tag (%s). "
+ u"Expected other end tag.") % (name,))
+
+ for item in headingElements:
+ if self.tree.elementInScope(item):
+ item = self.tree.openElements.pop()
+ while item.name not in headingElements:
+ item = self.tree.openElements.pop()
+ break
+
+ def endTagFormatting(self, name):
+ """The much-feared adoption agency algorithm
+ """
+ # http://www.whatwg.org/specs/web-apps/current-work/#adoptionAgency
+ # XXX Better parseError messages appreciated.
+ while True:
+ # Step 1 paragraph 1
+ afeElement = self.tree.elementInActiveFormattingElements(name)
+ if not afeElement or (afeElement in self.tree.openElements and
+ not self.tree.elementInScope(afeElement.name)):
+ self.parser.parseError(_(u"End tag (%s) violates "
+ u" step 1, paragraph 1 of the adoption agency algorithm.") % (name,))
+ return
+
+ # Step 1 paragraph 2
+ elif afeElement not in self.tree.openElements:
+ self.parser.parseError(_(u"End tag (%s) violates "
+ u" step 1, paragraph 2 of the adoption agency algorithm.") % (name,))
+ self.tree.activeFormattingElements.remove(afeElement)
+ return
+
+ # Step 1 paragraph 3
+ if afeElement != self.tree.openElements[-1]:
+ self.parser.parseError(_(u"End tag (%s) violates "
+ u" step 1, paragraph 3 of the adoption agency algorithm.") % (name,))
+
+ # Step 2
+ # Start of the adoption agency algorithm proper
+ afeIndex = self.tree.openElements.index(afeElement)
+ furthestBlock = None
+ for element in self.tree.openElements[afeIndex:]:
+ if element.name in specialElements | scopingElements:
+ furthestBlock = element
+ break
+
+ # Step 3
+ if furthestBlock is None:
+ element = self.tree.openElements.pop()
+ while element != afeElement:
+ element = self.tree.openElements.pop()
+ self.tree.activeFormattingElements.remove(element)
+ return
+ commonAncestor = self.tree.openElements[afeIndex-1]
+
+ # Step 5
+ if furthestBlock.parent:
+ furthestBlock.parent.removeChild(furthestBlock)
+
+ # Step 6
+ # The bookmark is supposed to help us identify where to reinsert
+ # nodes in step 12. We have to ensure that we reinsert nodes after
+ # the node before the active formatting element. Note the bookmark
+ # can move in step 7.4
+ bookmark = self.tree.activeFormattingElements.index(afeElement)
+
+ # Step 7
+ lastNode = node = furthestBlock
+ while True:
+ # AT replace this with a function and recursion?
+ # Node is element before node in open elements
+ node = self.tree.openElements[
+ self.tree.openElements.index(node)-1]
+ while node not in self.tree.activeFormattingElements:
+ tmpNode = node
+ node = self.tree.openElements[
+ self.tree.openElements.index(node)-1]
+ self.tree.openElements.remove(tmpNode)
+ # Step 7.3
+ if node == afeElement:
+ break
+ # Step 7.4
+ if lastNode == furthestBlock:
+ # XXX should this be index(node) or index(node)+1
+ # Anne: I think +1 is ok. Given x = [2,3,4,5]
+ # x.index(3) gives 1 and then x[1 +1] gives 4...
+ bookmark = self.tree.activeFormattingElements.\
+ index(node) + 1
+ # Step 7.5
+ cite = node.parent
+ if node.hasContent():
+ clone = node.cloneNode()
+ # Replace node with clone
+ self.tree.activeFormattingElements[
+ self.tree.activeFormattingElements.index(node)] = clone
+ self.tree.openElements[
+ self.tree.openElements.index(node)] = clone
+ node = clone
+ # Step 7.6
+ # Remove lastNode from its parents, if any
+ if lastNode.parent:
+ lastNode.parent.removeChild(lastNode)
+ node.appendChild(lastNode)
+ # Step 7.7
+ lastNode = node
+ # End of inner loop
+
+ # Step 8
+ if lastNode.parent:
+ lastNode.parent.removeChild(lastNode)
+ commonAncestor.appendChild(lastNode)
+
+ # Step 9
+ clone = afeElement.cloneNode()
+
+ # Step 10
+ furthestBlock.reparentChildren(clone)
+
+ # Step 11
+ furthestBlock.appendChild(clone)
+
+ # Step 12
+ self.tree.activeFormattingElements.remove(afeElement)
+ self.tree.activeFormattingElements.insert(bookmark, clone)
+
+ # Step 13
+ self.tree.openElements.remove(afeElement)
+ self.tree.openElements.insert(
+ self.tree.openElements.index(furthestBlock) + 1, clone)
+
+ def endTagButtonMarqueeObject(self, name):
+ if self.tree.elementInScope(name):
+ self.tree.generateImpliedEndTags()
+ if self.tree.openElements[-1].name != name:
+ self.parser.parseError(_(u"Unexpected end tag (%s). Expected other end tag first.") % (name,))
+
+ if self.tree.elementInScope(name):
+ element = self.tree.openElements.pop()
+ while element.name != name:
+ element = self.tree.openElements.pop()
+ self.tree.clearActiveFormattingElements()
+
+ def endTagMisplaced(self, name):
+ # This handles elements with end tags in other insertion modes.
+ self.parser.parseError(_(u"Unexpected end tag (%s). Ignored.") % (name,))
+
+ def endTagBr(self, name):
+ self.parser.parseError(_(u"Unexpected end tag (br). Treated as br element."))
+ self.tree.reconstructActiveFormattingElements()
+ self.tree.insertElement(name, {})
+ self.tree.openElements.pop()
+
+ def endTagNone(self, name):
+ # This handles elements with no end tag.
+ self.parser.parseError(_(u"This tag (%s) has no end tag") % (name,))
+
+ def endTagCdataTextAreaXmp(self, name):
+ if self.tree.openElements[-1].name == name:
+ self.tree.openElements.pop()
+ else:
+ self.parser.parseError(_(u"Unexpected end tag (%s). Ignored.") % (name,))
+
+ def endTagNew(self, name):
+ """New HTML5 elements, "event-source", "section", "nav",
+ "article", "aside", "header", "footer", "datagrid", "command"
+ """
+ sys.stderr.write("Warning: Undefined behaviour for end tag %s"%name)
+ self.endTagOther(name)
+ #raise NotImplementedError
+
+ def endTagOther(self, name):
+ # XXX This logic should be moved into the treebuilder
+ # AT should use reversed instead of [::-1] when Python 2.4 == True.
+ for node in self.tree.openElements[::-1]:
+ if node.name == name:
+ self.tree.generateImpliedEndTags()
+ if self.tree.openElements[-1].name != name:
+ self.parser.parseError(_(u"Unexpected end tag (%s).") % (name,))
+ while self.tree.openElements.pop() != node:
+ pass
+ break
+ else:
+ if node.name in specialElements | scopingElements:
+ self.parser.parseError(_(u"Unexpected end tag (%s). Ignored.") % (name,))
+ break
+
+class InTablePhase(Phase):
+ # http://www.whatwg.org/specs/web-apps/current-work/#in-table
+ def __init__(self, parser, tree):
+ Phase.__init__(self, parser, tree)
+ self.startTagHandler = utils.MethodDispatcher([
+ ("html", self.startTagHtml),
+ ("caption", self.startTagCaption),
+ ("colgroup", self.startTagColgroup),
+ ("col", self.startTagCol),
+ (("tbody", "tfoot", "thead"), self.startTagRowGroup),
+ (("td", "th", "tr"), self.startTagImplyTbody),
+ ("table", self.startTagTable)
+ ])
+ self.startTagHandler.default = self.startTagOther
+
+ self.endTagHandler = utils.MethodDispatcher([
+ ("table", self.endTagTable),
+ (("body", "caption", "col", "colgroup", "html", "tbody", "td",
+ "tfoot", "th", "thead", "tr"), self.endTagIgnore)
+ ])
+ self.endTagHandler.default = self.endTagOther
+
+ # helper methods
+ def clearStackToTableContext(self):
+ # "clear the stack back to a table context"
+ while self.tree.openElements[-1].name not in ("table", "html"):
+ self.parser.parseError(_(u"Unexpected implied end tag (%s) in the table phase.") % (self.tree.openElements[-1].name,))
+ self.tree.openElements.pop()
+ # When the current node is <html> it's an innerHTML case
+
+ # processing methods
+ def processCharacters(self, data):
+ self.parser.parseError(_(u"Unexpected non-space characters in "
+ u"table context caused voodoo mode."))
+ # Make all the special element rearranging voodoo kick in
+ self.tree.insertFromTable = True
+ # Process the character in the "in body" mode
+ self.parser.phases["inBody"].processCharacters(data)
+ self.tree.insertFromTable = False
+
+ def startTagCaption(self, name, attributes):
+ self.clearStackToTableContext()
+ self.tree.activeFormattingElements.append(Marker)
+ self.tree.insertElement(name, attributes)
+ self.parser.phase = self.parser.phases["inCaption"]
+
+ def startTagColgroup(self, name, attributes):
+ self.clearStackToTableContext()
+ self.tree.insertElement(name, attributes)
+ self.parser.phase = self.parser.phases["inColumnGroup"]
+
+ def startTagCol(self, name, attributes):
+ self.startTagColgroup("colgroup", {})
+ self.parser.phase.processStartTag(name, attributes)
+
+ def startTagRowGroup(self, name, attributes):
+ self.clearStackToTableContext()
+ self.tree.insertElement(name, attributes)
+ self.parser.phase = self.parser.phases["inTableBody"]
+
+ def startTagImplyTbody(self, name, attributes):
+ self.startTagRowGroup("tbody", {})
+ self.parser.phase.processStartTag(name, attributes)
+
+ def startTagTable(self, name, attributes):
+ self.parser.parseError(_(u"Unexpected start tag (table) in table "
+ u"phase. Implies end tag (table)."))
+ self.parser.phase.processEndTag("table")
+ if not self.parser.innerHTML:
+ self.parser.phase.processStartTag(name, attributes)
+
+ def startTagOther(self, name, attributes):
+ self.parser.parseError(_(u"Unexpected start tag (%s) in "
+ u"table context caused voodoo mode.") % (name,))
+ # Make all the special element rearranging voodoo kick in
+ self.tree.insertFromTable = True
+ # Process the start tag in the "in body" mode
+ self.parser.phases["inBody"].processStartTag(name, attributes)
+ self.tree.insertFromTable = False
+
+ def endTagTable(self, name):
+ if self.tree.elementInScope("table", True):
+ self.tree.generateImpliedEndTags()
+ if self.tree.openElements[-1].name != "table":
+ self.parser.parseError(_(u"Unexpected end tag (table). "
+ u"Expected end tag (%s).") % (self.tree.openElements[-1].name,))
+ while self.tree.openElements[-1].name != "table":
+ self.tree.openElements.pop()
+ self.tree.openElements.pop()
+ self.parser.resetInsertionMode()
+ else:
+ # innerHTML case
+ assert self.parser.innerHTML
+ self.parser.parseError()
+
+ def endTagIgnore(self, name):
+ self.parser.parseError(_(u"Unexpected end tag (%s). Ignored.") % (name,))
+
+ def endTagOther(self, name):
+ self.parser.parseError(_(u"Unexpected end tag (%s) in "
+ u"table context caused voodoo mode.") % (name,))
+ # Make all the special element rearranging voodoo kick in
+ self.tree.insertFromTable = True
+ # Process the end tag in the "in body" mode
+ self.parser.phases["inBody"].processEndTag(name)
+ self.tree.insertFromTable = False
+
+
+class InCaptionPhase(Phase):
+ # http://www.whatwg.org/specs/web-apps/current-work/#in-caption
+ def __init__(self, parser, tree):
+ Phase.__init__(self, parser, tree)
+
+ self.startTagHandler = utils.MethodDispatcher([
+ ("html", self.startTagHtml),
+ (("caption", "col", "colgroup", "tbody", "td", "tfoot", "th",
+ "thead", "tr"), self.startTagTableElement)
+ ])
+ self.startTagHandler.default = self.startTagOther
+
+ self.endTagHandler = utils.MethodDispatcher([
+ ("caption", self.endTagCaption),
+ ("table", self.endTagTable),
+ (("body", "col", "colgroup", "html", "tbody", "td", "tfoot", "th",
+ "thead", "tr"), self.endTagIgnore)
+ ])
+ self.endTagHandler.default = self.endTagOther
+
+ def ignoreEndTagCaption(self):
+ return not self.tree.elementInScope("caption", True)
+
+ def processCharacters(self, data):
+ self.parser.phases["inBody"].processCharacters(data)
+
+ def startTagTableElement(self, name, attributes):
+ self.parser.parseError()
+ #XXX Have to duplicate logic here to find out if the tag is ignored
+ ignoreEndTag = self.ignoreEndTagCaption()
+ self.parser.phase.processEndTag("caption")
+ if not ignoreEndTag:
+ self.parser.phase.processStartTag(name, attributes)
+
+ def startTagOther(self, name, attributes):
+ self.parser.phases["inBody"].processStartTag(name, attributes)
+
+ def endTagCaption(self, name):
+ if not self.ignoreEndTagCaption():
+ # AT this code is quite similar to endTagTable in "InTable"
+ self.tree.generateImpliedEndTags()
+ if self.tree.openElements[-1].name != "caption":
+ self.parser.parseError(_(u"Unexpected end tag (caption). "
+ u"Missing end tags."))
+ while self.tree.openElements[-1].name != "caption":
+ self.tree.openElements.pop()
+ self.tree.openElements.pop()
+ self.tree.clearActiveFormattingElements()
+ self.parser.phase = self.parser.phases["inTable"]
+ else:
+ # innerHTML case
+ assert self.parser.innerHTML
+ self.parser.parseError()
+
+ def endTagTable(self, name):
+ self.parser.parseError()
+ ignoreEndTag = self.ignoreEndTagCaption()
+ self.parser.phase.processEndTag("caption")
+ if not ignoreEndTag:
+ self.parser.phase.processEndTag(name)
+
+ def endTagIgnore(self, name):
+ self.parser.parseError(_(u"Unexpected end tag (%s). Ignored.") % (name,))
+
+ def endTagOther(self, name):
+ self.parser.phases["inBody"].processEndTag(name)
+
+
+class InColumnGroupPhase(Phase):
+ # http://www.whatwg.org/specs/web-apps/current-work/#in-column
+
+ def __init__(self, parser, tree):
+ Phase.__init__(self, parser, tree)
+
+ self.startTagHandler = utils.MethodDispatcher([
+ ("html", self.startTagHtml),
+ ("col", self.startTagCol)
+ ])
+ self.startTagHandler.default = self.startTagOther
+
+ self.endTagHandler = utils.MethodDispatcher([
+ ("colgroup", self.endTagColgroup),
+ ("col", self.endTagCol)
+ ])
+ self.endTagHandler.default = self.endTagOther
+
+ def ignoreEndTagColgroup(self):
+ return self.tree.openElements[-1].name == "html"
+
+ def processCharacters(self, data):
+ ignoreEndTag = self.ignoreEndTagColgroup()
+ self.endTagColgroup("colgroup")
+ if not ignoreEndTag:
+ self.parser.phase.processCharacters(data)
+
+ def startTagCol(self, name ,attributes):
+ self.tree.insertElement(name, attributes)
+ self.tree.openElements.pop()
+
+ def startTagOther(self, name, attributes):
+ ignoreEndTag = self.ignoreEndTagColgroup()
+ self.endTagColgroup("colgroup")
+ if not ignoreEndTag:
+ self.parser.phase.processStartTag(name, attributes)
+
+ def endTagColgroup(self, name):
+ if self.ignoreEndTagColgroup():
+ # innerHTML case
+ assert self.parser.innerHTML
+ self.parser.parseError()
+ else:
+ self.tree.openElements.pop()
+ self.parser.phase = self.parser.phases["inTable"]
+
+ def endTagCol(self, name):
+ self.parser.parseError(_(u"Unexpected end tag (col). "
+ u"col has no end tag."))
+
+ def endTagOther(self, name):
+ ignoreEndTag = self.ignoreEndTagColgroup()
+ self.endTagColgroup("colgroup")
+ if not ignoreEndTag:
+ self.parser.phase.processEndTag(name)
+
+
+class InTableBodyPhase(Phase):
+ # http://www.whatwg.org/specs/web-apps/current-work/#in-table0
+ def __init__(self, parser, tree):
+ Phase.__init__(self, parser, tree)
+ self.startTagHandler = utils.MethodDispatcher([
+ ("html", self.startTagHtml),
+ ("tr", self.startTagTr),
+ (("td", "th"), self.startTagTableCell),
+ (("caption", "col", "colgroup", "tbody", "tfoot", "thead"), self.startTagTableOther)
+ ])
+ self.startTagHandler.default = self.startTagOther
+
+ self.endTagHandler = utils.MethodDispatcher([
+ (("tbody", "tfoot", "thead"), self.endTagTableRowGroup),
+ ("table", self.endTagTable),
+ (("body", "caption", "col", "colgroup", "html", "td", "th",
+ "tr"), self.endTagIgnore)
+ ])
+ self.endTagHandler.default = self.endTagOther
+
+ # helper methods
+ def clearStackToTableBodyContext(self):
+ while self.tree.openElements[-1].name not in ("tbody", "tfoot",
+ "thead", "html"):
+ self.parser.parseError(_(u"Unexpected implied end tag (%s) in the table body phase.") % (self.tree.openElements[-1].name,))
+ self.tree.openElements.pop()
+
+ # the rest
+ def processCharacters(self,data):
+ self.parser.phases["inTable"].processCharacters(data)
+
+ def startTagTr(self, name, attributes):
+ self.clearStackToTableBodyContext()
+ self.tree.insertElement(name, attributes)
+ self.parser.phase = self.parser.phases["inRow"]
+
+ def startTagTableCell(self, name, attributes):
+ self.parser.parseError(_(u"Unexpected table cell start tag (%s) in the table body phase.") % (name,))
+ self.startTagTr("tr", {})
+ self.parser.phase.processStartTag(name, attributes)
+
+ def startTagTableOther(self, name, attributes):
+ # XXX AT Any ideas on how to share this with endTagTable?
+ if (self.tree.elementInScope("tbody", True) or
+ self.tree.elementInScope("thead", True) or
+ self.tree.elementInScope("tfoot", True)):
+ self.clearStackToTableBodyContext()
+ self.endTagTableRowGroup(self.tree.openElements[-1].name)
+ self.parser.phase.processStartTag(name, attributes)
+ else:
+ # innerHTML case
+ self.parser.parseError()
+
+ def startTagOther(self, name, attributes):
+ self.parser.phases["inTable"].processStartTag(name, attributes)
+
+ def endTagTableRowGroup(self, name):
+ if self.tree.elementInScope(name, True):
+ self.clearStackToTableBodyContext()
+ self.tree.openElements.pop()
+ self.parser.phase = self.parser.phases["inTable"]
+ else:
+ self.parser.parseError(_(u"Unexpected end tag (%s) in the table body phase. Ignored.") % (name,))
+
+ def endTagTable(self, name):
+ if (self.tree.elementInScope("tbody", True) or
+ self.tree.elementInScope("thead", True) or
+ self.tree.elementInScope("tfoot", True)):
+ self.clearStackToTableBodyContext()
+ self.endTagTableRowGroup(self.tree.openElements[-1].name)
+ self.parser.phase.processEndTag(name)
+ else:
+ # innerHTML case
+ self.parser.parseError()
+
+ def endTagIgnore(self, name):
+ self.parser.parseError(_(u"Unexpected end tag (%s) in the table body phase. Ignored.") % (name,))
+
+ def endTagOther(self, name):
+ self.parser.phases["inTable"].processEndTag(name)
+
+
+class InRowPhase(Phase):
+ # http://www.whatwg.org/specs/web-apps/current-work/#in-row
+ def __init__(self, parser, tree):
+ Phase.__init__(self, parser, tree)
+ self.startTagHandler = utils.MethodDispatcher([
+ ("html", self.startTagHtml),
+ (("td", "th"), self.startTagTableCell),
+ (("caption", "col", "colgroup", "tbody", "tfoot", "thead",
+ "tr"), self.startTagTableOther)
+ ])
+ self.startTagHandler.default = self.startTagOther
+
+ self.endTagHandler = utils.MethodDispatcher([
+ ("tr", self.endTagTr),
+ ("table", self.endTagTable),
+ (("tbody", "tfoot", "thead"), self.endTagTableRowGroup),
+ (("body", "caption", "col", "colgroup", "html", "td", "th"),
+ self.endTagIgnore)
+ ])
+ self.endTagHandler.default = self.endTagOther
+
+ # helper methods (XXX unify this with other table helper methods)
+ def clearStackToTableRowContext(self):
+ while self.tree.openElements[-1].name not in ("tr", "html"):
+ self.parser.parseError(_(u"Unexpected implied end tag (%s) in the row phase.") % (self.tree.openElements[-1].name,))
+ self.tree.openElements.pop()
+
+ def ignoreEndTagTr(self):
+ return not self.tree.elementInScope("tr", tableVariant=True)
+
+ # the rest
+ def processCharacters(self, data):
+ self.parser.phases["inTable"].processCharacters(data)
+
+ def startTagTableCell(self, name, attributes):
+ self.clearStackToTableRowContext()
+ self.tree.insertElement(name, attributes)
+ self.parser.phase = self.parser.phases["inCell"]
+ self.tree.activeFormattingElements.append(Marker)
+
+ def startTagTableOther(self, name, attributes):
+ ignoreEndTag = self.ignoreEndTagTr()
+ self.endTagTr("tr")
+ # XXX how are we sure it's always ignored in the innerHTML case?
+ if not ignoreEndTag:
+ self.parser.phase.processStartTag(name, attributes)
+
+ def startTagOther(self, name, attributes):
+ self.parser.phases["inTable"].processStartTag(name, attributes)
+
+ def endTagTr(self, name):
+ if not self.ignoreEndTagTr():
+ self.clearStackToTableRowContext()
+ self.tree.openElements.pop()
+ self.parser.phase = self.parser.phases["inTableBody"]
+ else:
+ # innerHTML case
+ assert self.parser.innerHTML
+ self.parser.parseError()
+
+ def endTagTable(self, name):
+ ignoreEndTag = self.ignoreEndTagTr()
+ self.endTagTr("tr")
+ # Reprocess the current tag if the tr end tag was not ignored
+ # XXX how are we sure it's always ignored in the innerHTML case?
+ if not ignoreEndTag:
+ self.parser.phase.processEndTag(name)
+
+ def endTagTableRowGroup(self, name):
+ if self.tree.elementInScope(name, True):
+ self.endTagTr("tr")
+ self.parser.phase.processEndTag(name)
+ else:
+ # innerHTML case
+ self.parser.parseError()
+
+ def endTagIgnore(self, name):
+ self.parser.parseError(_(u"Unexpected end tag (%s) in the row phase. Ignored.") % (name,))
+
+ def endTagOther(self, name):
+ self.parser.phases["inTable"].processEndTag(name)
+
+class InCellPhase(Phase):
+ # http://www.whatwg.org/specs/web-apps/current-work/#in-cell
+ def __init__(self, parser, tree):
+ Phase.__init__(self, parser, tree)
+ self.startTagHandler = utils.MethodDispatcher([
+ ("html", self.startTagHtml),
+ (("caption", "col", "colgroup", "tbody", "td", "tfoot", "th",
+ "thead", "tr"), self.startTagTableOther)
+ ])
+ self.startTagHandler.default = self.startTagOther
+
+ self.endTagHandler = utils.MethodDispatcher([
+ (("td", "th"), self.endTagTableCell),
+ (("body", "caption", "col", "colgroup", "html"), self.endTagIgnore),
+ (("table", "tbody", "tfoot", "thead", "tr"), self.endTagImply)
+ ])
+ self.endTagHandler.default = self.endTagOther
+
+ # helper
+ def closeCell(self):
+ if self.tree.elementInScope("td", True):
+ self.endTagTableCell("td")
+ elif self.tree.elementInScope("th", True):
+ self.endTagTableCell("th")
+
+ # the rest
+ def processCharacters(self, data):
+ self.parser.phases["inBody"].processCharacters(data)
+
+ def startTagTableOther(self, name, attributes):
+ if self.tree.elementInScope("td", True) or \
+ self.tree.elementInScope("th", True):
+ self.closeCell()
+ self.parser.phase.processStartTag(name, attributes)
+ else:
+ # innerHTML case
+ self.parser.parseError()
+
+ def startTagOther(self, name, attributes):
+ self.parser.phases["inBody"].processStartTag(name, attributes)
+ # Optimize this for subsequent invocations. Can't do this initially
+ # because self.phases doesn't really exist at that point.
+ self.startTagHandler.default =\
+ self.parser.phases["inBody"].processStartTag
+
+ def endTagTableCell(self, name):
+ if self.tree.elementInScope(name, True):
+ self.tree.generateImpliedEndTags(name)
+ if self.tree.openElements[-1].name != name:
+ self.parser.parseError("Got table cell end tag (" + name +\
+ ") while required end tags are missing.")
+ while True:
+ node = self.tree.openElements.pop()
+ if node.name == name:
+ break
+ else:
+ self.tree.openElements.pop()
+ self.tree.clearActiveFormattingElements()
+ self.parser.phase = self.parser.phases["inRow"]
+ else:
+ self.parser.parseError(_(u"Unexpected end tag (%s). Ignored.") % (name,))
+
+ def endTagIgnore(self, name):
+ self.parser.parseError(_(u"Unexpected end tag (%s). Ignored.") % (name,))
+
+ def endTagImply(self, name):
+ if self.tree.elementInScope(name, True):
+ self.closeCell()
+ self.parser.phase.processEndTag(name)
+ else:
+ # sometimes innerHTML case
+ self.parser.parseError()
+
+ def endTagOther(self, name):
+ self.parser.phases["inBody"].processEndTag(name)
+ # Optimize this for subsequent invocations. Can't do this initially
+ # because self.phases doesn't really exist at that point.
+ self.endTagHandler.default = self.parser.phases["inBody"].processEndTag
+
+
+class InSelectPhase(Phase):
+ def __init__(self, parser, tree):
+ Phase.__init__(self, parser, tree)
+
+ self.startTagHandler = utils.MethodDispatcher([
+ ("html", self.startTagHtml),
+ ("option", self.startTagOption),
+ ("optgroup", self.startTagOptgroup),
+ ("select", self.startTagSelect)
+ ])
+ self.startTagHandler.default = self.startTagOther
+
+ self.endTagHandler = utils.MethodDispatcher([
+ ("option", self.endTagOption),
+ ("optgroup", self.endTagOptgroup),
+ ("select", self.endTagSelect),
+ (("caption", "table", "tbody", "tfoot", "thead", "tr", "td",
+ "th"), self.endTagTableElements)
+ ])
+ self.endTagHandler.default = self.endTagOther
+
+ # http://www.whatwg.org/specs/web-apps/current-work/#in-select
+ def processCharacters(self, data):
+ self.tree.insertText(data)
+
+ def startTagOption(self, name, attributes):
+ # We need to imply </option> if <option> is the current node.
+ if self.tree.openElements[-1].name == "option":
+ self.tree.openElements.pop()
+ self.tree.insertElement(name, attributes)
+
+ def startTagOptgroup(self, name, attributes):
+ if self.tree.openElements[-1].name == "option":
+ self.tree.openElements.pop()
+ if self.tree.openElements[-1].name == "optgroup":
+ self.tree.openElements.pop()
+ self.tree.insertElement(name, attributes)
+
+ def startTagSelect(self, name, attributes):
+ self.parser.parseError(_(u"Unexpected start tag (select) in the "
+ u"select phase implies select start tag."))
+ self.endTagSelect("select")
+
+ def startTagOther(self, name, attributes):
+ self.parser.parseError(_(u"Unexpected start tag token (%s)"
+ u" in the select phase. Ignored.") % (name,))
+
+ def endTagOption(self, name):
+ if self.tree.openElements[-1].name == "option":
+ self.tree.openElements.pop()
+ else:
+ self.parser.parseError(_(u"Unexpected end tag (%s) in the "
+ u"select phase. Ignored.") % u'option')
+
+ def endTagOptgroup(self, name):
+ # </optgroup> implicitly closes <option>
+ if self.tree.openElements[-1].name == "option" and \
+ self.tree.openElements[-2].name == "optgroup":
+ self.tree.openElements.pop()
+ # It also closes </optgroup>
+ if self.tree.openElements[-1].name == "optgroup":
+ self.tree.openElements.pop()
+ # But nothing else
+ else:
+ self.parser.parseError(_(u"Unexpected end tag (%s) in the "
+ u"select phase. Ignored.") % u'optgroup')
+
+ def endTagSelect(self, name):
+ if self.tree.elementInScope("select", True):
+ node = self.tree.openElements.pop()
+ while node.name != "select":
+ node = self.tree.openElements.pop()
+ self.parser.resetInsertionMode()
+ else:
+ # innerHTML case
+ self.parser.parseError()
+
+ def endTagTableElements(self, name):
+ self.parser.parseError(_(u"Unexpected table end tag (%s)"
+ u" in the select phase.") % (name,))
+ if self.tree.elementInScope(name, True):
+ self.endTagSelect("select")
+ self.parser.phase.processEndTag(name)
+
+ def endTagOther(self, name):
+ self.parser.parseError(_(u"Unexpected end tag token (%s)"
+ u" in the select phase. Ignored.") % (name,))
+
+
+class AfterBodyPhase(Phase):
+ def __init__(self, parser, tree):
+ Phase.__init__(self, parser, tree)
+
+ # XXX We should prolly add a handler for here as well...
+ self.endTagHandler = utils.MethodDispatcher([("html", self.endTagHtml)])
+ self.endTagHandler.default = self.endTagOther
+
+ def processComment(self, data):
+ # This is needed because data is to be appended to the <html> element
+ # here and not to whatever is currently open.
+ self.tree.insertComment(data, self.tree.openElements[0])
+
+ def processCharacters(self, data):
+ self.parser.parseError(_(u"Unexpected non-space characters in the "
+ u"after body phase."))
+ self.parser.phase = self.parser.phases["inBody"]
+ self.parser.phase.processCharacters(data)
+
+ def processStartTag(self, name, attributes):
+ self.parser.parseError(_(u"Unexpected start tag token (%s)"
+ u" in the after body phase.") % (name,))
+ self.parser.phase = self.parser.phases["inBody"]
+ self.parser.phase.processStartTag(name, attributes)
+
+ def endTagHtml(self,name):
+ if self.parser.innerHTML:
+ self.parser.parseError()
+ else:
+ # XXX: This may need to be done, not sure:
+ # Don't set lastPhase to the current phase but to the inBody phase
+ # instead. No need for extra parse errors if there's something
+ # after </html>.
+ # Try "<!doctype html>X</html>X" for instance.
+ self.parser.lastPhase = self.parser.phase
+ self.parser.phase = self.parser.phases["trailingEnd"]
+
+ def endTagOther(self, name):
+ self.parser.parseError(_(u"Unexpected end tag token (%s)"
+ u" in the after body phase.") % (name,))
+ self.parser.phase = self.parser.phases["inBody"]
+ self.parser.phase.processEndTag(name)
+
+class InFramesetPhase(Phase):
+ # http://www.whatwg.org/specs/web-apps/current-work/#in-frameset
+ def __init__(self, parser, tree):
+ Phase.__init__(self, parser, tree)
+
+ self.startTagHandler = utils.MethodDispatcher([
+ ("html", self.startTagHtml),
+ ("frameset", self.startTagFrameset),
+ ("frame", self.startTagFrame),
+ ("noframes", self.startTagNoframes)
+ ])
+ self.startTagHandler.default = self.startTagOther
+
+ self.endTagHandler = utils.MethodDispatcher([
+ ("frameset", self.endTagFrameset),
+ ("noframes", self.endTagNoframes)
+ ])
+ self.endTagHandler.default = self.endTagOther
+
+ def processCharacters(self, data):
+ self.parser.parseError(_(u"Unepxected characters in "
+ u"the frameset phase. Characters ignored."))
+
+ def startTagFrameset(self, name, attributes):
+ self.tree.insertElement(name, attributes)
+
+ def startTagFrame(self, name, attributes):
+ self.tree.insertElement(name, attributes)
+ self.tree.openElements.pop()
+
+ def startTagNoframes(self, name, attributes):
+ self.parser.phases["inBody"].processStartTag(name, attributes)
+
+ def startTagOther(self, name, attributes):
+ self.parser.parseError(_(u"Unexpected start tag token (%s)"
+ u" in the frameset phase. Ignored") % (name,))
+
+ def endTagFrameset(self, name):
+ if self.tree.openElements[-1].name == "html":
+ # innerHTML case
+ self.parser.parseError(_(u"Unexpected end tag token (frameset)"
+ u"in the frameset phase (innerHTML)."))
+ else:
+ self.tree.openElements.pop()
+ if (not self.parser.innerHTML and
+ self.tree.openElements[-1].name != "frameset"):
+ # If we're not in innerHTML mode and the the current node is not a
+ # "frameset" element (anymore) then switch.
+ self.parser.phase = self.parser.phases["afterFrameset"]
+
+ def endTagNoframes(self, name):
+ self.parser.phases["inBody"].processEndTag(name)
+
+ def endTagOther(self, name):
+ self.parser.parseError(_(u"Unexpected end tag token (%s)"
+ u" in the frameset phase. Ignored.") % (name,))
+
+
+class AfterFramesetPhase(Phase):
+ # http://www.whatwg.org/specs/web-apps/current-work/#after3
+ def __init__(self, parser, tree):
+ Phase.__init__(self, parser, tree)
+
+ self.startTagHandler = utils.MethodDispatcher([
+ ("html", self.startTagHtml),
+ ("noframes", self.startTagNoframes)
+ ])
+ self.startTagHandler.default = self.startTagOther
+
+ self.endTagHandler = utils.MethodDispatcher([
+ ("html", self.endTagHtml)
+ ])
+ self.endTagHandler.default = self.endTagOther
+
+ def processCharacters(self, data):
+ self.parser.parseError(_(u"Unexpected non-space characters in the "
+ u"after frameset phase. Ignored."))
+
+ def startTagNoframes(self, name, attributes):
+ self.parser.phases["inBody"].processStartTag(name, attributes)
+
+ def startTagOther(self, name, attributes):
+ self.parser.parseError(_(u"Unexpected start tag (%s)"
+ u" in the after frameset phase. Ignored.") % (name,))
+
+ def endTagHtml(self, name):
+ self.parser.lastPhase = self.parser.phase
+ self.parser.phase = self.parser.phases["trailingEnd"]
+
+ def endTagOther(self, name):
+ self.parser.parseError(_(u"Unexpected end tag (%s)"
+ u" in the after frameset phase. Ignored.") % (name,))
+
+
+class TrailingEndPhase(Phase):
+ def processEOF(self):
+ pass
+
+ def processComment(self, data):
+ self.tree.insertComment(data, self.tree.document)
+
+ def processSpaceCharacters(self, data):
+ self.parser.lastPhase.processSpaceCharacters(data)
+
+ def processCharacters(self, data):
+ self.parser.parseError(_(u"Unexpected non-space characters. "
+ u"Expected end of file."))
+ self.parser.phase = self.parser.lastPhase
+ self.parser.phase.processCharacters(data)
+
+ def processStartTag(self, name, attributes):
+ self.parser.parseError(_(u"Unexpected start tag (%s)"
+ u". Expected end of file.") % (name,))
+ self.parser.phase = self.parser.lastPhase
+ self.parser.phase.processStartTag(name, attributes)
+
+ def processEndTag(self, name):
+ self.parser.parseError(_(u"Unexpected end tag (%s)"
+ u". Expected end of file.") % (name,))
+ self.parser.phase = self.parser.lastPhase
+ self.parser.phase.processEndTag(name)
+
+
+class ParseError(Exception):
+ """Error in parsed document"""
+ pass
Deleted: trunk/lib/venus/planet/vendor/html5lib/inputstream.py
===================================================================
--- branches/sucs-site/lib/venus/planet/vendor/html5lib/inputstream.py 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/lib/venus/planet/vendor/html5lib/inputstream.py 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,602 +0,0 @@
-import codecs
-import re
-import types
-
-from gettext import gettext
-_ = gettext
-
-from constants import EOF, spaceCharacters, asciiLetters, asciiUppercase
-from constants import encodings
-from utils import MethodDispatcher
-
-class HTMLInputStream(object):
- """Provides a unicode stream of characters to the HTMLTokenizer.
-
- This class takes care of character encoding and removing or replacing
- incorrect byte-sequences and also provides column and line tracking.
-
- """
-
- def __init__(self, source, encoding=None, parseMeta=True, chardet=True):
- """Initialises the HTMLInputStream.
-
- HTMLInputStream(source, [encoding]) -> Normalized stream from source
- for use by the HTML5Lib.
-
- source can be either a file-object, local filename or a string.
-
- The optional encoding parameter must be a string that indicates
- the encoding. If specified, that encoding will be used,
- regardless of any BOM or later declaration (such as in a meta
- element)
-
- parseMeta - Look for a <meta> element containing encoding information
-
- """
- # List of where new lines occur
- self.newLines = [0]
-
- self.charEncoding = encoding
-
- # Raw Stream - for unicode objects this will encode to utf-8 and set
- # self.charEncoding as appropriate
- self.rawStream = self.openStream(source)
-
- # Encoding Information
- #Number of bytes to use when looking for a meta element with
- #encoding information
- self.numBytesMeta = 512
- #Number of bytes to use when using detecting encoding using chardet
- self.numBytesChardet = 100
- #Encoding to use if no other information can be found
- self.defaultEncoding = "windows-1252"
-
- #Detect encoding iff no explicit "transport level" encoding is supplied
- if self.charEncoding is None or not isValidEncoding(self.charEncoding):
- self.charEncoding = self.detectEncoding(parseMeta, chardet)
-
- self.dataStream = codecs.getreader(self.charEncoding)(self.rawStream,
- 'replace')
-
- self.queue = []
- self.errors = []
-
- self.line = self.col = 0
- self.lineLengths = []
-
- #Flag to indicate we may have a CR LF broken across a data chunk
- self._lastChunkEndsWithCR = False
-
- def openStream(self, source):
- """Produces a file object from source.
-
- source can be either a file object, local filename or a string.
-
- """
- # Already a file object
- if hasattr(source, 'read'):
- stream = source
- else:
- # Otherwise treat source as a string and convert to a file object
- if isinstance(source, unicode):
- source = source.encode('utf-8')
- self.charEncoding = "utf-8"
- import cStringIO
- stream = cStringIO.StringIO(str(source))
- return stream
-
- def detectEncoding(self, parseMeta=True, chardet=True):
-
- #First look for a BOM
- #This will also read past the BOM if present
- encoding = self.detectBOM()
- #If there is no BOM need to look for meta elements with encoding
- #information
- if encoding is None and parseMeta:
- encoding = self.detectEncodingMeta()
- #Guess with chardet, if avaliable
- if encoding is None and chardet:
- try:
- from chardet.universaldetector import UniversalDetector
- buffers = []
- detector = UniversalDetector()
- while not detector.done:
- buffer = self.rawStream.read(self.numBytesChardet)
- if not buffer:
- break
- buffers.append(buffer)
- detector.feed(buffer)
- detector.close()
- encoding = detector.result['encoding']
- self.seek("".join(buffers), 0)
- except ImportError:
- pass
- # If all else fails use the default encoding
- if encoding is None:
- encoding = self.defaultEncoding
-
- #Substitute for equivalent encodings:
- encodingSub = {"iso-8859-1":"windows-1252"}
-
- if encoding.lower() in encodingSub:
- encoding = encodingSub[encoding.lower()]
-
- return encoding
-
- def detectBOM(self):
- """Attempts to detect at BOM at the start of the stream. If
- an encoding can be determined from the BOM return the name of the
- encoding otherwise return None"""
- bomDict = {
- codecs.BOM_UTF8: 'utf-8',
- codecs.BOM_UTF16_LE: 'utf-16-le', codecs.BOM_UTF16_BE: 'utf-16-be',
- codecs.BOM_UTF32_LE: 'utf-32-le', codecs.BOM_UTF32_BE: 'utf-32-be'
- }
-
- # Go to beginning of file and read in 4 bytes
- string = self.rawStream.read(4)
-
- # Try detecting the BOM using bytes from the string
- encoding = bomDict.get(string[:3]) # UTF-8
- seek = 3
- if not encoding:
- # Need to detect UTF-32 before UTF-16
- encoding = bomDict.get(string) # UTF-32
- seek = 4
- if not encoding:
- encoding = bomDict.get(string[:2]) # UTF-16
- seek = 2
-
- # Set the read position past the BOM if one was found, otherwise
- # set it to the start of the stream
- self.seek(string, encoding and seek or 0)
-
- return encoding
-
- def seek(self, buffer, n):
- """Unget buffer[n:]"""
- if hasattr(self.rawStream, 'unget'):
- self.rawStream.unget(buffer[n:])
- return
-
- if hasattr(self.rawStream, 'seek'):
- try:
- self.rawStream.seek(n)
- return
- except IOError:
- pass
-
- class BufferedStream:
- def __init__(self, data, stream):
- self.data = data
- self.stream = stream
- def read(self, chars=-1):
- if chars == -1 or chars > len(self.data):
- result = self.data
- self.data = ''
- if chars == -1:
- return result + self.stream.read()
- else:
- return result + self.stream.read(chars-len(result))
- elif not self.data:
- return self.stream.read(chars)
- else:
- result = self.data[:chars]
- self.data = self.data[chars:]
- return result
- def unget(self, data):
- if self.data:
- self.data += data
- else:
- self.data = data
-
- self.rawStream = BufferedStream(buffer[n:], self.rawStream)
-
- def detectEncodingMeta(self):
- """Report the encoding declared by the meta element
- """
- buffer = self.rawStream.read(self.numBytesMeta)
- parser = EncodingParser(buffer)
- self.seek(buffer, 0)
- return parser.getEncoding()
-
- def position(self):
- """Returns (line, col) of the current position in the stream."""
- line, col = self.line, self.col
- return (line + 1, col)
-
- def char(self):
- """ Read one character from the stream or queue if available. Return
- EOF when EOF is reached.
- """
- if not self.queue:
- self.readChunk()
- #If we still don't have a character we have reached EOF
- if not self.queue:
- return EOF
-
- char = self.queue.pop(0)
-
- # update position in stream
- if char == '\n':
- self.lineLengths.append(self.col)
- self.line += 1
- self.col = 0
- else:
- self.col += 1
- return char
-
- def readChunk(self, chunkSize=10240):
- data = self.dataStream.read(chunkSize)
- if not data:
- return
- #Replace null characters
- for i in xrange(data.count(u"\u0000")):
- self.errors.append(_('null character found in input stream, '
- 'replaced with U+FFFD'))
- data = data.replace(u"\u0000", u"\ufffd")
- #Check for CR LF broken across chunks
- if (self._lastChunkEndsWithCR and data[0] == "\n"):
- data = data[1:]
- self._lastChunkEndsWithCR = data[-1] == "\r"
- data = data.replace("\r\n", "\n")
- data = data.replace("\r", "\n")
-
- data = unicode(data)
- self.queue.extend([char for char in data])
-
- def charsUntil(self, characters, opposite = False):
- """ Returns a string of characters from the stream up to but not
- including any character in characters or EOF. characters can be
- any container that supports the in method being called on it.
- """
-
- #This method is currently 40-50% of our total runtime and badly needs
- #optimizing
- #Possible improvements:
- # - use regexp to find characters that match the required character set
- # (with regexp cache since we do the same searches many many times)
- # - improve EOF handling for fewer if statements
-
- if not self.queue:
- self.readChunk()
- #Break if we have reached EOF
- if not self.queue or self.queue[0] == None:
- return u""
-
- i = 0
- while (self.queue[i] in characters) == opposite:
- i += 1
- if i == len(self.queue):
- self.readChunk()
- #If the queue doesn't grow we have reached EOF
- if i == len(self.queue) or self.queue[i] is EOF:
- break
- #XXX- wallpaper over bug in calculation below
- #Otherwise change the stream position
- if self.queue[i] == '\n':
- self.lineLengths.append(self.col)
- self.line += 1
- self.col = 0
- else:
- self.col += 1
-
- rv = u"".join(self.queue[:i])
- self.queue = self.queue[i:]
-
- #Calculate where we now are in the stream
- #One possible optimisation would be to store all read characters and
- #Calculate this on an as-needed basis (perhaps flushing the read data
- #every time we read a new chunk) rather than once per call here and
- #in .char()
-
- #XXX Temporarily disable this because there is a bug
-
- #lines = rv.split("\n")
- #
- #if lines:
- # #Add number of lines passed onto positon
- # oldCol = self.col
- # self.line += len(lines)-1
- # if len(lines) > 1:
- # self.col = len(lines[-1])
- # else:
- # self.col += len(lines[0])
- #
- # if self.lineLengths and oldCol > 0:
- # self.lineLengths[-1] += len(lines[0])
- # lines = lines[1:-1]
- # else:
- # lines = lines[:-1]
- #
- # for line in lines:
- # self.lineLengths.append(len(line))
- #
-
- return rv
-
- def unget(self, chars):
- if chars:
- self.queue = list(chars) + self.queue
- #Alter the current line, col position
- for c in chars[::-1]:
- if c == '\n':
- self.line -= 1
- self.col = self.lineLengths[self.line]
- else:
- self.col -= 1
-
-class EncodingBytes(str):
- """String-like object with an assosiated position and various extra methods
- If the position is ever greater than the string length then an exception is
- raised"""
- def __init__(self, value):
- str.__init__(self, value)
- self._position=-1
-
- def __iter__(self):
- return self
-
- def next(self):
- self._position += 1
- rv = self[self.position]
- return rv
-
- def setPosition(self, position):
- if self._position >= len(self):
- raise StopIteration
- self._position = position
-
- def getPosition(self):
- if self._position >= len(self):
- raise StopIteration
- if self._position >= 0:
- return self._position
- else:
- return None
-
- position = property(getPosition, setPosition)
-
- def getCurrentByte(self):
- return self[self.position]
-
- currentByte = property(getCurrentByte)
-
- def skip(self, chars=spaceCharacters):
- """Skip past a list of characters"""
- while self.currentByte in chars:
- self.position += 1
-
- def matchBytes(self, bytes, lower=False):
- """Look for a sequence of bytes at the start of a string. If the bytes
- are found return True and advance the position to the byte after the
- match. Otherwise return False and leave the position alone"""
- data = self[self.position:self.position+len(bytes)]
- if lower:
- data = data.lower()
- rv = data.startswith(bytes)
- if rv == True:
- self.position += len(bytes)
- return rv
-
- def jumpTo(self, bytes):
- """Look for the next sequence of bytes matching a given sequence. If
- a match is found advance the position to the last byte of the match"""
- newPosition = self[self.position:].find(bytes)
- if newPosition > -1:
- self._position += (newPosition + len(bytes)-1)
- return True
- else:
- raise StopIteration
-
- def findNext(self, byteList):
- """Move the pointer so it points to the next byte in a set of possible
- bytes"""
- while (self.currentByte not in byteList):
- self.position += 1
-
-class EncodingParser(object):
- """Mini parser for detecting character encoding from meta elements"""
-
- def __init__(self, data):
- """string - the data to work on for encoding detection"""
- self.data = EncodingBytes(data)
- self.encoding = None
-
- def getEncoding(self):
- methodDispatch = (
- ("<!--",self.handleComment),
- ("<meta",self.handleMeta),
- ("</",self.handlePossibleEndTag),
- ("<!",self.handleOther),
- ("<?",self.handleOther),
- ("<",self.handlePossibleStartTag))
- for byte in self.data:
- keepParsing = True
- for key, method in methodDispatch:
- if self.data.matchBytes(key, lower=True):
- try:
- keepParsing = method()
- break
- except StopIteration:
- keepParsing=False
- break
- if not keepParsing:
- break
- if self.encoding is not None:
- self.encoding = self.encoding.strip()
- return self.encoding
-
- def handleComment(self):
- """Skip over comments"""
- return self.data.jumpTo("-->")
-
- def handleMeta(self):
- if self.data.currentByte not in spaceCharacters:
- #if we have <meta not followed by a space so just keep going
- return True
- #We have a valid meta element we want to search for attributes
- while True:
- #Try to find the next attribute after the current position
- attr = self.getAttribute()
- if attr is None:
- return True
- else:
- if attr[0] == "charset":
- tentativeEncoding = attr[1]
- if isValidEncoding(tentativeEncoding):
- self.encoding = tentativeEncoding
- return False
- elif attr[0] == "content":
- contentParser = ContentAttrParser(EncodingBytes(attr[1]))
- tentativeEncoding = contentParser.parse()
- if isValidEncoding(tentativeEncoding):
- self.encoding = tentativeEncoding
- return False
-
- def handlePossibleStartTag(self):
- return self.handlePossibleTag(False)
-
- def handlePossibleEndTag(self):
- self.data.position+=1
- return self.handlePossibleTag(True)
-
- def handlePossibleTag(self, endTag):
- if self.data.currentByte not in asciiLetters:
- #If the next byte is not an ascii letter either ignore this
- #fragment (possible start tag case) or treat it according to
- #handleOther
- if endTag:
- self.data.position -= 1
- self.handleOther()
- return True
-
- self.data.findNext(list(spaceCharacters) + ["<", ">"])
- if self.data.currentByte == "<":
- #return to the first step in the overall "two step" algorithm
- #reprocessing the < byte
- self.data.position -= 1
- else:
- #Read all attributes
- attr = self.getAttribute()
- while attr is not None:
- attr = self.getAttribute()
- return True
-
- def handleOther(self):
- return self.data.jumpTo(">")
-
- def getAttribute(self):
- """Return a name,value pair for the next attribute in the stream,
- if one is found, or None"""
- self.data.skip(list(spaceCharacters)+["/"])
- if self.data.currentByte == "<":
- self.data.position -= 1
- return None
- elif self.data.currentByte == ">":
- return None
- attrName = []
- attrValue = []
- spaceFound = False
- #Step 5 attribute name
- while True:
- if self.data.currentByte == "=" and attrName:
- break
- elif self.data.currentByte in spaceCharacters:
- spaceFound=True
- break
- elif self.data.currentByte in ("/", "<", ">"):
- return "".join(attrName), ""
- elif self.data.currentByte in asciiUppercase:
- attrName.extend(self.data.currentByte.lower())
- else:
- attrName.extend(self.data.currentByte)
- #Step 6
- self.data.position += 1
- #Step 7
- if spaceFound:
- self.data.skip()
- #Step 8
- if self.data.currentByte != "=":
- self.data.position -= 1
- return "".join(attrName), ""
- #XXX need to advance position in both spaces and value case
- #Step 9
- self.data.position += 1
- #Step 10
- self.data.skip()
- #Step 11
- if self.data.currentByte in ("'", '"'):
- #11.1
- quoteChar = self.data.currentByte
- while True:
- self.data.position+=1
- #11.3
- if self.data.currentByte == quoteChar:
- self.data.position += 1
- return "".join(attrName), "".join(attrValue)
- #11.4
- elif self.data.currentByte in asciiUppercase:
- attrValue.extend(self.data.currentByte.lower())
- #11.5
- else:
- attrValue.extend(self.data.currentByte)
- elif self.data.currentByte in (">", '<'):
- return "".join(attrName), ""
- elif self.data.currentByte in asciiUppercase:
- attrValue.extend(self.data.currentByte.lower())
- else:
- attrValue.extend(self.data.currentByte)
- while True:
- self.data.position +=1
- if self.data.currentByte in (
- list(spaceCharacters) + [">", '<']):
- return "".join(attrName), "".join(attrValue)
- elif self.data.currentByte in asciiUppercase:
- attrValue.extend(self.data.currentByte.lower())
- else:
- attrValue.extend(self.data.currentByte)
-
-
-class ContentAttrParser(object):
- def __init__(self, data):
- self.data = data
- def parse(self):
- try:
- #Skip to the first ";"
- self.data.jumpTo(";")
- self.data.position += 1
- self.data.skip()
- #Check if the attr name is charset
- #otherwise return
- self.data.jumpTo("charset")
- self.data.position += 1
- self.data.skip()
- if not self.data.currentByte == "=":
- #If there is no = sign keep looking for attrs
- return None
- self.data.position += 1
- self.data.skip()
- #Look for an encoding between matching quote marks
- if self.data.currentByte in ('"', "'"):
- quoteMark = self.data.currentByte
- self.data.position += 1
- oldPosition = self.data.position
- self.data.jumpTo(quoteMark)
- return self.data[oldPosition:self.data.position]
- else:
- #Unquoted value
- oldPosition = self.data.position
- try:
- self.data.findNext(spaceCharacters)
- return self.data[oldPosition:self.data.position]
- except StopIteration:
- #Return the whole remaining value
- return self.data[oldPosition:]
- except StopIteration:
- return None
-
-def isValidEncoding(encoding):
- """Determine if a string is a supported encoding"""
- return (encoding is not None and type(encoding) == types.StringType and
- encoding.lower().strip() in encodings)
Copied: trunk/lib/venus/planet/vendor/html5lib/inputstream.py (from rev 656, branches/sucs-site/lib/venus/planet/vendor/html5lib/inputstream.py)
===================================================================
--- trunk/lib/venus/planet/vendor/html5lib/inputstream.py (rev 0)
+++ trunk/lib/venus/planet/vendor/html5lib/inputstream.py 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,602 @@
+import codecs
+import re
+import types
+
+from gettext import gettext
+_ = gettext
+
+from constants import EOF, spaceCharacters, asciiLetters, asciiUppercase
+from constants import encodings
+from utils import MethodDispatcher
+
+class HTMLInputStream(object):
+ """Provides a unicode stream of characters to the HTMLTokenizer.
+
+ This class takes care of character encoding and removing or replacing
+ incorrect byte-sequences and also provides column and line tracking.
+
+ """
+
+ def __init__(self, source, encoding=None, parseMeta=True, chardet=True):
+ """Initialises the HTMLInputStream.
+
+ HTMLInputStream(source, [encoding]) -> Normalized stream from source
+ for use by the HTML5Lib.
+
+ source can be either a file-object, local filename or a string.
+
+ The optional encoding parameter must be a string that indicates
+ the encoding. If specified, that encoding will be used,
+ regardless of any BOM or later declaration (such as in a meta
+ element)
+
+ parseMeta - Look for a <meta> element containing encoding information
+
+ """
+ # List of where new lines occur
+ self.newLines = [0]
+
+ self.charEncoding = encoding
+
+ # Raw Stream - for unicode objects this will encode to utf-8 and set
+ # self.charEncoding as appropriate
+ self.rawStream = self.openStream(source)
+
+ # Encoding Information
+ #Number of bytes to use when looking for a meta element with
+ #encoding information
+ self.numBytesMeta = 512
+ #Number of bytes to use when using detecting encoding using chardet
+ self.numBytesChardet = 100
+ #Encoding to use if no other information can be found
+ self.defaultEncoding = "windows-1252"
+
+ #Detect encoding iff no explicit "transport level" encoding is supplied
+ if self.charEncoding is None or not isValidEncoding(self.charEncoding):
+ self.charEncoding = self.detectEncoding(parseMeta, chardet)
+
+ self.dataStream = codecs.getreader(self.charEncoding)(self.rawStream,
+ 'replace')
+
+ self.queue = []
+ self.errors = []
+
+ self.line = self.col = 0
+ self.lineLengths = []
+
+ #Flag to indicate we may have a CR LF broken across a data chunk
+ self._lastChunkEndsWithCR = False
+
+ def openStream(self, source):
+ """Produces a file object from source.
+
+ source can be either a file object, local filename or a string.
+
+ """
+ # Already a file object
+ if hasattr(source, 'read'):
+ stream = source
+ else:
+ # Otherwise treat source as a string and convert to a file object
+ if isinstance(source, unicode):
+ source = source.encode('utf-8')
+ self.charEncoding = "utf-8"
+ import cStringIO
+ stream = cStringIO.StringIO(str(source))
+ return stream
+
+ def detectEncoding(self, parseMeta=True, chardet=True):
+
+ #First look for a BOM
+ #This will also read past the BOM if present
+ encoding = self.detectBOM()
+ #If there is no BOM need to look for meta elements with encoding
+ #information
+ if encoding is None and parseMeta:
+ encoding = self.detectEncodingMeta()
+ #Guess with chardet, if avaliable
+ if encoding is None and chardet:
+ try:
+ from chardet.universaldetector import UniversalDetector
+ buffers = []
+ detector = UniversalDetector()
+ while not detector.done:
+ buffer = self.rawStream.read(self.numBytesChardet)
+ if not buffer:
+ break
+ buffers.append(buffer)
+ detector.feed(buffer)
+ detector.close()
+ encoding = detector.result['encoding']
+ self.seek("".join(buffers), 0)
+ except ImportError:
+ pass
+ # If all else fails use the default encoding
+ if encoding is None:
+ encoding = self.defaultEncoding
+
+ #Substitute for equivalent encodings:
+ encodingSub = {"iso-8859-1":"windows-1252"}
+
+ if encoding.lower() in encodingSub:
+ encoding = encodingSub[encoding.lower()]
+
+ return encoding
+
+ def detectBOM(self):
+ """Attempts to detect at BOM at the start of the stream. If
+ an encoding can be determined from the BOM return the name of the
+ encoding otherwise return None"""
+ bomDict = {
+ codecs.BOM_UTF8: 'utf-8',
+ codecs.BOM_UTF16_LE: 'utf-16-le', codecs.BOM_UTF16_BE: 'utf-16-be',
+ codecs.BOM_UTF32_LE: 'utf-32-le', codecs.BOM_UTF32_BE: 'utf-32-be'
+ }
+
+ # Go to beginning of file and read in 4 bytes
+ string = self.rawStream.read(4)
+
+ # Try detecting the BOM using bytes from the string
+ encoding = bomDict.get(string[:3]) # UTF-8
+ seek = 3
+ if not encoding:
+ # Need to detect UTF-32 before UTF-16
+ encoding = bomDict.get(string) # UTF-32
+ seek = 4
+ if not encoding:
+ encoding = bomDict.get(string[:2]) # UTF-16
+ seek = 2
+
+ # Set the read position past the BOM if one was found, otherwise
+ # set it to the start of the stream
+ self.seek(string, encoding and seek or 0)
+
+ return encoding
+
+ def seek(self, buffer, n):
+ """Unget buffer[n:]"""
+ if hasattr(self.rawStream, 'unget'):
+ self.rawStream.unget(buffer[n:])
+ return
+
+ if hasattr(self.rawStream, 'seek'):
+ try:
+ self.rawStream.seek(n)
+ return
+ except IOError:
+ pass
+
+ class BufferedStream:
+ def __init__(self, data, stream):
+ self.data = data
+ self.stream = stream
+ def read(self, chars=-1):
+ if chars == -1 or chars > len(self.data):
+ result = self.data
+ self.data = ''
+ if chars == -1:
+ return result + self.stream.read()
+ else:
+ return result + self.stream.read(chars-len(result))
+ elif not self.data:
+ return self.stream.read(chars)
+ else:
+ result = self.data[:chars]
+ self.data = self.data[chars:]
+ return result
+ def unget(self, data):
+ if self.data:
+ self.data += data
+ else:
+ self.data = data
+
+ self.rawStream = BufferedStream(buffer[n:], self.rawStream)
+
+ def detectEncodingMeta(self):
+ """Report the encoding declared by the meta element
+ """
+ buffer = self.rawStream.read(self.numBytesMeta)
+ parser = EncodingParser(buffer)
+ self.seek(buffer, 0)
+ return parser.getEncoding()
+
+ def position(self):
+ """Returns (line, col) of the current position in the stream."""
+ line, col = self.line, self.col
+ return (line + 1, col)
+
+ def char(self):
+ """ Read one character from the stream or queue if available. Return
+ EOF when EOF is reached.
+ """
+ if not self.queue:
+ self.readChunk()
+ #If we still don't have a character we have reached EOF
+ if not self.queue:
+ return EOF
+
+ char = self.queue.pop(0)
+
+ # update position in stream
+ if char == '\n':
+ self.lineLengths.append(self.col)
+ self.line += 1
+ self.col = 0
+ else:
+ self.col += 1
+ return char
+
+ def readChunk(self, chunkSize=10240):
+ data = self.dataStream.read(chunkSize)
+ if not data:
+ return
+ #Replace null characters
+ for i in xrange(data.count(u"\u0000")):
+ self.errors.append(_('null character found in input stream, '
+ 'replaced with U+FFFD'))
+ data = data.replace(u"\u0000", u"\ufffd")
+ #Check for CR LF broken across chunks
+ if (self._lastChunkEndsWithCR and data[0] == "\n"):
+ data = data[1:]
+ self._lastChunkEndsWithCR = data[-1] == "\r"
+ data = data.replace("\r\n", "\n")
+ data = data.replace("\r", "\n")
+
+ data = unicode(data)
+ self.queue.extend([char for char in data])
+
+ def charsUntil(self, characters, opposite = False):
+ """ Returns a string of characters from the stream up to but not
+ including any character in characters or EOF. characters can be
+ any container that supports the in method being called on it.
+ """
+
+ #This method is currently 40-50% of our total runtime and badly needs
+ #optimizing
+ #Possible improvements:
+ # - use regexp to find characters that match the required character set
+ # (with regexp cache since we do the same searches many many times)
+ # - improve EOF handling for fewer if statements
+
+ if not self.queue:
+ self.readChunk()
+ #Break if we have reached EOF
+ if not self.queue or self.queue[0] == None:
+ return u""
+
+ i = 0
+ while (self.queue[i] in characters) == opposite:
+ i += 1
+ if i == len(self.queue):
+ self.readChunk()
+ #If the queue doesn't grow we have reached EOF
+ if i == len(self.queue) or self.queue[i] is EOF:
+ break
+ #XXX- wallpaper over bug in calculation below
+ #Otherwise change the stream position
+ if self.queue[i] == '\n':
+ self.lineLengths.append(self.col)
+ self.line += 1
+ self.col = 0
+ else:
+ self.col += 1
+
+ rv = u"".join(self.queue[:i])
+ self.queue = self.queue[i:]
+
+ #Calculate where we now are in the stream
+ #One possible optimisation would be to store all read characters and
+ #Calculate this on an as-needed basis (perhaps flushing the read data
+ #every time we read a new chunk) rather than once per call here and
+ #in .char()
+
+ #XXX Temporarily disable this because there is a bug
+
+ #lines = rv.split("\n")
+ #
+ #if lines:
+ # #Add number of lines passed onto positon
+ # oldCol = self.col
+ # self.line += len(lines)-1
+ # if len(lines) > 1:
+ # self.col = len(lines[-1])
+ # else:
+ # self.col += len(lines[0])
+ #
+ # if self.lineLengths and oldCol > 0:
+ # self.lineLengths[-1] += len(lines[0])
+ # lines = lines[1:-1]
+ # else:
+ # lines = lines[:-1]
+ #
+ # for line in lines:
+ # self.lineLengths.append(len(line))
+ #
+
+ return rv
+
+ def unget(self, chars):
+ if chars:
+ self.queue = list(chars) + self.queue
+ #Alter the current line, col position
+ for c in chars[::-1]:
+ if c == '\n':
+ self.line -= 1
+ self.col = self.lineLengths[self.line]
+ else:
+ self.col -= 1
+
+class EncodingBytes(str):
+ """String-like object with an assosiated position and various extra methods
+ If the position is ever greater than the string length then an exception is
+ raised"""
+ def __init__(self, value):
+ str.__init__(self, value)
+ self._position=-1
+
+ def __iter__(self):
+ return self
+
+ def next(self):
+ self._position += 1
+ rv = self[self.position]
+ return rv
+
+ def setPosition(self, position):
+ if self._position >= len(self):
+ raise StopIteration
+ self._position = position
+
+ def getPosition(self):
+ if self._position >= len(self):
+ raise StopIteration
+ if self._position >= 0:
+ return self._position
+ else:
+ return None
+
+ position = property(getPosition, setPosition)
+
+ def getCurrentByte(self):
+ return self[self.position]
+
+ currentByte = property(getCurrentByte)
+
+ def skip(self, chars=spaceCharacters):
+ """Skip past a list of characters"""
+ while self.currentByte in chars:
+ self.position += 1
+
+ def matchBytes(self, bytes, lower=False):
+ """Look for a sequence of bytes at the start of a string. If the bytes
+ are found return True and advance the position to the byte after the
+ match. Otherwise return False and leave the position alone"""
+ data = self[self.position:self.position+len(bytes)]
+ if lower:
+ data = data.lower()
+ rv = data.startswith(bytes)
+ if rv == True:
+ self.position += len(bytes)
+ return rv
+
+ def jumpTo(self, bytes):
+ """Look for the next sequence of bytes matching a given sequence. If
+ a match is found advance the position to the last byte of the match"""
+ newPosition = self[self.position:].find(bytes)
+ if newPosition > -1:
+ self._position += (newPosition + len(bytes)-1)
+ return True
+ else:
+ raise StopIteration
+
+ def findNext(self, byteList):
+ """Move the pointer so it points to the next byte in a set of possible
+ bytes"""
+ while (self.currentByte not in byteList):
+ self.position += 1
+
+class EncodingParser(object):
+ """Mini parser for detecting character encoding from meta elements"""
+
+ def __init__(self, data):
+ """string - the data to work on for encoding detection"""
+ self.data = EncodingBytes(data)
+ self.encoding = None
+
+ def getEncoding(self):
+ methodDispatch = (
+ ("<!--",self.handleComment),
+ ("<meta",self.handleMeta),
+ ("</",self.handlePossibleEndTag),
+ ("<!",self.handleOther),
+ ("<?",self.handleOther),
+ ("<",self.handlePossibleStartTag))
+ for byte in self.data:
+ keepParsing = True
+ for key, method in methodDispatch:
+ if self.data.matchBytes(key, lower=True):
+ try:
+ keepParsing = method()
+ break
+ except StopIteration:
+ keepParsing=False
+ break
+ if not keepParsing:
+ break
+ if self.encoding is not None:
+ self.encoding = self.encoding.strip()
+ return self.encoding
+
+ def handleComment(self):
+ """Skip over comments"""
+ return self.data.jumpTo("-->")
+
+ def handleMeta(self):
+ if self.data.currentByte not in spaceCharacters:
+ #if we have <meta not followed by a space so just keep going
+ return True
+ #We have a valid meta element we want to search for attributes
+ while True:
+ #Try to find the next attribute after the current position
+ attr = self.getAttribute()
+ if attr is None:
+ return True
+ else:
+ if attr[0] == "charset":
+ tentativeEncoding = attr[1]
+ if isValidEncoding(tentativeEncoding):
+ self.encoding = tentativeEncoding
+ return False
+ elif attr[0] == "content":
+ contentParser = ContentAttrParser(EncodingBytes(attr[1]))
+ tentativeEncoding = contentParser.parse()
+ if isValidEncoding(tentativeEncoding):
+ self.encoding = tentativeEncoding
+ return False
+
+ def handlePossibleStartTag(self):
+ return self.handlePossibleTag(False)
+
+ def handlePossibleEndTag(self):
+ self.data.position+=1
+ return self.handlePossibleTag(True)
+
+ def handlePossibleTag(self, endTag):
+ if self.data.currentByte not in asciiLetters:
+ #If the next byte is not an ascii letter either ignore this
+ #fragment (possible start tag case) or treat it according to
+ #handleOther
+ if endTag:
+ self.data.position -= 1
+ self.handleOther()
+ return True
+
+ self.data.findNext(list(spaceCharacters) + ["<", ">"])
+ if self.data.currentByte == "<":
+ #return to the first step in the overall "two step" algorithm
+ #reprocessing the < byte
+ self.data.position -= 1
+ else:
+ #Read all attributes
+ attr = self.getAttribute()
+ while attr is not None:
+ attr = self.getAttribute()
+ return True
+
+ def handleOther(self):
+ return self.data.jumpTo(">")
+
+ def getAttribute(self):
+ """Return a name,value pair for the next attribute in the stream,
+ if one is found, or None"""
+ self.data.skip(list(spaceCharacters)+["/"])
+ if self.data.currentByte == "<":
+ self.data.position -= 1
+ return None
+ elif self.data.currentByte == ">":
+ return None
+ attrName = []
+ attrValue = []
+ spaceFound = False
+ #Step 5 attribute name
+ while True:
+ if self.data.currentByte == "=" and attrName:
+ break
+ elif self.data.currentByte in spaceCharacters:
+ spaceFound=True
+ break
+ elif self.data.currentByte in ("/", "<", ">"):
+ return "".join(attrName), ""
+ elif self.data.currentByte in asciiUppercase:
+ attrName.extend(self.data.currentByte.lower())
+ else:
+ attrName.extend(self.data.currentByte)
+ #Step 6
+ self.data.position += 1
+ #Step 7
+ if spaceFound:
+ self.data.skip()
+ #Step 8
+ if self.data.currentByte != "=":
+ self.data.position -= 1
+ return "".join(attrName), ""
+ #XXX need to advance position in both spaces and value case
+ #Step 9
+ self.data.position += 1
+ #Step 10
+ self.data.skip()
+ #Step 11
+ if self.data.currentByte in ("'", '"'):
+ #11.1
+ quoteChar = self.data.currentByte
+ while True:
+ self.data.position+=1
+ #11.3
+ if self.data.currentByte == quoteChar:
+ self.data.position += 1
+ return "".join(attrName), "".join(attrValue)
+ #11.4
+ elif self.data.currentByte in asciiUppercase:
+ attrValue.extend(self.data.currentByte.lower())
+ #11.5
+ else:
+ attrValue.extend(self.data.currentByte)
+ elif self.data.currentByte in (">", '<'):
+ return "".join(attrName), ""
+ elif self.data.currentByte in asciiUppercase:
+ attrValue.extend(self.data.currentByte.lower())
+ else:
+ attrValue.extend(self.data.currentByte)
+ while True:
+ self.data.position +=1
+ if self.data.currentByte in (
+ list(spaceCharacters) + [">", '<']):
+ return "".join(attrName), "".join(attrValue)
+ elif self.data.currentByte in asciiUppercase:
+ attrValue.extend(self.data.currentByte.lower())
+ else:
+ attrValue.extend(self.data.currentByte)
+
+
+class ContentAttrParser(object):
+ def __init__(self, data):
+ self.data = data
+ def parse(self):
+ try:
+ #Skip to the first ";"
+ self.data.jumpTo(";")
+ self.data.position += 1
+ self.data.skip()
+ #Check if the attr name is charset
+ #otherwise return
+ self.data.jumpTo("charset")
+ self.data.position += 1
+ self.data.skip()
+ if not self.data.currentByte == "=":
+ #If there is no = sign keep looking for attrs
+ return None
+ self.data.position += 1
+ self.data.skip()
+ #Look for an encoding between matching quote marks
+ if self.data.currentByte in ('"', "'"):
+ quoteMark = self.data.currentByte
+ self.data.position += 1
+ oldPosition = self.data.position
+ self.data.jumpTo(quoteMark)
+ return self.data[oldPosition:self.data.position]
+ else:
+ #Unquoted value
+ oldPosition = self.data.position
+ try:
+ self.data.findNext(spaceCharacters)
+ return self.data[oldPosition:self.data.position]
+ except StopIteration:
+ #Return the whole remaining value
+ return self.data[oldPosition:]
+ except StopIteration:
+ return None
+
+def isValidEncoding(encoding):
+ """Determine if a string is a supported encoding"""
+ return (encoding is not None and type(encoding) == types.StringType and
+ encoding.lower().strip() in encodings)
Deleted: trunk/lib/venus/planet/vendor/html5lib/liberalxmlparser.py
===================================================================
--- branches/sucs-site/lib/venus/planet/vendor/html5lib/liberalxmlparser.py 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/lib/venus/planet/vendor/html5lib/liberalxmlparser.py 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,147 +0,0 @@
-"""
-Warning: this module is experimental and subject to change and even removal
-at any time.
-
-For background/rationale, see:
- * http://www.intertwingly.net/blog/2007/01/08/Xhtml5lib
- * http://tinyurl.com/ylfj8k (and follow-ups)
-
-References:
- * http://googlereader.blogspot.com/2005/12/xml-errors-in-feeds.html
- * http://wiki.whatwg.org/wiki/HtmlVsXhtml
-
-@@TODO:
- * Selectively lowercase only XHTML, but not foreign markup
-"""
-
-import html5parser
-from constants import voidElements, contentModelFlags
-
-from xml.dom import XHTML_NAMESPACE
-from xml.sax.saxutils import unescape
-
-class XMLParser(html5parser.HTMLParser):
- """ liberal XML parser """
-
- def __init__(self, *args, **kwargs):
- html5parser.HTMLParser.__init__(self, *args, **kwargs)
-
- self.phases["initial"] = XmlRootPhase(self, self.tree)
-
- def normalizeToken(self, token):
-
- if token["type"] in ("StartTag", "EmptyTag"):
- token["data"] = dict(token["data"][::-1])
-
- # For EmptyTags, process both a Start and an End tag
- if token["type"] == "EmptyTag":
- save = self.tokenizer.contentModelFlag
- self.phase.processStartTag(token["name"], token["data"])
- self.tokenizer.contentModelFlag = save
- token["data"] = {}
- token["type"] = "EndTag"
-
- elif token["type"] == "Characters":
- # un-escape rcdataElements (e.g. style, script)
- if self.tokenizer.contentModelFlag == contentModelFlags["CDATA"]:
- token["data"] = unescape(token["data"])
-
- elif token["type"] == "Comment":
- # Rescue CDATA from the comments
- if (token["data"].startswith("[CDATA[") and
- token["data"].endswith("]]")):
- token["type"] = "Characters"
- token["data"] = token["data"][7:-2]
-
- return token
-
- def _parse(self, stream, innerHTML=False, container="div", encoding=None,
- **kwargs):
-
- html5parser.HTMLParser._parse(self, stream, innerHTML, container,
- encoding, lowercaseElementName=False,
- lowercaseAttrName=False)
-
-class XHTMLParser(XMLParser):
- """ liberal XMTHML parser """
-
- def __init__(self, *args, **kwargs):
- html5parser.HTMLParser.__init__(self, *args, **kwargs)
- self.phases["initial"] = XmlInitialPhase(self, self.tree)
- self.phases["rootElement"] = XhmlRootPhase(self, self.tree)
-
- def normalizeToken(self, token):
- token = XMLParser.normalizeToken(self, token)
-
- # ensure that non-void XHTML elements have content so that separate
- # open and close tags are emitted
- if token["type"] == "EndTag":
- if token["name"] in voidElements:
- if not self.tree.openElements or \
- self.tree.openElements[-1].name != token["name"]:
- token["type"] = "EmptyTag"
- if not token.has_key("data"): token["data"] = {}
- else:
- if token["name"] == self.tree.openElements[-1].name and \
- not self.tree.openElements[-1].hasContent():
- for e in self.tree.openElements:
- if 'xmlns' in e.attributes.keys():
- if e.attributes['xmlns'] != XHTML_NAMESPACE:
- break
- else:
- self.tree.insertText('')
-
- return token
-
-class XhmlRootPhase(html5parser.RootElementPhase):
- def insertHtmlElement(self):
- element = self.tree.createElement("html", {'xmlns': 'http://www.w3.org/1999/xhtml'})
- self.tree.openElements.append(element)
- self.tree.document.appendChild(element)
- self.parser.phase = self.parser.phases["beforeHead"]
-
-class XmlInitialPhase(html5parser.InitialPhase):
- """ Consume XML Prologs """
- def processComment(self, data):
- if not data.startswith('?xml') or not data.endswith('?'):
- html5parser.InitialPhase.processComment(self, data)
-
-class XmlRootPhase(html5parser.Phase):
- """ Consume XML Prologs """
- def processComment(self, data):
- print repr(data)
- if not data.startswith('?xml') or not data.endswith('?'):
- html5parser.InitialPhase.processComment(self, data)
-
- """ Prime the Xml parser """
- def __getattr__(self, name):
- self.tree.openElements.append(self.tree.document)
- self.parser.phase = XmlElementPhase(self.parser, self.tree)
- return getattr(self.parser.phase, name)
-
-class XmlElementPhase(html5parser.Phase):
- """ Generic handling for all XML elements """
-
- def __init__(self, *args, **kwargs):
- html5parser.Phase.__init__(self, *args, **kwargs)
- self.startTagHandler = html5parser.utils.MethodDispatcher([])
- self.startTagHandler.default = self.startTagOther
- self.endTagHandler = html5parser.utils.MethodDispatcher([])
- self.endTagHandler.default = self.endTagOther
-
- def startTagOther(self, name, attributes):
- element = self.tree.createElement(name, attributes)
- self.tree.openElements[-1].appendChild(element)
- self.tree.openElements.append(element)
-
- def endTagOther(self, name):
- for node in self.tree.openElements[::-1]:
- if node.name == name:
- while self.tree.openElements.pop() != node:
- pass
- break
- else:
- self.parser.parseError()
-
- def processCharacters(self, data):
- self.tree.insertText(data)
Copied: trunk/lib/venus/planet/vendor/html5lib/liberalxmlparser.py (from rev 656, branches/sucs-site/lib/venus/planet/vendor/html5lib/liberalxmlparser.py)
===================================================================
--- trunk/lib/venus/planet/vendor/html5lib/liberalxmlparser.py (rev 0)
+++ trunk/lib/venus/planet/vendor/html5lib/liberalxmlparser.py 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,147 @@
+"""
+Warning: this module is experimental and subject to change and even removal
+at any time.
+
+For background/rationale, see:
+ * http://www.intertwingly.net/blog/2007/01/08/Xhtml5lib
+ * http://tinyurl.com/ylfj8k (and follow-ups)
+
+References:
+ * http://googlereader.blogspot.com/2005/12/xml-errors-in-feeds.html
+ * http://wiki.whatwg.org/wiki/HtmlVsXhtml
+
+@@TODO:
+ * Selectively lowercase only XHTML, but not foreign markup
+"""
+
+import html5parser
+from constants import voidElements, contentModelFlags
+
+from xml.dom import XHTML_NAMESPACE
+from xml.sax.saxutils import unescape
+
+class XMLParser(html5parser.HTMLParser):
+ """ liberal XML parser """
+
+ def __init__(self, *args, **kwargs):
+ html5parser.HTMLParser.__init__(self, *args, **kwargs)
+
+ self.phases["initial"] = XmlRootPhase(self, self.tree)
+
+ def normalizeToken(self, token):
+
+ if token["type"] in ("StartTag", "EmptyTag"):
+ token["data"] = dict(token["data"][::-1])
+
+ # For EmptyTags, process both a Start and an End tag
+ if token["type"] == "EmptyTag":
+ save = self.tokenizer.contentModelFlag
+ self.phase.processStartTag(token["name"], token["data"])
+ self.tokenizer.contentModelFlag = save
+ token["data"] = {}
+ token["type"] = "EndTag"
+
+ elif token["type"] == "Characters":
+ # un-escape rcdataElements (e.g. style, script)
+ if self.tokenizer.contentModelFlag == contentModelFlags["CDATA"]:
+ token["data"] = unescape(token["data"])
+
+ elif token["type"] == "Comment":
+ # Rescue CDATA from the comments
+ if (token["data"].startswith("[CDATA[") and
+ token["data"].endswith("]]")):
+ token["type"] = "Characters"
+ token["data"] = token["data"][7:-2]
+
+ return token
+
+ def _parse(self, stream, innerHTML=False, container="div", encoding=None,
+ **kwargs):
+
+ html5parser.HTMLParser._parse(self, stream, innerHTML, container,
+ encoding, lowercaseElementName=False,
+ lowercaseAttrName=False)
+
+class XHTMLParser(XMLParser):
+ """ liberal XMTHML parser """
+
+ def __init__(self, *args, **kwargs):
+ html5parser.HTMLParser.__init__(self, *args, **kwargs)
+ self.phases["initial"] = XmlInitialPhase(self, self.tree)
+ self.phases["rootElement"] = XhmlRootPhase(self, self.tree)
+
+ def normalizeToken(self, token):
+ token = XMLParser.normalizeToken(self, token)
+
+ # ensure that non-void XHTML elements have content so that separate
+ # open and close tags are emitted
+ if token["type"] == "EndTag":
+ if token["name"] in voidElements:
+ if not self.tree.openElements or \
+ self.tree.openElements[-1].name != token["name"]:
+ token["type"] = "EmptyTag"
+ if not token.has_key("data"): token["data"] = {}
+ else:
+ if token["name"] == self.tree.openElements[-1].name and \
+ not self.tree.openElements[-1].hasContent():
+ for e in self.tree.openElements:
+ if 'xmlns' in e.attributes.keys():
+ if e.attributes['xmlns'] != XHTML_NAMESPACE:
+ break
+ else:
+ self.tree.insertText('')
+
+ return token
+
+class XhmlRootPhase(html5parser.RootElementPhase):
+ def insertHtmlElement(self):
+ element = self.tree.createElement("html", {'xmlns': 'http://www.w3.org/1999/xhtml'})
+ self.tree.openElements.append(element)
+ self.tree.document.appendChild(element)
+ self.parser.phase = self.parser.phases["beforeHead"]
+
+class XmlInitialPhase(html5parser.InitialPhase):
+ """ Consume XML Prologs """
+ def processComment(self, data):
+ if not data.startswith('?xml') or not data.endswith('?'):
+ html5parser.InitialPhase.processComment(self, data)
+
+class XmlRootPhase(html5parser.Phase):
+ """ Consume XML Prologs """
+ def processComment(self, data):
+ print repr(data)
+ if not data.startswith('?xml') or not data.endswith('?'):
+ html5parser.InitialPhase.processComment(self, data)
+
+ """ Prime the Xml parser """
+ def __getattr__(self, name):
+ self.tree.openElements.append(self.tree.document)
+ self.parser.phase = XmlElementPhase(self.parser, self.tree)
+ return getattr(self.parser.phase, name)
+
+class XmlElementPhase(html5parser.Phase):
+ """ Generic handling for all XML elements """
+
+ def __init__(self, *args, **kwargs):
+ html5parser.Phase.__init__(self, *args, **kwargs)
+ self.startTagHandler = html5parser.utils.MethodDispatcher([])
+ self.startTagHandler.default = self.startTagOther
+ self.endTagHandler = html5parser.utils.MethodDispatcher([])
+ self.endTagHandler.default = self.endTagOther
+
+ def startTagOther(self, name, attributes):
+ element = self.tree.createElement(name, attributes)
+ self.tree.openElements[-1].appendChild(element)
+ self.tree.openElements.append(element)
+
+ def endTagOther(self, name):
+ for node in self.tree.openElements[::-1]:
+ if node.name == name:
+ while self.tree.openElements.pop() != node:
+ pass
+ break
+ else:
+ self.parser.parseError()
+
+ def processCharacters(self, data):
+ self.tree.insertText(data)
Deleted: trunk/lib/venus/planet/vendor/html5lib/sanitizer.py
===================================================================
--- branches/sucs-site/lib/venus/planet/vendor/html5lib/sanitizer.py 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/lib/venus/planet/vendor/html5lib/sanitizer.py 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,202 +0,0 @@
-import re
-from xml.sax.saxutils import escape, unescape
-from tokenizer import HTMLTokenizer
-
-class HTMLSanitizerMixin(object):
- """ sanitization of XHTML+MathML+SVG and of inline style attributes."""
-
- acceptable_elements = ['a', 'abbr', 'acronym', 'address', 'area', 'b',
- 'big', 'blockquote', 'br', 'button', 'caption', 'center', 'cite',
- 'code', 'col', 'colgroup', 'dd', 'del', 'dfn', 'dir', 'div', 'dl', 'dt',
- 'em', 'fieldset', 'font', 'form', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6',
- 'hr', 'i', 'img', 'input', 'ins', 'kbd', 'label', 'legend', 'li', 'map',
- 'menu', 'ol', 'optgroup', 'option', 'p', 'pre', 'q', 's', 'samp',
- 'select', 'small', 'span', 'strike', 'strong', 'sub', 'sup', 'table',
- 'tbody', 'td', 'textarea', 'tfoot', 'th', 'thead', 'tr', 'tt', 'u',
- 'ul', 'var']
-
- mathml_elements = ['maction', 'math', 'merror', 'mfrac', 'mi',
- 'mmultiscripts', 'mn', 'mo', 'mover', 'mpadded', 'mphantom',
- 'mprescripts', 'mroot', 'mrow', 'mspace', 'msqrt', 'mstyle', 'msub',
- 'msubsup', 'msup', 'mtable', 'mtd', 'mtext', 'mtr', 'munder',
- 'munderover', 'none']
-
- svg_elements = ['a', 'animate', 'animateColor', 'animateMotion',
- 'animateTransform', 'circle', 'defs', 'desc', 'ellipse', 'font-face',
- 'font-face-name', 'font-face-src', 'g', 'glyph', 'hkern', 'image',
- 'linearGradient', 'line', 'marker', 'metadata', 'missing-glyph',
- 'mpath', 'path', 'polygon', 'polyline', 'radialGradient', 'rect',
- 'set', 'stop', 'svg', 'switch', 'text', 'title', 'tspan', 'use']
-
- acceptable_attributes = ['abbr', 'accept', 'accept-charset', 'accesskey',
- 'action', 'align', 'alt', 'axis', 'border', 'cellpadding',
- 'cellspacing', 'char', 'charoff', 'charset', 'checked', 'cite', 'class',
- 'clear', 'cols', 'colspan', 'color', 'compact', 'coords', 'datetime',
- 'dir', 'disabled', 'enctype', 'for', 'frame', 'headers', 'height',
- 'href', 'hreflang', 'hspace', 'id', 'ismap', 'label', 'lang',
- 'longdesc', 'maxlength', 'media', 'method', 'multiple', 'name',
- 'nohref', 'noshade', 'nowrap', 'prompt', 'readonly', 'rel', 'rev',
- 'rows', 'rowspan', 'rules', 'scope', 'selected', 'shape', 'size',
- 'span', 'src', 'start', 'style', 'summary', 'tabindex', 'target',
- 'title', 'type', 'usemap', 'valign', 'value', 'vspace', 'width',
- 'xml:lang']
-
- mathml_attributes = ['actiontype', 'align', 'columnalign', 'columnalign',
- 'columnalign', 'columnlines', 'columnspacing', 'columnspan', 'depth',
- 'display', 'displaystyle', 'equalcolumns', 'equalrows', 'fence',
- 'fontstyle', 'fontweight', 'frame', 'height', 'linethickness', 'lspace',
- 'mathbackground', 'mathcolor', 'mathvariant', 'mathvariant', 'maxsize',
- 'minsize', 'other', 'rowalign', 'rowalign', 'rowalign', 'rowlines',
- 'rowspacing', 'rowspan', 'rspace', 'scriptlevel', 'selection',
- 'separator', 'stretchy', 'width', 'width', 'xlink:href', 'xlink:show',
- 'xlink:type', 'xmlns', 'xmlns:xlink']
-
- svg_attributes = ['accent-height', 'accumulate', 'additive', 'alphabetic',
- 'arabic-form', 'ascent', 'attributeName', 'attributeType',
- 'baseProfile', 'bbox', 'begin', 'by', 'calcMode', 'cap-height',
- 'class', 'color', 'color-rendering', 'content', 'cx', 'cy', 'd', 'dx',
- 'dy', 'descent', 'display', 'dur', 'end', 'fill', 'fill-rule',
- 'font-family', 'font-size', 'font-stretch', 'font-style',
- 'font-variant', 'font-weight', 'from', 'fx', 'fy', 'g1', 'g2',
- 'glyph-name', 'gradientUnits', 'hanging', 'height', 'horiz-adv-x',
- 'horiz-origin-x', 'id', 'ideographic', 'k', 'keyPoints',
- 'keySplines', 'keyTimes', 'lang', 'marker-end', 'marker-mid',
- 'marker-start', 'markerHeight', 'markerUnits', 'markerWidth',
- 'mathematical', 'max', 'min', 'name', 'offset', 'opacity', 'orient',
- 'origin', 'overline-position', 'overline-thickness', 'panose-1',
- 'path', 'pathLength', 'points', 'preserveAspectRatio', 'r', 'refX',
- 'refY', 'repeatCount', 'repeatDur', 'requiredExtensions',
- 'requiredFeatures', 'restart', 'rotate', 'rx', 'ry', 'slope',
- 'stemh', 'stemv', 'stop-color', 'stop-opacity',
- 'strikethrough-position', 'strikethrough-thickness', 'stroke',
- 'stroke-dasharray', 'stroke-dashoffset', 'stroke-linecap',
- 'stroke-linejoin', 'stroke-miterlimit', 'stroke-opacity',
- 'stroke-width', 'systemLanguage', 'target', 'text-anchor', 'to',
- 'transform', 'type', 'u1', 'u2', 'underline-position',
- 'underline-thickness', 'unicode', 'unicode-range', 'units-per-em',
- 'values', 'version', 'viewBox', 'visibility', 'width', 'widths', 'x',
- 'x-height', 'x1', 'x2', 'xlink:actuate', 'xlink:arcrole',
- 'xlink:href', 'xlink:role', 'xlink:show', 'xlink:title',
- 'xlink:type', 'xml:base', 'xml:lang', 'xml:space', 'xmlns',
- 'xmlns:xlink', 'y', 'y1', 'y2', 'zoomAndPan']
-
- attr_val_is_uri = ['href', 'src', 'cite', 'action', 'longdesc',
- 'xlink:href', 'xml:base']
-
- acceptable_css_properties = ['azimuth', 'background-color',
- 'border-bottom-color', 'border-collapse', 'border-color',
- 'border-left-color', 'border-right-color', 'border-top-color', 'clear',
- 'color', 'cursor', 'direction', 'display', 'elevation', 'float', 'font',
- 'font-family', 'font-size', 'font-style', 'font-variant', 'font-weight',
- 'height', 'letter-spacing', 'line-height', 'overflow', 'pause',
- 'pause-after', 'pause-before', 'pitch', 'pitch-range', 'richness',
- 'speak', 'speak-header', 'speak-numeral', 'speak-punctuation',
- 'speech-rate', 'stress', 'text-align', 'text-decoration', 'text-indent',
- 'unicode-bidi', 'vertical-align', 'voice-family', 'volume',
- 'white-space', 'width']
-
- acceptable_css_keywords = ['auto', 'aqua', 'black', 'block', 'blue',
- 'bold', 'both', 'bottom', 'brown', 'center', 'collapse', 'dashed',
- 'dotted', 'fuchsia', 'gray', 'green', '!important', 'italic', 'left',
- 'lime', 'maroon', 'medium', 'none', 'navy', 'normal', 'nowrap', 'olive',
- 'pointer', 'purple', 'red', 'right', 'solid', 'silver', 'teal', 'top',
- 'transparent', 'underline', 'white', 'yellow']
-
- acceptable_svg_properties = [ 'fill', 'fill-opacity', 'fill-rule',
- 'stroke', 'stroke-width', 'stroke-linecap', 'stroke-linejoin',
- 'stroke-opacity']
-
- acceptable_protocols = [ 'ed2k', 'ftp', 'http', 'https', 'irc',
- 'mailto', 'news', 'gopher', 'nntp', 'telnet', 'webcal',
- 'xmpp', 'callto', 'feed', 'urn', 'aim', 'rsync', 'tag',
- 'ssh', 'sftp', 'rtsp', 'afs' ]
-
- # subclasses may define their own versions of these constants
- allowed_elements = acceptable_elements + mathml_elements + svg_elements
- allowed_attributes = acceptable_attributes + mathml_attributes + svg_attributes
- allowed_css_properties = acceptable_css_properties
- allowed_css_keywords = acceptable_css_keywords
- allowed_svg_properties = acceptable_svg_properties
- allowed_protocols = acceptable_protocols
-
- # Sanitize the +html+, escaping all elements not in ALLOWED_ELEMENTS, and
- # stripping out all # attributes not in ALLOWED_ATTRIBUTES. Style
- # attributes are parsed, and a restricted set, # specified by
- # ALLOWED_CSS_PROPERTIES and ALLOWED_CSS_KEYWORDS, are allowed through.
- # attributes in ATTR_VAL_IS_URI are scanned, and only URI schemes specified
- # in ALLOWED_PROTOCOLS are allowed.
- #
- # sanitize_html('<script> do_nasty_stuff() </script>')
- # => <script> do_nasty_stuff() </script>
- # sanitize_html('<a href="javascript: sucker();">Click here for $100</a>')
- # => <a>Click here for $100</a>
- def sanitize_token(self, token):
- if token["type"] in ["StartTag", "EndTag", "EmptyTag"]:
- if token["name"] in self.allowed_elements:
- if token.has_key("data"):
- attrs = dict([(name,val) for name,val in token["data"][::-1] if name in self.allowed_attributes])
- for attr in self.attr_val_is_uri:
- if not attrs.has_key(attr): continue
- val_unescaped = re.sub("[`\000-\040\177-\240\s]+", '', unescape(attrs[attr])).lower()
- if re.match("^[a-z0-9][-+.a-z0-9]*:",val_unescaped) and (val_unescaped.split(':')[0] not in self.allowed_protocols):
- del attrs[attr]
- if attrs.has_key('style'):
- attrs['style'] = self.sanitize_css(attrs['style'])
- token["data"] = [[name,val] for name,val in attrs.items()]
- return token
- else:
- if token["type"] == "EndTag":
- token["data"] = "</%s>" % token["name"]
- elif token["data"]:
- attrs = ''.join([' %s="%s"' % (k,escape(v)) for k,v in token["data"]])
- token["data"] = "<%s%s>" % (token["name"],attrs)
- else:
- token["data"] = "<%s>" % token["name"]
- if token["type"] == "EmptyTag":
- token["data"]=token["data"][:-1] + "/>"
- token["type"] = "Characters"
- del token["name"]
- return token
- elif token["type"] == "Comment":
- pass
- else:
- return token
-
- def sanitize_css(self, style):
- # disallow urls
- style=re.compile('url\s*\(\s*[^\s)]+?\s*\)\s*').sub(' ',style)
-
- # gauntlet
- if not re.match("""^([:,;#%.\sa-zA-Z0-9!]|\w-\w|'[\s\w]+'|"[\s\w]+"|\([\d,\s]+\))*$""", style): return ''
- if not re.match("^(\s*[-\w]+\s*:\s*[^:;]*(;|$))*$", style): return ''
-
- clean = []
- for prop,value in re.findall("([-\w]+)\s*:\s*([^:;]*)",style):
- if not value: continue
- if prop.lower() in self.allowed_css_properties:
- clean.append(prop + ': ' + value + ';')
- elif prop.split('-')[0].lower() in ['background','border','margin','padding']:
- for keyword in value.split():
- if not keyword in self.acceptable_css_keywords and \
- not re.match("^(#[0-9a-f]+|rgb\(\d+%?,\d*%?,?\d*%?\)?|\d{0,2}\.?\d{0,2}(cm|em|ex|in|mm|pc|pt|px|%|,|\))?)$",keyword):
- break
- else:
- clean.append(prop + ': ' + value + ';')
- elif prop.lower() in self.allowed_svg_properties:
- clean.append(prop + ': ' + value + ';')
-
- return ' '.join(clean)
-
-class HTMLSanitizer(HTMLTokenizer, HTMLSanitizerMixin):
- def __init__(self, stream, encoding=None, parseMeta=True,
- lowercaseElementName=False, lowercaseAttrName=False):
- #Change case matching defaults as we only output lowercase html anyway
- #This solution doesn't seem ideal...
- HTMLTokenizer.__init__(self, stream, encoding, parseMeta,
- lowercaseElementName, lowercaseAttrName)
-
- def __iter__(self):
- for token in HTMLTokenizer.__iter__(self):
- token = self.sanitize_token(token)
- if token:
- yield token
Copied: trunk/lib/venus/planet/vendor/html5lib/sanitizer.py (from rev 656, branches/sucs-site/lib/venus/planet/vendor/html5lib/sanitizer.py)
===================================================================
--- trunk/lib/venus/planet/vendor/html5lib/sanitizer.py (rev 0)
+++ trunk/lib/venus/planet/vendor/html5lib/sanitizer.py 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,202 @@
+import re
+from xml.sax.saxutils import escape, unescape
+from tokenizer import HTMLTokenizer
+
+class HTMLSanitizerMixin(object):
+ """ sanitization of XHTML+MathML+SVG and of inline style attributes."""
+
+ acceptable_elements = ['a', 'abbr', 'acronym', 'address', 'area', 'b',
+ 'big', 'blockquote', 'br', 'button', 'caption', 'center', 'cite',
+ 'code', 'col', 'colgroup', 'dd', 'del', 'dfn', 'dir', 'div', 'dl', 'dt',
+ 'em', 'fieldset', 'font', 'form', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6',
+ 'hr', 'i', 'img', 'input', 'ins', 'kbd', 'label', 'legend', 'li', 'map',
+ 'menu', 'ol', 'optgroup', 'option', 'p', 'pre', 'q', 's', 'samp',
+ 'select', 'small', 'span', 'strike', 'strong', 'sub', 'sup', 'table',
+ 'tbody', 'td', 'textarea', 'tfoot', 'th', 'thead', 'tr', 'tt', 'u',
+ 'ul', 'var']
+
+ mathml_elements = ['maction', 'math', 'merror', 'mfrac', 'mi',
+ 'mmultiscripts', 'mn', 'mo', 'mover', 'mpadded', 'mphantom',
+ 'mprescripts', 'mroot', 'mrow', 'mspace', 'msqrt', 'mstyle', 'msub',
+ 'msubsup', 'msup', 'mtable', 'mtd', 'mtext', 'mtr', 'munder',
+ 'munderover', 'none']
+
+ svg_elements = ['a', 'animate', 'animateColor', 'animateMotion',
+ 'animateTransform', 'circle', 'defs', 'desc', 'ellipse', 'font-face',
+ 'font-face-name', 'font-face-src', 'g', 'glyph', 'hkern', 'image',
+ 'linearGradient', 'line', 'marker', 'metadata', 'missing-glyph',
+ 'mpath', 'path', 'polygon', 'polyline', 'radialGradient', 'rect',
+ 'set', 'stop', 'svg', 'switch', 'text', 'title', 'tspan', 'use']
+
+ acceptable_attributes = ['abbr', 'accept', 'accept-charset', 'accesskey',
+ 'action', 'align', 'alt', 'axis', 'border', 'cellpadding',
+ 'cellspacing', 'char', 'charoff', 'charset', 'checked', 'cite', 'class',
+ 'clear', 'cols', 'colspan', 'color', 'compact', 'coords', 'datetime',
+ 'dir', 'disabled', 'enctype', 'for', 'frame', 'headers', 'height',
+ 'href', 'hreflang', 'hspace', 'id', 'ismap', 'label', 'lang',
+ 'longdesc', 'maxlength', 'media', 'method', 'multiple', 'name',
+ 'nohref', 'noshade', 'nowrap', 'prompt', 'readonly', 'rel', 'rev',
+ 'rows', 'rowspan', 'rules', 'scope', 'selected', 'shape', 'size',
+ 'span', 'src', 'start', 'style', 'summary', 'tabindex', 'target',
+ 'title', 'type', 'usemap', 'valign', 'value', 'vspace', 'width',
+ 'xml:lang']
+
+ mathml_attributes = ['actiontype', 'align', 'columnalign', 'columnalign',
+ 'columnalign', 'columnlines', 'columnspacing', 'columnspan', 'depth',
+ 'display', 'displaystyle', 'equalcolumns', 'equalrows', 'fence',
+ 'fontstyle', 'fontweight', 'frame', 'height', 'linethickness', 'lspace',
+ 'mathbackground', 'mathcolor', 'mathvariant', 'mathvariant', 'maxsize',
+ 'minsize', 'other', 'rowalign', 'rowalign', 'rowalign', 'rowlines',
+ 'rowspacing', 'rowspan', 'rspace', 'scriptlevel', 'selection',
+ 'separator', 'stretchy', 'width', 'width', 'xlink:href', 'xlink:show',
+ 'xlink:type', 'xmlns', 'xmlns:xlink']
+
+ svg_attributes = ['accent-height', 'accumulate', 'additive', 'alphabetic',
+ 'arabic-form', 'ascent', 'attributeName', 'attributeType',
+ 'baseProfile', 'bbox', 'begin', 'by', 'calcMode', 'cap-height',
+ 'class', 'color', 'color-rendering', 'content', 'cx', 'cy', 'd', 'dx',
+ 'dy', 'descent', 'display', 'dur', 'end', 'fill', 'fill-rule',
+ 'font-family', 'font-size', 'font-stretch', 'font-style',
+ 'font-variant', 'font-weight', 'from', 'fx', 'fy', 'g1', 'g2',
+ 'glyph-name', 'gradientUnits', 'hanging', 'height', 'horiz-adv-x',
+ 'horiz-origin-x', 'id', 'ideographic', 'k', 'keyPoints',
+ 'keySplines', 'keyTimes', 'lang', 'marker-end', 'marker-mid',
+ 'marker-start', 'markerHeight', 'markerUnits', 'markerWidth',
+ 'mathematical', 'max', 'min', 'name', 'offset', 'opacity', 'orient',
+ 'origin', 'overline-position', 'overline-thickness', 'panose-1',
+ 'path', 'pathLength', 'points', 'preserveAspectRatio', 'r', 'refX',
+ 'refY', 'repeatCount', 'repeatDur', 'requiredExtensions',
+ 'requiredFeatures', 'restart', 'rotate', 'rx', 'ry', 'slope',
+ 'stemh', 'stemv', 'stop-color', 'stop-opacity',
+ 'strikethrough-position', 'strikethrough-thickness', 'stroke',
+ 'stroke-dasharray', 'stroke-dashoffset', 'stroke-linecap',
+ 'stroke-linejoin', 'stroke-miterlimit', 'stroke-opacity',
+ 'stroke-width', 'systemLanguage', 'target', 'text-anchor', 'to',
+ 'transform', 'type', 'u1', 'u2', 'underline-position',
+ 'underline-thickness', 'unicode', 'unicode-range', 'units-per-em',
+ 'values', 'version', 'viewBox', 'visibility', 'width', 'widths', 'x',
+ 'x-height', 'x1', 'x2', 'xlink:actuate', 'xlink:arcrole',
+ 'xlink:href', 'xlink:role', 'xlink:show', 'xlink:title',
+ 'xlink:type', 'xml:base', 'xml:lang', 'xml:space', 'xmlns',
+ 'xmlns:xlink', 'y', 'y1', 'y2', 'zoomAndPan']
+
+ attr_val_is_uri = ['href', 'src', 'cite', 'action', 'longdesc',
+ 'xlink:href', 'xml:base']
+
+ acceptable_css_properties = ['azimuth', 'background-color',
+ 'border-bottom-color', 'border-collapse', 'border-color',
+ 'border-left-color', 'border-right-color', 'border-top-color', 'clear',
+ 'color', 'cursor', 'direction', 'display', 'elevation', 'float', 'font',
+ 'font-family', 'font-size', 'font-style', 'font-variant', 'font-weight',
+ 'height', 'letter-spacing', 'line-height', 'overflow', 'pause',
+ 'pause-after', 'pause-before', 'pitch', 'pitch-range', 'richness',
+ 'speak', 'speak-header', 'speak-numeral', 'speak-punctuation',
+ 'speech-rate', 'stress', 'text-align', 'text-decoration', 'text-indent',
+ 'unicode-bidi', 'vertical-align', 'voice-family', 'volume',
+ 'white-space', 'width']
+
+ acceptable_css_keywords = ['auto', 'aqua', 'black', 'block', 'blue',
+ 'bold', 'both', 'bottom', 'brown', 'center', 'collapse', 'dashed',
+ 'dotted', 'fuchsia', 'gray', 'green', '!important', 'italic', 'left',
+ 'lime', 'maroon', 'medium', 'none', 'navy', 'normal', 'nowrap', 'olive',
+ 'pointer', 'purple', 'red', 'right', 'solid', 'silver', 'teal', 'top',
+ 'transparent', 'underline', 'white', 'yellow']
+
+ acceptable_svg_properties = [ 'fill', 'fill-opacity', 'fill-rule',
+ 'stroke', 'stroke-width', 'stroke-linecap', 'stroke-linejoin',
+ 'stroke-opacity']
+
+ acceptable_protocols = [ 'ed2k', 'ftp', 'http', 'https', 'irc',
+ 'mailto', 'news', 'gopher', 'nntp', 'telnet', 'webcal',
+ 'xmpp', 'callto', 'feed', 'urn', 'aim', 'rsync', 'tag',
+ 'ssh', 'sftp', 'rtsp', 'afs' ]
+
+ # subclasses may define their own versions of these constants
+ allowed_elements = acceptable_elements + mathml_elements + svg_elements
+ allowed_attributes = acceptable_attributes + mathml_attributes + svg_attributes
+ allowed_css_properties = acceptable_css_properties
+ allowed_css_keywords = acceptable_css_keywords
+ allowed_svg_properties = acceptable_svg_properties
+ allowed_protocols = acceptable_protocols
+
+ # Sanitize the +html+, escaping all elements not in ALLOWED_ELEMENTS, and
+ # stripping out all # attributes not in ALLOWED_ATTRIBUTES. Style
+ # attributes are parsed, and a restricted set, # specified by
+ # ALLOWED_CSS_PROPERTIES and ALLOWED_CSS_KEYWORDS, are allowed through.
+ # attributes in ATTR_VAL_IS_URI are scanned, and only URI schemes specified
+ # in ALLOWED_PROTOCOLS are allowed.
+ #
+ # sanitize_html('<script> do_nasty_stuff() </script>')
+ # => <script> do_nasty_stuff() </script>
+ # sanitize_html('<a href="javascript: sucker();">Click here for $100</a>')
+ # => <a>Click here for $100</a>
+ def sanitize_token(self, token):
+ if token["type"] in ["StartTag", "EndTag", "EmptyTag"]:
+ if token["name"] in self.allowed_elements:
+ if token.has_key("data"):
+ attrs = dict([(name,val) for name,val in token["data"][::-1] if name in self.allowed_attributes])
+ for attr in self.attr_val_is_uri:
+ if not attrs.has_key(attr): continue
+ val_unescaped = re.sub("[`\000-\040\177-\240\s]+", '', unescape(attrs[attr])).lower()
+ if re.match("^[a-z0-9][-+.a-z0-9]*:",val_unescaped) and (val_unescaped.split(':')[0] not in self.allowed_protocols):
+ del attrs[attr]
+ if attrs.has_key('style'):
+ attrs['style'] = self.sanitize_css(attrs['style'])
+ token["data"] = [[name,val] for name,val in attrs.items()]
+ return token
+ else:
+ if token["type"] == "EndTag":
+ token["data"] = "</%s>" % token["name"]
+ elif token["data"]:
+ attrs = ''.join([' %s="%s"' % (k,escape(v)) for k,v in token["data"]])
+ token["data"] = "<%s%s>" % (token["name"],attrs)
+ else:
+ token["data"] = "<%s>" % token["name"]
+ if token["type"] == "EmptyTag":
+ token["data"]=token["data"][:-1] + "/>"
+ token["type"] = "Characters"
+ del token["name"]
+ return token
+ elif token["type"] == "Comment":
+ pass
+ else:
+ return token
+
+ def sanitize_css(self, style):
+ # disallow urls
+ style=re.compile('url\s*\(\s*[^\s)]+?\s*\)\s*').sub(' ',style)
+
+ # gauntlet
+ if not re.match("""^([:,;#%.\sa-zA-Z0-9!]|\w-\w|'[\s\w]+'|"[\s\w]+"|\([\d,\s]+\))*$""", style): return ''
+ if not re.match("^(\s*[-\w]+\s*:\s*[^:;]*(;|$))*$", style): return ''
+
+ clean = []
+ for prop,value in re.findall("([-\w]+)\s*:\s*([^:;]*)",style):
+ if not value: continue
+ if prop.lower() in self.allowed_css_properties:
+ clean.append(prop + ': ' + value + ';')
+ elif prop.split('-')[0].lower() in ['background','border','margin','padding']:
+ for keyword in value.split():
+ if not keyword in self.acceptable_css_keywords and \
+ not re.match("^(#[0-9a-f]+|rgb\(\d+%?,\d*%?,?\d*%?\)?|\d{0,2}\.?\d{0,2}(cm|em|ex|in|mm|pc|pt|px|%|,|\))?)$",keyword):
+ break
+ else:
+ clean.append(prop + ': ' + value + ';')
+ elif prop.lower() in self.allowed_svg_properties:
+ clean.append(prop + ': ' + value + ';')
+
+ return ' '.join(clean)
+
+class HTMLSanitizer(HTMLTokenizer, HTMLSanitizerMixin):
+ def __init__(self, stream, encoding=None, parseMeta=True,
+ lowercaseElementName=False, lowercaseAttrName=False):
+ #Change case matching defaults as we only output lowercase html anyway
+ #This solution doesn't seem ideal...
+ HTMLTokenizer.__init__(self, stream, encoding, parseMeta,
+ lowercaseElementName, lowercaseAttrName)
+
+ def __iter__(self):
+ for token in HTMLTokenizer.__iter__(self):
+ token = self.sanitize_token(token)
+ if token:
+ yield token
Deleted: trunk/lib/venus/planet/vendor/html5lib/serializer/__init__.py
===================================================================
--- branches/sucs-site/lib/venus/planet/vendor/html5lib/serializer/__init__.py 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/lib/venus/planet/vendor/html5lib/serializer/__init__.py 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,3 +0,0 @@
-
-from htmlserializer import HTMLSerializer
-from xhtmlserializer import XHTMLSerializer
Copied: trunk/lib/venus/planet/vendor/html5lib/serializer/__init__.py (from rev 656, branches/sucs-site/lib/venus/planet/vendor/html5lib/serializer/__init__.py)
===================================================================
--- trunk/lib/venus/planet/vendor/html5lib/serializer/__init__.py (rev 0)
+++ trunk/lib/venus/planet/vendor/html5lib/serializer/__init__.py 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,3 @@
+
+from htmlserializer import HTMLSerializer
+from xhtmlserializer import XHTMLSerializer
Deleted: trunk/lib/venus/planet/vendor/html5lib/serializer/htmlserializer.py
===================================================================
--- branches/sucs-site/lib/venus/planet/vendor/html5lib/serializer/htmlserializer.py 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/lib/venus/planet/vendor/html5lib/serializer/htmlserializer.py 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,218 +0,0 @@
-try:
- frozenset
-except NameError:
- # Import from the sets module for python 2.3
- from sets import ImmutableSet as frozenset
-
-import gettext
-_ = gettext.gettext
-
-from html5lib.constants import voidElements, booleanAttributes, spaceCharacters
-from html5lib.constants import rcdataElements
-
-from xml.sax.saxutils import escape
-
-spaceCharacters = u"".join(spaceCharacters)
-
-try:
- from codecs import register_error, xmlcharrefreplace_errors
-except ImportError:
- unicode_encode_errors = "strict"
-else:
- unicode_encode_errors = "htmlentityreplace"
-
- from html5lib.constants import entities
-
- encode_entity_map = {}
- for k, v in entities.items():
- if v != "&" and encode_entity_map.get(v) != k.lower():
- # prefer < over < and similarly for &, >, etc.
- encode_entity_map[v] = k
-
- def htmlentityreplace_errors(exc):
- if isinstance(exc, (UnicodeEncodeError, UnicodeTranslateError)):
- res = []
- for c in exc.object[exc.start:exc.end]:
- e = encode_entity_map.get(c)
- if e:
- res.append("&")
- res.append(e)
- if not e.endswith(";"):
- res.append(";")
- else:
- res.append(c.encode(exc.encoding, "xmlcharrefreplace"))
- return (u"".join(res), exc.end)
- else:
- return xmlcharrefreplace_errors(exc)
-
- register_error(unicode_encode_errors, htmlentityreplace_errors)
-
- del register_error
-
-def encode(text, encoding):
- return text.encode(encoding, unicode_encode_errors)
-
-class HTMLSerializer(object):
-
- quote_attr_values = False
- quote_char = '"'
- use_best_quote_char = True
- minimize_boolean_attributes = True
-
- use_trailing_solidus = False
- space_before_trailing_solidus = True
- escape_lt_in_attrs = False
- escape_rcdata = False
-
- inject_meta_charset = True
- strip_whitespace = False
- sanitize = False
- omit_optional_tags = True
-
- options = ("quote_attr_values", "quote_char", "use_best_quote_char",
- "minimize_boolean_attributes", "use_trailing_solidus",
- "space_before_trailing_solidus", "omit_optional_tags",
- "strip_whitespace", "inject_meta_charset", "escape_lt_in_attrs",
- "escape_rcdata", 'use_trailing_solidus', "sanitize")
-
- def __init__(self, **kwargs):
- if kwargs.has_key('quote_char'):
- self.use_best_quote_char = False
- for attr in self.options:
- setattr(self, attr, kwargs.get(attr, getattr(self, attr)))
- self.errors = []
- self.strict = False
-
- def serialize(self, treewalker, encoding=None):
- in_cdata = False
- self.errors = []
- if encoding and self.inject_meta_charset:
- from html5lib.filters.inject_meta_charset import Filter
- treewalker = Filter(treewalker, encoding)
- # XXX: WhitespaceFilter should be used before OptionalTagFilter
- # for maximum efficiently of this latter filter
- if self.strip_whitespace:
- from html5lib.filters.whitespace import Filter
- treewalker = Filter(treewalker)
- if self.sanitize:
- from html5lib.filters.sanitizer import Filter
- treewalker = Filter(treewalker)
- if self.omit_optional_tags:
- from html5lib.filters.optionaltags import Filter
- treewalker = Filter(treewalker)
- for token in treewalker:
- type = token["type"]
- if type == "Doctype":
- doctype = u"<!DOCTYPE %s>" % token["name"]
- if encoding:
- yield doctype.encode(encoding)
- else:
- yield doctype
-
- elif type in ("Characters", "SpaceCharacters"):
- if type == "SpaceCharacters" or in_cdata:
- if in_cdata and token["data"].find("</") >= 0:
- self.serializeError(_("Unexpected </ in CDATA"))
- if encoding:
- yield token["data"].encode(encoding, "strict")
- else:
- yield token["data"]
- elif encoding:
- yield encode(escape(token["data"]), encoding)
- else:
- yield escape(token["data"])
-
- elif type in ("StartTag", "EmptyTag"):
- name = token["name"]
- if name in rcdataElements and not self.escape_rcdata:
- in_cdata = True
- elif in_cdata:
- self.serializeError(_("Unexpected child element of a CDATA element"))
- attrs = token["data"]
- if hasattr(attrs, "items"):
- attrs = attrs.items()
- attrs.sort()
- attributes = []
- for k,v in attrs:
- if encoding:
- k = k.encode(encoding, "strict")
- attributes.append(' ')
-
- attributes.append(k)
- if not self.minimize_boolean_attributes or \
- (k not in booleanAttributes.get(name, tuple()) \
- and k not in booleanAttributes.get("", tuple())):
- attributes.append("=")
- if self.quote_attr_values or not v:
- quote_attr = True
- else:
- quote_attr = reduce(lambda x,y: x or (y in v),
- spaceCharacters + "<>\"'", False)
- v = v.replace("&", "&")
- if self.escape_lt_in_attrs: v = v.replace("<", "<")
- if encoding:
- v = encode(v, encoding)
- if quote_attr:
- quote_char = self.quote_char
- if self.use_best_quote_char:
- if "'" in v and '"' not in v:
- quote_char = '"'
- elif '"' in v and "'" not in v:
- quote_char = "'"
- if quote_char == "'":
- v = v.replace("'", "'")
- else:
- v = v.replace('"', """)
- attributes.append(quote_char)
- attributes.append(v)
- attributes.append(quote_char)
- else:
- attributes.append(v)
- if name in voidElements and self.use_trailing_solidus:
- if self.space_before_trailing_solidus:
- attributes.append(" /")
- else:
- attributes.append("/")
- if encoding:
- yield "<%s%s>" % (name.encode(encoding, "strict"), "".join(attributes))
- else:
- yield u"<%s%s>" % (name, u"".join(attributes))
-
- elif type == "EndTag":
- name = token["name"]
- if name in rcdataElements:
- in_cdata = False
- elif in_cdata:
- self.serializeError(_("Unexpected child element of a CDATA element"))
- end_tag = u"</%s>" % name
- if encoding:
- end_tag = end_tag.encode(encoding, "strict")
- yield end_tag
-
- elif type == "Comment":
- data = token["data"]
- if data.find("--") >= 0:
- self.serializeError(_("Comment contains --"))
- comment = u"<!--%s-->" % token["data"]
- if encoding:
- comment = comment.encode(encoding, unicode_encode_errors)
- yield comment
-
- else:
- self.serializeError(token["data"])
-
- def render(self, treewalker, encoding=None):
- if encoding:
- return "".join(list(self.serialize(treewalker, encoding)))
- else:
- return u"".join(list(self.serialize(treewalker)))
-
- def serializeError(self, data="XXX ERROR MESSAGE NEEDED"):
- # XXX The idea is to make data mandatory.
- self.errors.append(data)
- if self.strict:
- raise SerializeError
-
-def SerializeError(Exception):
- """Error in serialized tree"""
- pass
Copied: trunk/lib/venus/planet/vendor/html5lib/serializer/htmlserializer.py (from rev 656, branches/sucs-site/lib/venus/planet/vendor/html5lib/serializer/htmlserializer.py)
===================================================================
--- trunk/lib/venus/planet/vendor/html5lib/serializer/htmlserializer.py (rev 0)
+++ trunk/lib/venus/planet/vendor/html5lib/serializer/htmlserializer.py 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,218 @@
+try:
+ frozenset
+except NameError:
+ # Import from the sets module for python 2.3
+ from sets import ImmutableSet as frozenset
+
+import gettext
+_ = gettext.gettext
+
+from html5lib.constants import voidElements, booleanAttributes, spaceCharacters
+from html5lib.constants import rcdataElements
+
+from xml.sax.saxutils import escape
+
+spaceCharacters = u"".join(spaceCharacters)
+
+try:
+ from codecs import register_error, xmlcharrefreplace_errors
+except ImportError:
+ unicode_encode_errors = "strict"
+else:
+ unicode_encode_errors = "htmlentityreplace"
+
+ from html5lib.constants import entities
+
+ encode_entity_map = {}
+ for k, v in entities.items():
+ if v != "&" and encode_entity_map.get(v) != k.lower():
+ # prefer < over < and similarly for &, >, etc.
+ encode_entity_map[v] = k
+
+ def htmlentityreplace_errors(exc):
+ if isinstance(exc, (UnicodeEncodeError, UnicodeTranslateError)):
+ res = []
+ for c in exc.object[exc.start:exc.end]:
+ e = encode_entity_map.get(c)
+ if e:
+ res.append("&")
+ res.append(e)
+ if not e.endswith(";"):
+ res.append(";")
+ else:
+ res.append(c.encode(exc.encoding, "xmlcharrefreplace"))
+ return (u"".join(res), exc.end)
+ else:
+ return xmlcharrefreplace_errors(exc)
+
+ register_error(unicode_encode_errors, htmlentityreplace_errors)
+
+ del register_error
+
+def encode(text, encoding):
+ return text.encode(encoding, unicode_encode_errors)
+
+class HTMLSerializer(object):
+
+ quote_attr_values = False
+ quote_char = '"'
+ use_best_quote_char = True
+ minimize_boolean_attributes = True
+
+ use_trailing_solidus = False
+ space_before_trailing_solidus = True
+ escape_lt_in_attrs = False
+ escape_rcdata = False
+
+ inject_meta_charset = True
+ strip_whitespace = False
+ sanitize = False
+ omit_optional_tags = True
+
+ options = ("quote_attr_values", "quote_char", "use_best_quote_char",
+ "minimize_boolean_attributes", "use_trailing_solidus",
+ "space_before_trailing_solidus", "omit_optional_tags",
+ "strip_whitespace", "inject_meta_charset", "escape_lt_in_attrs",
+ "escape_rcdata", 'use_trailing_solidus', "sanitize")
+
+ def __init__(self, **kwargs):
+ if kwargs.has_key('quote_char'):
+ self.use_best_quote_char = False
+ for attr in self.options:
+ setattr(self, attr, kwargs.get(attr, getattr(self, attr)))
+ self.errors = []
+ self.strict = False
+
+ def serialize(self, treewalker, encoding=None):
+ in_cdata = False
+ self.errors = []
+ if encoding and self.inject_meta_charset:
+ from html5lib.filters.inject_meta_charset import Filter
+ treewalker = Filter(treewalker, encoding)
+ # XXX: WhitespaceFilter should be used before OptionalTagFilter
+ # for maximum efficiently of this latter filter
+ if self.strip_whitespace:
+ from html5lib.filters.whitespace import Filter
+ treewalker = Filter(treewalker)
+ if self.sanitize:
+ from html5lib.filters.sanitizer import Filter
+ treewalker = Filter(treewalker)
+ if self.omit_optional_tags:
+ from html5lib.filters.optionaltags import Filter
+ treewalker = Filter(treewalker)
+ for token in treewalker:
+ type = token["type"]
+ if type == "Doctype":
+ doctype = u"<!DOCTYPE %s>" % token["name"]
+ if encoding:
+ yield doctype.encode(encoding)
+ else:
+ yield doctype
+
+ elif type in ("Characters", "SpaceCharacters"):
+ if type == "SpaceCharacters" or in_cdata:
+ if in_cdata and token["data"].find("</") >= 0:
+ self.serializeError(_("Unexpected </ in CDATA"))
+ if encoding:
+ yield token["data"].encode(encoding, "strict")
+ else:
+ yield token["data"]
+ elif encoding:
+ yield encode(escape(token["data"]), encoding)
+ else:
+ yield escape(token["data"])
+
+ elif type in ("StartTag", "EmptyTag"):
+ name = token["name"]
+ if name in rcdataElements and not self.escape_rcdata:
+ in_cdata = True
+ elif in_cdata:
+ self.serializeError(_("Unexpected child element of a CDATA element"))
+ attrs = token["data"]
+ if hasattr(attrs, "items"):
+ attrs = attrs.items()
+ attrs.sort()
+ attributes = []
+ for k,v in attrs:
+ if encoding:
+ k = k.encode(encoding, "strict")
+ attributes.append(' ')
+
+ attributes.append(k)
+ if not self.minimize_boolean_attributes or \
+ (k not in booleanAttributes.get(name, tuple()) \
+ and k not in booleanAttributes.get("", tuple())):
+ attributes.append("=")
+ if self.quote_attr_values or not v:
+ quote_attr = True
+ else:
+ quote_attr = reduce(lambda x,y: x or (y in v),
+ spaceCharacters + "<>\"'", False)
+ v = v.replace("&", "&")
+ if self.escape_lt_in_attrs: v = v.replace("<", "<")
+ if encoding:
+ v = encode(v, encoding)
+ if quote_attr:
+ quote_char = self.quote_char
+ if self.use_best_quote_char:
+ if "'" in v and '"' not in v:
+ quote_char = '"'
+ elif '"' in v and "'" not in v:
+ quote_char = "'"
+ if quote_char == "'":
+ v = v.replace("'", "'")
+ else:
+ v = v.replace('"', """)
+ attributes.append(quote_char)
+ attributes.append(v)
+ attributes.append(quote_char)
+ else:
+ attributes.append(v)
+ if name in voidElements and self.use_trailing_solidus:
+ if self.space_before_trailing_solidus:
+ attributes.append(" /")
+ else:
+ attributes.append("/")
+ if encoding:
+ yield "<%s%s>" % (name.encode(encoding, "strict"), "".join(attributes))
+ else:
+ yield u"<%s%s>" % (name, u"".join(attributes))
+
+ elif type == "EndTag":
+ name = token["name"]
+ if name in rcdataElements:
+ in_cdata = False
+ elif in_cdata:
+ self.serializeError(_("Unexpected child element of a CDATA element"))
+ end_tag = u"</%s>" % name
+ if encoding:
+ end_tag = end_tag.encode(encoding, "strict")
+ yield end_tag
+
+ elif type == "Comment":
+ data = token["data"]
+ if data.find("--") >= 0:
+ self.serializeError(_("Comment contains --"))
+ comment = u"<!--%s-->" % token["data"]
+ if encoding:
+ comment = comment.encode(encoding, unicode_encode_errors)
+ yield comment
+
+ else:
+ self.serializeError(token["data"])
+
+ def render(self, treewalker, encoding=None):
+ if encoding:
+ return "".join(list(self.serialize(treewalker, encoding)))
+ else:
+ return u"".join(list(self.serialize(treewalker)))
+
+ def serializeError(self, data="XXX ERROR MESSAGE NEEDED"):
+ # XXX The idea is to make data mandatory.
+ self.errors.append(data)
+ if self.strict:
+ raise SerializeError
+
+def SerializeError(Exception):
+ """Error in serialized tree"""
+ pass
Deleted: trunk/lib/venus/planet/vendor/html5lib/serializer/xhtmlserializer.py
===================================================================
--- branches/sucs-site/lib/venus/planet/vendor/html5lib/serializer/xhtmlserializer.py 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/lib/venus/planet/vendor/html5lib/serializer/xhtmlserializer.py 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,9 +0,0 @@
-from htmlserializer import HTMLSerializer
-
-class XHTMLSerializer(HTMLSerializer):
- quote_attr_values = True
- minimize_boolean_attributes = False
- use_trailing_solidus = True
- escape_lt_in_attrs = True
- omit_optional_tags = False
- escape_rcdata = True
Copied: trunk/lib/venus/planet/vendor/html5lib/serializer/xhtmlserializer.py (from rev 656, branches/sucs-site/lib/venus/planet/vendor/html5lib/serializer/xhtmlserializer.py)
===================================================================
--- trunk/lib/venus/planet/vendor/html5lib/serializer/xhtmlserializer.py (rev 0)
+++ trunk/lib/venus/planet/vendor/html5lib/serializer/xhtmlserializer.py 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,9 @@
+from htmlserializer import HTMLSerializer
+
+class XHTMLSerializer(HTMLSerializer):
+ quote_attr_values = True
+ minimize_boolean_attributes = False
+ use_trailing_solidus = True
+ escape_lt_in_attrs = True
+ omit_optional_tags = False
+ escape_rcdata = True
Deleted: trunk/lib/venus/planet/vendor/html5lib/tokenizer.py
===================================================================
--- branches/sucs-site/lib/venus/planet/vendor/html5lib/tokenizer.py 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/lib/venus/planet/vendor/html5lib/tokenizer.py 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,1009 +0,0 @@
-try:
- frozenset
-except NameError:
- # Import from the sets module for python 2.3
- from sets import Set as set
- from sets import ImmutableSet as frozenset
-import gettext
-_ = gettext.gettext
-
-from constants import contentModelFlags, spaceCharacters
-from constants import entitiesWindows1252, entities
-from constants import asciiLowercase, asciiLetters, asciiUpper2Lower
-from constants import digits, hexDigits, EOF
-
-from inputstream import HTMLInputStream
-
-class HTMLTokenizer(object):
- """ This class takes care of tokenizing HTML.
-
- * self.currentToken
- Holds the token that is currently being processed.
-
- * self.state
- Holds a reference to the method to be invoked... XXX
-
- * self.states
- Holds a mapping between states and methods that implement the state.
-
- * self.stream
- Points to HTMLInputStream object.
- """
-
- # XXX need to fix documentation
-
- def __init__(self, stream, encoding=None, parseMeta=True,
- lowercaseElementName=True, lowercaseAttrName=True,):
- self.stream = HTMLInputStream(stream, encoding, parseMeta)
-
- #Perform case conversions?
- self.lowercaseElementName = lowercaseElementName
- self.lowercaseAttrName = lowercaseAttrName
-
- self.states = {
- "data":self.dataState,
- "entityData":self.entityDataState,
- "tagOpen":self.tagOpenState,
- "closeTagOpen":self.closeTagOpenState,
- "tagName":self.tagNameState,
- "beforeAttributeName":self.beforeAttributeNameState,
- "attributeName":self.attributeNameState,
- "afterAttributeName":self.afterAttributeNameState,
- "beforeAttributeValue":self.beforeAttributeValueState,
- "attributeValueDoubleQuoted":self.attributeValueDoubleQuotedState,
- "attributeValueSingleQuoted":self.attributeValueSingleQuotedState,
- "attributeValueUnQuoted":self.attributeValueUnQuotedState,
- "bogusComment":self.bogusCommentState,
- "markupDeclarationOpen":self.markupDeclarationOpenState,
- "commentStart":self.commentStartState,
- "commentStartDash":self.commentStartDashState,
- "comment":self.commentState,
- "commentEndDash":self.commentEndDashState,
- "commentEnd":self.commentEndState,
- "doctype":self.doctypeState,
- "beforeDoctypeName":self.beforeDoctypeNameState,
- "doctypeName":self.doctypeNameState,
- "afterDoctypeName":self.afterDoctypeNameState,
- "beforeDoctypePublicIdentifier":self.beforeDoctypePublicIdentifierState,
- "doctypePublicIdentifierDoubleQuoted":self.doctypePublicIdentifierDoubleQuotedState,
- "doctypePublicIdentifierSingleQuoted":self.doctypePublicIdentifierSingleQuotedState,
- "afterDoctypePublicIdentifier":self.afterDoctypePublicIdentifierState,
- "beforeDoctypeSystemIdentifier":self.beforeDoctypeSystemIdentifierState,
- "doctypeSystemIdentifierDoubleQuoted":self.doctypeSystemIdentifierDoubleQuotedState,
- "doctypeSystemIdentifierSingleQuoted":self.doctypeSystemIdentifierSingleQuotedState,
- "afterDoctypeSystemIdentifier":self.afterDoctypeSystemIdentifierState,
- "bogusDoctype":self.bogusDoctypeState
- }
-
- # Setup the initial tokenizer state
- self.contentModelFlag = contentModelFlags["PCDATA"]
- self.escapeFlag = False
- self.lastFourChars = []
- self.state = self.states["data"]
-
- # The current token being created
- self.currentToken = None
-
- # Tokens to be processed.
- self.tokenQueue = []
-
- def __iter__(self):
- """ This is where the magic happens.
-
- We do our usually processing through the states and when we have a token
- to return we yield the token which pauses processing until the next token
- is requested.
- """
- self.tokenQueue = []
- # Start processing. When EOF is reached self.state will return False
- # instead of True and the loop will terminate.
- while self.state():
- while self.stream.errors:
- yield {"type": "ParseError", "data": self.stream.errors.pop(0)}
- while self.tokenQueue:
- yield self.tokenQueue.pop(0)
-
- # Below are various helper functions the tokenizer states use worked out.
- def processSolidusInTag(self):
- """If the next character is a '>', convert the currentToken into
- an EmptyTag
- """
-
- # We need to consume another character to make sure it's a ">"
- data = self.stream.char()
-
- if self.currentToken["type"] == "StartTag" and data == u">":
- self.currentToken["type"] = "EmptyTag"
- else:
- self.tokenQueue.append({"type": "ParseError", "data":
- _(u"Solidus (/) incorrectly placed in tag.")})
-
- # The character we just consumed need to be put back on the stack so it
- # doesn't get lost...
- self.stream.unget(data)
-
- def consumeNumberEntity(self, isHex):
- """This function returns either U+FFFD or the character based on the
- decimal or hexadecimal representation. It also discards ";" if present.
- If not present self.tokenQueue.append({"type": "ParseError"}) is invoked.
- """
-
- # XXX More need to be done here. For instance, #13 should prolly be
- # converted to #10 so we don't get \r (#13 is \r right?) in the DOM and
- # such. Thoughts on this appreciated.
- allowed = digits
- radix = 10
- if isHex:
- allowed = hexDigits
- radix = 16
-
- charStack = []
-
- # Consume all the characters that are in range while making sure we
- # don't hit an EOF.
- c = self.stream.char()
- while c in allowed and c is not EOF:
- charStack.append(c)
- c = self.stream.char()
-
- # Convert the set of characters consumed to an int.
- charAsInt = int("".join(charStack), radix)
-
- if charAsInt == 13:
- self.tokenQueue.append({"type": "ParseError", "data":
- _(u"Incorrect CR newline entity. Replaced with LF.")})
- charAsInt = 10
- elif 127 < charAsInt < 160:
- # If the integer is between 127 and 160 (so 128 and bigger and 159
- # and smaller) we need to do the "windows trick".
- self.tokenQueue.append({"type": "ParseError", "data":
- _(u"Entity used with illegal number (windows-1252 reference).")})
-
- charAsInt = entitiesWindows1252[charAsInt - 128]
-
- # 0 is not a good number, neither are illegal Unicode code points (higher than 0x10FFFF) or surrogate characters (in the range 0xD800 to 0xDFFF).
- if 0 < charAsInt and charAsInt <= 1114111 and not (55296 <= charAsInt and charAsInt <= 57343):
- try:
- # XXX We should have a separate function that does "int" to
- # "unicodestring" conversion since this doesn't always work
- # according to hsivonen. Also, unichr has a limitation of 65535
- char = unichr(charAsInt)
- except:
- try:
- char = eval("u'\\U%08x'" % charAsInt)
- except:
- self.tokenQueue.append({"type": "ParseError", "data":
- _(u"Numeric entity couldn't be converted to character (codepoint: U+%08x).") % charAsInt})
- else:
- char = u"\uFFFD"
- self.tokenQueue.append({"type": "ParseError", "data":
- _(u"Numeric entity represents an illegal codepoint: U+%08x.") % charAsInt})
-
- # Discard the ; if present. Otherwise, put it back on the queue and
- # invoke parseError on parser.
- if c != u";":
- self.tokenQueue.append({"type": "ParseError", "data":
- _(u"Numeric entity didn't end with ';'.")})
- self.stream.unget(c)
-
- return char
-
- def consumeEntity(self, fromAttribute=False):
- char = None
- charStack = [self.stream.char()]
- if charStack[0] in spaceCharacters or charStack[0] in (EOF, "<", "&"):
- self.stream.unget(charStack)
- elif charStack[0] == u"#":
- # We might have a number entity here.
- charStack.extend([self.stream.char(), self.stream.char()])
- if EOF in charStack[:2]:
- # If we reach the end of the file put everything up to EOF
- # back in the queue
- charStack = charStack[:charStack.index(EOF)]
- self.stream.unget(charStack)
- self.tokenQueue.append({"type": "ParseError", "data":
- _(u"Numeric entity expected. Got end of file instead.")})
- else:
- if charStack[1].lower() == u"x" \
- and charStack[2] in hexDigits:
- # Hexadecimal entity detected.
- self.stream.unget(charStack[2])
- char = self.consumeNumberEntity(True)
- elif charStack[1] in digits:
- # Decimal entity detected.
- self.stream.unget(charStack[1:])
- char = self.consumeNumberEntity(False)
- else:
- # No number entity detected.
- self.stream.unget(charStack)
- self.tokenQueue.append({"type": "ParseError", "data":
- _(u"Numeric entity expected but none found.")})
- else:
- # At this point in the process might have named entity. Entities
- # are stored in the global variable "entities".
- #
- # Consume characters and compare to these to a substring of the
- # entity names in the list until the substring no longer matches.
- filteredEntityList = [e for e in entities if \
- e.startswith(charStack[0])]
-
- def entitiesStartingWith(name):
- return [e for e in filteredEntityList if e.startswith(name)]
-
- while charStack[-1] != EOF and\
- entitiesStartingWith("".join(charStack)):
- charStack.append(self.stream.char())
-
- # At this point we have a string that starts with some characters
- # that may match an entity
- entityName = None
-
- # Try to find the longest entity the string will match to take care
- # of ¬i for instance.
- for entityLength in xrange(len(charStack)-1,1,-1):
- possibleEntityName = "".join(charStack[:entityLength])
- if possibleEntityName in entities:
- entityName = possibleEntityName
- break
-
- if entityName is not None:
- if entityName[-1] != ";":
- self.tokenQueue.append({"type": "ParseError", "data":
- _(u"Named entity didn't end with ';'.")})
- if entityName[-1] != ";" and fromAttribute and \
- (charStack[entityLength] in asciiLetters
- or charStack[entityLength] in digits):
- self.stream.unget(charStack)
- else:
- char = entities[entityName]
- self.stream.unget(charStack[entityLength:])
- else:
- self.tokenQueue.append({"type": "ParseError", "data":
- _(u"Named entity expected. Got none.")})
- self.stream.unget(charStack)
- return char
-
- def processEntityInAttribute(self):
- """This method replaces the need for "entityInAttributeValueState".
- """
- entity = self.consumeEntity(True)
- if entity:
- self.currentToken["data"][-1][1] += entity
- else:
- self.currentToken["data"][-1][1] += u"&"
-
- def emitCurrentToken(self):
- """This method is a generic handler for emitting the tags. It also sets
- the state to "data" because that's what's needed after a token has been
- emitted.
- """
- token = self.currentToken
- # Add token to the queue to be yielded
- if (token["type"] in ("StartTag", "EndTag", "EmptyTag")):
- if self.lowercaseElementName:
- token["name"] = token["name"].translate(asciiUpper2Lower)
- if token["type"] == "EndTag" and token["data"]:
- self.tokenQueue.append({"type":"ParseError",
- "data":_(u"End tag contains unexpected attributes.")})
- self.tokenQueue.append(token)
- self.state = self.states["data"]
-
-
- # Below are the various tokenizer states worked out.
-
- # XXX AT Perhaps we should have Hixie run some evaluation on billions of
- # documents to figure out what the order of the various if and elif
- # statements should be.
-
- def dataState(self):
- data = self.stream.char()
-
- # Keep a charbuffer to handle the escapeFlag
- if self.contentModelFlag in\
- (contentModelFlags["CDATA"], contentModelFlags["RCDATA"]):
- if len(self.lastFourChars) == 4:
- self.lastFourChars.pop(0)
- self.lastFourChars.append(data)
-
- # The rest of the logic
- if data == "&" and self.contentModelFlag in\
- (contentModelFlags["PCDATA"], contentModelFlags["RCDATA"]) and not\
- self.escapeFlag:
- self.state = self.states["entityData"]
- elif data == "-" and self.contentModelFlag in\
- (contentModelFlags["CDATA"], contentModelFlags["RCDATA"]) and not\
- self.escapeFlag and "".join(self.lastFourChars) == "<!--":
- self.escapeFlag = True
- self.tokenQueue.append({"type": "Characters", "data":data})
- elif data == "<" and (self.contentModelFlag ==\
- contentModelFlags["PCDATA"] or (self.contentModelFlag in
- (contentModelFlags["CDATA"], contentModelFlags["RCDATA"]) and\
- self.escapeFlag == False)):
- self.state = self.states["tagOpen"]
- elif data == ">" and self.contentModelFlag in\
- (contentModelFlags["CDATA"], contentModelFlags["RCDATA"]) and\
- self.escapeFlag and "".join(self.lastFourChars)[1:] == "-->":
- self.escapeFlag = False
- self.tokenQueue.append({"type": "Characters", "data":data})
- elif data == EOF:
- # Tokenization ends.
- return False
- elif data in spaceCharacters:
- # Directly after emitting a token you switch back to the "data
- # state". At that point spaceCharacters are important so they are
- # emitted separately.
- self.tokenQueue.append({"type": "SpaceCharacters", "data":
- data + self.stream.charsUntil(spaceCharacters, True)})
- else:
- self.tokenQueue.append({"type": "Characters", "data":
- data + self.stream.charsUntil(("&", "<", ">", "-"))})
- return True
-
- def entityDataState(self):
- entity = self.consumeEntity()
- if entity:
- self.tokenQueue.append({"type": "Characters", "data": entity})
- else:
- self.tokenQueue.append({"type": "Characters", "data": u"&"})
- self.state = self.states["data"]
- return True
-
- def tagOpenState(self):
- data = self.stream.char()
- if self.contentModelFlag == contentModelFlags["PCDATA"]:
- if data == u"!":
- self.state = self.states["markupDeclarationOpen"]
- elif data == u"/":
- self.state = self.states["closeTagOpen"]
- elif data in asciiLetters:
- self.currentToken =\
- {"type": "StartTag", "name": data, "data": []}
- self.state = self.states["tagName"]
- elif data == u">":
- # XXX In theory it could be something besides a tag name. But
- # do we really care?
- self.tokenQueue.append({"type": "ParseError", "data":
- _(u"Expected tag name. Got '>' instead.")})
- self.tokenQueue.append({"type": "Characters", "data": u"<>"})
- self.state = self.states["data"]
- elif data == u"?":
- # XXX In theory it could be something besides a tag name. But
- # do we really care?
- self.tokenQueue.append({"type": "ParseError", "data":
- _(u"Expected tag name. Got '?' instead (HTML doesn't "
- "support processing instructions).")})
- self.stream.unget(data)
- self.state = self.states["bogusComment"]
- else:
- # XXX
- self.tokenQueue.append({"type": "ParseError", "data":
- _(u"Expected tag name. Got something else instead")})
- self.tokenQueue.append({"type": "Characters", "data": u"<"})
- self.stream.unget(data)
- self.state = self.states["data"]
- else:
- # We know the content model flag is set to either RCDATA or CDATA
- # now because this state can never be entered with the PLAINTEXT
- # flag.
- if data == u"/":
- self.state = self.states["closeTagOpen"]
- else:
- self.tokenQueue.append({"type": "Characters", "data": u"<"})
- self.stream.unget(data)
- self.state = self.states["data"]
- return True
-
- def closeTagOpenState(self):
- if (self.contentModelFlag in (contentModelFlags["RCDATA"],
- contentModelFlags["CDATA"])):
- if self.currentToken:
- charStack = []
-
- # So far we know that "</" has been consumed. We now need to know
- # whether the next few characters match the name of last emitted
- # start tag which also happens to be the currentToken. We also need
- # to have the character directly after the characters that could
- # match the start tag name.
- for x in xrange(len(self.currentToken["name"]) + 1):
- charStack.append(self.stream.char())
- # Make sure we don't get hit by EOF
- if charStack[-1] == EOF:
- break
-
- # Since this is just for checking. We put the characters back on
- # the stack.
- self.stream.unget(charStack)
-
- if self.currentToken \
- and self.currentToken["name"].lower() == "".join(charStack[:-1]).lower() \
- and charStack[-1] in (spaceCharacters |
- frozenset((u">", u"/", u"<", EOF))):
- # Because the characters are correct we can safely switch to
- # PCDATA mode now. This also means we don't have to do it when
- # emitting the end tag token.
- self.contentModelFlag = contentModelFlags["PCDATA"]
- else:
- self.tokenQueue.append({"type": "Characters", "data": u"</"})
- self.state = self.states["data"]
-
- # Need to return here since we don't want the rest of the
- # method to be walked through.
- return True
-
- data = self.stream.char()
- if data in asciiLetters:
- self.currentToken = {"type":"EndTag", "name":data, "data":[]}
- self.state = self.states["tagName"]
- elif data == u">":
- self.tokenQueue.append({"type": "ParseError", "data":
- _(u"Expected closing tag. Got '>' instead. Ignoring '</>'.")})
- self.state = self.states["data"]
- elif data == EOF:
- self.tokenQueue.append({"type": "ParseError", "data":
- _(u"Expected closing tag. Unexpected end of file.")})
- self.tokenQueue.append({"type": "Characters", "data": u"</"})
- self.state = self.states["data"]
- else:
- # XXX data can be _'_...
- self.tokenQueue.append({"type": "ParseError", "data":
- _(u"Expected closing tag. Unexpected character '%s' found.") % (data,)})
- self.stream.unget(data)
- self.state = self.states["bogusComment"]
- return True
-
- def tagNameState(self):
- data = self.stream.char()
- if data in spaceCharacters:
- self.state = self.states["beforeAttributeName"]
- elif data in asciiLetters:
- self.currentToken["name"] += data +\
- self.stream.charsUntil(asciiLetters, True)
- elif data == u">":
- self.emitCurrentToken()
- elif data == EOF:
- self.tokenQueue.append({"type": "ParseError", "data":
- _(u"Unexpected end of file in the tag name.")})
- self.emitCurrentToken()
- elif data == u"/":
- self.processSolidusInTag()
- self.state = self.states["beforeAttributeName"]
- else:
- self.currentToken["name"] += data
- return True
-
- def beforeAttributeNameState(self):
- data = self.stream.char()
- if data in spaceCharacters:
- self.stream.charsUntil(spaceCharacters, True)
- elif data in asciiLetters:
- self.currentToken["data"].append([data, ""])
- self.state = self.states["attributeName"]
- elif data == u">":
- self.emitCurrentToken()
- elif data == u"/":
- self.processSolidusInTag()
- elif data == EOF:
- self.tokenQueue.append({"type": "ParseError", "data":
- _(u"Unexpected end of file. Expected attribute name instead.")})
- self.emitCurrentToken()
- else:
- self.currentToken["data"].append([data, ""])
- self.state = self.states["attributeName"]
- return True
-
- def attributeNameState(self):
- data = self.stream.char()
- leavingThisState = True
- emitToken = False
- if data == u"=":
- self.state = self.states["beforeAttributeValue"]
- elif data in asciiLetters:
- self.currentToken["data"][-1][0] += data +\
- self.stream.charsUntil(asciiLetters, True)
- leavingThisState = False
- elif data == u">":
- # XXX If we emit here the attributes are converted to a dict
- # without being checked and when the code below runs we error
- # because data is a dict not a list
- emitToken = True
- elif data in spaceCharacters:
- self.state = self.states["afterAttributeName"]
- elif data == u"/":
- self.processSolidusInTag()
- self.state = self.states["beforeAttributeName"]
- elif data == EOF:
- self.tokenQueue.append({"type": "ParseError", "data":
- _(u"Unexpected end of file in attribute name.")})
- self.state = self.states["data"]
- emitToken = True
- else:
- self.currentToken["data"][-1][0] += data
- leavingThisState = False
-
- if leavingThisState:
- # Attributes are not dropped at this stage. That happens when the
- # start tag token is emitted so values can still be safely appended
- # to attributes, but we do want to report the parse error in time.
- if self.lowercaseAttrName:
- self.currentToken["data"][-1][0] = (
- self.currentToken["data"][-1][0].translate(asciiUpper2Lower))
- for name, value in self.currentToken["data"][:-1]:
- if self.currentToken["data"][-1][0] == name:
- self.tokenQueue.append({"type": "ParseError", "data":
- _(u"Dropped duplicate attribute on tag.")})
- break
- # XXX Fix for above XXX
- if emitToken:
- self.emitCurrentToken()
- return True
-
- def afterAttributeNameState(self):
- data = self.stream.char()
- if data in spaceCharacters:
- self.stream.charsUntil(spaceCharacters, True)
- elif data == u"=":
- self.state = self.states["beforeAttributeValue"]
- elif data == u">":
- self.emitCurrentToken()
- elif data in asciiLetters:
- self.currentToken["data"].append([data, ""])
- self.state = self.states["attributeName"]
- elif data == u"/":
- self.processSolidusInTag()
- self.state = self.states["beforeAttributeName"]
- elif data == EOF:
- self.tokenQueue.append({"type": "ParseError", "data":
- _(u"Unexpected end of file. Expected = or end of tag.")})
- self.emitCurrentToken()
- else:
- self.currentToken["data"].append([data, ""])
- self.state = self.states["attributeName"]
- return True
-
- def beforeAttributeValueState(self):
- data = self.stream.char()
- if data in spaceCharacters:
- self.stream.charsUntil(spaceCharacters, True)
- elif data == u"\"":
- self.state = self.states["attributeValueDoubleQuoted"]
- elif data == u"&":
- self.state = self.states["attributeValueUnQuoted"]
- self.stream.unget(data);
- elif data == u"'":
- self.state = self.states["attributeValueSingleQuoted"]
- elif data == u">":
- self.emitCurrentToken()
- elif data == EOF:
- self.tokenQueue.append({"type": "ParseError", "data":
- _(u"Unexpected end of file. Expected attribute value.")})
- self.emitCurrentToken()
- else:
- self.currentToken["data"][-1][1] += data
- self.state = self.states["attributeValueUnQuoted"]
- return True
-
- def attributeValueDoubleQuotedState(self):
- data = self.stream.char()
- if data == "\"":
- self.state = self.states["beforeAttributeName"]
- elif data == u"&":
- self.processEntityInAttribute()
- elif data == EOF:
- self.tokenQueue.append({"type": "ParseError", "data":
- _(u"Unexpected end of file in attribute value (\").")})
- self.emitCurrentToken()
- else:
- self.currentToken["data"][-1][1] += data +\
- self.stream.charsUntil(("\"", u"&"))
- return True
-
- def attributeValueSingleQuotedState(self):
- data = self.stream.char()
- if data == "'":
- self.state = self.states["beforeAttributeName"]
- elif data == u"&":
- self.processEntityInAttribute()
- elif data == EOF:
- self.tokenQueue.append({"type": "ParseError", "data":
- _(u"Unexpected end of file in attribute value (').")})
- self.emitCurrentToken()
- else:
- self.currentToken["data"][-1][1] += data +\
- self.stream.charsUntil(("'", u"&"))
- return True
-
- def attributeValueUnQuotedState(self):
- data = self.stream.char()
- if data in spaceCharacters:
- self.state = self.states["beforeAttributeName"]
- elif data == u"&":
- self.processEntityInAttribute()
- elif data == u">":
- self.emitCurrentToken()
- elif data == EOF:
- self.tokenQueue.append({"type": "ParseError", "data":
- _(u"Unexpected end of file in attribute value.")})
- self.emitCurrentToken()
- else:
- self.currentToken["data"][-1][1] += data + self.stream.charsUntil( \
- frozenset(("&", ">","<")) | spaceCharacters)
- return True
-
- def bogusCommentState(self):
- # Make a new comment token and give it as value all the characters
- # until the first > or EOF (charsUntil checks for EOF automatically)
- # and emit it.
- self.tokenQueue.append(
- {"type": "Comment", "data": self.stream.charsUntil((u">"))})
-
- # Eat the character directly after the bogus comment which is either a
- # ">" or an EOF.
- self.stream.char()
- self.state = self.states["data"]
- return True
-
- def markupDeclarationOpenState(self):
- charStack = [self.stream.char(), self.stream.char()]
- if charStack == [u"-", u"-"]:
- self.currentToken = {"type": "Comment", "data": u""}
- self.state = self.states["commentStart"]
- else:
- for x in xrange(5):
- charStack.append(self.stream.char())
- # Put in explicit EOF check
- if (not EOF in charStack and
- "".join(charStack).upper() == u"DOCTYPE"):
- self.currentToken = {"type":"Doctype", "name":u"",
- "publicId":None, "systemId":None, "correct":True}
- self.state = self.states["doctype"]
- else:
- self.tokenQueue.append({"type": "ParseError", "data":
- _(u"Expected '--' or 'DOCTYPE'. Not found.")})
- self.stream.unget(charStack)
- self.state = self.states["bogusComment"]
- return True
-
- def commentStartState(self):
- data = self.stream.char()
- if data == "-":
- self.state = self.states["commentStartDash"]
- elif data == ">":
- self.tokenQueue.append({"type": "ParseError", "data":
- _(u"Incorrect comment.")})
- self.tokenQueue.append(self.currentToken)
- self.state = self.states["data"]
- elif data == EOF:
- self.tokenQueue.append({"type": "ParseError", "data":
- _(u"Unexpected end of file in comment.")})
- self.tokenQueue.append(self.currentToken)
- self.state = self.states["data"]
- else:
- self.currentToken["data"] += data + self.stream.charsUntil(u"-")
- self.state = self.states["comment"]
- return True
-
- def commentStartDashState(self):
- data = self.stream.char()
- if data == "-":
- self.state = self.states["commentEnd"]
- elif data == ">":
- self.tokenQueue.append({"type": "ParseError", "data":
- _(u"Incorrect comment.")})
- self.tokenQueue.append(self.currentToken)
- self.state = self.states["data"]
- elif data == EOF:
- self.tokenQueue.append({"type": "ParseError", "data":
- _(u"Unexpected end of file in comment.")})
- self.tokenQueue.append(self.currentToken)
- self.state = self.states["data"]
- else:
- self.currentToken["data"] += "-" + data + self.stream.charsUntil(u"-")
- self.state = self.states["comment"]
- return True
-
-
- def commentState(self):
- data = self.stream.char()
- if data == u"-":
- self.state = self.states["commentEndDash"]
- elif data == EOF:
- self.tokenQueue.append({"type": "ParseError", "data":
- _(u"Unexpected end of file in comment.")})
- self.tokenQueue.append(self.currentToken)
- self.state = self.states["data"]
- else:
- self.currentToken["data"] += data + self.stream.charsUntil(u"-")
- return True
-
- def commentEndDashState(self):
- data = self.stream.char()
- if data == u"-":
- self.state = self.states["commentEnd"]
- elif data == EOF:
- self.tokenQueue.append({"type": "ParseError", "data":
- _(u"Unexpected end of file in comment (-)")})
- self.tokenQueue.append(self.currentToken)
- self.state = self.states["data"]
- else:
- self.currentToken["data"] += u"-" + data +\
- self.stream.charsUntil(u"-")
- # Consume the next character which is either a "-" or an EOF as
- # well so if there's a "-" directly after the "-" we go nicely to
- # the "comment end state" without emitting a ParseError() there.
- self.stream.char()
- return True
-
- def commentEndState(self):
- data = self.stream.char()
- if data == u">":
- self.tokenQueue.append(self.currentToken)
- self.state = self.states["data"]
- elif data == u"-":
- self.tokenQueue.append({"type": "ParseError", "data":
- _(u"Unexpected '-' after '--' found in comment.")})
- self.currentToken["data"] += data
- elif data == EOF:
- self.tokenQueue.append({"type": "ParseError", "data":
- _(u"Unexpected end of file in comment (--).")})
- self.tokenQueue.append(self.currentToken)
- self.state = self.states["data"]
- else:
- # XXX
- self.tokenQueue.append({"type": "ParseError", "data":
- _(u"Unexpected character in comment found.")})
- self.currentToken["data"] += u"--" + data
- self.state = self.states["comment"]
- return True
-
- def doctypeState(self):
- data = self.stream.char()
- if data in spaceCharacters:
- self.state = self.states["beforeDoctypeName"]
- else:
- self.tokenQueue.append({"type": "ParseError", "data":
- _(u"No space after literal string 'DOCTYPE'.")})
- self.stream.unget(data)
- self.state = self.states["beforeDoctypeName"]
- return True
-
- def beforeDoctypeNameState(self):
- data = self.stream.char()
- if data in spaceCharacters:
- pass
- elif data == u">":
- self.tokenQueue.append({"type": "ParseError", "data":
- _(u"Unexpected > character. Expected DOCTYPE name.")})
- self.currentToken["correct"] = False
- self.tokenQueue.append(self.currentToken)
- self.state = self.states["data"]
- elif data == EOF:
- self.tokenQueue.append({"type": "ParseError", "data":
- _(u"Unexpected end of file. Expected DOCTYPE name.")})
- self.currentToken["correct"] = False
- self.tokenQueue.append(self.currentToken)
- self.state = self.states["data"]
- else:
- self.currentToken["name"] = data
- self.state = self.states["doctypeName"]
- return True
-
- def doctypeNameState(self):
- data = self.stream.char()
- if data in spaceCharacters:
- self.state = self.states["afterDoctypeName"]
- elif data == u">":
- self.tokenQueue.append(self.currentToken)
- self.state = self.states["data"]
- elif data == EOF:
- self.tokenQueue.append({"type": "ParseError", "data":
- _(u"Unexpected end of file in DOCTYPE name.")})
- self.currentToken["correct"] = False
- self.tokenQueue.append(self.currentToken)
- self.state = self.states["data"]
- else:
- self.currentToken["name"] += data
- return True
-
- def afterDoctypeNameState(self):
- data = self.stream.char()
- if data in spaceCharacters:
- pass
- elif data == u">":
- self.tokenQueue.append(self.currentToken)
- self.state = self.states["data"]
- elif data == EOF:
- self.currentToken["correct"] = False
- self.stream.unget(data)
- self.tokenQueue.append({"type": "ParseError", "data":
- _(u"Unexpected end of file in DOCTYPE.")})
- self.tokenQueue.append(self.currentToken)
- self.state = self.states["data"]
- else:
- charStack = [data]
- for x in xrange(5):
- charStack.append(self.stream.char())
- if EOF not in charStack and\
- "".join(charStack).translate(asciiUpper2Lower) == "public":
- self.state = self.states["beforeDoctypePublicIdentifier"]
- elif EOF not in charStack and\
- "".join(charStack).translate(asciiUpper2Lower) == "system":
- self.state = self.states["beforeDoctypeSystemIdentifier"]
- else:
- self.stream.unget(charStack)
- self.tokenQueue.append({"type": "ParseError", "data":
- _(u"Expected space or '>'. Got '%s'") % (data,)})
- self.state = self.states["bogusDoctype"]
- return True
-
- def beforeDoctypePublicIdentifierState(self):
- data = self.stream.char()
- if data in spaceCharacters:
- pass
- elif data == "\"":
- self.currentToken["publicId"] = u""
- self.state = self.states["doctypePublicIdentifierDoubleQuoted"]
- elif data == "'":
- self.currentToken["publicId"] = u""
- self.state = self.states["doctypePublicIdentifierSingleQuoted"]
- elif data == ">":
- self.tokenQueue.append({"type": "ParseError", "data":
- _(u"Unexpected end of DOCTYPE.")})
- self.currentToken["correct"] = False
- self.tokenQueue.append(self.currentToken)
- self.state = self.states["data"]
- elif data == EOF:
- self.tokenQueue.append({"type": "ParseError", "data":
- _(u"Unexpected end of file in DOCTYPE.")})
- self.currentToken["correct"] = False
- self.tokenQueue.append(self.currentToken)
- self.state = self.states["data"]
- else:
- self.tokenQueue.append({"type": "ParseError", "data":
- _(u"Unexpected character in DOCTYPE.")})
- self.state = self.states["bogusDoctype"]
- return True
-
- def doctypePublicIdentifierDoubleQuotedState(self):
- data = self.stream.char()
- if data == "\"":
- self.state = self.states["afterDoctypePublicIdentifier"]
- elif data == EOF:
- self.tokenQueue.append({"type": "ParseError", "data":
- _(u"Unexpected end of file in DOCTYPE.")})
- self.currentToken["correct"] = False
- self.tokenQueue.append(self.currentToken)
- self.state = self.states["data"]
- else:
- self.currentToken["publicId"] += data
- return True
-
- def doctypePublicIdentifierSingleQuotedState(self):
- data = self.stream.char()
- if data == "'":
- self.state = self.states["afterDoctypePublicIdentifier"]
- elif data == EOF:
- self.tokenQueue.append({"type": "ParseError", "data":
- _(u"Unexpected end of file in DOCTYPE.")})
- self.currentToken["correct"] = False
- self.tokenQueue.append(self.currentToken)
- self.state = self.states["data"]
- else:
- self.currentToken["publicId"] += data
- return True
-
- def afterDoctypePublicIdentifierState(self):
- data = self.stream.char()
- if data in spaceCharacters:
- pass
- elif data == "\"":
- self.currentToken["systemId"] = u""
- self.state = self.states["doctypeSystemIdentifierDoubleQuoted"]
- elif data == "'":
- self.currentToken["systemId"] = u""
- self.state = self.states["doctypeSystemIdentifierSingleQuoted"]
- elif data == ">":
- self.tokenQueue.append(self.currentToken)
- self.state = self.states["data"]
- elif data == EOF:
- self.tokenQueue.append({"type": "ParseError", "data":
- _(u"Unexpected end of file in DOCTYPE.")})
- self.currentToken["correct"] = False
- self.tokenQueue.append(self.currentToken)
- self.state = self.states["data"]
- else:
- self.tokenQueue.append({"type": "ParseError", "data":
- _(u"Unexpected character in DOCTYPE.")})
- self.state = self.states["bogusDoctype"]
- return True
-
- def beforeDoctypeSystemIdentifierState(self):
- data = self.stream.char()
- if data in spaceCharacters:
- pass
- elif data == "\"":
- self.currentToken["systemId"] = u""
- self.state = self.states["doctypeSystemIdentifierDoubleQuoted"]
- elif data == "'":
- self.currentToken["systemId"] = u""
- self.state = self.states["doctypeSystemIdentifierSingleQuoted"]
- elif data == ">":
- self.tokenQueue.append({"type": "ParseError", "data":
- _(u"Unexpected character in DOCTYPE.")})
- self.currentToken["correct"] = False
- self.tokenQueue.append(self.currentToken)
- self.state = self.states["data"]
- elif data == EOF:
- self.tokenQueue.append({"type": "ParseError", "data":
- _(u"Unexpected end of file in DOCTYPE.")})
- self.currentToken["correct"] = False
- self.tokenQueue.append(self.currentToken)
- self.state = self.states["data"]
- else:
- self.tokenQueue.append({"type": "ParseError", "data":
- _(u"Unexpected character in DOCTYPE.")})
- self.state = self.states["bogusDoctype"]
- return True
-
- def doctypeSystemIdentifierDoubleQuotedState(self):
- data = self.stream.char()
- if data == "\"":
- self.state = self.states["afterDoctypeSystemIdentifier"]
- elif data == EOF:
- self.tokenQueue.append({"type": "ParseError", "data":
- _(u"Unexpected end of file in DOCTYPE.")})
- self.currentToken["correct"] = False
- self.tokenQueue.append(self.currentToken)
- self.state = self.states["data"]
- else:
- self.currentToken["systemId"] += data
- return True
-
- def doctypeSystemIdentifierSingleQuotedState(self):
- data = self.stream.char()
- if data == "'":
- self.state = self.states["afterDoctypeSystemIdentifier"]
- elif data == EOF:
- self.tokenQueue.append({"type": "ParseError", "data":
- _(u"Unexpected end of file in DOCTYPE.")})
- self.currentToken["correct"] = False
- self.tokenQueue.append(self.currentToken)
- self.state = self.states["data"]
- else:
- self.currentToken["systemId"] += data
- return True
-
- def afterDoctypeSystemIdentifierState(self):
- data = self.stream.char()
- if data in spaceCharacters:
- pass
- elif data == ">":
- self.tokenQueue.append(self.currentToken)
- self.state = self.states["data"]
- elif data == EOF:
- self.tokenQueue.append({"type": "ParseError", "data":
- _(u"Unexpected end of file in DOCTYPE.")})
- self.currentToken["correct"] = False
- self.tokenQueue.append(self.currentToken)
- self.state = self.states["data"]
- else:
- self.tokenQueue.append({"type": "ParseError", "data":
- _(u"Unexpected character in DOCTYPE.")})
- self.state = self.states["bogusDoctype"]
- return True
-
- def bogusDoctypeState(self):
- data = self.stream.char()
- self.currentToken["correct"] = False
- if data == u">":
- self.tokenQueue.append(self.currentToken)
- self.state = self.states["data"]
- elif data == EOF:
- # XXX EMIT
- self.stream.unget(data)
- self.tokenQueue.append({"type": "ParseError", "data":
- _(u"Unexpected end of file in bogus doctype.")})
- self.tokenQueue.append(self.currentToken)
- self.state = self.states["data"]
- else:
- pass
- return True
Copied: trunk/lib/venus/planet/vendor/html5lib/tokenizer.py (from rev 656, branches/sucs-site/lib/venus/planet/vendor/html5lib/tokenizer.py)
===================================================================
--- trunk/lib/venus/planet/vendor/html5lib/tokenizer.py (rev 0)
+++ trunk/lib/venus/planet/vendor/html5lib/tokenizer.py 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,1009 @@
+try:
+ frozenset
+except NameError:
+ # Import from the sets module for python 2.3
+ from sets import Set as set
+ from sets import ImmutableSet as frozenset
+import gettext
+_ = gettext.gettext
+
+from constants import contentModelFlags, spaceCharacters
+from constants import entitiesWindows1252, entities
+from constants import asciiLowercase, asciiLetters, asciiUpper2Lower
+from constants import digits, hexDigits, EOF
+
+from inputstream import HTMLInputStream
+
+class HTMLTokenizer(object):
+ """ This class takes care of tokenizing HTML.
+
+ * self.currentToken
+ Holds the token that is currently being processed.
+
+ * self.state
+ Holds a reference to the method to be invoked... XXX
+
+ * self.states
+ Holds a mapping between states and methods that implement the state.
+
+ * self.stream
+ Points to HTMLInputStream object.
+ """
+
+ # XXX need to fix documentation
+
+ def __init__(self, stream, encoding=None, parseMeta=True,
+ lowercaseElementName=True, lowercaseAttrName=True,):
+ self.stream = HTMLInputStream(stream, encoding, parseMeta)
+
+ #Perform case conversions?
+ self.lowercaseElementName = lowercaseElementName
+ self.lowercaseAttrName = lowercaseAttrName
+
+ self.states = {
+ "data":self.dataState,
+ "entityData":self.entityDataState,
+ "tagOpen":self.tagOpenState,
+ "closeTagOpen":self.closeTagOpenState,
+ "tagName":self.tagNameState,
+ "beforeAttributeName":self.beforeAttributeNameState,
+ "attributeName":self.attributeNameState,
+ "afterAttributeName":self.afterAttributeNameState,
+ "beforeAttributeValue":self.beforeAttributeValueState,
+ "attributeValueDoubleQuoted":self.attributeValueDoubleQuotedState,
+ "attributeValueSingleQuoted":self.attributeValueSingleQuotedState,
+ "attributeValueUnQuoted":self.attributeValueUnQuotedState,
+ "bogusComment":self.bogusCommentState,
+ "markupDeclarationOpen":self.markupDeclarationOpenState,
+ "commentStart":self.commentStartState,
+ "commentStartDash":self.commentStartDashState,
+ "comment":self.commentState,
+ "commentEndDash":self.commentEndDashState,
+ "commentEnd":self.commentEndState,
+ "doctype":self.doctypeState,
+ "beforeDoctypeName":self.beforeDoctypeNameState,
+ "doctypeName":self.doctypeNameState,
+ "afterDoctypeName":self.afterDoctypeNameState,
+ "beforeDoctypePublicIdentifier":self.beforeDoctypePublicIdentifierState,
+ "doctypePublicIdentifierDoubleQuoted":self.doctypePublicIdentifierDoubleQuotedState,
+ "doctypePublicIdentifierSingleQuoted":self.doctypePublicIdentifierSingleQuotedState,
+ "afterDoctypePublicIdentifier":self.afterDoctypePublicIdentifierState,
+ "beforeDoctypeSystemIdentifier":self.beforeDoctypeSystemIdentifierState,
+ "doctypeSystemIdentifierDoubleQuoted":self.doctypeSystemIdentifierDoubleQuotedState,
+ "doctypeSystemIdentifierSingleQuoted":self.doctypeSystemIdentifierSingleQuotedState,
+ "afterDoctypeSystemIdentifier":self.afterDoctypeSystemIdentifierState,
+ "bogusDoctype":self.bogusDoctypeState
+ }
+
+ # Setup the initial tokenizer state
+ self.contentModelFlag = contentModelFlags["PCDATA"]
+ self.escapeFlag = False
+ self.lastFourChars = []
+ self.state = self.states["data"]
+
+ # The current token being created
+ self.currentToken = None
+
+ # Tokens to be processed.
+ self.tokenQueue = []
+
+ def __iter__(self):
+ """ This is where the magic happens.
+
+ We do our usually processing through the states and when we have a token
+ to return we yield the token which pauses processing until the next token
+ is requested.
+ """
+ self.tokenQueue = []
+ # Start processing. When EOF is reached self.state will return False
+ # instead of True and the loop will terminate.
+ while self.state():
+ while self.stream.errors:
+ yield {"type": "ParseError", "data": self.stream.errors.pop(0)}
+ while self.tokenQueue:
+ yield self.tokenQueue.pop(0)
+
+ # Below are various helper functions the tokenizer states use worked out.
+ def processSolidusInTag(self):
+ """If the next character is a '>', convert the currentToken into
+ an EmptyTag
+ """
+
+ # We need to consume another character to make sure it's a ">"
+ data = self.stream.char()
+
+ if self.currentToken["type"] == "StartTag" and data == u">":
+ self.currentToken["type"] = "EmptyTag"
+ else:
+ self.tokenQueue.append({"type": "ParseError", "data":
+ _(u"Solidus (/) incorrectly placed in tag.")})
+
+ # The character we just consumed need to be put back on the stack so it
+ # doesn't get lost...
+ self.stream.unget(data)
+
+ def consumeNumberEntity(self, isHex):
+ """This function returns either U+FFFD or the character based on the
+ decimal or hexadecimal representation. It also discards ";" if present.
+ If not present self.tokenQueue.append({"type": "ParseError"}) is invoked.
+ """
+
+ # XXX More need to be done here. For instance, #13 should prolly be
+ # converted to #10 so we don't get \r (#13 is \r right?) in the DOM and
+ # such. Thoughts on this appreciated.
+ allowed = digits
+ radix = 10
+ if isHex:
+ allowed = hexDigits
+ radix = 16
+
+ charStack = []
+
+ # Consume all the characters that are in range while making sure we
+ # don't hit an EOF.
+ c = self.stream.char()
+ while c in allowed and c is not EOF:
+ charStack.append(c)
+ c = self.stream.char()
+
+ # Convert the set of characters consumed to an int.
+ charAsInt = int("".join(charStack), radix)
+
+ if charAsInt == 13:
+ self.tokenQueue.append({"type": "ParseError", "data":
+ _(u"Incorrect CR newline entity. Replaced with LF.")})
+ charAsInt = 10
+ elif 127 < charAsInt < 160:
+ # If the integer is between 127 and 160 (so 128 and bigger and 159
+ # and smaller) we need to do the "windows trick".
+ self.tokenQueue.append({"type": "ParseError", "data":
+ _(u"Entity used with illegal number (windows-1252 reference).")})
+
+ charAsInt = entitiesWindows1252[charAsInt - 128]
+
+ # 0 is not a good number, neither are illegal Unicode code points (higher than 0x10FFFF) or surrogate characters (in the range 0xD800 to 0xDFFF).
+ if 0 < charAsInt and charAsInt <= 1114111 and not (55296 <= charAsInt and charAsInt <= 57343):
+ try:
+ # XXX We should have a separate function that does "int" to
+ # "unicodestring" conversion since this doesn't always work
+ # according to hsivonen. Also, unichr has a limitation of 65535
+ char = unichr(charAsInt)
+ except:
+ try:
+ char = eval("u'\\U%08x'" % charAsInt)
+ except:
+ self.tokenQueue.append({"type": "ParseError", "data":
+ _(u"Numeric entity couldn't be converted to character (codepoint: U+%08x).") % charAsInt})
+ else:
+ char = u"\uFFFD"
+ self.tokenQueue.append({"type": "ParseError", "data":
+ _(u"Numeric entity represents an illegal codepoint: U+%08x.") % charAsInt})
+
+ # Discard the ; if present. Otherwise, put it back on the queue and
+ # invoke parseError on parser.
+ if c != u";":
+ self.tokenQueue.append({"type": "ParseError", "data":
+ _(u"Numeric entity didn't end with ';'.")})
+ self.stream.unget(c)
+
+ return char
+
+ def consumeEntity(self, fromAttribute=False):
+ char = None
+ charStack = [self.stream.char()]
+ if charStack[0] in spaceCharacters or charStack[0] in (EOF, "<", "&"):
+ self.stream.unget(charStack)
+ elif charStack[0] == u"#":
+ # We might have a number entity here.
+ charStack.extend([self.stream.char(), self.stream.char()])
+ if EOF in charStack[:2]:
+ # If we reach the end of the file put everything up to EOF
+ # back in the queue
+ charStack = charStack[:charStack.index(EOF)]
+ self.stream.unget(charStack)
+ self.tokenQueue.append({"type": "ParseError", "data":
+ _(u"Numeric entity expected. Got end of file instead.")})
+ else:
+ if charStack[1].lower() == u"x" \
+ and charStack[2] in hexDigits:
+ # Hexadecimal entity detected.
+ self.stream.unget(charStack[2])
+ char = self.consumeNumberEntity(True)
+ elif charStack[1] in digits:
+ # Decimal entity detected.
+ self.stream.unget(charStack[1:])
+ char = self.consumeNumberEntity(False)
+ else:
+ # No number entity detected.
+ self.stream.unget(charStack)
+ self.tokenQueue.append({"type": "ParseError", "data":
+ _(u"Numeric entity expected but none found.")})
+ else:
+ # At this point in the process might have named entity. Entities
+ # are stored in the global variable "entities".
+ #
+ # Consume characters and compare to these to a substring of the
+ # entity names in the list until the substring no longer matches.
+ filteredEntityList = [e for e in entities if \
+ e.startswith(charStack[0])]
+
+ def entitiesStartingWith(name):
+ return [e for e in filteredEntityList if e.startswith(name)]
+
+ while charStack[-1] != EOF and\
+ entitiesStartingWith("".join(charStack)):
+ charStack.append(self.stream.char())
+
+ # At this point we have a string that starts with some characters
+ # that may match an entity
+ entityName = None
+
+ # Try to find the longest entity the string will match to take care
+ # of ¬i for instance.
+ for entityLength in xrange(len(charStack)-1,1,-1):
+ possibleEntityName = "".join(charStack[:entityLength])
+ if possibleEntityName in entities:
+ entityName = possibleEntityName
+ break
+
+ if entityName is not None:
+ if entityName[-1] != ";":
+ self.tokenQueue.append({"type": "ParseError", "data":
+ _(u"Named entity didn't end with ';'.")})
+ if entityName[-1] != ";" and fromAttribute and \
+ (charStack[entityLength] in asciiLetters
+ or charStack[entityLength] in digits):
+ self.stream.unget(charStack)
+ else:
+ char = entities[entityName]
+ self.stream.unget(charStack[entityLength:])
+ else:
+ self.tokenQueue.append({"type": "ParseError", "data":
+ _(u"Named entity expected. Got none.")})
+ self.stream.unget(charStack)
+ return char
+
+ def processEntityInAttribute(self):
+ """This method replaces the need for "entityInAttributeValueState".
+ """
+ entity = self.consumeEntity(True)
+ if entity:
+ self.currentToken["data"][-1][1] += entity
+ else:
+ self.currentToken["data"][-1][1] += u"&"
+
+ def emitCurrentToken(self):
+ """This method is a generic handler for emitting the tags. It also sets
+ the state to "data" because that's what's needed after a token has been
+ emitted.
+ """
+ token = self.currentToken
+ # Add token to the queue to be yielded
+ if (token["type"] in ("StartTag", "EndTag", "EmptyTag")):
+ if self.lowercaseElementName:
+ token["name"] = token["name"].translate(asciiUpper2Lower)
+ if token["type"] == "EndTag" and token["data"]:
+ self.tokenQueue.append({"type":"ParseError",
+ "data":_(u"End tag contains unexpected attributes.")})
+ self.tokenQueue.append(token)
+ self.state = self.states["data"]
+
+
+ # Below are the various tokenizer states worked out.
+
+ # XXX AT Perhaps we should have Hixie run some evaluation on billions of
+ # documents to figure out what the order of the various if and elif
+ # statements should be.
+
+ def dataState(self):
+ data = self.stream.char()
+
+ # Keep a charbuffer to handle the escapeFlag
+ if self.contentModelFlag in\
+ (contentModelFlags["CDATA"], contentModelFlags["RCDATA"]):
+ if len(self.lastFourChars) == 4:
+ self.lastFourChars.pop(0)
+ self.lastFourChars.append(data)
+
+ # The rest of the logic
+ if data == "&" and self.contentModelFlag in\
+ (contentModelFlags["PCDATA"], contentModelFlags["RCDATA"]) and not\
+ self.escapeFlag:
+ self.state = self.states["entityData"]
+ elif data == "-" and self.contentModelFlag in\
+ (contentModelFlags["CDATA"], contentModelFlags["RCDATA"]) and not\
+ self.escapeFlag and "".join(self.lastFourChars) == "<!--":
+ self.escapeFlag = True
+ self.tokenQueue.append({"type": "Characters", "data":data})
+ elif data == "<" and (self.contentModelFlag ==\
+ contentModelFlags["PCDATA"] or (self.contentModelFlag in
+ (contentModelFlags["CDATA"], contentModelFlags["RCDATA"]) and\
+ self.escapeFlag == False)):
+ self.state = self.states["tagOpen"]
+ elif data == ">" and self.contentModelFlag in\
+ (contentModelFlags["CDATA"], contentModelFlags["RCDATA"]) and\
+ self.escapeFlag and "".join(self.lastFourChars)[1:] == "-->":
+ self.escapeFlag = False
+ self.tokenQueue.append({"type": "Characters", "data":data})
+ elif data == EOF:
+ # Tokenization ends.
+ return False
+ elif data in spaceCharacters:
+ # Directly after emitting a token you switch back to the "data
+ # state". At that point spaceCharacters are important so they are
+ # emitted separately.
+ self.tokenQueue.append({"type": "SpaceCharacters", "data":
+ data + self.stream.charsUntil(spaceCharacters, True)})
+ else:
+ self.tokenQueue.append({"type": "Characters", "data":
+ data + self.stream.charsUntil(("&", "<", ">", "-"))})
+ return True
+
+ def entityDataState(self):
+ entity = self.consumeEntity()
+ if entity:
+ self.tokenQueue.append({"type": "Characters", "data": entity})
+ else:
+ self.tokenQueue.append({"type": "Characters", "data": u"&"})
+ self.state = self.states["data"]
+ return True
+
+ def tagOpenState(self):
+ data = self.stream.char()
+ if self.contentModelFlag == contentModelFlags["PCDATA"]:
+ if data == u"!":
+ self.state = self.states["markupDeclarationOpen"]
+ elif data == u"/":
+ self.state = self.states["closeTagOpen"]
+ elif data in asciiLetters:
+ self.currentToken =\
+ {"type": "StartTag", "name": data, "data": []}
+ self.state = self.states["tagName"]
+ elif data == u">":
+ # XXX In theory it could be something besides a tag name. But
+ # do we really care?
+ self.tokenQueue.append({"type": "ParseError", "data":
+ _(u"Expected tag name. Got '>' instead.")})
+ self.tokenQueue.append({"type": "Characters", "data": u"<>"})
+ self.state = self.states["data"]
+ elif data == u"?":
+ # XXX In theory it could be something besides a tag name. But
+ # do we really care?
+ self.tokenQueue.append({"type": "ParseError", "data":
+ _(u"Expected tag name. Got '?' instead (HTML doesn't "
+ "support processing instructions).")})
+ self.stream.unget(data)
+ self.state = self.states["bogusComment"]
+ else:
+ # XXX
+ self.tokenQueue.append({"type": "ParseError", "data":
+ _(u"Expected tag name. Got something else instead")})
+ self.tokenQueue.append({"type": "Characters", "data": u"<"})
+ self.stream.unget(data)
+ self.state = self.states["data"]
+ else:
+ # We know the content model flag is set to either RCDATA or CDATA
+ # now because this state can never be entered with the PLAINTEXT
+ # flag.
+ if data == u"/":
+ self.state = self.states["closeTagOpen"]
+ else:
+ self.tokenQueue.append({"type": "Characters", "data": u"<"})
+ self.stream.unget(data)
+ self.state = self.states["data"]
+ return True
+
+ def closeTagOpenState(self):
+ if (self.contentModelFlag in (contentModelFlags["RCDATA"],
+ contentModelFlags["CDATA"])):
+ if self.currentToken:
+ charStack = []
+
+ # So far we know that "</" has been consumed. We now need to know
+ # whether the next few characters match the name of last emitted
+ # start tag which also happens to be the currentToken. We also need
+ # to have the character directly after the characters that could
+ # match the start tag name.
+ for x in xrange(len(self.currentToken["name"]) + 1):
+ charStack.append(self.stream.char())
+ # Make sure we don't get hit by EOF
+ if charStack[-1] == EOF:
+ break
+
+ # Since this is just for checking. We put the characters back on
+ # the stack.
+ self.stream.unget(charStack)
+
+ if self.currentToken \
+ and self.currentToken["name"].lower() == "".join(charStack[:-1]).lower() \
+ and charStack[-1] in (spaceCharacters |
+ frozenset((u">", u"/", u"<", EOF))):
+ # Because the characters are correct we can safely switch to
+ # PCDATA mode now. This also means we don't have to do it when
+ # emitting the end tag token.
+ self.contentModelFlag = contentModelFlags["PCDATA"]
+ else:
+ self.tokenQueue.append({"type": "Characters", "data": u"</"})
+ self.state = self.states["data"]
+
+ # Need to return here since we don't want the rest of the
+ # method to be walked through.
+ return True
+
+ data = self.stream.char()
+ if data in asciiLetters:
+ self.currentToken = {"type":"EndTag", "name":data, "data":[]}
+ self.state = self.states["tagName"]
+ elif data == u">":
+ self.tokenQueue.append({"type": "ParseError", "data":
+ _(u"Expected closing tag. Got '>' instead. Ignoring '</>'.")})
+ self.state = self.states["data"]
+ elif data == EOF:
+ self.tokenQueue.append({"type": "ParseError", "data":
+ _(u"Expected closing tag. Unexpected end of file.")})
+ self.tokenQueue.append({"type": "Characters", "data": u"</"})
+ self.state = self.states["data"]
+ else:
+ # XXX data can be _'_...
+ self.tokenQueue.append({"type": "ParseError", "data":
+ _(u"Expected closing tag. Unexpected character '%s' found.") % (data,)})
+ self.stream.unget(data)
+ self.state = self.states["bogusComment"]
+ return True
+
+ def tagNameState(self):
+ data = self.stream.char()
+ if data in spaceCharacters:
+ self.state = self.states["beforeAttributeName"]
+ elif data in asciiLetters:
+ self.currentToken["name"] += data +\
+ self.stream.charsUntil(asciiLetters, True)
+ elif data == u">":
+ self.emitCurrentToken()
+ elif data == EOF:
+ self.tokenQueue.append({"type": "ParseError", "data":
+ _(u"Unexpected end of file in the tag name.")})
+ self.emitCurrentToken()
+ elif data == u"/":
+ self.processSolidusInTag()
+ self.state = self.states["beforeAttributeName"]
+ else:
+ self.currentToken["name"] += data
+ return True
+
+ def beforeAttributeNameState(self):
+ data = self.stream.char()
+ if data in spaceCharacters:
+ self.stream.charsUntil(spaceCharacters, True)
+ elif data in asciiLetters:
+ self.currentToken["data"].append([data, ""])
+ self.state = self.states["attributeName"]
+ elif data == u">":
+ self.emitCurrentToken()
+ elif data == u"/":
+ self.processSolidusInTag()
+ elif data == EOF:
+ self.tokenQueue.append({"type": "ParseError", "data":
+ _(u"Unexpected end of file. Expected attribute name instead.")})
+ self.emitCurrentToken()
+ else:
+ self.currentToken["data"].append([data, ""])
+ self.state = self.states["attributeName"]
+ return True
+
+ def attributeNameState(self):
+ data = self.stream.char()
+ leavingThisState = True
+ emitToken = False
+ if data == u"=":
+ self.state = self.states["beforeAttributeValue"]
+ elif data in asciiLetters:
+ self.currentToken["data"][-1][0] += data +\
+ self.stream.charsUntil(asciiLetters, True)
+ leavingThisState = False
+ elif data == u">":
+ # XXX If we emit here the attributes are converted to a dict
+ # without being checked and when the code below runs we error
+ # because data is a dict not a list
+ emitToken = True
+ elif data in spaceCharacters:
+ self.state = self.states["afterAttributeName"]
+ elif data == u"/":
+ self.processSolidusInTag()
+ self.state = self.states["beforeAttributeName"]
+ elif data == EOF:
+ self.tokenQueue.append({"type": "ParseError", "data":
+ _(u"Unexpected end of file in attribute name.")})
+ self.state = self.states["data"]
+ emitToken = True
+ else:
+ self.currentToken["data"][-1][0] += data
+ leavingThisState = False
+
+ if leavingThisState:
+ # Attributes are not dropped at this stage. That happens when the
+ # start tag token is emitted so values can still be safely appended
+ # to attributes, but we do want to report the parse error in time.
+ if self.lowercaseAttrName:
+ self.currentToken["data"][-1][0] = (
+ self.currentToken["data"][-1][0].translate(asciiUpper2Lower))
+ for name, value in self.currentToken["data"][:-1]:
+ if self.currentToken["data"][-1][0] == name:
+ self.tokenQueue.append({"type": "ParseError", "data":
+ _(u"Dropped duplicate attribute on tag.")})
+ break
+ # XXX Fix for above XXX
+ if emitToken:
+ self.emitCurrentToken()
+ return True
+
+ def afterAttributeNameState(self):
+ data = self.stream.char()
+ if data in spaceCharacters:
+ self.stream.charsUntil(spaceCharacters, True)
+ elif data == u"=":
+ self.state = self.states["beforeAttributeValue"]
+ elif data == u">":
+ self.emitCurrentToken()
+ elif data in asciiLetters:
+ self.currentToken["data"].append([data, ""])
+ self.state = self.states["attributeName"]
+ elif data == u"/":
+ self.processSolidusInTag()
+ self.state = self.states["beforeAttributeName"]
+ elif data == EOF:
+ self.tokenQueue.append({"type": "ParseError", "data":
+ _(u"Unexpected end of file. Expected = or end of tag.")})
+ self.emitCurrentToken()
+ else:
+ self.currentToken["data"].append([data, ""])
+ self.state = self.states["attributeName"]
+ return True
+
+ def beforeAttributeValueState(self):
+ data = self.stream.char()
+ if data in spaceCharacters:
+ self.stream.charsUntil(spaceCharacters, True)
+ elif data == u"\"":
+ self.state = self.states["attributeValueDoubleQuoted"]
+ elif data == u"&":
+ self.state = self.states["attributeValueUnQuoted"]
+ self.stream.unget(data);
+ elif data == u"'":
+ self.state = self.states["attributeValueSingleQuoted"]
+ elif data == u">":
+ self.emitCurrentToken()
+ elif data == EOF:
+ self.tokenQueue.append({"type": "ParseError", "data":
+ _(u"Unexpected end of file. Expected attribute value.")})
+ self.emitCurrentToken()
+ else:
+ self.currentToken["data"][-1][1] += data
+ self.state = self.states["attributeValueUnQuoted"]
+ return True
+
+ def attributeValueDoubleQuotedState(self):
+ data = self.stream.char()
+ if data == "\"":
+ self.state = self.states["beforeAttributeName"]
+ elif data == u"&":
+ self.processEntityInAttribute()
+ elif data == EOF:
+ self.tokenQueue.append({"type": "ParseError", "data":
+ _(u"Unexpected end of file in attribute value (\").")})
+ self.emitCurrentToken()
+ else:
+ self.currentToken["data"][-1][1] += data +\
+ self.stream.charsUntil(("\"", u"&"))
+ return True
+
+ def attributeValueSingleQuotedState(self):
+ data = self.stream.char()
+ if data == "'":
+ self.state = self.states["beforeAttributeName"]
+ elif data == u"&":
+ self.processEntityInAttribute()
+ elif data == EOF:
+ self.tokenQueue.append({"type": "ParseError", "data":
+ _(u"Unexpected end of file in attribute value (').")})
+ self.emitCurrentToken()
+ else:
+ self.currentToken["data"][-1][1] += data +\
+ self.stream.charsUntil(("'", u"&"))
+ return True
+
+ def attributeValueUnQuotedState(self):
+ data = self.stream.char()
+ if data in spaceCharacters:
+ self.state = self.states["beforeAttributeName"]
+ elif data == u"&":
+ self.processEntityInAttribute()
+ elif data == u">":
+ self.emitCurrentToken()
+ elif data == EOF:
+ self.tokenQueue.append({"type": "ParseError", "data":
+ _(u"Unexpected end of file in attribute value.")})
+ self.emitCurrentToken()
+ else:
+ self.currentToken["data"][-1][1] += data + self.stream.charsUntil( \
+ frozenset(("&", ">","<")) | spaceCharacters)
+ return True
+
+ def bogusCommentState(self):
+ # Make a new comment token and give it as value all the characters
+ # until the first > or EOF (charsUntil checks for EOF automatically)
+ # and emit it.
+ self.tokenQueue.append(
+ {"type": "Comment", "data": self.stream.charsUntil((u">"))})
+
+ # Eat the character directly after the bogus comment which is either a
+ # ">" or an EOF.
+ self.stream.char()
+ self.state = self.states["data"]
+ return True
+
+ def markupDeclarationOpenState(self):
+ charStack = [self.stream.char(), self.stream.char()]
+ if charStack == [u"-", u"-"]:
+ self.currentToken = {"type": "Comment", "data": u""}
+ self.state = self.states["commentStart"]
+ else:
+ for x in xrange(5):
+ charStack.append(self.stream.char())
+ # Put in explicit EOF check
+ if (not EOF in charStack and
+ "".join(charStack).upper() == u"DOCTYPE"):
+ self.currentToken = {"type":"Doctype", "name":u"",
+ "publicId":None, "systemId":None, "correct":True}
+ self.state = self.states["doctype"]
+ else:
+ self.tokenQueue.append({"type": "ParseError", "data":
+ _(u"Expected '--' or 'DOCTYPE'. Not found.")})
+ self.stream.unget(charStack)
+ self.state = self.states["bogusComment"]
+ return True
+
+ def commentStartState(self):
+ data = self.stream.char()
+ if data == "-":
+ self.state = self.states["commentStartDash"]
+ elif data == ">":
+ self.tokenQueue.append({"type": "ParseError", "data":
+ _(u"Incorrect comment.")})
+ self.tokenQueue.append(self.currentToken)
+ self.state = self.states["data"]
+ elif data == EOF:
+ self.tokenQueue.append({"type": "ParseError", "data":
+ _(u"Unexpected end of file in comment.")})
+ self.tokenQueue.append(self.currentToken)
+ self.state = self.states["data"]
+ else:
+ self.currentToken["data"] += data + self.stream.charsUntil(u"-")
+ self.state = self.states["comment"]
+ return True
+
+ def commentStartDashState(self):
+ data = self.stream.char()
+ if data == "-":
+ self.state = self.states["commentEnd"]
+ elif data == ">":
+ self.tokenQueue.append({"type": "ParseError", "data":
+ _(u"Incorrect comment.")})
+ self.tokenQueue.append(self.currentToken)
+ self.state = self.states["data"]
+ elif data == EOF:
+ self.tokenQueue.append({"type": "ParseError", "data":
+ _(u"Unexpected end of file in comment.")})
+ self.tokenQueue.append(self.currentToken)
+ self.state = self.states["data"]
+ else:
+ self.currentToken["data"] += "-" + data + self.stream.charsUntil(u"-")
+ self.state = self.states["comment"]
+ return True
+
+
+ def commentState(self):
+ data = self.stream.char()
+ if data == u"-":
+ self.state = self.states["commentEndDash"]
+ elif data == EOF:
+ self.tokenQueue.append({"type": "ParseError", "data":
+ _(u"Unexpected end of file in comment.")})
+ self.tokenQueue.append(self.currentToken)
+ self.state = self.states["data"]
+ else:
+ self.currentToken["data"] += data + self.stream.charsUntil(u"-")
+ return True
+
+ def commentEndDashState(self):
+ data = self.stream.char()
+ if data == u"-":
+ self.state = self.states["commentEnd"]
+ elif data == EOF:
+ self.tokenQueue.append({"type": "ParseError", "data":
+ _(u"Unexpected end of file in comment (-)")})
+ self.tokenQueue.append(self.currentToken)
+ self.state = self.states["data"]
+ else:
+ self.currentToken["data"] += u"-" + data +\
+ self.stream.charsUntil(u"-")
+ # Consume the next character which is either a "-" or an EOF as
+ # well so if there's a "-" directly after the "-" we go nicely to
+ # the "comment end state" without emitting a ParseError() there.
+ self.stream.char()
+ return True
+
+ def commentEndState(self):
+ data = self.stream.char()
+ if data == u">":
+ self.tokenQueue.append(self.currentToken)
+ self.state = self.states["data"]
+ elif data == u"-":
+ self.tokenQueue.append({"type": "ParseError", "data":
+ _(u"Unexpected '-' after '--' found in comment.")})
+ self.currentToken["data"] += data
+ elif data == EOF:
+ self.tokenQueue.append({"type": "ParseError", "data":
+ _(u"Unexpected end of file in comment (--).")})
+ self.tokenQueue.append(self.currentToken)
+ self.state = self.states["data"]
+ else:
+ # XXX
+ self.tokenQueue.append({"type": "ParseError", "data":
+ _(u"Unexpected character in comment found.")})
+ self.currentToken["data"] += u"--" + data
+ self.state = self.states["comment"]
+ return True
+
+ def doctypeState(self):
+ data = self.stream.char()
+ if data in spaceCharacters:
+ self.state = self.states["beforeDoctypeName"]
+ else:
+ self.tokenQueue.append({"type": "ParseError", "data":
+ _(u"No space after literal string 'DOCTYPE'.")})
+ self.stream.unget(data)
+ self.state = self.states["beforeDoctypeName"]
+ return True
+
+ def beforeDoctypeNameState(self):
+ data = self.stream.char()
+ if data in spaceCharacters:
+ pass
+ elif data == u">":
+ self.tokenQueue.append({"type": "ParseError", "data":
+ _(u"Unexpected > character. Expected DOCTYPE name.")})
+ self.currentToken["correct"] = False
+ self.tokenQueue.append(self.currentToken)
+ self.state = self.states["data"]
+ elif data == EOF:
+ self.tokenQueue.append({"type": "ParseError", "data":
+ _(u"Unexpected end of file. Expected DOCTYPE name.")})
+ self.currentToken["correct"] = False
+ self.tokenQueue.append(self.currentToken)
+ self.state = self.states["data"]
+ else:
+ self.currentToken["name"] = data
+ self.state = self.states["doctypeName"]
+ return True
+
+ def doctypeNameState(self):
+ data = self.stream.char()
+ if data in spaceCharacters:
+ self.state = self.states["afterDoctypeName"]
+ elif data == u">":
+ self.tokenQueue.append(self.currentToken)
+ self.state = self.states["data"]
+ elif data == EOF:
+ self.tokenQueue.append({"type": "ParseError", "data":
+ _(u"Unexpected end of file in DOCTYPE name.")})
+ self.currentToken["correct"] = False
+ self.tokenQueue.append(self.currentToken)
+ self.state = self.states["data"]
+ else:
+ self.currentToken["name"] += data
+ return True
+
+ def afterDoctypeNameState(self):
+ data = self.stream.char()
+ if data in spaceCharacters:
+ pass
+ elif data == u">":
+ self.tokenQueue.append(self.currentToken)
+ self.state = self.states["data"]
+ elif data == EOF:
+ self.currentToken["correct"] = False
+ self.stream.unget(data)
+ self.tokenQueue.append({"type": "ParseError", "data":
+ _(u"Unexpected end of file in DOCTYPE.")})
+ self.tokenQueue.append(self.currentToken)
+ self.state = self.states["data"]
+ else:
+ charStack = [data]
+ for x in xrange(5):
+ charStack.append(self.stream.char())
+ if EOF not in charStack and\
+ "".join(charStack).translate(asciiUpper2Lower) == "public":
+ self.state = self.states["beforeDoctypePublicIdentifier"]
+ elif EOF not in charStack and\
+ "".join(charStack).translate(asciiUpper2Lower) == "system":
+ self.state = self.states["beforeDoctypeSystemIdentifier"]
+ else:
+ self.stream.unget(charStack)
+ self.tokenQueue.append({"type": "ParseError", "data":
+ _(u"Expected space or '>'. Got '%s'") % (data,)})
+ self.state = self.states["bogusDoctype"]
+ return True
+
+ def beforeDoctypePublicIdentifierState(self):
+ data = self.stream.char()
+ if data in spaceCharacters:
+ pass
+ elif data == "\"":
+ self.currentToken["publicId"] = u""
+ self.state = self.states["doctypePublicIdentifierDoubleQuoted"]
+ elif data == "'":
+ self.currentToken["publicId"] = u""
+ self.state = self.states["doctypePublicIdentifierSingleQuoted"]
+ elif data == ">":
+ self.tokenQueue.append({"type": "ParseError", "data":
+ _(u"Unexpected end of DOCTYPE.")})
+ self.currentToken["correct"] = False
+ self.tokenQueue.append(self.currentToken)
+ self.state = self.states["data"]
+ elif data == EOF:
+ self.tokenQueue.append({"type": "ParseError", "data":
+ _(u"Unexpected end of file in DOCTYPE.")})
+ self.currentToken["correct"] = False
+ self.tokenQueue.append(self.currentToken)
+ self.state = self.states["data"]
+ else:
+ self.tokenQueue.append({"type": "ParseError", "data":
+ _(u"Unexpected character in DOCTYPE.")})
+ self.state = self.states["bogusDoctype"]
+ return True
+
+ def doctypePublicIdentifierDoubleQuotedState(self):
+ data = self.stream.char()
+ if data == "\"":
+ self.state = self.states["afterDoctypePublicIdentifier"]
+ elif data == EOF:
+ self.tokenQueue.append({"type": "ParseError", "data":
+ _(u"Unexpected end of file in DOCTYPE.")})
+ self.currentToken["correct"] = False
+ self.tokenQueue.append(self.currentToken)
+ self.state = self.states["data"]
+ else:
+ self.currentToken["publicId"] += data
+ return True
+
+ def doctypePublicIdentifierSingleQuotedState(self):
+ data = self.stream.char()
+ if data == "'":
+ self.state = self.states["afterDoctypePublicIdentifier"]
+ elif data == EOF:
+ self.tokenQueue.append({"type": "ParseError", "data":
+ _(u"Unexpected end of file in DOCTYPE.")})
+ self.currentToken["correct"] = False
+ self.tokenQueue.append(self.currentToken)
+ self.state = self.states["data"]
+ else:
+ self.currentToken["publicId"] += data
+ return True
+
+ def afterDoctypePublicIdentifierState(self):
+ data = self.stream.char()
+ if data in spaceCharacters:
+ pass
+ elif data == "\"":
+ self.currentToken["systemId"] = u""
+ self.state = self.states["doctypeSystemIdentifierDoubleQuoted"]
+ elif data == "'":
+ self.currentToken["systemId"] = u""
+ self.state = self.states["doctypeSystemIdentifierSingleQuoted"]
+ elif data == ">":
+ self.tokenQueue.append(self.currentToken)
+ self.state = self.states["data"]
+ elif data == EOF:
+ self.tokenQueue.append({"type": "ParseError", "data":
+ _(u"Unexpected end of file in DOCTYPE.")})
+ self.currentToken["correct"] = False
+ self.tokenQueue.append(self.currentToken)
+ self.state = self.states["data"]
+ else:
+ self.tokenQueue.append({"type": "ParseError", "data":
+ _(u"Unexpected character in DOCTYPE.")})
+ self.state = self.states["bogusDoctype"]
+ return True
+
+ def beforeDoctypeSystemIdentifierState(self):
+ data = self.stream.char()
+ if data in spaceCharacters:
+ pass
+ elif data == "\"":
+ self.currentToken["systemId"] = u""
+ self.state = self.states["doctypeSystemIdentifierDoubleQuoted"]
+ elif data == "'":
+ self.currentToken["systemId"] = u""
+ self.state = self.states["doctypeSystemIdentifierSingleQuoted"]
+ elif data == ">":
+ self.tokenQueue.append({"type": "ParseError", "data":
+ _(u"Unexpected character in DOCTYPE.")})
+ self.currentToken["correct"] = False
+ self.tokenQueue.append(self.currentToken)
+ self.state = self.states["data"]
+ elif data == EOF:
+ self.tokenQueue.append({"type": "ParseError", "data":
+ _(u"Unexpected end of file in DOCTYPE.")})
+ self.currentToken["correct"] = False
+ self.tokenQueue.append(self.currentToken)
+ self.state = self.states["data"]
+ else:
+ self.tokenQueue.append({"type": "ParseError", "data":
+ _(u"Unexpected character in DOCTYPE.")})
+ self.state = self.states["bogusDoctype"]
+ return True
+
+ def doctypeSystemIdentifierDoubleQuotedState(self):
+ data = self.stream.char()
+ if data == "\"":
+ self.state = self.states["afterDoctypeSystemIdentifier"]
+ elif data == EOF:
+ self.tokenQueue.append({"type": "ParseError", "data":
+ _(u"Unexpected end of file in DOCTYPE.")})
+ self.currentToken["correct"] = False
+ self.tokenQueue.append(self.currentToken)
+ self.state = self.states["data"]
+ else:
+ self.currentToken["systemId"] += data
+ return True
+
+ def doctypeSystemIdentifierSingleQuotedState(self):
+ data = self.stream.char()
+ if data == "'":
+ self.state = self.states["afterDoctypeSystemIdentifier"]
+ elif data == EOF:
+ self.tokenQueue.append({"type": "ParseError", "data":
+ _(u"Unexpected end of file in DOCTYPE.")})
+ self.currentToken["correct"] = False
+ self.tokenQueue.append(self.currentToken)
+ self.state = self.states["data"]
+ else:
+ self.currentToken["systemId"] += data
+ return True
+
+ def afterDoctypeSystemIdentifierState(self):
+ data = self.stream.char()
+ if data in spaceCharacters:
+ pass
+ elif data == ">":
+ self.tokenQueue.append(self.currentToken)
+ self.state = self.states["data"]
+ elif data == EOF:
+ self.tokenQueue.append({"type": "ParseError", "data":
+ _(u"Unexpected end of file in DOCTYPE.")})
+ self.currentToken["correct"] = False
+ self.tokenQueue.append(self.currentToken)
+ self.state = self.states["data"]
+ else:
+ self.tokenQueue.append({"type": "ParseError", "data":
+ _(u"Unexpected character in DOCTYPE.")})
+ self.state = self.states["bogusDoctype"]
+ return True
+
+ def bogusDoctypeState(self):
+ data = self.stream.char()
+ self.currentToken["correct"] = False
+ if data == u">":
+ self.tokenQueue.append(self.currentToken)
+ self.state = self.states["data"]
+ elif data == EOF:
+ # XXX EMIT
+ self.stream.unget(data)
+ self.tokenQueue.append({"type": "ParseError", "data":
+ _(u"Unexpected end of file in bogus doctype.")})
+ self.tokenQueue.append(self.currentToken)
+ self.state = self.states["data"]
+ else:
+ pass
+ return True
Deleted: trunk/lib/venus/planet/vendor/html5lib/treebuilders/__init__.py
===================================================================
--- branches/sucs-site/lib/venus/planet/vendor/html5lib/treebuilders/__init__.py 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/lib/venus/planet/vendor/html5lib/treebuilders/__init__.py 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,65 +0,0 @@
-"""A collection of modules for building different kinds of tree from
-HTML documents.
-
-To create a treebuilder for a new type of tree, you need to do
-implement several things:
-
-1) A set of classes for various types of elements: Document, Doctype,
-Comment, Element. These must implement the interface of
-_base.treebuilders.Node (although comment nodes have a different
-signature for their constructor, see treebuilders.simpletree.Comment)
-Textual content may also be implemented as another node type, or not, as
-your tree implementation requires.
-
-2) A treebuilder object (called TreeBuilder by convention) that
-inherits from treebuilders._base.TreeBuilder. This has 4 required attributes:
-documentClass - the class to use for the bottommost node of a document
-elementClass - the class to use for HTML Elements
-commentClass - the class to use for comments
-doctypeClass - the class to use for doctypes
-It also has one required method:
-getDocument - Returns the root node of the complete document tree
-
-3) If you wish to run the unit tests, you must also create a
-testSerializer method on your treebuilder which accepts a node and
-returns a string containing Node and its children serialized according
-to the format used in the unittests
-
-The supplied simpletree module provides a python-only implementation
-of a full treebuilder and is a useful reference for the semantics of
-the various methods.
-"""
-
-treeBuilderCache = {}
-
-def getTreeBuilder(treeType, implementation=None, **kwargs):
- """Get a TreeBuilder class for various types of tree with built-in support
-
- treeType - the name of the tree type required (case-insensitive). Supported
- values are "simpletree", "dom", "etree" and "beautifulsoup"
-
- "simpletree" - a built-in DOM-ish tree type with support for some
- more pythonic idioms.
- "dom" - The xml.dom.minidom DOM implementation
- "etree" - A generic builder for tree implementations exposing an
- elementtree-like interface (known to work with
- ElementTree, cElementTree and lxml.etree).
- "beautifulsoup" - Beautiful soup (if installed)
-
- implementation - (Currently applies to the "etree" tree type only). A module
- implementing the tree type e.g. xml.etree.ElementTree or
- lxml.etree."""
-
- treeType = treeType.lower()
- if treeType not in treeBuilderCache:
- if treeType in ("dom", "simpletree"):
- mod = __import__(treeType, globals())
- treeBuilderCache[treeType] = mod.TreeBuilder
- elif treeType == "beautifulsoup":
- import soup
- treeBuilderCache[treeType] = soup.TreeBuilder
- elif treeType == "etree":
- import etree
- # XXX: NEVER cache here, caching is done in the etree submodule
- return etree.getETreeModule(implementation, **kwargs).TreeBuilder
- return treeBuilderCache.get(treeType)
Copied: trunk/lib/venus/planet/vendor/html5lib/treebuilders/__init__.py (from rev 656, branches/sucs-site/lib/venus/planet/vendor/html5lib/treebuilders/__init__.py)
===================================================================
--- trunk/lib/venus/planet/vendor/html5lib/treebuilders/__init__.py (rev 0)
+++ trunk/lib/venus/planet/vendor/html5lib/treebuilders/__init__.py 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,65 @@
+"""A collection of modules for building different kinds of tree from
+HTML documents.
+
+To create a treebuilder for a new type of tree, you need to do
+implement several things:
+
+1) A set of classes for various types of elements: Document, Doctype,
+Comment, Element. These must implement the interface of
+_base.treebuilders.Node (although comment nodes have a different
+signature for their constructor, see treebuilders.simpletree.Comment)
+Textual content may also be implemented as another node type, or not, as
+your tree implementation requires.
+
+2) A treebuilder object (called TreeBuilder by convention) that
+inherits from treebuilders._base.TreeBuilder. This has 4 required attributes:
+documentClass - the class to use for the bottommost node of a document
+elementClass - the class to use for HTML Elements
+commentClass - the class to use for comments
+doctypeClass - the class to use for doctypes
+It also has one required method:
+getDocument - Returns the root node of the complete document tree
+
+3) If you wish to run the unit tests, you must also create a
+testSerializer method on your treebuilder which accepts a node and
+returns a string containing Node and its children serialized according
+to the format used in the unittests
+
+The supplied simpletree module provides a python-only implementation
+of a full treebuilder and is a useful reference for the semantics of
+the various methods.
+"""
+
+treeBuilderCache = {}
+
+def getTreeBuilder(treeType, implementation=None, **kwargs):
+ """Get a TreeBuilder class for various types of tree with built-in support
+
+ treeType - the name of the tree type required (case-insensitive). Supported
+ values are "simpletree", "dom", "etree" and "beautifulsoup"
+
+ "simpletree" - a built-in DOM-ish tree type with support for some
+ more pythonic idioms.
+ "dom" - The xml.dom.minidom DOM implementation
+ "etree" - A generic builder for tree implementations exposing an
+ elementtree-like interface (known to work with
+ ElementTree, cElementTree and lxml.etree).
+ "beautifulsoup" - Beautiful soup (if installed)
+
+ implementation - (Currently applies to the "etree" tree type only). A module
+ implementing the tree type e.g. xml.etree.ElementTree or
+ lxml.etree."""
+
+ treeType = treeType.lower()
+ if treeType not in treeBuilderCache:
+ if treeType in ("dom", "simpletree"):
+ mod = __import__(treeType, globals())
+ treeBuilderCache[treeType] = mod.TreeBuilder
+ elif treeType == "beautifulsoup":
+ import soup
+ treeBuilderCache[treeType] = soup.TreeBuilder
+ elif treeType == "etree":
+ import etree
+ # XXX: NEVER cache here, caching is done in the etree submodule
+ return etree.getETreeModule(implementation, **kwargs).TreeBuilder
+ return treeBuilderCache.get(treeType)
Deleted: trunk/lib/venus/planet/vendor/html5lib/treebuilders/_base.py
===================================================================
--- branches/sucs-site/lib/venus/planet/vendor/html5lib/treebuilders/_base.py 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/lib/venus/planet/vendor/html5lib/treebuilders/_base.py 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,330 +0,0 @@
-from html5lib.constants import scopingElements, tableInsertModeElements
-try:
- frozenset
-except NameError:
- # Import from the sets module for python 2.3
- from sets import Set as set
- from sets import ImmutableSet as frozenset
-
-# The scope markers are inserted when entering buttons, object elements,
-# marquees, table cells, and table captions, and are used to prevent formatting
-# from "leaking" into tables, buttons, object elements, and marquees.
-Marker = None
-
-#XXX - TODO; make the default interface more ElementTree-like
-# rather than DOM-like
-
-class Node(object):
- def __init__(self, name):
- """Node representing an item in the tree.
- name - The tag name associated with the node
- parent - The parent of the current node (or None for the document node)
- value - The value of the current node (applies to text nodes and
- comments
- attributes - a dict holding name, value pairs for attributes of the node
- childNodes - a list of child nodes of the current node. This must
- include all elements but not necessarily other node types
- _flags - A list of miscellaneous flags that can be set on the node
- """
- self.name = name
- self.parent = None
- self.value = None
- self.attributes = {}
- self.childNodes = []
- self._flags = []
-
- def __unicode__(self):
- attributesStr = " ".join(["%s=\"%s\""%(name, value)
- for name, value in
- self.attributes.iteritems()])
- if attributesStr:
- return "<%s %s>"%(self.name,attributesStr)
- else:
- return "<%s>"%(self.name)
-
- def __repr__(self):
- return "<%s %s>" % (self.__class__, self.name)
-
- def appendChild(self, node):
- """Insert node as a child of the current node
- """
- raise NotImplementedError
-
- def insertText(self, data, insertBefore=None):
- """Insert data as text in the current node, positioned before the
- start of node insertBefore or to the end of the node's text.
- """
- raise NotImplementedError
-
- def insertBefore(self, node, refNode):
- """Insert node as a child of the current node, before refNode in the
- list of child nodes. Raises ValueError if refNode is not a child of
- the current node"""
- raise NotImplementedError
-
- def removeChild(self, node):
- """Remove node from the children of the current node
- """
- raise NotImplementedError
-
- def reparentChildren(self, newParent):
- """Move all the children of the current node to newParent.
- This is needed so that trees that don't store text as nodes move the
- text in the correct way
- """
- #XXX - should this method be made more general?
- for child in self.childNodes:
- newParent.appendChild(child)
- self.childNodes = []
-
- def cloneNode(self):
- """Return a shallow copy of the current node i.e. a node with the same
- name and attributes but with no parent or child nodes
- """
- raise NotImplementedError
-
-
- def hasContent(self):
- """Return true if the node has children or text, false otherwise
- """
- raise NotImplementedError
-
-class TreeBuilder(object):
- """Base treebuilder implementation
- documentClass - the class to use for the bottommost node of a document
- elementClass - the class to use for HTML Elements
- commentClass - the class to use for comments
- doctypeClass - the class to use for doctypes
- """
-
- #Document class
- documentClass = None
-
- #The class to use for creating a node
- elementClass = None
-
- #The class to use for creating comments
- commentClass = None
-
- #The class to use for creating doctypes
- doctypeClass = None
-
- #Fragment class
- fragmentClass = None
-
- def __init__(self):
- self.reset()
-
- def reset(self):
- self.openElements = []
- self.activeFormattingElements = []
-
- #XXX - rename these to headElement, formElement
- self.headPointer = None
- self.formPointer = None
-
- self.insertFromTable = False
-
- self.document = self.documentClass()
-
- def elementInScope(self, target, tableVariant=False):
- # Exit early when possible.
- if self.openElements[-1].name == target:
- return True
-
- # AT Use reverse instead of [::-1] when we can rely on Python 2.4
- # AT How about while True and simply set node to [-1] and set it to
- # [-2] at the end...
- for node in self.openElements[::-1]:
- if node.name == target:
- return True
- elif node.name == "table":
- return False
- elif not tableVariant and node.name in scopingElements:
- return False
- elif node.name == "html":
- return False
- assert False # We should never reach this point
-
- def reconstructActiveFormattingElements(self):
- # Within this algorithm the order of steps described in the
- # specification is not quite the same as the order of steps in the
- # code. It should still do the same though.
-
- # Step 1: stop the algorithm when there's nothing to do.
- if not self.activeFormattingElements:
- return
-
- # Step 2 and step 3: we start with the last element. So i is -1.
- i = -1
- entry = self.activeFormattingElements[i]
- if entry == Marker or entry in self.openElements:
- return
-
- # Step 6
- while entry != Marker and entry not in self.openElements:
- # Step 5: let entry be one earlier in the list.
- i -= 1
- try:
- entry = self.activeFormattingElements[i]
- except:
- # Step 4: at this point we need to jump to step 8. By not doing
- # i += 1 which is also done in step 7 we achieve that.
- break
- while True:
- # Step 7
- i += 1
-
- # Step 8
- clone = self.activeFormattingElements[i].cloneNode()
-
- # Step 9
- element = self.insertElement(clone.name, clone.attributes)
-
- # Step 10
- self.activeFormattingElements[i] = element
-
- # Step 11
- if element == self.activeFormattingElements[-1]:
- break
-
- def clearActiveFormattingElements(self):
- entry = self.activeFormattingElements.pop()
- while self.activeFormattingElements and entry != Marker:
- entry = self.activeFormattingElements.pop()
-
- def elementInActiveFormattingElements(self, name):
- """Check if an element exists between the end of the active
- formatting elements and the last marker. If it does, return it, else
- return false"""
-
- for item in self.activeFormattingElements[::-1]:
- # Check for Marker first because if it's a Marker it doesn't have a
- # name attribute.
- if item == Marker:
- break
- elif item.name == name:
- return item
- return False
-
- def insertDoctype(self, name, publicId, systemId):
- doctype = self.doctypeClass(name)
- doctype.publicId = publicId
- doctype.systemId = systemId
- self.document.appendChild(doctype)
-
- def insertComment(self, data, parent=None):
- if parent is None:
- parent = self.openElements[-1]
- parent.appendChild(self.commentClass(data))
-
- def createElement(self, name, attributes):
- """Create an element but don't insert it anywhere"""
- element = self.elementClass(name)
- element.attributes = attributes
- return element
-
- def _getInsertFromTable(self):
- return self._insertFromTable
-
- def _setInsertFromTable(self, value):
- """Switch the function used to insert an element from the
- normal one to the misnested table one and back again"""
- self._insertFromTable = value
- if value:
- self.insertElement = self.insertElementTable
- else:
- self.insertElement = self.insertElementNormal
-
- insertFromTable = property(_getInsertFromTable, _setInsertFromTable)
-
- def insertElementNormal(self, name, attributes):
- element = self.elementClass(name)
- element.attributes = attributes
- self.openElements[-1].appendChild(element)
- self.openElements.append(element)
- return element
-
- def insertElementTable(self, name, attributes):
- """Create an element and insert it into the tree"""
- element = self.elementClass(name)
- element.attributes = attributes
- if self.openElements[-1].name not in tableInsertModeElements:
- return self.insertElementNormal(name, attributes)
- else:
- #We should be in the InTable mode. This means we want to do
- #special magic element rearranging
- parent, insertBefore = self.getTableMisnestedNodePosition()
- if insertBefore is None:
- parent.appendChild(element)
- else:
- parent.insertBefore(element, insertBefore)
- self.openElements.append(element)
- return element
-
- def insertText(self, data, parent=None):
- """Insert text data."""
- if parent is None:
- parent = self.openElements[-1]
-
- if (not(self.insertFromTable) or (self.insertFromTable and
- self.openElements[-1].name not in
- tableInsertModeElements)):
- parent.insertText(data)
- else:
- #We should be in the InTable mode. This means we want to do
- #special magic element rearranging
- parent, insertBefore = self.getTableMisnestedNodePosition()
- parent.insertText(data, insertBefore)
-
- def getTableMisnestedNodePosition(self):
- """Get the foster parent element, and sibling to insert before
- (or None) when inserting a misnested table node"""
- #The foster parent element is the one which comes before the most
- #recently opened table element
- #XXX - this is really inelegant
- lastTable=None
- fosterParent = None
- insertBefore = None
- for elm in self.openElements[::-1]:
- if elm.name == u"table":
- lastTable = elm
- break
- if lastTable:
- #XXX - we should really check that this parent is actually a
- #node here
- if lastTable.parent:
- fosterParent = lastTable.parent
- insertBefore = lastTable
- else:
- fosterParent = self.openElements[
- self.openElements.index(lastTable) - 1]
- else:
- fosterParent = self.openElements[0]
- return fosterParent, insertBefore
-
- def generateImpliedEndTags(self, exclude=None):
- name = self.openElements[-1].name
- # XXX td, th and tr are not actually needed
- if (name in frozenset(("dd", "dt", "li", "p", "td", "th", "tr"))
- and name != exclude):
- self.openElements.pop()
- # XXX This is not entirely what the specification says. We should
- # investigate it more closely.
- self.generateImpliedEndTags(exclude)
-
- def getDocument(self):
- "Return the final tree"
- return self.document
-
- def getFragment(self):
- "Return the final fragment"
- #assert self.innerHTML
- fragment = self.fragmentClass()
- self.openElements[0].reparentChildren(fragment)
- return fragment
-
- def testSerializer(self, node):
- """Serialize the subtree of node in the format required by unit tests
- node - the node from which to start serializing"""
- raise NotImplementedError
Copied: trunk/lib/venus/planet/vendor/html5lib/treebuilders/_base.py (from rev 656, branches/sucs-site/lib/venus/planet/vendor/html5lib/treebuilders/_base.py)
===================================================================
--- trunk/lib/venus/planet/vendor/html5lib/treebuilders/_base.py (rev 0)
+++ trunk/lib/venus/planet/vendor/html5lib/treebuilders/_base.py 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,330 @@
+from html5lib.constants import scopingElements, tableInsertModeElements
+try:
+ frozenset
+except NameError:
+ # Import from the sets module for python 2.3
+ from sets import Set as set
+ from sets import ImmutableSet as frozenset
+
+# The scope markers are inserted when entering buttons, object elements,
+# marquees, table cells, and table captions, and are used to prevent formatting
+# from "leaking" into tables, buttons, object elements, and marquees.
+Marker = None
+
+#XXX - TODO; make the default interface more ElementTree-like
+# rather than DOM-like
+
+class Node(object):
+ def __init__(self, name):
+ """Node representing an item in the tree.
+ name - The tag name associated with the node
+ parent - The parent of the current node (or None for the document node)
+ value - The value of the current node (applies to text nodes and
+ comments
+ attributes - a dict holding name, value pairs for attributes of the node
+ childNodes - a list of child nodes of the current node. This must
+ include all elements but not necessarily other node types
+ _flags - A list of miscellaneous flags that can be set on the node
+ """
+ self.name = name
+ self.parent = None
+ self.value = None
+ self.attributes = {}
+ self.childNodes = []
+ self._flags = []
+
+ def __unicode__(self):
+ attributesStr = " ".join(["%s=\"%s\""%(name, value)
+ for name, value in
+ self.attributes.iteritems()])
+ if attributesStr:
+ return "<%s %s>"%(self.name,attributesStr)
+ else:
+ return "<%s>"%(self.name)
+
+ def __repr__(self):
+ return "<%s %s>" % (self.__class__, self.name)
+
+ def appendChild(self, node):
+ """Insert node as a child of the current node
+ """
+ raise NotImplementedError
+
+ def insertText(self, data, insertBefore=None):
+ """Insert data as text in the current node, positioned before the
+ start of node insertBefore or to the end of the node's text.
+ """
+ raise NotImplementedError
+
+ def insertBefore(self, node, refNode):
+ """Insert node as a child of the current node, before refNode in the
+ list of child nodes. Raises ValueError if refNode is not a child of
+ the current node"""
+ raise NotImplementedError
+
+ def removeChild(self, node):
+ """Remove node from the children of the current node
+ """
+ raise NotImplementedError
+
+ def reparentChildren(self, newParent):
+ """Move all the children of the current node to newParent.
+ This is needed so that trees that don't store text as nodes move the
+ text in the correct way
+ """
+ #XXX - should this method be made more general?
+ for child in self.childNodes:
+ newParent.appendChild(child)
+ self.childNodes = []
+
+ def cloneNode(self):
+ """Return a shallow copy of the current node i.e. a node with the same
+ name and attributes but with no parent or child nodes
+ """
+ raise NotImplementedError
+
+
+ def hasContent(self):
+ """Return true if the node has children or text, false otherwise
+ """
+ raise NotImplementedError
+
+class TreeBuilder(object):
+ """Base treebuilder implementation
+ documentClass - the class to use for the bottommost node of a document
+ elementClass - the class to use for HTML Elements
+ commentClass - the class to use for comments
+ doctypeClass - the class to use for doctypes
+ """
+
+ #Document class
+ documentClass = None
+
+ #The class to use for creating a node
+ elementClass = None
+
+ #The class to use for creating comments
+ commentClass = None
+
+ #The class to use for creating doctypes
+ doctypeClass = None
+
+ #Fragment class
+ fragmentClass = None
+
+ def __init__(self):
+ self.reset()
+
+ def reset(self):
+ self.openElements = []
+ self.activeFormattingElements = []
+
+ #XXX - rename these to headElement, formElement
+ self.headPointer = None
+ self.formPointer = None
+
+ self.insertFromTable = False
+
+ self.document = self.documentClass()
+
+ def elementInScope(self, target, tableVariant=False):
+ # Exit early when possible.
+ if self.openElements[-1].name == target:
+ return True
+
+ # AT Use reverse instead of [::-1] when we can rely on Python 2.4
+ # AT How about while True and simply set node to [-1] and set it to
+ # [-2] at the end...
+ for node in self.openElements[::-1]:
+ if node.name == target:
+ return True
+ elif node.name == "table":
+ return False
+ elif not tableVariant and node.name in scopingElements:
+ return False
+ elif node.name == "html":
+ return False
+ assert False # We should never reach this point
+
+ def reconstructActiveFormattingElements(self):
+ # Within this algorithm the order of steps described in the
+ # specification is not quite the same as the order of steps in the
+ # code. It should still do the same though.
+
+ # Step 1: stop the algorithm when there's nothing to do.
+ if not self.activeFormattingElements:
+ return
+
+ # Step 2 and step 3: we start with the last element. So i is -1.
+ i = -1
+ entry = self.activeFormattingElements[i]
+ if entry == Marker or entry in self.openElements:
+ return
+
+ # Step 6
+ while entry != Marker and entry not in self.openElements:
+ # Step 5: let entry be one earlier in the list.
+ i -= 1
+ try:
+ entry = self.activeFormattingElements[i]
+ except:
+ # Step 4: at this point we need to jump to step 8. By not doing
+ # i += 1 which is also done in step 7 we achieve that.
+ break
+ while True:
+ # Step 7
+ i += 1
+
+ # Step 8
+ clone = self.activeFormattingElements[i].cloneNode()
+
+ # Step 9
+ element = self.insertElement(clone.name, clone.attributes)
+
+ # Step 10
+ self.activeFormattingElements[i] = element
+
+ # Step 11
+ if element == self.activeFormattingElements[-1]:
+ break
+
+ def clearActiveFormattingElements(self):
+ entry = self.activeFormattingElements.pop()
+ while self.activeFormattingElements and entry != Marker:
+ entry = self.activeFormattingElements.pop()
+
+ def elementInActiveFormattingElements(self, name):
+ """Check if an element exists between the end of the active
+ formatting elements and the last marker. If it does, return it, else
+ return false"""
+
+ for item in self.activeFormattingElements[::-1]:
+ # Check for Marker first because if it's a Marker it doesn't have a
+ # name attribute.
+ if item == Marker:
+ break
+ elif item.name == name:
+ return item
+ return False
+
+ def insertDoctype(self, name, publicId, systemId):
+ doctype = self.doctypeClass(name)
+ doctype.publicId = publicId
+ doctype.systemId = systemId
+ self.document.appendChild(doctype)
+
+ def insertComment(self, data, parent=None):
+ if parent is None:
+ parent = self.openElements[-1]
+ parent.appendChild(self.commentClass(data))
+
+ def createElement(self, name, attributes):
+ """Create an element but don't insert it anywhere"""
+ element = self.elementClass(name)
+ element.attributes = attributes
+ return element
+
+ def _getInsertFromTable(self):
+ return self._insertFromTable
+
+ def _setInsertFromTable(self, value):
+ """Switch the function used to insert an element from the
+ normal one to the misnested table one and back again"""
+ self._insertFromTable = value
+ if value:
+ self.insertElement = self.insertElementTable
+ else:
+ self.insertElement = self.insertElementNormal
+
+ insertFromTable = property(_getInsertFromTable, _setInsertFromTable)
+
+ def insertElementNormal(self, name, attributes):
+ element = self.elementClass(name)
+ element.attributes = attributes
+ self.openElements[-1].appendChild(element)
+ self.openElements.append(element)
+ return element
+
+ def insertElementTable(self, name, attributes):
+ """Create an element and insert it into the tree"""
+ element = self.elementClass(name)
+ element.attributes = attributes
+ if self.openElements[-1].name not in tableInsertModeElements:
+ return self.insertElementNormal(name, attributes)
+ else:
+ #We should be in the InTable mode. This means we want to do
+ #special magic element rearranging
+ parent, insertBefore = self.getTableMisnestedNodePosition()
+ if insertBefore is None:
+ parent.appendChild(element)
+ else:
+ parent.insertBefore(element, insertBefore)
+ self.openElements.append(element)
+ return element
+
+ def insertText(self, data, parent=None):
+ """Insert text data."""
+ if parent is None:
+ parent = self.openElements[-1]
+
+ if (not(self.insertFromTable) or (self.insertFromTable and
+ self.openElements[-1].name not in
+ tableInsertModeElements)):
+ parent.insertText(data)
+ else:
+ #We should be in the InTable mode. This means we want to do
+ #special magic element rearranging
+ parent, insertBefore = self.getTableMisnestedNodePosition()
+ parent.insertText(data, insertBefore)
+
+ def getTableMisnestedNodePosition(self):
+ """Get the foster parent element, and sibling to insert before
+ (or None) when inserting a misnested table node"""
+ #The foster parent element is the one which comes before the most
+ #recently opened table element
+ #XXX - this is really inelegant
+ lastTable=None
+ fosterParent = None
+ insertBefore = None
+ for elm in self.openElements[::-1]:
+ if elm.name == u"table":
+ lastTable = elm
+ break
+ if lastTable:
+ #XXX - we should really check that this parent is actually a
+ #node here
+ if lastTable.parent:
+ fosterParent = lastTable.parent
+ insertBefore = lastTable
+ else:
+ fosterParent = self.openElements[
+ self.openElements.index(lastTable) - 1]
+ else:
+ fosterParent = self.openElements[0]
+ return fosterParent, insertBefore
+
+ def generateImpliedEndTags(self, exclude=None):
+ name = self.openElements[-1].name
+ # XXX td, th and tr are not actually needed
+ if (name in frozenset(("dd", "dt", "li", "p", "td", "th", "tr"))
+ and name != exclude):
+ self.openElements.pop()
+ # XXX This is not entirely what the specification says. We should
+ # investigate it more closely.
+ self.generateImpliedEndTags(exclude)
+
+ def getDocument(self):
+ "Return the final tree"
+ return self.document
+
+ def getFragment(self):
+ "Return the final fragment"
+ #assert self.innerHTML
+ fragment = self.fragmentClass()
+ self.openElements[0].reparentChildren(fragment)
+ return fragment
+
+ def testSerializer(self, node):
+ """Serialize the subtree of node in the format required by unit tests
+ node - the node from which to start serializing"""
+ raise NotImplementedError
Deleted: trunk/lib/venus/planet/vendor/html5lib/treebuilders/dom.py
===================================================================
--- branches/sucs-site/lib/venus/planet/vendor/html5lib/treebuilders/dom.py 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/lib/venus/planet/vendor/html5lib/treebuilders/dom.py 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,203 +0,0 @@
-import _base
-from xml.dom import minidom, Node, XML_NAMESPACE, XMLNS_NAMESPACE
-
-import re
-illegal_xml_chars = re.compile("[\x01-\x08\x0B\x0C\x0E-\x1F]")
-
-class AttrList:
- def __init__(self, element):
- self.element = element
- def __iter__(self):
- return self.element.attributes.items().__iter__()
- def __setitem__(self, name, value):
- value=illegal_xml_chars.sub(u'\uFFFD',value)
- self.element.setAttribute(name, value)
- def items(self):
- return self.element.attributes.items()
- def keys(self):
- return self.element.attributes.keys()
- def __getitem__(self, name):
- return self.element.getAttribute(name)
-
-class NodeBuilder(_base.Node):
- def __init__(self, element):
- _base.Node.__init__(self, element.nodeName)
- self.element = element
-
- def appendChild(self, node):
- node.parent = self
- self.element.appendChild(node.element)
-
- def insertText(self, data, insertBefore=None):
- data=illegal_xml_chars.sub(u'\uFFFD',data)
- text = self.element.ownerDocument.createTextNode(data)
- if insertBefore:
- self.element.insertBefore(text, insertBefore.element)
- else:
- self.element.appendChild(text)
-
- def insertBefore(self, node, refNode):
- self.element.insertBefore(node.element, refNode.element)
- node.parent = self
-
- def removeChild(self, node):
- if node.element.parentNode == self.element:
- self.element.removeChild(node.element)
- node.parent = None
-
- def reparentChildren(self, newParent):
- while self.element.hasChildNodes():
- child = self.element.firstChild
- self.element.removeChild(child)
- newParent.element.appendChild(child)
- self.childNodes = []
-
- def getAttributes(self):
- return AttrList(self.element)
-
- def setAttributes(self, attributes):
- if attributes:
- for name, value in attributes.items():
- value=illegal_xml_chars.sub(u'\uFFFD',value)
- self.element.setAttribute(name, value)
-
- attributes = property(getAttributes, setAttributes)
-
- def cloneNode(self):
- return NodeBuilder(self.element.cloneNode(False))
-
- def hasContent(self):
- return self.element.hasChildNodes()
-
-class TreeBuilder(_base.TreeBuilder):
- def documentClass(self):
- self.dom = minidom.getDOMImplementation().createDocument(None,None,None)
- return self
-
- def insertDoctype(self, name, publicId, systemId):
- domimpl = minidom.getDOMImplementation()
- doctype = domimpl.createDocumentType(name, publicId, systemId)
- self.document.appendChild(NodeBuilder(doctype))
- doctype.ownerDocument = self.dom
-
- def elementClass(self, name):
- return NodeBuilder(self.dom.createElement(name))
-
- def commentClass(self, data):
- return NodeBuilder(self.dom.createComment(data))
-
- def fragmentClass(self):
- return NodeBuilder(self.dom.createDocumentFragment())
-
- def appendChild(self, node):
- self.dom.appendChild(node.element)
-
- def testSerializer(self, element):
- return testSerializer(element)
-
- def getDocument(self):
- return self.dom
-
- def getFragment(self):
- return _base.TreeBuilder.getFragment(self).element
-
- def insertText(self, data, parent=None):
- data=illegal_xml_chars.sub(u'\uFFFD',data)
- if parent <> self:
- _base.TreeBuilder.insertText(self, data, parent)
- else:
- # HACK: allow text nodes as children of the document node
- if hasattr(self.dom, '_child_node_types'):
- if not Node.TEXT_NODE in self.dom._child_node_types:
- self.dom._child_node_types=list(self.dom._child_node_types)
- self.dom._child_node_types.append(Node.TEXT_NODE)
- self.dom.appendChild(self.dom.createTextNode(data))
-
- name = None
-
-def testSerializer(element):
- element.normalize()
- rv = []
- def serializeElement(element, indent=0):
- if element.nodeType == Node.DOCUMENT_TYPE_NODE:
- if element.name:
- rv.append("|%s<!DOCTYPE %s>"%(' '*indent, element.name))
- else:
- rv.append("|%s<!DOCTYPE >"%(' '*indent,))
- elif element.nodeType == Node.DOCUMENT_NODE:
- rv.append("#document")
- elif element.nodeType == Node.DOCUMENT_FRAGMENT_NODE:
- rv.append("#document-fragment")
- elif element.nodeType == Node.COMMENT_NODE:
- rv.append("|%s<!-- %s -->"%(' '*indent, element.nodeValue))
- elif element.nodeType == Node.TEXT_NODE:
- rv.append("|%s\"%s\"" %(' '*indent, element.nodeValue))
- else:
- rv.append("|%s<%s>"%(' '*indent, element.nodeName))
- if element.hasAttributes():
- for name, value in element.attributes.items():
- rv.append('|%s%s="%s"' % (' '*(indent+2), name, value))
- indent += 2
- for child in element.childNodes:
- serializeElement(child, indent)
- serializeElement(element, 0)
-
- return "\n".join(rv)
-
-def dom2sax(node, handler, nsmap={'xml':XML_NAMESPACE}):
- if node.nodeType == Node.ELEMENT_NODE:
- if not nsmap:
- handler.startElement(node.nodeName, node.attributes)
- for child in node.childNodes: dom2sax(child, handler, nsmap)
- handler.endElement(node.nodeName)
- else:
- attributes = dict(node.attributes.itemsNS())
-
- # gather namespace declarations
- prefixes = []
- for attrname in node.attributes.keys():
- attr = node.getAttributeNode(attrname)
- if (attr.namespaceURI == XMLNS_NAMESPACE or
- (attr.namespaceURI == None and attr.nodeName.startswith('xmlns'))):
- prefix = (attr.localName != 'xmlns' and attr.localName or None)
- handler.startPrefixMapping(prefix, attr.nodeValue)
- prefixes.append(prefix)
- nsmap = nsmap.copy()
- nsmap[prefix] = attr.nodeValue
- del attributes[(attr.namespaceURI, attr.localName)]
-
- # apply namespace declarations
- for attrname in node.attributes.keys():
- attr = node.getAttributeNode(attrname)
- if attr.namespaceURI == None and ':' in attr.nodeName:
- prefix = attr.nodeName.split(':')[0]
- if nsmap.has_key(prefix):
- del attributes[(attr.namespaceURI, attr.localName)]
- attributes[(nsmap[prefix],attr.localName)]=attr.nodeValue
-
- # SAX events
- ns = node.namespaceURI or nsmap.get(None,None)
- handler.startElementNS((ns,node.nodeName), node.nodeName, attributes)
- for child in node.childNodes: dom2sax(child, handler, nsmap)
- handler.endElementNS((ns, node.nodeName), node.nodeName)
- for prefix in prefixes: handler.endPrefixMapping(prefix)
-
- elif node.nodeType in [Node.TEXT_NODE, Node.CDATA_SECTION_NODE]:
- handler.characters(node.nodeValue)
-
- elif node.nodeType == Node.DOCUMENT_NODE:
- handler.startDocument()
- for child in node.childNodes: dom2sax(child, handler, nsmap)
- handler.endDocument()
-
- elif node.nodeType == Node.DOCUMENT_FRAGMENT_NODE:
- for child in node.childNodes: dom2sax(child, handler, nsmap)
-
- else:
- # ATTRIBUTE_NODE
- # ENTITY_NODE
- # PROCESSING_INSTRUCTION_NODE
- # COMMENT_NODE
- # DOCUMENT_TYPE_NODE
- # NOTATION_NODE
- pass
Copied: trunk/lib/venus/planet/vendor/html5lib/treebuilders/dom.py (from rev 656, branches/sucs-site/lib/venus/planet/vendor/html5lib/treebuilders/dom.py)
===================================================================
--- trunk/lib/venus/planet/vendor/html5lib/treebuilders/dom.py (rev 0)
+++ trunk/lib/venus/planet/vendor/html5lib/treebuilders/dom.py 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,203 @@
+import _base
+from xml.dom import minidom, Node, XML_NAMESPACE, XMLNS_NAMESPACE
+
+import re
+illegal_xml_chars = re.compile("[\x01-\x08\x0B\x0C\x0E-\x1F]")
+
+class AttrList:
+ def __init__(self, element):
+ self.element = element
+ def __iter__(self):
+ return self.element.attributes.items().__iter__()
+ def __setitem__(self, name, value):
+ value=illegal_xml_chars.sub(u'\uFFFD',value)
+ self.element.setAttribute(name, value)
+ def items(self):
+ return self.element.attributes.items()
+ def keys(self):
+ return self.element.attributes.keys()
+ def __getitem__(self, name):
+ return self.element.getAttribute(name)
+
+class NodeBuilder(_base.Node):
+ def __init__(self, element):
+ _base.Node.__init__(self, element.nodeName)
+ self.element = element
+
+ def appendChild(self, node):
+ node.parent = self
+ self.element.appendChild(node.element)
+
+ def insertText(self, data, insertBefore=None):
+ data=illegal_xml_chars.sub(u'\uFFFD',data)
+ text = self.element.ownerDocument.createTextNode(data)
+ if insertBefore:
+ self.element.insertBefore(text, insertBefore.element)
+ else:
+ self.element.appendChild(text)
+
+ def insertBefore(self, node, refNode):
+ self.element.insertBefore(node.element, refNode.element)
+ node.parent = self
+
+ def removeChild(self, node):
+ if node.element.parentNode == self.element:
+ self.element.removeChild(node.element)
+ node.parent = None
+
+ def reparentChildren(self, newParent):
+ while self.element.hasChildNodes():
+ child = self.element.firstChild
+ self.element.removeChild(child)
+ newParent.element.appendChild(child)
+ self.childNodes = []
+
+ def getAttributes(self):
+ return AttrList(self.element)
+
+ def setAttributes(self, attributes):
+ if attributes:
+ for name, value in attributes.items():
+ value=illegal_xml_chars.sub(u'\uFFFD',value)
+ self.element.setAttribute(name, value)
+
+ attributes = property(getAttributes, setAttributes)
+
+ def cloneNode(self):
+ return NodeBuilder(self.element.cloneNode(False))
+
+ def hasContent(self):
+ return self.element.hasChildNodes()
+
+class TreeBuilder(_base.TreeBuilder):
+ def documentClass(self):
+ self.dom = minidom.getDOMImplementation().createDocument(None,None,None)
+ return self
+
+ def insertDoctype(self, name, publicId, systemId):
+ domimpl = minidom.getDOMImplementation()
+ doctype = domimpl.createDocumentType(name, publicId, systemId)
+ self.document.appendChild(NodeBuilder(doctype))
+ doctype.ownerDocument = self.dom
+
+ def elementClass(self, name):
+ return NodeBuilder(self.dom.createElement(name))
+
+ def commentClass(self, data):
+ return NodeBuilder(self.dom.createComment(data))
+
+ def fragmentClass(self):
+ return NodeBuilder(self.dom.createDocumentFragment())
+
+ def appendChild(self, node):
+ self.dom.appendChild(node.element)
+
+ def testSerializer(self, element):
+ return testSerializer(element)
+
+ def getDocument(self):
+ return self.dom
+
+ def getFragment(self):
+ return _base.TreeBuilder.getFragment(self).element
+
+ def insertText(self, data, parent=None):
+ data=illegal_xml_chars.sub(u'\uFFFD',data)
+ if parent <> self:
+ _base.TreeBuilder.insertText(self, data, parent)
+ else:
+ # HACK: allow text nodes as children of the document node
+ if hasattr(self.dom, '_child_node_types'):
+ if not Node.TEXT_NODE in self.dom._child_node_types:
+ self.dom._child_node_types=list(self.dom._child_node_types)
+ self.dom._child_node_types.append(Node.TEXT_NODE)
+ self.dom.appendChild(self.dom.createTextNode(data))
+
+ name = None
+
+def testSerializer(element):
+ element.normalize()
+ rv = []
+ def serializeElement(element, indent=0):
+ if element.nodeType == Node.DOCUMENT_TYPE_NODE:
+ if element.name:
+ rv.append("|%s<!DOCTYPE %s>"%(' '*indent, element.name))
+ else:
+ rv.append("|%s<!DOCTYPE >"%(' '*indent,))
+ elif element.nodeType == Node.DOCUMENT_NODE:
+ rv.append("#document")
+ elif element.nodeType == Node.DOCUMENT_FRAGMENT_NODE:
+ rv.append("#document-fragment")
+ elif element.nodeType == Node.COMMENT_NODE:
+ rv.append("|%s<!-- %s -->"%(' '*indent, element.nodeValue))
+ elif element.nodeType == Node.TEXT_NODE:
+ rv.append("|%s\"%s\"" %(' '*indent, element.nodeValue))
+ else:
+ rv.append("|%s<%s>"%(' '*indent, element.nodeName))
+ if element.hasAttributes():
+ for name, value in element.attributes.items():
+ rv.append('|%s%s="%s"' % (' '*(indent+2), name, value))
+ indent += 2
+ for child in element.childNodes:
+ serializeElement(child, indent)
+ serializeElement(element, 0)
+
+ return "\n".join(rv)
+
+def dom2sax(node, handler, nsmap={'xml':XML_NAMESPACE}):
+ if node.nodeType == Node.ELEMENT_NODE:
+ if not nsmap:
+ handler.startElement(node.nodeName, node.attributes)
+ for child in node.childNodes: dom2sax(child, handler, nsmap)
+ handler.endElement(node.nodeName)
+ else:
+ attributes = dict(node.attributes.itemsNS())
+
+ # gather namespace declarations
+ prefixes = []
+ for attrname in node.attributes.keys():
+ attr = node.getAttributeNode(attrname)
+ if (attr.namespaceURI == XMLNS_NAMESPACE or
+ (attr.namespaceURI == None and attr.nodeName.startswith('xmlns'))):
+ prefix = (attr.localName != 'xmlns' and attr.localName or None)
+ handler.startPrefixMapping(prefix, attr.nodeValue)
+ prefixes.append(prefix)
+ nsmap = nsmap.copy()
+ nsmap[prefix] = attr.nodeValue
+ del attributes[(attr.namespaceURI, attr.localName)]
+
+ # apply namespace declarations
+ for attrname in node.attributes.keys():
+ attr = node.getAttributeNode(attrname)
+ if attr.namespaceURI == None and ':' in attr.nodeName:
+ prefix = attr.nodeName.split(':')[0]
+ if nsmap.has_key(prefix):
+ del attributes[(attr.namespaceURI, attr.localName)]
+ attributes[(nsmap[prefix],attr.localName)]=attr.nodeValue
+
+ # SAX events
+ ns = node.namespaceURI or nsmap.get(None,None)
+ handler.startElementNS((ns,node.nodeName), node.nodeName, attributes)
+ for child in node.childNodes: dom2sax(child, handler, nsmap)
+ handler.endElementNS((ns, node.nodeName), node.nodeName)
+ for prefix in prefixes: handler.endPrefixMapping(prefix)
+
+ elif node.nodeType in [Node.TEXT_NODE, Node.CDATA_SECTION_NODE]:
+ handler.characters(node.nodeValue)
+
+ elif node.nodeType == Node.DOCUMENT_NODE:
+ handler.startDocument()
+ for child in node.childNodes: dom2sax(child, handler, nsmap)
+ handler.endDocument()
+
+ elif node.nodeType == Node.DOCUMENT_FRAGMENT_NODE:
+ for child in node.childNodes: dom2sax(child, handler, nsmap)
+
+ else:
+ # ATTRIBUTE_NODE
+ # ENTITY_NODE
+ # PROCESSING_INSTRUCTION_NODE
+ # COMMENT_NODE
+ # DOCUMENT_TYPE_NODE
+ # NOTATION_NODE
+ pass
Deleted: trunk/lib/venus/planet/vendor/html5lib/treebuilders/etree.py
===================================================================
--- branches/sucs-site/lib/venus/planet/vendor/html5lib/treebuilders/etree.py 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/lib/venus/planet/vendor/html5lib/treebuilders/etree.py 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,266 +0,0 @@
-import _base
-import new
-
-moduleCache = {}
-
-def getETreeModule(ElementTreeImplementation, fullTree=False):
- name = "_" + ElementTreeImplementation.__name__+"builder"
- if name in moduleCache:
- return moduleCache[name]
- else:
- mod = new.module("_" + ElementTreeImplementation.__name__+"builder")
- objs = getETreeBuilder(ElementTreeImplementation, fullTree)
- mod.__dict__.update(objs)
- moduleCache[name] = mod
- return mod
-
-def getETreeBuilder(ElementTreeImplementation, fullTree=False):
- ElementTree = ElementTreeImplementation
- class Element(_base.Node):
- def __init__(self, name):
- self._element = ElementTree.Element(name)
- self.name = name
- self.parent = None
- self._childNodes = []
- self._flags = []
-
- def _setName(self, name):
- self._element.tag = name
-
- def _getName(self):
- return self._element.tag
-
- name = property(_getName, _setName)
-
- def _getAttributes(self):
- return self._element.attrib
-
- def _setAttributes(self, attributes):
- #Delete existing attributes first
- #XXX - there may be a better way to do this...
- for key in self._element.attrib.keys():
- del self._element.attrib[key]
- for key, value in attributes.iteritems():
- self._element.set(key, value)
-
- attributes = property(_getAttributes, _setAttributes)
-
- def _getChildNodes(self):
- return self._childNodes
-
- def _setChildNodes(self, value):
- del self._element[:]
- self._childNodes = []
- for element in value:
- self.insertChild(element)
-
- childNodes = property(_getChildNodes, _setChildNodes)
-
- def hasContent(self):
- """Return true if the node has children or text"""
- return bool(self._element.text or self._element.getchildren())
-
- def appendChild(self, node):
- self._childNodes.append(node)
- self._element.append(node._element)
- node.parent = self
-
- def insertBefore(self, node, refNode):
- index = self._element.getchildren().index(refNode._element)
- self._element.insert(index, node._element)
- node.parent = self
-
- def removeChild(self, node):
- self._element.remove(node._element)
- node.parent=None
-
- def insertText(self, data, insertBefore=None):
- if not(len(self._element)):
- if not self._element.text:
- self._element.text = ""
- self._element.text += data
- elif insertBefore is None:
- #Insert the text as the tail of the last child element
- if not self._element[-1].tail:
- self._element[-1].tail = ""
- self._element[-1].tail += data
- else:
- #Insert the text before the specified node
- children = self._element.getchildren()
- index = children.index(insertBefore._element)
- if index > 0:
- if not self._element[index-1].tail:
- self._element[index-1].tail = ""
- self._element[index-1].tail += data
- else:
- if not self._element.text:
- self._element.text = ""
- self._element.text += data
-
- def cloneNode(self):
- element = Element(self.name)
- for name, value in self.attributes.iteritems():
- element.attributes[name] = value
- return element
-
- def reparentChildren(self, newParent):
- if newParent.childNodes:
- newParent.childNodes[-1]._element.tail += self._element.text
- else:
- if not newParent._element.text:
- newParent._element.text = ""
- if self._element.text is not None:
- newParent._element.text += self._element.text
- self._element.text = ""
- _base.Node.reparentChildren(self, newParent)
-
- class Comment(Element):
- def __init__(self, data):
- #Use the superclass constructor to set all properties on the
- #wrapper element
- self._element = ElementTree.Comment(data)
- self.parent = None
- self._childNodes = []
- self._flags = []
-
- def _getData(self):
- return self._element.text
-
- def _setData(self, value):
- self._element.text = value
-
- data = property(_getData, _setData)
-
- class DocumentType(Element):
- def __init__(self, name):
- Element.__init__(self, "<!DOCTYPE>")
- self._element.text = name
-
- def _getPublicId(self):
- return self._element.get(u"publicId", None)
-
- def _setPublicId(self, value):
- if value is not None:
- self._element.set(u"publicId", value)
-
- publicId = property(_getPublicId, _setPublicId)
-
- def _getSystemId(self):
- return self._element.get(u"systemId", None)
-
- def _setSystemId(self, value):
- if value is not None:
- self._element.set(u"systemId", value)
-
- systemId = property(_getSystemId, _setSystemId)
-
- class Document(Element):
- def __init__(self):
- Element.__init__(self, "<DOCUMENT_ROOT>")
-
- class DocumentFragment(Element):
- def __init__(self):
- Element.__init__(self, "<DOCUMENT_FRAGMENT>")
-
- def testSerializer(element):
- rv = []
- finalText = None
- def serializeElement(element, indent=0):
- if not(hasattr(element, "tag")):
- element = element.getroot()
- if element.tag == "<!DOCTYPE>":
- rv.append("|%s<!DOCTYPE %s>"%(' '*indent, element.text))
- elif element.tag == "<DOCUMENT_ROOT>":
- rv.append("#document")
- if element.text:
- rv.append("|%s\"%s\""%(' '*(indent+2), element.text))
- if element.tail:
- finalText = element.tail
- elif type(element.tag) == type(ElementTree.Comment):
- rv.append("|%s<!-- %s -->"%(' '*indent, element.text))
- else:
- rv.append("|%s<%s>"%(' '*indent, element.tag))
- if hasattr(element, "attrib"):
- for name, value in element.attrib.iteritems():
- rv.append('|%s%s="%s"' % (' '*(indent+2), name, value))
- if element.text:
- rv.append("|%s\"%s\"" %(' '*(indent+2), element.text))
- indent += 2
- for child in element.getchildren():
- serializeElement(child, indent)
- if element.tail:
- rv.append("|%s\"%s\"" %(' '*(indent-2), element.tail))
- serializeElement(element, 0)
-
- if finalText is not None:
- rv.append("|%s\"%s\""%(' '*2, finalText))
-
- return "\n".join(rv)
-
- def tostring(element):
- """Serialize an element and its child nodes to a string"""
- rv = []
- finalText = None
- def serializeElement(element):
- if type(element) == type(ElementTree.ElementTree):
- element = element.getroot()
-
- if element.tag == "<!DOCTYPE>":
- rv.append("<!DOCTYPE %s>"%(element.text,))
- elif element.tag == "<DOCUMENT_ROOT>":
- if element.text:
- rv.append(element.text)
- if element.tail:
- finalText = element.tail
-
- for child in element.getchildren():
- serializeElement(child)
-
- elif type(element.tag) == type(ElementTree.Comment):
- rv.append("<!--%s-->"%(element.text,))
- else:
- #This is assumed to be an ordinary element
- if not element.attrib:
- rv.append("<%s>"%(element.tag,))
- else:
- attr = " ".join(["%s=\"%s\""%(name, value)
- for name, value in element.attrib.iteritems()])
- rv.append("<%s %s>"%(element.tag, attr))
- if element.text:
- rv.append(element.text)
-
- for child in element.getchildren():
- serializeElement(child)
-
- rv.append("</%s>"%(element.tag,))
-
- if element.tail:
- rv.append(element.tail)
-
- serializeElement(element)
-
- if finalText is not None:
- rv.append("%s\""%(' '*2, finalText))
-
- return "".join(rv)
-
- class TreeBuilder(_base.TreeBuilder):
- documentClass = Document
- doctypeClass = DocumentType
- elementClass = Element
- commentClass = Comment
- fragmentClass = DocumentFragment
-
- def testSerializer(self, element):
- return testSerializer(element)
-
- def getDocument(self):
- if fullTree:
- return self.document._element
- else:
- return self.document._element.find("html")
-
- def getFragment(self):
- return _base.TreeBuilder.getFragment(self)._element
-
- return locals()
Copied: trunk/lib/venus/planet/vendor/html5lib/treebuilders/etree.py (from rev 656, branches/sucs-site/lib/venus/planet/vendor/html5lib/treebuilders/etree.py)
===================================================================
--- trunk/lib/venus/planet/vendor/html5lib/treebuilders/etree.py (rev 0)
+++ trunk/lib/venus/planet/vendor/html5lib/treebuilders/etree.py 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,266 @@
+import _base
+import new
+
+moduleCache = {}
+
+def getETreeModule(ElementTreeImplementation, fullTree=False):
+ name = "_" + ElementTreeImplementation.__name__+"builder"
+ if name in moduleCache:
+ return moduleCache[name]
+ else:
+ mod = new.module("_" + ElementTreeImplementation.__name__+"builder")
+ objs = getETreeBuilder(ElementTreeImplementation, fullTree)
+ mod.__dict__.update(objs)
+ moduleCache[name] = mod
+ return mod
+
+def getETreeBuilder(ElementTreeImplementation, fullTree=False):
+ ElementTree = ElementTreeImplementation
+ class Element(_base.Node):
+ def __init__(self, name):
+ self._element = ElementTree.Element(name)
+ self.name = name
+ self.parent = None
+ self._childNodes = []
+ self._flags = []
+
+ def _setName(self, name):
+ self._element.tag = name
+
+ def _getName(self):
+ return self._element.tag
+
+ name = property(_getName, _setName)
+
+ def _getAttributes(self):
+ return self._element.attrib
+
+ def _setAttributes(self, attributes):
+ #Delete existing attributes first
+ #XXX - there may be a better way to do this...
+ for key in self._element.attrib.keys():
+ del self._element.attrib[key]
+ for key, value in attributes.iteritems():
+ self._element.set(key, value)
+
+ attributes = property(_getAttributes, _setAttributes)
+
+ def _getChildNodes(self):
+ return self._childNodes
+
+ def _setChildNodes(self, value):
+ del self._element[:]
+ self._childNodes = []
+ for element in value:
+ self.insertChild(element)
+
+ childNodes = property(_getChildNodes, _setChildNodes)
+
+ def hasContent(self):
+ """Return true if the node has children or text"""
+ return bool(self._element.text or self._element.getchildren())
+
+ def appendChild(self, node):
+ self._childNodes.append(node)
+ self._element.append(node._element)
+ node.parent = self
+
+ def insertBefore(self, node, refNode):
+ index = self._element.getchildren().index(refNode._element)
+ self._element.insert(index, node._element)
+ node.parent = self
+
+ def removeChild(self, node):
+ self._element.remove(node._element)
+ node.parent=None
+
+ def insertText(self, data, insertBefore=None):
+ if not(len(self._element)):
+ if not self._element.text:
+ self._element.text = ""
+ self._element.text += data
+ elif insertBefore is None:
+ #Insert the text as the tail of the last child element
+ if not self._element[-1].tail:
+ self._element[-1].tail = ""
+ self._element[-1].tail += data
+ else:
+ #Insert the text before the specified node
+ children = self._element.getchildren()
+ index = children.index(insertBefore._element)
+ if index > 0:
+ if not self._element[index-1].tail:
+ self._element[index-1].tail = ""
+ self._element[index-1].tail += data
+ else:
+ if not self._element.text:
+ self._element.text = ""
+ self._element.text += data
+
+ def cloneNode(self):
+ element = Element(self.name)
+ for name, value in self.attributes.iteritems():
+ element.attributes[name] = value
+ return element
+
+ def reparentChildren(self, newParent):
+ if newParent.childNodes:
+ newParent.childNodes[-1]._element.tail += self._element.text
+ else:
+ if not newParent._element.text:
+ newParent._element.text = ""
+ if self._element.text is not None:
+ newParent._element.text += self._element.text
+ self._element.text = ""
+ _base.Node.reparentChildren(self, newParent)
+
+ class Comment(Element):
+ def __init__(self, data):
+ #Use the superclass constructor to set all properties on the
+ #wrapper element
+ self._element = ElementTree.Comment(data)
+ self.parent = None
+ self._childNodes = []
+ self._flags = []
+
+ def _getData(self):
+ return self._element.text
+
+ def _setData(self, value):
+ self._element.text = value
+
+ data = property(_getData, _setData)
+
+ class DocumentType(Element):
+ def __init__(self, name):
+ Element.__init__(self, "<!DOCTYPE>")
+ self._element.text = name
+
+ def _getPublicId(self):
+ return self._element.get(u"publicId", None)
+
+ def _setPublicId(self, value):
+ if value is not None:
+ self._element.set(u"publicId", value)
+
+ publicId = property(_getPublicId, _setPublicId)
+
+ def _getSystemId(self):
+ return self._element.get(u"systemId", None)
+
+ def _setSystemId(self, value):
+ if value is not None:
+ self._element.set(u"systemId", value)
+
+ systemId = property(_getSystemId, _setSystemId)
+
+ class Document(Element):
+ def __init__(self):
+ Element.__init__(self, "<DOCUMENT_ROOT>")
+
+ class DocumentFragment(Element):
+ def __init__(self):
+ Element.__init__(self, "<DOCUMENT_FRAGMENT>")
+
+ def testSerializer(element):
+ rv = []
+ finalText = None
+ def serializeElement(element, indent=0):
+ if not(hasattr(element, "tag")):
+ element = element.getroot()
+ if element.tag == "<!DOCTYPE>":
+ rv.append("|%s<!DOCTYPE %s>"%(' '*indent, element.text))
+ elif element.tag == "<DOCUMENT_ROOT>":
+ rv.append("#document")
+ if element.text:
+ rv.append("|%s\"%s\""%(' '*(indent+2), element.text))
+ if element.tail:
+ finalText = element.tail
+ elif type(element.tag) == type(ElementTree.Comment):
+ rv.append("|%s<!-- %s -->"%(' '*indent, element.text))
+ else:
+ rv.append("|%s<%s>"%(' '*indent, element.tag))
+ if hasattr(element, "attrib"):
+ for name, value in element.attrib.iteritems():
+ rv.append('|%s%s="%s"' % (' '*(indent+2), name, value))
+ if element.text:
+ rv.append("|%s\"%s\"" %(' '*(indent+2), element.text))
+ indent += 2
+ for child in element.getchildren():
+ serializeElement(child, indent)
+ if element.tail:
+ rv.append("|%s\"%s\"" %(' '*(indent-2), element.tail))
+ serializeElement(element, 0)
+
+ if finalText is not None:
+ rv.append("|%s\"%s\""%(' '*2, finalText))
+
+ return "\n".join(rv)
+
+ def tostring(element):
+ """Serialize an element and its child nodes to a string"""
+ rv = []
+ finalText = None
+ def serializeElement(element):
+ if type(element) == type(ElementTree.ElementTree):
+ element = element.getroot()
+
+ if element.tag == "<!DOCTYPE>":
+ rv.append("<!DOCTYPE %s>"%(element.text,))
+ elif element.tag == "<DOCUMENT_ROOT>":
+ if element.text:
+ rv.append(element.text)
+ if element.tail:
+ finalText = element.tail
+
+ for child in element.getchildren():
+ serializeElement(child)
+
+ elif type(element.tag) == type(ElementTree.Comment):
+ rv.append("<!--%s-->"%(element.text,))
+ else:
+ #This is assumed to be an ordinary element
+ if not element.attrib:
+ rv.append("<%s>"%(element.tag,))
+ else:
+ attr = " ".join(["%s=\"%s\""%(name, value)
+ for name, value in element.attrib.iteritems()])
+ rv.append("<%s %s>"%(element.tag, attr))
+ if element.text:
+ rv.append(element.text)
+
+ for child in element.getchildren():
+ serializeElement(child)
+
+ rv.append("</%s>"%(element.tag,))
+
+ if element.tail:
+ rv.append(element.tail)
+
+ serializeElement(element)
+
+ if finalText is not None:
+ rv.append("%s\""%(' '*2, finalText))
+
+ return "".join(rv)
+
+ class TreeBuilder(_base.TreeBuilder):
+ documentClass = Document
+ doctypeClass = DocumentType
+ elementClass = Element
+ commentClass = Comment
+ fragmentClass = DocumentFragment
+
+ def testSerializer(self, element):
+ return testSerializer(element)
+
+ def getDocument(self):
+ if fullTree:
+ return self.document._element
+ else:
+ return self.document._element.find("html")
+
+ def getFragment(self):
+ return _base.TreeBuilder.getFragment(self)._element
+
+ return locals()
Deleted: trunk/lib/venus/planet/vendor/html5lib/treebuilders/simpletree.py
===================================================================
--- branches/sucs-site/lib/venus/planet/vendor/html5lib/treebuilders/simpletree.py 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/lib/venus/planet/vendor/html5lib/treebuilders/simpletree.py 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,205 +0,0 @@
-import _base
-from html5lib.constants import voidElements
-from xml.sax.saxutils import escape
-
-# Really crappy basic implementation of a DOM-core like thing
-class Node(_base.Node):
- type = -1
- def __init__(self, name):
- self.name = name
- self.parent = None
- self.value = None
- self.childNodes = []
- self._flags = []
-
- def __iter__(self):
- for node in self.childNodes:
- yield node
- for item in node:
- yield item
-
- def __unicode__(self):
- return self.name
-
- def toxml(self):
- raise NotImplementedError
-
- def printTree(self, indent=0):
- tree = '\n|%s%s' % (' '* indent, unicode(self))
- for child in self.childNodes:
- tree += child.printTree(indent + 2)
- return tree
-
- def appendChild(self, node):
- if (isinstance(node, TextNode) and self.childNodes and
- isinstance(self.childNodes[-1], TextNode)):
- self.childNodes[-1].value += node.value
- else:
- self.childNodes.append(node)
- node.parent = self
-
- def insertText(self, data, insertBefore=None):
- if insertBefore is None:
- self.appendChild(TextNode(data))
- else:
- self.insertBefore(TextNode(data), insertBefore)
-
- def insertBefore(self, node, refNode):
- index = self.childNodes.index(refNode)
- if (isinstance(node, TextNode) and index > 0 and
- isinstance(self.childNodes[index - 1], TextNode)):
- self.childNodes[index - 1].value += node.value
- else:
- self.childNodes.insert(index, node)
- node.parent = self
-
- def removeChild(self, node):
- try:
- self.childNodes.remove(node)
- except:
- # XXX
- raise
- node.parent = None
-
- def cloneNode(self):
- newNode = type(self)(self.name)
- if hasattr(self, 'attributes'):
- for attr, value in self.attributes.iteritems():
- newNode.attributes[attr] = value
- newNode.value = self.value
- return newNode
-
- def hasContent(self):
- """Return true if the node has children or text"""
- return bool(self.childNodes)
-
-class Document(Node):
- type = 1
- def __init__(self):
- Node.__init__(self, None)
-
- def __unicode__(self):
- return "#document"
-
- def toxml(self, encoding="utf=8"):
- result = ""
- for child in self.childNodes:
- result += child.toxml()
- return result.encode(encoding)
-
- def hilite(self, encoding="utf-8"):
- result = "<pre>"
- for child in self.childNodes:
- result += child.hilite()
- return result.encode(encoding) + "</pre>"
-
- def printTree(self):
- tree = unicode(self)
- for child in self.childNodes:
- tree += child.printTree(2)
- return tree
-
-class DocumentFragment(Document):
- type = 2
- def __unicode__(self):
- return "#document-fragment"
-
-class DocumentType(Node):
- type = 3
- def __init__(self, name):
- Node.__init__(self, name)
- self.publicId = u""
- self.systemId = u""
-
- def __unicode__(self):
- return u"<!DOCTYPE %s>" % self.name
-
- toxml = __unicode__
-
- def hilite(self):
- return '<code class="markup doctype"><!DOCTYPE %s></code>' % self.name
-
-class TextNode(Node):
- type = 4
- def __init__(self, value):
- Node.__init__(self, None)
- self.value = value
-
- def __unicode__(self):
- return u"\"%s\"" % self.value
-
- def toxml(self):
- return escape(self.value)
-
- hilite = toxml
-
-class Element(Node):
- type = 5
- def __init__(self, name):
- Node.__init__(self, name)
- self.attributes = {}
-
- def __unicode__(self):
- return u"<%s>" % self.name
-
- def toxml(self):
- result = '<' + self.name
- if self.attributes:
- for name,value in self.attributes.iteritems():
- result += u' %s="%s"' % (name, escape(value,{'"':'"'}))
- if self.childNodes:
- result += '>'
- for child in self.childNodes:
- result += child.toxml()
- result += u'</%s>' % self.name
- else:
- result += u'/>'
- return result
-
- def hilite(self):
- result = '<<code class="markup element-name">%s</code>' % self.name
- if self.attributes:
- for name, value in self.attributes.iteritems():
- result += ' <code class="markup attribute-name">%s</code>=<code class="markup attribute-value">"%s"</code>' % (name, escape(value, {'"':'"'}))
- if self.childNodes:
- result += ">"
- for child in self.childNodes:
- result += child.hilite()
- elif self.name in voidElements:
- return result + ">"
- return result + '</<code class="markup element-name">%s</code>>' % self.name
-
- def printTree(self, indent):
- tree = '\n|%s%s' % (' '*indent, unicode(self))
- indent += 2
- if self.attributes:
- for name, value in self.attributes.iteritems():
- tree += '\n|%s%s="%s"' % (' ' * indent, name, value)
- for child in self.childNodes:
- tree += child.printTree(indent)
- return tree
-
-class CommentNode(Node):
- type = 6
- def __init__(self, data):
- Node.__init__(self, None)
- self.data = data
-
- def __unicode__(self):
- return "<!-- %s -->" % self.data
-
- def toxml(self):
- return "<!--%s-->" % self.data
-
- def hilite(self):
- return '<code class="markup comment"><!--%s--></code>' % escape(self.data)
-
-class TreeBuilder(_base.TreeBuilder):
- documentClass = Document
- doctypeClass = DocumentType
- elementClass = Element
- commentClass = CommentNode
- fragmentClass = DocumentFragment
-
- def testSerializer(self, node):
- return node.printTree()
Copied: trunk/lib/venus/planet/vendor/html5lib/treebuilders/simpletree.py (from rev 656, branches/sucs-site/lib/venus/planet/vendor/html5lib/treebuilders/simpletree.py)
===================================================================
--- trunk/lib/venus/planet/vendor/html5lib/treebuilders/simpletree.py (rev 0)
+++ trunk/lib/venus/planet/vendor/html5lib/treebuilders/simpletree.py 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,205 @@
+import _base
+from html5lib.constants import voidElements
+from xml.sax.saxutils import escape
+
+# Really crappy basic implementation of a DOM-core like thing
+class Node(_base.Node):
+ type = -1
+ def __init__(self, name):
+ self.name = name
+ self.parent = None
+ self.value = None
+ self.childNodes = []
+ self._flags = []
+
+ def __iter__(self):
+ for node in self.childNodes:
+ yield node
+ for item in node:
+ yield item
+
+ def __unicode__(self):
+ return self.name
+
+ def toxml(self):
+ raise NotImplementedError
+
+ def printTree(self, indent=0):
+ tree = '\n|%s%s' % (' '* indent, unicode(self))
+ for child in self.childNodes:
+ tree += child.printTree(indent + 2)
+ return tree
+
+ def appendChild(self, node):
+ if (isinstance(node, TextNode) and self.childNodes and
+ isinstance(self.childNodes[-1], TextNode)):
+ self.childNodes[-1].value += node.value
+ else:
+ self.childNodes.append(node)
+ node.parent = self
+
+ def insertText(self, data, insertBefore=None):
+ if insertBefore is None:
+ self.appendChild(TextNode(data))
+ else:
+ self.insertBefore(TextNode(data), insertBefore)
+
+ def insertBefore(self, node, refNode):
+ index = self.childNodes.index(refNode)
+ if (isinstance(node, TextNode) and index > 0 and
+ isinstance(self.childNodes[index - 1], TextNode)):
+ self.childNodes[index - 1].value += node.value
+ else:
+ self.childNodes.insert(index, node)
+ node.parent = self
+
+ def removeChild(self, node):
+ try:
+ self.childNodes.remove(node)
+ except:
+ # XXX
+ raise
+ node.parent = None
+
+ def cloneNode(self):
+ newNode = type(self)(self.name)
+ if hasattr(self, 'attributes'):
+ for attr, value in self.attributes.iteritems():
+ newNode.attributes[attr] = value
+ newNode.value = self.value
+ return newNode
+
+ def hasContent(self):
+ """Return true if the node has children or text"""
+ return bool(self.childNodes)
+
+class Document(Node):
+ type = 1
+ def __init__(self):
+ Node.__init__(self, None)
+
+ def __unicode__(self):
+ return "#document"
+
+ def toxml(self, encoding="utf=8"):
+ result = ""
+ for child in self.childNodes:
+ result += child.toxml()
+ return result.encode(encoding)
+
+ def hilite(self, encoding="utf-8"):
+ result = "<pre>"
+ for child in self.childNodes:
+ result += child.hilite()
+ return result.encode(encoding) + "</pre>"
+
+ def printTree(self):
+ tree = unicode(self)
+ for child in self.childNodes:
+ tree += child.printTree(2)
+ return tree
+
+class DocumentFragment(Document):
+ type = 2
+ def __unicode__(self):
+ return "#document-fragment"
+
+class DocumentType(Node):
+ type = 3
+ def __init__(self, name):
+ Node.__init__(self, name)
+ self.publicId = u""
+ self.systemId = u""
+
+ def __unicode__(self):
+ return u"<!DOCTYPE %s>" % self.name
+
+ toxml = __unicode__
+
+ def hilite(self):
+ return '<code class="markup doctype"><!DOCTYPE %s></code>' % self.name
+
+class TextNode(Node):
+ type = 4
+ def __init__(self, value):
+ Node.__init__(self, None)
+ self.value = value
+
+ def __unicode__(self):
+ return u"\"%s\"" % self.value
+
+ def toxml(self):
+ return escape(self.value)
+
+ hilite = toxml
+
+class Element(Node):
+ type = 5
+ def __init__(self, name):
+ Node.__init__(self, name)
+ self.attributes = {}
+
+ def __unicode__(self):
+ return u"<%s>" % self.name
+
+ def toxml(self):
+ result = '<' + self.name
+ if self.attributes:
+ for name,value in self.attributes.iteritems():
+ result += u' %s="%s"' % (name, escape(value,{'"':'"'}))
+ if self.childNodes:
+ result += '>'
+ for child in self.childNodes:
+ result += child.toxml()
+ result += u'</%s>' % self.name
+ else:
+ result += u'/>'
+ return result
+
+ def hilite(self):
+ result = '<<code class="markup element-name">%s</code>' % self.name
+ if self.attributes:
+ for name, value in self.attributes.iteritems():
+ result += ' <code class="markup attribute-name">%s</code>=<code class="markup attribute-value">"%s"</code>' % (name, escape(value, {'"':'"'}))
+ if self.childNodes:
+ result += ">"
+ for child in self.childNodes:
+ result += child.hilite()
+ elif self.name in voidElements:
+ return result + ">"
+ return result + '</<code class="markup element-name">%s</code>>' % self.name
+
+ def printTree(self, indent):
+ tree = '\n|%s%s' % (' '*indent, unicode(self))
+ indent += 2
+ if self.attributes:
+ for name, value in self.attributes.iteritems():
+ tree += '\n|%s%s="%s"' % (' ' * indent, name, value)
+ for child in self.childNodes:
+ tree += child.printTree(indent)
+ return tree
+
+class CommentNode(Node):
+ type = 6
+ def __init__(self, data):
+ Node.__init__(self, None)
+ self.data = data
+
+ def __unicode__(self):
+ return "<!-- %s -->" % self.data
+
+ def toxml(self):
+ return "<!--%s-->" % self.data
+
+ def hilite(self):
+ return '<code class="markup comment"><!--%s--></code>' % escape(self.data)
+
+class TreeBuilder(_base.TreeBuilder):
+ documentClass = Document
+ doctypeClass = DocumentType
+ elementClass = Element
+ commentClass = CommentNode
+ fragmentClass = DocumentFragment
+
+ def testSerializer(self, node):
+ return node.printTree()
Deleted: trunk/lib/venus/planet/vendor/html5lib/treebuilders/soup.py
===================================================================
--- branches/sucs-site/lib/venus/planet/vendor/html5lib/treebuilders/soup.py 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/lib/venus/planet/vendor/html5lib/treebuilders/soup.py 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,158 +0,0 @@
-from BeautifulSoup import BeautifulSoup, Tag, NavigableString, Comment, Declaration
-
-import _base
-
-class AttrList(object):
- def __init__(self, element):
- self.element = element
- self.attrs = dict(self.element.attrs)
- def __iter__(self):
- return self.attrs.items().__iter__()
- def __setitem__(self, name, value):
- "set attr", name, value
- self.element[name] = value
- def items(self):
- return self.attrs.items()
- def keys(self):
- return self.attrs.keys()
- def __getitem__(self, name):
- return self.attrs[name]
- def __contains__(self, name):
- return name in self.attrs.keys()
-
-
-class Element(_base.Node):
- def __init__(self, element, soup):
- _base.Node.__init__(self, element.name)
- self.element = element
- self.soup=soup
-
- def appendChild(self, node):
- if (node.element.__class__ == NavigableString and self.element.contents
- and self.element.contents[-1].__class__ == NavigableString):
- newNode = TextNode(NavigableString(
- self.element.contents[-1]+node.element), self.soup)
- self.element.contents[-1].extract()
- self.appendChild(newNode)
- else:
- self.element.insert(len(self.element.contents), node.element)
- node.parent = self
-
- def getAttributes(self):
- return AttrList(self.element)
-
- def setAttributes(self, attributes):
- if attributes:
- for name, value in attributes.items():
- self.element[name] = value
-
- attributes = property(getAttributes, setAttributes)
-
- def insertText(self, data, insertBefore=None):
- text = TextNode(NavigableString(data), self.soup)
- if insertBefore:
- self.insertBefore(text, insertBefore)
- else:
- self.appendChild(text)
-
- def insertBefore(self, node, refNode):
- index = self.element.contents.index(refNode.element)
- if (node.element.__class__ == NavigableString and self.element.contents
- and self.element.contents[index-1].__class__ == NavigableString):
- newNode = TextNode(NavigableString(
- self.element.contents[index-1]+node.element), self.soup)
- self.element.contents[index-1].extract()
- self.insertBefore(newNode, refNode)
- else:
- self.element.insert(index, node.element)
- node.parent = self
-
- def removeChild(self, node):
- node.element.extract()
- node.parent = None
-
- def reparentChildren(self, newParent):
- while self.element.contents:
- child = self.element.contents[0]
- child.extract()
- if isinstance(child, Tag):
- newParent.appendChild(Element(child, self.soup))
- else:
- newParent.appendChild(TextNode(child, self.soup))
-
- def cloneNode(self):
- node = Element(Tag(self.soup, self.element.name), self.soup)
- for key,value in self.attributes:
- node.attributes[key] = value
- return node
-
- def hasContent(self):
- return self.element.contents
-
-class TextNode(Element):
- def __init__(self, element, soup):
- _base.Node.__init__(self, None)
- self.element = element
- self.soup=soup
-
- def cloneNode(self):
- raise NotImplementedError
-
-class TreeBuilder(_base.TreeBuilder):
- def documentClass(self):
- self.soup = BeautifulSoup("")
- return Element(self.soup, self.soup)
-
- def insertDoctype(self, name, publicId, systemId):
- self.soup.insert(0, Declaration(name))
-
- def elementClass(self, name):
- return Element(Tag(self.soup, name), self.soup)
-
- def commentClass(self, data):
- return TextNode(Comment(data), self.soup)
-
- def fragmentClass(self):
- self.soup = BeautifulSoup("")
- self.soup.name = "[document_fragment]"
- return Element(self.soup, self.soup)
-
- def appendChild(self, node):
- self.soup.insert(len(self.soup.contents), node.element)
-
- def testSerializer(self, element):
- return testSerializer(element)
-
- def getDocument(self):
- return self.soup
-
- def getFragment(self):
- return _base.TreeBuilder.getFragment(self).element
-
-def testSerializer(element):
- rv = []
- def serializeElement(element, indent=0):
- if isinstance(element, Declaration):
- rv.append("|%s<!DOCTYPE %s>"%(' '*indent, element.string))
- elif isinstance(element, BeautifulSoup):
- if element.name == "[document_fragment]":
- rv.append("#document-fragment")
- else:
- rv.append("#document")
-
- elif isinstance(element, Comment):
- rv.append("|%s<!-- %s -->"%(' '*indent, element.string))
- elif isinstance(element, unicode):
- rv.append("|%s\"%s\"" %(' '*indent, element))
- else:
- rv.append("|%s<%s>"%(' '*indent, element.name))
- if element.attrs:
- for name, value in element.attrs:
- rv.append('|%s%s="%s"' % (' '*(indent+2), name, value))
- indent += 2
- if hasattr(element, "contents"):
- for child in element.contents:
- serializeElement(child, indent)
- serializeElement(element, 0)
-
- return "\n".join(rv)
Copied: trunk/lib/venus/planet/vendor/html5lib/treebuilders/soup.py (from rev 656, branches/sucs-site/lib/venus/planet/vendor/html5lib/treebuilders/soup.py)
===================================================================
--- trunk/lib/venus/planet/vendor/html5lib/treebuilders/soup.py (rev 0)
+++ trunk/lib/venus/planet/vendor/html5lib/treebuilders/soup.py 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,158 @@
+from BeautifulSoup import BeautifulSoup, Tag, NavigableString, Comment, Declaration
+
+import _base
+
+class AttrList(object):
+ def __init__(self, element):
+ self.element = element
+ self.attrs = dict(self.element.attrs)
+ def __iter__(self):
+ return self.attrs.items().__iter__()
+ def __setitem__(self, name, value):
+ "set attr", name, value
+ self.element[name] = value
+ def items(self):
+ return self.attrs.items()
+ def keys(self):
+ return self.attrs.keys()
+ def __getitem__(self, name):
+ return self.attrs[name]
+ def __contains__(self, name):
+ return name in self.attrs.keys()
+
+
+class Element(_base.Node):
+ def __init__(self, element, soup):
+ _base.Node.__init__(self, element.name)
+ self.element = element
+ self.soup=soup
+
+ def appendChild(self, node):
+ if (node.element.__class__ == NavigableString and self.element.contents
+ and self.element.contents[-1].__class__ == NavigableString):
+ newNode = TextNode(NavigableString(
+ self.element.contents[-1]+node.element), self.soup)
+ self.element.contents[-1].extract()
+ self.appendChild(newNode)
+ else:
+ self.element.insert(len(self.element.contents), node.element)
+ node.parent = self
+
+ def getAttributes(self):
+ return AttrList(self.element)
+
+ def setAttributes(self, attributes):
+ if attributes:
+ for name, value in attributes.items():
+ self.element[name] = value
+
+ attributes = property(getAttributes, setAttributes)
+
+ def insertText(self, data, insertBefore=None):
+ text = TextNode(NavigableString(data), self.soup)
+ if insertBefore:
+ self.insertBefore(text, insertBefore)
+ else:
+ self.appendChild(text)
+
+ def insertBefore(self, node, refNode):
+ index = self.element.contents.index(refNode.element)
+ if (node.element.__class__ == NavigableString and self.element.contents
+ and self.element.contents[index-1].__class__ == NavigableString):
+ newNode = TextNode(NavigableString(
+ self.element.contents[index-1]+node.element), self.soup)
+ self.element.contents[index-1].extract()
+ self.insertBefore(newNode, refNode)
+ else:
+ self.element.insert(index, node.element)
+ node.parent = self
+
+ def removeChild(self, node):
+ node.element.extract()
+ node.parent = None
+
+ def reparentChildren(self, newParent):
+ while self.element.contents:
+ child = self.element.contents[0]
+ child.extract()
+ if isinstance(child, Tag):
+ newParent.appendChild(Element(child, self.soup))
+ else:
+ newParent.appendChild(TextNode(child, self.soup))
+
+ def cloneNode(self):
+ node = Element(Tag(self.soup, self.element.name), self.soup)
+ for key,value in self.attributes:
+ node.attributes[key] = value
+ return node
+
+ def hasContent(self):
+ return self.element.contents
+
+class TextNode(Element):
+ def __init__(self, element, soup):
+ _base.Node.__init__(self, None)
+ self.element = element
+ self.soup=soup
+
+ def cloneNode(self):
+ raise NotImplementedError
+
+class TreeBuilder(_base.TreeBuilder):
+ def documentClass(self):
+ self.soup = BeautifulSoup("")
+ return Element(self.soup, self.soup)
+
+ def insertDoctype(self, name, publicId, systemId):
+ self.soup.insert(0, Declaration(name))
+
+ def elementClass(self, name):
+ return Element(Tag(self.soup, name), self.soup)
+
+ def commentClass(self, data):
+ return TextNode(Comment(data), self.soup)
+
+ def fragmentClass(self):
+ self.soup = BeautifulSoup("")
+ self.soup.name = "[document_fragment]"
+ return Element(self.soup, self.soup)
+
+ def appendChild(self, node):
+ self.soup.insert(len(self.soup.contents), node.element)
+
+ def testSerializer(self, element):
+ return testSerializer(element)
+
+ def getDocument(self):
+ return self.soup
+
+ def getFragment(self):
+ return _base.TreeBuilder.getFragment(self).element
+
+def testSerializer(element):
+ rv = []
+ def serializeElement(element, indent=0):
+ if isinstance(element, Declaration):
+ rv.append("|%s<!DOCTYPE %s>"%(' '*indent, element.string))
+ elif isinstance(element, BeautifulSoup):
+ if element.name == "[document_fragment]":
+ rv.append("#document-fragment")
+ else:
+ rv.append("#document")
+
+ elif isinstance(element, Comment):
+ rv.append("|%s<!-- %s -->"%(' '*indent, element.string))
+ elif isinstance(element, unicode):
+ rv.append("|%s\"%s\"" %(' '*indent, element))
+ else:
+ rv.append("|%s<%s>"%(' '*indent, element.name))
+ if element.attrs:
+ for name, value in element.attrs:
+ rv.append('|%s%s="%s"' % (' '*(indent+2), name, value))
+ indent += 2
+ if hasattr(element, "contents"):
+ for child in element.contents:
+ serializeElement(child, indent)
+ serializeElement(element, 0)
+
+ return "\n".join(rv)
Deleted: trunk/lib/venus/planet/vendor/html5lib/treewalkers/__init__.py
===================================================================
--- branches/sucs-site/lib/venus/planet/vendor/html5lib/treewalkers/__init__.py 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/lib/venus/planet/vendor/html5lib/treewalkers/__init__.py 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,52 +0,0 @@
-"""A collection of modules for iterating through different kinds of
-tree, generating tokens identical to those produced by the tokenizer
-module.
-
-To create a tree walker for a new type of tree, you need to do
-implement a tree walker object (called TreeWalker by convention) that
-implements a 'serialize' method taking a tree as sole argument and
-returning an iterator generating tokens.
-"""
-
-treeWalkerCache = {}
-
-def getTreeWalker(treeType, implementation=None, **kwargs):
- """Get a TreeWalker class for various types of tree with built-in support
-
- treeType - the name of the tree type required (case-insensitive). Supported
- values are "simpletree", "dom", "etree" and "beautifulsoup"
-
- "simpletree" - a built-in DOM-ish tree type with support for some
- more pythonic idioms.
- "dom" - The xml.dom.minidom DOM implementation
- "pulldom" - The xml.dom.pulldom event stream
- "etree" - A generic walker for tree implementations exposing an
- elementtree-like interface (known to work with
- ElementTree, cElementTree and lxml.etree).
- "lxml" - Optimized walker for lxml.etree
- "beautifulsoup" - Beautiful soup (if installed)
- "genshi" - a Genshi stream
-
- implementation - (Currently applies to the "etree" tree type only). A module
- implementing the tree type e.g. xml.etree.ElementTree or
- cElementTree."""
-
- treeType = treeType.lower()
- if treeType not in treeWalkerCache:
- if treeType in ("dom", "pulldom", "simpletree"):
- mod = __import__(treeType, globals())
- treeWalkerCache[treeType] = mod.TreeWalker
- elif treeType == "genshi":
- import genshistream
- treeWalkerCache[treeType] = genshistream.TreeWalker
- elif treeType == "beautifulsoup":
- import soup
- treeWalkerCache[treeType] = soup.TreeWalker
- elif treeType == "lxml":
- import lxmletree
- treeWalkerCache[treeType] = lxmletree.TreeWalker
- elif treeType == "etree":
- import etree
- # XXX: NEVER cache here, caching is done in the etree submodule
- return etree.getETreeModule(implementation, **kwargs).TreeWalker
- return treeWalkerCache.get(treeType)
Copied: trunk/lib/venus/planet/vendor/html5lib/treewalkers/__init__.py (from rev 656, branches/sucs-site/lib/venus/planet/vendor/html5lib/treewalkers/__init__.py)
===================================================================
--- trunk/lib/venus/planet/vendor/html5lib/treewalkers/__init__.py (rev 0)
+++ trunk/lib/venus/planet/vendor/html5lib/treewalkers/__init__.py 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,52 @@
+"""A collection of modules for iterating through different kinds of
+tree, generating tokens identical to those produced by the tokenizer
+module.
+
+To create a tree walker for a new type of tree, you need to do
+implement a tree walker object (called TreeWalker by convention) that
+implements a 'serialize' method taking a tree as sole argument and
+returning an iterator generating tokens.
+"""
+
+treeWalkerCache = {}
+
+def getTreeWalker(treeType, implementation=None, **kwargs):
+ """Get a TreeWalker class for various types of tree with built-in support
+
+ treeType - the name of the tree type required (case-insensitive). Supported
+ values are "simpletree", "dom", "etree" and "beautifulsoup"
+
+ "simpletree" - a built-in DOM-ish tree type with support for some
+ more pythonic idioms.
+ "dom" - The xml.dom.minidom DOM implementation
+ "pulldom" - The xml.dom.pulldom event stream
+ "etree" - A generic walker for tree implementations exposing an
+ elementtree-like interface (known to work with
+ ElementTree, cElementTree and lxml.etree).
+ "lxml" - Optimized walker for lxml.etree
+ "beautifulsoup" - Beautiful soup (if installed)
+ "genshi" - a Genshi stream
+
+ implementation - (Currently applies to the "etree" tree type only). A module
+ implementing the tree type e.g. xml.etree.ElementTree or
+ cElementTree."""
+
+ treeType = treeType.lower()
+ if treeType not in treeWalkerCache:
+ if treeType in ("dom", "pulldom", "simpletree"):
+ mod = __import__(treeType, globals())
+ treeWalkerCache[treeType] = mod.TreeWalker
+ elif treeType == "genshi":
+ import genshistream
+ treeWalkerCache[treeType] = genshistream.TreeWalker
+ elif treeType == "beautifulsoup":
+ import soup
+ treeWalkerCache[treeType] = soup.TreeWalker
+ elif treeType == "lxml":
+ import lxmletree
+ treeWalkerCache[treeType] = lxmletree.TreeWalker
+ elif treeType == "etree":
+ import etree
+ # XXX: NEVER cache here, caching is done in the etree submodule
+ return etree.getETreeModule(implementation, **kwargs).TreeWalker
+ return treeWalkerCache.get(treeType)
Deleted: trunk/lib/venus/planet/vendor/html5lib/treewalkers/_base.py
===================================================================
--- branches/sucs-site/lib/venus/planet/vendor/html5lib/treewalkers/_base.py 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/lib/venus/planet/vendor/html5lib/treewalkers/_base.py 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,154 +0,0 @@
-import gettext
-_ = gettext.gettext
-
-from html5lib.constants import voidElements, spaceCharacters
-spaceCharacters = u"".join(spaceCharacters)
-
-class TreeWalker(object):
- def __init__(self, tree):
- self.tree = tree
-
- def __iter__(self):
- raise NotImplementedError
-
- def error(self, msg):
- return {"type": "SerializeError", "data": msg}
-
- def normalizeAttrs(self, attrs):
- if not attrs:
- attrs = []
- elif hasattr(attrs, 'items'):
- attrs = attrs.items()
- return [(unicode(name),unicode(value)) for name,value in attrs]
-
- def emptyTag(self, name, attrs, hasChildren=False):
- yield {"type": "EmptyTag", "name": unicode(name), \
- "data": self.normalizeAttrs(attrs)}
- if hasChildren:
- yield self.error(_("Void element has children"))
-
- def startTag(self, name, attrs):
- return {"type": "StartTag", "name": unicode(name), \
- "data": self.normalizeAttrs(attrs)}
-
- def endTag(self, name):
- return {"type": "EndTag", "name": unicode(name), "data": []}
-
- def text(self, data):
- data = unicode(data)
- middle = data.lstrip(spaceCharacters)
- left = data[:len(data)-len(middle)]
- if left:
- yield {"type": "SpaceCharacters", "data": left}
- data = middle
- middle = data.rstrip(spaceCharacters)
- right = data[len(middle):]
- if middle:
- yield {"type": "Characters", "data": middle}
- if right:
- yield {"type": "SpaceCharacters", "data": right}
-
- def comment(self, data):
- return {"type": "Comment", "data": unicode(data)}
-
- def doctype(self, name, publicId=None, systemId=None, correct=True):
- return {"type": "Doctype",
- "name": name is not None and unicode(name) or u"",
- "publicId": publicId, "systemId": systemId,
- "correct": correct}
-
- def unknown(self, nodeType):
- return self.error(_("Unknown node type: ") + nodeType)
-
-class RecursiveTreeWalker(TreeWalker):
- def walkChildren(self, node):
- raise NodeImplementedError
-
- def element(self, node, name, attrs, hasChildren):
- if name in voidElements:
- for token in self.emptyTag(name, attrs, hasChildren):
- yield token
- else:
- yield self.startTag(name, attrs)
- if hasChildren:
- for token in self.walkChildren(node):
- yield token
- yield self.endTag(name)
-
-from xml.dom import Node
-
-DOCUMENT = Node.DOCUMENT_NODE
-DOCTYPE = Node.DOCUMENT_TYPE_NODE
-TEXT = Node.TEXT_NODE
-ELEMENT = Node.ELEMENT_NODE
-COMMENT = Node.COMMENT_NODE
-UNKNOWN = "<#UNKNOWN#>"
-
-class NonRecursiveTreeWalker(TreeWalker):
- def getNodeDetails(self, node):
- raise NotImplementedError
-
- def getFirstChild(self, node):
- raise NotImplementedError
-
- def getNextSibling(self, node):
- raise NotImplementedError
-
- def getParentNode(self, node):
- raise NotImplementedError
-
- def __iter__(self):
- currentNode = self.tree
- while currentNode is not None:
- details = self.getNodeDetails(currentNode)
- type, details = details[0], details[1:]
- hasChildren = False
-
- if type == DOCTYPE:
- yield self.doctype(*details)
-
- elif type == TEXT:
- for token in self.text(*details):
- yield token
-
- elif type == ELEMENT:
- name, attributes, hasChildren = details
- if name in voidElements:
- for token in self.emptyTag(name, attributes, hasChildren):
- yield token
- hasChildren = False
- else:
- yield self.startTag(name, attributes)
-
- elif type == COMMENT:
- yield self.comment(details[0])
-
- elif type == DOCUMENT:
- hasChildren = True
-
- else:
- yield self.unknown(details[0])
-
- if hasChildren:
- firstChild = self.getFirstChild(currentNode)
- else:
- firstChild = None
-
- if firstChild is not None:
- currentNode = firstChild
- else:
- while currentNode is not None:
- details = self.getNodeDetails(currentNode)
- type, details = details[0], details[1:]
- if type == ELEMENT:
- name, attributes, hasChildren = details
- if name not in voidElements:
- yield self.endTag(name)
- nextSibling = self.getNextSibling(currentNode)
- if nextSibling is not None:
- currentNode = nextSibling
- break
- if self.tree is currentNode:
- currentNode = None
- else:
- currentNode = self.getParentNode(currentNode)
Copied: trunk/lib/venus/planet/vendor/html5lib/treewalkers/_base.py (from rev 656, branches/sucs-site/lib/venus/planet/vendor/html5lib/treewalkers/_base.py)
===================================================================
--- trunk/lib/venus/planet/vendor/html5lib/treewalkers/_base.py (rev 0)
+++ trunk/lib/venus/planet/vendor/html5lib/treewalkers/_base.py 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,154 @@
+import gettext
+_ = gettext.gettext
+
+from html5lib.constants import voidElements, spaceCharacters
+spaceCharacters = u"".join(spaceCharacters)
+
+class TreeWalker(object):
+ def __init__(self, tree):
+ self.tree = tree
+
+ def __iter__(self):
+ raise NotImplementedError
+
+ def error(self, msg):
+ return {"type": "SerializeError", "data": msg}
+
+ def normalizeAttrs(self, attrs):
+ if not attrs:
+ attrs = []
+ elif hasattr(attrs, 'items'):
+ attrs = attrs.items()
+ return [(unicode(name),unicode(value)) for name,value in attrs]
+
+ def emptyTag(self, name, attrs, hasChildren=False):
+ yield {"type": "EmptyTag", "name": unicode(name), \
+ "data": self.normalizeAttrs(attrs)}
+ if hasChildren:
+ yield self.error(_("Void element has children"))
+
+ def startTag(self, name, attrs):
+ return {"type": "StartTag", "name": unicode(name), \
+ "data": self.normalizeAttrs(attrs)}
+
+ def endTag(self, name):
+ return {"type": "EndTag", "name": unicode(name), "data": []}
+
+ def text(self, data):
+ data = unicode(data)
+ middle = data.lstrip(spaceCharacters)
+ left = data[:len(data)-len(middle)]
+ if left:
+ yield {"type": "SpaceCharacters", "data": left}
+ data = middle
+ middle = data.rstrip(spaceCharacters)
+ right = data[len(middle):]
+ if middle:
+ yield {"type": "Characters", "data": middle}
+ if right:
+ yield {"type": "SpaceCharacters", "data": right}
+
+ def comment(self, data):
+ return {"type": "Comment", "data": unicode(data)}
+
+ def doctype(self, name, publicId=None, systemId=None, correct=True):
+ return {"type": "Doctype",
+ "name": name is not None and unicode(name) or u"",
+ "publicId": publicId, "systemId": systemId,
+ "correct": correct}
+
+ def unknown(self, nodeType):
+ return self.error(_("Unknown node type: ") + nodeType)
+
+class RecursiveTreeWalker(TreeWalker):
+ def walkChildren(self, node):
+ raise NodeImplementedError
+
+ def element(self, node, name, attrs, hasChildren):
+ if name in voidElements:
+ for token in self.emptyTag(name, attrs, hasChildren):
+ yield token
+ else:
+ yield self.startTag(name, attrs)
+ if hasChildren:
+ for token in self.walkChildren(node):
+ yield token
+ yield self.endTag(name)
+
+from xml.dom import Node
+
+DOCUMENT = Node.DOCUMENT_NODE
+DOCTYPE = Node.DOCUMENT_TYPE_NODE
+TEXT = Node.TEXT_NODE
+ELEMENT = Node.ELEMENT_NODE
+COMMENT = Node.COMMENT_NODE
+UNKNOWN = "<#UNKNOWN#>"
+
+class NonRecursiveTreeWalker(TreeWalker):
+ def getNodeDetails(self, node):
+ raise NotImplementedError
+
+ def getFirstChild(self, node):
+ raise NotImplementedError
+
+ def getNextSibling(self, node):
+ raise NotImplementedError
+
+ def getParentNode(self, node):
+ raise NotImplementedError
+
+ def __iter__(self):
+ currentNode = self.tree
+ while currentNode is not None:
+ details = self.getNodeDetails(currentNode)
+ type, details = details[0], details[1:]
+ hasChildren = False
+
+ if type == DOCTYPE:
+ yield self.doctype(*details)
+
+ elif type == TEXT:
+ for token in self.text(*details):
+ yield token
+
+ elif type == ELEMENT:
+ name, attributes, hasChildren = details
+ if name in voidElements:
+ for token in self.emptyTag(name, attributes, hasChildren):
+ yield token
+ hasChildren = False
+ else:
+ yield self.startTag(name, attributes)
+
+ elif type == COMMENT:
+ yield self.comment(details[0])
+
+ elif type == DOCUMENT:
+ hasChildren = True
+
+ else:
+ yield self.unknown(details[0])
+
+ if hasChildren:
+ firstChild = self.getFirstChild(currentNode)
+ else:
+ firstChild = None
+
+ if firstChild is not None:
+ currentNode = firstChild
+ else:
+ while currentNode is not None:
+ details = self.getNodeDetails(currentNode)
+ type, details = details[0], details[1:]
+ if type == ELEMENT:
+ name, attributes, hasChildren = details
+ if name not in voidElements:
+ yield self.endTag(name)
+ nextSibling = self.getNextSibling(currentNode)
+ if nextSibling is not None:
+ currentNode = nextSibling
+ break
+ if self.tree is currentNode:
+ currentNode = None
+ else:
+ currentNode = self.getParentNode(currentNode)
Deleted: trunk/lib/venus/planet/vendor/html5lib/treewalkers/dom.py
===================================================================
--- branches/sucs-site/lib/venus/planet/vendor/html5lib/treewalkers/dom.py 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/lib/venus/planet/vendor/html5lib/treewalkers/dom.py 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,37 +0,0 @@
-from xml.dom import Node
-
-import gettext
-_ = gettext.gettext
-
-import _base
-
-from html5lib.constants import voidElements
-
-class TreeWalker(_base.NonRecursiveTreeWalker):
- def getNodeDetails(self, node):
- if node.nodeType == Node.DOCUMENT_TYPE_NODE:
- return _base.DOCTYPE, node.name, node.publicId, node.systemId
-
- elif node.nodeType in (Node.TEXT_NODE, Node.CDATA_SECTION_NODE):
- return _base.TEXT, node.nodeValue
-
- elif node.nodeType == Node.ELEMENT_NODE:
- return _base.ELEMENT, node.nodeName, node.attributes.items(), node.hasChildNodes
-
- elif node.nodeType == Node.COMMENT_NODE:
- return _base.COMMENT, node.nodeValue
-
- elif node.nodeType in (Node.DOCUMENT_NODE, Node.DOCUMENT_FRAGMENT_NODE):
- return (_base.DOCUMENT,)
-
- else:
- return _base.UNKNOWN, node.nodeType
-
- def getFirstChild(self, node):
- return node.firstChild
-
- def getNextSibling(self, node):
- return node.nextSibling
-
- def getParentNode(self, node):
- return node.parentNode
Copied: trunk/lib/venus/planet/vendor/html5lib/treewalkers/dom.py (from rev 656, branches/sucs-site/lib/venus/planet/vendor/html5lib/treewalkers/dom.py)
===================================================================
--- trunk/lib/venus/planet/vendor/html5lib/treewalkers/dom.py (rev 0)
+++ trunk/lib/venus/planet/vendor/html5lib/treewalkers/dom.py 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,37 @@
+from xml.dom import Node
+
+import gettext
+_ = gettext.gettext
+
+import _base
+
+from html5lib.constants import voidElements
+
+class TreeWalker(_base.NonRecursiveTreeWalker):
+ def getNodeDetails(self, node):
+ if node.nodeType == Node.DOCUMENT_TYPE_NODE:
+ return _base.DOCTYPE, node.name, node.publicId, node.systemId
+
+ elif node.nodeType in (Node.TEXT_NODE, Node.CDATA_SECTION_NODE):
+ return _base.TEXT, node.nodeValue
+
+ elif node.nodeType == Node.ELEMENT_NODE:
+ return _base.ELEMENT, node.nodeName, node.attributes.items(), node.hasChildNodes
+
+ elif node.nodeType == Node.COMMENT_NODE:
+ return _base.COMMENT, node.nodeValue
+
+ elif node.nodeType in (Node.DOCUMENT_NODE, Node.DOCUMENT_FRAGMENT_NODE):
+ return (_base.DOCUMENT,)
+
+ else:
+ return _base.UNKNOWN, node.nodeType
+
+ def getFirstChild(self, node):
+ return node.firstChild
+
+ def getNextSibling(self, node):
+ return node.nextSibling
+
+ def getParentNode(self, node):
+ return node.parentNode
Deleted: trunk/lib/venus/planet/vendor/html5lib/treewalkers/etree.py
===================================================================
--- branches/sucs-site/lib/venus/planet/vendor/html5lib/treewalkers/etree.py 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/lib/venus/planet/vendor/html5lib/treewalkers/etree.py 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,112 +0,0 @@
-import gettext
-_ = gettext.gettext
-
-import new
-import copy
-
-import _base
-from html5lib.constants import voidElements
-
-moduleCache = {}
-
-def getETreeModule(ElementTreeImplementation):
- name = "_" + ElementTreeImplementation.__name__+"builder"
- if name in moduleCache:
- return moduleCache[name]
- else:
- mod = new.module("_" + ElementTreeImplementation.__name__+"builder")
- objs = getETreeBuilder(ElementTreeImplementation)
- mod.__dict__.update(objs)
- moduleCache[name] = mod
- return mod
-
-def getETreeBuilder(ElementTreeImplementation):
- ElementTree = ElementTreeImplementation
-
- class TreeWalker(_base.NonRecursiveTreeWalker):
- """Given the particular ElementTree representation, this implementation,
- to avoid using recursion, returns "nodes" as tuples with the following
- content:
-
- 1. An Element node serving as *context* (it cannot be called the parent
- node due to the particular ``tail`` text nodes.
-
- 2. Either the string literals ``"text"`` or ``"tail"`` or a child index
-
- 3. A list used as a stack of all ancestor *context nodes*. It is a
- pair tuple whose first item is an Element and second item is a child
- index.
- """
-
- def getNodeDetails(self, node):
- if isinstance(node, tuple): # It might be the root Element
- elt, key, parents = node
- if key in ("text", "tail"):
- return _base.TEXT, getattr(elt, key)
- else:
- node = elt[int(key)]
-
- if not(hasattr(node, "tag")):
- node = node.getroot()
-
- if node.tag in ("<DOCUMENT_ROOT>", "<DOCUMENT_FRAGMENT>"):
- return (_base.DOCUMENT,)
-
- elif node.tag == "<!DOCTYPE>":
- return _base.DOCTYPE, node.text
-
- elif type(node.tag) == type(ElementTree.Comment):
- return _base.COMMENT, node.text
-
- else:
- #This is assumed to be an ordinary element
- return _base.ELEMENT, node.tag, node.attrib.items(), len(node) or node.text
-
- def getFirstChild(self, node):
- if isinstance(node, tuple): # It might be the root Element
- elt, key, parents = node
- assert key not in ("text", "tail"), "Text nodes have no children"
- parents.append((elt, int(key)))
- node = elt[int(key)]
- else:
- parents = []
-
- assert len(node) or node.text, "Node has no children"
- if node.text:
- return (node, "text", parents)
- else:
- return (node, 0, parents)
-
- def getNextSibling(self, node):
- assert isinstance(node, tuple), "Node is not a tuple: " + str(node)
-
- elt, key, parents = node
- if key == "text":
- key = -1
- elif key == "tail":
- elt, key = parents.pop()
- else:
- # Look for "tail" of the "revisited" node
- child = elt[key]
- if child.tail:
- parents.append((elt, key))
- return (child, "tail", parents)
-
- # case where key were "text" or "tail" or elt[key] had a tail
- key += 1
- if len(elt) > key:
- return (elt, key, parents)
- else:
- return None
-
- def getParentNode(self, node):
- assert isinstance(node, tuple)
- elt, key, parents = node
- if parents:
- elt, key = parents.pop()
- return elt, key, parents
- else:
- # HACK: We could return ``elt`` but None will stop the algorithm the same way
- return None
-
- return locals()
Copied: trunk/lib/venus/planet/vendor/html5lib/treewalkers/etree.py (from rev 656, branches/sucs-site/lib/venus/planet/vendor/html5lib/treewalkers/etree.py)
===================================================================
--- trunk/lib/venus/planet/vendor/html5lib/treewalkers/etree.py (rev 0)
+++ trunk/lib/venus/planet/vendor/html5lib/treewalkers/etree.py 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,112 @@
+import gettext
+_ = gettext.gettext
+
+import new
+import copy
+
+import _base
+from html5lib.constants import voidElements
+
+moduleCache = {}
+
+def getETreeModule(ElementTreeImplementation):
+ name = "_" + ElementTreeImplementation.__name__+"builder"
+ if name in moduleCache:
+ return moduleCache[name]
+ else:
+ mod = new.module("_" + ElementTreeImplementation.__name__+"builder")
+ objs = getETreeBuilder(ElementTreeImplementation)
+ mod.__dict__.update(objs)
+ moduleCache[name] = mod
+ return mod
+
+def getETreeBuilder(ElementTreeImplementation):
+ ElementTree = ElementTreeImplementation
+
+ class TreeWalker(_base.NonRecursiveTreeWalker):
+ """Given the particular ElementTree representation, this implementation,
+ to avoid using recursion, returns "nodes" as tuples with the following
+ content:
+
+ 1. An Element node serving as *context* (it cannot be called the parent
+ node due to the particular ``tail`` text nodes.
+
+ 2. Either the string literals ``"text"`` or ``"tail"`` or a child index
+
+ 3. A list used as a stack of all ancestor *context nodes*. It is a
+ pair tuple whose first item is an Element and second item is a child
+ index.
+ """
+
+ def getNodeDetails(self, node):
+ if isinstance(node, tuple): # It might be the root Element
+ elt, key, parents = node
+ if key in ("text", "tail"):
+ return _base.TEXT, getattr(elt, key)
+ else:
+ node = elt[int(key)]
+
+ if not(hasattr(node, "tag")):
+ node = node.getroot()
+
+ if node.tag in ("<DOCUMENT_ROOT>", "<DOCUMENT_FRAGMENT>"):
+ return (_base.DOCUMENT,)
+
+ elif node.tag == "<!DOCTYPE>":
+ return _base.DOCTYPE, node.text
+
+ elif type(node.tag) == type(ElementTree.Comment):
+ return _base.COMMENT, node.text
+
+ else:
+ #This is assumed to be an ordinary element
+ return _base.ELEMENT, node.tag, node.attrib.items(), len(node) or node.text
+
+ def getFirstChild(self, node):
+ if isinstance(node, tuple): # It might be the root Element
+ elt, key, parents = node
+ assert key not in ("text", "tail"), "Text nodes have no children"
+ parents.append((elt, int(key)))
+ node = elt[int(key)]
+ else:
+ parents = []
+
+ assert len(node) or node.text, "Node has no children"
+ if node.text:
+ return (node, "text", parents)
+ else:
+ return (node, 0, parents)
+
+ def getNextSibling(self, node):
+ assert isinstance(node, tuple), "Node is not a tuple: " + str(node)
+
+ elt, key, parents = node
+ if key == "text":
+ key = -1
+ elif key == "tail":
+ elt, key = parents.pop()
+ else:
+ # Look for "tail" of the "revisited" node
+ child = elt[key]
+ if child.tail:
+ parents.append((elt, key))
+ return (child, "tail", parents)
+
+ # case where key were "text" or "tail" or elt[key] had a tail
+ key += 1
+ if len(elt) > key:
+ return (elt, key, parents)
+ else:
+ return None
+
+ def getParentNode(self, node):
+ assert isinstance(node, tuple)
+ elt, key, parents = node
+ if parents:
+ elt, key = parents.pop()
+ return elt, key, parents
+ else:
+ # HACK: We could return ``elt`` but None will stop the algorithm the same way
+ return None
+
+ return locals()
Deleted: trunk/lib/venus/planet/vendor/html5lib/treewalkers/genshistream.py
===================================================================
--- branches/sucs-site/lib/venus/planet/vendor/html5lib/treewalkers/genshistream.py 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/lib/venus/planet/vendor/html5lib/treewalkers/genshistream.py 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,67 +0,0 @@
-from genshi.core import START, END, XML_DECL, DOCTYPE, TEXT, \
- START_NS, END_NS, START_CDATA, END_CDATA, PI, COMMENT
-from genshi.output import NamespaceFlattener
-
-import _base
-
-from html5lib.constants import voidElements
-
-class TreeWalker(_base.TreeWalker):
- def __iter__(self):
- depth = 0
- ignore_until = None
- previous = None
- for event in NamespaceFlattener(prefixes={
- 'http://www.w3.org/1999/xhtml': ''
- })(self.tree):
- if previous is not None:
- if previous[0] == START:
- depth += 1
- if ignore_until <= depth:
- ignore_until = None
- if ignore_until is None:
- for token in self.tokens(previous, event):
- yield token
- if token["type"] == "EmptyTag":
- ignore_until = depth
- if previous[0] == END:
- depth -= 1
- previous = event
- if previous is not None:
- if ignore_until is None or ignore_until <= depth:
- for token in self.tokens(previous, None):
- yield token
- elif ignore_until is not None:
- raise ValueError("Illformed DOM event stream: void element without END_ELEMENT")
-
- def tokens(self, event, next):
- kind, data, pos = event
- if kind == START:
- tag, attrib = data
- if tag in voidElements:
- for token in self.emptyTag(tag, list(attrib), \
- not next or next[0] != END or next[1] != tag):
- yield token
- else:
- yield self.startTag(tag, list(attrib))
-
- elif kind == END:
- if data not in voidElements:
- yield self.endTag(data)
-
- elif kind == COMMENT:
- yield self.comment(data)
-
- elif kind == TEXT:
- for token in self.text(data):
- yield token
-
- elif kind == DOCTYPE:
- yield self.doctype(*data)
-
- elif kind in (XML_DECL, DOCTYPE, START_NS, END_NS, \
- START_CDATA, END_CDATA, PI):
- pass
-
- else:
- yield self.unknown(kind)
Copied: trunk/lib/venus/planet/vendor/html5lib/treewalkers/genshistream.py (from rev 656, branches/sucs-site/lib/venus/planet/vendor/html5lib/treewalkers/genshistream.py)
===================================================================
--- trunk/lib/venus/planet/vendor/html5lib/treewalkers/genshistream.py (rev 0)
+++ trunk/lib/venus/planet/vendor/html5lib/treewalkers/genshistream.py 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,67 @@
+from genshi.core import START, END, XML_DECL, DOCTYPE, TEXT, \
+ START_NS, END_NS, START_CDATA, END_CDATA, PI, COMMENT
+from genshi.output import NamespaceFlattener
+
+import _base
+
+from html5lib.constants import voidElements
+
+class TreeWalker(_base.TreeWalker):
+ def __iter__(self):
+ depth = 0
+ ignore_until = None
+ previous = None
+ for event in NamespaceFlattener(prefixes={
+ 'http://www.w3.org/1999/xhtml': ''
+ })(self.tree):
+ if previous is not None:
+ if previous[0] == START:
+ depth += 1
+ if ignore_until <= depth:
+ ignore_until = None
+ if ignore_until is None:
+ for token in self.tokens(previous, event):
+ yield token
+ if token["type"] == "EmptyTag":
+ ignore_until = depth
+ if previous[0] == END:
+ depth -= 1
+ previous = event
+ if previous is not None:
+ if ignore_until is None or ignore_until <= depth:
+ for token in self.tokens(previous, None):
+ yield token
+ elif ignore_until is not None:
+ raise ValueError("Illformed DOM event stream: void element without END_ELEMENT")
+
+ def tokens(self, event, next):
+ kind, data, pos = event
+ if kind == START:
+ tag, attrib = data
+ if tag in voidElements:
+ for token in self.emptyTag(tag, list(attrib), \
+ not next or next[0] != END or next[1] != tag):
+ yield token
+ else:
+ yield self.startTag(tag, list(attrib))
+
+ elif kind == END:
+ if data not in voidElements:
+ yield self.endTag(data)
+
+ elif kind == COMMENT:
+ yield self.comment(data)
+
+ elif kind == TEXT:
+ for token in self.text(data):
+ yield token
+
+ elif kind == DOCTYPE:
+ yield self.doctype(*data)
+
+ elif kind in (XML_DECL, DOCTYPE, START_NS, END_NS, \
+ START_CDATA, END_CDATA, PI):
+ pass
+
+ else:
+ yield self.unknown(kind)
Deleted: trunk/lib/venus/planet/vendor/html5lib/treewalkers/pulldom.py
===================================================================
--- branches/sucs-site/lib/venus/planet/vendor/html5lib/treewalkers/pulldom.py 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/lib/venus/planet/vendor/html5lib/treewalkers/pulldom.py 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,52 +0,0 @@
-from xml.dom.pulldom import START_ELEMENT, END_ELEMENT, \
- COMMENT, IGNORABLE_WHITESPACE, CHARACTERS
-
-import _base
-
-from html5lib.constants import voidElements
-
-class TreeWalker(_base.TreeWalker):
- def __iter__(self):
- ignore_until = None
- previous = None
- for event in self.tree:
- if previous is not None and \
- (ignore_until is None or previous[1] is ignore_until):
- if previous[1] is ignore_until:
- ignore_until = None
- for token in self.tokens(previous, event):
- yield token
- if token["type"] == "EmptyTag":
- ignore_until = previous[1]
- previous = event
- if ignore_until is None or previous[1] is ignore_until:
- for token in self.tokens(previous, None):
- yield token
- elif ignore_until is not None:
- raise ValueError("Illformed DOM event stream: void element without END_ELEMENT")
-
- def tokens(self, event, next):
- type, node = event
- if type == START_ELEMENT:
- name = node.nodeName
- if name in voidElements:
- for token in self.emptyTag(name, \
- node.attributes.items(), not next or next[1] is not node):
- yield token
- else:
- yield self.startTag(name, node.attributes.items())
-
- elif type == END_ELEMENT:
- name = node.nodeName
- if name not in voidElements:
- yield self.endTag(name)
-
- elif type == COMMENT:
- yield self.comment(node.nodeValue)
-
- elif type in (IGNORABLE_WHITESPACE, CHARACTERS):
- for token in self.text(node.nodeValue):
- yield token
-
- else:
- yield self.unknown(type)
Copied: trunk/lib/venus/planet/vendor/html5lib/treewalkers/pulldom.py (from rev 656, branches/sucs-site/lib/venus/planet/vendor/html5lib/treewalkers/pulldom.py)
===================================================================
--- trunk/lib/venus/planet/vendor/html5lib/treewalkers/pulldom.py (rev 0)
+++ trunk/lib/venus/planet/vendor/html5lib/treewalkers/pulldom.py 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,52 @@
+from xml.dom.pulldom import START_ELEMENT, END_ELEMENT, \
+ COMMENT, IGNORABLE_WHITESPACE, CHARACTERS
+
+import _base
+
+from html5lib.constants import voidElements
+
+class TreeWalker(_base.TreeWalker):
+ def __iter__(self):
+ ignore_until = None
+ previous = None
+ for event in self.tree:
+ if previous is not None and \
+ (ignore_until is None or previous[1] is ignore_until):
+ if previous[1] is ignore_until:
+ ignore_until = None
+ for token in self.tokens(previous, event):
+ yield token
+ if token["type"] == "EmptyTag":
+ ignore_until = previous[1]
+ previous = event
+ if ignore_until is None or previous[1] is ignore_until:
+ for token in self.tokens(previous, None):
+ yield token
+ elif ignore_until is not None:
+ raise ValueError("Illformed DOM event stream: void element without END_ELEMENT")
+
+ def tokens(self, event, next):
+ type, node = event
+ if type == START_ELEMENT:
+ name = node.nodeName
+ if name in voidElements:
+ for token in self.emptyTag(name, \
+ node.attributes.items(), not next or next[1] is not node):
+ yield token
+ else:
+ yield self.startTag(name, node.attributes.items())
+
+ elif type == END_ELEMENT:
+ name = node.nodeName
+ if name not in voidElements:
+ yield self.endTag(name)
+
+ elif type == COMMENT:
+ yield self.comment(node.nodeValue)
+
+ elif type in (IGNORABLE_WHITESPACE, CHARACTERS):
+ for token in self.text(node.nodeValue):
+ yield token
+
+ else:
+ yield self.unknown(type)
Deleted: trunk/lib/venus/planet/vendor/html5lib/treewalkers/simpletree.py
===================================================================
--- branches/sucs-site/lib/venus/planet/vendor/html5lib/treewalkers/simpletree.py 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/lib/venus/planet/vendor/html5lib/treewalkers/simpletree.py 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,72 +0,0 @@
-import gettext
-_ = gettext.gettext
-
-import _base
-
-class TreeWalker(_base.NonRecursiveTreeWalker):
- """Given that simpletree has no performant way of getting a node's
- next sibling, this implementation returns "nodes" as tuples with the
- following content:
-
- 1. The parent Node (Element, Document or DocumentFragment)
-
- 2. The child index of the current node in its parent's children list
-
- 3. A list used as a stack of all ancestors. It is a pair tuple whose
- first item is a parent Node and second item is a child index.
- """
-
- def getNodeDetails(self, node):
- if isinstance(node, tuple): # It might be the root Node
- parent, idx, parents = node
- node = parent.childNodes[idx]
-
- # testing node.type allows us not to import treebuilders.simpletree
- if node.type in (1, 2): # Document or DocumentFragment
- return (_base.DOCUMENT,)
-
- elif node.type == 3: # DocumentType
- return _base.DOCTYPE, node.name, node.publicId, node.systemId
-
- elif node.type == 4: # TextNode
- return _base.TEXT, node.value
-
- elif node.type == 5: # Element
- return _base.ELEMENT, node.name, \
- node.attributes.items(), node.hasContent()
-
- elif node.type == 6: # CommentNode
- return _base.COMMENT, node.data
-
- else:
- return _node.UNKNOWN, node.type
-
- def getFirstChild(self, node):
- if isinstance(node, tuple): # It might be the root Node
- parent, idx, parents = node
- parents.append((parent, idx))
- node = parent.childNodes[idx]
- else:
- parents = []
-
- assert node.hasContent(), "Node has no children"
- return (node, 0, parents)
-
- def getNextSibling(self, node):
- assert isinstance(node, tuple), "Node is not a tuple: " + str(node)
- parent, idx, parents = node
- idx += 1
- if len(parent.childNodes) > idx:
- return (parent, idx, parents)
- else:
- return None
-
- def getParentNode(self, node):
- assert isinstance(node, tuple)
- parent, idx, parents = node
- if parents:
- parent, idx = parents.pop()
- return parent, idx, parents
- else:
- # HACK: We could return ``parent`` but None will stop the algorithm the same way
- return None
Copied: trunk/lib/venus/planet/vendor/html5lib/treewalkers/simpletree.py (from rev 656, branches/sucs-site/lib/venus/planet/vendor/html5lib/treewalkers/simpletree.py)
===================================================================
--- trunk/lib/venus/planet/vendor/html5lib/treewalkers/simpletree.py (rev 0)
+++ trunk/lib/venus/planet/vendor/html5lib/treewalkers/simpletree.py 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,72 @@
+import gettext
+_ = gettext.gettext
+
+import _base
+
+class TreeWalker(_base.NonRecursiveTreeWalker):
+ """Given that simpletree has no performant way of getting a node's
+ next sibling, this implementation returns "nodes" as tuples with the
+ following content:
+
+ 1. The parent Node (Element, Document or DocumentFragment)
+
+ 2. The child index of the current node in its parent's children list
+
+ 3. A list used as a stack of all ancestors. It is a pair tuple whose
+ first item is a parent Node and second item is a child index.
+ """
+
+ def getNodeDetails(self, node):
+ if isinstance(node, tuple): # It might be the root Node
+ parent, idx, parents = node
+ node = parent.childNodes[idx]
+
+ # testing node.type allows us not to import treebuilders.simpletree
+ if node.type in (1, 2): # Document or DocumentFragment
+ return (_base.DOCUMENT,)
+
+ elif node.type == 3: # DocumentType
+ return _base.DOCTYPE, node.name, node.publicId, node.systemId
+
+ elif node.type == 4: # TextNode
+ return _base.TEXT, node.value
+
+ elif node.type == 5: # Element
+ return _base.ELEMENT, node.name, \
+ node.attributes.items(), node.hasContent()
+
+ elif node.type == 6: # CommentNode
+ return _base.COMMENT, node.data
+
+ else:
+ return _node.UNKNOWN, node.type
+
+ def getFirstChild(self, node):
+ if isinstance(node, tuple): # It might be the root Node
+ parent, idx, parents = node
+ parents.append((parent, idx))
+ node = parent.childNodes[idx]
+ else:
+ parents = []
+
+ assert node.hasContent(), "Node has no children"
+ return (node, 0, parents)
+
+ def getNextSibling(self, node):
+ assert isinstance(node, tuple), "Node is not a tuple: " + str(node)
+ parent, idx, parents = node
+ idx += 1
+ if len(parent.childNodes) > idx:
+ return (parent, idx, parents)
+ else:
+ return None
+
+ def getParentNode(self, node):
+ assert isinstance(node, tuple)
+ parent, idx, parents = node
+ if parents:
+ parent, idx = parents.pop()
+ return parent, idx, parents
+ else:
+ # HACK: We could return ``parent`` but None will stop the algorithm the same way
+ return None
Deleted: trunk/lib/venus/planet/vendor/html5lib/treewalkers/soup.py
===================================================================
--- branches/sucs-site/lib/venus/planet/vendor/html5lib/treewalkers/soup.py 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/lib/venus/planet/vendor/html5lib/treewalkers/soup.py 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,36 +0,0 @@
-import gettext
-_ = gettext.gettext
-
-from BeautifulSoup import BeautifulSoup, Declaration, Comment, Tag
-
-import _base
-
-class TreeWalker(_base.NonRecursiveTreeWalker):
- def getNodeDetails(self, node):
- if isinstance(node, BeautifulSoup): # Document or DocumentFragment
- return (_base.DOCUMENT,)
-
- elif isinstance(node, Declaration): # DocumentType
- #Slice needed to remove markup added during unicode conversion
- return _base.DOCTYPE, unicode(node.string)[2:-1]
-
- elif isinstance(node, Comment):
- return _base.COMMENT, unicode(node.string)[4:-3]
-
- elif isinstance(node, unicode): # TextNode
- return _base.TEXT, node
-
- elif isinstance(node, Tag): # Element
- return _base.ELEMENT, node.name, \
- dict(node.attrs).items(), node.contents
- else:
- return _base.UNKNOWN, node.__class__.__name__
-
- def getFirstChild(self, node):
- return node.contents[0]
-
- def getNextSibling(self, node):
- return node.nextSibling
-
- def getParentNode(self, node):
- return node.parent
Copied: trunk/lib/venus/planet/vendor/html5lib/treewalkers/soup.py (from rev 656, branches/sucs-site/lib/venus/planet/vendor/html5lib/treewalkers/soup.py)
===================================================================
--- trunk/lib/venus/planet/vendor/html5lib/treewalkers/soup.py (rev 0)
+++ trunk/lib/venus/planet/vendor/html5lib/treewalkers/soup.py 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,36 @@
+import gettext
+_ = gettext.gettext
+
+from BeautifulSoup import BeautifulSoup, Declaration, Comment, Tag
+
+import _base
+
+class TreeWalker(_base.NonRecursiveTreeWalker):
+ def getNodeDetails(self, node):
+ if isinstance(node, BeautifulSoup): # Document or DocumentFragment
+ return (_base.DOCUMENT,)
+
+ elif isinstance(node, Declaration): # DocumentType
+ #Slice needed to remove markup added during unicode conversion
+ return _base.DOCTYPE, unicode(node.string)[2:-1]
+
+ elif isinstance(node, Comment):
+ return _base.COMMENT, unicode(node.string)[4:-3]
+
+ elif isinstance(node, unicode): # TextNode
+ return _base.TEXT, node
+
+ elif isinstance(node, Tag): # Element
+ return _base.ELEMENT, node.name, \
+ dict(node.attrs).items(), node.contents
+ else:
+ return _base.UNKNOWN, node.__class__.__name__
+
+ def getFirstChild(self, node):
+ return node.contents[0]
+
+ def getNextSibling(self, node):
+ return node.nextSibling
+
+ def getParentNode(self, node):
+ return node.parent
Deleted: trunk/lib/venus/planet/vendor/html5lib/utils.py
===================================================================
--- branches/sucs-site/lib/venus/planet/vendor/html5lib/utils.py 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/lib/venus/planet/vendor/html5lib/utils.py 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,36 +0,0 @@
-try:
- frozenset
-except NameError:
- #Import from the sets module for python 2.3
- from sets import Set as set
- from sets import ImmutableSet as frozenset
-
-class MethodDispatcher(dict):
- """Dict with 2 special properties:
-
- On initiation, keys that are lists, sets or tuples are converted to
- multiple keys so accessing any one of the items in the original
- list-like object returns the matching value
-
- md = MethodDispatcher({("foo", "bar"):"baz"})
- md["foo"] == "baz"
-
- A default value which can be set through the default attribute.
- """
-
- def __init__(self, items=()):
- # Using _dictEntries instead of directly assigning to self is about
- # twice as fast. Please do careful performance testing before changing
- # anything here.
- _dictEntries = []
- for name,value in items:
- if type(name) in (list, tuple, frozenset, set):
- for item in name:
- _dictEntries.append((item, value))
- else:
- _dictEntries.append((name, value))
- dict.__init__(self, _dictEntries)
- self.default = None
-
- def __getitem__(self, key):
- return dict.get(self, key, self.default)
Copied: trunk/lib/venus/planet/vendor/html5lib/utils.py (from rev 656, branches/sucs-site/lib/venus/planet/vendor/html5lib/utils.py)
===================================================================
--- trunk/lib/venus/planet/vendor/html5lib/utils.py (rev 0)
+++ trunk/lib/venus/planet/vendor/html5lib/utils.py 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,36 @@
+try:
+ frozenset
+except NameError:
+ #Import from the sets module for python 2.3
+ from sets import Set as set
+ from sets import ImmutableSet as frozenset
+
+class MethodDispatcher(dict):
+ """Dict with 2 special properties:
+
+ On initiation, keys that are lists, sets or tuples are converted to
+ multiple keys so accessing any one of the items in the original
+ list-like object returns the matching value
+
+ md = MethodDispatcher({("foo", "bar"):"baz"})
+ md["foo"] == "baz"
+
+ A default value which can be set through the default attribute.
+ """
+
+ def __init__(self, items=()):
+ # Using _dictEntries instead of directly assigning to self is about
+ # twice as fast. Please do careful performance testing before changing
+ # anything here.
+ _dictEntries = []
+ for name,value in items:
+ if type(name) in (list, tuple, frozenset, set):
+ for item in name:
+ _dictEntries.append((item, value))
+ else:
+ _dictEntries.append((name, value))
+ dict.__init__(self, _dictEntries)
+ self.default = None
+
+ def __getitem__(self, key):
+ return dict.get(self, key, self.default)
Deleted: trunk/lib/venus/planet/vendor/htmltmpl.py
===================================================================
--- branches/sucs-site/lib/venus/planet/vendor/htmltmpl.py 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/lib/venus/planet/vendor/htmltmpl.py 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,1421 +0,0 @@
-
-""" A templating engine for separation of code and HTML.
-
- The documentation of this templating engine is separated to two parts:
-
- 1. Description of the templating language.
-
- 2. Documentation of classes and API of this module that provides
- a Python implementation of the templating language.
-
- All the documentation can be found in 'doc' directory of the
- distribution tarball or at the homepage of the engine.
- Latest versions of this module are also available at that website.
-
- You can use and redistribute this module under conditions of the
- GNU General Public License that can be found either at
- [ http://www.gnu.org/ ] or in file "LICENSE" contained in the
- distribution tarball of this module.
-
- Copyright (c) 2001 Tomas Styblo, tripie at cpan.org
-
- @name htmltmpl
- @version 1.22
- @author-name Tomas Styblo
- @author-email tripie at cpan.org
- @website http://htmltmpl.sourceforge.net/
- @license-name GNU GPL
- @license-url http://www.gnu.org/licenses/gpl.html
-"""
-
-__version__ = 1.22
-__author__ = "Tomas Styblo (tripie at cpan.org)"
-
-# All imported modules are part of the standard Python library.
-
-from types import *
-import re
-import os
-import os.path
-import pprint # only for debugging
-import sys
-import copy
-import cgi # for HTML escaping of variables
-import urllib # for URL escaping of variables
-import cPickle # for template compilation
-import gettext
-import portalocker # for locking
-
-INCLUDE_DIR = "inc"
-
-# Total number of possible parameters.
-# Increment if adding a parameter to any statement.
-PARAMS_NUMBER = 3
-
-# Relative positions of parameters in TemplateCompiler.tokenize().
-PARAM_NAME = 1
-PARAM_ESCAPE = 2
-PARAM_GLOBAL = 3
-PARAM_GETTEXT_STRING = 1
-
-##############################################
-# CLASS: TemplateManager #
-##############################################
-
-class TemplateManager:
- """ Class that manages compilation and precompilation of templates.
-
- You should use this class whenever you work with templates
- that are stored in a file. The class can create a compiled
- template and transparently manage its precompilation. It also
- keeps the precompiled templates up-to-date by modification times
- comparisons.
- """
-
- def __init__(self, include=1, max_include=5, precompile=1, comments=1,
- gettext=0, debug=0):
- """ Constructor.
-
- @header
- __init__(include=1, max_include=5, precompile=1, comments=1,
- gettext=0, debug=0)
-
- @param include Enable or disable included templates.
- This optional parameter can be used to enable or disable
- <em>TMPL_INCLUDE</em> inclusion of templates. Disabling of
- inclusion can improve performance a bit. The inclusion is
- enabled by default.
-
- @param max_include Maximum depth of nested inclusions.
- This optional parameter can be used to specify maximum depth of
- nested <em>TMPL_INCLUDE</em> inclusions. It defaults to 5.
- This setting prevents infinite recursive inclusions.
-
- @param precompile Enable or disable precompilation of templates.
- This optional parameter can be used to enable or disable
- creation and usage of precompiled templates.
-
- A precompiled template is saved to the same directory in
- which the main template file is located. You need write
- permissions to that directory.
-
- Precompilation provides a significant performance boost because
- it's not necessary to parse the templates over and over again.
- The boost is especially noticeable when templates that include
- other templates are used.
-
- Comparison of modification times of the main template and all
- included templates is used to ensure that the precompiled
- templates are up-to-date. Templates are also recompiled if the
- htmltmpl module is updated.
-
- The <em>TemplateError</em>exception is raised when the precompiled
- template cannot be saved. Precompilation is enabled by default.
-
- @param comments Enable or disable template comments.
- This optional parameter can be used to enable or disable
- template comments.
- Disabling of the comments can improve performance a bit.
- Comments are enabled by default.
-
- @param gettext Enable or disable gettext support.
-
- @param debug Enable or disable debugging messages.
- This optional parameter is a flag that can be used to enable
- or disable debugging messages which are printed to the standard
- error output. The debugging messages are disabled by default.
- """
- # Save the optional parameters.
- # These values are not modified by any method.
- self._include = include
- self._max_include = max_include
- self._precompile = precompile
- self._comments = comments
- self._gettext = gettext
- self._debug = debug
-
- self.DEB("INIT DONE")
-
- def prepare(self, file):
- """ Preprocess, parse, tokenize and compile the template.
-
- If precompilation is enabled then this method tries to load
- a precompiled form of the template from the same directory
- in which the template source file is located. If it succeeds,
- then it compares modification times stored in the precompiled
- form to modification times of source files of the template,
- including source files of all templates included via the
- <em>TMPL_INCLUDE</em> statements. If any of the modification times
- differs, then the template is recompiled and the precompiled
- form updated.
-
- If precompilation is disabled, then this method parses and
- compiles the template.
-
- @header prepare(file)
-
- @return Compiled template.
- The methods returns an instance of the <em>Template</em> class
- which is a compiled form of the template. This instance can be
- used as input for the <em>TemplateProcessor</em>.
-
- @param file Path to the template file to prepare.
- The method looks for the template file in current directory
- if the parameter is a relative path. All included templates must
- be placed in subdirectory <strong>'inc'</strong> of the
- directory in which the main template file is located.
- """
- compiled = None
- if self._precompile:
- if self.is_precompiled(file):
- try:
- precompiled = self.load_precompiled(file)
- except PrecompiledError, template:
- print >> sys.stderr, "Htmltmpl: bad precompiled "\
- "template '%s' removed" % template
- compiled = self.compile(file)
- self.save_precompiled(compiled)
- else:
- precompiled.debug(self._debug)
- compile_params = (self._include, self._max_include,
- self._comments, self._gettext)
- if precompiled.is_uptodate(compile_params):
- self.DEB("PRECOMPILED: UPTODATE")
- compiled = precompiled
- else:
- self.DEB("PRECOMPILED: NOT UPTODATE")
- compiled = self.update(precompiled)
- else:
- self.DEB("PRECOMPILED: NOT PRECOMPILED")
- compiled = self.compile(file)
- self.save_precompiled(compiled)
- else:
- self.DEB("PRECOMPILATION DISABLED")
- compiled = self.compile(file)
- return compiled
-
- def update(self, template):
- """ Update (recompile) a compiled template.
-
- This method recompiles a template compiled from a file.
- If precompilation is enabled then the precompiled form saved on
- disk is also updated.
-
- @header update(template)
-
- @return Recompiled template.
- It's ensured that the returned template is up-to-date.
-
- @param template A compiled template.
- This parameter should be an instance of the <em>Template</em>
- class, created either by the <em>TemplateManager</em> or by the
- <em>TemplateCompiler</em>. The instance must represent a template
- compiled from a file on disk.
- """
- self.DEB("UPDATE")
- updated = self.compile(template.file())
- if self._precompile:
- self.save_precompiled(updated)
- return updated
-
- ##############################################
- # PRIVATE METHODS #
- ##############################################
-
- def DEB(self, str):
- """ Print debugging message to stderr if debugging is enabled.
- @hidden
- """
- if self._debug: print >> sys.stderr, str
-
- def compile(self, file):
- """ Compile the template.
- @hidden
- """
- return TemplateCompiler(self._include, self._max_include,
- self._comments, self._gettext,
- self._debug).compile(file)
-
- def is_precompiled(self, file):
- """ Return true if the template is already precompiled on the disk.
- This method doesn't check whether the compiled template is
- uptodate.
- @hidden
- """
- filename = file + "c" # "template.tmplc"
- if os.path.isfile(filename):
- return 1
- else:
- return 0
-
- def load_precompiled(self, file):
- """ Load precompiled template from disk.
-
- Remove the precompiled template file and recompile it
- if the file contains corrupted or unpicklable data.
-
- @hidden
- """
- filename = file + "c" # "template.tmplc"
- self.DEB("LOADING PRECOMPILED")
- try:
- remove_bad = 0
- file = None
- try:
- file = open(filename, "rb")
- portalocker.lock(file, portalocker.LOCK_SH)
- precompiled = cPickle.load(file)
- except IOError, (errno, errstr):
- raise TemplateError, "IO error in load precompiled "\
- "template '%s': (%d) %s"\
- % (filename, errno, errstr)
- except cPickle.UnpicklingError:
- remove_bad = 1
- raise PrecompiledError, filename
- except:
- remove_bad = 1
- raise
- else:
- return precompiled
- finally:
- if file:
- portalocker.unlock(file)
- file.close()
- if remove_bad and os.path.isfile(filename):
- # X: We may lose the original exception here, raising OSError.
- os.remove(filename)
-
- def save_precompiled(self, template):
- """ Save compiled template to disk in precompiled form.
-
- Associated metadata is also saved. It includes: filename of the
- main template file, modification time of the main template file,
- modification times of all included templates and version of the
- htmltmpl module which compiled the template.
-
- The method removes a file which is saved only partially because
- of some error.
-
- @hidden
- """
- filename = template.file() + "c" # creates "template.tmplc"
- # Check if we have write permission to the template's directory.
- template_dir = os.path.dirname(os.path.abspath(filename))
- if not os.access(template_dir, os.W_OK):
- raise TemplateError, "Cannot save precompiled templates "\
- "to '%s': write permission denied."\
- % template_dir
- try:
- remove_bad = 0
- file = None
- try:
- file = open(filename, "wb") # may truncate existing file
- portalocker.lock(file, portalocker.LOCK_EX)
- BINARY = 1
- READABLE = 0
- if self._debug:
- cPickle.dump(template, file, READABLE)
- else:
- cPickle.dump(template, file, BINARY)
- except IOError, (errno, errstr):
- remove_bad = 1
- raise TemplateError, "IO error while saving precompiled "\
- "template '%s': (%d) %s"\
- % (filename, errno, errstr)
- except cPickle.PicklingError, error:
- remove_bad = 1
- raise TemplateError, "Pickling error while saving "\
- "precompiled template '%s': %s"\
- % (filename, error)
- except:
- remove_bad = 1
- raise
- else:
- self.DEB("SAVING PRECOMPILED")
- finally:
- if file:
- portalocker.unlock(file)
- file.close()
- if remove_bad and os.path.isfile(filename):
- # X: We may lose the original exception here, raising OSError.
- os.remove(filename)
-
-
-##############################################
-# CLASS: TemplateProcessor #
-##############################################
-
-class TemplateProcessor:
- """ Fill the template with data and process it.
-
- This class provides actual processing of a compiled template.
- Use it to set template variables and loops and then obtain
- result of the processing.
- """
-
- def __init__(self, html_escape=1, magic_vars=1, global_vars=0, debug=0):
- """ Constructor.
-
- @header __init__(html_escape=1, magic_vars=1, global_vars=0,
- debug=0)
-
- @param html_escape Enable or disable HTML escaping of variables.
- This optional parameter is a flag that can be used to enable or
- disable automatic HTML escaping of variables.
- All variables are by default automatically HTML escaped.
- The escaping process substitutes HTML brackets, ampersands and
- double quotes with appropriate HTML entities.
-
- @param magic_vars Enable or disable loop magic variables.
- This parameter can be used to enable or disable
- "magic" context variables, that are automatically defined inside
- loops. Magic variables are enabled by default.
-
- Refer to the language specification for description of these
- magic variables.
-
- @param global_vars Globally activate global lookup of variables.
- This optional parameter is a flag that can be used to specify
- whether variables which cannot be found in the current scope
- should be automatically looked up in enclosing scopes.
-
- Automatic global lookup is disabled by default. Global lookup
- can be overriden on a per-variable basis by the
- <strong>GLOBAL</strong> parameter of a <strong>TMPL_VAR</strong>
- statement.
-
- @param debug Enable or disable debugging messages.
- """
- self._html_escape = html_escape
- self._magic_vars = magic_vars
- self._global_vars = global_vars
- self._debug = debug
-
- # Data structure containing variables and loops set by the
- # application. Use debug=1, process some template and
- # then check stderr to see how the structure looks.
- # It's modified only by set() and reset() methods.
- self._vars = {}
-
- # Following variables are for multipart templates.
- self._current_part = 1
- self._current_pos = 0
-
- def set(self, var, value):
- """ Associate a value with top-level template variable or loop.
-
- A template identifier can represent either an ordinary variable
- (string) or a loop.
-
- To assign a value to a string identifier pass a scalar
- as the 'value' parameter. This scalar will be automatically
- converted to string.
-
- To assign a value to a loop identifier pass a list of mappings as
- the 'value' parameter. The engine iterates over this list and
- assigns values from the mappings to variables in a template loop
- block if a key in the mapping corresponds to a name of a variable
- in the loop block. The number of mappings contained in this list
- is equal to number of times the loop block is repeated in the
- output.
-
- @header set(var, value)
- @return No return value.
-
- @param var Name of template variable or loop.
- @param value The value to associate.
-
- """
- # The correctness of character case is verified only for top-level
- # variables.
- if self.is_ordinary_var(value):
- # template top-level ordinary variable
- if not var.islower():
- raise TemplateError, "Invalid variable name '%s'." % var
- elif type(value) == ListType:
- # template top-level loop
- if var != var.capitalize():
- raise TemplateError, "Invalid loop name '%s'." % var
- else:
- raise TemplateError, "Value of toplevel variable '%s' must "\
- "be either a scalar or a list." % var
- self._vars[var] = value
- self.DEB("VALUE SET: " + str(var))
-
- def reset(self, keep_data=0):
- """ Reset the template data.
-
- This method resets the data contained in the template processor
- instance. The template processor instance can be used to process
- any number of templates, but this method must be called after
- a template is processed to reuse the instance,
-
- @header reset(keep_data=0)
- @return No return value.
-
- @param keep_data Do not reset the template data.
- Use this flag if you do not want the template data to be erased.
- This way you can reuse the data contained in the instance of
- the <em>TemplateProcessor</em>.
- """
- self._current_part = 1
- self._current_pos = 0
- if not keep_data:
- self._vars.clear()
- self.DEB("RESET")
-
- def process(self, template, part=None):
- """ Process a compiled template. Return the result as string.
-
- This method actually processes a template and returns
- the result.
-
- @header process(template, part=None)
- @return Result of the processing as string.
-
- @param template A compiled template.
- Value of this parameter must be an instance of the
- <em>Template</em> class created either by the
- <em>TemplateManager</em> or by the <em>TemplateCompiler</em>.
-
- @param part The part of a multipart template to process.
- This parameter can be used only together with a multipart
- template. It specifies the number of the part to process.
- It must be greater than zero, because the parts are numbered
- from one.
-
- The parts must be processed in the right order. You
- cannot process a part which precedes an already processed part.
-
- If this parameter is not specified, then the whole template
- is processed, or all remaining parts are processed.
- """
- self.DEB("APP INPUT:")
- if self._debug: pprint.pprint(self._vars, sys.stderr)
- if part != None and (part == 0 or part < self._current_part):
- raise TemplateError, "process() - invalid part number"
-
- # This flag means "jump behind the end of current statement" or
- # "skip the parameters of current statement".
- # Even parameters that actually are not present in the template
- # do appear in the list of tokens as empty items !
- skip_params = 0
-
- # Stack for enabling or disabling output in response to TMPL_IF,
- # TMPL_UNLESS, TMPL_ELSE and TMPL_LOOPs with no passes.
- output_control = []
- ENABLE_OUTPUT = 1
- DISABLE_OUTPUT = 0
-
- # Stacks for data related to loops.
- loop_name = [] # name of a loop
- loop_pass = [] # current pass of a loop (counted from zero)
- loop_start = [] # index of loop start in token list
- loop_total = [] # total number of passes in a loop
-
- tokens = template.tokens()
- len_tokens = len(tokens)
- out = "" # buffer for processed output
-
- # Recover position at which we ended after processing of last part.
- i = self._current_pos
-
- # Process the list of tokens.
- while 1:
- if i == len_tokens: break
- if skip_params:
- # Skip the parameters following a statement.
- skip_params = 0
- i += PARAMS_NUMBER
- continue
-
- token = tokens[i]
- if token.startswith("<TMPL_") or \
- token.startswith("</TMPL_"):
- if token == "<TMPL_VAR":
- # TMPL_VARs should be first. They are the most common.
- var = tokens[i + PARAM_NAME]
- if not var:
- raise TemplateError, "No identifier in <TMPL_VAR>."
- escape = tokens[i + PARAM_ESCAPE]
- globalp = tokens[i + PARAM_GLOBAL]
- skip_params = 1
-
- # If output of current block is not disabled then append
- # the substitued and escaped variable to the output.
- if DISABLE_OUTPUT not in output_control:
- value = str(self.find_value(var, loop_name, loop_pass,
- loop_total, globalp))
- out += self.escape(value, escape)
- self.DEB("VAR: " + str(var))
-
- elif token == "<TMPL_LOOP":
- var = tokens[i + PARAM_NAME]
- if not var:
- raise TemplateError, "No identifier in <TMPL_LOOP>."
- skip_params = 1
-
- # Find total number of passes in this loop.
- passtotal = self.find_value(var, loop_name, loop_pass,
- loop_total)
- if not passtotal: passtotal = 0
- # Push data for this loop on the stack.
- loop_total.append(passtotal)
- loop_start.append(i)
- loop_pass.append(0)
- loop_name.append(var)
-
- # Disable output of loop block if the number of passes
- # in this loop is zero.
- if passtotal == 0:
- # This loop is empty.
- output_control.append(DISABLE_OUTPUT)
- self.DEB("LOOP: DISABLE: " + str(var))
- else:
- output_control.append(ENABLE_OUTPUT)
- self.DEB("LOOP: FIRST PASS: %s TOTAL: %d"\
- % (var, passtotal))
-
- elif token == "<TMPL_IF":
- var = tokens[i + PARAM_NAME]
- if not var:
- raise TemplateError, "No identifier in <TMPL_IF>."
- globalp = tokens[i + PARAM_GLOBAL]
- skip_params = 1
- if self.find_value(var, loop_name, loop_pass,
- loop_total, globalp):
- output_control.append(ENABLE_OUTPUT)
- self.DEB("IF: ENABLE: " + str(var))
- else:
- output_control.append(DISABLE_OUTPUT)
- self.DEB("IF: DISABLE: " + str(var))
-
- elif token == "<TMPL_UNLESS":
- var = tokens[i + PARAM_NAME]
- if not var:
- raise TemplateError, "No identifier in <TMPL_UNLESS>."
- globalp = tokens[i + PARAM_GLOBAL]
- skip_params = 1
- if self.find_value(var, loop_name, loop_pass,
- loop_total, globalp):
- output_control.append(DISABLE_OUTPUT)
- self.DEB("UNLESS: DISABLE: " + str(var))
- else:
- output_control.append(ENABLE_OUTPUT)
- self.DEB("UNLESS: ENABLE: " + str(var))
-
- elif token == "</TMPL_LOOP":
- skip_params = 1
- if not loop_name:
- raise TemplateError, "Unmatched </TMPL_LOOP>."
-
- # If this loop was not disabled, then record the pass.
- if loop_total[-1] > 0: loop_pass[-1] += 1
-
- if loop_pass[-1] == loop_total[-1]:
- # There are no more passes in this loop. Pop
- # the loop from stack.
- loop_pass.pop()
- loop_name.pop()
- loop_start.pop()
- loop_total.pop()
- output_control.pop()
- self.DEB("LOOP: END")
- else:
- # Jump to the beggining of this loop block
- # to process next pass of the loop.
- i = loop_start[-1]
- self.DEB("LOOP: NEXT PASS")
-
- elif token == "</TMPL_IF":
- skip_params = 1
- if not output_control:
- raise TemplateError, "Unmatched </TMPL_IF>."
- output_control.pop()
- self.DEB("IF: END")
-
- elif token == "</TMPL_UNLESS":
- skip_params = 1
- if not output_control:
- raise TemplateError, "Unmatched </TMPL_UNLESS>."
- output_control.pop()
- self.DEB("UNLESS: END")
-
- elif token == "<TMPL_ELSE":
- skip_params = 1
- if not output_control:
- raise TemplateError, "Unmatched <TMPL_ELSE>."
- if output_control[-1] == DISABLE_OUTPUT:
- # Condition was false, activate the ELSE block.
- output_control[-1] = ENABLE_OUTPUT
- self.DEB("ELSE: ENABLE")
- elif output_control[-1] == ENABLE_OUTPUT:
- # Condition was true, deactivate the ELSE block.
- output_control[-1] = DISABLE_OUTPUT
- self.DEB("ELSE: DISABLE")
- else:
- raise TemplateError, "BUG: ELSE: INVALID FLAG"
-
- elif token == "<TMPL_BOUNDARY":
- if part and part == self._current_part:
- self.DEB("BOUNDARY ON")
- self._current_part += 1
- self._current_pos = i + 1 + PARAMS_NUMBER
- break
- else:
- skip_params = 1
- self.DEB("BOUNDARY OFF")
- self._current_part += 1
-
- elif token == "<TMPL_INCLUDE":
- # TMPL_INCLUDE is left in the compiled template only
- # when it was not replaced by the parser.
- skip_params = 1
- filename = tokens[i + PARAM_NAME]
- out += """
- <br />
- <p>
- <strong>HTMLTMPL WARNING:</strong><br />
- Cannot include template: <strong>%s</strong>
- </p>
- <br />
- """ % filename
- self.DEB("CANNOT INCLUDE WARNING")
-
- elif token == "<TMPL_GETTEXT":
- skip_params = 1
- if DISABLE_OUTPUT not in output_control:
- text = tokens[i + PARAM_GETTEXT_STRING]
- out += gettext.gettext(text)
- self.DEB("GETTEXT: " + text)
-
- else:
- # Unknown processing directive.
- raise TemplateError, "Invalid statement %s>." % token
-
- elif DISABLE_OUTPUT not in output_control:
- # Raw textual template data.
- # If output of current block is not disabled, then
- # append template data to the output buffer.
- out += token
-
- i += 1
- # end of the big while loop
-
- # Check whether all opening statements were closed.
- if loop_name: raise TemplateError, "Missing </TMPL_LOOP>."
- if output_control: raise TemplateError, "Missing </TMPL_IF> or </TMPL_UNLESS>"
- return out
-
- ##############################################
- # PRIVATE METHODS #
- ##############################################
-
- def DEB(self, str):
- """ Print debugging message to stderr if debugging is enabled.
- @hidden
- """
- if self._debug: print >> sys.stderr, str
-
- def find_value(self, var, loop_name, loop_pass, loop_total,
- global_override=None):
- """ Search the self._vars data structure to find variable var
- located in currently processed pass of a loop which
- is currently being processed. If the variable is an ordinary
- variable, then return it.
-
- If the variable is an identificator of a loop, then
- return the total number of times this loop will
- be executed.
-
- Return an empty string, if the variable is not
- found at all.
-
- @hidden
- """
- # Search for the requested variable in magic vars if the name
- # of the variable starts with "__" and if we are inside a loop.
- if self._magic_vars and var.startswith("__") and loop_name:
- return self.magic_var(var, loop_pass[-1], loop_total[-1])
-
- # Search for an ordinary variable or for a loop.
- # Recursively search in self._vars for the requested variable.
- scope = self._vars
- globals = []
- for i in range(len(loop_name)):
- # If global lookup is on then push the value on the stack.
- if ((self._global_vars and global_override != "0") or \
- global_override == "1") and scope.has_key(var) and \
- self.is_ordinary_var(scope[var]):
- globals.append(scope[var])
-
- # Descent deeper into the hierarchy.
- if scope.has_key(loop_name[i]) and scope[loop_name[i]]:
- scope = scope[loop_name[i]][loop_pass[i]]
- else:
- return ""
-
- if scope.has_key(var):
- # Value exists in current loop.
- if type(scope[var]) == ListType:
- # The requested value is a loop.
- # Return total number of its passes.
- return len(scope[var])
- else:
- return scope[var]
- elif globals and \
- ((self._global_vars and global_override != "0") or \
- global_override == "1"):
- # Return globally looked up value.
- return globals.pop()
- else:
- # No value found.
- if var[0].isupper():
- # This is a loop name.
- # Return zero, because the user wants to know number
- # of its passes.
- return 0
- else:
- return ""
-
- def magic_var(self, var, loop_pass, loop_total):
- """ Resolve and return value of a magic variable.
- Raise an exception if the magic variable is not recognized.
-
- @hidden
- """
- self.DEB("MAGIC: '%s', PASS: %d, TOTAL: %d"\
- % (var, loop_pass, loop_total))
- if var == "__FIRST__":
- if loop_pass == 0:
- return 1
- else:
- return 0
- elif var == "__LAST__":
- if loop_pass == loop_total - 1:
- return 1
- else:
- return 0
- elif var == "__INNER__":
- # If this is neither the first nor the last pass.
- if loop_pass != 0 and loop_pass != loop_total - 1:
- return 1
- else:
- return 0
- elif var == "__PASS__":
- # Magic variable __PASS__ counts passes from one.
- return loop_pass + 1
- elif var == "__PASSTOTAL__":
- return loop_total
- elif var == "__ODD__":
- # Internally pass numbers stored in loop_pass are counted from
- # zero. But the template language presents them counted from one.
- # Therefore we must add one to the actual loop_pass value to get
- # the value we present to the user.
- if (loop_pass + 1) % 2 != 0:
- return 1
- else:
- return 0
- elif var.startswith("__EVERY__"):
- # Magic variable __EVERY__x is never true in first or last pass.
- if loop_pass != 0 and loop_pass != loop_total - 1:
- # Check if an integer follows the variable name.
- try:
- every = int(var[9:]) # nine is length of "__EVERY__"
- except ValueError:
- raise TemplateError, "Magic variable __EVERY__x: "\
- "Invalid pass number."
- else:
- if not every:
- raise TemplateError, "Magic variable __EVERY__x: "\
- "Pass number cannot be zero."
- elif (loop_pass + 1) % every == 0:
- self.DEB("MAGIC: EVERY: " + str(every))
- return 1
- else:
- return 0
- else:
- return 0
- else:
- raise TemplateError, "Invalid magic variable '%s'." % var
-
- def escape(self, str, override=""):
- """ Escape a string either by HTML escaping or by URL escaping.
- @hidden
- """
- ESCAPE_QUOTES = 1
- if (self._html_escape and override != "NONE" and override != "0" and \
- override != "URL") or override == "HTML" or override == "1":
- return cgi.escape(str, ESCAPE_QUOTES)
- elif override == "URL":
- return urllib.quote_plus(str)
- else:
- return str
-
- def is_ordinary_var(self, var):
- """ Return true if var is a scalar. (not a reference to loop)
- @hidden
- """
- if type(var) == StringType or type(var) == IntType or \
- type(var) == LongType or type(var) == FloatType:
- return 1
- else:
- return 0
-
-
-##############################################
-# CLASS: TemplateCompiler #
-##############################################
-
-class TemplateCompiler:
- """ Preprocess, parse, tokenize and compile the template.
-
- This class parses the template and produces a 'compiled' form
- of it. This compiled form is an instance of the <em>Template</em>
- class. The compiled form is used as input for the TemplateProcessor
- which uses it to actually process the template.
-
- This class should be used direcly only when you need to compile
- a template from a string. If your template is in a file, then you
- should use the <em>TemplateManager</em> class which provides
- a higher level interface to this class and also can save the
- compiled template to disk in a precompiled form.
- """
-
- def __init__(self, include=1, max_include=5, comments=1, gettext=0,
- debug=0):
- """ Constructor.
-
- @header __init__(include=1, max_include=5, comments=1, gettext=0,
- debug=0)
-
- @param include Enable or disable included templates.
- @param max_include Maximum depth of nested inclusions.
- @param comments Enable or disable template comments.
- @param gettext Enable or disable gettext support.
- @param debug Enable or disable debugging messages.
- """
-
- self._include = include
- self._max_include = max_include
- self._comments = comments
- self._gettext = gettext
- self._debug = debug
-
- # This is a list of filenames of all included templates.
- # It's modified by the include_templates() method.
- self._include_files = []
-
- # This is a counter of current inclusion depth. It's used to prevent
- # infinite recursive includes.
- self._include_level = 0
-
- def compile(self, file):
- """ Compile template from a file.
-
- @header compile(file)
- @return Compiled template.
- The return value is an instance of the <em>Template</em>
- class.
-
- @param file Filename of the template.
- See the <em>prepare()</em> method of the <em>TemplateManager</em>
- class for exaplanation of this parameter.
- """
-
- self.DEB("COMPILING FROM FILE: " + file)
- self._include_path = os.path.join(os.path.dirname(file), INCLUDE_DIR)
- tokens = self.parse(self.read(file))
- compile_params = (self._include, self._max_include, self._comments,
- self._gettext)
- return Template(__version__, file, self._include_files,
- tokens, compile_params, self._debug)
-
- def compile_string(self, data):
- """ Compile template from a string.
-
- This method compiles a template from a string. The
- template cannot include any templates.
- <strong>TMPL_INCLUDE</strong> statements are turned into warnings.
-
- @header compile_string(data)
- @return Compiled template.
- The return value is an instance of the <em>Template</em>
- class.
-
- @param data String containing the template data.
- """
- self.DEB("COMPILING FROM STRING")
- self._include = 0
- tokens = self.parse(data)
- compile_params = (self._include, self._max_include, self._comments,
- self._gettext)
- return Template(__version__, None, None, tokens, compile_params,
- self._debug)
-
- ##############################################
- # PRIVATE METHODS #
- ##############################################
-
- def DEB(self, str):
- """ Print debugging message to stderr if debugging is enabled.
- @hidden
- """
- if self._debug: print >> sys.stderr, str
-
- def read(self, filename):
- """ Read content of file and return it. Raise an error if a problem
- occurs.
- @hidden
- """
- self.DEB("READING: " + filename)
- try:
- f = None
- try:
- f = open(filename, "r")
- data = f.read()
- except IOError, (errno, errstr):
- raise TemplateError, "IO error while reading template '%s': "\
- "(%d) %s" % (filename, errno, errstr)
- else:
- return data
- finally:
- if f: f.close()
-
- def parse(self, template_data):
- """ Parse the template. This method is recursively called from
- within the include_templates() method.
-
- @return List of processing tokens.
- @hidden
- """
- if self._comments:
- self.DEB("PREPROCESS: COMMENTS")
- template_data = self.remove_comments(template_data)
- tokens = self.tokenize(template_data)
- if self._include:
- self.DEB("PREPROCESS: INCLUDES")
- self.include_templates(tokens)
- return tokens
-
- def remove_comments(self, template_data):
- """ Remove comments from the template data.
- @hidden
- """
- pattern = r"### .*"
- return re.sub(pattern, "", template_data)
-
- def include_templates(self, tokens):
- """ Process TMPL_INCLUDE statements. Use the include_level counter
- to prevent infinite recursion. Record paths to all included
- templates to self._include_files.
- @hidden
- """
- i = 0
- out = "" # buffer for output
- skip_params = 0
-
- # Process the list of tokens.
- while 1:
- if i == len(tokens): break
- if skip_params:
- skip_params = 0
- i += PARAMS_NUMBER
- continue
-
- token = tokens[i]
- if token == "<TMPL_INCLUDE":
- filename = tokens[i + PARAM_NAME]
- if not filename:
- raise TemplateError, "No filename in <TMPL_INCLUDE>."
- self._include_level += 1
- if self._include_level > self._max_include:
- # Do not include the template.
- # Protection against infinite recursive includes.
- skip_params = 1
- self.DEB("INCLUDE: LIMIT REACHED: " + filename)
- else:
- # Include the template.
- skip_params = 0
- include_file = os.path.join(self._include_path, filename)
- self._include_files.append(include_file)
- include_data = self.read(include_file)
- include_tokens = self.parse(include_data)
-
- # Append the tokens from the included template to actual
- # position in the tokens list, replacing the TMPL_INCLUDE
- # token and its parameters.
- tokens[i:i+PARAMS_NUMBER+1] = include_tokens
- i = i + len(include_tokens)
- self.DEB("INCLUDED: " + filename)
- continue # Do not increment 'i' below.
- i += 1
- # end of the main while loop
-
- if self._include_level > 0: self._include_level -= 1
- return out
-
- def tokenize(self, template_data):
- """ Split the template into tokens separated by template statements.
- The statements itself and associated parameters are also
- separately included in the resulting list of tokens.
- Return list of the tokens.
-
- @hidden
- """
- self.DEB("TOKENIZING TEMPLATE")
- # NOTE: The TWO double quotes in character class in the regexp below
- # are there only to prevent confusion of syntax highlighter in Emacs.
- pattern = r"""
- (?:^[ \t]+)? # eat spaces, tabs (opt.)
- (<
- (?:!--[ ])? # comment start + space (opt.)
- /?TMPL_[A-Z]+ # closing slash / (opt.) + statement
- [ a-zA-Z0-9""/.=:_\\-]* # this spans also comments ending (--)
- >)
- [%s]? # eat trailing newline (opt.)
- """ % os.linesep
- rc = re.compile(pattern, re.VERBOSE | re.MULTILINE)
- split = rc.split(template_data)
- tokens = []
- for statement in split:
- if statement.startswith("<TMPL_") or \
- statement.startswith("</TMPL_") or \
- statement.startswith("<!-- TMPL_") or \
- statement.startswith("<!-- /TMPL_"):
- # Processing statement.
- statement = self.strip_brackets(statement)
- params = re.split(r"\s+", statement)
- tokens.append(self.find_directive(params))
- tokens.append(self.find_name(params))
- tokens.append(self.find_param("ESCAPE", params))
- tokens.append(self.find_param("GLOBAL", params))
- else:
- # "Normal" template data.
- if self._gettext:
- self.DEB("PARSING GETTEXT STRINGS")
- self.gettext_tokens(tokens, statement)
- else:
- tokens.append(statement)
- return tokens
-
- def gettext_tokens(self, tokens, str):
- """ Find gettext strings and return appropriate array of
- processing tokens.
- @hidden
- """
- escaped = 0
- gt_mode = 0
- i = 0
- buf = ""
- while(1):
- if i == len(str): break
- if str[i] == "\\":
- escaped = 0
- if str[i+1] == "\\":
- buf += "\\"
- i += 2
- continue
- elif str[i+1] == "[" or str[i+1] == "]":
- escaped = 1
- else:
- buf += "\\"
- elif str[i] == "[" and str[i+1] == "[":
- if gt_mode:
- if escaped:
- escaped = 0
- buf += "["
- else:
- buf += "["
- else:
- if escaped:
- escaped = 0
- buf += "["
- else:
- tokens.append(buf)
- buf = ""
- gt_mode = 1
- i += 2
- continue
- elif str[i] == "]" and str[i+1] == "]":
- if gt_mode:
- if escaped:
- escaped = 0
- buf += "]"
- else:
- self.add_gettext_token(tokens, buf)
- buf = ""
- gt_mode = 0
- i += 2
- continue
- else:
- if escaped:
- escaped = 0
- buf += "]"
- else:
- buf += "]"
- else:
- escaped = 0
- buf += str[i]
- i += 1
- # end of the loop
-
- if buf:
- tokens.append(buf)
-
- def add_gettext_token(self, tokens, str):
- """ Append a gettext token and gettext string to the tokens array.
- @hidden
- """
- self.DEB("GETTEXT PARSER: TOKEN: " + str)
- tokens.append("<TMPL_GETTEXT")
- tokens.append(str)
- tokens.append(None)
- tokens.append(None)
-
- def strip_brackets(self, statement):
- """ Strip HTML brackets (with optional HTML comments) from the
- beggining and from the end of a statement.
- @hidden
- """
- if statement.startswith("<!-- TMPL_") or \
- statement.startswith("<!-- /TMPL_"):
- return statement[5:-4]
- else:
- return statement[1:-1]
-
- def find_directive(self, params):
- """ Extract processing directive (TMPL_*) from a statement.
- @hidden
- """
- directive = params[0]
- del params[0]
- self.DEB("TOKENIZER: DIRECTIVE: " + directive)
- return "<" + directive
-
- def find_name(self, params):
- """ Extract identifier from a statement. The identifier can be
- specified both implicitely or explicitely as a 'NAME' parameter.
- @hidden
- """
- if len(params) > 0 and '=' not in params[0]:
- # implicit identifier
- name = params[0]
- del params[0]
- else:
- # explicit identifier as a 'NAME' parameter
- name = self.find_param("NAME", params)
- self.DEB("TOKENIZER: NAME: " + str(name))
- return name
-
- def find_param(self, param, params):
- """ Extract value of parameter from a statement.
- @hidden
- """
- for pair in params:
- name, value = pair.split("=")
- if not name or not value:
- raise TemplateError, "Syntax error in template."
- if name == param:
- if value[0] == '"':
- # The value is in double quotes.
- ret_value = value[1:-1]
- else:
- # The value is without double quotes.
- ret_value = value
- self.DEB("TOKENIZER: PARAM: '%s' => '%s'" % (param, ret_value))
- return ret_value
- else:
- self.DEB("TOKENIZER: PARAM: '%s' => NOT DEFINED" % param)
- return None
-
-
-##############################################
-# CLASS: Template #
-##############################################
-
-class Template:
- """ This class represents a compiled template.
-
- This class provides storage and methods for the compiled template
- and associated metadata. It's serialized by pickle if we need to
- save the compiled template to disk in a precompiled form.
-
- You should never instantiate this class directly. Always use the
- <em>TemplateManager</em> or <em>TemplateCompiler</em> classes to
- create the instances of this class.
-
- The only method which you can directly use is the <em>is_uptodate</em>
- method.
- """
-
- def __init__(self, version, file, include_files, tokens, compile_params,
- debug=0):
- """ Constructor.
- @hidden
- """
- self._version = version
- self._file = file
- self._tokens = tokens
- self._compile_params = compile_params
- self._debug = debug
- self._mtime = None
- self._include_mtimes = {}
-
- if not file:
- self.DEB("TEMPLATE WAS COMPILED FROM A STRING")
- return
-
- # Save modifitcation time of the main template file.
- if os.path.isfile(file):
- self._mtime = os.path.getmtime(file)
- else:
- raise TemplateError, "Template: file does not exist: '%s'" % file
-
- # Save modificaton times of all included template files.
- for inc_file in include_files:
- if os.path.isfile(inc_file):
- self._include_mtimes[inc_file] = os.path.getmtime(inc_file)
- else:
- raise TemplateError, "Template: file does not exist: '%s'"\
- % inc_file
-
- self.DEB("NEW TEMPLATE CREATED")
-
- def is_uptodate(self, compile_params=None):
- """ Check whether the compiled template is uptodate.
-
- Return true if this compiled template is uptodate.
- Return false, if the template source file was changed on the
- disk since it was compiled.
- Works by comparison of modification times.
- Also takes modification times of all included templates
- into account.
-
- @header is_uptodate(compile_params=None)
- @return True if the template is uptodate, false otherwise.
-
- @param compile_params Only for internal use.
- Do not use this optional parameter. It's intended only for
- internal use by the <em>TemplateManager</em>.
- """
- if not self._file:
- self.DEB("TEMPLATE COMPILED FROM A STRING")
- return 0
-
- if self._version != __version__:
- self.DEB("TEMPLATE: VERSION NOT UPTODATE")
- return 0
-
- if compile_params != None and compile_params != self._compile_params:
- self.DEB("TEMPLATE: DIFFERENT COMPILATION PARAMS")
- return 0
-
- # Check modification times of the main template and all included
- # templates. If the included template no longer exists, then
- # the problem will be resolved when the template is recompiled.
-
- # Main template file.
- if not (os.path.isfile(self._file) and \
- self._mtime == os.path.getmtime(self._file)):
- self.DEB("TEMPLATE: NOT UPTODATE: " + self._file)
- return 0
-
- # Included templates.
- for inc_file in self._include_mtimes.keys():
- if not (os.path.isfile(inc_file) and \
- self._include_mtimes[inc_file] == \
- os.path.getmtime(inc_file)):
- self.DEB("TEMPLATE: NOT UPTODATE: " + inc_file)
- return 0
- else:
- self.DEB("TEMPLATE: UPTODATE")
- return 1
-
- def tokens(self):
- """ Get tokens of this template.
- @hidden
- """
- return self._tokens
-
- def file(self):
- """ Get filename of the main file of this template.
- @hidden
- """
- return self._file
-
- def debug(self, debug):
- """ Get debugging state.
- @hidden
- """
- self._debug = debug
-
- ##############################################
- # PRIVATE METHODS #
- ##############################################
-
- def __getstate__(self):
- """ Used by pickle when the class is serialized.
- Remove the 'debug' attribute before serialization.
- @hidden
- """
- dict = copy.copy(self.__dict__)
- del dict["_debug"]
- return dict
-
- def __setstate__(self, dict):
- """ Used by pickle when the class is unserialized.
- Add the 'debug' attribute.
- @hidden
- """
- dict["_debug"] = 0
- self.__dict__ = dict
-
-
- def DEB(self, str):
- """ Print debugging message to stderr.
- @hidden
- """
- if self._debug: print >> sys.stderr, str
-
-
-##############################################
-# EXCEPTIONS #
-##############################################
-
-class TemplateError(Exception):
- """ Fatal exception. Raised on runtime or template syntax errors.
-
- This exception is raised when a runtime error occurs or when a syntax
- error in the template is found. It has one parameter which always
- is a string containing a description of the error.
-
- All potential IOError exceptions are handled by the module and are
- converted to TemplateError exceptions. That means you should catch the
- TemplateError exception if there is a possibility that for example
- the template file will not be accesssible.
-
- The exception can be raised by constructors or by any method of any
- class.
-
- The instance is no longer usable when this exception is raised.
- """
-
- def __init__(self, error):
- """ Constructor.
- @hidden
- """
- Exception.__init__(self, "Htmltmpl error: " + error)
-
-
-class PrecompiledError(Exception):
- """ This exception is _PRIVATE_ and non fatal.
- @hidden
- """
-
- def __init__(self, template):
- """ Constructor.
- @hidden
- """
- Exception.__init__(self, template)
-
Copied: trunk/lib/venus/planet/vendor/htmltmpl.py (from rev 656, branches/sucs-site/lib/venus/planet/vendor/htmltmpl.py)
===================================================================
--- trunk/lib/venus/planet/vendor/htmltmpl.py (rev 0)
+++ trunk/lib/venus/planet/vendor/htmltmpl.py 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,1421 @@
+
+""" A templating engine for separation of code and HTML.
+
+ The documentation of this templating engine is separated to two parts:
+
+ 1. Description of the templating language.
+
+ 2. Documentation of classes and API of this module that provides
+ a Python implementation of the templating language.
+
+ All the documentation can be found in 'doc' directory of the
+ distribution tarball or at the homepage of the engine.
+ Latest versions of this module are also available at that website.
+
+ You can use and redistribute this module under conditions of the
+ GNU General Public License that can be found either at
+ [ http://www.gnu.org/ ] or in file "LICENSE" contained in the
+ distribution tarball of this module.
+
+ Copyright (c) 2001 Tomas Styblo, tripie at cpan.org
+
+ @name htmltmpl
+ @version 1.22
+ @author-name Tomas Styblo
+ @author-email tripie at cpan.org
+ @website http://htmltmpl.sourceforge.net/
+ @license-name GNU GPL
+ @license-url http://www.gnu.org/licenses/gpl.html
+"""
+
+__version__ = 1.22
+__author__ = "Tomas Styblo (tripie at cpan.org)"
+
+# All imported modules are part of the standard Python library.
+
+from types import *
+import re
+import os
+import os.path
+import pprint # only for debugging
+import sys
+import copy
+import cgi # for HTML escaping of variables
+import urllib # for URL escaping of variables
+import cPickle # for template compilation
+import gettext
+import portalocker # for locking
+
+INCLUDE_DIR = "inc"
+
+# Total number of possible parameters.
+# Increment if adding a parameter to any statement.
+PARAMS_NUMBER = 3
+
+# Relative positions of parameters in TemplateCompiler.tokenize().
+PARAM_NAME = 1
+PARAM_ESCAPE = 2
+PARAM_GLOBAL = 3
+PARAM_GETTEXT_STRING = 1
+
+##############################################
+# CLASS: TemplateManager #
+##############################################
+
+class TemplateManager:
+ """ Class that manages compilation and precompilation of templates.
+
+ You should use this class whenever you work with templates
+ that are stored in a file. The class can create a compiled
+ template and transparently manage its precompilation. It also
+ keeps the precompiled templates up-to-date by modification times
+ comparisons.
+ """
+
+ def __init__(self, include=1, max_include=5, precompile=1, comments=1,
+ gettext=0, debug=0):
+ """ Constructor.
+
+ @header
+ __init__(include=1, max_include=5, precompile=1, comments=1,
+ gettext=0, debug=0)
+
+ @param include Enable or disable included templates.
+ This optional parameter can be used to enable or disable
+ <em>TMPL_INCLUDE</em> inclusion of templates. Disabling of
+ inclusion can improve performance a bit. The inclusion is
+ enabled by default.
+
+ @param max_include Maximum depth of nested inclusions.
+ This optional parameter can be used to specify maximum depth of
+ nested <em>TMPL_INCLUDE</em> inclusions. It defaults to 5.
+ This setting prevents infinite recursive inclusions.
+
+ @param precompile Enable or disable precompilation of templates.
+ This optional parameter can be used to enable or disable
+ creation and usage of precompiled templates.
+
+ A precompiled template is saved to the same directory in
+ which the main template file is located. You need write
+ permissions to that directory.
+
+ Precompilation provides a significant performance boost because
+ it's not necessary to parse the templates over and over again.
+ The boost is especially noticeable when templates that include
+ other templates are used.
+
+ Comparison of modification times of the main template and all
+ included templates is used to ensure that the precompiled
+ templates are up-to-date. Templates are also recompiled if the
+ htmltmpl module is updated.
+
+ The <em>TemplateError</em>exception is raised when the precompiled
+ template cannot be saved. Precompilation is enabled by default.
+
+ @param comments Enable or disable template comments.
+ This optional parameter can be used to enable or disable
+ template comments.
+ Disabling of the comments can improve performance a bit.
+ Comments are enabled by default.
+
+ @param gettext Enable or disable gettext support.
+
+ @param debug Enable or disable debugging messages.
+ This optional parameter is a flag that can be used to enable
+ or disable debugging messages which are printed to the standard
+ error output. The debugging messages are disabled by default.
+ """
+ # Save the optional parameters.
+ # These values are not modified by any method.
+ self._include = include
+ self._max_include = max_include
+ self._precompile = precompile
+ self._comments = comments
+ self._gettext = gettext
+ self._debug = debug
+
+ self.DEB("INIT DONE")
+
+ def prepare(self, file):
+ """ Preprocess, parse, tokenize and compile the template.
+
+ If precompilation is enabled then this method tries to load
+ a precompiled form of the template from the same directory
+ in which the template source file is located. If it succeeds,
+ then it compares modification times stored in the precompiled
+ form to modification times of source files of the template,
+ including source files of all templates included via the
+ <em>TMPL_INCLUDE</em> statements. If any of the modification times
+ differs, then the template is recompiled and the precompiled
+ form updated.
+
+ If precompilation is disabled, then this method parses and
+ compiles the template.
+
+ @header prepare(file)
+
+ @return Compiled template.
+ The methods returns an instance of the <em>Template</em> class
+ which is a compiled form of the template. This instance can be
+ used as input for the <em>TemplateProcessor</em>.
+
+ @param file Path to the template file to prepare.
+ The method looks for the template file in current directory
+ if the parameter is a relative path. All included templates must
+ be placed in subdirectory <strong>'inc'</strong> of the
+ directory in which the main template file is located.
+ """
+ compiled = None
+ if self._precompile:
+ if self.is_precompiled(file):
+ try:
+ precompiled = self.load_precompiled(file)
+ except PrecompiledError, template:
+ print >> sys.stderr, "Htmltmpl: bad precompiled "\
+ "template '%s' removed" % template
+ compiled = self.compile(file)
+ self.save_precompiled(compiled)
+ else:
+ precompiled.debug(self._debug)
+ compile_params = (self._include, self._max_include,
+ self._comments, self._gettext)
+ if precompiled.is_uptodate(compile_params):
+ self.DEB("PRECOMPILED: UPTODATE")
+ compiled = precompiled
+ else:
+ self.DEB("PRECOMPILED: NOT UPTODATE")
+ compiled = self.update(precompiled)
+ else:
+ self.DEB("PRECOMPILED: NOT PRECOMPILED")
+ compiled = self.compile(file)
+ self.save_precompiled(compiled)
+ else:
+ self.DEB("PRECOMPILATION DISABLED")
+ compiled = self.compile(file)
+ return compiled
+
+ def update(self, template):
+ """ Update (recompile) a compiled template.
+
+ This method recompiles a template compiled from a file.
+ If precompilation is enabled then the precompiled form saved on
+ disk is also updated.
+
+ @header update(template)
+
+ @return Recompiled template.
+ It's ensured that the returned template is up-to-date.
+
+ @param template A compiled template.
+ This parameter should be an instance of the <em>Template</em>
+ class, created either by the <em>TemplateManager</em> or by the
+ <em>TemplateCompiler</em>. The instance must represent a template
+ compiled from a file on disk.
+ """
+ self.DEB("UPDATE")
+ updated = self.compile(template.file())
+ if self._precompile:
+ self.save_precompiled(updated)
+ return updated
+
+ ##############################################
+ # PRIVATE METHODS #
+ ##############################################
+
+ def DEB(self, str):
+ """ Print debugging message to stderr if debugging is enabled.
+ @hidden
+ """
+ if self._debug: print >> sys.stderr, str
+
+ def compile(self, file):
+ """ Compile the template.
+ @hidden
+ """
+ return TemplateCompiler(self._include, self._max_include,
+ self._comments, self._gettext,
+ self._debug).compile(file)
+
+ def is_precompiled(self, file):
+ """ Return true if the template is already precompiled on the disk.
+ This method doesn't check whether the compiled template is
+ uptodate.
+ @hidden
+ """
+ filename = file + "c" # "template.tmplc"
+ if os.path.isfile(filename):
+ return 1
+ else:
+ return 0
+
+ def load_precompiled(self, file):
+ """ Load precompiled template from disk.
+
+ Remove the precompiled template file and recompile it
+ if the file contains corrupted or unpicklable data.
+
+ @hidden
+ """
+ filename = file + "c" # "template.tmplc"
+ self.DEB("LOADING PRECOMPILED")
+ try:
+ remove_bad = 0
+ file = None
+ try:
+ file = open(filename, "rb")
+ portalocker.lock(file, portalocker.LOCK_SH)
+ precompiled = cPickle.load(file)
+ except IOError, (errno, errstr):
+ raise TemplateError, "IO error in load precompiled "\
+ "template '%s': (%d) %s"\
+ % (filename, errno, errstr)
+ except cPickle.UnpicklingError:
+ remove_bad = 1
+ raise PrecompiledError, filename
+ except:
+ remove_bad = 1
+ raise
+ else:
+ return precompiled
+ finally:
+ if file:
+ portalocker.unlock(file)
+ file.close()
+ if remove_bad and os.path.isfile(filename):
+ # X: We may lose the original exception here, raising OSError.
+ os.remove(filename)
+
+ def save_precompiled(self, template):
+ """ Save compiled template to disk in precompiled form.
+
+ Associated metadata is also saved. It includes: filename of the
+ main template file, modification time of the main template file,
+ modification times of all included templates and version of the
+ htmltmpl module which compiled the template.
+
+ The method removes a file which is saved only partially because
+ of some error.
+
+ @hidden
+ """
+ filename = template.file() + "c" # creates "template.tmplc"
+ # Check if we have write permission to the template's directory.
+ template_dir = os.path.dirname(os.path.abspath(filename))
+ if not os.access(template_dir, os.W_OK):
+ raise TemplateError, "Cannot save precompiled templates "\
+ "to '%s': write permission denied."\
+ % template_dir
+ try:
+ remove_bad = 0
+ file = None
+ try:
+ file = open(filename, "wb") # may truncate existing file
+ portalocker.lock(file, portalocker.LOCK_EX)
+ BINARY = 1
+ READABLE = 0
+ if self._debug:
+ cPickle.dump(template, file, READABLE)
+ else:
+ cPickle.dump(template, file, BINARY)
+ except IOError, (errno, errstr):
+ remove_bad = 1
+ raise TemplateError, "IO error while saving precompiled "\
+ "template '%s': (%d) %s"\
+ % (filename, errno, errstr)
+ except cPickle.PicklingError, error:
+ remove_bad = 1
+ raise TemplateError, "Pickling error while saving "\
+ "precompiled template '%s': %s"\
+ % (filename, error)
+ except:
+ remove_bad = 1
+ raise
+ else:
+ self.DEB("SAVING PRECOMPILED")
+ finally:
+ if file:
+ portalocker.unlock(file)
+ file.close()
+ if remove_bad and os.path.isfile(filename):
+ # X: We may lose the original exception here, raising OSError.
+ os.remove(filename)
+
+
+##############################################
+# CLASS: TemplateProcessor #
+##############################################
+
+class TemplateProcessor:
+ """ Fill the template with data and process it.
+
+ This class provides actual processing of a compiled template.
+ Use it to set template variables and loops and then obtain
+ result of the processing.
+ """
+
+ def __init__(self, html_escape=1, magic_vars=1, global_vars=0, debug=0):
+ """ Constructor.
+
+ @header __init__(html_escape=1, magic_vars=1, global_vars=0,
+ debug=0)
+
+ @param html_escape Enable or disable HTML escaping of variables.
+ This optional parameter is a flag that can be used to enable or
+ disable automatic HTML escaping of variables.
+ All variables are by default automatically HTML escaped.
+ The escaping process substitutes HTML brackets, ampersands and
+ double quotes with appropriate HTML entities.
+
+ @param magic_vars Enable or disable loop magic variables.
+ This parameter can be used to enable or disable
+ "magic" context variables, that are automatically defined inside
+ loops. Magic variables are enabled by default.
+
+ Refer to the language specification for description of these
+ magic variables.
+
+ @param global_vars Globally activate global lookup of variables.
+ This optional parameter is a flag that can be used to specify
+ whether variables which cannot be found in the current scope
+ should be automatically looked up in enclosing scopes.
+
+ Automatic global lookup is disabled by default. Global lookup
+ can be overriden on a per-variable basis by the
+ <strong>GLOBAL</strong> parameter of a <strong>TMPL_VAR</strong>
+ statement.
+
+ @param debug Enable or disable debugging messages.
+ """
+ self._html_escape = html_escape
+ self._magic_vars = magic_vars
+ self._global_vars = global_vars
+ self._debug = debug
+
+ # Data structure containing variables and loops set by the
+ # application. Use debug=1, process some template and
+ # then check stderr to see how the structure looks.
+ # It's modified only by set() and reset() methods.
+ self._vars = {}
+
+ # Following variables are for multipart templates.
+ self._current_part = 1
+ self._current_pos = 0
+
+ def set(self, var, value):
+ """ Associate a value with top-level template variable or loop.
+
+ A template identifier can represent either an ordinary variable
+ (string) or a loop.
+
+ To assign a value to a string identifier pass a scalar
+ as the 'value' parameter. This scalar will be automatically
+ converted to string.
+
+ To assign a value to a loop identifier pass a list of mappings as
+ the 'value' parameter. The engine iterates over this list and
+ assigns values from the mappings to variables in a template loop
+ block if a key in the mapping corresponds to a name of a variable
+ in the loop block. The number of mappings contained in this list
+ is equal to number of times the loop block is repeated in the
+ output.
+
+ @header set(var, value)
+ @return No return value.
+
+ @param var Name of template variable or loop.
+ @param value The value to associate.
+
+ """
+ # The correctness of character case is verified only for top-level
+ # variables.
+ if self.is_ordinary_var(value):
+ # template top-level ordinary variable
+ if not var.islower():
+ raise TemplateError, "Invalid variable name '%s'." % var
+ elif type(value) == ListType:
+ # template top-level loop
+ if var != var.capitalize():
+ raise TemplateError, "Invalid loop name '%s'." % var
+ else:
+ raise TemplateError, "Value of toplevel variable '%s' must "\
+ "be either a scalar or a list." % var
+ self._vars[var] = value
+ self.DEB("VALUE SET: " + str(var))
+
+ def reset(self, keep_data=0):
+ """ Reset the template data.
+
+ This method resets the data contained in the template processor
+ instance. The template processor instance can be used to process
+ any number of templates, but this method must be called after
+ a template is processed to reuse the instance,
+
+ @header reset(keep_data=0)
+ @return No return value.
+
+ @param keep_data Do not reset the template data.
+ Use this flag if you do not want the template data to be erased.
+ This way you can reuse the data contained in the instance of
+ the <em>TemplateProcessor</em>.
+ """
+ self._current_part = 1
+ self._current_pos = 0
+ if not keep_data:
+ self._vars.clear()
+ self.DEB("RESET")
+
+ def process(self, template, part=None):
+ """ Process a compiled template. Return the result as string.
+
+ This method actually processes a template and returns
+ the result.
+
+ @header process(template, part=None)
+ @return Result of the processing as string.
+
+ @param template A compiled template.
+ Value of this parameter must be an instance of the
+ <em>Template</em> class created either by the
+ <em>TemplateManager</em> or by the <em>TemplateCompiler</em>.
+
+ @param part The part of a multipart template to process.
+ This parameter can be used only together with a multipart
+ template. It specifies the number of the part to process.
+ It must be greater than zero, because the parts are numbered
+ from one.
+
+ The parts must be processed in the right order. You
+ cannot process a part which precedes an already processed part.
+
+ If this parameter is not specified, then the whole template
+ is processed, or all remaining parts are processed.
+ """
+ self.DEB("APP INPUT:")
+ if self._debug: pprint.pprint(self._vars, sys.stderr)
+ if part != None and (part == 0 or part < self._current_part):
+ raise TemplateError, "process() - invalid part number"
+
+ # This flag means "jump behind the end of current statement" or
+ # "skip the parameters of current statement".
+ # Even parameters that actually are not present in the template
+ # do appear in the list of tokens as empty items !
+ skip_params = 0
+
+ # Stack for enabling or disabling output in response to TMPL_IF,
+ # TMPL_UNLESS, TMPL_ELSE and TMPL_LOOPs with no passes.
+ output_control = []
+ ENABLE_OUTPUT = 1
+ DISABLE_OUTPUT = 0
+
+ # Stacks for data related to loops.
+ loop_name = [] # name of a loop
+ loop_pass = [] # current pass of a loop (counted from zero)
+ loop_start = [] # index of loop start in token list
+ loop_total = [] # total number of passes in a loop
+
+ tokens = template.tokens()
+ len_tokens = len(tokens)
+ out = "" # buffer for processed output
+
+ # Recover position at which we ended after processing of last part.
+ i = self._current_pos
+
+ # Process the list of tokens.
+ while 1:
+ if i == len_tokens: break
+ if skip_params:
+ # Skip the parameters following a statement.
+ skip_params = 0
+ i += PARAMS_NUMBER
+ continue
+
+ token = tokens[i]
+ if token.startswith("<TMPL_") or \
+ token.startswith("</TMPL_"):
+ if token == "<TMPL_VAR":
+ # TMPL_VARs should be first. They are the most common.
+ var = tokens[i + PARAM_NAME]
+ if not var:
+ raise TemplateError, "No identifier in <TMPL_VAR>."
+ escape = tokens[i + PARAM_ESCAPE]
+ globalp = tokens[i + PARAM_GLOBAL]
+ skip_params = 1
+
+ # If output of current block is not disabled then append
+ # the substitued and escaped variable to the output.
+ if DISABLE_OUTPUT not in output_control:
+ value = str(self.find_value(var, loop_name, loop_pass,
+ loop_total, globalp))
+ out += self.escape(value, escape)
+ self.DEB("VAR: " + str(var))
+
+ elif token == "<TMPL_LOOP":
+ var = tokens[i + PARAM_NAME]
+ if not var:
+ raise TemplateError, "No identifier in <TMPL_LOOP>."
+ skip_params = 1
+
+ # Find total number of passes in this loop.
+ passtotal = self.find_value(var, loop_name, loop_pass,
+ loop_total)
+ if not passtotal: passtotal = 0
+ # Push data for this loop on the stack.
+ loop_total.append(passtotal)
+ loop_start.append(i)
+ loop_pass.append(0)
+ loop_name.append(var)
+
+ # Disable output of loop block if the number of passes
+ # in this loop is zero.
+ if passtotal == 0:
+ # This loop is empty.
+ output_control.append(DISABLE_OUTPUT)
+ self.DEB("LOOP: DISABLE: " + str(var))
+ else:
+ output_control.append(ENABLE_OUTPUT)
+ self.DEB("LOOP: FIRST PASS: %s TOTAL: %d"\
+ % (var, passtotal))
+
+ elif token == "<TMPL_IF":
+ var = tokens[i + PARAM_NAME]
+ if not var:
+ raise TemplateError, "No identifier in <TMPL_IF>."
+ globalp = tokens[i + PARAM_GLOBAL]
+ skip_params = 1
+ if self.find_value(var, loop_name, loop_pass,
+ loop_total, globalp):
+ output_control.append(ENABLE_OUTPUT)
+ self.DEB("IF: ENABLE: " + str(var))
+ else:
+ output_control.append(DISABLE_OUTPUT)
+ self.DEB("IF: DISABLE: " + str(var))
+
+ elif token == "<TMPL_UNLESS":
+ var = tokens[i + PARAM_NAME]
+ if not var:
+ raise TemplateError, "No identifier in <TMPL_UNLESS>."
+ globalp = tokens[i + PARAM_GLOBAL]
+ skip_params = 1
+ if self.find_value(var, loop_name, loop_pass,
+ loop_total, globalp):
+ output_control.append(DISABLE_OUTPUT)
+ self.DEB("UNLESS: DISABLE: " + str(var))
+ else:
+ output_control.append(ENABLE_OUTPUT)
+ self.DEB("UNLESS: ENABLE: " + str(var))
+
+ elif token == "</TMPL_LOOP":
+ skip_params = 1
+ if not loop_name:
+ raise TemplateError, "Unmatched </TMPL_LOOP>."
+
+ # If this loop was not disabled, then record the pass.
+ if loop_total[-1] > 0: loop_pass[-1] += 1
+
+ if loop_pass[-1] == loop_total[-1]:
+ # There are no more passes in this loop. Pop
+ # the loop from stack.
+ loop_pass.pop()
+ loop_name.pop()
+ loop_start.pop()
+ loop_total.pop()
+ output_control.pop()
+ self.DEB("LOOP: END")
+ else:
+ # Jump to the beggining of this loop block
+ # to process next pass of the loop.
+ i = loop_start[-1]
+ self.DEB("LOOP: NEXT PASS")
+
+ elif token == "</TMPL_IF":
+ skip_params = 1
+ if not output_control:
+ raise TemplateError, "Unmatched </TMPL_IF>."
+ output_control.pop()
+ self.DEB("IF: END")
+
+ elif token == "</TMPL_UNLESS":
+ skip_params = 1
+ if not output_control:
+ raise TemplateError, "Unmatched </TMPL_UNLESS>."
+ output_control.pop()
+ self.DEB("UNLESS: END")
+
+ elif token == "<TMPL_ELSE":
+ skip_params = 1
+ if not output_control:
+ raise TemplateError, "Unmatched <TMPL_ELSE>."
+ if output_control[-1] == DISABLE_OUTPUT:
+ # Condition was false, activate the ELSE block.
+ output_control[-1] = ENABLE_OUTPUT
+ self.DEB("ELSE: ENABLE")
+ elif output_control[-1] == ENABLE_OUTPUT:
+ # Condition was true, deactivate the ELSE block.
+ output_control[-1] = DISABLE_OUTPUT
+ self.DEB("ELSE: DISABLE")
+ else:
+ raise TemplateError, "BUG: ELSE: INVALID FLAG"
+
+ elif token == "<TMPL_BOUNDARY":
+ if part and part == self._current_part:
+ self.DEB("BOUNDARY ON")
+ self._current_part += 1
+ self._current_pos = i + 1 + PARAMS_NUMBER
+ break
+ else:
+ skip_params = 1
+ self.DEB("BOUNDARY OFF")
+ self._current_part += 1
+
+ elif token == "<TMPL_INCLUDE":
+ # TMPL_INCLUDE is left in the compiled template only
+ # when it was not replaced by the parser.
+ skip_params = 1
+ filename = tokens[i + PARAM_NAME]
+ out += """
+ <br />
+ <p>
+ <strong>HTMLTMPL WARNING:</strong><br />
+ Cannot include template: <strong>%s</strong>
+ </p>
+ <br />
+ """ % filename
+ self.DEB("CANNOT INCLUDE WARNING")
+
+ elif token == "<TMPL_GETTEXT":
+ skip_params = 1
+ if DISABLE_OUTPUT not in output_control:
+ text = tokens[i + PARAM_GETTEXT_STRING]
+ out += gettext.gettext(text)
+ self.DEB("GETTEXT: " + text)
+
+ else:
+ # Unknown processing directive.
+ raise TemplateError, "Invalid statement %s>." % token
+
+ elif DISABLE_OUTPUT not in output_control:
+ # Raw textual template data.
+ # If output of current block is not disabled, then
+ # append template data to the output buffer.
+ out += token
+
+ i += 1
+ # end of the big while loop
+
+ # Check whether all opening statements were closed.
+ if loop_name: raise TemplateError, "Missing </TMPL_LOOP>."
+ if output_control: raise TemplateError, "Missing </TMPL_IF> or </TMPL_UNLESS>"
+ return out
+
+ ##############################################
+ # PRIVATE METHODS #
+ ##############################################
+
+ def DEB(self, str):
+ """ Print debugging message to stderr if debugging is enabled.
+ @hidden
+ """
+ if self._debug: print >> sys.stderr, str
+
+ def find_value(self, var, loop_name, loop_pass, loop_total,
+ global_override=None):
+ """ Search the self._vars data structure to find variable var
+ located in currently processed pass of a loop which
+ is currently being processed. If the variable is an ordinary
+ variable, then return it.
+
+ If the variable is an identificator of a loop, then
+ return the total number of times this loop will
+ be executed.
+
+ Return an empty string, if the variable is not
+ found at all.
+
+ @hidden
+ """
+ # Search for the requested variable in magic vars if the name
+ # of the variable starts with "__" and if we are inside a loop.
+ if self._magic_vars and var.startswith("__") and loop_name:
+ return self.magic_var(var, loop_pass[-1], loop_total[-1])
+
+ # Search for an ordinary variable or for a loop.
+ # Recursively search in self._vars for the requested variable.
+ scope = self._vars
+ globals = []
+ for i in range(len(loop_name)):
+ # If global lookup is on then push the value on the stack.
+ if ((self._global_vars and global_override != "0") or \
+ global_override == "1") and scope.has_key(var) and \
+ self.is_ordinary_var(scope[var]):
+ globals.append(scope[var])
+
+ # Descent deeper into the hierarchy.
+ if scope.has_key(loop_name[i]) and scope[loop_name[i]]:
+ scope = scope[loop_name[i]][loop_pass[i]]
+ else:
+ return ""
+
+ if scope.has_key(var):
+ # Value exists in current loop.
+ if type(scope[var]) == ListType:
+ # The requested value is a loop.
+ # Return total number of its passes.
+ return len(scope[var])
+ else:
+ return scope[var]
+ elif globals and \
+ ((self._global_vars and global_override != "0") or \
+ global_override == "1"):
+ # Return globally looked up value.
+ return globals.pop()
+ else:
+ # No value found.
+ if var[0].isupper():
+ # This is a loop name.
+ # Return zero, because the user wants to know number
+ # of its passes.
+ return 0
+ else:
+ return ""
+
+ def magic_var(self, var, loop_pass, loop_total):
+ """ Resolve and return value of a magic variable.
+ Raise an exception if the magic variable is not recognized.
+
+ @hidden
+ """
+ self.DEB("MAGIC: '%s', PASS: %d, TOTAL: %d"\
+ % (var, loop_pass, loop_total))
+ if var == "__FIRST__":
+ if loop_pass == 0:
+ return 1
+ else:
+ return 0
+ elif var == "__LAST__":
+ if loop_pass == loop_total - 1:
+ return 1
+ else:
+ return 0
+ elif var == "__INNER__":
+ # If this is neither the first nor the last pass.
+ if loop_pass != 0 and loop_pass != loop_total - 1:
+ return 1
+ else:
+ return 0
+ elif var == "__PASS__":
+ # Magic variable __PASS__ counts passes from one.
+ return loop_pass + 1
+ elif var == "__PASSTOTAL__":
+ return loop_total
+ elif var == "__ODD__":
+ # Internally pass numbers stored in loop_pass are counted from
+ # zero. But the template language presents them counted from one.
+ # Therefore we must add one to the actual loop_pass value to get
+ # the value we present to the user.
+ if (loop_pass + 1) % 2 != 0:
+ return 1
+ else:
+ return 0
+ elif var.startswith("__EVERY__"):
+ # Magic variable __EVERY__x is never true in first or last pass.
+ if loop_pass != 0 and loop_pass != loop_total - 1:
+ # Check if an integer follows the variable name.
+ try:
+ every = int(var[9:]) # nine is length of "__EVERY__"
+ except ValueError:
+ raise TemplateError, "Magic variable __EVERY__x: "\
+ "Invalid pass number."
+ else:
+ if not every:
+ raise TemplateError, "Magic variable __EVERY__x: "\
+ "Pass number cannot be zero."
+ elif (loop_pass + 1) % every == 0:
+ self.DEB("MAGIC: EVERY: " + str(every))
+ return 1
+ else:
+ return 0
+ else:
+ return 0
+ else:
+ raise TemplateError, "Invalid magic variable '%s'." % var
+
+ def escape(self, str, override=""):
+ """ Escape a string either by HTML escaping or by URL escaping.
+ @hidden
+ """
+ ESCAPE_QUOTES = 1
+ if (self._html_escape and override != "NONE" and override != "0" and \
+ override != "URL") or override == "HTML" or override == "1":
+ return cgi.escape(str, ESCAPE_QUOTES)
+ elif override == "URL":
+ return urllib.quote_plus(str)
+ else:
+ return str
+
+ def is_ordinary_var(self, var):
+ """ Return true if var is a scalar. (not a reference to loop)
+ @hidden
+ """
+ if type(var) == StringType or type(var) == IntType or \
+ type(var) == LongType or type(var) == FloatType:
+ return 1
+ else:
+ return 0
+
+
+##############################################
+# CLASS: TemplateCompiler #
+##############################################
+
+class TemplateCompiler:
+ """ Preprocess, parse, tokenize and compile the template.
+
+ This class parses the template and produces a 'compiled' form
+ of it. This compiled form is an instance of the <em>Template</em>
+ class. The compiled form is used as input for the TemplateProcessor
+ which uses it to actually process the template.
+
+ This class should be used direcly only when you need to compile
+ a template from a string. If your template is in a file, then you
+ should use the <em>TemplateManager</em> class which provides
+ a higher level interface to this class and also can save the
+ compiled template to disk in a precompiled form.
+ """
+
+ def __init__(self, include=1, max_include=5, comments=1, gettext=0,
+ debug=0):
+ """ Constructor.
+
+ @header __init__(include=1, max_include=5, comments=1, gettext=0,
+ debug=0)
+
+ @param include Enable or disable included templates.
+ @param max_include Maximum depth of nested inclusions.
+ @param comments Enable or disable template comments.
+ @param gettext Enable or disable gettext support.
+ @param debug Enable or disable debugging messages.
+ """
+
+ self._include = include
+ self._max_include = max_include
+ self._comments = comments
+ self._gettext = gettext
+ self._debug = debug
+
+ # This is a list of filenames of all included templates.
+ # It's modified by the include_templates() method.
+ self._include_files = []
+
+ # This is a counter of current inclusion depth. It's used to prevent
+ # infinite recursive includes.
+ self._include_level = 0
+
+ def compile(self, file):
+ """ Compile template from a file.
+
+ @header compile(file)
+ @return Compiled template.
+ The return value is an instance of the <em>Template</em>
+ class.
+
+ @param file Filename of the template.
+ See the <em>prepare()</em> method of the <em>TemplateManager</em>
+ class for exaplanation of this parameter.
+ """
+
+ self.DEB("COMPILING FROM FILE: " + file)
+ self._include_path = os.path.join(os.path.dirname(file), INCLUDE_DIR)
+ tokens = self.parse(self.read(file))
+ compile_params = (self._include, self._max_include, self._comments,
+ self._gettext)
+ return Template(__version__, file, self._include_files,
+ tokens, compile_params, self._debug)
+
+ def compile_string(self, data):
+ """ Compile template from a string.
+
+ This method compiles a template from a string. The
+ template cannot include any templates.
+ <strong>TMPL_INCLUDE</strong> statements are turned into warnings.
+
+ @header compile_string(data)
+ @return Compiled template.
+ The return value is an instance of the <em>Template</em>
+ class.
+
+ @param data String containing the template data.
+ """
+ self.DEB("COMPILING FROM STRING")
+ self._include = 0
+ tokens = self.parse(data)
+ compile_params = (self._include, self._max_include, self._comments,
+ self._gettext)
+ return Template(__version__, None, None, tokens, compile_params,
+ self._debug)
+
+ ##############################################
+ # PRIVATE METHODS #
+ ##############################################
+
+ def DEB(self, str):
+ """ Print debugging message to stderr if debugging is enabled.
+ @hidden
+ """
+ if self._debug: print >> sys.stderr, str
+
+ def read(self, filename):
+ """ Read content of file and return it. Raise an error if a problem
+ occurs.
+ @hidden
+ """
+ self.DEB("READING: " + filename)
+ try:
+ f = None
+ try:
+ f = open(filename, "r")
+ data = f.read()
+ except IOError, (errno, errstr):
+ raise TemplateError, "IO error while reading template '%s': "\
+ "(%d) %s" % (filename, errno, errstr)
+ else:
+ return data
+ finally:
+ if f: f.close()
+
+ def parse(self, template_data):
+ """ Parse the template. This method is recursively called from
+ within the include_templates() method.
+
+ @return List of processing tokens.
+ @hidden
+ """
+ if self._comments:
+ self.DEB("PREPROCESS: COMMENTS")
+ template_data = self.remove_comments(template_data)
+ tokens = self.tokenize(template_data)
+ if self._include:
+ self.DEB("PREPROCESS: INCLUDES")
+ self.include_templates(tokens)
+ return tokens
+
+ def remove_comments(self, template_data):
+ """ Remove comments from the template data.
+ @hidden
+ """
+ pattern = r"### .*"
+ return re.sub(pattern, "", template_data)
+
+ def include_templates(self, tokens):
+ """ Process TMPL_INCLUDE statements. Use the include_level counter
+ to prevent infinite recursion. Record paths to all included
+ templates to self._include_files.
+ @hidden
+ """
+ i = 0
+ out = "" # buffer for output
+ skip_params = 0
+
+ # Process the list of tokens.
+ while 1:
+ if i == len(tokens): break
+ if skip_params:
+ skip_params = 0
+ i += PARAMS_NUMBER
+ continue
+
+ token = tokens[i]
+ if token == "<TMPL_INCLUDE":
+ filename = tokens[i + PARAM_NAME]
+ if not filename:
+ raise TemplateError, "No filename in <TMPL_INCLUDE>."
+ self._include_level += 1
+ if self._include_level > self._max_include:
+ # Do not include the template.
+ # Protection against infinite recursive includes.
+ skip_params = 1
+ self.DEB("INCLUDE: LIMIT REACHED: " + filename)
+ else:
+ # Include the template.
+ skip_params = 0
+ include_file = os.path.join(self._include_path, filename)
+ self._include_files.append(include_file)
+ include_data = self.read(include_file)
+ include_tokens = self.parse(include_data)
+
+ # Append the tokens from the included template to actual
+ # position in the tokens list, replacing the TMPL_INCLUDE
+ # token and its parameters.
+ tokens[i:i+PARAMS_NUMBER+1] = include_tokens
+ i = i + len(include_tokens)
+ self.DEB("INCLUDED: " + filename)
+ continue # Do not increment 'i' below.
+ i += 1
+ # end of the main while loop
+
+ if self._include_level > 0: self._include_level -= 1
+ return out
+
+ def tokenize(self, template_data):
+ """ Split the template into tokens separated by template statements.
+ The statements itself and associated parameters are also
+ separately included in the resulting list of tokens.
+ Return list of the tokens.
+
+ @hidden
+ """
+ self.DEB("TOKENIZING TEMPLATE")
+ # NOTE: The TWO double quotes in character class in the regexp below
+ # are there only to prevent confusion of syntax highlighter in Emacs.
+ pattern = r"""
+ (?:^[ \t]+)? # eat spaces, tabs (opt.)
+ (<
+ (?:!--[ ])? # comment start + space (opt.)
+ /?TMPL_[A-Z]+ # closing slash / (opt.) + statement
+ [ a-zA-Z0-9""/.=:_\\-]* # this spans also comments ending (--)
+ >)
+ [%s]? # eat trailing newline (opt.)
+ """ % os.linesep
+ rc = re.compile(pattern, re.VERBOSE | re.MULTILINE)
+ split = rc.split(template_data)
+ tokens = []
+ for statement in split:
+ if statement.startswith("<TMPL_") or \
+ statement.startswith("</TMPL_") or \
+ statement.startswith("<!-- TMPL_") or \
+ statement.startswith("<!-- /TMPL_"):
+ # Processing statement.
+ statement = self.strip_brackets(statement)
+ params = re.split(r"\s+", statement)
+ tokens.append(self.find_directive(params))
+ tokens.append(self.find_name(params))
+ tokens.append(self.find_param("ESCAPE", params))
+ tokens.append(self.find_param("GLOBAL", params))
+ else:
+ # "Normal" template data.
+ if self._gettext:
+ self.DEB("PARSING GETTEXT STRINGS")
+ self.gettext_tokens(tokens, statement)
+ else:
+ tokens.append(statement)
+ return tokens
+
+ def gettext_tokens(self, tokens, str):
+ """ Find gettext strings and return appropriate array of
+ processing tokens.
+ @hidden
+ """
+ escaped = 0
+ gt_mode = 0
+ i = 0
+ buf = ""
+ while(1):
+ if i == len(str): break
+ if str[i] == "\\":
+ escaped = 0
+ if str[i+1] == "\\":
+ buf += "\\"
+ i += 2
+ continue
+ elif str[i+1] == "[" or str[i+1] == "]":
+ escaped = 1
+ else:
+ buf += "\\"
+ elif str[i] == "[" and str[i+1] == "[":
+ if gt_mode:
+ if escaped:
+ escaped = 0
+ buf += "["
+ else:
+ buf += "["
+ else:
+ if escaped:
+ escaped = 0
+ buf += "["
+ else:
+ tokens.append(buf)
+ buf = ""
+ gt_mode = 1
+ i += 2
+ continue
+ elif str[i] == "]" and str[i+1] == "]":
+ if gt_mode:
+ if escaped:
+ escaped = 0
+ buf += "]"
+ else:
+ self.add_gettext_token(tokens, buf)
+ buf = ""
+ gt_mode = 0
+ i += 2
+ continue
+ else:
+ if escaped:
+ escaped = 0
+ buf += "]"
+ else:
+ buf += "]"
+ else:
+ escaped = 0
+ buf += str[i]
+ i += 1
+ # end of the loop
+
+ if buf:
+ tokens.append(buf)
+
+ def add_gettext_token(self, tokens, str):
+ """ Append a gettext token and gettext string to the tokens array.
+ @hidden
+ """
+ self.DEB("GETTEXT PARSER: TOKEN: " + str)
+ tokens.append("<TMPL_GETTEXT")
+ tokens.append(str)
+ tokens.append(None)
+ tokens.append(None)
+
+ def strip_brackets(self, statement):
+ """ Strip HTML brackets (with optional HTML comments) from the
+ beggining and from the end of a statement.
+ @hidden
+ """
+ if statement.startswith("<!-- TMPL_") or \
+ statement.startswith("<!-- /TMPL_"):
+ return statement[5:-4]
+ else:
+ return statement[1:-1]
+
+ def find_directive(self, params):
+ """ Extract processing directive (TMPL_*) from a statement.
+ @hidden
+ """
+ directive = params[0]
+ del params[0]
+ self.DEB("TOKENIZER: DIRECTIVE: " + directive)
+ return "<" + directive
+
+ def find_name(self, params):
+ """ Extract identifier from a statement. The identifier can be
+ specified both implicitely or explicitely as a 'NAME' parameter.
+ @hidden
+ """
+ if len(params) > 0 and '=' not in params[0]:
+ # implicit identifier
+ name = params[0]
+ del params[0]
+ else:
+ # explicit identifier as a 'NAME' parameter
+ name = self.find_param("NAME", params)
+ self.DEB("TOKENIZER: NAME: " + str(name))
+ return name
+
+ def find_param(self, param, params):
+ """ Extract value of parameter from a statement.
+ @hidden
+ """
+ for pair in params:
+ name, value = pair.split("=")
+ if not name or not value:
+ raise TemplateError, "Syntax error in template."
+ if name == param:
+ if value[0] == '"':
+ # The value is in double quotes.
+ ret_value = value[1:-1]
+ else:
+ # The value is without double quotes.
+ ret_value = value
+ self.DEB("TOKENIZER: PARAM: '%s' => '%s'" % (param, ret_value))
+ return ret_value
+ else:
+ self.DEB("TOKENIZER: PARAM: '%s' => NOT DEFINED" % param)
+ return None
+
+
+##############################################
+# CLASS: Template #
+##############################################
+
+class Template:
+ """ This class represents a compiled template.
+
+ This class provides storage and methods for the compiled template
+ and associated metadata. It's serialized by pickle if we need to
+ save the compiled template to disk in a precompiled form.
+
+ You should never instantiate this class directly. Always use the
+ <em>TemplateManager</em> or <em>TemplateCompiler</em> classes to
+ create the instances of this class.
+
+ The only method which you can directly use is the <em>is_uptodate</em>
+ method.
+ """
+
+ def __init__(self, version, file, include_files, tokens, compile_params,
+ debug=0):
+ """ Constructor.
+ @hidden
+ """
+ self._version = version
+ self._file = file
+ self._tokens = tokens
+ self._compile_params = compile_params
+ self._debug = debug
+ self._mtime = None
+ self._include_mtimes = {}
+
+ if not file:
+ self.DEB("TEMPLATE WAS COMPILED FROM A STRING")
+ return
+
+ # Save modifitcation time of the main template file.
+ if os.path.isfile(file):
+ self._mtime = os.path.getmtime(file)
+ else:
+ raise TemplateError, "Template: file does not exist: '%s'" % file
+
+ # Save modificaton times of all included template files.
+ for inc_file in include_files:
+ if os.path.isfile(inc_file):
+ self._include_mtimes[inc_file] = os.path.getmtime(inc_file)
+ else:
+ raise TemplateError, "Template: file does not exist: '%s'"\
+ % inc_file
+
+ self.DEB("NEW TEMPLATE CREATED")
+
+ def is_uptodate(self, compile_params=None):
+ """ Check whether the compiled template is uptodate.
+
+ Return true if this compiled template is uptodate.
+ Return false, if the template source file was changed on the
+ disk since it was compiled.
+ Works by comparison of modification times.
+ Also takes modification times of all included templates
+ into account.
+
+ @header is_uptodate(compile_params=None)
+ @return True if the template is uptodate, false otherwise.
+
+ @param compile_params Only for internal use.
+ Do not use this optional parameter. It's intended only for
+ internal use by the <em>TemplateManager</em>.
+ """
+ if not self._file:
+ self.DEB("TEMPLATE COMPILED FROM A STRING")
+ return 0
+
+ if self._version != __version__:
+ self.DEB("TEMPLATE: VERSION NOT UPTODATE")
+ return 0
+
+ if compile_params != None and compile_params != self._compile_params:
+ self.DEB("TEMPLATE: DIFFERENT COMPILATION PARAMS")
+ return 0
+
+ # Check modification times of the main template and all included
+ # templates. If the included template no longer exists, then
+ # the problem will be resolved when the template is recompiled.
+
+ # Main template file.
+ if not (os.path.isfile(self._file) and \
+ self._mtime == os.path.getmtime(self._file)):
+ self.DEB("TEMPLATE: NOT UPTODATE: " + self._file)
+ return 0
+
+ # Included templates.
+ for inc_file in self._include_mtimes.keys():
+ if not (os.path.isfile(inc_file) and \
+ self._include_mtimes[inc_file] == \
+ os.path.getmtime(inc_file)):
+ self.DEB("TEMPLATE: NOT UPTODATE: " + inc_file)
+ return 0
+ else:
+ self.DEB("TEMPLATE: UPTODATE")
+ return 1
+
+ def tokens(self):
+ """ Get tokens of this template.
+ @hidden
+ """
+ return self._tokens
+
+ def file(self):
+ """ Get filename of the main file of this template.
+ @hidden
+ """
+ return self._file
+
+ def debug(self, debug):
+ """ Get debugging state.
+ @hidden
+ """
+ self._debug = debug
+
+ ##############################################
+ # PRIVATE METHODS #
+ ##############################################
+
+ def __getstate__(self):
+ """ Used by pickle when the class is serialized.
+ Remove the 'debug' attribute before serialization.
+ @hidden
+ """
+ dict = copy.copy(self.__dict__)
+ del dict["_debug"]
+ return dict
+
+ def __setstate__(self, dict):
+ """ Used by pickle when the class is unserialized.
+ Add the 'debug' attribute.
+ @hidden
+ """
+ dict["_debug"] = 0
+ self.__dict__ = dict
+
+
+ def DEB(self, str):
+ """ Print debugging message to stderr.
+ @hidden
+ """
+ if self._debug: print >> sys.stderr, str
+
+
+##############################################
+# EXCEPTIONS #
+##############################################
+
+class TemplateError(Exception):
+ """ Fatal exception. Raised on runtime or template syntax errors.
+
+ This exception is raised when a runtime error occurs or when a syntax
+ error in the template is found. It has one parameter which always
+ is a string containing a description of the error.
+
+ All potential IOError exceptions are handled by the module and are
+ converted to TemplateError exceptions. That means you should catch the
+ TemplateError exception if there is a possibility that for example
+ the template file will not be accesssible.
+
+ The exception can be raised by constructors or by any method of any
+ class.
+
+ The instance is no longer usable when this exception is raised.
+ """
+
+ def __init__(self, error):
+ """ Constructor.
+ @hidden
+ """
+ Exception.__init__(self, "Htmltmpl error: " + error)
+
+
+class PrecompiledError(Exception):
+ """ This exception is _PRIVATE_ and non fatal.
+ @hidden
+ """
+
+ def __init__(self, template):
+ """ Constructor.
+ @hidden
+ """
+ Exception.__init__(self, template)
+
Deleted: trunk/lib/venus/planet/vendor/httplib2/__init__.py
===================================================================
--- branches/sucs-site/lib/venus/planet/vendor/httplib2/__init__.py 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/lib/venus/planet/vendor/httplib2/__init__.py 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,917 +0,0 @@
-from __future__ import generators
-"""
-httplib2
-
-A caching http interface that supports ETags and gzip
-to conserve bandwidth.
-
-Requires Python 2.3 or later
-
-"""
-
-__author__ = "Joe Gregorio (joe at bitworking.org)"
-__copyright__ = "Copyright 2006, Joe Gregorio"
-__contributors__ = ["Thomas Broyer (t.broyer at ltgt.net)",
- "James Antill",
- "Xavier Verges Farrero",
- "Jonathan Feinberg",
- "Blair Zajac",
- "Sam Ruby",
- "Louis Nyffenegger"]
-__license__ = "MIT"
-__version__ = "$Rev: 227 $"
-
-import re
-import sys
-import md5
-import email
-import email.Utils
-import email.Message
-import StringIO
-import gzip
-import zlib
-import httplib
-import urlparse
-import base64
-import os
-import copy
-import calendar
-import time
-import random
-import sha
-import hmac
-from gettext import gettext as _
-from socket import gaierror
-
-if sys.version_info >= (2,3):
- from iri2uri import iri2uri
-else:
- def iri2uri(uri):
- return uri
-
-__all__ = ['Http', 'Response', 'HttpLib2Error',
- 'RedirectMissingLocation', 'RedirectLimit', 'FailedToDecompressContent',
- 'UnimplementedDigestAuthOptionError', 'UnimplementedHmacDigestAuthOptionError',
- 'debuglevel']
-
-
-# The httplib debug level, set to a non-zero value to get debug output
-debuglevel = 0
-
-# Python 2.3 support
-if sys.version_info < (2,4):
- def sorted(seq):
- seq.sort()
- return seq
-
-# Python 2.3 support
-def HTTPResponse__getheaders(self):
- """Return list of (header, value) tuples."""
- if self.msg is None:
- raise httplib.ResponseNotReady()
- return self.msg.items()
-
-if not hasattr(httplib.HTTPResponse, 'getheaders'):
- httplib.HTTPResponse.getheaders = HTTPResponse__getheaders
-
-# All exceptions raised here derive from HttpLib2Error
-class HttpLib2Error(Exception): pass
-
-class RedirectMissingLocation(HttpLib2Error): pass
-class RedirectLimit(HttpLib2Error): pass
-class FailedToDecompressContent(HttpLib2Error): pass
-class UnimplementedDigestAuthOptionError(HttpLib2Error): pass
-class UnimplementedHmacDigestAuthOptionError(HttpLib2Error): pass
-class RelativeURIError(HttpLib2Error): pass
-class ServerNotFoundError(HttpLib2Error): pass
-
-# Open Items:
-# -----------
-# Proxy support
-
-# Are we removing the cached content too soon on PUT (only delete on 200 Maybe?)
-
-# Pluggable cache storage (supports storing the cache in
-# flat files by default. We need a plug-in architecture
-# that can support Berkeley DB and Squid)
-
-# == Known Issues ==
-# Does not handle a resource that uses conneg and Last-Modified but no ETag as a cache validator.
-# Does not handle Cache-Control: max-stale
-# Does not use Age: headers when calculating cache freshness.
-
-
-# The number of redirections to follow before giving up.
-# Note that only GET redirects are automatically followed.
-# Will also honor 301 requests by saving that info and never
-# requesting that URI again.
-DEFAULT_MAX_REDIRECTS = 5
-
-# Which headers are hop-by-hop headers by default
-HOP_BY_HOP = ['connection', 'keep-alive', 'proxy-authenticate', 'proxy-authorization', 'te', 'trailers', 'transfer-encoding', 'upgrade']
-
-def _get_end2end_headers(response):
- hopbyhop = list(HOP_BY_HOP)
- hopbyhop.extend([x.strip() for x in response.get('connection', '').split(',')])
- return [header for header in response.keys() if header not in hopbyhop]
-
-URI = re.compile(r"^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?")
-
-def parse_uri(uri):
- """Parses a URI using the regex given in Appendix B of RFC 3986.
-
- (scheme, authority, path, query, fragment) = parse_uri(uri)
- """
- groups = URI.match(uri).groups()
- return (groups[1], groups[3], groups[4], groups[6], groups[8])
-
-def urlnorm(uri):
- (scheme, authority, path, query, fragment) = parse_uri(uri)
- if not scheme or not authority:
- raise RelativeURIError("Only absolute URIs are allowed. uri = %s" % uri)
- authority = authority.lower()
- scheme = scheme.lower()
- if not path:
- path = "/"
- # Could do syntax based normalization of the URI before
- # computing the digest. See Section 6.2.2 of Std 66.
- request_uri = query and "?".join([path, query]) or path
- scheme = scheme.lower()
- defrag_uri = scheme + "://" + authority + request_uri
- return scheme, authority, request_uri, defrag_uri
-
-
-# Cache filename construction (original borrowed from Venus http://intertwingly.net/code/venus/)
-re_url_scheme = re.compile(r'^\w+://')
-re_slash = re.compile(r'[?/:|]+')
-
-def safename(filename):
- """Return a filename suitable for the cache.
-
- Strips dangerous and common characters to create a filename we
- can use to store the cache in.
- """
-
- try:
- if re_url_scheme.match(filename):
- if isinstance(filename,str):
- filename = filename.decode('utf-8')
- filename = filename.encode('idna')
- else:
- filename = filename.encode('idna')
- except:
- pass
- if isinstance(filename,unicode):
- filename=filename.encode('utf-8')
- filemd5 = md5.new(filename).hexdigest()
- filename = re_url_scheme.sub("", filename)
- filename = re_slash.sub(",", filename)
-
- # limit length of filename
- if len(filename)>200:
- filename=filename[:200]
- return ",".join((filename, filemd5))
-
-NORMALIZE_SPACE = re.compile(r'(?:\r\n)?[ \t]+')
-def _normalize_headers(headers):
- return dict([ (key.lower(), NORMALIZE_SPACE.sub(value, ' ').strip()) for (key, value) in headers.iteritems()])
-
-def _parse_cache_control(headers):
- retval = {}
- if headers.has_key('cache-control'):
- parts = headers['cache-control'].split(',')
- parts_with_args = [tuple([x.strip() for x in part.split("=")]) for part in parts if -1 != part.find("=")]
- parts_wo_args = [(name.strip(), 1) for name in parts if -1 == name.find("=")]
- retval = dict(parts_with_args + parts_wo_args)
- return retval
-
-# Whether to use a strict mode to parse WWW-Authenticate headers
-# Might lead to bad results in case of ill-formed header value,
-# so disabled by default, falling back to relaxed parsing.
-# Set to true to turn on, usefull for testing servers.
-USE_WWW_AUTH_STRICT_PARSING = 0
-
-# In regex below:
-# [^\0-\x1f\x7f-\xff()<>@,;:\\\"/[\]?={} \t]+ matches a "token" as defined by HTTP
-# "(?:[^\0-\x08\x0A-\x1f\x7f-\xff\\\"]|\\[\0-\x7f])*?" matches a "quoted-string" as defined by HTTP, when LWS have already been replaced by a single space
-# Actually, as an auth-param value can be either a token or a quoted-string, they are combined in a single pattern which matches both:
-# \"?((?<=\")(?:[^\0-\x1f\x7f-\xff\\\"]|\\[\0-\x7f])*?(?=\")|(?<!\")[^\0-\x08\x0A-\x1f\x7f-\xff()<>@,;:\\\"/[\]?={} \t]+(?!\"))\"?
-WWW_AUTH_STRICT = re.compile(r"^(?:\s*(?:,\s*)?([^\0-\x1f\x7f-\xff()<>@,;:\\\"/[\]?={} \t]+)\s*=\s*\"?((?<=\")(?:[^\0-\x08\x0A-\x1f\x7f-\xff\\\"]|\\[\0-\x7f])*?(?=\")|(?<!\")[^\0-\x1f\x7f-\xff()<>@,;:\\\"/[\]?={} \t]+(?!\"))\"?)(.*)$")
-WWW_AUTH_RELAXED = re.compile(r"^(?:\s*(?:,\s*)?([^ \t\r\n=]+)\s*=\s*\"?((?<=\")(?:[^\\\"]|\\.)*?(?=\")|(?<!\")[^ \t\r\n,]+(?!\"))\"?)(.*)$")
-UNQUOTE_PAIRS = re.compile(r'\\(.)')
-def _parse_www_authenticate(headers, headername='www-authenticate'):
- """Returns a dictionary of dictionaries, one dict
- per auth_scheme."""
- retval = {}
- if headers.has_key(headername):
- authenticate = headers[headername].strip()
- www_auth = USE_WWW_AUTH_STRICT_PARSING and WWW_AUTH_STRICT or WWW_AUTH_RELAXED
- while authenticate:
- # Break off the scheme at the beginning of the line
- if headername == 'authentication-info':
- (auth_scheme, the_rest) = ('digest', authenticate)
- else:
- (auth_scheme, the_rest) = authenticate.split(" ", 1)
- # Now loop over all the key value pairs that come after the scheme,
- # being careful not to roll into the next scheme
- match = www_auth.search(the_rest)
- auth_params = {}
- while match:
- if match and len(match.groups()) == 3:
- (key, value, the_rest) = match.groups()
- auth_params[key.lower()] = UNQUOTE_PAIRS.sub(r'\1', value) # '\\'.join([x.replace('\\', '') for x in value.split('\\\\')])
- match = www_auth.search(the_rest)
- retval[auth_scheme.lower()] = auth_params
- authenticate = the_rest.strip()
- return retval
-
-
-def _entry_disposition(response_headers, request_headers):
- """Determine freshness from the Date, Expires and Cache-Control headers.
-
- We don't handle the following:
-
- 1. Cache-Control: max-stale
- 2. Age: headers are not used in the calculations.
-
- Not that this algorithm is simpler than you might think
- because we are operating as a private (non-shared) cache.
- This lets us ignore 's-maxage'. We can also ignore
- 'proxy-invalidate' since we aren't a proxy.
- We will never return a stale document as
- fresh as a design decision, and thus the non-implementation
- of 'max-stale'. This also lets us safely ignore 'must-revalidate'
- since we operate as if every server has sent 'must-revalidate'.
- Since we are private we get to ignore both 'public' and
- 'private' parameters. We also ignore 'no-transform' since
- we don't do any transformations.
- The 'no-store' parameter is handled at a higher level.
- So the only Cache-Control parameters we look at are:
-
- no-cache
- only-if-cached
- max-age
- min-fresh
- """
-
- retval = "STALE"
- cc = _parse_cache_control(request_headers)
- cc_response = _parse_cache_control(response_headers)
-
- if request_headers.has_key('pragma') and request_headers['pragma'].lower().find('no-cache') != -1:
- retval = "TRANSPARENT"
- if 'cache-control' not in request_headers:
- request_headers['cache-control'] = 'no-cache'
- elif cc.has_key('no-cache'):
- retval = "TRANSPARENT"
- elif cc_response.has_key('no-cache'):
- retval = "STALE"
- elif cc.has_key('only-if-cached'):
- retval = "FRESH"
- elif response_headers.has_key('date'):
- date = calendar.timegm(email.Utils.parsedate_tz(response_headers['date']))
- now = time.time()
- current_age = max(0, now - date)
- if cc_response.has_key('max-age'):
- try:
- freshness_lifetime = int(cc_response['max-age'])
- except:
- freshness_lifetime = 0
- elif response_headers.has_key('expires'):
- expires = email.Utils.parsedate_tz(response_headers['expires'])
- freshness_lifetime = max(0, calendar.timegm(expires) - date)
- else:
- freshness_lifetime = 0
- if cc.has_key('max-age'):
- try:
- freshness_lifetime = int(cc['max-age'])
- except:
- freshness_lifetime = 0
- if cc.has_key('min-fresh'):
- try:
- min_fresh = int(cc['min-fresh'])
- except:
- min_fresh = 0
- current_age += min_fresh
- if freshness_lifetime > current_age:
- retval = "FRESH"
- return retval
-
-def _decompressContent(response, new_content):
- content = new_content
- try:
- encoding = response.get('content-encoding', None)
- if encoding in ['gzip', 'deflate']:
- if encoding == 'gzip':
- content = gzip.GzipFile(fileobj=StringIO.StringIO(new_content)).read()
- if encoding == 'deflate':
- content = zlib.decompress(content)
- response['content-length'] = str(len(content))
- del response['content-encoding']
- except:
- content = ""
- raise FailedToDecompressContent(_("Content purported to be compressed with %s but failed to decompress.") % response.get('content-encoding'))
- return content
-
-def _updateCache(request_headers, response_headers, content, cache, cachekey):
- if cachekey:
- cc = _parse_cache_control(request_headers)
- cc_response = _parse_cache_control(response_headers)
- if cc.has_key('no-store') or cc_response.has_key('no-store'):
- cache.delete(cachekey)
- else:
- info = email.Message.Message()
- for key, value in response_headers.iteritems():
- if key not in ['status','content-encoding','transfer-encoding']:
- info[key] = value
-
- status = response_headers.status
- if status == 304:
- status = 200
-
- status_header = 'status: %d\r\n' % response_headers.status
-
- header_str = info.as_string()
-
- header_str = re.sub("\r(?!\n)|(?<!\r)\n", "\r\n", header_str)
- text = "".join([status_header, header_str, content])
-
- cache.set(cachekey, text)
-
-def _cnonce():
- dig = md5.new("%s:%s" % (time.ctime(), ["0123456789"[random.randrange(0, 9)] for i in range(20)])).hexdigest()
- return dig[:16]
-
-def _wsse_username_token(cnonce, iso_now, password):
- return base64.encodestring(sha.new("%s%s%s" % (cnonce, iso_now, password)).digest()).strip()
-
-
-# For credentials we need two things, first
-# a pool of credential to try (not necesarily tied to BAsic, Digest, etc.)
-# Then we also need a list of URIs that have already demanded authentication
-# That list is tricky since sub-URIs can take the same auth, or the
-# auth scheme may change as you descend the tree.
-# So we also need each Auth instance to be able to tell us
-# how close to the 'top' it is.
-
-class Authentication:
- def __init__(self, credentials, host, request_uri, headers, response, content, http):
- (scheme, authority, path, query, fragment) = parse_uri(request_uri)
- self.path = path
- self.host = host
- self.credentials = credentials
- self.http = http
-
- def depth(self, request_uri):
- (scheme, authority, path, query, fragment) = parse_uri(request_uri)
- return request_uri[len(self.path):].count("/")
-
- def inscope(self, host, request_uri):
- # XXX Should we normalize the request_uri?
- (scheme, authority, path, query, fragment) = parse_uri(request_uri)
- return (host == self.host) and path.startswith(self.path)
-
- def request(self, method, request_uri, headers, content):
- """Modify the request headers to add the appropriate
- Authorization header. Over-rise this in sub-classes."""
- pass
-
- def response(self, response, content):
- """Gives us a chance to update with new nonces
- or such returned from the last authorized response.
- Over-rise this in sub-classes if necessary.
-
- Return TRUE is the request is to be retried, for
- example Digest may return stale=true.
- """
- return False
-
-
-
-class BasicAuthentication(Authentication):
- def __init__(self, credentials, host, request_uri, headers, response, content, http):
- Authentication.__init__(self, credentials, host, request_uri, headers, response, content, http)
-
- def request(self, method, request_uri, headers, content):
- """Modify the request headers to add the appropriate
- Authorization header."""
- headers['authorization'] = 'Basic ' + base64.encodestring("%s:%s" % self.credentials).strip()
-
-
-class DigestAuthentication(Authentication):
- """Only do qop='auth' and MD5, since that
- is all Apache currently implements"""
- def __init__(self, credentials, host, request_uri, headers, response, content, http):
- Authentication.__init__(self, credentials, host, request_uri, headers, response, content, http)
- challenge = _parse_www_authenticate(response, 'www-authenticate')
- self.challenge = challenge['digest']
- qop = self.challenge.get('qop')
- self.challenge['qop'] = ('auth' in [x.strip() for x in qop.split()]) and 'auth' or None
- if self.challenge['qop'] is None:
- raise UnimplementedDigestAuthOptionError( _("Unsupported value for qop: %s." % qop))
- self.challenge['algorithm'] = self.challenge.get('algorithm', 'MD5')
- if self.challenge['algorithm'] != 'MD5':
- raise UnimplementedDigestAuthOptionError( _("Unsupported value for algorithm: %s." % self.challenge['algorithm']))
- self.A1 = "".join([self.credentials[0], ":", self.challenge['realm'], ":", self.credentials[1]])
- self.challenge['nc'] = 1
-
- def request(self, method, request_uri, headers, content, cnonce = None):
- """Modify the request headers"""
- H = lambda x: md5.new(x).hexdigest()
- KD = lambda s, d: H("%s:%s" % (s, d))
- A2 = "".join([method, ":", request_uri])
- self.challenge['cnonce'] = cnonce or _cnonce()
- request_digest = '"%s"' % KD(H(self.A1), "%s:%s:%s:%s:%s" % (self.challenge['nonce'],
- '%08x' % self.challenge['nc'],
- self.challenge['cnonce'],
- self.challenge['qop'], H(A2)
- ))
- headers['Authorization'] = 'Digest username="%s", realm="%s", nonce="%s", uri="%s", algorithm=%s, response=%s, qop=%s, nc=%08x, cnonce="%s"' % (
- self.credentials[0],
- self.challenge['realm'],
- self.challenge['nonce'],
- request_uri,
- self.challenge['algorithm'],
- request_digest,
- self.challenge['qop'],
- self.challenge['nc'],
- self.challenge['cnonce'],
- )
- self.challenge['nc'] += 1
-
- def response(self, response, content):
- if not response.has_key('authentication-info'):
- challenge = _parse_www_authenticate(response, 'www-authenticate').get('digest', {})
- if 'true' == challenge.get('stale'):
- self.challenge['nonce'] = challenge['nonce']
- self.challenge['nc'] = 1
- return True
- else:
- updated_challenge = _parse_www_authenticate(response, 'authentication-info').get('digest', {})
-
- if updated_challenge.has_key('nextnonce'):
- self.challenge['nonce'] = updated_challenge['nextnonce']
- self.challenge['nc'] = 1
- return False
-
-
-class HmacDigestAuthentication(Authentication):
- """Adapted from Robert Sayre's code and DigestAuthentication above."""
- __author__ = "Thomas Broyer (t.broyer at ltgt.net)"
-
- def __init__(self, credentials, host, request_uri, headers, response, content, http):
- Authentication.__init__(self, credentials, host, request_uri, headers, response, content, http)
- challenge = _parse_www_authenticate(response, 'www-authenticate')
- self.challenge = challenge['hmacdigest']
- # TODO: self.challenge['domain']
- self.challenge['reason'] = self.challenge.get('reason', 'unauthorized')
- if self.challenge['reason'] not in ['unauthorized', 'integrity']:
- self.challenge['reason'] = 'unauthorized'
- self.challenge['salt'] = self.challenge.get('salt', '')
- if not self.challenge.get('snonce'):
- raise UnimplementedHmacDigestAuthOptionError( _("The challenge doesn't contain a server nonce, or this one is empty."))
- self.challenge['algorithm'] = self.challenge.get('algorithm', 'HMAC-SHA-1')
- if self.challenge['algorithm'] not in ['HMAC-SHA-1', 'HMAC-MD5']:
- raise UnimplementedHmacDigestAuthOptionError( _("Unsupported value for algorithm: %s." % self.challenge['algorithm']))
- self.challenge['pw-algorithm'] = self.challenge.get('pw-algorithm', 'SHA-1')
- if self.challenge['pw-algorithm'] not in ['SHA-1', 'MD5']:
- raise UnimplementedHmacDigestAuthOptionError( _("Unsupported value for pw-algorithm: %s." % self.challenge['pw-algorithm']))
- if self.challenge['algorithm'] == 'HMAC-MD5':
- self.hashmod = md5
- else:
- self.hashmod = sha
- if self.challenge['pw-algorithm'] == 'MD5':
- self.pwhashmod = md5
- else:
- self.pwhashmod = sha
- self.key = "".join([self.credentials[0], ":",
- self.pwhashmod.new("".join([self.credentials[1], self.challenge['salt']])).hexdigest().lower(),
- ":", self.challenge['realm']
- ])
- self.key = self.pwhashmod.new(self.key).hexdigest().lower()
-
- def request(self, method, request_uri, headers, content):
- """Modify the request headers"""
- keys = _get_end2end_headers(headers)
- keylist = "".join(["%s " % k for k in keys])
- headers_val = "".join([headers[k] for k in keys])
- created = time.strftime('%Y-%m-%dT%H:%M:%SZ',time.gmtime())
- cnonce = _cnonce()
- request_digest = "%s:%s:%s:%s:%s" % (method, request_uri, cnonce, self.challenge['snonce'], headers_val)
- request_digest = hmac.new(self.key, request_digest, self.hashmod).hexdigest().lower()
- headers['Authorization'] = 'HMACDigest username="%s", realm="%s", snonce="%s", cnonce="%s", uri="%s", created="%s", response="%s", headers="%s"' % (
- self.credentials[0],
- self.challenge['realm'],
- self.challenge['snonce'],
- cnonce,
- request_uri,
- created,
- request_digest,
- keylist,
- )
-
- def response(self, response, content):
- challenge = _parse_www_authenticate(response, 'www-authenticate').get('hmacdigest', {})
- if challenge.get('reason') in ['integrity', 'stale']:
- return True
- return False
-
-
-class WsseAuthentication(Authentication):
- """This is thinly tested and should not be relied upon.
- At this time there isn't any third party server to test against.
- Blogger and TypePad implemented this algorithm at one point
- but Blogger has since switched to Basic over HTTPS and
- TypePad has implemented it wrong, by never issuing a 401
- challenge but instead requiring your client to telepathically know that
- their endpoint is expecting WSSE profile="UsernameToken"."""
- def __init__(self, credentials, host, request_uri, headers, response, content, http):
- Authentication.__init__(self, credentials, host, request_uri, headers, response, content, http)
-
- def request(self, method, request_uri, headers, content):
- """Modify the request headers to add the appropriate
- Authorization header."""
- headers['Authorization'] = 'WSSE profile="UsernameToken"'
- iso_now = time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime())
- cnonce = _cnonce()
- password_digest = _wsse_username_token(cnonce, iso_now, self.credentials[1])
- headers['X-WSSE'] = 'UsernameToken Username="%s", PasswordDigest="%s", Nonce="%s", Created="%s"' % (
- self.credentials[0],
- password_digest,
- cnonce,
- iso_now)
-
-class GoogleLoginAuthentication(Authentication):
- def __init__(self, credentials, host, request_uri, headers, response, content, http):
- from urllib import urlencode
- Authentication.__init__(self, credentials, host, request_uri, headers, response, content, http)
-
- auth = dict(Email=credentials[0], Passwd=credentials[1], service='cl', source=headers['user-agent'])
- resp, content = self.http.request("https://www.google.com/accounts/ClientLogin", method="POST", body=urlencode(auth), headers={'Content-Type': 'application/x-www-form-urlencoded'})
- lines = content.split('\n')
- d = dict([tuple(line.split("=", 1)) for line in lines if line])
- if resp.status == 403:
- self.Auth = ""
- else:
- self.Auth = d['Auth']
-
- def request(self, method, request_uri, headers, content):
- """Modify the request headers to add the appropriate
- Authorization header."""
- headers['authorization'] = 'GoogleLogin Auth=' + self.Auth
-
-
-AUTH_SCHEME_CLASSES = {
- "basic": BasicAuthentication,
- "wsse": WsseAuthentication,
- "digest": DigestAuthentication,
- "hmacdigest": HmacDigestAuthentication,
- "googlelogin": GoogleLoginAuthentication
-}
-
-AUTH_SCHEME_ORDER = ["hmacdigest", "googlelogin", "digest", "wsse", "basic"]
-
-def _md5(s):
- return
-
-class FileCache:
- """Uses a local directory as a store for cached files.
- Not really safe to use if multiple threads or processes are going to
- be running on the same cache.
- """
- def __init__(self, cache, safe=safename): # use safe=lambda x: md5.new(x).hexdigest() for the old behavior
- self.cache = cache
- self.safe = safe
- if not os.path.exists(cache):
- os.makedirs(self.cache)
-
- def get(self, key):
- retval = None
- cacheFullPath = os.path.join(self.cache, self.safe(key))
- try:
- f = file(cacheFullPath, "r")
- retval = f.read()
- f.close()
- except:
- pass
- return retval
-
- def set(self, key, value):
- cacheFullPath = os.path.join(self.cache, self.safe(key))
- f = file(cacheFullPath, "w")
- f.write(value)
- f.close()
-
- def delete(self, key):
- cacheFullPath = os.path.join(self.cache, self.safe(key))
- if os.path.exists(cacheFullPath):
- os.remove(cacheFullPath)
-
-class Http:
- """An HTTP client that handles all
- methods, caching, ETags, compression,
- HTTPS, Basic, Digest, WSSE, etc.
- """
- def __init__(self, cache=None):
- # Map domain name to an httplib connection
- self.connections = {}
- # The location of the cache, for now a directory
- # where cached responses are held.
- if cache and isinstance(cache, str):
- self.cache = FileCache(cache)
- else:
- self.cache = cache
-
- # tuples of name, password
- self.credentials = []
-
- # authorization objects
- self.authorizations = []
-
- self.follow_all_redirects = False
-
- self.ignore_etag = False
-
- def _auth_from_challenge(self, host, request_uri, headers, response, content):
- """A generator that creates Authorization objects
- that can be applied to requests.
- """
- challenges = _parse_www_authenticate(response, 'www-authenticate')
- for cred in self.credentials:
- for scheme in AUTH_SCHEME_ORDER:
- if challenges.has_key(scheme):
- yield AUTH_SCHEME_CLASSES[scheme](cred, host, request_uri, headers, response, content, self)
-
- def add_credentials(self, name, password):
- """Add a name and password that will be used
- any time a request requires authentication."""
- self.credentials.append((name, password))
-
- def clear_credentials(self):
- """Remove all the names and passwords
- that are used for authentication"""
- self.credentials = []
- self.authorizations = []
-
- def _conn_request(self, conn, request_uri, method, body, headers):
- for i in range(2):
- try:
- conn.request(method, request_uri, body, headers)
- response = conn.getresponse()
- except gaierror:
- raise ServerNotFoundError("Unable to find the server at %s" % request_uri)
- except:
- if i == 0:
- conn.close()
- conn.connect()
- continue
- else:
- raise
- else:
- content = response.read()
- response = Response(response)
- content = _decompressContent(response, content)
-
- break;
- return (response, content)
-
-
- def _request(self, conn, host, absolute_uri, request_uri, method, body, headers, redirections, cachekey):
- """Do the actual request using the connection object
- and also follow one level of redirects if necessary"""
-
- auths = [(auth.depth(request_uri), auth) for auth in self.authorizations if auth.inscope(host, request_uri)]
- auth = auths and sorted(auths)[0][1] or None
- if auth:
- auth.request(method, request_uri, headers, body)
-
- (response, content) = self._conn_request(conn, request_uri, method, body, headers)
-
- if auth:
- if auth.response(response, body):
- auth.request(method, request_uri, headers, body)
- (response, content) = self._conn_request(conn, request_uri, method, body, headers )
- response._stale_digest = 1
-
- if response.status == 401:
- for authorization in self._auth_from_challenge(host, request_uri, headers, response, content):
- authorization.request(method, request_uri, headers, body)
- (response, content) = self._conn_request(conn, request_uri, method, body, headers, )
- if response.status != 401:
- self.authorizations.append(authorization)
- authorization.response(response, body)
- break
-
- if (self.follow_all_redirects or method in ["GET", "HEAD"]) or response.status == 303:
- if response.status in [300, 301, 302, 303, 307]:
- # Pick out the location header and basically start from the beginning
- # remembering first to strip the ETag header and decrement our 'depth'
- if redirections:
- if not response.has_key('location') and response.status != 300:
- raise RedirectMissingLocation( _("Redirected but the response is missing a Location: header."))
- # Fix-up relative redirects (which violate an RFC 2616 MUST)
- if response.has_key('location'):
- location = response['location']
- (scheme, authority, path, query, fragment) = parse_uri(location)
- if authority == None:
- response['location'] = urlparse.urljoin(absolute_uri, location)
- if response.status == 301 and method in ["GET", "HEAD"]:
- response['-x-permanent-redirect-url'] = response['location']
- if not response.has_key('content-location'):
- response['content-location'] = absolute_uri
- _updateCache(headers, response, content, self.cache, cachekey)
- if headers.has_key('if-none-match'):
- del headers['if-none-match']
- if headers.has_key('if-modified-since'):
- del headers['if-modified-since']
- if response.has_key('location'):
- location = response['location']
- old_response = copy.deepcopy(response)
- if not old_response.has_key('content-location'):
- old_response['content-location'] = absolute_uri
- redirect_method = ((response.status == 303) and (method not in ["GET", "HEAD"])) and "GET" or method
- (response, content) = self.request(location, redirect_method, body=body, headers = headers, redirections = redirections - 1)
- response.previous = old_response
- else:
- raise RedirectLimit( _("Redirected more times than rediection_limit allows."))
- elif response.status in [200, 203] and method == "GET":
- # Don't cache 206's since we aren't going to handle byte range requests
- if not response.has_key('content-location'):
- response['content-location'] = absolute_uri
- _updateCache(headers, response, content, self.cache, cachekey)
-
- return (response, content)
-
- def request(self, uri, method="GET", body=None, headers=None, redirections=DEFAULT_MAX_REDIRECTS):
- """ Performs a single HTTP request.
-The 'uri' is the URI of the HTTP resource and can begin
-with either 'http' or 'https'. The value of 'uri' must be an absolute URI.
-
-The 'method' is the HTTP method to perform, such as GET, POST, DELETE, etc.
-There is no restriction on the methods allowed.
-
-The 'body' is the entity body to be sent with the request. It is a string
-object.
-
-Any extra headers that are to be sent with the request should be provided in the
-'headers' dictionary.
-
-The maximum number of redirect to follow before raising an
-exception is 'redirections. The default is 5.
-
-The return value is a tuple of (response, content), the first
-being and instance of the 'Response' class, the second being
-a string that contains the response entity body.
- """
- if headers is None:
- headers = {}
- else:
- headers = _normalize_headers(headers)
-
- if not headers.has_key('user-agent'):
- headers['user-agent'] = "Python-httplib2/%s" % __version__
-
- uri = iri2uri(uri)
-
- (scheme, authority, request_uri, defrag_uri) = urlnorm(uri)
-
- if not self.connections.has_key(scheme+":"+authority):
- connection_type = (scheme == 'https') and httplib.HTTPSConnection or httplib.HTTPConnection
- conn = self.connections[scheme+":"+authority] = connection_type(authority)
- conn.set_debuglevel(debuglevel)
- else:
- conn = self.connections[scheme+":"+authority]
-
- if method in ["GET", "HEAD"] and 'range' not in headers:
- headers['accept-encoding'] = 'compress, gzip'
-
- info = email.Message.Message()
- cached_value = None
- if self.cache:
- cachekey = defrag_uri
- cached_value = self.cache.get(cachekey)
- if cached_value:
- try:
- info = email.message_from_string(cached_value)
- content = cached_value.split('\r\n\r\n', 1)[1]
- except Exception, e:
- self.cache.delete(cachekey)
- cachekey = None
- cached_value = None
- else:
- cachekey = None
-
- if method in ["PUT"] and self.cache and info.has_key('etag') and not self.ignore_etag and 'if-match' not in headers:
- # http://www.w3.org/1999/04/Editing/
- headers['if-match'] = info['etag']
-
- if method not in ["GET", "HEAD"] and self.cache and cachekey:
- # RFC 2616 Section 13.10
- self.cache.delete(cachekey)
-
- if cached_value and method in ["GET", "HEAD"] and self.cache and 'range' not in headers:
- if info.has_key('-x-permanent-redirect-url'):
- # Should cached permanent redirects be counted in our redirection count? For now, yes.
- (response, new_content) = self.request(info['-x-permanent-redirect-url'], "GET", headers = headers, redirections = redirections - 1)
- response.previous = Response(info)
- response.previous.fromcache = True
- else:
- # Determine our course of action:
- # Is the cached entry fresh or stale?
- # Has the client requested a non-cached response?
- #
- # There seems to be three possible answers:
- # 1. [FRESH] Return the cache entry w/o doing a GET
- # 2. [STALE] Do the GET (but add in cache validators if available)
- # 3. [TRANSPARENT] Do a GET w/o any cache validators (Cache-Control: no-cache) on the request
- entry_disposition = _entry_disposition(info, headers)
-
- if entry_disposition == "FRESH":
- if not cached_value:
- info['status'] = '504'
- content = ""
- response = Response(info)
- if cached_value:
- response.fromcache = True
- return (response, content)
-
- if entry_disposition == "STALE":
- if info.has_key('etag') and not self.ignore_etag and not 'if-none-match' in headers:
- headers['if-none-match'] = info['etag']
- if info.has_key('last-modified') and not 'last-modified' in headers:
- headers['if-modified-since'] = info['last-modified']
- elif entry_disposition == "TRANSPARENT":
- pass
-
- (response, new_content) = self._request(conn, authority, uri, request_uri, method, body, headers, redirections, cachekey)
-
- if response.status == 304 and method == "GET":
- # Rewrite the cache entry with the new end-to-end headers
- # Take all headers that are in response
- # and overwrite their values in info.
- # unless they are hop-by-hop, or are listed in the connection header.
-
- for key in _get_end2end_headers(response):
- info[key] = response[key]
- merged_response = Response(info)
- if hasattr(response, "_stale_digest"):
- merged_response._stale_digest = response._stale_digest
- try:
- _updateCache(headers, merged_response, content, self.cache, cachekey)
- except:
- print locals()
- raise
- response = merged_response
- response.status = 200
- response.fromcache = True
-
- elif response.status == 200:
- content = new_content
- else:
- self.cache.delete(cachekey)
- content = new_content
- else:
- (response, content) = self._request(conn, authority, uri, request_uri, method, body, headers, redirections, cachekey)
- return (response, content)
-
-
-
-class Response(dict):
- """An object more like email.Message than httplib.HTTPResponse."""
-
- """Is this response from our local cache"""
- fromcache = False
-
- """HTTP protocol version used by server. 10 for HTTP/1.0, 11 for HTTP/1.1. """
- version = 11
-
- "Status code returned by server. "
- status = 200
-
- """Reason phrase returned by server."""
- reason = "Ok"
-
- previous = None
-
- def __init__(self, info):
- # info is either an email.Message or
- # an httplib.HTTPResponse object.
- if isinstance(info, httplib.HTTPResponse):
- for key, value in info.getheaders():
- self[key] = value
- self.status = info.status
- self['status'] = str(self.status)
- self.reason = info.reason
- self.version = info.version
- elif isinstance(info, email.Message.Message):
- for key, value in info.items():
- self[key] = value
- self.status = int(self['status'])
-
- def __getattr__(self, name):
- if name == 'dict':
- return self
- else:
- raise AttributeError, name
-
-
Copied: trunk/lib/venus/planet/vendor/httplib2/__init__.py (from rev 656, branches/sucs-site/lib/venus/planet/vendor/httplib2/__init__.py)
===================================================================
--- trunk/lib/venus/planet/vendor/httplib2/__init__.py (rev 0)
+++ trunk/lib/venus/planet/vendor/httplib2/__init__.py 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,917 @@
+from __future__ import generators
+"""
+httplib2
+
+A caching http interface that supports ETags and gzip
+to conserve bandwidth.
+
+Requires Python 2.3 or later
+
+"""
+
+__author__ = "Joe Gregorio (joe at bitworking.org)"
+__copyright__ = "Copyright 2006, Joe Gregorio"
+__contributors__ = ["Thomas Broyer (t.broyer at ltgt.net)",
+ "James Antill",
+ "Xavier Verges Farrero",
+ "Jonathan Feinberg",
+ "Blair Zajac",
+ "Sam Ruby",
+ "Louis Nyffenegger"]
+__license__ = "MIT"
+__version__ = "$Rev: 227 $"
+
+import re
+import sys
+import md5
+import email
+import email.Utils
+import email.Message
+import StringIO
+import gzip
+import zlib
+import httplib
+import urlparse
+import base64
+import os
+import copy
+import calendar
+import time
+import random
+import sha
+import hmac
+from gettext import gettext as _
+from socket import gaierror
+
+if sys.version_info >= (2,3):
+ from iri2uri import iri2uri
+else:
+ def iri2uri(uri):
+ return uri
+
+__all__ = ['Http', 'Response', 'HttpLib2Error',
+ 'RedirectMissingLocation', 'RedirectLimit', 'FailedToDecompressContent',
+ 'UnimplementedDigestAuthOptionError', 'UnimplementedHmacDigestAuthOptionError',
+ 'debuglevel']
+
+
+# The httplib debug level, set to a non-zero value to get debug output
+debuglevel = 0
+
+# Python 2.3 support
+if sys.version_info < (2,4):
+ def sorted(seq):
+ seq.sort()
+ return seq
+
+# Python 2.3 support
+def HTTPResponse__getheaders(self):
+ """Return list of (header, value) tuples."""
+ if self.msg is None:
+ raise httplib.ResponseNotReady()
+ return self.msg.items()
+
+if not hasattr(httplib.HTTPResponse, 'getheaders'):
+ httplib.HTTPResponse.getheaders = HTTPResponse__getheaders
+
+# All exceptions raised here derive from HttpLib2Error
+class HttpLib2Error(Exception): pass
+
+class RedirectMissingLocation(HttpLib2Error): pass
+class RedirectLimit(HttpLib2Error): pass
+class FailedToDecompressContent(HttpLib2Error): pass
+class UnimplementedDigestAuthOptionError(HttpLib2Error): pass
+class UnimplementedHmacDigestAuthOptionError(HttpLib2Error): pass
+class RelativeURIError(HttpLib2Error): pass
+class ServerNotFoundError(HttpLib2Error): pass
+
+# Open Items:
+# -----------
+# Proxy support
+
+# Are we removing the cached content too soon on PUT (only delete on 200 Maybe?)
+
+# Pluggable cache storage (supports storing the cache in
+# flat files by default. We need a plug-in architecture
+# that can support Berkeley DB and Squid)
+
+# == Known Issues ==
+# Does not handle a resource that uses conneg and Last-Modified but no ETag as a cache validator.
+# Does not handle Cache-Control: max-stale
+# Does not use Age: headers when calculating cache freshness.
+
+
+# The number of redirections to follow before giving up.
+# Note that only GET redirects are automatically followed.
+# Will also honor 301 requests by saving that info and never
+# requesting that URI again.
+DEFAULT_MAX_REDIRECTS = 5
+
+# Which headers are hop-by-hop headers by default
+HOP_BY_HOP = ['connection', 'keep-alive', 'proxy-authenticate', 'proxy-authorization', 'te', 'trailers', 'transfer-encoding', 'upgrade']
+
+def _get_end2end_headers(response):
+ hopbyhop = list(HOP_BY_HOP)
+ hopbyhop.extend([x.strip() for x in response.get('connection', '').split(',')])
+ return [header for header in response.keys() if header not in hopbyhop]
+
+URI = re.compile(r"^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?")
+
+def parse_uri(uri):
+ """Parses a URI using the regex given in Appendix B of RFC 3986.
+
+ (scheme, authority, path, query, fragment) = parse_uri(uri)
+ """
+ groups = URI.match(uri).groups()
+ return (groups[1], groups[3], groups[4], groups[6], groups[8])
+
+def urlnorm(uri):
+ (scheme, authority, path, query, fragment) = parse_uri(uri)
+ if not scheme or not authority:
+ raise RelativeURIError("Only absolute URIs are allowed. uri = %s" % uri)
+ authority = authority.lower()
+ scheme = scheme.lower()
+ if not path:
+ path = "/"
+ # Could do syntax based normalization of the URI before
+ # computing the digest. See Section 6.2.2 of Std 66.
+ request_uri = query and "?".join([path, query]) or path
+ scheme = scheme.lower()
+ defrag_uri = scheme + "://" + authority + request_uri
+ return scheme, authority, request_uri, defrag_uri
+
+
+# Cache filename construction (original borrowed from Venus http://intertwingly.net/code/venus/)
+re_url_scheme = re.compile(r'^\w+://')
+re_slash = re.compile(r'[?/:|]+')
+
+def safename(filename):
+ """Return a filename suitable for the cache.
+
+ Strips dangerous and common characters to create a filename we
+ can use to store the cache in.
+ """
+
+ try:
+ if re_url_scheme.match(filename):
+ if isinstance(filename,str):
+ filename = filename.decode('utf-8')
+ filename = filename.encode('idna')
+ else:
+ filename = filename.encode('idna')
+ except:
+ pass
+ if isinstance(filename,unicode):
+ filename=filename.encode('utf-8')
+ filemd5 = md5.new(filename).hexdigest()
+ filename = re_url_scheme.sub("", filename)
+ filename = re_slash.sub(",", filename)
+
+ # limit length of filename
+ if len(filename)>200:
+ filename=filename[:200]
+ return ",".join((filename, filemd5))
+
+NORMALIZE_SPACE = re.compile(r'(?:\r\n)?[ \t]+')
+def _normalize_headers(headers):
+ return dict([ (key.lower(), NORMALIZE_SPACE.sub(value, ' ').strip()) for (key, value) in headers.iteritems()])
+
+def _parse_cache_control(headers):
+ retval = {}
+ if headers.has_key('cache-control'):
+ parts = headers['cache-control'].split(',')
+ parts_with_args = [tuple([x.strip() for x in part.split("=")]) for part in parts if -1 != part.find("=")]
+ parts_wo_args = [(name.strip(), 1) for name in parts if -1 == name.find("=")]
+ retval = dict(parts_with_args + parts_wo_args)
+ return retval
+
+# Whether to use a strict mode to parse WWW-Authenticate headers
+# Might lead to bad results in case of ill-formed header value,
+# so disabled by default, falling back to relaxed parsing.
+# Set to true to turn on, usefull for testing servers.
+USE_WWW_AUTH_STRICT_PARSING = 0
+
+# In regex below:
+# [^\0-\x1f\x7f-\xff()<>@,;:\\\"/[\]?={} \t]+ matches a "token" as defined by HTTP
+# "(?:[^\0-\x08\x0A-\x1f\x7f-\xff\\\"]|\\[\0-\x7f])*?" matches a "quoted-string" as defined by HTTP, when LWS have already been replaced by a single space
+# Actually, as an auth-param value can be either a token or a quoted-string, they are combined in a single pattern which matches both:
+# \"?((?<=\")(?:[^\0-\x1f\x7f-\xff\\\"]|\\[\0-\x7f])*?(?=\")|(?<!\")[^\0-\x08\x0A-\x1f\x7f-\xff()<>@,;:\\\"/[\]?={} \t]+(?!\"))\"?
+WWW_AUTH_STRICT = re.compile(r"^(?:\s*(?:,\s*)?([^\0-\x1f\x7f-\xff()<>@,;:\\\"/[\]?={} \t]+)\s*=\s*\"?((?<=\")(?:[^\0-\x08\x0A-\x1f\x7f-\xff\\\"]|\\[\0-\x7f])*?(?=\")|(?<!\")[^\0-\x1f\x7f-\xff()<>@,;:\\\"/[\]?={} \t]+(?!\"))\"?)(.*)$")
+WWW_AUTH_RELAXED = re.compile(r"^(?:\s*(?:,\s*)?([^ \t\r\n=]+)\s*=\s*\"?((?<=\")(?:[^\\\"]|\\.)*?(?=\")|(?<!\")[^ \t\r\n,]+(?!\"))\"?)(.*)$")
+UNQUOTE_PAIRS = re.compile(r'\\(.)')
+def _parse_www_authenticate(headers, headername='www-authenticate'):
+ """Returns a dictionary of dictionaries, one dict
+ per auth_scheme."""
+ retval = {}
+ if headers.has_key(headername):
+ authenticate = headers[headername].strip()
+ www_auth = USE_WWW_AUTH_STRICT_PARSING and WWW_AUTH_STRICT or WWW_AUTH_RELAXED
+ while authenticate:
+ # Break off the scheme at the beginning of the line
+ if headername == 'authentication-info':
+ (auth_scheme, the_rest) = ('digest', authenticate)
+ else:
+ (auth_scheme, the_rest) = authenticate.split(" ", 1)
+ # Now loop over all the key value pairs that come after the scheme,
+ # being careful not to roll into the next scheme
+ match = www_auth.search(the_rest)
+ auth_params = {}
+ while match:
+ if match and len(match.groups()) == 3:
+ (key, value, the_rest) = match.groups()
+ auth_params[key.lower()] = UNQUOTE_PAIRS.sub(r'\1', value) # '\\'.join([x.replace('\\', '') for x in value.split('\\\\')])
+ match = www_auth.search(the_rest)
+ retval[auth_scheme.lower()] = auth_params
+ authenticate = the_rest.strip()
+ return retval
+
+
+def _entry_disposition(response_headers, request_headers):
+ """Determine freshness from the Date, Expires and Cache-Control headers.
+
+ We don't handle the following:
+
+ 1. Cache-Control: max-stale
+ 2. Age: headers are not used in the calculations.
+
+ Not that this algorithm is simpler than you might think
+ because we are operating as a private (non-shared) cache.
+ This lets us ignore 's-maxage'. We can also ignore
+ 'proxy-invalidate' since we aren't a proxy.
+ We will never return a stale document as
+ fresh as a design decision, and thus the non-implementation
+ of 'max-stale'. This also lets us safely ignore 'must-revalidate'
+ since we operate as if every server has sent 'must-revalidate'.
+ Since we are private we get to ignore both 'public' and
+ 'private' parameters. We also ignore 'no-transform' since
+ we don't do any transformations.
+ The 'no-store' parameter is handled at a higher level.
+ So the only Cache-Control parameters we look at are:
+
+ no-cache
+ only-if-cached
+ max-age
+ min-fresh
+ """
+
+ retval = "STALE"
+ cc = _parse_cache_control(request_headers)
+ cc_response = _parse_cache_control(response_headers)
+
+ if request_headers.has_key('pragma') and request_headers['pragma'].lower().find('no-cache') != -1:
+ retval = "TRANSPARENT"
+ if 'cache-control' not in request_headers:
+ request_headers['cache-control'] = 'no-cache'
+ elif cc.has_key('no-cache'):
+ retval = "TRANSPARENT"
+ elif cc_response.has_key('no-cache'):
+ retval = "STALE"
+ elif cc.has_key('only-if-cached'):
+ retval = "FRESH"
+ elif response_headers.has_key('date'):
+ date = calendar.timegm(email.Utils.parsedate_tz(response_headers['date']))
+ now = time.time()
+ current_age = max(0, now - date)
+ if cc_response.has_key('max-age'):
+ try:
+ freshness_lifetime = int(cc_response['max-age'])
+ except:
+ freshness_lifetime = 0
+ elif response_headers.has_key('expires'):
+ expires = email.Utils.parsedate_tz(response_headers['expires'])
+ freshness_lifetime = max(0, calendar.timegm(expires) - date)
+ else:
+ freshness_lifetime = 0
+ if cc.has_key('max-age'):
+ try:
+ freshness_lifetime = int(cc['max-age'])
+ except:
+ freshness_lifetime = 0
+ if cc.has_key('min-fresh'):
+ try:
+ min_fresh = int(cc['min-fresh'])
+ except:
+ min_fresh = 0
+ current_age += min_fresh
+ if freshness_lifetime > current_age:
+ retval = "FRESH"
+ return retval
+
+def _decompressContent(response, new_content):
+ content = new_content
+ try:
+ encoding = response.get('content-encoding', None)
+ if encoding in ['gzip', 'deflate']:
+ if encoding == 'gzip':
+ content = gzip.GzipFile(fileobj=StringIO.StringIO(new_content)).read()
+ if encoding == 'deflate':
+ content = zlib.decompress(content)
+ response['content-length'] = str(len(content))
+ del response['content-encoding']
+ except:
+ content = ""
+ raise FailedToDecompressContent(_("Content purported to be compressed with %s but failed to decompress.") % response.get('content-encoding'))
+ return content
+
+def _updateCache(request_headers, response_headers, content, cache, cachekey):
+ if cachekey:
+ cc = _parse_cache_control(request_headers)
+ cc_response = _parse_cache_control(response_headers)
+ if cc.has_key('no-store') or cc_response.has_key('no-store'):
+ cache.delete(cachekey)
+ else:
+ info = email.Message.Message()
+ for key, value in response_headers.iteritems():
+ if key not in ['status','content-encoding','transfer-encoding']:
+ info[key] = value
+
+ status = response_headers.status
+ if status == 304:
+ status = 200
+
+ status_header = 'status: %d\r\n' % response_headers.status
+
+ header_str = info.as_string()
+
+ header_str = re.sub("\r(?!\n)|(?<!\r)\n", "\r\n", header_str)
+ text = "".join([status_header, header_str, content])
+
+ cache.set(cachekey, text)
+
+def _cnonce():
+ dig = md5.new("%s:%s" % (time.ctime(), ["0123456789"[random.randrange(0, 9)] for i in range(20)])).hexdigest()
+ return dig[:16]
+
+def _wsse_username_token(cnonce, iso_now, password):
+ return base64.encodestring(sha.new("%s%s%s" % (cnonce, iso_now, password)).digest()).strip()
+
+
+# For credentials we need two things, first
+# a pool of credential to try (not necesarily tied to BAsic, Digest, etc.)
+# Then we also need a list of URIs that have already demanded authentication
+# That list is tricky since sub-URIs can take the same auth, or the
+# auth scheme may change as you descend the tree.
+# So we also need each Auth instance to be able to tell us
+# how close to the 'top' it is.
+
+class Authentication:
+ def __init__(self, credentials, host, request_uri, headers, response, content, http):
+ (scheme, authority, path, query, fragment) = parse_uri(request_uri)
+ self.path = path
+ self.host = host
+ self.credentials = credentials
+ self.http = http
+
+ def depth(self, request_uri):
+ (scheme, authority, path, query, fragment) = parse_uri(request_uri)
+ return request_uri[len(self.path):].count("/")
+
+ def inscope(self, host, request_uri):
+ # XXX Should we normalize the request_uri?
+ (scheme, authority, path, query, fragment) = parse_uri(request_uri)
+ return (host == self.host) and path.startswith(self.path)
+
+ def request(self, method, request_uri, headers, content):
+ """Modify the request headers to add the appropriate
+ Authorization header. Over-rise this in sub-classes."""
+ pass
+
+ def response(self, response, content):
+ """Gives us a chance to update with new nonces
+ or such returned from the last authorized response.
+ Over-rise this in sub-classes if necessary.
+
+ Return TRUE is the request is to be retried, for
+ example Digest may return stale=true.
+ """
+ return False
+
+
+
+class BasicAuthentication(Authentication):
+ def __init__(self, credentials, host, request_uri, headers, response, content, http):
+ Authentication.__init__(self, credentials, host, request_uri, headers, response, content, http)
+
+ def request(self, method, request_uri, headers, content):
+ """Modify the request headers to add the appropriate
+ Authorization header."""
+ headers['authorization'] = 'Basic ' + base64.encodestring("%s:%s" % self.credentials).strip()
+
+
+class DigestAuthentication(Authentication):
+ """Only do qop='auth' and MD5, since that
+ is all Apache currently implements"""
+ def __init__(self, credentials, host, request_uri, headers, response, content, http):
+ Authentication.__init__(self, credentials, host, request_uri, headers, response, content, http)
+ challenge = _parse_www_authenticate(response, 'www-authenticate')
+ self.challenge = challenge['digest']
+ qop = self.challenge.get('qop')
+ self.challenge['qop'] = ('auth' in [x.strip() for x in qop.split()]) and 'auth' or None
+ if self.challenge['qop'] is None:
+ raise UnimplementedDigestAuthOptionError( _("Unsupported value for qop: %s." % qop))
+ self.challenge['algorithm'] = self.challenge.get('algorithm', 'MD5')
+ if self.challenge['algorithm'] != 'MD5':
+ raise UnimplementedDigestAuthOptionError( _("Unsupported value for algorithm: %s." % self.challenge['algorithm']))
+ self.A1 = "".join([self.credentials[0], ":", self.challenge['realm'], ":", self.credentials[1]])
+ self.challenge['nc'] = 1
+
+ def request(self, method, request_uri, headers, content, cnonce = None):
+ """Modify the request headers"""
+ H = lambda x: md5.new(x).hexdigest()
+ KD = lambda s, d: H("%s:%s" % (s, d))
+ A2 = "".join([method, ":", request_uri])
+ self.challenge['cnonce'] = cnonce or _cnonce()
+ request_digest = '"%s"' % KD(H(self.A1), "%s:%s:%s:%s:%s" % (self.challenge['nonce'],
+ '%08x' % self.challenge['nc'],
+ self.challenge['cnonce'],
+ self.challenge['qop'], H(A2)
+ ))
+ headers['Authorization'] = 'Digest username="%s", realm="%s", nonce="%s", uri="%s", algorithm=%s, response=%s, qop=%s, nc=%08x, cnonce="%s"' % (
+ self.credentials[0],
+ self.challenge['realm'],
+ self.challenge['nonce'],
+ request_uri,
+ self.challenge['algorithm'],
+ request_digest,
+ self.challenge['qop'],
+ self.challenge['nc'],
+ self.challenge['cnonce'],
+ )
+ self.challenge['nc'] += 1
+
+ def response(self, response, content):
+ if not response.has_key('authentication-info'):
+ challenge = _parse_www_authenticate(response, 'www-authenticate').get('digest', {})
+ if 'true' == challenge.get('stale'):
+ self.challenge['nonce'] = challenge['nonce']
+ self.challenge['nc'] = 1
+ return True
+ else:
+ updated_challenge = _parse_www_authenticate(response, 'authentication-info').get('digest', {})
+
+ if updated_challenge.has_key('nextnonce'):
+ self.challenge['nonce'] = updated_challenge['nextnonce']
+ self.challenge['nc'] = 1
+ return False
+
+
+class HmacDigestAuthentication(Authentication):
+ """Adapted from Robert Sayre's code and DigestAuthentication above."""
+ __author__ = "Thomas Broyer (t.broyer at ltgt.net)"
+
+ def __init__(self, credentials, host, request_uri, headers, response, content, http):
+ Authentication.__init__(self, credentials, host, request_uri, headers, response, content, http)
+ challenge = _parse_www_authenticate(response, 'www-authenticate')
+ self.challenge = challenge['hmacdigest']
+ # TODO: self.challenge['domain']
+ self.challenge['reason'] = self.challenge.get('reason', 'unauthorized')
+ if self.challenge['reason'] not in ['unauthorized', 'integrity']:
+ self.challenge['reason'] = 'unauthorized'
+ self.challenge['salt'] = self.challenge.get('salt', '')
+ if not self.challenge.get('snonce'):
+ raise UnimplementedHmacDigestAuthOptionError( _("The challenge doesn't contain a server nonce, or this one is empty."))
+ self.challenge['algorithm'] = self.challenge.get('algorithm', 'HMAC-SHA-1')
+ if self.challenge['algorithm'] not in ['HMAC-SHA-1', 'HMAC-MD5']:
+ raise UnimplementedHmacDigestAuthOptionError( _("Unsupported value for algorithm: %s." % self.challenge['algorithm']))
+ self.challenge['pw-algorithm'] = self.challenge.get('pw-algorithm', 'SHA-1')
+ if self.challenge['pw-algorithm'] not in ['SHA-1', 'MD5']:
+ raise UnimplementedHmacDigestAuthOptionError( _("Unsupported value for pw-algorithm: %s." % self.challenge['pw-algorithm']))
+ if self.challenge['algorithm'] == 'HMAC-MD5':
+ self.hashmod = md5
+ else:
+ self.hashmod = sha
+ if self.challenge['pw-algorithm'] == 'MD5':
+ self.pwhashmod = md5
+ else:
+ self.pwhashmod = sha
+ self.key = "".join([self.credentials[0], ":",
+ self.pwhashmod.new("".join([self.credentials[1], self.challenge['salt']])).hexdigest().lower(),
+ ":", self.challenge['realm']
+ ])
+ self.key = self.pwhashmod.new(self.key).hexdigest().lower()
+
+ def request(self, method, request_uri, headers, content):
+ """Modify the request headers"""
+ keys = _get_end2end_headers(headers)
+ keylist = "".join(["%s " % k for k in keys])
+ headers_val = "".join([headers[k] for k in keys])
+ created = time.strftime('%Y-%m-%dT%H:%M:%SZ',time.gmtime())
+ cnonce = _cnonce()
+ request_digest = "%s:%s:%s:%s:%s" % (method, request_uri, cnonce, self.challenge['snonce'], headers_val)
+ request_digest = hmac.new(self.key, request_digest, self.hashmod).hexdigest().lower()
+ headers['Authorization'] = 'HMACDigest username="%s", realm="%s", snonce="%s", cnonce="%s", uri="%s", created="%s", response="%s", headers="%s"' % (
+ self.credentials[0],
+ self.challenge['realm'],
+ self.challenge['snonce'],
+ cnonce,
+ request_uri,
+ created,
+ request_digest,
+ keylist,
+ )
+
+ def response(self, response, content):
+ challenge = _parse_www_authenticate(response, 'www-authenticate').get('hmacdigest', {})
+ if challenge.get('reason') in ['integrity', 'stale']:
+ return True
+ return False
+
+
+class WsseAuthentication(Authentication):
+ """This is thinly tested and should not be relied upon.
+ At this time there isn't any third party server to test against.
+ Blogger and TypePad implemented this algorithm at one point
+ but Blogger has since switched to Basic over HTTPS and
+ TypePad has implemented it wrong, by never issuing a 401
+ challenge but instead requiring your client to telepathically know that
+ their endpoint is expecting WSSE profile="UsernameToken"."""
+ def __init__(self, credentials, host, request_uri, headers, response, content, http):
+ Authentication.__init__(self, credentials, host, request_uri, headers, response, content, http)
+
+ def request(self, method, request_uri, headers, content):
+ """Modify the request headers to add the appropriate
+ Authorization header."""
+ headers['Authorization'] = 'WSSE profile="UsernameToken"'
+ iso_now = time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime())
+ cnonce = _cnonce()
+ password_digest = _wsse_username_token(cnonce, iso_now, self.credentials[1])
+ headers['X-WSSE'] = 'UsernameToken Username="%s", PasswordDigest="%s", Nonce="%s", Created="%s"' % (
+ self.credentials[0],
+ password_digest,
+ cnonce,
+ iso_now)
+
+class GoogleLoginAuthentication(Authentication):
+ def __init__(self, credentials, host, request_uri, headers, response, content, http):
+ from urllib import urlencode
+ Authentication.__init__(self, credentials, host, request_uri, headers, response, content, http)
+
+ auth = dict(Email=credentials[0], Passwd=credentials[1], service='cl', source=headers['user-agent'])
+ resp, content = self.http.request("https://www.google.com/accounts/ClientLogin", method="POST", body=urlencode(auth), headers={'Content-Type': 'application/x-www-form-urlencoded'})
+ lines = content.split('\n')
+ d = dict([tuple(line.split("=", 1)) for line in lines if line])
+ if resp.status == 403:
+ self.Auth = ""
+ else:
+ self.Auth = d['Auth']
+
+ def request(self, method, request_uri, headers, content):
+ """Modify the request headers to add the appropriate
+ Authorization header."""
+ headers['authorization'] = 'GoogleLogin Auth=' + self.Auth
+
+
+AUTH_SCHEME_CLASSES = {
+ "basic": BasicAuthentication,
+ "wsse": WsseAuthentication,
+ "digest": DigestAuthentication,
+ "hmacdigest": HmacDigestAuthentication,
+ "googlelogin": GoogleLoginAuthentication
+}
+
+AUTH_SCHEME_ORDER = ["hmacdigest", "googlelogin", "digest", "wsse", "basic"]
+
+def _md5(s):
+ return
+
+class FileCache:
+ """Uses a local directory as a store for cached files.
+ Not really safe to use if multiple threads or processes are going to
+ be running on the same cache.
+ """
+ def __init__(self, cache, safe=safename): # use safe=lambda x: md5.new(x).hexdigest() for the old behavior
+ self.cache = cache
+ self.safe = safe
+ if not os.path.exists(cache):
+ os.makedirs(self.cache)
+
+ def get(self, key):
+ retval = None
+ cacheFullPath = os.path.join(self.cache, self.safe(key))
+ try:
+ f = file(cacheFullPath, "r")
+ retval = f.read()
+ f.close()
+ except:
+ pass
+ return retval
+
+ def set(self, key, value):
+ cacheFullPath = os.path.join(self.cache, self.safe(key))
+ f = file(cacheFullPath, "w")
+ f.write(value)
+ f.close()
+
+ def delete(self, key):
+ cacheFullPath = os.path.join(self.cache, self.safe(key))
+ if os.path.exists(cacheFullPath):
+ os.remove(cacheFullPath)
+
+class Http:
+ """An HTTP client that handles all
+ methods, caching, ETags, compression,
+ HTTPS, Basic, Digest, WSSE, etc.
+ """
+ def __init__(self, cache=None):
+ # Map domain name to an httplib connection
+ self.connections = {}
+ # The location of the cache, for now a directory
+ # where cached responses are held.
+ if cache and isinstance(cache, str):
+ self.cache = FileCache(cache)
+ else:
+ self.cache = cache
+
+ # tuples of name, password
+ self.credentials = []
+
+ # authorization objects
+ self.authorizations = []
+
+ self.follow_all_redirects = False
+
+ self.ignore_etag = False
+
+ def _auth_from_challenge(self, host, request_uri, headers, response, content):
+ """A generator that creates Authorization objects
+ that can be applied to requests.
+ """
+ challenges = _parse_www_authenticate(response, 'www-authenticate')
+ for cred in self.credentials:
+ for scheme in AUTH_SCHEME_ORDER:
+ if challenges.has_key(scheme):
+ yield AUTH_SCHEME_CLASSES[scheme](cred, host, request_uri, headers, response, content, self)
+
+ def add_credentials(self, name, password):
+ """Add a name and password that will be used
+ any time a request requires authentication."""
+ self.credentials.append((name, password))
+
+ def clear_credentials(self):
+ """Remove all the names and passwords
+ that are used for authentication"""
+ self.credentials = []
+ self.authorizations = []
+
+ def _conn_request(self, conn, request_uri, method, body, headers):
+ for i in range(2):
+ try:
+ conn.request(method, request_uri, body, headers)
+ response = conn.getresponse()
+ except gaierror:
+ raise ServerNotFoundError("Unable to find the server at %s" % request_uri)
+ except:
+ if i == 0:
+ conn.close()
+ conn.connect()
+ continue
+ else:
+ raise
+ else:
+ content = response.read()
+ response = Response(response)
+ content = _decompressContent(response, content)
+
+ break;
+ return (response, content)
+
+
+ def _request(self, conn, host, absolute_uri, request_uri, method, body, headers, redirections, cachekey):
+ """Do the actual request using the connection object
+ and also follow one level of redirects if necessary"""
+
+ auths = [(auth.depth(request_uri), auth) for auth in self.authorizations if auth.inscope(host, request_uri)]
+ auth = auths and sorted(auths)[0][1] or None
+ if auth:
+ auth.request(method, request_uri, headers, body)
+
+ (response, content) = self._conn_request(conn, request_uri, method, body, headers)
+
+ if auth:
+ if auth.response(response, body):
+ auth.request(method, request_uri, headers, body)
+ (response, content) = self._conn_request(conn, request_uri, method, body, headers )
+ response._stale_digest = 1
+
+ if response.status == 401:
+ for authorization in self._auth_from_challenge(host, request_uri, headers, response, content):
+ authorization.request(method, request_uri, headers, body)
+ (response, content) = self._conn_request(conn, request_uri, method, body, headers, )
+ if response.status != 401:
+ self.authorizations.append(authorization)
+ authorization.response(response, body)
+ break
+
+ if (self.follow_all_redirects or method in ["GET", "HEAD"]) or response.status == 303:
+ if response.status in [300, 301, 302, 303, 307]:
+ # Pick out the location header and basically start from the beginning
+ # remembering first to strip the ETag header and decrement our 'depth'
+ if redirections:
+ if not response.has_key('location') and response.status != 300:
+ raise RedirectMissingLocation( _("Redirected but the response is missing a Location: header."))
+ # Fix-up relative redirects (which violate an RFC 2616 MUST)
+ if response.has_key('location'):
+ location = response['location']
+ (scheme, authority, path, query, fragment) = parse_uri(location)
+ if authority == None:
+ response['location'] = urlparse.urljoin(absolute_uri, location)
+ if response.status == 301 and method in ["GET", "HEAD"]:
+ response['-x-permanent-redirect-url'] = response['location']
+ if not response.has_key('content-location'):
+ response['content-location'] = absolute_uri
+ _updateCache(headers, response, content, self.cache, cachekey)
+ if headers.has_key('if-none-match'):
+ del headers['if-none-match']
+ if headers.has_key('if-modified-since'):
+ del headers['if-modified-since']
+ if response.has_key('location'):
+ location = response['location']
+ old_response = copy.deepcopy(response)
+ if not old_response.has_key('content-location'):
+ old_response['content-location'] = absolute_uri
+ redirect_method = ((response.status == 303) and (method not in ["GET", "HEAD"])) and "GET" or method
+ (response, content) = self.request(location, redirect_method, body=body, headers = headers, redirections = redirections - 1)
+ response.previous = old_response
+ else:
+ raise RedirectLimit( _("Redirected more times than rediection_limit allows."))
+ elif response.status in [200, 203] and method == "GET":
+ # Don't cache 206's since we aren't going to handle byte range requests
+ if not response.has_key('content-location'):
+ response['content-location'] = absolute_uri
+ _updateCache(headers, response, content, self.cache, cachekey)
+
+ return (response, content)
+
+ def request(self, uri, method="GET", body=None, headers=None, redirections=DEFAULT_MAX_REDIRECTS):
+ """ Performs a single HTTP request.
+The 'uri' is the URI of the HTTP resource and can begin
+with either 'http' or 'https'. The value of 'uri' must be an absolute URI.
+
+The 'method' is the HTTP method to perform, such as GET, POST, DELETE, etc.
+There is no restriction on the methods allowed.
+
+The 'body' is the entity body to be sent with the request. It is a string
+object.
+
+Any extra headers that are to be sent with the request should be provided in the
+'headers' dictionary.
+
+The maximum number of redirect to follow before raising an
+exception is 'redirections. The default is 5.
+
+The return value is a tuple of (response, content), the first
+being and instance of the 'Response' class, the second being
+a string that contains the response entity body.
+ """
+ if headers is None:
+ headers = {}
+ else:
+ headers = _normalize_headers(headers)
+
+ if not headers.has_key('user-agent'):
+ headers['user-agent'] = "Python-httplib2/%s" % __version__
+
+ uri = iri2uri(uri)
+
+ (scheme, authority, request_uri, defrag_uri) = urlnorm(uri)
+
+ if not self.connections.has_key(scheme+":"+authority):
+ connection_type = (scheme == 'https') and httplib.HTTPSConnection or httplib.HTTPConnection
+ conn = self.connections[scheme+":"+authority] = connection_type(authority)
+ conn.set_debuglevel(debuglevel)
+ else:
+ conn = self.connections[scheme+":"+authority]
+
+ if method in ["GET", "HEAD"] and 'range' not in headers:
+ headers['accept-encoding'] = 'compress, gzip'
+
+ info = email.Message.Message()
+ cached_value = None
+ if self.cache:
+ cachekey = defrag_uri
+ cached_value = self.cache.get(cachekey)
+ if cached_value:
+ try:
+ info = email.message_from_string(cached_value)
+ content = cached_value.split('\r\n\r\n', 1)[1]
+ except Exception, e:
+ self.cache.delete(cachekey)
+ cachekey = None
+ cached_value = None
+ else:
+ cachekey = None
+
+ if method in ["PUT"] and self.cache and info.has_key('etag') and not self.ignore_etag and 'if-match' not in headers:
+ # http://www.w3.org/1999/04/Editing/
+ headers['if-match'] = info['etag']
+
+ if method not in ["GET", "HEAD"] and self.cache and cachekey:
+ # RFC 2616 Section 13.10
+ self.cache.delete(cachekey)
+
+ if cached_value and method in ["GET", "HEAD"] and self.cache and 'range' not in headers:
+ if info.has_key('-x-permanent-redirect-url'):
+ # Should cached permanent redirects be counted in our redirection count? For now, yes.
+ (response, new_content) = self.request(info['-x-permanent-redirect-url'], "GET", headers = headers, redirections = redirections - 1)
+ response.previous = Response(info)
+ response.previous.fromcache = True
+ else:
+ # Determine our course of action:
+ # Is the cached entry fresh or stale?
+ # Has the client requested a non-cached response?
+ #
+ # There seems to be three possible answers:
+ # 1. [FRESH] Return the cache entry w/o doing a GET
+ # 2. [STALE] Do the GET (but add in cache validators if available)
+ # 3. [TRANSPARENT] Do a GET w/o any cache validators (Cache-Control: no-cache) on the request
+ entry_disposition = _entry_disposition(info, headers)
+
+ if entry_disposition == "FRESH":
+ if not cached_value:
+ info['status'] = '504'
+ content = ""
+ response = Response(info)
+ if cached_value:
+ response.fromcache = True
+ return (response, content)
+
+ if entry_disposition == "STALE":
+ if info.has_key('etag') and not self.ignore_etag and not 'if-none-match' in headers:
+ headers['if-none-match'] = info['etag']
+ if info.has_key('last-modified') and not 'last-modified' in headers:
+ headers['if-modified-since'] = info['last-modified']
+ elif entry_disposition == "TRANSPARENT":
+ pass
+
+ (response, new_content) = self._request(conn, authority, uri, request_uri, method, body, headers, redirections, cachekey)
+
+ if response.status == 304 and method == "GET":
+ # Rewrite the cache entry with the new end-to-end headers
+ # Take all headers that are in response
+ # and overwrite their values in info.
+ # unless they are hop-by-hop, or are listed in the connection header.
+
+ for key in _get_end2end_headers(response):
+ info[key] = response[key]
+ merged_response = Response(info)
+ if hasattr(response, "_stale_digest"):
+ merged_response._stale_digest = response._stale_digest
+ try:
+ _updateCache(headers, merged_response, content, self.cache, cachekey)
+ except:
+ print locals()
+ raise
+ response = merged_response
+ response.status = 200
+ response.fromcache = True
+
+ elif response.status == 200:
+ content = new_content
+ else:
+ self.cache.delete(cachekey)
+ content = new_content
+ else:
+ (response, content) = self._request(conn, authority, uri, request_uri, method, body, headers, redirections, cachekey)
+ return (response, content)
+
+
+
+class Response(dict):
+ """An object more like email.Message than httplib.HTTPResponse."""
+
+ """Is this response from our local cache"""
+ fromcache = False
+
+ """HTTP protocol version used by server. 10 for HTTP/1.0, 11 for HTTP/1.1. """
+ version = 11
+
+ "Status code returned by server. "
+ status = 200
+
+ """Reason phrase returned by server."""
+ reason = "Ok"
+
+ previous = None
+
+ def __init__(self, info):
+ # info is either an email.Message or
+ # an httplib.HTTPResponse object.
+ if isinstance(info, httplib.HTTPResponse):
+ for key, value in info.getheaders():
+ self[key] = value
+ self.status = info.status
+ self['status'] = str(self.status)
+ self.reason = info.reason
+ self.version = info.version
+ elif isinstance(info, email.Message.Message):
+ for key, value in info.items():
+ self[key] = value
+ self.status = int(self['status'])
+
+ def __getattr__(self, name):
+ if name == 'dict':
+ return self
+ else:
+ raise AttributeError, name
+
+
Deleted: trunk/lib/venus/planet/vendor/httplib2/iri2uri.py
===================================================================
--- branches/sucs-site/lib/venus/planet/vendor/httplib2/iri2uri.py 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/lib/venus/planet/vendor/httplib2/iri2uri.py 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,110 +0,0 @@
-"""
-iri2uri
-
-Converts an IRI to a URI.
-
-"""
-__author__ = "Joe Gregorio (joe at bitworking.org)"
-__copyright__ = "Copyright 2006, Joe Gregorio"
-__contributors__ = []
-__version__ = "1.0.0"
-__license__ = "MIT"
-__history__ = """
-"""
-
-import urlparse
-
-
-# Convert an IRI to a URI following the rules in RFC 3987
-#
-# The characters we need to enocde and escape are defined in the spec:
-#
-# iprivate = %xE000-F8FF / %xF0000-FFFFD / %x100000-10FFFD
-# ucschar = %xA0-D7FF / %xF900-FDCF / %xFDF0-FFEF
-# / %x10000-1FFFD / %x20000-2FFFD / %x30000-3FFFD
-# / %x40000-4FFFD / %x50000-5FFFD / %x60000-6FFFD
-# / %x70000-7FFFD / %x80000-8FFFD / %x90000-9FFFD
-# / %xA0000-AFFFD / %xB0000-BFFFD / %xC0000-CFFFD
-# / %xD0000-DFFFD / %xE1000-EFFFD
-
-escape_range = [
- (0xA0, 0xD7FF ),
- (0xE000, 0xF8FF ),
- (0xF900, 0xFDCF ),
- (0xFDF0, 0xFFEF),
- (0x10000, 0x1FFFD ),
- (0x20000, 0x2FFFD ),
- (0x30000, 0x3FFFD),
- (0x40000, 0x4FFFD ),
- (0x50000, 0x5FFFD ),
- (0x60000, 0x6FFFD),
- (0x70000, 0x7FFFD ),
- (0x80000, 0x8FFFD ),
- (0x90000, 0x9FFFD),
- (0xA0000, 0xAFFFD ),
- (0xB0000, 0xBFFFD ),
- (0xC0000, 0xCFFFD),
- (0xD0000, 0xDFFFD ),
- (0xE1000, 0xEFFFD),
- (0xF0000, 0xFFFFD ),
- (0x100000, 0x10FFFD)
-]
-
-def encode(c):
- retval = c
- i = ord(c)
- for low, high in escape_range:
- if i < low:
- break
- if i >= low and i <= high:
- retval = "".join(["%%%2X" % ord(o) for o in c.encode('utf-8')])
- break
- return retval
-
-
-def iri2uri(uri):
- """Convert an IRI to a URI. Note that IRIs must be
- passed in a unicode strings. That is, do not utf-8 encode
- the IRI before passing it into the function."""
- if isinstance(uri ,unicode):
- (scheme, authority, path, query, fragment) = urlparse.urlsplit(uri)
- authority = authority.encode('idna')
- # For each character in 'ucschar' or 'iprivate'
- # 1. encode as utf-8
- # 2. then %-encode each octet of that utf-8
- uri = urlparse.urlunsplit((scheme, authority, path, query, fragment))
- uri = "".join([encode(c) for c in uri])
- return uri
-
-if __name__ == "__main__":
- import unittest
-
- class Test(unittest.TestCase):
-
- def test_uris(self):
- """Test that URIs are invariant under the transformation."""
- invariant = [
- u"ftp://ftp.is.co.za/rfc/rfc1808.txt",
- u"http://www.ietf.org/rfc/rfc2396.txt",
- u"ldap://[2001:db8::7]/c=GB?objectClass?one",
- u"mailto:John.Doe at example.com",
- u"news:comp.infosystems.www.servers.unix",
- u"tel:+1-816-555-1212",
- u"telnet://192.0.2.16:80/",
- u"urn:oasis:names:specification:docbook:dtd:xml:4.1.2" ]
- for uri in invariant:
- self.assertEqual(uri, iri2uri(uri))
-
- def test_iri(self):
- """ Test that the right type of escaping is done for each part of the URI."""
- self.assertEqual("http://xn--o3h.com/%E2%98%84", iri2uri(u"http://\N{COMET}.com/\N{COMET}"))
- self.assertEqual("http://bitworking.org/?fred=%E2%98%84", iri2uri(u"http://bitworking.org/?fred=\N{COMET}"))
- self.assertEqual("http://bitworking.org/#%E2%98%84", iri2uri(u"http://bitworking.org/#\N{COMET}"))
- self.assertEqual("#%E2%98%84", iri2uri(u"#\N{COMET}"))
- self.assertEqual("/fred?bar=%E2%98%9A#%E2%98%84", iri2uri(u"/fred?bar=\N{BLACK LEFT POINTING INDEX}#\N{COMET}"))
- self.assertEqual("/fred?bar=%E2%98%9A#%E2%98%84", iri2uri(iri2uri(u"/fred?bar=\N{BLACK LEFT POINTING INDEX}#\N{COMET}")))
- self.assertNotEqual("/fred?bar=%E2%98%9A#%E2%98%84", iri2uri(u"/fred?bar=\N{BLACK LEFT POINTING INDEX}#\N{COMET}".encode('utf-8')))
-
- unittest.main()
-
-
Copied: trunk/lib/venus/planet/vendor/httplib2/iri2uri.py (from rev 656, branches/sucs-site/lib/venus/planet/vendor/httplib2/iri2uri.py)
===================================================================
--- trunk/lib/venus/planet/vendor/httplib2/iri2uri.py (rev 0)
+++ trunk/lib/venus/planet/vendor/httplib2/iri2uri.py 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,110 @@
+"""
+iri2uri
+
+Converts an IRI to a URI.
+
+"""
+__author__ = "Joe Gregorio (joe at bitworking.org)"
+__copyright__ = "Copyright 2006, Joe Gregorio"
+__contributors__ = []
+__version__ = "1.0.0"
+__license__ = "MIT"
+__history__ = """
+"""
+
+import urlparse
+
+
+# Convert an IRI to a URI following the rules in RFC 3987
+#
+# The characters we need to enocde and escape are defined in the spec:
+#
+# iprivate = %xE000-F8FF / %xF0000-FFFFD / %x100000-10FFFD
+# ucschar = %xA0-D7FF / %xF900-FDCF / %xFDF0-FFEF
+# / %x10000-1FFFD / %x20000-2FFFD / %x30000-3FFFD
+# / %x40000-4FFFD / %x50000-5FFFD / %x60000-6FFFD
+# / %x70000-7FFFD / %x80000-8FFFD / %x90000-9FFFD
+# / %xA0000-AFFFD / %xB0000-BFFFD / %xC0000-CFFFD
+# / %xD0000-DFFFD / %xE1000-EFFFD
+
+escape_range = [
+ (0xA0, 0xD7FF ),
+ (0xE000, 0xF8FF ),
+ (0xF900, 0xFDCF ),
+ (0xFDF0, 0xFFEF),
+ (0x10000, 0x1FFFD ),
+ (0x20000, 0x2FFFD ),
+ (0x30000, 0x3FFFD),
+ (0x40000, 0x4FFFD ),
+ (0x50000, 0x5FFFD ),
+ (0x60000, 0x6FFFD),
+ (0x70000, 0x7FFFD ),
+ (0x80000, 0x8FFFD ),
+ (0x90000, 0x9FFFD),
+ (0xA0000, 0xAFFFD ),
+ (0xB0000, 0xBFFFD ),
+ (0xC0000, 0xCFFFD),
+ (0xD0000, 0xDFFFD ),
+ (0xE1000, 0xEFFFD),
+ (0xF0000, 0xFFFFD ),
+ (0x100000, 0x10FFFD)
+]
+
+def encode(c):
+ retval = c
+ i = ord(c)
+ for low, high in escape_range:
+ if i < low:
+ break
+ if i >= low and i <= high:
+ retval = "".join(["%%%2X" % ord(o) for o in c.encode('utf-8')])
+ break
+ return retval
+
+
+def iri2uri(uri):
+ """Convert an IRI to a URI. Note that IRIs must be
+ passed in a unicode strings. That is, do not utf-8 encode
+ the IRI before passing it into the function."""
+ if isinstance(uri ,unicode):
+ (scheme, authority, path, query, fragment) = urlparse.urlsplit(uri)
+ authority = authority.encode('idna')
+ # For each character in 'ucschar' or 'iprivate'
+ # 1. encode as utf-8
+ # 2. then %-encode each octet of that utf-8
+ uri = urlparse.urlunsplit((scheme, authority, path, query, fragment))
+ uri = "".join([encode(c) for c in uri])
+ return uri
+
+if __name__ == "__main__":
+ import unittest
+
+ class Test(unittest.TestCase):
+
+ def test_uris(self):
+ """Test that URIs are invariant under the transformation."""
+ invariant = [
+ u"ftp://ftp.is.co.za/rfc/rfc1808.txt",
+ u"http://www.ietf.org/rfc/rfc2396.txt",
+ u"ldap://[2001:db8::7]/c=GB?objectClass?one",
+ u"mailto:John.Doe at example.com",
+ u"news:comp.infosystems.www.servers.unix",
+ u"tel:+1-816-555-1212",
+ u"telnet://192.0.2.16:80/",
+ u"urn:oasis:names:specification:docbook:dtd:xml:4.1.2" ]
+ for uri in invariant:
+ self.assertEqual(uri, iri2uri(uri))
+
+ def test_iri(self):
+ """ Test that the right type of escaping is done for each part of the URI."""
+ self.assertEqual("http://xn--o3h.com/%E2%98%84", iri2uri(u"http://\N{COMET}.com/\N{COMET}"))
+ self.assertEqual("http://bitworking.org/?fred=%E2%98%84", iri2uri(u"http://bitworking.org/?fred=\N{COMET}"))
+ self.assertEqual("http://bitworking.org/#%E2%98%84", iri2uri(u"http://bitworking.org/#\N{COMET}"))
+ self.assertEqual("#%E2%98%84", iri2uri(u"#\N{COMET}"))
+ self.assertEqual("/fred?bar=%E2%98%9A#%E2%98%84", iri2uri(u"/fred?bar=\N{BLACK LEFT POINTING INDEX}#\N{COMET}"))
+ self.assertEqual("/fred?bar=%E2%98%9A#%E2%98%84", iri2uri(iri2uri(u"/fred?bar=\N{BLACK LEFT POINTING INDEX}#\N{COMET}")))
+ self.assertNotEqual("/fred?bar=%E2%98%9A#%E2%98%84", iri2uri(u"/fred?bar=\N{BLACK LEFT POINTING INDEX}#\N{COMET}".encode('utf-8')))
+
+ unittest.main()
+
+
Deleted: trunk/lib/venus/planet/vendor/portalocker.py
===================================================================
--- branches/sucs-site/lib/venus/planet/vendor/portalocker.py 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/lib/venus/planet/vendor/portalocker.py 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,93 +0,0 @@
-# portalocker.py - Cross-platform (posix/nt) API for flock-style file locking.
-# Requires python 1.5.2 or better.
-# See http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/65203/index_txt
-# Except where otherwise noted, recipes in the Python Cookbook are
-# published under the Python license.
-
-"""Cross-platform (posix/nt) API for flock-style file locking.
-
-Synopsis:
-
- import portalocker
- file = open("somefile", "r+")
- portalocker.lock(file, portalocker.LOCK_EX)
- file.seek(12)
- file.write("foo")
- file.close()
-
-If you know what you're doing, you may choose to
-
- portalocker.unlock(file)
-
-before closing the file, but why?
-
-Methods:
-
- lock( file, flags )
- unlock( file )
-
-Constants:
-
- LOCK_EX
- LOCK_SH
- LOCK_NB
-
-I learned the win32 technique for locking files from sample code
-provided by John Nielsen <nielsenjf at my-deja.com> in the documentation
-that accompanies the win32 modules.
-
-Author: Jonathan Feinberg <jdf at pobox.com>
-Version: $Id: portalocker.py,v 1.3 2001/05/29 18:47:55 Administrator Exp $
-"""
-
-import os
-
-if os.name == 'nt':
- import win32con
- import win32file
- import pywintypes
- LOCK_EX = win32con.LOCKFILE_EXCLUSIVE_LOCK
- LOCK_SH = 0 # the default
- LOCK_NB = win32con.LOCKFILE_FAIL_IMMEDIATELY
- # is there any reason not to reuse the following structure?
- __overlapped = pywintypes.OVERLAPPED()
-elif os.name == 'posix':
- import fcntl
- LOCK_EX = fcntl.LOCK_EX
- LOCK_SH = fcntl.LOCK_SH
- LOCK_NB = fcntl.LOCK_NB
-else:
- raise RuntimeError("PortaLocker only defined for nt and posix platforms")
-
-if os.name == 'nt':
- def lock(file, flags):
- hfile = win32file._get_osfhandle(file.fileno())
- win32file.LockFileEx(hfile, flags, 0, -0x10000, __overlapped)
-
- def unlock(file):
- hfile = win32file._get_osfhandle(file.fileno())
- win32file.UnlockFileEx(hfile, 0, -0x10000, __overlapped)
-
-elif os.name =='posix':
- def lock(file, flags):
- fcntl.flock(file.fileno(), flags)
-
- def unlock(file):
- fcntl.flock(file.fileno(), fcntl.LOCK_UN)
-
-if __name__ == '__main__':
- from time import time, strftime, localtime
- import sys
- import portalocker
-
- log = open('log.txt', "a+")
- portalocker.lock(log, portalocker.LOCK_EX)
-
- timestamp = strftime("%m/%d/%Y %H:%M:%S\n", localtime(time()))
- log.write( timestamp )
-
- print "Wrote lines. Hit enter to release lock."
- dummy = sys.stdin.readline()
-
- log.close()
-
Copied: trunk/lib/venus/planet/vendor/portalocker.py (from rev 656, branches/sucs-site/lib/venus/planet/vendor/portalocker.py)
===================================================================
--- trunk/lib/venus/planet/vendor/portalocker.py (rev 0)
+++ trunk/lib/venus/planet/vendor/portalocker.py 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,93 @@
+# portalocker.py - Cross-platform (posix/nt) API for flock-style file locking.
+# Requires python 1.5.2 or better.
+# See http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/65203/index_txt
+# Except where otherwise noted, recipes in the Python Cookbook are
+# published under the Python license.
+
+"""Cross-platform (posix/nt) API for flock-style file locking.
+
+Synopsis:
+
+ import portalocker
+ file = open("somefile", "r+")
+ portalocker.lock(file, portalocker.LOCK_EX)
+ file.seek(12)
+ file.write("foo")
+ file.close()
+
+If you know what you're doing, you may choose to
+
+ portalocker.unlock(file)
+
+before closing the file, but why?
+
+Methods:
+
+ lock( file, flags )
+ unlock( file )
+
+Constants:
+
+ LOCK_EX
+ LOCK_SH
+ LOCK_NB
+
+I learned the win32 technique for locking files from sample code
+provided by John Nielsen <nielsenjf at my-deja.com> in the documentation
+that accompanies the win32 modules.
+
+Author: Jonathan Feinberg <jdf at pobox.com>
+Version: $Id: portalocker.py,v 1.3 2001/05/29 18:47:55 Administrator Exp $
+"""
+
+import os
+
+if os.name == 'nt':
+ import win32con
+ import win32file
+ import pywintypes
+ LOCK_EX = win32con.LOCKFILE_EXCLUSIVE_LOCK
+ LOCK_SH = 0 # the default
+ LOCK_NB = win32con.LOCKFILE_FAIL_IMMEDIATELY
+ # is there any reason not to reuse the following structure?
+ __overlapped = pywintypes.OVERLAPPED()
+elif os.name == 'posix':
+ import fcntl
+ LOCK_EX = fcntl.LOCK_EX
+ LOCK_SH = fcntl.LOCK_SH
+ LOCK_NB = fcntl.LOCK_NB
+else:
+ raise RuntimeError("PortaLocker only defined for nt and posix platforms")
+
+if os.name == 'nt':
+ def lock(file, flags):
+ hfile = win32file._get_osfhandle(file.fileno())
+ win32file.LockFileEx(hfile, flags, 0, -0x10000, __overlapped)
+
+ def unlock(file):
+ hfile = win32file._get_osfhandle(file.fileno())
+ win32file.UnlockFileEx(hfile, 0, -0x10000, __overlapped)
+
+elif os.name =='posix':
+ def lock(file, flags):
+ fcntl.flock(file.fileno(), flags)
+
+ def unlock(file):
+ fcntl.flock(file.fileno(), fcntl.LOCK_UN)
+
+if __name__ == '__main__':
+ from time import time, strftime, localtime
+ import sys
+ import portalocker
+
+ log = open('log.txt', "a+")
+ portalocker.lock(log, portalocker.LOCK_EX)
+
+ timestamp = strftime("%m/%d/%Y %H:%M:%S\n", localtime(time()))
+ log.write( timestamp )
+
+ print "Wrote lines. Hit enter to release lock."
+ dummy = sys.stdin.readline()
+
+ log.close()
+
Deleted: trunk/lib/venus/planet/vendor/timeoutsocket.py
===================================================================
--- branches/sucs-site/lib/venus/planet/vendor/timeoutsocket.py 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/lib/venus/planet/vendor/timeoutsocket.py 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,424 +0,0 @@
-
-####
-# Copyright 2000,2001 by Timothy O'Malley <timo at alum.mit.edu>
-#
-# All Rights Reserved
-#
-# Permission to use, copy, modify, and distribute this software
-# and its documentation for any purpose and without fee is hereby
-# granted, provided that the above copyright notice appear in all
-# copies and that both that copyright notice and this permission
-# notice appear in supporting documentation, and that the name of
-# Timothy O'Malley not be used in advertising or publicity
-# pertaining to distribution of the software without specific, written
-# prior permission.
-#
-# Timothy O'Malley DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
-# SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
-# AND FITNESS, IN NO EVENT SHALL Timothy O'Malley BE LIABLE FOR
-# ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
-# WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
-# ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
-# PERFORMANCE OF THIS SOFTWARE.
-#
-####
-
-"""Timeout Socket
-
-This module enables a timeout mechanism on all TCP connections. It
-does this by inserting a shim into the socket module. After this module
-has been imported, all socket creation goes through this shim. As a
-result, every TCP connection will support a timeout.
-
-The beauty of this method is that it immediately and transparently
-enables the entire python library to support timeouts on TCP sockets.
-As an example, if you wanted to SMTP connections to have a 20 second
-timeout:
-
- import timeoutsocket
- import smtplib
- timeoutsocket.setDefaultSocketTimeout(20)
-
-
-The timeout applies to the socket functions that normally block on
-execution: read, write, connect, and accept. If any of these
-operations exceeds the specified timeout, the exception Timeout
-will be raised.
-
-The default timeout value is set to None. As a result, importing
-this module does not change the default behavior of a socket. The
-timeout mechanism only activates when the timeout has been set to
-a numeric value. (This behavior mimics the behavior of the
-select.select() function.)
-
-This module implements two classes: TimeoutSocket and TimeoutFile.
-
-The TimeoutSocket class defines a socket-like object that attempts to
-avoid the condition where a socket may block indefinitely. The
-TimeoutSocket class raises a Timeout exception whenever the
-current operation delays too long.
-
-The TimeoutFile class defines a file-like object that uses the TimeoutSocket
-class. When the makefile() method of TimeoutSocket is called, it returns
-an instance of a TimeoutFile.
-
-Each of these objects adds two methods to manage the timeout value:
-
- get_timeout() --> returns the timeout of the socket or file
- set_timeout() --> sets the timeout of the socket or file
-
-
-As an example, one might use the timeout feature to create httplib
-connections that will timeout after 30 seconds:
-
- import timeoutsocket
- import httplib
- H = httplib.HTTP("www.python.org")
- H.sock.set_timeout(30)
-
-Note: When used in this manner, the connect() routine may still
-block because it happens before the timeout is set. To avoid
-this, use the 'timeoutsocket.setDefaultSocketTimeout()' function.
-
-Good Luck!
-
-"""
-
-__version__ = "$Revision: 1.1.1.1 $"
-__author__ = "Timothy O'Malley <timo at alum.mit.edu>"
-
-#
-# Imports
-#
-import select, string
-import socket
-if not hasattr(socket, "_no_timeoutsocket"):
- _socket = socket.socket
-else:
- _socket = socket._no_timeoutsocket
-
-
-#
-# Set up constants to test for Connected and Blocking operations.
-# We delete 'os' and 'errno' to keep our namespace clean(er).
-# Thanks to Alex Martelli and G. Li for the Windows error codes.
-#
-import os
-if os.name == "nt":
- _IsConnected = ( 10022, 10056 )
- _ConnectBusy = ( 10035, )
- _AcceptBusy = ( 10035, )
-else:
- import errno
- _IsConnected = ( errno.EISCONN, )
- _ConnectBusy = ( errno.EINPROGRESS, errno.EALREADY, errno.EWOULDBLOCK )
- _AcceptBusy = ( errno.EAGAIN, errno.EWOULDBLOCK )
- del errno
-del os
-
-
-#
-# Default timeout value for ALL TimeoutSockets
-#
-_DefaultTimeout = None
-def setDefaultSocketTimeout(timeout):
- global _DefaultTimeout
- _DefaultTimeout = timeout
-def getDefaultSocketTimeout():
- return _DefaultTimeout
-
-#
-# Exceptions for socket errors and timeouts
-#
-Error = socket.error
-class Timeout(Exception):
- pass
-
-
-#
-# Factory function
-#
-from socket import AF_INET, SOCK_STREAM
-def timeoutsocket(family=AF_INET, type=SOCK_STREAM, proto=None):
- if family != AF_INET or type != SOCK_STREAM:
- if proto:
- return _socket(family, type, proto)
- else:
- return _socket(family, type)
- return TimeoutSocket( _socket(family, type), _DefaultTimeout )
-# end timeoutsocket
-
-#
-# The TimeoutSocket class definition
-#
-class TimeoutSocket:
- """TimeoutSocket object
- Implements a socket-like object that raises Timeout whenever
- an operation takes too long.
- The definition of 'too long' can be changed using the
- set_timeout() method.
- """
-
- _copies = 0
- _blocking = 1
-
- def __init__(self, sock, timeout):
- self._sock = sock
- self._timeout = timeout
- # end __init__
-
- def __getattr__(self, key):
- return getattr(self._sock, key)
- # end __getattr__
-
- def get_timeout(self):
- return self._timeout
- # end set_timeout
-
- def set_timeout(self, timeout=None):
- self._timeout = timeout
- # end set_timeout
-
- def setblocking(self, blocking):
- self._blocking = blocking
- return self._sock.setblocking(blocking)
- # end set_timeout
-
- def connect_ex(self, addr):
- errcode = 0
- try:
- self.connect(addr)
- except Error, why:
- errcode = why[0]
- return errcode
- # end connect_ex
-
- def connect(self, addr, port=None, dumbhack=None):
- # In case we were called as connect(host, port)
- if port != None: addr = (addr, port)
-
- # Shortcuts
- sock = self._sock
- timeout = self._timeout
- blocking = self._blocking
-
- # First, make a non-blocking call to connect
- try:
- sock.setblocking(0)
- sock.connect(addr)
- sock.setblocking(blocking)
- return
- except Error, why:
- # Set the socket's blocking mode back
- sock.setblocking(blocking)
-
- # If we are not blocking, re-raise
- if not blocking:
- raise
-
- # If we are already connected, then return success.
- # If we got a genuine error, re-raise it.
- errcode = why[0]
- if dumbhack and errcode in _IsConnected:
- return
- elif errcode not in _ConnectBusy:
- raise
-
- # Now, wait for the connect to happen
- # ONLY if dumbhack indicates this is pass number one.
- # If select raises an error, we pass it on.
- # Is this the right behavior?
- if not dumbhack:
- r,w,e = select.select([], [sock], [], timeout)
- if w:
- return self.connect(addr, dumbhack=1)
-
- # If we get here, then we should raise Timeout
- raise Timeout("Attempted connect to %s timed out." % str(addr) )
- # end connect
-
- def accept(self, dumbhack=None):
- # Shortcuts
- sock = self._sock
- timeout = self._timeout
- blocking = self._blocking
-
- # First, make a non-blocking call to accept
- # If we get a valid result, then convert the
- # accept'ed socket into a TimeoutSocket.
- # Be carefult about the blocking mode of ourselves.
- try:
- sock.setblocking(0)
- newsock, addr = sock.accept()
- sock.setblocking(blocking)
- timeoutnewsock = self.__class__(newsock, timeout)
- timeoutnewsock.setblocking(blocking)
- return (timeoutnewsock, addr)
- except Error, why:
- # Set the socket's blocking mode back
- sock.setblocking(blocking)
-
- # If we are not supposed to block, then re-raise
- if not blocking:
- raise
-
- # If we got a genuine error, re-raise it.
- errcode = why[0]
- if errcode not in _AcceptBusy:
- raise
-
- # Now, wait for the accept to happen
- # ONLY if dumbhack indicates this is pass number one.
- # If select raises an error, we pass it on.
- # Is this the right behavior?
- if not dumbhack:
- r,w,e = select.select([sock], [], [], timeout)
- if r:
- return self.accept(dumbhack=1)
-
- # If we get here, then we should raise Timeout
- raise Timeout("Attempted accept timed out.")
- # end accept
-
- def send(self, data, flags=0):
- sock = self._sock
- if self._blocking:
- r,w,e = select.select([],[sock],[], self._timeout)
- if not w:
- raise Timeout("Send timed out")
- return sock.send(data, flags)
- # end send
-
- def recv(self, bufsize, flags=0):
- sock = self._sock
- if self._blocking:
- r,w,e = select.select([sock], [], [], self._timeout)
- if not r:
- raise Timeout("Recv timed out")
- return sock.recv(bufsize, flags)
- # end recv
-
- def makefile(self, flags="r", bufsize=-1):
- self._copies = self._copies +1
- return TimeoutFile(self, flags, bufsize)
- # end makefile
-
- def close(self):
- if self._copies <= 0:
- self._sock.close()
- else:
- self._copies = self._copies -1
- # end close
-
-# end TimeoutSocket
-
-
-class TimeoutFile:
- """TimeoutFile object
- Implements a file-like object on top of TimeoutSocket.
- """
-
- def __init__(self, sock, mode="r", bufsize=4096):
- self._sock = sock
- self._bufsize = 4096
- if bufsize > 0: self._bufsize = bufsize
- if not hasattr(sock, "_inqueue"): self._sock._inqueue = ""
-
- # end __init__
-
- def __getattr__(self, key):
- return getattr(self._sock, key)
- # end __getattr__
-
- def close(self):
- self._sock.close()
- self._sock = None
- # end close
-
- def write(self, data):
- self.send(data)
- # end write
-
- def read(self, size=-1):
- _sock = self._sock
- _bufsize = self._bufsize
- while 1:
- datalen = len(_sock._inqueue)
- if datalen >= size >= 0:
- break
- bufsize = _bufsize
- if size > 0:
- bufsize = min(bufsize, size - datalen )
- buf = self.recv(bufsize)
- if not buf:
- break
- _sock._inqueue = _sock._inqueue + buf
- data = _sock._inqueue
- _sock._inqueue = ""
- if size > 0 and datalen > size:
- _sock._inqueue = data[size:]
- data = data[:size]
- return data
- # end read
-
- def readline(self, size=-1):
- _sock = self._sock
- _bufsize = self._bufsize
- while 1:
- idx = string.find(_sock._inqueue, "\n")
- if idx >= 0:
- break
- datalen = len(_sock._inqueue)
- if datalen >= size >= 0:
- break
- bufsize = _bufsize
- if size > 0:
- bufsize = min(bufsize, size - datalen )
- buf = self.recv(bufsize)
- if not buf:
- break
- _sock._inqueue = _sock._inqueue + buf
-
- data = _sock._inqueue
- _sock._inqueue = ""
- if idx >= 0:
- idx = idx + 1
- _sock._inqueue = data[idx:]
- data = data[:idx]
- elif size > 0 and datalen > size:
- _sock._inqueue = data[size:]
- data = data[:size]
- return data
- # end readline
-
- def readlines(self, sizehint=-1):
- result = []
- data = self.read()
- while data:
- idx = string.find(data, "\n")
- if idx >= 0:
- idx = idx + 1
- result.append( data[:idx] )
- data = data[idx:]
- else:
- result.append( data )
- data = ""
- return result
- # end readlines
-
- def flush(self): pass
-
-# end TimeoutFile
-
-
-#
-# Silently replace the socket() builtin function with
-# our timeoutsocket() definition.
-#
-if not hasattr(socket, "_no_timeoutsocket"):
- socket._no_timeoutsocket = socket.socket
- socket.socket = timeoutsocket
-del socket
-socket = timeoutsocket
-# Finis
Copied: trunk/lib/venus/planet/vendor/timeoutsocket.py (from rev 656, branches/sucs-site/lib/venus/planet/vendor/timeoutsocket.py)
===================================================================
--- trunk/lib/venus/planet/vendor/timeoutsocket.py (rev 0)
+++ trunk/lib/venus/planet/vendor/timeoutsocket.py 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,424 @@
+
+####
+# Copyright 2000,2001 by Timothy O'Malley <timo at alum.mit.edu>
+#
+# All Rights Reserved
+#
+# Permission to use, copy, modify, and distribute this software
+# and its documentation for any purpose and without fee is hereby
+# granted, provided that the above copyright notice appear in all
+# copies and that both that copyright notice and this permission
+# notice appear in supporting documentation, and that the name of
+# Timothy O'Malley not be used in advertising or publicity
+# pertaining to distribution of the software without specific, written
+# prior permission.
+#
+# Timothy O'Malley DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
+# SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+# AND FITNESS, IN NO EVENT SHALL Timothy O'Malley BE LIABLE FOR
+# ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+# WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
+# ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+# PERFORMANCE OF THIS SOFTWARE.
+#
+####
+
+"""Timeout Socket
+
+This module enables a timeout mechanism on all TCP connections. It
+does this by inserting a shim into the socket module. After this module
+has been imported, all socket creation goes through this shim. As a
+result, every TCP connection will support a timeout.
+
+The beauty of this method is that it immediately and transparently
+enables the entire python library to support timeouts on TCP sockets.
+As an example, if you wanted to SMTP connections to have a 20 second
+timeout:
+
+ import timeoutsocket
+ import smtplib
+ timeoutsocket.setDefaultSocketTimeout(20)
+
+
+The timeout applies to the socket functions that normally block on
+execution: read, write, connect, and accept. If any of these
+operations exceeds the specified timeout, the exception Timeout
+will be raised.
+
+The default timeout value is set to None. As a result, importing
+this module does not change the default behavior of a socket. The
+timeout mechanism only activates when the timeout has been set to
+a numeric value. (This behavior mimics the behavior of the
+select.select() function.)
+
+This module implements two classes: TimeoutSocket and TimeoutFile.
+
+The TimeoutSocket class defines a socket-like object that attempts to
+avoid the condition where a socket may block indefinitely. The
+TimeoutSocket class raises a Timeout exception whenever the
+current operation delays too long.
+
+The TimeoutFile class defines a file-like object that uses the TimeoutSocket
+class. When the makefile() method of TimeoutSocket is called, it returns
+an instance of a TimeoutFile.
+
+Each of these objects adds two methods to manage the timeout value:
+
+ get_timeout() --> returns the timeout of the socket or file
+ set_timeout() --> sets the timeout of the socket or file
+
+
+As an example, one might use the timeout feature to create httplib
+connections that will timeout after 30 seconds:
+
+ import timeoutsocket
+ import httplib
+ H = httplib.HTTP("www.python.org")
+ H.sock.set_timeout(30)
+
+Note: When used in this manner, the connect() routine may still
+block because it happens before the timeout is set. To avoid
+this, use the 'timeoutsocket.setDefaultSocketTimeout()' function.
+
+Good Luck!
+
+"""
+
+__version__ = "$Revision: 1.1.1.1 $"
+__author__ = "Timothy O'Malley <timo at alum.mit.edu>"
+
+#
+# Imports
+#
+import select, string
+import socket
+if not hasattr(socket, "_no_timeoutsocket"):
+ _socket = socket.socket
+else:
+ _socket = socket._no_timeoutsocket
+
+
+#
+# Set up constants to test for Connected and Blocking operations.
+# We delete 'os' and 'errno' to keep our namespace clean(er).
+# Thanks to Alex Martelli and G. Li for the Windows error codes.
+#
+import os
+if os.name == "nt":
+ _IsConnected = ( 10022, 10056 )
+ _ConnectBusy = ( 10035, )
+ _AcceptBusy = ( 10035, )
+else:
+ import errno
+ _IsConnected = ( errno.EISCONN, )
+ _ConnectBusy = ( errno.EINPROGRESS, errno.EALREADY, errno.EWOULDBLOCK )
+ _AcceptBusy = ( errno.EAGAIN, errno.EWOULDBLOCK )
+ del errno
+del os
+
+
+#
+# Default timeout value for ALL TimeoutSockets
+#
+_DefaultTimeout = None
+def setDefaultSocketTimeout(timeout):
+ global _DefaultTimeout
+ _DefaultTimeout = timeout
+def getDefaultSocketTimeout():
+ return _DefaultTimeout
+
+#
+# Exceptions for socket errors and timeouts
+#
+Error = socket.error
+class Timeout(Exception):
+ pass
+
+
+#
+# Factory function
+#
+from socket import AF_INET, SOCK_STREAM
+def timeoutsocket(family=AF_INET, type=SOCK_STREAM, proto=None):
+ if family != AF_INET or type != SOCK_STREAM:
+ if proto:
+ return _socket(family, type, proto)
+ else:
+ return _socket(family, type)
+ return TimeoutSocket( _socket(family, type), _DefaultTimeout )
+# end timeoutsocket
+
+#
+# The TimeoutSocket class definition
+#
+class TimeoutSocket:
+ """TimeoutSocket object
+ Implements a socket-like object that raises Timeout whenever
+ an operation takes too long.
+ The definition of 'too long' can be changed using the
+ set_timeout() method.
+ """
+
+ _copies = 0
+ _blocking = 1
+
+ def __init__(self, sock, timeout):
+ self._sock = sock
+ self._timeout = timeout
+ # end __init__
+
+ def __getattr__(self, key):
+ return getattr(self._sock, key)
+ # end __getattr__
+
+ def get_timeout(self):
+ return self._timeout
+ # end set_timeout
+
+ def set_timeout(self, timeout=None):
+ self._timeout = timeout
+ # end set_timeout
+
+ def setblocking(self, blocking):
+ self._blocking = blocking
+ return self._sock.setblocking(blocking)
+ # end set_timeout
+
+ def connect_ex(self, addr):
+ errcode = 0
+ try:
+ self.connect(addr)
+ except Error, why:
+ errcode = why[0]
+ return errcode
+ # end connect_ex
+
+ def connect(self, addr, port=None, dumbhack=None):
+ # In case we were called as connect(host, port)
+ if port != None: addr = (addr, port)
+
+ # Shortcuts
+ sock = self._sock
+ timeout = self._timeout
+ blocking = self._blocking
+
+ # First, make a non-blocking call to connect
+ try:
+ sock.setblocking(0)
+ sock.connect(addr)
+ sock.setblocking(blocking)
+ return
+ except Error, why:
+ # Set the socket's blocking mode back
+ sock.setblocking(blocking)
+
+ # If we are not blocking, re-raise
+ if not blocking:
+ raise
+
+ # If we are already connected, then return success.
+ # If we got a genuine error, re-raise it.
+ errcode = why[0]
+ if dumbhack and errcode in _IsConnected:
+ return
+ elif errcode not in _ConnectBusy:
+ raise
+
+ # Now, wait for the connect to happen
+ # ONLY if dumbhack indicates this is pass number one.
+ # If select raises an error, we pass it on.
+ # Is this the right behavior?
+ if not dumbhack:
+ r,w,e = select.select([], [sock], [], timeout)
+ if w:
+ return self.connect(addr, dumbhack=1)
+
+ # If we get here, then we should raise Timeout
+ raise Timeout("Attempted connect to %s timed out." % str(addr) )
+ # end connect
+
+ def accept(self, dumbhack=None):
+ # Shortcuts
+ sock = self._sock
+ timeout = self._timeout
+ blocking = self._blocking
+
+ # First, make a non-blocking call to accept
+ # If we get a valid result, then convert the
+ # accept'ed socket into a TimeoutSocket.
+ # Be carefult about the blocking mode of ourselves.
+ try:
+ sock.setblocking(0)
+ newsock, addr = sock.accept()
+ sock.setblocking(blocking)
+ timeoutnewsock = self.__class__(newsock, timeout)
+ timeoutnewsock.setblocking(blocking)
+ return (timeoutnewsock, addr)
+ except Error, why:
+ # Set the socket's blocking mode back
+ sock.setblocking(blocking)
+
+ # If we are not supposed to block, then re-raise
+ if not blocking:
+ raise
+
+ # If we got a genuine error, re-raise it.
+ errcode = why[0]
+ if errcode not in _AcceptBusy:
+ raise
+
+ # Now, wait for the accept to happen
+ # ONLY if dumbhack indicates this is pass number one.
+ # If select raises an error, we pass it on.
+ # Is this the right behavior?
+ if not dumbhack:
+ r,w,e = select.select([sock], [], [], timeout)
+ if r:
+ return self.accept(dumbhack=1)
+
+ # If we get here, then we should raise Timeout
+ raise Timeout("Attempted accept timed out.")
+ # end accept
+
+ def send(self, data, flags=0):
+ sock = self._sock
+ if self._blocking:
+ r,w,e = select.select([],[sock],[], self._timeout)
+ if not w:
+ raise Timeout("Send timed out")
+ return sock.send(data, flags)
+ # end send
+
+ def recv(self, bufsize, flags=0):
+ sock = self._sock
+ if self._blocking:
+ r,w,e = select.select([sock], [], [], self._timeout)
+ if not r:
+ raise Timeout("Recv timed out")
+ return sock.recv(bufsize, flags)
+ # end recv
+
+ def makefile(self, flags="r", bufsize=-1):
+ self._copies = self._copies +1
+ return TimeoutFile(self, flags, bufsize)
+ # end makefile
+
+ def close(self):
+ if self._copies <= 0:
+ self._sock.close()
+ else:
+ self._copies = self._copies -1
+ # end close
+
+# end TimeoutSocket
+
+
+class TimeoutFile:
+ """TimeoutFile object
+ Implements a file-like object on top of TimeoutSocket.
+ """
+
+ def __init__(self, sock, mode="r", bufsize=4096):
+ self._sock = sock
+ self._bufsize = 4096
+ if bufsize > 0: self._bufsize = bufsize
+ if not hasattr(sock, "_inqueue"): self._sock._inqueue = ""
+
+ # end __init__
+
+ def __getattr__(self, key):
+ return getattr(self._sock, key)
+ # end __getattr__
+
+ def close(self):
+ self._sock.close()
+ self._sock = None
+ # end close
+
+ def write(self, data):
+ self.send(data)
+ # end write
+
+ def read(self, size=-1):
+ _sock = self._sock
+ _bufsize = self._bufsize
+ while 1:
+ datalen = len(_sock._inqueue)
+ if datalen >= size >= 0:
+ break
+ bufsize = _bufsize
+ if size > 0:
+ bufsize = min(bufsize, size - datalen )
+ buf = self.recv(bufsize)
+ if not buf:
+ break
+ _sock._inqueue = _sock._inqueue + buf
+ data = _sock._inqueue
+ _sock._inqueue = ""
+ if size > 0 and datalen > size:
+ _sock._inqueue = data[size:]
+ data = data[:size]
+ return data
+ # end read
+
+ def readline(self, size=-1):
+ _sock = self._sock
+ _bufsize = self._bufsize
+ while 1:
+ idx = string.find(_sock._inqueue, "\n")
+ if idx >= 0:
+ break
+ datalen = len(_sock._inqueue)
+ if datalen >= size >= 0:
+ break
+ bufsize = _bufsize
+ if size > 0:
+ bufsize = min(bufsize, size - datalen )
+ buf = self.recv(bufsize)
+ if not buf:
+ break
+ _sock._inqueue = _sock._inqueue + buf
+
+ data = _sock._inqueue
+ _sock._inqueue = ""
+ if idx >= 0:
+ idx = idx + 1
+ _sock._inqueue = data[idx:]
+ data = data[:idx]
+ elif size > 0 and datalen > size:
+ _sock._inqueue = data[size:]
+ data = data[:size]
+ return data
+ # end readline
+
+ def readlines(self, sizehint=-1):
+ result = []
+ data = self.read()
+ while data:
+ idx = string.find(data, "\n")
+ if idx >= 0:
+ idx = idx + 1
+ result.append( data[:idx] )
+ data = data[idx:]
+ else:
+ result.append( data )
+ data = ""
+ return result
+ # end readlines
+
+ def flush(self): pass
+
+# end TimeoutFile
+
+
+#
+# Silently replace the socket() builtin function with
+# our timeoutsocket() definition.
+#
+if not hasattr(socket, "_no_timeoutsocket"):
+ socket._no_timeoutsocket = socket.socket
+ socket.socket = timeoutsocket
+del socket
+socket = timeoutsocket
+# Finis
Deleted: trunk/lib/venus/planet.py
===================================================================
--- branches/sucs-site/lib/venus/planet.py 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/lib/venus/planet.py 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,72 +0,0 @@
-#!/usr/bin/env python
-"""The Planet aggregator.
-
-A flexible and easy-to-use aggregator for generating websites.
-
-Visit http://www.planetplanet.org/ for more information and to download
-the latest version.
-
-Requires Python 2.1, recommends 2.3.
-"""
-
-__authors__ = [ "Scott James Remnant <scott at netsplit.com>",
- "Jeff Waugh <jdub at perkypants.org>" ]
-__license__ = "Python"
-
-
-import os, sys
-
-if __name__ == "__main__":
- config_file = "config.ini"
- offline = 0
- verbose = 0
- only_if_new = 0
- expunge = 0
-
- for arg in sys.argv[1:]:
- if arg == "-h" or arg == "--help":
- print "Usage: planet [options] [CONFIGFILE]"
- print
- print "Options:"
- print " -v, --verbose DEBUG level logging during update"
- print " -o, --offline Update the Planet from the cache only"
- print " -h, --help Display this help message and exit"
- print " -n, --only-if-new Only spider new feeds"
- print " -x, --expunge Expunge old entries from cache"
- print
- sys.exit(0)
- elif arg == "-v" or arg == "--verbose":
- verbose = 1
- elif arg == "-o" or arg == "--offline":
- offline = 1
- elif arg == "-n" or arg == "--only-if-new":
- only_if_new = 1
- elif arg == "-x" or arg == "--expunge":
- expunge = 1
- elif arg.startswith("-"):
- print >>sys.stderr, "Unknown option:", arg
- sys.exit(1)
- else:
- config_file = arg
-
- from planet import config
- config.load(config_file)
-
- if verbose:
- import planet
- planet.getLogger('DEBUG',config.log_format())
-
- if not offline:
- from planet import spider
- try:
- spider.spiderPlanet(only_if_new=only_if_new)
- except Exception, e:
- print e
-
- from planet import splice
- doc = splice.splice()
- splice.apply(doc.toxml('utf-8'))
-
- if expunge:
- from planet import expunge
- expunge.expungeCache
Copied: trunk/lib/venus/planet.py (from rev 656, branches/sucs-site/lib/venus/planet.py)
===================================================================
--- trunk/lib/venus/planet.py (rev 0)
+++ trunk/lib/venus/planet.py 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,72 @@
+#!/usr/bin/env python
+"""The Planet aggregator.
+
+A flexible and easy-to-use aggregator for generating websites.
+
+Visit http://www.planetplanet.org/ for more information and to download
+the latest version.
+
+Requires Python 2.1, recommends 2.3.
+"""
+
+__authors__ = [ "Scott James Remnant <scott at netsplit.com>",
+ "Jeff Waugh <jdub at perkypants.org>" ]
+__license__ = "Python"
+
+
+import os, sys
+
+if __name__ == "__main__":
+ config_file = "config.ini"
+ offline = 0
+ verbose = 0
+ only_if_new = 0
+ expunge = 0
+
+ for arg in sys.argv[1:]:
+ if arg == "-h" or arg == "--help":
+ print "Usage: planet [options] [CONFIGFILE]"
+ print
+ print "Options:"
+ print " -v, --verbose DEBUG level logging during update"
+ print " -o, --offline Update the Planet from the cache only"
+ print " -h, --help Display this help message and exit"
+ print " -n, --only-if-new Only spider new feeds"
+ print " -x, --expunge Expunge old entries from cache"
+ print
+ sys.exit(0)
+ elif arg == "-v" or arg == "--verbose":
+ verbose = 1
+ elif arg == "-o" or arg == "--offline":
+ offline = 1
+ elif arg == "-n" or arg == "--only-if-new":
+ only_if_new = 1
+ elif arg == "-x" or arg == "--expunge":
+ expunge = 1
+ elif arg.startswith("-"):
+ print >>sys.stderr, "Unknown option:", arg
+ sys.exit(1)
+ else:
+ config_file = arg
+
+ from planet import config
+ config.load(config_file)
+
+ if verbose:
+ import planet
+ planet.getLogger('DEBUG',config.log_format())
+
+ if not offline:
+ from planet import spider
+ try:
+ spider.spiderPlanet(only_if_new=only_if_new)
+ except Exception, e:
+ print e
+
+ from planet import splice
+ doc = splice.splice()
+ splice.apply(doc.toxml('utf-8'))
+
+ if expunge:
+ from planet import expunge
+ expunge.expungeCache
Deleted: trunk/lib/venus/spider.py
===================================================================
--- branches/sucs-site/lib/venus/spider.py 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/lib/venus/spider.py 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,22 +0,0 @@
-#!/usr/bin/env python
-"""
-Main program to run just the spider portion of planet
-"""
-
-import sys
-from planet import spider, config
-
-if __name__ == '__main__':
-
- config.load(sys.argv[1])
-
- if len(sys.argv) == 2:
- # spider all feeds
- spider.spiderPlanet()
- elif len(sys.argv) > 2:
- # spider selected feeds
- for feed in sys.argv[2:]:
- spider.spiderFeed(feed)
- else:
- print "Usage:"
- print " python %s config.ini [URI URI ...]" % sys.argv[0]
Copied: trunk/lib/venus/spider.py (from rev 656, branches/sucs-site/lib/venus/spider.py)
===================================================================
--- trunk/lib/venus/spider.py (rev 0)
+++ trunk/lib/venus/spider.py 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,22 @@
+#!/usr/bin/env python
+"""
+Main program to run just the spider portion of planet
+"""
+
+import sys
+from planet import spider, config
+
+if __name__ == '__main__':
+
+ config.load(sys.argv[1])
+
+ if len(sys.argv) == 2:
+ # spider all feeds
+ spider.spiderPlanet()
+ elif len(sys.argv) > 2:
+ # spider selected feeds
+ for feed in sys.argv[2:]:
+ spider.spiderFeed(feed)
+ else:
+ print "Usage:"
+ print " python %s config.ini [URI URI ...]" % sys.argv[0]
Deleted: trunk/lib/venus/splice.py
===================================================================
--- branches/sucs-site/lib/venus/splice.py 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/lib/venus/splice.py 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,18 +0,0 @@
-#!/usr/bin/env python
-"""
-Main program to run just the splice portion of planet
-"""
-
-import os.path
-import sys
-from planet import splice, config
-
-if __name__ == '__main__':
-
- if len(sys.argv) == 2 and os.path.isfile(sys.argv[1]):
- config.load(sys.argv[1])
- doc = splice.splice()
- splice.apply(doc.toxml('utf-8'))
- else:
- print "Usage:"
- print " python %s config.ini" % sys.argv[0]
Copied: trunk/lib/venus/splice.py (from rev 656, branches/sucs-site/lib/venus/splice.py)
===================================================================
--- trunk/lib/venus/splice.py (rev 0)
+++ trunk/lib/venus/splice.py 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,18 @@
+#!/usr/bin/env python
+"""
+Main program to run just the splice portion of planet
+"""
+
+import os.path
+import sys
+from planet import splice, config
+
+if __name__ == '__main__':
+
+ if len(sys.argv) == 2 and os.path.isfile(sys.argv[1]):
+ config.load(sys.argv[1])
+ doc = splice.splice()
+ splice.apply(doc.toxml('utf-8'))
+ else:
+ print "Usage:"
+ print " python %s config.ini" % sys.argv[0]
Deleted: trunk/lib/venus/sucs/Planet.txt.tmpl
===================================================================
--- branches/sucs-site/lib/venus/sucs/Planet.txt.tmpl 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/lib/venus/sucs/Planet.txt.tmpl 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,24 +0,0 @@
-
-<div class="content">
-<TMPL_LOOP Items>
- <div class="box">
- <div class="boxhead">
-<TMPL_IF title>
- <h3><a href="<TMPL_VAR link ESCAPE="HTML">"><TMPL_VAR title></a></h3>
- </div>
- <div class="boxcontent">
-<TMPL_IF channel_face>
- <img class="emblem" src="/pictures/people/<TMPL_VAR channel_face ESCAPE="HTML">" width="<TMPL_VAR channel_facewidth ESCAPE="HTML">" height="<TMPL_VAR channel_faceheight ESCAPE="HTML">" alt="" />
-</TMPL_IF>
-</TMPL_IF>
- <div class="entry">
- <div>
-<TMPL_VAR content>
- </div>
- </div>
- <div class="clear"></div>
- </div>
- <div class="boxfoot"><p>Posted by <a href="<TMPL_VAR channel_link ESCAPE="HTML">" title="<TMPL_VAR channel_title ESCAPE="HTML">"><TMPL_VAR channel_name></a> on <TMPL_VAR date></p></div>
- </div>
-</TMPL_LOOP>
-</div>
Copied: trunk/lib/venus/sucs/Planet.txt.tmpl (from rev 656, branches/sucs-site/lib/venus/sucs/Planet.txt.tmpl)
===================================================================
--- trunk/lib/venus/sucs/Planet.txt.tmpl (rev 0)
+++ trunk/lib/venus/sucs/Planet.txt.tmpl 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,24 @@
+
+<div class="content">
+<TMPL_LOOP Items>
+ <div class="box">
+ <div class="boxhead">
+<TMPL_IF title>
+ <h3><a href="<TMPL_VAR link ESCAPE="HTML">"><TMPL_VAR title></a></h3>
+ </div>
+ <div class="boxcontent">
+<TMPL_IF channel_face>
+ <img class="emblem" src="/pictures/people/<TMPL_VAR channel_face ESCAPE="HTML">" width="<TMPL_VAR channel_facewidth ESCAPE="HTML">" height="<TMPL_VAR channel_faceheight ESCAPE="HTML">" alt="" />
+</TMPL_IF>
+</TMPL_IF>
+ <div class="entry">
+ <div>
+<TMPL_VAR content>
+ </div>
+ </div>
+ <div class="clear"></div>
+ </div>
+ <div class="boxfoot"><p>Posted by <a href="<TMPL_VAR channel_link ESCAPE="HTML">" title="<TMPL_VAR channel_title ESCAPE="HTML">"><TMPL_VAR channel_name></a> on <TMPL_VAR date></p></div>
+ </div>
+</TMPL_LOOP>
+</div>
Deleted: trunk/lib/venus/sucs/atom.xml.tmpl
===================================================================
--- branches/sucs-site/lib/venus/sucs/atom.xml.tmpl 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/lib/venus/sucs/atom.xml.tmpl 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,47 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<feed xmlns="http://www.w3.org/2005/Atom">
-
- <title><TMPL_VAR name></title>
- <link rel="self" href="<TMPL_VAR feed ESCAPE="HTML">"/>
- <link href="<TMPL_VAR link ESCAPE="HTML">"/>
- <id><TMPL_VAR feed ESCAPE="HTML"></id>
- <updated><TMPL_VAR date_iso></updated>
- <generator uri="http://www.planetplanet.org/"><TMPL_VAR generator ESCAPE="HTML"></generator>
-
-<TMPL_LOOP Items>
- <entry<TMPL_IF channel_language> xml:lang="<TMPL_VAR channel_language>"</TMPL_IF>>
- <title type="html"<TMPL_IF title_language> xml:lang="<TMPL_VAR title_language>"</TMPL_IF>><TMPL_VAR title ESCAPE="HTML"></title>
- <link href="<TMPL_VAR link ESCAPE="HTML">"/>
- <id><TMPL_VAR id ESCAPE="HTML"></id>
- <updated><TMPL_VAR date_iso></updated>
- <content type="html"<TMPL_IF content_language> xml:lang="<TMPL_VAR content_language>"</TMPL_IF>><TMPL_VAR content ESCAPE="HTML"></content>
- <author>
- <name><TMPL_VAR channel_name ESCAPE="HTML"></name>
- <uri><TMPL_VAR channel_link ESCAPE="HTML"></uri>
- </author>
- <source>
-<TMPL_IF channel_title>
- <title type="html"><TMPL_VAR channel_title ESCAPE="HTML"></title>
-<TMPL_ELSE>
- <title type="html"><TMPL_VAR channel_name ESCAPE="HTML"></title>
-</TMPL_IF>
-<TMPL_IF channel_subtitle>
- <subtitle type="html"><TMPL_VAR channel_subtitle ESCAPE="HTML"></subtitle>
-</TMPL_IF>
- <link rel="self" href="<TMPL_VAR channel_url ESCAPE="HTML">"/>
-<TMPL_IF channel_id>
- <id><TMPL_VAR channel_id ESCAPE="HTML"></id>
-<TMPL_ELSE>
- <id><TMPL_VAR channel_url ESCAPE="HTML"></id>
-</TMPL_IF>
-<TMPL_IF channel_updated_iso>
- <updated><TMPL_VAR channel_updated_iso></updated>
-</TMPL_IF>
-<TMPL_IF channel_rights>
- <rights type="html"><TMPL_VAR channel_rights ESCAPE="HTML"></rights>
-</TMPL_IF>
- </source>
- </entry>
-
-</TMPL_LOOP>
-</feed>
Copied: trunk/lib/venus/sucs/atom.xml.tmpl (from rev 656, branches/sucs-site/lib/venus/sucs/atom.xml.tmpl)
===================================================================
--- trunk/lib/venus/sucs/atom.xml.tmpl (rev 0)
+++ trunk/lib/venus/sucs/atom.xml.tmpl 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<feed xmlns="http://www.w3.org/2005/Atom">
+
+ <title><TMPL_VAR name></title>
+ <link rel="self" href="<TMPL_VAR feed ESCAPE="HTML">"/>
+ <link href="<TMPL_VAR link ESCAPE="HTML">"/>
+ <id><TMPL_VAR feed ESCAPE="HTML"></id>
+ <updated><TMPL_VAR date_iso></updated>
+ <generator uri="http://www.planetplanet.org/"><TMPL_VAR generator ESCAPE="HTML"></generator>
+
+<TMPL_LOOP Items>
+ <entry<TMPL_IF channel_language> xml:lang="<TMPL_VAR channel_language>"</TMPL_IF>>
+ <title type="html"<TMPL_IF title_language> xml:lang="<TMPL_VAR title_language>"</TMPL_IF>><TMPL_VAR title ESCAPE="HTML"></title>
+ <link href="<TMPL_VAR link ESCAPE="HTML">"/>
+ <id><TMPL_VAR id ESCAPE="HTML"></id>
+ <updated><TMPL_VAR date_iso></updated>
+ <content type="html"<TMPL_IF content_language> xml:lang="<TMPL_VAR content_language>"</TMPL_IF>><TMPL_VAR content ESCAPE="HTML"></content>
+ <author>
+ <name><TMPL_VAR channel_name ESCAPE="HTML"></name>
+ <uri><TMPL_VAR channel_link ESCAPE="HTML"></uri>
+ </author>
+ <source>
+<TMPL_IF channel_title>
+ <title type="html"><TMPL_VAR channel_title ESCAPE="HTML"></title>
+<TMPL_ELSE>
+ <title type="html"><TMPL_VAR channel_name ESCAPE="HTML"></title>
+</TMPL_IF>
+<TMPL_IF channel_subtitle>
+ <subtitle type="html"><TMPL_VAR channel_subtitle ESCAPE="HTML"></subtitle>
+</TMPL_IF>
+ <link rel="self" href="<TMPL_VAR channel_url ESCAPE="HTML">"/>
+<TMPL_IF channel_id>
+ <id><TMPL_VAR channel_id ESCAPE="HTML"></id>
+<TMPL_ELSE>
+ <id><TMPL_VAR channel_url ESCAPE="HTML"></id>
+</TMPL_IF>
+<TMPL_IF channel_updated_iso>
+ <updated><TMPL_VAR channel_updated_iso></updated>
+</TMPL_IF>
+<TMPL_IF channel_rights>
+ <rights type="html"><TMPL_VAR channel_rights ESCAPE="HTML"></rights>
+</TMPL_IF>
+ </source>
+ </entry>
+
+</TMPL_LOOP>
+</feed>
Deleted: trunk/lib/venus/sucs/foafroll.xml.tmpl
===================================================================
--- branches/sucs-site/lib/venus/sucs/foafroll.xml.tmpl 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/lib/venus/sucs/foafroll.xml.tmpl 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,31 +0,0 @@
-<?xml version="1.0"?>
-<rdf:RDF
- xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
- xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
- xmlns:foaf="http://xmlns.com/foaf/0.1/"
- xmlns:rss="http://purl.org/rss/1.0/"
- xmlns:dc="http://purl.org/dc/elements/1.1/"
->
-<foaf:Group>
- <foaf:name><TMPL_VAR name ESCAPE="HTML"></foaf:name>
- <foaf:homepage><TMPL_VAR link ESCAPE="HTML"></foaf:homepage>
- <rdfs:seeAlso rdf:resource="<TMPL_VAR url ESCAPE="HTML">" />
-
-<TMPL_LOOP Channels>
- <foaf:member>
- <foaf:Agent>
- <foaf:name><TMPL_VAR name ESCAPE="HTML"></foaf:name>
- <foaf:weblog>
- <foaf:Document rdf:about="<TMPL_VAR link ESCAPE="HTML">">
- <dc:title><TMPL_VAR title_plain ESCAPE="HTML"></dc:title>
- <rdfs:seeAlso>
- <rss:channel rdf:about="<TMPL_VAR url ESCAPE="HTML">" />
- </rdfs:seeAlso>
- </foaf:Document>
- </foaf:weblog>
- </foaf:Agent>
- </foaf:member>
-</TMPL_LOOP>
-
-</foaf:Group>
-</rdf:RDF>
Copied: trunk/lib/venus/sucs/foafroll.xml.tmpl (from rev 656, branches/sucs-site/lib/venus/sucs/foafroll.xml.tmpl)
===================================================================
--- trunk/lib/venus/sucs/foafroll.xml.tmpl (rev 0)
+++ trunk/lib/venus/sucs/foafroll.xml.tmpl 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,31 @@
+<?xml version="1.0"?>
+<rdf:RDF
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
+ xmlns:foaf="http://xmlns.com/foaf/0.1/"
+ xmlns:rss="http://purl.org/rss/1.0/"
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+>
+<foaf:Group>
+ <foaf:name><TMPL_VAR name ESCAPE="HTML"></foaf:name>
+ <foaf:homepage><TMPL_VAR link ESCAPE="HTML"></foaf:homepage>
+ <rdfs:seeAlso rdf:resource="<TMPL_VAR url ESCAPE="HTML">" />
+
+<TMPL_LOOP Channels>
+ <foaf:member>
+ <foaf:Agent>
+ <foaf:name><TMPL_VAR name ESCAPE="HTML"></foaf:name>
+ <foaf:weblog>
+ <foaf:Document rdf:about="<TMPL_VAR link ESCAPE="HTML">">
+ <dc:title><TMPL_VAR title_plain ESCAPE="HTML"></dc:title>
+ <rdfs:seeAlso>
+ <rss:channel rdf:about="<TMPL_VAR url ESCAPE="HTML">" />
+ </rdfs:seeAlso>
+ </foaf:Document>
+ </foaf:weblog>
+ </foaf:Agent>
+ </foaf:member>
+</TMPL_LOOP>
+
+</foaf:Group>
+</rdf:RDF>
Deleted: trunk/lib/venus/sucs/opml.xml.tmpl
===================================================================
--- branches/sucs-site/lib/venus/sucs/opml.xml.tmpl 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/lib/venus/sucs/opml.xml.tmpl 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,15 +0,0 @@
-<?xml version="1.0"?>
-<opml version="1.1">
- <head>
- <title><TMPL_VAR name ESCAPE="HTML"></title>
- <dateModified><TMPL_VAR date_822></dateModified>
- <ownerName><TMPL_VAR owner_name></ownerName>
- <ownerEmail><TMPL_VAR owner_email></ownerEmail>
- </head>
-
- <body>
- <TMPL_LOOP Channels>
- <outline type="rss" text="<TMPL_VAR name ESCAPE="HTML">" xmlUrl="<TMPL_VAR url ESCAPE="HTML">" title="<TMPL_IF title><TMPL_VAR title ESCAPE="HTML"></TMPL_IF><TMPL_UNLESS title><TMPL_VAR name ESCAPE="HTML"></TMPL_UNLESS>"<TMPL_IF channel_link> htmlUrl="<TMPL_VAR channel_link ESCAPE="HTML">"</TMPL_IF> />
- </TMPL_LOOP>
- </body>
-</opml>
Copied: trunk/lib/venus/sucs/opml.xml.tmpl (from rev 656, branches/sucs-site/lib/venus/sucs/opml.xml.tmpl)
===================================================================
--- trunk/lib/venus/sucs/opml.xml.tmpl (rev 0)
+++ trunk/lib/venus/sucs/opml.xml.tmpl 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,15 @@
+<?xml version="1.0"?>
+<opml version="1.1">
+ <head>
+ <title><TMPL_VAR name ESCAPE="HTML"></title>
+ <dateModified><TMPL_VAR date_822></dateModified>
+ <ownerName><TMPL_VAR owner_name></ownerName>
+ <ownerEmail><TMPL_VAR owner_email></ownerEmail>
+ </head>
+
+ <body>
+ <TMPL_LOOP Channels>
+ <outline type="rss" text="<TMPL_VAR name ESCAPE="HTML">" xmlUrl="<TMPL_VAR url ESCAPE="HTML">" title="<TMPL_IF title><TMPL_VAR title ESCAPE="HTML"></TMPL_IF><TMPL_UNLESS title><TMPL_VAR name ESCAPE="HTML"></TMPL_UNLESS>"<TMPL_IF channel_link> htmlUrl="<TMPL_VAR channel_link ESCAPE="HTML">"</TMPL_IF> />
+ </TMPL_LOOP>
+ </body>
+</opml>
Deleted: trunk/lib/venus/sucs/rss10.xml.tmpl
===================================================================
--- branches/sucs-site/lib/venus/sucs/rss10.xml.tmpl 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/lib/venus/sucs/rss10.xml.tmpl 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,37 +0,0 @@
-<?xml version="1.0"?>
-<rdf:RDF
- xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
- xmlns:dc="http://purl.org/dc/elements/1.1/"
- xmlns:foaf="http://xmlns.com/foaf/0.1/"
- xmlns:content="http://purl.org/rss/1.0/modules/content/"
- xmlns="http://purl.org/rss/1.0/"
->
-<channel rdf:about="<TMPL_VAR link ESCAPE="HTML">">
- <title><TMPL_VAR name ESCAPE="HTML"></title>
- <link><TMPL_VAR link ESCAPE="HTML"></link>
- <description><TMPL_VAR name ESCAPE="HTML"> - <TMPL_VAR link ESCAPE="HTML"></description>
-
- <items>
- <rdf:Seq>
-<TMPL_LOOP Items>
- <rdf:li rdf:resource="<TMPL_VAR id ESCAPE="HTML">" />
-</TMPL_LOOP>
- </rdf:Seq>
- </items>
-</channel>
-
-<TMPL_LOOP Items>
-<item rdf:about="<TMPL_VAR id ESCAPE="HTML">">
- <title><TMPL_VAR channel_name ESCAPE="HTML"><TMPL_IF title>: <TMPL_VAR title_plain ESCAPE="HTML"></TMPL_IF></title>
- <link><TMPL_VAR link ESCAPE="HTML"></link>
- <TMPL_IF content>
- <content:encoded><TMPL_VAR content ESCAPE="HTML"></content:encoded>
- </TMPL_IF>
- <dc:date><TMPL_VAR date_iso></dc:date>
- <TMPL_IF author_name>
- <dc:creator><TMPL_VAR author_name></dc:creator>
- </TMPL_IF>
-</item>
-</TMPL_LOOP>
-
-</rdf:RDF>
Copied: trunk/lib/venus/sucs/rss10.xml.tmpl (from rev 656, branches/sucs-site/lib/venus/sucs/rss10.xml.tmpl)
===================================================================
--- trunk/lib/venus/sucs/rss10.xml.tmpl (rev 0)
+++ trunk/lib/venus/sucs/rss10.xml.tmpl 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,37 @@
+<?xml version="1.0"?>
+<rdf:RDF
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:foaf="http://xmlns.com/foaf/0.1/"
+ xmlns:content="http://purl.org/rss/1.0/modules/content/"
+ xmlns="http://purl.org/rss/1.0/"
+>
+<channel rdf:about="<TMPL_VAR link ESCAPE="HTML">">
+ <title><TMPL_VAR name ESCAPE="HTML"></title>
+ <link><TMPL_VAR link ESCAPE="HTML"></link>
+ <description><TMPL_VAR name ESCAPE="HTML"> - <TMPL_VAR link ESCAPE="HTML"></description>
+
+ <items>
+ <rdf:Seq>
+<TMPL_LOOP Items>
+ <rdf:li rdf:resource="<TMPL_VAR id ESCAPE="HTML">" />
+</TMPL_LOOP>
+ </rdf:Seq>
+ </items>
+</channel>
+
+<TMPL_LOOP Items>
+<item rdf:about="<TMPL_VAR id ESCAPE="HTML">">
+ <title><TMPL_VAR channel_name ESCAPE="HTML"><TMPL_IF title>: <TMPL_VAR title_plain ESCAPE="HTML"></TMPL_IF></title>
+ <link><TMPL_VAR link ESCAPE="HTML"></link>
+ <TMPL_IF content>
+ <content:encoded><TMPL_VAR content ESCAPE="HTML"></content:encoded>
+ </TMPL_IF>
+ <dc:date><TMPL_VAR date_iso></dc:date>
+ <TMPL_IF author_name>
+ <dc:creator><TMPL_VAR author_name></dc:creator>
+ </TMPL_IF>
+</item>
+</TMPL_LOOP>
+
+</rdf:RDF>
Deleted: trunk/lib/venus/sucs/rss20.xml.tmpl
===================================================================
--- branches/sucs-site/lib/venus/sucs/rss20.xml.tmpl 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/lib/venus/sucs/rss20.xml.tmpl 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,33 +0,0 @@
-<?xml version="1.0"?>
-<rss version="2.0">
-
-<channel>
- <title><TMPL_VAR name></title>
- <link><TMPL_VAR link ESCAPE="HTML"></link>
- <language>en</language>
- <description><TMPL_VAR name ESCAPE="HTML"> - <TMPL_VAR link ESCAPE="HTML"></description>
-
-<TMPL_LOOP Items>
-<item>
- <title><TMPL_VAR channel_name ESCAPE="HTML"><TMPL_IF title>: <TMPL_VAR title_plain ESCAPE="HTML"></TMPL_IF></title>
- <guid><TMPL_VAR id ESCAPE="HTML"></guid>
- <link><TMPL_VAR link ESCAPE="HTML"></link>
- <TMPL_IF content>
- <description>
- <TMPL_IF channel_face>
- <img align="right" style="float:right" src="http://sucs.org/pictures/people/<TMPL_VAR channel_face ESCAPE="HTML">" alt="" />
- </TMPL_IF><TMPL_VAR content ESCAPE="HTML"></description>
- </TMPL_IF>
- <pubDate><TMPL_VAR date_822></pubDate>
- <TMPL_IF author_email>
- <TMPL_IF author_name>
- <author><TMPL_VAR author_email> (<TMPL_VAR author_name>)</author>
- <TMPL_ELSE>
- <author><TMPL_VAR author_email></author>
- </TMPL_IF>
- </TMPL_IF>
-</item>
-</TMPL_LOOP>
-
-</channel>
-</rss>
Copied: trunk/lib/venus/sucs/rss20.xml.tmpl (from rev 656, branches/sucs-site/lib/venus/sucs/rss20.xml.tmpl)
===================================================================
--- trunk/lib/venus/sucs/rss20.xml.tmpl (rev 0)
+++ trunk/lib/venus/sucs/rss20.xml.tmpl 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,33 @@
+<?xml version="1.0"?>
+<rss version="2.0">
+
+<channel>
+ <title><TMPL_VAR name></title>
+ <link><TMPL_VAR link ESCAPE="HTML"></link>
+ <language>en</language>
+ <description><TMPL_VAR name ESCAPE="HTML"> - <TMPL_VAR link ESCAPE="HTML"></description>
+
+<TMPL_LOOP Items>
+<item>
+ <title><TMPL_VAR channel_name ESCAPE="HTML"><TMPL_IF title>: <TMPL_VAR title_plain ESCAPE="HTML"></TMPL_IF></title>
+ <guid><TMPL_VAR id ESCAPE="HTML"></guid>
+ <link><TMPL_VAR link ESCAPE="HTML"></link>
+ <TMPL_IF content>
+ <description>
+ <TMPL_IF channel_face>
+ <img align="right" style="float:right" src="http://sucs.org/pictures/people/<TMPL_VAR channel_face ESCAPE="HTML">" alt="" />
+ </TMPL_IF><TMPL_VAR content ESCAPE="HTML"></description>
+ </TMPL_IF>
+ <pubDate><TMPL_VAR date_822></pubDate>
+ <TMPL_IF author_email>
+ <TMPL_IF author_name>
+ <author><TMPL_VAR author_email> (<TMPL_VAR author_name>)</author>
+ <TMPL_ELSE>
+ <author><TMPL_VAR author_email></author>
+ </TMPL_IF>
+ </TMPL_IF>
+</item>
+</TMPL_LOOP>
+
+</channel>
+</rss>
Deleted: trunk/lib/venus/themes/asf/config.ini
===================================================================
--- branches/sucs-site/lib/venus/themes/asf/config.ini 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/lib/venus/themes/asf/config.ini 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,21 +0,0 @@
-# This theme is based on the one originally developed by Stefano Mazzocci
-# for planetapache.org, and modified by Sam Ruby for planet.intertwingly.net
-
-[Planet]
-template_files:
- atom.xml.xslt
- foafroll.xml.xslt
- index.html.xslt
- opml.xml.xslt
- validate.html.xslt
-
-template_directories:
- ../common
-
-bill_of_materials:
- default.css
- personalize.js
- images/feed-icon-10x10.png
- images/opml.png
- images/foaf.png
- images/venus.png
Copied: trunk/lib/venus/themes/asf/config.ini (from rev 656, branches/sucs-site/lib/venus/themes/asf/config.ini)
===================================================================
--- trunk/lib/venus/themes/asf/config.ini (rev 0)
+++ trunk/lib/venus/themes/asf/config.ini 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,21 @@
+# This theme is based on the one originally developed by Stefano Mazzocci
+# for planetapache.org, and modified by Sam Ruby for planet.intertwingly.net
+
+[Planet]
+template_files:
+ atom.xml.xslt
+ foafroll.xml.xslt
+ index.html.xslt
+ opml.xml.xslt
+ validate.html.xslt
+
+template_directories:
+ ../common
+
+bill_of_materials:
+ default.css
+ personalize.js
+ images/feed-icon-10x10.png
+ images/opml.png
+ images/foaf.png
+ images/venus.png
Deleted: trunk/lib/venus/themes/asf/default.css
===================================================================
--- branches/sucs-site/lib/venus/themes/asf/default.css 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/lib/venus/themes/asf/default.css 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,533 +0,0 @@
-/*
- * Originally written by Stefano Mazzocchi <stefano at apache dot org>
- * Adapted by Sam Ruby <rubys at intertwingly dot net>
- */
-
-/* ----------------------------- Global Definitions -------------------- */
-
-body {
- margin: 0px;
- padding: 0px;
- color: #222;
- background-color: #fff;
- quotes: "\201C" "\201E" "\2018" "\2019";
-}
-
-a:link {
- color: #222;
-}
-
-a:visited {
- color: #555;
-}
-
-a:hover {
- color: #000;
-}
-
-a:active {
-}
-
-a:focus {
-}
-
-a.inactive {
- color: #558;
-}
-
-a.rising {
- font-weight: bold;
-}
-
-a[rel~='license'] {
- text-decoration: none;
-}
-
-body > h1 {
- font-size: x-large;
- text-transform: uppercase;
- letter-spacing: 0.25em;
- padding: 10px;
- margin: 0px 0px 0px 0px;
- color: #889;
- font-family: Sans-Serif;
- font-weight: bold;
- font-style: italic;
- background-color: #eee;
- border-bottom: 2px solid #ccd;
-}
-
-/* ----------------------------- Sidebar --------------------------- */
-
-#sidebar {
- float: right;
- top: 150px;
- right: 0px;
- width: 210px;
- background-color: white;
-
- padding: 0px 0px 10px 0px;
- margin: 0px 0px 20px 20px;
- border-left: 2px solid #ccd;
- border-bottom: 2px solid #ccd;
- -webkit-border-bottom-left-radius: 1em;
- -moz-border-radius: 0 0 0 1em;
-}
-
-#sidebar h2 {
- letter-spacing: 0.15em;
- text-transform: uppercase;
- font-size: x-small;
- color: #666;
- font-weight: normal;
- padding: 2px 0px 2px 12px;
- margin: 15px 0px 5px 10px;
- border-top: 1px solid #ccc;
- border-left: 1px solid #ccc;
- border-bottom: 1px solid #ccc;
- -webkit-border-top-left-radius: 6px;
- -webkit-border-bottom-left-radius: 6px;
- -moz-border-radius: 6px 0 0 6px;
-}
-
-#sidebar h2 a img {
- margin-bottom: 4px;
- vertical-align: middle;
-}
-
-#sidebar p {
- font-size: x-small;
- padding-left: 20px;
- padding-right: 5px;
-}
-
-#sidebar ul {
- font-family: sans-serif;
- margin-left: 5px;
- padding-left: 25px;
-}
-
-#sidebar li {
- margin-left: 0px;
- text-indent: -15px;
- list-style-type: none;
- font-size: x-small;
-}
-
-#sidebar ul li a {
- text-decoration: none;
-}
-
-#sidebar ul li a:hover {
- text-decoration: underline;
-}
-
-#sidebar ul li a:visited {
- color: #000;
-}
-
-#sidebar ul li ul {
- display: none;
-}
-
-#sidebar ul li {
- position: relative;
-}
-
-#sidebar ul li:hover ul {
- background-color: #EEE;
- -webkit-border-radius: 0.5em;
- -moz-border-radius: 0.5em;
- border: 2px solid #BBB;
- color:#000;
- display: block;
- margin-left: -300px;
- margin-right: 115px;
- padding: 10px;
- padding-left: 25px;
- position: absolute;
- right: 80px;
- top: -12px;
- z-index: 1;
-}
-
-#sidebar img {
- margin-top: 2px;
- border: 0;
-}
-
-#sidebar dl {
- font-size: x-small;
- padding-left: 1.0em;
-}
-
-#sidebar dl ul {
- padding-left: 1em;
-}
-
-#sidebar dt {
- margin-top: 1em;
- font-weight: bold;
- padding-left: 1.0em;
-}
-
-#sidebar dd {
- margin-left: 2.5em;
-}
-
-#sidebar .message {
- cursor: help;
- border-bottom: 1px dashed red;
-}
-
-#sidebar a.message:hover {
- cursor: help;
- background-color: #ffD0D0;
- border: 1px dashed red !important;
- text-decoration: none !important;
-}
-
-#sidebar input[name=q] {
- padding-left: 0.5em;
- border: 1px solid #ccd;
- -webkit-border-radius: 0.8em;
- -moz-border-radius: 0.8em;
- width: 12.5em;
- margin: 4px 0 0 24px;
-}
-
-/* ---------------------------- Footer --------------------------- */
-
-#footer ul {
- margin: 0 20px 0 -25px;
- padding: 0;
-}
-
-#footer li {
- margin: 0;
- padding: 0;
- list-style: none;
- display: inline;
-}
-
-#footer ul li ul {
- display: none;
-}
-
-#footer img {
- display: none;
-}
-
-/* ----------------------------- Body ---------------------------- */
-
-#body {
- margin-top: 10px;
- margin-right: 210px;
-}
-
-.admin {
- text-align: right;
-}
-
-#body > h2 {
- float: right;
- min-width: 25%;
- -webkit-border-top-left-radius: 0.5em;
- -webkit-border-bottom-left-radius: 0.5em;
- -moz-border-radius: 0.5em 0 0 0.5em;
- text-transform: none;
- font-size: medium;
- color: #667;
- font-weight: bold;
- text-align: center;
- border: 2px solid #ccd;
- background-color: #eee;
- padding: 1px 1.5em 1px 1.5em;
- margin: -0.2em -22px 0 0;
-}
-
-/* ----------------------------- News ---------------------------- */
-
-.news {
- margin: 30px 10px 30px 10px;
- clear: left;
-}
-
-.news > h3 {
- text-indent: -10px;
- margin: 12px;
- padding: 0px;
- font-size: medium;
-}
-
-.news > h3 > a:first-child {
- margin-left: 10px
-}
-
-.news > h3 > a:first-child:before {
- content: 'â';
- font-family: Code2000;
- color: #D70;
- margin-left: -18px;
- margin-right: 2px;
- text-decoration: none;
-}
-
-img.icon {
- height: 16px;
- width: 16px;
- margin-left: -8px;
- margin-bottom: -2px;
- margin-right: 3px;
-}
-
-.news .content {
- margin: 5px 5px 5px 15px;
- padding: 0px 5px 0px 5px;
- border-left: 1px solid #ccc;
- line-height: 1.2em;
- font-size: small;
- font-family: sans-serif;
-}
-
-.news .links {
-}
-
-.news .permalink {
- text-align: right;
-}
-
-/* ----------------------------- News Content ---------------------------- */
-
-.news .content p {
- line-height: 1.2em;
-}
-
-.news .content img {
- margin: 5px;
-}
-
-.news .content blockquote {
- margin: 10px 35px 10px 35px;
- padding: 5px;
-}
-
-.news .content pre {
- font-family: monospace;
- font-size: medium;
- font-weight: bold;
- border: 1px solid #ddd;
- padding: 10px;
- margin: 10px 20px 10px 20px;
- background-color: #f8f8f8;
- overflow: auto;
-}
-
-.news .content ul, .news .content ol {
- margin: 5px 35px 5px 35px;
- padding: 5px;
- counter-reset: item;
-}
-
-.news .content ul > ul, .news .content ul > ol, .news .content ol > ul, .news .content ol > ol {
- margin: 0px 0px 0px 35px;
- padding: 0px;
-}
-
-.news .content li {
- padding: 1px;
- line-height: 1.2em;
-}
-
-.news code {
- font-family: monospace;
- font-size: medium;
- font-weight: bold;
-}
-
-.news .content a {
- text-decoration: none;
- color: #000;
- border-bottom: 1px dotted #777;
- margin: 0px 2px 0px 2px;
- padding: 1px 1px 1px 1px;
-}
-
-.news .content a:hover {
- border: 1px dotted #000;
- background-color: #eee;
- padding: 1px 2px 1px 2px;
- margin: 0px;
-}
-
-.news .content a:active {
- background-color: #ccc !important;
- position: relative;
- top: 1px;
- left: 1px;
- padding: 1px 2px 1px 2px;
- margin: 0px;
-}
-
-.news .content a:focus {
- border: 1px solid #fff !important;
- background-color: #ccc !important;
- padding: 1px 2px 1px 2px;
- margin: 0px;
-}
-
-/* --------------------------- Accomodations ----------------------- */
-
-/* boing boing */
-br {
- clear: none !important;
-}
-
-/* engadget */
-p {
- clear: none !important;
-}
-
-/* cadenhead */
-p.sourcecode {
- font-family: monospace;
- font-size: medium;
- font-weight: bold;
- border: 1px solid #ddd;
- padding: 10px;
- margin: 10px 20px 10px 20px;
- background-color: #f8f8f8;
- overflow: auto;
-}
-
-/* cadenhead */
-span.sourcecode {
- font-family: monospace;
- font-size: medium;
- font-weight: bold;
- font-size: large;
- background-color: #f8f8f8;
-}
-
-/* hsivonen */
-ul p, ol p {
- margin-top: 0.3em;
- margin-bottom: 0.3em;
-}
-
-/* programmableweb */
-.imgRight {
- float: right;
-}
-
-/* gizmodo */
-img.left {
- float: left;
-}
-
-/* gizmodo */
-img.right {
- float: right;
-}
-
-/* gizmodo */
-img.center {
- display: block;
- margin-left: auto;
- margin-right: auto;
-}
-
-/* wikipedia */
-table {
- width: auto !important;
-}
-
-/* del.icio.us */
-.delicious-tags {
- font-size: x-small;
- text-align: right;
-}
-
-/* musings */
-img.mathlogo, img.svglogo {
- float: right;
- border: 0;
-}
-
-math {
- white-space: nowrap;
-}
-
-math[display=block] {
- overflow: auto;
-}
-
-.numberedEq span, .eqno {
- float: right;
-}
-
-/* sutor */
-img.post-img-right {
- float:right;
-}
-
-/* niall */
-img.floatright {
- float: right;
-}
-
-/* jason kolb */
-.FeaturedPost > li {
- list-style-type: none;
- background-color: #f8f8f8;
-}
-
-/* Tantek */
-ul.tags,ul.tags li,h4.tags {
- display:inline;
- font-size: x-small
-}
-
-ul.tags a:link, ul.tags a:visited {
- color:green
-}
-
-a[rel='tag'] img {
- border: 0;
-}
-
-/* DiveIntoMark */
-.framed {
- float: none;
-}
-
-/* BurningBird */
-.update:before {
- content: 'Update';
- font-weight: bold;
-}
-
-.update {
- margin: 2em;
- padding: 0 1em 0 1em;
- background: #eee;
- border: 1px solid #aaa;
-}
-
-/* ----------------------------- Footer ---------------------------- */
-
-#footer {
- padding: 0px;
- margin: 30px 0px 50px 50px;
-}
-
-#footer p {
- padding: 2px 2px 2px 5px;
- background-color: #ccc;
- border-top: 1px solid #aaa;
- border-bottom: 1px solid #aaa;
- border-left: 1px solid #aaa;
- letter-spacing: 0.15em;
- text-transform: uppercase;
- text-align: left;
-}
Copied: trunk/lib/venus/themes/asf/default.css (from rev 656, branches/sucs-site/lib/venus/themes/asf/default.css)
===================================================================
--- trunk/lib/venus/themes/asf/default.css (rev 0)
+++ trunk/lib/venus/themes/asf/default.css 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,533 @@
+/*
+ * Originally written by Stefano Mazzocchi <stefano at apache dot org>
+ * Adapted by Sam Ruby <rubys at intertwingly dot net>
+ */
+
+/* ----------------------------- Global Definitions -------------------- */
+
+body {
+ margin: 0px;
+ padding: 0px;
+ color: #222;
+ background-color: #fff;
+ quotes: "\201C" "\201E" "\2018" "\2019";
+}
+
+a:link {
+ color: #222;
+}
+
+a:visited {
+ color: #555;
+}
+
+a:hover {
+ color: #000;
+}
+
+a:active {
+}
+
+a:focus {
+}
+
+a.inactive {
+ color: #558;
+}
+
+a.rising {
+ font-weight: bold;
+}
+
+a[rel~='license'] {
+ text-decoration: none;
+}
+
+body > h1 {
+ font-size: x-large;
+ text-transform: uppercase;
+ letter-spacing: 0.25em;
+ padding: 10px;
+ margin: 0px 0px 0px 0px;
+ color: #889;
+ font-family: Sans-Serif;
+ font-weight: bold;
+ font-style: italic;
+ background-color: #eee;
+ border-bottom: 2px solid #ccd;
+}
+
+/* ----------------------------- Sidebar --------------------------- */
+
+#sidebar {
+ float: right;
+ top: 150px;
+ right: 0px;
+ width: 210px;
+ background-color: white;
+
+ padding: 0px 0px 10px 0px;
+ margin: 0px 0px 20px 20px;
+ border-left: 2px solid #ccd;
+ border-bottom: 2px solid #ccd;
+ -webkit-border-bottom-left-radius: 1em;
+ -moz-border-radius: 0 0 0 1em;
+}
+
+#sidebar h2 {
+ letter-spacing: 0.15em;
+ text-transform: uppercase;
+ font-size: x-small;
+ color: #666;
+ font-weight: normal;
+ padding: 2px 0px 2px 12px;
+ margin: 15px 0px 5px 10px;
+ border-top: 1px solid #ccc;
+ border-left: 1px solid #ccc;
+ border-bottom: 1px solid #ccc;
+ -webkit-border-top-left-radius: 6px;
+ -webkit-border-bottom-left-radius: 6px;
+ -moz-border-radius: 6px 0 0 6px;
+}
+
+#sidebar h2 a img {
+ margin-bottom: 4px;
+ vertical-align: middle;
+}
+
+#sidebar p {
+ font-size: x-small;
+ padding-left: 20px;
+ padding-right: 5px;
+}
+
+#sidebar ul {
+ font-family: sans-serif;
+ margin-left: 5px;
+ padding-left: 25px;
+}
+
+#sidebar li {
+ margin-left: 0px;
+ text-indent: -15px;
+ list-style-type: none;
+ font-size: x-small;
+}
+
+#sidebar ul li a {
+ text-decoration: none;
+}
+
+#sidebar ul li a:hover {
+ text-decoration: underline;
+}
+
+#sidebar ul li a:visited {
+ color: #000;
+}
+
+#sidebar ul li ul {
+ display: none;
+}
+
+#sidebar ul li {
+ position: relative;
+}
+
+#sidebar ul li:hover ul {
+ background-color: #EEE;
+ -webkit-border-radius: 0.5em;
+ -moz-border-radius: 0.5em;
+ border: 2px solid #BBB;
+ color:#000;
+ display: block;
+ margin-left: -300px;
+ margin-right: 115px;
+ padding: 10px;
+ padding-left: 25px;
+ position: absolute;
+ right: 80px;
+ top: -12px;
+ z-index: 1;
+}
+
+#sidebar img {
+ margin-top: 2px;
+ border: 0;
+}
+
+#sidebar dl {
+ font-size: x-small;
+ padding-left: 1.0em;
+}
+
+#sidebar dl ul {
+ padding-left: 1em;
+}
+
+#sidebar dt {
+ margin-top: 1em;
+ font-weight: bold;
+ padding-left: 1.0em;
+}
+
+#sidebar dd {
+ margin-left: 2.5em;
+}
+
+#sidebar .message {
+ cursor: help;
+ border-bottom: 1px dashed red;
+}
+
+#sidebar a.message:hover {
+ cursor: help;
+ background-color: #ffD0D0;
+ border: 1px dashed red !important;
+ text-decoration: none !important;
+}
+
+#sidebar input[name=q] {
+ padding-left: 0.5em;
+ border: 1px solid #ccd;
+ -webkit-border-radius: 0.8em;
+ -moz-border-radius: 0.8em;
+ width: 12.5em;
+ margin: 4px 0 0 24px;
+}
+
+/* ---------------------------- Footer --------------------------- */
+
+#footer ul {
+ margin: 0 20px 0 -25px;
+ padding: 0;
+}
+
+#footer li {
+ margin: 0;
+ padding: 0;
+ list-style: none;
+ display: inline;
+}
+
+#footer ul li ul {
+ display: none;
+}
+
+#footer img {
+ display: none;
+}
+
+/* ----------------------------- Body ---------------------------- */
+
+#body {
+ margin-top: 10px;
+ margin-right: 210px;
+}
+
+.admin {
+ text-align: right;
+}
+
+#body > h2 {
+ float: right;
+ min-width: 25%;
+ -webkit-border-top-left-radius: 0.5em;
+ -webkit-border-bottom-left-radius: 0.5em;
+ -moz-border-radius: 0.5em 0 0 0.5em;
+ text-transform: none;
+ font-size: medium;
+ color: #667;
+ font-weight: bold;
+ text-align: center;
+ border: 2px solid #ccd;
+ background-color: #eee;
+ padding: 1px 1.5em 1px 1.5em;
+ margin: -0.2em -22px 0 0;
+}
+
+/* ----------------------------- News ---------------------------- */
+
+.news {
+ margin: 30px 10px 30px 10px;
+ clear: left;
+}
+
+.news > h3 {
+ text-indent: -10px;
+ margin: 12px;
+ padding: 0px;
+ font-size: medium;
+}
+
+.news > h3 > a:first-child {
+ margin-left: 10px
+}
+
+.news > h3 > a:first-child:before {
+ content: 'â';
+ font-family: Code2000;
+ color: #D70;
+ margin-left: -18px;
+ margin-right: 2px;
+ text-decoration: none;
+}
+
+img.icon {
+ height: 16px;
+ width: 16px;
+ margin-left: -8px;
+ margin-bottom: -2px;
+ margin-right: 3px;
+}
+
+.news .content {
+ margin: 5px 5px 5px 15px;
+ padding: 0px 5px 0px 5px;
+ border-left: 1px solid #ccc;
+ line-height: 1.2em;
+ font-size: small;
+ font-family: sans-serif;
+}
+
+.news .links {
+}
+
+.news .permalink {
+ text-align: right;
+}
+
+/* ----------------------------- News Content ---------------------------- */
+
+.news .content p {
+ line-height: 1.2em;
+}
+
+.news .content img {
+ margin: 5px;
+}
+
+.news .content blockquote {
+ margin: 10px 35px 10px 35px;
+ padding: 5px;
+}
+
+.news .content pre {
+ font-family: monospace;
+ font-size: medium;
+ font-weight: bold;
+ border: 1px solid #ddd;
+ padding: 10px;
+ margin: 10px 20px 10px 20px;
+ background-color: #f8f8f8;
+ overflow: auto;
+}
+
+.news .content ul, .news .content ol {
+ margin: 5px 35px 5px 35px;
+ padding: 5px;
+ counter-reset: item;
+}
+
+.news .content ul > ul, .news .content ul > ol, .news .content ol > ul, .news .content ol > ol {
+ margin: 0px 0px 0px 35px;
+ padding: 0px;
+}
+
+.news .content li {
+ padding: 1px;
+ line-height: 1.2em;
+}
+
+.news code {
+ font-family: monospace;
+ font-size: medium;
+ font-weight: bold;
+}
+
+.news .content a {
+ text-decoration: none;
+ color: #000;
+ border-bottom: 1px dotted #777;
+ margin: 0px 2px 0px 2px;
+ padding: 1px 1px 1px 1px;
+}
+
+.news .content a:hover {
+ border: 1px dotted #000;
+ background-color: #eee;
+ padding: 1px 2px 1px 2px;
+ margin: 0px;
+}
+
+.news .content a:active {
+ background-color: #ccc !important;
+ position: relative;
+ top: 1px;
+ left: 1px;
+ padding: 1px 2px 1px 2px;
+ margin: 0px;
+}
+
+.news .content a:focus {
+ border: 1px solid #fff !important;
+ background-color: #ccc !important;
+ padding: 1px 2px 1px 2px;
+ margin: 0px;
+}
+
+/* --------------------------- Accomodations ----------------------- */
+
+/* boing boing */
+br {
+ clear: none !important;
+}
+
+/* engadget */
+p {
+ clear: none !important;
+}
+
+/* cadenhead */
+p.sourcecode {
+ font-family: monospace;
+ font-size: medium;
+ font-weight: bold;
+ border: 1px solid #ddd;
+ padding: 10px;
+ margin: 10px 20px 10px 20px;
+ background-color: #f8f8f8;
+ overflow: auto;
+}
+
+/* cadenhead */
+span.sourcecode {
+ font-family: monospace;
+ font-size: medium;
+ font-weight: bold;
+ font-size: large;
+ background-color: #f8f8f8;
+}
+
+/* hsivonen */
+ul p, ol p {
+ margin-top: 0.3em;
+ margin-bottom: 0.3em;
+}
+
+/* programmableweb */
+.imgRight {
+ float: right;
+}
+
+/* gizmodo */
+img.left {
+ float: left;
+}
+
+/* gizmodo */
+img.right {
+ float: right;
+}
+
+/* gizmodo */
+img.center {
+ display: block;
+ margin-left: auto;
+ margin-right: auto;
+}
+
+/* wikipedia */
+table {
+ width: auto !important;
+}
+
+/* del.icio.us */
+.delicious-tags {
+ font-size: x-small;
+ text-align: right;
+}
+
+/* musings */
+img.mathlogo, img.svglogo {
+ float: right;
+ border: 0;
+}
+
+math {
+ white-space: nowrap;
+}
+
+math[display=block] {
+ overflow: auto;
+}
+
+.numberedEq span, .eqno {
+ float: right;
+}
+
+/* sutor */
+img.post-img-right {
+ float:right;
+}
+
+/* niall */
+img.floatright {
+ float: right;
+}
+
+/* jason kolb */
+.FeaturedPost > li {
+ list-style-type: none;
+ background-color: #f8f8f8;
+}
+
+/* Tantek */
+ul.tags,ul.tags li,h4.tags {
+ display:inline;
+ font-size: x-small
+}
+
+ul.tags a:link, ul.tags a:visited {
+ color:green
+}
+
+a[rel='tag'] img {
+ border: 0;
+}
+
+/* DiveIntoMark */
+.framed {
+ float: none;
+}
+
+/* BurningBird */
+.update:before {
+ content: 'Update';
+ font-weight: bold;
+}
+
+.update {
+ margin: 2em;
+ padding: 0 1em 0 1em;
+ background: #eee;
+ border: 1px solid #aaa;
+}
+
+/* ----------------------------- Footer ---------------------------- */
+
+#footer {
+ padding: 0px;
+ margin: 30px 0px 50px 50px;
+}
+
+#footer p {
+ padding: 2px 2px 2px 5px;
+ background-color: #ccc;
+ border-top: 1px solid #aaa;
+ border-bottom: 1px solid #aaa;
+ border-left: 1px solid #aaa;
+ letter-spacing: 0.15em;
+ text-transform: uppercase;
+ text-align: left;
+}
Deleted: trunk/lib/venus/themes/asf/index.html.xslt
===================================================================
--- branches/sucs-site/lib/venus/themes/asf/index.html.xslt 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/lib/venus/themes/asf/index.html.xslt 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,339 +0,0 @@
-<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
- xmlns:atom="http://www.w3.org/2005/Atom"
- xmlns:xhtml="http://www.w3.org/1999/xhtml"
- xmlns:planet="http://planet.intertwingly.net/"
- xmlns="http://www.w3.org/1999/xhtml"
- exclude-result-prefixes="atom planet xhtml">
-
- <xsl:output method="xml" omit-xml-declaration="yes"/>
-
- <xsl:template match="atom:feed">
- <xsl:text disable-output-escaping="yes"><!DOCTYPE html></xsl:text>
- <xsl:text>
</xsl:text>
- <html xmlns="http://www.w3.org/1999/xhtml">
-
- <!-- head -->
- <xsl:text>
</xsl:text>
- <head>
- <link rel="stylesheet" href="default.css" type="text/css" />
- <title><xsl:value-of select="atom:title"/></title>
- <meta name="robots" content="noindex,nofollow" />
- <meta name="generator" content="{atom:generator}" />
- <xsl:if test="atom:link[@rel='self']">
- <link rel="alternate" href="{atom:link[@rel='self']/@href}"
- title="{atom:title}" type="{atom:link[@rel='self']/@type}" />
- </xsl:if>
- <link rel="shortcut icon" href="/favicon.ico" />
- <script type="text/javascript" src="personalize.js">
- <xsl:comment><!--HTML Compatibility--></xsl:comment>
- </script>
- </head>
-
- <xsl:text>
</xsl:text>
- <body>
- <xsl:text>
</xsl:text>
- <h1><xsl:value-of select="atom:title"/></h1>
-
- <xsl:text>
</xsl:text>
- <div id="body">
- <xsl:apply-templates select="atom:entry"/>
- <xsl:text>
</xsl:text>
- </div>
-
- <h1>Footnotes</h1>
- <xsl:text>
</xsl:text>
-
- <div id="sidebar">
- <h2>Info</h2>
-
- <dl>
- <dt>Last updated:</dt>
- <dd>
- <time datetime="{atom:updated}" title="GMT">
- <xsl:value-of select="atom:updated/@planet:format"/>
- </time>
- </dd>
- <dt>Powered by:</dt>
- <dd>
- <a href="http://intertwingly.net/code/venus/">
- <img src="images/venus.png" width="80" height="15"
- alt="Venus" border="0"/>
- </a>
- </dd>
- <dt>Export:</dt>
- <dd>
- <ul>
- <li>
- <a href="opml.xml">
- <img src="images/opml.png" alt="OPML"/>
- </a>
- </li>
- <li>
- <a href="foafroll.xml">
- <img src="images/foaf.png" alt="FOAF"/>
- </a>
- </li>
- </ul>
- </dd>
- </dl>
- </div>
-
- <xsl:text>
</xsl:text>
- <div id="footer">
- <h2>Subscriptions</h2>
- <ul>
- <xsl:for-each select="planet:source">
- <xsl:sort select="planet:name"/>
- <xsl:variable name="id" select="atom:id"/>
- <xsl:variable name="posts"
- select="/atom:feed/atom:entry[atom:source/atom:id = $id]"/>
- <xsl:text>
</xsl:text>
- <li>
- <!-- icon -->
- <a title="subscribe">
- <xsl:choose>
- <xsl:when test="planet:http_location">
- <xsl:attribute name="href">
- <xsl:value-of select="planet:http_location"/>
- </xsl:attribute>
- </xsl:when>
- <xsl:when test="atom:link[@rel='self']/@href">
- <xsl:attribute name="href">
- <xsl:value-of select="atom:link[@rel='self']/@href"/>
- </xsl:attribute>
- </xsl:when>
- </xsl:choose>
- <img src="images/feed-icon-10x10.png" alt="(feed)"/>
- </a>
- <xsl:text> </xsl:text>
-
- <!-- name -->
- <a>
- <xsl:if test="atom:link[@rel='alternate']/@href">
- <xsl:attribute name="href">
- <xsl:value-of select="atom:link[@rel='alternate']/@href"/>
- </xsl:attribute>
- </xsl:if>
-
- <xsl:choose>
- <xsl:when test="planet:message">
- <xsl:attribute name="class">
- <xsl:if test="$posts">active message</xsl:if>
- <xsl:if test="not($posts)">message</xsl:if>
- </xsl:attribute>
- <xsl:attribute name="title">
- <xsl:value-of select="planet:message"/>
- </xsl:attribute>
- </xsl:when>
- <xsl:when test="atom:title">
- <xsl:attribute name="title">
- <xsl:value-of select="atom:title"/>
- </xsl:attribute>
- <xsl:if test="$posts">
- <xsl:attribute name="class">active</xsl:attribute>
- </xsl:if>
- </xsl:when>
- </xsl:choose>
- <xsl:value-of select="planet:name"/>
- </a>
-
- <xsl:if test="$posts[string-length(atom:title) > 0]">
- <ul>
- <xsl:for-each select="$posts">
- <xsl:if test="string-length(atom:title) > 0">
- <li>
- <a href="{atom:link[@rel='alternate']/@href}">
- <xsl:if test="atom:title/@xml:lang != @xml:lang">
- <xsl:attribute name="xml:lang"
- select="{atom:title/@xml:lang}"/>
- </xsl:if>
- <xsl:value-of select="atom:title"/>
- </a>
- </li>
- </xsl:if>
- </xsl:for-each>
- </ul>
- </xsl:if>
- </li>
- </xsl:for-each>
- <xsl:text>
</xsl:text>
- </ul>
- </div>
-
- <xsl:text>
</xsl:text>
- </body>
- </html>
- </xsl:template>
-
- <xsl:template match="atom:entry">
- <!-- date header -->
- <xsl:variable name="date" select="substring(atom:updated,1,10)"/>
- <xsl:if test="not(preceding-sibling::atom:entry
- [substring(atom:updated,1,10) = $date])">
- <xsl:text>
</xsl:text>
- <h2>
- <time datetime="{$date}">
- <xsl:value-of select="substring-before(atom:updated/@planet:format,', ')"/>
- <xsl:text>, </xsl:text>
- <xsl:value-of select="substring-before(substring-after(atom:updated/@planet:format,', '), ' ')"/>
- </time>
- </h2>
- </xsl:if>
-
- <xsl:text>
</xsl:text>
- <div class="news {atom:source/planet:css-id}">
-
- <xsl:if test="@xml:lang">
- <xsl:attribute name="xml:lang">
- <xsl:value-of select="@xml:lang"/>
- </xsl:attribute>
- </xsl:if>
-
- <!-- entry title -->
- <xsl:text>
</xsl:text>
- <h3>
- <xsl:if test="atom:source/atom:icon">
- <img src="{atom:source/atom:icon}" class="icon"/>
- </xsl:if>
- <a>
- <xsl:if test="atom:source/atom:link[@rel='alternate']/@href">
- <xsl:attribute name="href">
- <xsl:value-of
- select="atom:source/atom:link[@rel='alternate']/@href"/>
- </xsl:attribute>
- </xsl:if>
-
- <xsl:attribute name="title">
- <xsl:value-of select="atom:source/atom:title"/>
- </xsl:attribute>
- <xsl:value-of select="atom:source/planet:name"/>
- </a>
- <xsl:if test="string-length(atom:title) > 0">
- <xsl:text>—</xsl:text>
- <a href="{atom:link[@rel='alternate']/@href}">
- <xsl:if test="atom:title/@xml:lang != @xml:lang">
- <xsl:attribute name="xml:lang" select="{atom:title/@xml:lang}"/>
- </xsl:if>
- <xsl:value-of select="atom:title"/>
- </a>
- </xsl:if>
- </h3>
-
- <!-- entry content -->
- <xsl:text>
</xsl:text>
- <xsl:choose>
- <xsl:when test="atom:content">
- <xsl:apply-templates select="atom:content"/>
- </xsl:when>
- <xsl:otherwise>
- <xsl:apply-templates select="atom:summary"/>
- </xsl:otherwise>
- </xsl:choose>
-
- <!-- entry footer -->
- <xsl:text>
</xsl:text>
- <div class="permalink">
- <xsl:if test="atom:link[@rel='license'] or
- atom:source/atom:link[@rel='license'] or
- atom:rights or atom:source/atom:rights">
- <a>
- <xsl:if test="atom:source/atom:link[@rel='license']/@href">
- <xsl:attribute name="rel">license</xsl:attribute>
- <xsl:attribute name="href">
- <xsl:value-of select="atom:source/atom:link[@rel='license']/@href"/>
- </xsl:attribute>
- </xsl:if>
- <xsl:if test="atom:link[@rel='license']/@href">
- <xsl:attribute name="rel">license</xsl:attribute>
- <xsl:attribute name="href">
- <xsl:value-of select="atom:link[@rel='license']/@href"/>
- </xsl:attribute>
- </xsl:if>
- <xsl:if test="atom:source/atom:rights">
- <xsl:attribute name="title">
- <xsl:value-of select="atom:source/atom:rights"/>
- </xsl:attribute>
- </xsl:if>
- <xsl:if test="atom:rights">
- <xsl:attribute name="title">
- <xsl:value-of select="atom:rights"/>
- </xsl:attribute>
- </xsl:if>
- <xsl:text>©</xsl:text>
- </a>
- <xsl:text> </xsl:text>
- </xsl:if>
- <a href="{atom:link[@rel='alternate']/@href}">
- <xsl:choose>
- <xsl:when test="atom:author/atom:name">
- <xsl:if test="not(atom:link[@rel='license'] or
- atom:source/atom:link[@rel='license'] or
- atom:rights or atom:source/atom:rights)">
- <xsl:text>by </xsl:text>
- </xsl:if>
- <xsl:value-of select="atom:author/atom:name"/>
- <xsl:text> at </xsl:text>
- </xsl:when>
- <xsl:when test="atom:source/atom:author/atom:name">
- <xsl:if test="not(atom:link[@rel='license'] or
- atom:source/atom:link[@rel='license'] or
- atom:rights or atom:source/atom:rights)">
- <xsl:text>by </xsl:text>
- </xsl:if>
- <xsl:value-of select="atom:source/atom:author/atom:name"/>
- <xsl:text> at </xsl:text>
- </xsl:when>
- </xsl:choose>
- <time datetime="{atom:updated}" title="GMT">
- <xsl:value-of select="atom:updated/@planet:format"/>
- </time>
- </a>
- </div>
- </div>
-
- </xsl:template>
-
- <!-- xhtml content -->
- <xsl:template match="atom:content/xhtml:div | atom:summary/xhtml:div">
- <xsl:copy>
- <xsl:if test="../@xml:lang and not(../@xml:lang = ../../@xml:lang)">
- <xsl:attribute name="xml:lang">
- <xsl:value-of select="../@xml:lang"/>
- </xsl:attribute>
- </xsl:if>
- <xsl:attribute name="class">content</xsl:attribute>
- <xsl:apply-templates select="@*|node()"/>
- </xsl:copy>
- </xsl:template>
-
- <!-- plain text content -->
- <xsl:template match="atom:content/text() | atom:summary/text()">
- <div class="content" xmlns="http://www.w3.org/1999/xhtml">
- <xsl:if test="../@xml:lang and not(../@xml:lang = ../../@xml:lang)">
- <xsl:attribute name="xml:lang">
- <xsl:value-of select="../@xml:lang"/>
- </xsl:attribute>
- </xsl:if>
- <xsl:copy-of select="."/>
- </div>
- </xsl:template>
-
- <!-- Remove stray atom elements -->
- <xsl:template match="atom:*">
- <xsl:apply-templates/>
- </xsl:template>
-
- <!-- Feedburner detritus -->
- <xsl:template match="xhtml:div[@class='feedflare']"/>
-
- <!-- Strip site meter -->
- <xsl:template match="xhtml:div[comment()[. = ' Site Meter ']]"/>
-
- <!-- pass through everything else -->
- <xsl:template match="@*|node()">
- <xsl:copy>
- <xsl:apply-templates select="@*|node()"/>
- </xsl:copy>
- </xsl:template>
-
-</xsl:stylesheet>
Copied: trunk/lib/venus/themes/asf/index.html.xslt (from rev 656, branches/sucs-site/lib/venus/themes/asf/index.html.xslt)
===================================================================
--- trunk/lib/venus/themes/asf/index.html.xslt (rev 0)
+++ trunk/lib/venus/themes/asf/index.html.xslt 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,339 @@
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
+ xmlns:atom="http://www.w3.org/2005/Atom"
+ xmlns:xhtml="http://www.w3.org/1999/xhtml"
+ xmlns:planet="http://planet.intertwingly.net/"
+ xmlns="http://www.w3.org/1999/xhtml"
+ exclude-result-prefixes="atom planet xhtml">
+
+ <xsl:output method="xml" omit-xml-declaration="yes"/>
+
+ <xsl:template match="atom:feed">
+ <xsl:text disable-output-escaping="yes"><!DOCTYPE html></xsl:text>
+ <xsl:text>
</xsl:text>
+ <html xmlns="http://www.w3.org/1999/xhtml">
+
+ <!-- head -->
+ <xsl:text>
</xsl:text>
+ <head>
+ <link rel="stylesheet" href="default.css" type="text/css" />
+ <title><xsl:value-of select="atom:title"/></title>
+ <meta name="robots" content="noindex,nofollow" />
+ <meta name="generator" content="{atom:generator}" />
+ <xsl:if test="atom:link[@rel='self']">
+ <link rel="alternate" href="{atom:link[@rel='self']/@href}"
+ title="{atom:title}" type="{atom:link[@rel='self']/@type}" />
+ </xsl:if>
+ <link rel="shortcut icon" href="/favicon.ico" />
+ <script type="text/javascript" src="personalize.js">
+ <xsl:comment><!--HTML Compatibility--></xsl:comment>
+ </script>
+ </head>
+
+ <xsl:text>
</xsl:text>
+ <body>
+ <xsl:text>
</xsl:text>
+ <h1><xsl:value-of select="atom:title"/></h1>
+
+ <xsl:text>
</xsl:text>
+ <div id="body">
+ <xsl:apply-templates select="atom:entry"/>
+ <xsl:text>
</xsl:text>
+ </div>
+
+ <h1>Footnotes</h1>
+ <xsl:text>
</xsl:text>
+
+ <div id="sidebar">
+ <h2>Info</h2>
+
+ <dl>
+ <dt>Last updated:</dt>
+ <dd>
+ <time datetime="{atom:updated}" title="GMT">
+ <xsl:value-of select="atom:updated/@planet:format"/>
+ </time>
+ </dd>
+ <dt>Powered by:</dt>
+ <dd>
+ <a href="http://intertwingly.net/code/venus/">
+ <img src="images/venus.png" width="80" height="15"
+ alt="Venus" border="0"/>
+ </a>
+ </dd>
+ <dt>Export:</dt>
+ <dd>
+ <ul>
+ <li>
+ <a href="opml.xml">
+ <img src="images/opml.png" alt="OPML"/>
+ </a>
+ </li>
+ <li>
+ <a href="foafroll.xml">
+ <img src="images/foaf.png" alt="FOAF"/>
+ </a>
+ </li>
+ </ul>
+ </dd>
+ </dl>
+ </div>
+
+ <xsl:text>
</xsl:text>
+ <div id="footer">
+ <h2>Subscriptions</h2>
+ <ul>
+ <xsl:for-each select="planet:source">
+ <xsl:sort select="planet:name"/>
+ <xsl:variable name="id" select="atom:id"/>
+ <xsl:variable name="posts"
+ select="/atom:feed/atom:entry[atom:source/atom:id = $id]"/>
+ <xsl:text>
</xsl:text>
+ <li>
+ <!-- icon -->
+ <a title="subscribe">
+ <xsl:choose>
+ <xsl:when test="planet:http_location">
+ <xsl:attribute name="href">
+ <xsl:value-of select="planet:http_location"/>
+ </xsl:attribute>
+ </xsl:when>
+ <xsl:when test="atom:link[@rel='self']/@href">
+ <xsl:attribute name="href">
+ <xsl:value-of select="atom:link[@rel='self']/@href"/>
+ </xsl:attribute>
+ </xsl:when>
+ </xsl:choose>
+ <img src="images/feed-icon-10x10.png" alt="(feed)"/>
+ </a>
+ <xsl:text> </xsl:text>
+
+ <!-- name -->
+ <a>
+ <xsl:if test="atom:link[@rel='alternate']/@href">
+ <xsl:attribute name="href">
+ <xsl:value-of select="atom:link[@rel='alternate']/@href"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:choose>
+ <xsl:when test="planet:message">
+ <xsl:attribute name="class">
+ <xsl:if test="$posts">active message</xsl:if>
+ <xsl:if test="not($posts)">message</xsl:if>
+ </xsl:attribute>
+ <xsl:attribute name="title">
+ <xsl:value-of select="planet:message"/>
+ </xsl:attribute>
+ </xsl:when>
+ <xsl:when test="atom:title">
+ <xsl:attribute name="title">
+ <xsl:value-of select="atom:title"/>
+ </xsl:attribute>
+ <xsl:if test="$posts">
+ <xsl:attribute name="class">active</xsl:attribute>
+ </xsl:if>
+ </xsl:when>
+ </xsl:choose>
+ <xsl:value-of select="planet:name"/>
+ </a>
+
+ <xsl:if test="$posts[string-length(atom:title) > 0]">
+ <ul>
+ <xsl:for-each select="$posts">
+ <xsl:if test="string-length(atom:title) > 0">
+ <li>
+ <a href="{atom:link[@rel='alternate']/@href}">
+ <xsl:if test="atom:title/@xml:lang != @xml:lang">
+ <xsl:attribute name="xml:lang"
+ select="{atom:title/@xml:lang}"/>
+ </xsl:if>
+ <xsl:value-of select="atom:title"/>
+ </a>
+ </li>
+ </xsl:if>
+ </xsl:for-each>
+ </ul>
+ </xsl:if>
+ </li>
+ </xsl:for-each>
+ <xsl:text>
</xsl:text>
+ </ul>
+ </div>
+
+ <xsl:text>
</xsl:text>
+ </body>
+ </html>
+ </xsl:template>
+
+ <xsl:template match="atom:entry">
+ <!-- date header -->
+ <xsl:variable name="date" select="substring(atom:updated,1,10)"/>
+ <xsl:if test="not(preceding-sibling::atom:entry
+ [substring(atom:updated,1,10) = $date])">
+ <xsl:text>
</xsl:text>
+ <h2>
+ <time datetime="{$date}">
+ <xsl:value-of select="substring-before(atom:updated/@planet:format,', ')"/>
+ <xsl:text>, </xsl:text>
+ <xsl:value-of select="substring-before(substring-after(atom:updated/@planet:format,', '), ' ')"/>
+ </time>
+ </h2>
+ </xsl:if>
+
+ <xsl:text>
</xsl:text>
+ <div class="news {atom:source/planet:css-id}">
+
+ <xsl:if test="@xml:lang">
+ <xsl:attribute name="xml:lang">
+ <xsl:value-of select="@xml:lang"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <!-- entry title -->
+ <xsl:text>
</xsl:text>
+ <h3>
+ <xsl:if test="atom:source/atom:icon">
+ <img src="{atom:source/atom:icon}" class="icon"/>
+ </xsl:if>
+ <a>
+ <xsl:if test="atom:source/atom:link[@rel='alternate']/@href">
+ <xsl:attribute name="href">
+ <xsl:value-of
+ select="atom:source/atom:link[@rel='alternate']/@href"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:attribute name="title">
+ <xsl:value-of select="atom:source/atom:title"/>
+ </xsl:attribute>
+ <xsl:value-of select="atom:source/planet:name"/>
+ </a>
+ <xsl:if test="string-length(atom:title) > 0">
+ <xsl:text>—</xsl:text>
+ <a href="{atom:link[@rel='alternate']/@href}">
+ <xsl:if test="atom:title/@xml:lang != @xml:lang">
+ <xsl:attribute name="xml:lang" select="{atom:title/@xml:lang}"/>
+ </xsl:if>
+ <xsl:value-of select="atom:title"/>
+ </a>
+ </xsl:if>
+ </h3>
+
+ <!-- entry content -->
+ <xsl:text>
</xsl:text>
+ <xsl:choose>
+ <xsl:when test="atom:content">
+ <xsl:apply-templates select="atom:content"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="atom:summary"/>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <!-- entry footer -->
+ <xsl:text>
</xsl:text>
+ <div class="permalink">
+ <xsl:if test="atom:link[@rel='license'] or
+ atom:source/atom:link[@rel='license'] or
+ atom:rights or atom:source/atom:rights">
+ <a>
+ <xsl:if test="atom:source/atom:link[@rel='license']/@href">
+ <xsl:attribute name="rel">license</xsl:attribute>
+ <xsl:attribute name="href">
+ <xsl:value-of select="atom:source/atom:link[@rel='license']/@href"/>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:if test="atom:link[@rel='license']/@href">
+ <xsl:attribute name="rel">license</xsl:attribute>
+ <xsl:attribute name="href">
+ <xsl:value-of select="atom:link[@rel='license']/@href"/>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:if test="atom:source/atom:rights">
+ <xsl:attribute name="title">
+ <xsl:value-of select="atom:source/atom:rights"/>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:if test="atom:rights">
+ <xsl:attribute name="title">
+ <xsl:value-of select="atom:rights"/>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:text>©</xsl:text>
+ </a>
+ <xsl:text> </xsl:text>
+ </xsl:if>
+ <a href="{atom:link[@rel='alternate']/@href}">
+ <xsl:choose>
+ <xsl:when test="atom:author/atom:name">
+ <xsl:if test="not(atom:link[@rel='license'] or
+ atom:source/atom:link[@rel='license'] or
+ atom:rights or atom:source/atom:rights)">
+ <xsl:text>by </xsl:text>
+ </xsl:if>
+ <xsl:value-of select="atom:author/atom:name"/>
+ <xsl:text> at </xsl:text>
+ </xsl:when>
+ <xsl:when test="atom:source/atom:author/atom:name">
+ <xsl:if test="not(atom:link[@rel='license'] or
+ atom:source/atom:link[@rel='license'] or
+ atom:rights or atom:source/atom:rights)">
+ <xsl:text>by </xsl:text>
+ </xsl:if>
+ <xsl:value-of select="atom:source/atom:author/atom:name"/>
+ <xsl:text> at </xsl:text>
+ </xsl:when>
+ </xsl:choose>
+ <time datetime="{atom:updated}" title="GMT">
+ <xsl:value-of select="atom:updated/@planet:format"/>
+ </time>
+ </a>
+ </div>
+ </div>
+
+ </xsl:template>
+
+ <!-- xhtml content -->
+ <xsl:template match="atom:content/xhtml:div | atom:summary/xhtml:div">
+ <xsl:copy>
+ <xsl:if test="../@xml:lang and not(../@xml:lang = ../../@xml:lang)">
+ <xsl:attribute name="xml:lang">
+ <xsl:value-of select="../@xml:lang"/>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:attribute name="class">content</xsl:attribute>
+ <xsl:apply-templates select="@*|node()"/>
+ </xsl:copy>
+ </xsl:template>
+
+ <!-- plain text content -->
+ <xsl:template match="atom:content/text() | atom:summary/text()">
+ <div class="content" xmlns="http://www.w3.org/1999/xhtml">
+ <xsl:if test="../@xml:lang and not(../@xml:lang = ../../@xml:lang)">
+ <xsl:attribute name="xml:lang">
+ <xsl:value-of select="../@xml:lang"/>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:copy-of select="."/>
+ </div>
+ </xsl:template>
+
+ <!-- Remove stray atom elements -->
+ <xsl:template match="atom:*">
+ <xsl:apply-templates/>
+ </xsl:template>
+
+ <!-- Feedburner detritus -->
+ <xsl:template match="xhtml:div[@class='feedflare']"/>
+
+ <!-- Strip site meter -->
+ <xsl:template match="xhtml:div[comment()[. = ' Site Meter ']]"/>
+
+ <!-- pass through everything else -->
+ <xsl:template match="@*|node()">
+ <xsl:copy>
+ <xsl:apply-templates select="@*|node()"/>
+ </xsl:copy>
+ </xsl:template>
+
+</xsl:stylesheet>
Deleted: trunk/lib/venus/themes/asf/personalize.js
===================================================================
--- branches/sucs-site/lib/venus/themes/asf/personalize.js 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/lib/venus/themes/asf/personalize.js 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,297 +0,0 @@
-var entries = []; // list of news items
-
-var days = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday",
- "Friday", "Saturday"];
-var months = ["January", "February", "March", "April", "May", "June", "July",
- "August", "September", "October", "November", "December"];
-
-// event complete: stop propagation of the event
-function stopPropagation(event) {
- if (event.preventDefault) {
- event.preventDefault();
- event.stopPropagation();
- } else {
- event.returnValue = false;
- }
-}
-
-// scroll back to the previous article
-function prevArticle(event) {
- var scrollTop = document.documentElement.scrollTop || document.body.scrollTop;
- for (var i=entries.length; --i>=0;) {
- if (!entries[i].anchor) continue;
- if (entries[i].anchor.offsetTop < scrollTop) {
- window.location.hash=entries[i].anchor.id;
- stopPropagation(event);
- break;
- }
- }
-}
-
-// advance to the next article
-function nextArticle(event) {
- var scrollTop = document.documentElement.scrollTop || document.body.scrollTop;
- for (var i=1; i<entries.length; i++) {
- if (!entries[i].anchor) continue;
- if (entries[i].anchor.offsetTop-20 >scrollTop) {
- window.location.hash=entries[i].anchor.id;
- stopPropagation(event);
- break;
- }
- }
-}
-
-// process keypresses
-function navkey(event) {
- var checkbox = document.getElementById('navkeys');
- if (!checkbox || !checkbox.checked) return;
-
- if (!event) event=window.event;
- if (event.originalTarget &&
- event.originalTarget.nodeName.toLowerCase() == 'input' &&
- event.originalTarget.id != 'navkeys') return;
-
- if (!document.documentElement) return;
- if (!entries[0].anchor || !entries[0].anchor.offsetTop) return;
-
- key=event.keyCode;
- if (key == 'J'.charCodeAt(0)) nextArticle(event);
- if (key == 'K'.charCodeAt(0)) prevArticle(event);
-}
-
-// create (or reset) a cookie
-function createCookie(name,value,days) {
- if (days) {
- var date = new Date();
- date.setTime(date.getTime()+(days*24*60*60*1000));
- var expires = "; expires="+date.toGMTString();
- }
- else expires = "";
- document.cookie = name+"="+value+expires+"; path=/";
-}
-
-// read a cookie
-function readCookie(name) {
- var nameEQ = name + "=";
- if (!document.cookie) return;
- var ca = document.cookie.split(';');
- for(var i=0;i < ca.length;i++) {
- var c = ca[i];
- while (c.charAt(0)==' ') c = c.substring(1,c.length);
- if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
- }
- return null;
-}
-
-// each time the value of the option changes, update the cookie
-function selectOption() {
- var checkbox = document.getElementById('navkeys');
- if (!checkbox) return;
- createCookie("navkeys", checkbox.checked?'true':'false', 365);
-}
-
-// add navkeys option to sidebar
-function addOption(event) {
- var sidebar = document.getElementById('sidebar');
- if (!sidebar) return;
-
- var h2 = null;
- for (var i=entries.length; --i>=0;) {
- if (document.getElementById("news-" + i)) break;
- if (entries[i].parent.offsetTop > 0) {
- var a = entries[i].anchor = document.createElement('a');
- a.id = "news-" + i;
- entries[i].parent.insertBefore(a, entries[i].parent.firstChild);
- if (h2 == null) h2 = document.createElement('h2');
- }
- }
-
- if (h2 != null && !document.getElementById("navkeys")) {
- h2.appendChild(document.createTextNode('Options'));
- sidebar.appendChild(h2);
-
- var form = document.createElement('form');
- var p = document.createElement('p');
- var input = document.createElement('input');
- input.type = "checkbox";
- input.id = "navkeys";
- p.appendChild(input);
- var a = document.createElement('a');
- a.title = "Navigate entries";
- a.appendChild(document.createTextNode('Enable '));
- var code = document.createElement('code');
- code.appendChild(document.createTextNode('J'));
- a.appendChild(code);
- a.appendChild(document.createTextNode(' and '));
- code = document.createElement('code');
- code.appendChild(document.createTextNode('K'));
- a.appendChild(code);
- a.appendChild(document.createTextNode(' keys'));
- p.appendChild(a);
- form.appendChild(p);
- sidebar.appendChild(form);
-
- var cookie = readCookie("navkeys");
- if (cookie && cookie == 'true') input.checked = true;
- input.onclick = selectOption;
- document.onkeydown = navkey;
- }
-}
-
-// Parse an HTML5-liberalized version of RFC 3339 datetime values
-Date.parseRFC3339 = function (string) {
- var date=new Date();
- date.setTime(0);
- var match = string.match(/(\d{4})-(\d\d)-(\d\d)\s*(?:[\sT]\s*(\d\d):(\d\d)(?::(\d\d))?(\.\d*)?\s*(Z|([-+])(\d\d):(\d\d))?)?/);
- if (!match) return;
- if (match[2]) match[2]--;
- if (match[7]) match[7] = (match[7]+'000').substring(1,4);
- var field = [null,'FullYear','Month','Date','Hours','Minutes','Seconds','Milliseconds'];
- for (var i=1; i<=7; i++) if (match[i]) date['setUTC'+field[i]](match[i]);
- if (match[9]) date.setTime(date.getTime()+
- (match[9]=='-'?1:-1)*(match[10]*3600000+match[11]*60000) );
- return date.getTime();
-}
-
-// convert datetime to local date
-var localere = /^(\w+) (\d+) (\w+) \d+ 0?(\d\d?:\d\d):\d\d ([AP]M) (EST|EDT|CST|CDT|MST|MDT|PST|PDT)/;
-function localizeDate(element) {
- var date = new Date();
- date.setTime(Date.parseRFC3339(element.getAttribute('datetime')));
- if (!date.getTime()) return;
-
- var local = date.toLocaleString();
- if (element.parentNode.nodeName == 'a') local = date.toLocaleTimeString();
- var match = local.match(localere);
- if (match) { /* Firefox */
- element.innerHTML = match[4] + ' ' + match[5].toLowerCase();
- element.title = match[6] + " \u2014 " +
- match[1] + ', ' + match[3] + ' ' + match[2];
- return days[date.getDay()] + ', ' + months[date.getMonth()] + ' ' +
- date.getDate() + ', ' + date.getFullYear();
- } else {
- local = local.replace(/ GMT(-\d\d\d\d) \(.*\)$/, ''); /* Webkit */
- element.title = element.innerHTML + ' GMT';
- element.innerHTML = local;
- return days[date.getDay()] + ', ' + date.getDate() + ' ' +
- months[date.getMonth()] + ' ' + date.getFullYear();
- }
-
-}
-
-// find entries (and localizeDates)
-function findEntries() {
-
- var times = document.getElementsByTagName('time');
-
- for (var i=0; i<times.length; i++) {
- if (times[i].title == "GMT") {
- var date = localizeDate(times[i]);
-
- var parent = times[i];
- while (parent &&
- (!parent.className || parent.className.split(' ')[0] != 'news')) {
- parent = parent.parentNode;
- }
-
- if (parent) {
- var info = entries[entries.length] = new Object();
- info.parent = parent;
- info.date = date;
- info.datetime = times[i].getAttribute('datetime').substring(0,10);
- }
- }
- }
-
-}
-
-// insert/remove date headers to indicate change of date in local time zone
-function moveDateHeaders() {
- var lastdate = ''
- for (var i=0; i<entries.length; i++) {
- var parent = entries[i].parent;
- var date = entries[i].date;
-
- sibling = parent.previousSibling;
- while (sibling && sibling.nodeType != 1) {
- sibling = sibling.previousSibling;
- }
-
- if (sibling && sibling.nodeName.toLowerCase() == 'h2') {
- if (lastdate == date) {
- sibling.parentNode.removeChild(sibling);
- } else {
- sibling.childNodes[0].innerHTML = date;
- sibling.childNodes[0].setAttribute('datetime',entries[i].datetime);
- lastdate = date;
- }
- } else if (lastdate != date) {
- var h2 = document.createElement('h2');
- var time = document.createElement('time');
- time.setAttribute('datetime',entries[i].datetime);
- time.appendChild(document.createTextNode(date));
- h2.appendChild(time);
- parent.parentNode.insertBefore(h2, parent);
- lastdate = date;
- }
- }
-}
-
-function moveSidebar() {
- var sidebar = document.getElementById('sidebar');
- if (sidebar.currentStyle && sidebar.currentStyle['float'] == 'none') return;
- if (window.getComputedStyle && document.defaultView.getComputedStyle(sidebar,null).getPropertyValue('float') == 'none') return;
-
- var h1 = sidebar.previousSibling;
- while (h1.nodeType != 1) h1=h1.previousSibling;
- if (h1.nodeName.toLowerCase() == 'h1') h1.parentNode.removeChild(h1);
-
- var footer = document.getElementById('footer');
- var ul = footer.lastChild;
- while (ul.nodeType != 1) ul=ul.previousSibling;
-
- var twisty = document.createElement('a');
- twisty.appendChild(document.createTextNode('\u25bc'));
- twisty.title = 'hide';
- twisty.onclick = function() {
- var display = 'block';
- if (this.childNodes[0].nodeValue == '\u25ba') {
- this.title = 'hide';
- this.childNodes[0].nodeValue = '\u25bc';
- } else {
- this.title = 'show';
- this.childNodes[0].nodeValue = '\u25ba';
- display = 'none';
- }
- ul.style.display = display;
- createCookie("subscriptions", display, 365);
- }
-
- var cookie = readCookie("subscriptions");
- if (cookie && cookie == 'none') twisty.onclick();
-
- for (var node=footer.lastChild; node; node=footer.lastChild) {
- if (twisty && node.nodeType == 1 && node.nodeName.toLowerCase() == 'h2') {
- node.appendChild(twisty);
- twisty = null;
- }
- footer.removeChild(node);
- sidebar.insertBefore(node, sidebar.firstChild);
- }
-
- var body = document.getElementById('body');
- sidebar.parentNode.removeChild(sidebar);
- body.parentNode.insertBefore(sidebar, body);
- body.style.marginRight = 0;
-}
-
-// adjust dates to local time zones, optionally provide navigation keys
-function personalize() {
- moveSidebar();
- findEntries();
- addOption();
- moveDateHeaders();
-}
-
-// hook event
-document.addEventListener("DOMContentLoaded", personalize, false);
Copied: trunk/lib/venus/themes/asf/personalize.js (from rev 656, branches/sucs-site/lib/venus/themes/asf/personalize.js)
===================================================================
--- trunk/lib/venus/themes/asf/personalize.js (rev 0)
+++ trunk/lib/venus/themes/asf/personalize.js 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,297 @@
+var entries = []; // list of news items
+
+var days = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday",
+ "Friday", "Saturday"];
+var months = ["January", "February", "March", "April", "May", "June", "July",
+ "August", "September", "October", "November", "December"];
+
+// event complete: stop propagation of the event
+function stopPropagation(event) {
+ if (event.preventDefault) {
+ event.preventDefault();
+ event.stopPropagation();
+ } else {
+ event.returnValue = false;
+ }
+}
+
+// scroll back to the previous article
+function prevArticle(event) {
+ var scrollTop = document.documentElement.scrollTop || document.body.scrollTop;
+ for (var i=entries.length; --i>=0;) {
+ if (!entries[i].anchor) continue;
+ if (entries[i].anchor.offsetTop < scrollTop) {
+ window.location.hash=entries[i].anchor.id;
+ stopPropagation(event);
+ break;
+ }
+ }
+}
+
+// advance to the next article
+function nextArticle(event) {
+ var scrollTop = document.documentElement.scrollTop || document.body.scrollTop;
+ for (var i=1; i<entries.length; i++) {
+ if (!entries[i].anchor) continue;
+ if (entries[i].anchor.offsetTop-20 >scrollTop) {
+ window.location.hash=entries[i].anchor.id;
+ stopPropagation(event);
+ break;
+ }
+ }
+}
+
+// process keypresses
+function navkey(event) {
+ var checkbox = document.getElementById('navkeys');
+ if (!checkbox || !checkbox.checked) return;
+
+ if (!event) event=window.event;
+ if (event.originalTarget &&
+ event.originalTarget.nodeName.toLowerCase() == 'input' &&
+ event.originalTarget.id != 'navkeys') return;
+
+ if (!document.documentElement) return;
+ if (!entries[0].anchor || !entries[0].anchor.offsetTop) return;
+
+ key=event.keyCode;
+ if (key == 'J'.charCodeAt(0)) nextArticle(event);
+ if (key == 'K'.charCodeAt(0)) prevArticle(event);
+}
+
+// create (or reset) a cookie
+function createCookie(name,value,days) {
+ if (days) {
+ var date = new Date();
+ date.setTime(date.getTime()+(days*24*60*60*1000));
+ var expires = "; expires="+date.toGMTString();
+ }
+ else expires = "";
+ document.cookie = name+"="+value+expires+"; path=/";
+}
+
+// read a cookie
+function readCookie(name) {
+ var nameEQ = name + "=";
+ if (!document.cookie) return;
+ var ca = document.cookie.split(';');
+ for(var i=0;i < ca.length;i++) {
+ var c = ca[i];
+ while (c.charAt(0)==' ') c = c.substring(1,c.length);
+ if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
+ }
+ return null;
+}
+
+// each time the value of the option changes, update the cookie
+function selectOption() {
+ var checkbox = document.getElementById('navkeys');
+ if (!checkbox) return;
+ createCookie("navkeys", checkbox.checked?'true':'false', 365);
+}
+
+// add navkeys option to sidebar
+function addOption(event) {
+ var sidebar = document.getElementById('sidebar');
+ if (!sidebar) return;
+
+ var h2 = null;
+ for (var i=entries.length; --i>=0;) {
+ if (document.getElementById("news-" + i)) break;
+ if (entries[i].parent.offsetTop > 0) {
+ var a = entries[i].anchor = document.createElement('a');
+ a.id = "news-" + i;
+ entries[i].parent.insertBefore(a, entries[i].parent.firstChild);
+ if (h2 == null) h2 = document.createElement('h2');
+ }
+ }
+
+ if (h2 != null && !document.getElementById("navkeys")) {
+ h2.appendChild(document.createTextNode('Options'));
+ sidebar.appendChild(h2);
+
+ var form = document.createElement('form');
+ var p = document.createElement('p');
+ var input = document.createElement('input');
+ input.type = "checkbox";
+ input.id = "navkeys";
+ p.appendChild(input);
+ var a = document.createElement('a');
+ a.title = "Navigate entries";
+ a.appendChild(document.createTextNode('Enable '));
+ var code = document.createElement('code');
+ code.appendChild(document.createTextNode('J'));
+ a.appendChild(code);
+ a.appendChild(document.createTextNode(' and '));
+ code = document.createElement('code');
+ code.appendChild(document.createTextNode('K'));
+ a.appendChild(code);
+ a.appendChild(document.createTextNode(' keys'));
+ p.appendChild(a);
+ form.appendChild(p);
+ sidebar.appendChild(form);
+
+ var cookie = readCookie("navkeys");
+ if (cookie && cookie == 'true') input.checked = true;
+ input.onclick = selectOption;
+ document.onkeydown = navkey;
+ }
+}
+
+// Parse an HTML5-liberalized version of RFC 3339 datetime values
+Date.parseRFC3339 = function (string) {
+ var date=new Date();
+ date.setTime(0);
+ var match = string.match(/(\d{4})-(\d\d)-(\d\d)\s*(?:[\sT]\s*(\d\d):(\d\d)(?::(\d\d))?(\.\d*)?\s*(Z|([-+])(\d\d):(\d\d))?)?/);
+ if (!match) return;
+ if (match[2]) match[2]--;
+ if (match[7]) match[7] = (match[7]+'000').substring(1,4);
+ var field = [null,'FullYear','Month','Date','Hours','Minutes','Seconds','Milliseconds'];
+ for (var i=1; i<=7; i++) if (match[i]) date['setUTC'+field[i]](match[i]);
+ if (match[9]) date.setTime(date.getTime()+
+ (match[9]=='-'?1:-1)*(match[10]*3600000+match[11]*60000) );
+ return date.getTime();
+}
+
+// convert datetime to local date
+var localere = /^(\w+) (\d+) (\w+) \d+ 0?(\d\d?:\d\d):\d\d ([AP]M) (EST|EDT|CST|CDT|MST|MDT|PST|PDT)/;
+function localizeDate(element) {
+ var date = new Date();
+ date.setTime(Date.parseRFC3339(element.getAttribute('datetime')));
+ if (!date.getTime()) return;
+
+ var local = date.toLocaleString();
+ if (element.parentNode.nodeName == 'a') local = date.toLocaleTimeString();
+ var match = local.match(localere);
+ if (match) { /* Firefox */
+ element.innerHTML = match[4] + ' ' + match[5].toLowerCase();
+ element.title = match[6] + " \u2014 " +
+ match[1] + ', ' + match[3] + ' ' + match[2];
+ return days[date.getDay()] + ', ' + months[date.getMonth()] + ' ' +
+ date.getDate() + ', ' + date.getFullYear();
+ } else {
+ local = local.replace(/ GMT(-\d\d\d\d) \(.*\)$/, ''); /* Webkit */
+ element.title = element.innerHTML + ' GMT';
+ element.innerHTML = local;
+ return days[date.getDay()] + ', ' + date.getDate() + ' ' +
+ months[date.getMonth()] + ' ' + date.getFullYear();
+ }
+
+}
+
+// find entries (and localizeDates)
+function findEntries() {
+
+ var times = document.getElementsByTagName('time');
+
+ for (var i=0; i<times.length; i++) {
+ if (times[i].title == "GMT") {
+ var date = localizeDate(times[i]);
+
+ var parent = times[i];
+ while (parent &&
+ (!parent.className || parent.className.split(' ')[0] != 'news')) {
+ parent = parent.parentNode;
+ }
+
+ if (parent) {
+ var info = entries[entries.length] = new Object();
+ info.parent = parent;
+ info.date = date;
+ info.datetime = times[i].getAttribute('datetime').substring(0,10);
+ }
+ }
+ }
+
+}
+
+// insert/remove date headers to indicate change of date in local time zone
+function moveDateHeaders() {
+ var lastdate = ''
+ for (var i=0; i<entries.length; i++) {
+ var parent = entries[i].parent;
+ var date = entries[i].date;
+
+ sibling = parent.previousSibling;
+ while (sibling && sibling.nodeType != 1) {
+ sibling = sibling.previousSibling;
+ }
+
+ if (sibling && sibling.nodeName.toLowerCase() == 'h2') {
+ if (lastdate == date) {
+ sibling.parentNode.removeChild(sibling);
+ } else {
+ sibling.childNodes[0].innerHTML = date;
+ sibling.childNodes[0].setAttribute('datetime',entries[i].datetime);
+ lastdate = date;
+ }
+ } else if (lastdate != date) {
+ var h2 = document.createElement('h2');
+ var time = document.createElement('time');
+ time.setAttribute('datetime',entries[i].datetime);
+ time.appendChild(document.createTextNode(date));
+ h2.appendChild(time);
+ parent.parentNode.insertBefore(h2, parent);
+ lastdate = date;
+ }
+ }
+}
+
+function moveSidebar() {
+ var sidebar = document.getElementById('sidebar');
+ if (sidebar.currentStyle && sidebar.currentStyle['float'] == 'none') return;
+ if (window.getComputedStyle && document.defaultView.getComputedStyle(sidebar,null).getPropertyValue('float') == 'none') return;
+
+ var h1 = sidebar.previousSibling;
+ while (h1.nodeType != 1) h1=h1.previousSibling;
+ if (h1.nodeName.toLowerCase() == 'h1') h1.parentNode.removeChild(h1);
+
+ var footer = document.getElementById('footer');
+ var ul = footer.lastChild;
+ while (ul.nodeType != 1) ul=ul.previousSibling;
+
+ var twisty = document.createElement('a');
+ twisty.appendChild(document.createTextNode('\u25bc'));
+ twisty.title = 'hide';
+ twisty.onclick = function() {
+ var display = 'block';
+ if (this.childNodes[0].nodeValue == '\u25ba') {
+ this.title = 'hide';
+ this.childNodes[0].nodeValue = '\u25bc';
+ } else {
+ this.title = 'show';
+ this.childNodes[0].nodeValue = '\u25ba';
+ display = 'none';
+ }
+ ul.style.display = display;
+ createCookie("subscriptions", display, 365);
+ }
+
+ var cookie = readCookie("subscriptions");
+ if (cookie && cookie == 'none') twisty.onclick();
+
+ for (var node=footer.lastChild; node; node=footer.lastChild) {
+ if (twisty && node.nodeType == 1 && node.nodeName.toLowerCase() == 'h2') {
+ node.appendChild(twisty);
+ twisty = null;
+ }
+ footer.removeChild(node);
+ sidebar.insertBefore(node, sidebar.firstChild);
+ }
+
+ var body = document.getElementById('body');
+ sidebar.parentNode.removeChild(sidebar);
+ body.parentNode.insertBefore(sidebar, body);
+ body.style.marginRight = 0;
+}
+
+// adjust dates to local time zones, optionally provide navigation keys
+function personalize() {
+ moveSidebar();
+ findEntries();
+ addOption();
+ moveDateHeaders();
+}
+
+// hook event
+document.addEventListener("DOMContentLoaded", personalize, false);
Deleted: trunk/lib/venus/themes/classic_fancy/config.ini
===================================================================
--- branches/sucs-site/lib/venus/themes/classic_fancy/config.ini 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/lib/venus/themes/classic_fancy/config.ini 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,20 +0,0 @@
-# This theme is based on the one contained in Planet V2.0. It demonstrates
-# that one can mix the use of htmltmpl and xslt templates.
-
-[Planet]
-template_files:
- atom.xml.xslt
- foafroll.xml.xslt
- index.html.tmpl
- opml.xml.xslt
- rss10.xml.tmpl
- rss20.xml.tmpl
-
-template_directories:
- ../common
-
-bill_of_materials:
- planet.css
- images/feed-icon-10x10.png
- images/logo.png
- images/planet.png
Copied: trunk/lib/venus/themes/classic_fancy/config.ini (from rev 656, branches/sucs-site/lib/venus/themes/classic_fancy/config.ini)
===================================================================
--- trunk/lib/venus/themes/classic_fancy/config.ini (rev 0)
+++ trunk/lib/venus/themes/classic_fancy/config.ini 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,20 @@
+# This theme is based on the one contained in Planet V2.0. It demonstrates
+# that one can mix the use of htmltmpl and xslt templates.
+
+[Planet]
+template_files:
+ atom.xml.xslt
+ foafroll.xml.xslt
+ index.html.tmpl
+ opml.xml.xslt
+ rss10.xml.tmpl
+ rss20.xml.tmpl
+
+template_directories:
+ ../common
+
+bill_of_materials:
+ planet.css
+ images/feed-icon-10x10.png
+ images/logo.png
+ images/planet.png
Deleted: trunk/lib/venus/themes/classic_fancy/index.html.tmpl
===================================================================
--- branches/sucs-site/lib/venus/themes/classic_fancy/index.html.tmpl 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/lib/venus/themes/classic_fancy/index.html.tmpl 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,126 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
-<html>
-
-### Fancy Planet HTML template.
-###
-### When combined with the stylesheet and images in the output/ directory
-### of the Planet source, this gives you a much prettier result than the
-### default examples template and demonstrates how to use the config file
-### to support things like faces
-###
-### For documentation on the more boring template elements, see
-### examples/config.ini and examples/index.html.tmpl in the Planet source.
-
-<head>
-<title><TMPL_VAR name></title>
-<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
-<meta name="generator" content="<TMPL_VAR generator ESCAPE="HTML">">
-<link rel="stylesheet" href="planet.css" type="text/css">
-<TMPL_IF feedtype>
-<link rel="alternate" href="<TMPL_VAR feed ESCAPE="HTML">" title="<TMPL_VAR channel_title_plain ESCAPE="HTML">" type="application/<TMPL_VAR feedtype>+xml">
-</TMPL_IF>
-</head>
-
-<body>
-<h1><TMPL_VAR name></h1>
-<TMPL_VAR admin>
-
-<TMPL_LOOP Items>
-<TMPL_IF new_date>
-<TMPL_UNLESS __FIRST__>
-### End <div class="channelgroup">
-</div>
-### End <div class="daygroup">
-</div>
-</TMPL_UNLESS>
-<div class="daygroup">
-<h2><TMPL_VAR new_date></h2>
-</TMPL_IF>
-
-<TMPL_IF new_channel>
-<TMPL_UNLESS new_date>
-### End <div class="channelgroup">
-</div>
-</TMPL_UNLESS>
-<div class="channelgroup">
-
-### Planet provides template variables for *all* configuration options for
-### the channel (and defaults), even if it doesn't know about them. We
-### exploit this here to add hackergotchi faces to our channels. Planet
-### doesn't know about the "face", "facewidth" and "faceheight" configuration
-### variables, but makes them available to us anyway.
-
-<h3><a href="<TMPL_VAR channel_link ESCAPE="HTML">" title="<TMPL_VAR channel_title_plain ESCAPE="HTML">"><TMPL_VAR channel_name></a></h3>
-<TMPL_IF channel_face>
-<img class="face" src="images/<TMPL_VAR channel_face ESCAPE="HTML">" width="<TMPL_VAR channel_facewidth ESCAPE="HTML">" height="<TMPL_VAR channel_faceheight ESCAPE="HTML">" alt="">
-</TMPL_IF>
-</TMPL_IF>
-
-
-<div class="entrygroup" id="<TMPL_VAR id>"<TMPL_IF channel_language> lang="<TMPL_VAR channel_language>"</TMPL_IF>>
-<TMPL_IF title>
-<h4<TMPL_IF title_language> lang="<TMPL_VAR title_language>"</TMPL_IF>><a href="<TMPL_VAR link ESCAPE="HTML">"><TMPL_VAR title></a></h4>
-</TMPL_IF>
-<div class="entry">
-<div class="content"<TMPL_IF content_language> lang="<TMPL_VAR content_language>"</TMPL_IF>>
-<TMPL_VAR content>
-</div>
-
-### Planet also makes available all of the information from the feed
-### that it can. Use the 'planet-cache' tool on the cache file for
-### a particular feed to find out what additional keys it supports.
-### Comment extra fields are 'author' and 'category' which we
-### demonstrate below.
-
-<p class="date">
-<a href="<TMPL_VAR link ESCAPE="HTML">"><TMPL_IF author>by <TMPL_VAR author ESCAPE="HTML"> at </TMPL_IF><TMPL_VAR date><TMPL_IF category> under <TMPL_VAR category></TMPL_IF></a>
-</p>
-</div>
-</div>
-
-<TMPL_IF __LAST__>
-### End <div class="channelgroup">
-</div>
-### End <div class="daygroup">
-</div>
-</TMPL_IF>
-</TMPL_LOOP>
-
-
-<div class="sidebar">
-<img src="images/logo.png" width="136" height="136" alt="">
-
-<h2>Subscriptions</h2>
-<ul>
-<TMPL_LOOP Channels>
-<li>
-<a href="<TMPL_VAR url ESCAPE="HTML">" title="subscribe"><img src="images/feed-icon-10x10.png" alt="(feed)"></a> <a <TMPL_IF link>href="<TMPL_VAR link ESCAPE="HTML">" </TMPL_IF><TMPL_IF message>class="message" title="<TMPL_VAR message ESCAPE="HTML">"</TMPL_IF><TMPL_UNLESS message>title="<TMPL_VAR title_plain ESCAPE="HTML">"</TMPL_UNLESS>><TMPL_VAR name></a>
-</li>
-</TMPL_LOOP>
-</ul>
-
-<p>
-<strong>Last updated:</strong><br>
-<TMPL_VAR date><br>
-<em>All times are UTC.</em><br>
-<br>
-Powered by:<br>
-<a href="http://www.planetplanet.org/"><img src="images/planet.png" width="80" height="15" alt="Planet" border="0"></a>
-</p>
-
-<p>
-<h2>Planetarium:</h2>
-<ul>
-<li><a href="http://www.planetapache.org/">Planet Apache</a></li>
-<li><a href="http://planet.debian.net/">Planet Debian</a></li>
-<li><a href="http://planet.freedesktop.org/">Planet freedesktop.org</a></li>
-<li><a href="http://planet.gnome.org/">Planet GNOME</a></li>
-<li><a href="http://planetsun.org/">Planet Sun</a></li>
-<li><a href="http://fedora.linux.duke.edu/fedorapeople/">Fedora People</a></li>
-<li><a href="http://www.planetplanet.org/">more...</a></li>
-</ul>
-</p>
-</div>
-</body>
-
-</html>
Copied: trunk/lib/venus/themes/classic_fancy/index.html.tmpl (from rev 656, branches/sucs-site/lib/venus/themes/classic_fancy/index.html.tmpl)
===================================================================
--- trunk/lib/venus/themes/classic_fancy/index.html.tmpl (rev 0)
+++ trunk/lib/venus/themes/classic_fancy/index.html.tmpl 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,126 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+
+### Fancy Planet HTML template.
+###
+### When combined with the stylesheet and images in the output/ directory
+### of the Planet source, this gives you a much prettier result than the
+### default examples template and demonstrates how to use the config file
+### to support things like faces
+###
+### For documentation on the more boring template elements, see
+### examples/config.ini and examples/index.html.tmpl in the Planet source.
+
+<head>
+<title><TMPL_VAR name></title>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+<meta name="generator" content="<TMPL_VAR generator ESCAPE="HTML">">
+<link rel="stylesheet" href="planet.css" type="text/css">
+<TMPL_IF feedtype>
+<link rel="alternate" href="<TMPL_VAR feed ESCAPE="HTML">" title="<TMPL_VAR channel_title_plain ESCAPE="HTML">" type="application/<TMPL_VAR feedtype>+xml">
+</TMPL_IF>
+</head>
+
+<body>
+<h1><TMPL_VAR name></h1>
+<TMPL_VAR admin>
+
+<TMPL_LOOP Items>
+<TMPL_IF new_date>
+<TMPL_UNLESS __FIRST__>
+### End <div class="channelgroup">
+</div>
+### End <div class="daygroup">
+</div>
+</TMPL_UNLESS>
+<div class="daygroup">
+<h2><TMPL_VAR new_date></h2>
+</TMPL_IF>
+
+<TMPL_IF new_channel>
+<TMPL_UNLESS new_date>
+### End <div class="channelgroup">
+</div>
+</TMPL_UNLESS>
+<div class="channelgroup">
+
+### Planet provides template variables for *all* configuration options for
+### the channel (and defaults), even if it doesn't know about them. We
+### exploit this here to add hackergotchi faces to our channels. Planet
+### doesn't know about the "face", "facewidth" and "faceheight" configuration
+### variables, but makes them available to us anyway.
+
+<h3><a href="<TMPL_VAR channel_link ESCAPE="HTML">" title="<TMPL_VAR channel_title_plain ESCAPE="HTML">"><TMPL_VAR channel_name></a></h3>
+<TMPL_IF channel_face>
+<img class="face" src="images/<TMPL_VAR channel_face ESCAPE="HTML">" width="<TMPL_VAR channel_facewidth ESCAPE="HTML">" height="<TMPL_VAR channel_faceheight ESCAPE="HTML">" alt="">
+</TMPL_IF>
+</TMPL_IF>
+
+
+<div class="entrygroup" id="<TMPL_VAR id>"<TMPL_IF channel_language> lang="<TMPL_VAR channel_language>"</TMPL_IF>>
+<TMPL_IF title>
+<h4<TMPL_IF title_language> lang="<TMPL_VAR title_language>"</TMPL_IF>><a href="<TMPL_VAR link ESCAPE="HTML">"><TMPL_VAR title></a></h4>
+</TMPL_IF>
+<div class="entry">
+<div class="content"<TMPL_IF content_language> lang="<TMPL_VAR content_language>"</TMPL_IF>>
+<TMPL_VAR content>
+</div>
+
+### Planet also makes available all of the information from the feed
+### that it can. Use the 'planet-cache' tool on the cache file for
+### a particular feed to find out what additional keys it supports.
+### Comment extra fields are 'author' and 'category' which we
+### demonstrate below.
+
+<p class="date">
+<a href="<TMPL_VAR link ESCAPE="HTML">"><TMPL_IF author>by <TMPL_VAR author ESCAPE="HTML"> at </TMPL_IF><TMPL_VAR date><TMPL_IF category> under <TMPL_VAR category></TMPL_IF></a>
+</p>
+</div>
+</div>
+
+<TMPL_IF __LAST__>
+### End <div class="channelgroup">
+</div>
+### End <div class="daygroup">
+</div>
+</TMPL_IF>
+</TMPL_LOOP>
+
+
+<div class="sidebar">
+<img src="images/logo.png" width="136" height="136" alt="">
+
+<h2>Subscriptions</h2>
+<ul>
+<TMPL_LOOP Channels>
+<li>
+<a href="<TMPL_VAR url ESCAPE="HTML">" title="subscribe"><img src="images/feed-icon-10x10.png" alt="(feed)"></a> <a <TMPL_IF link>href="<TMPL_VAR link ESCAPE="HTML">" </TMPL_IF><TMPL_IF message>class="message" title="<TMPL_VAR message ESCAPE="HTML">"</TMPL_IF><TMPL_UNLESS message>title="<TMPL_VAR title_plain ESCAPE="HTML">"</TMPL_UNLESS>><TMPL_VAR name></a>
+</li>
+</TMPL_LOOP>
+</ul>
+
+<p>
+<strong>Last updated:</strong><br>
+<TMPL_VAR date><br>
+<em>All times are UTC.</em><br>
+<br>
+Powered by:<br>
+<a href="http://www.planetplanet.org/"><img src="images/planet.png" width="80" height="15" alt="Planet" border="0"></a>
+</p>
+
+<p>
+<h2>Planetarium:</h2>
+<ul>
+<li><a href="http://www.planetapache.org/">Planet Apache</a></li>
+<li><a href="http://planet.debian.net/">Planet Debian</a></li>
+<li><a href="http://planet.freedesktop.org/">Planet freedesktop.org</a></li>
+<li><a href="http://planet.gnome.org/">Planet GNOME</a></li>
+<li><a href="http://planetsun.org/">Planet Sun</a></li>
+<li><a href="http://fedora.linux.duke.edu/fedorapeople/">Fedora People</a></li>
+<li><a href="http://www.planetplanet.org/">more...</a></li>
+</ul>
+</p>
+</div>
+</body>
+
+</html>
Deleted: trunk/lib/venus/themes/classic_fancy/planet.css
===================================================================
--- branches/sucs-site/lib/venus/themes/classic_fancy/planet.css 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/lib/venus/themes/classic_fancy/planet.css 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,150 +0,0 @@
-body {
- border-right: 1px solid black;
- margin-right: 200px;
-
- padding-left: 20px;
- padding-right: 20px;
-}
-
-h1 {
- margin-top: 0px;
- padding-top: 20px;
-
- font-family: "Bitstream Vera Sans", sans-serif;
- font-weight: normal;
- letter-spacing: -2px;
- text-transform: lowercase;
- text-align: right;
-
- color: grey;
-}
-
-.admin {
- text-align: right;
-}
-
-h2 {
- font-family: "Bitstream Vera Sans", sans-serif;
- font-weight: normal;
- color: #200080;
-
- margin-left: -20px;
-}
-
-h3 {
- font-family: "Bitstream Vera Sans", sans-serif;
- font-weight: normal;
-
- background-color: #a0c0ff;
- border: 1px solid #5080b0;
-
- padding: 4px;
-}
-
-h3 a {
- text-decoration: none;
- color: inherit;
-}
-
-h4 {
- font-family: "Bitstream Vera Sans", sans-serif;
- font-weight: bold;
-}
-
-h4 a {
- text-decoration: none;
- color: inherit;
-}
-
-img.face {
- float: right;
- margin-top: -3em;
-}
-
-.entry {
- margin-bottom: 2em;
-}
-
-.entry .date {
- font-family: "Bitstream Vera Sans", sans-serif;
- color: grey;
-}
-
-.entry .date a {
- text-decoration: none;
- color: inherit;
-}
-
-.sidebar {
- position: absolute;
- top: 0px;
- right: 0px;
- width: 200px;
-
- margin-left: 0px;
- margin-right: 0px;
- padding-right: 0px;
-
- padding-top: 20px;
- padding-left: 0px;
-
- font-family: "Bitstream Vera Sans", sans-serif;
- font-size: 85%;
-}
-
-.sidebar h2 {
- font-size: 110%;
- font-weight: bold;
- color: black;
-
- padding-left: 5px;
- margin-left: 0px;
-}
-
-.sidebar ul {
- padding-left: 1em;
- margin-left: 0px;
-
- list-style-type: none;
-}
-
-.sidebar ul li:hover {
- color: grey;
-}
-
-.sidebar ul li a {
- text-decoration: none;
-}
-
-.sidebar ul li a:hover {
- text-decoration: underline;
-}
-
-.sidebar ul li a img {
- border: 0;
-}
-
-.sidebar p {
- border-top: 1px solid grey;
- margin-top: 30px;
- padding-top: 10px;
-
- padding-left: 5px;
-}
-
-.sidebar .message {
- cursor: help;
- border-bottom: 1px dashed red;
-}
-
-.sidebar a.message:hover {
- cursor: help;
- background-color: #ff0000;
- color: #ffffff !important;
- text-decoration: none !important;
-}
-
-a:hover {
- text-decoration: underline !important;
- color: blue !important;
-}
Copied: trunk/lib/venus/themes/classic_fancy/planet.css (from rev 656, branches/sucs-site/lib/venus/themes/classic_fancy/planet.css)
===================================================================
--- trunk/lib/venus/themes/classic_fancy/planet.css (rev 0)
+++ trunk/lib/venus/themes/classic_fancy/planet.css 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,150 @@
+body {
+ border-right: 1px solid black;
+ margin-right: 200px;
+
+ padding-left: 20px;
+ padding-right: 20px;
+}
+
+h1 {
+ margin-top: 0px;
+ padding-top: 20px;
+
+ font-family: "Bitstream Vera Sans", sans-serif;
+ font-weight: normal;
+ letter-spacing: -2px;
+ text-transform: lowercase;
+ text-align: right;
+
+ color: grey;
+}
+
+.admin {
+ text-align: right;
+}
+
+h2 {
+ font-family: "Bitstream Vera Sans", sans-serif;
+ font-weight: normal;
+ color: #200080;
+
+ margin-left: -20px;
+}
+
+h3 {
+ font-family: "Bitstream Vera Sans", sans-serif;
+ font-weight: normal;
+
+ background-color: #a0c0ff;
+ border: 1px solid #5080b0;
+
+ padding: 4px;
+}
+
+h3 a {
+ text-decoration: none;
+ color: inherit;
+}
+
+h4 {
+ font-family: "Bitstream Vera Sans", sans-serif;
+ font-weight: bold;
+}
+
+h4 a {
+ text-decoration: none;
+ color: inherit;
+}
+
+img.face {
+ float: right;
+ margin-top: -3em;
+}
+
+.entry {
+ margin-bottom: 2em;
+}
+
+.entry .date {
+ font-family: "Bitstream Vera Sans", sans-serif;
+ color: grey;
+}
+
+.entry .date a {
+ text-decoration: none;
+ color: inherit;
+}
+
+.sidebar {
+ position: absolute;
+ top: 0px;
+ right: 0px;
+ width: 200px;
+
+ margin-left: 0px;
+ margin-right: 0px;
+ padding-right: 0px;
+
+ padding-top: 20px;
+ padding-left: 0px;
+
+ font-family: "Bitstream Vera Sans", sans-serif;
+ font-size: 85%;
+}
+
+.sidebar h2 {
+ font-size: 110%;
+ font-weight: bold;
+ color: black;
+
+ padding-left: 5px;
+ margin-left: 0px;
+}
+
+.sidebar ul {
+ padding-left: 1em;
+ margin-left: 0px;
+
+ list-style-type: none;
+}
+
+.sidebar ul li:hover {
+ color: grey;
+}
+
+.sidebar ul li a {
+ text-decoration: none;
+}
+
+.sidebar ul li a:hover {
+ text-decoration: underline;
+}
+
+.sidebar ul li a img {
+ border: 0;
+}
+
+.sidebar p {
+ border-top: 1px solid grey;
+ margin-top: 30px;
+ padding-top: 10px;
+
+ padding-left: 5px;
+}
+
+.sidebar .message {
+ cursor: help;
+ border-bottom: 1px dashed red;
+}
+
+.sidebar a.message:hover {
+ cursor: help;
+ background-color: #ff0000;
+ color: #ffffff !important;
+ text-decoration: none !important;
+}
+
+a:hover {
+ text-decoration: underline !important;
+ color: blue !important;
+}
Deleted: trunk/lib/venus/themes/common/atom.xml.xslt
===================================================================
--- branches/sucs-site/lib/venus/themes/common/atom.xml.xslt 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/lib/venus/themes/common/atom.xml.xslt 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,80 +0,0 @@
-<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
- xmlns:access="http://www.bloglines.com/about/specs/fac-1.0"
- xmlns:atom="http://www.w3.org/2005/Atom"
- xmlns:indexing="urn:atom-extension:indexing"
- xmlns:planet="http://planet.intertwingly.net/"
- xmlns:xhtml="http://www.w3.org/1999/xhtml"
- xmlns="http://www.w3.org/1999/xhtml"
- exclude-result-prefixes="planet xhtml">
-
- <!-- strip planet elements and attributes -->
- <xsl:template match="planet:*|@planet:*"/>
-
- <!-- strip obsolete link relationships -->
- <xsl:template match="atom:link[@rel='service.edit']"/>
- <xsl:template match="atom:link[@rel='service.post']"/>
- <xsl:template match="atom:link[@rel='service.feed']"/>
-
- <!-- Feedburner detritus -->
- <xsl:template match="xhtml:div[@class='feedflare']"/>
-
- <!-- Strip site meter -->
- <xsl:template match="xhtml:div[comment()[. = ' Site Meter ']]"/>
-
- <!-- add Google/LiveJournal-esque and Bloglines noindex directive -->
- <xsl:template match="atom:feed">
- <xsl:copy>
- <xsl:attribute name="indexing:index">no</xsl:attribute>
- <xsl:apply-templates select="@*"/>
- <access:restriction relationship="deny"/>
- <xsl:apply-templates select="node()"/>
- <xsl:text>
</xsl:text>
- </xsl:copy>
- </xsl:template>
-
-<!-- popular customization: add planet name to each entry title
- <xsl:template match="atom:entry/atom:title">
- <xsl:text>
</xsl:text>
- <xsl:copy>
- <xsl:apply-templates select="@*"/>
- <xsl:value-of select="../atom:source/planet:name"/>
- <xsl:text>: </xsl:text>
- <xsl:apply-templates select="node()"/>
- </xsl:copy>
- </xsl:template>
--->
-
- <!-- indent atom elements -->
- <xsl:template match="atom:*">
- <!-- double space before atom:entries -->
- <xsl:if test="self::atom:entry">
- <xsl:text>
</xsl:text>
- </xsl:if>
-
- <!-- indent start tag -->
- <xsl:text>
</xsl:text>
- <xsl:for-each select="ancestor::*">
- <xsl:text> </xsl:text>
- </xsl:for-each>
-
- <xsl:copy>
- <xsl:apply-templates select="@*|node()"/>
-
- <!-- indent end tag if there are element children -->
- <xsl:if test="*">
- <xsl:text>
</xsl:text>
- <xsl:for-each select="ancestor::*">
- <xsl:text> </xsl:text>
- </xsl:for-each>
- </xsl:if>
- </xsl:copy>
- </xsl:template>
-
- <!-- pass through everything else -->
- <xsl:template match="@*|node()">
- <xsl:copy>
- <xsl:apply-templates select="@*|node()"/>
- </xsl:copy>
- </xsl:template>
-
-</xsl:stylesheet>
Copied: trunk/lib/venus/themes/common/atom.xml.xslt (from rev 656, branches/sucs-site/lib/venus/themes/common/atom.xml.xslt)
===================================================================
--- trunk/lib/venus/themes/common/atom.xml.xslt (rev 0)
+++ trunk/lib/venus/themes/common/atom.xml.xslt 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,80 @@
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
+ xmlns:access="http://www.bloglines.com/about/specs/fac-1.0"
+ xmlns:atom="http://www.w3.org/2005/Atom"
+ xmlns:indexing="urn:atom-extension:indexing"
+ xmlns:planet="http://planet.intertwingly.net/"
+ xmlns:xhtml="http://www.w3.org/1999/xhtml"
+ xmlns="http://www.w3.org/1999/xhtml"
+ exclude-result-prefixes="planet xhtml">
+
+ <!-- strip planet elements and attributes -->
+ <xsl:template match="planet:*|@planet:*"/>
+
+ <!-- strip obsolete link relationships -->
+ <xsl:template match="atom:link[@rel='service.edit']"/>
+ <xsl:template match="atom:link[@rel='service.post']"/>
+ <xsl:template match="atom:link[@rel='service.feed']"/>
+
+ <!-- Feedburner detritus -->
+ <xsl:template match="xhtml:div[@class='feedflare']"/>
+
+ <!-- Strip site meter -->
+ <xsl:template match="xhtml:div[comment()[. = ' Site Meter ']]"/>
+
+ <!-- add Google/LiveJournal-esque and Bloglines noindex directive -->
+ <xsl:template match="atom:feed">
+ <xsl:copy>
+ <xsl:attribute name="indexing:index">no</xsl:attribute>
+ <xsl:apply-templates select="@*"/>
+ <access:restriction relationship="deny"/>
+ <xsl:apply-templates select="node()"/>
+ <xsl:text>
</xsl:text>
+ </xsl:copy>
+ </xsl:template>
+
+<!-- popular customization: add planet name to each entry title
+ <xsl:template match="atom:entry/atom:title">
+ <xsl:text>
</xsl:text>
+ <xsl:copy>
+ <xsl:apply-templates select="@*"/>
+ <xsl:value-of select="../atom:source/planet:name"/>
+ <xsl:text>: </xsl:text>
+ <xsl:apply-templates select="node()"/>
+ </xsl:copy>
+ </xsl:template>
+-->
+
+ <!-- indent atom elements -->
+ <xsl:template match="atom:*">
+ <!-- double space before atom:entries -->
+ <xsl:if test="self::atom:entry">
+ <xsl:text>
</xsl:text>
+ </xsl:if>
+
+ <!-- indent start tag -->
+ <xsl:text>
</xsl:text>
+ <xsl:for-each select="ancestor::*">
+ <xsl:text> </xsl:text>
+ </xsl:for-each>
+
+ <xsl:copy>
+ <xsl:apply-templates select="@*|node()"/>
+
+ <!-- indent end tag if there are element children -->
+ <xsl:if test="*">
+ <xsl:text>
</xsl:text>
+ <xsl:for-each select="ancestor::*">
+ <xsl:text> </xsl:text>
+ </xsl:for-each>
+ </xsl:if>
+ </xsl:copy>
+ </xsl:template>
+
+ <!-- pass through everything else -->
+ <xsl:template match="@*|node()">
+ <xsl:copy>
+ <xsl:apply-templates select="@*|node()"/>
+ </xsl:copy>
+ </xsl:template>
+
+</xsl:stylesheet>
Deleted: trunk/lib/venus/themes/common/foafroll.xml.xslt
===================================================================
--- branches/sucs-site/lib/venus/themes/common/foafroll.xml.xslt 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/lib/venus/themes/common/foafroll.xml.xslt 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,39 +0,0 @@
-<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
- xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
- xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
- xmlns:foaf="http://xmlns.com/foaf/0.1/"
- xmlns:rss="http://purl.org/rss/1.0/"
- xmlns:dc="http://purl.org/dc/elements/1.1/"
- xmlns:atom="http://www.w3.org/2005/Atom"
- xmlns:planet="http://planet.intertwingly.net/"
- exclude-result-prefixes="atom planet">
-
- <xsl:output indent="yes" method="xml"/>
-
- <xsl:template match="atom:feed">
- <rdf:RDF>
- <foaf:Group>
- <foaf:name><xsl:value-of select="atom:author/atom:name"/></foaf:name>
- <foaf:homepage><xsl:value-of select="atom:author/atom:uri"/></foaf:homepage>
-
- <xsl:apply-templates select="planet:source"/>
- </foaf:Group>
- </rdf:RDF>
- </xsl:template>
-
- <xsl:template match="planet:source">
- <foaf:member>
- <foaf:Agent>
- <foaf:name><xsl:value-of select="planet:name"/></foaf:name>
- <foaf:weblog>
- <foaf:Document rdf:about="{atom:link[@rel='alternate']/@href}">
- <dc:title><xsl:value-of select="atom:title"/></dc:title>
- <rdfs:seeAlso>
- <rss:channel rdf:about="{atom:link[@rel='self']/@href}" />
- </rdfs:seeAlso>
- </foaf:Document>
- </foaf:weblog>
- </foaf:Agent>
- </foaf:member>
- </xsl:template>
-</xsl:stylesheet>
Copied: trunk/lib/venus/themes/common/foafroll.xml.xslt (from rev 656, branches/sucs-site/lib/venus/themes/common/foafroll.xml.xslt)
===================================================================
--- trunk/lib/venus/themes/common/foafroll.xml.xslt (rev 0)
+++ trunk/lib/venus/themes/common/foafroll.xml.xslt 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,39 @@
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
+ xmlns:foaf="http://xmlns.com/foaf/0.1/"
+ xmlns:rss="http://purl.org/rss/1.0/"
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:atom="http://www.w3.org/2005/Atom"
+ xmlns:planet="http://planet.intertwingly.net/"
+ exclude-result-prefixes="atom planet">
+
+ <xsl:output indent="yes" method="xml"/>
+
+ <xsl:template match="atom:feed">
+ <rdf:RDF>
+ <foaf:Group>
+ <foaf:name><xsl:value-of select="atom:author/atom:name"/></foaf:name>
+ <foaf:homepage><xsl:value-of select="atom:author/atom:uri"/></foaf:homepage>
+
+ <xsl:apply-templates select="planet:source"/>
+ </foaf:Group>
+ </rdf:RDF>
+ </xsl:template>
+
+ <xsl:template match="planet:source">
+ <foaf:member>
+ <foaf:Agent>
+ <foaf:name><xsl:value-of select="planet:name"/></foaf:name>
+ <foaf:weblog>
+ <foaf:Document rdf:about="{atom:link[@rel='alternate']/@href}">
+ <dc:title><xsl:value-of select="atom:title"/></dc:title>
+ <rdfs:seeAlso>
+ <rss:channel rdf:about="{atom:link[@rel='self']/@href}" />
+ </rdfs:seeAlso>
+ </foaf:Document>
+ </foaf:weblog>
+ </foaf:Agent>
+ </foaf:member>
+ </xsl:template>
+</xsl:stylesheet>
Deleted: trunk/lib/venus/themes/common/images/feed-icon-10x10.png
===================================================================
(Binary files differ)
Copied: trunk/lib/venus/themes/common/images/feed-icon-10x10.png (from rev 656, branches/sucs-site/lib/venus/themes/common/images/feed-icon-10x10.png)
===================================================================
(Binary files differ)
Deleted: trunk/lib/venus/themes/common/images/foaf.png
===================================================================
(Binary files differ)
Copied: trunk/lib/venus/themes/common/images/foaf.png (from rev 656, branches/sucs-site/lib/venus/themes/common/images/foaf.png)
===================================================================
(Binary files differ)
Deleted: trunk/lib/venus/themes/common/images/logo.png
===================================================================
(Binary files differ)
Copied: trunk/lib/venus/themes/common/images/logo.png (from rev 656, branches/sucs-site/lib/venus/themes/common/images/logo.png)
===================================================================
(Binary files differ)
Deleted: trunk/lib/venus/themes/common/images/opml.png
===================================================================
(Binary files differ)
Copied: trunk/lib/venus/themes/common/images/opml.png (from rev 656, branches/sucs-site/lib/venus/themes/common/images/opml.png)
===================================================================
(Binary files differ)
Deleted: trunk/lib/venus/themes/common/images/planet.png
===================================================================
(Binary files differ)
Copied: trunk/lib/venus/themes/common/images/planet.png (from rev 656, branches/sucs-site/lib/venus/themes/common/images/planet.png)
===================================================================
(Binary files differ)
Deleted: trunk/lib/venus/themes/common/images/tcosm11.gif
===================================================================
(Binary files differ)
Copied: trunk/lib/venus/themes/common/images/tcosm11.gif (from rev 656, branches/sucs-site/lib/venus/themes/common/images/tcosm11.gif)
===================================================================
(Binary files differ)
Deleted: trunk/lib/venus/themes/common/images/venus.ico
===================================================================
(Binary files differ)
Copied: trunk/lib/venus/themes/common/images/venus.ico (from rev 656, branches/sucs-site/lib/venus/themes/common/images/venus.ico)
===================================================================
(Binary files differ)
Deleted: trunk/lib/venus/themes/common/images/venus.png
===================================================================
(Binary files differ)
Copied: trunk/lib/venus/themes/common/images/venus.png (from rev 656, branches/sucs-site/lib/venus/themes/common/images/venus.png)
===================================================================
(Binary files differ)
Deleted: trunk/lib/venus/themes/common/opml.xml.xslt
===================================================================
--- branches/sucs-site/lib/venus/themes/common/opml.xml.xslt 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/lib/venus/themes/common/opml.xml.xslt 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,40 +0,0 @@
-<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
- xmlns:atom="http://www.w3.org/2005/Atom"
- xmlns:planet="http://planet.intertwingly.net/"
- exclude-result-prefixes="atom planet">
-
- <xsl:output indent="yes" method="xml"/>
-
- <xsl:template name="rfc822" xmlns:date="http://exslt.org/dates-and-times">
- <xsl:param name="date"/>
- <!-- http://www.trachtenberg.com/blog/2005/03/03/xslt-cookbook-generating-an-rfc-822-date/ -->
- <xsl:value-of select="concat(date:day-abbreviation($date), ', ',
- format-number(date:day-in-month($date), '00'), ' ',
- date:month-abbreviation($date), ' ', date:year($date), ' ',
- format-number(date:hour-in-day($date), '00'), ':',
- format-number(date:minute-in-hour($date), '00'), ':',
- format-number(date:second-in-minute($date), '00'), ' GMT')"/>
- </xsl:template>
-
- <xsl:template match="atom:feed">
- <opml version="1.1">
- <head>
- <title><xsl:value-of select="atom:title"/></title>
- <dateModified>
- <xsl:call-template name="rfc822">
- <xsl:with-param name="date" select="atom:updated"/>
- </xsl:call-template>
- </dateModified>
- <ownerName><xsl:value-of select="atom:author/atom:name"/></ownerName>
- <ownerEmail><xsl:value-of select="atom:author/atom:email"/></ownerEmail>
- </head>
-
- <body>
- <xsl:for-each select="planet:source">
- <outline type="rss" text="{planet:name}" title="{atom:title}"
- xmlUrl="{atom:link[@rel='self']/@href}"/>
- </xsl:for-each>
- </body>
- </opml>
- </xsl:template>
-</xsl:stylesheet>
Copied: trunk/lib/venus/themes/common/opml.xml.xslt (from rev 656, branches/sucs-site/lib/venus/themes/common/opml.xml.xslt)
===================================================================
--- trunk/lib/venus/themes/common/opml.xml.xslt (rev 0)
+++ trunk/lib/venus/themes/common/opml.xml.xslt 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,40 @@
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
+ xmlns:atom="http://www.w3.org/2005/Atom"
+ xmlns:planet="http://planet.intertwingly.net/"
+ exclude-result-prefixes="atom planet">
+
+ <xsl:output indent="yes" method="xml"/>
+
+ <xsl:template name="rfc822" xmlns:date="http://exslt.org/dates-and-times">
+ <xsl:param name="date"/>
+ <!-- http://www.trachtenberg.com/blog/2005/03/03/xslt-cookbook-generating-an-rfc-822-date/ -->
+ <xsl:value-of select="concat(date:day-abbreviation($date), ', ',
+ format-number(date:day-in-month($date), '00'), ' ',
+ date:month-abbreviation($date), ' ', date:year($date), ' ',
+ format-number(date:hour-in-day($date), '00'), ':',
+ format-number(date:minute-in-hour($date), '00'), ':',
+ format-number(date:second-in-minute($date), '00'), ' GMT')"/>
+ </xsl:template>
+
+ <xsl:template match="atom:feed">
+ <opml version="1.1">
+ <head>
+ <title><xsl:value-of select="atom:title"/></title>
+ <dateModified>
+ <xsl:call-template name="rfc822">
+ <xsl:with-param name="date" select="atom:updated"/>
+ </xsl:call-template>
+ </dateModified>
+ <ownerName><xsl:value-of select="atom:author/atom:name"/></ownerName>
+ <ownerEmail><xsl:value-of select="atom:author/atom:email"/></ownerEmail>
+ </head>
+
+ <body>
+ <xsl:for-each select="planet:source">
+ <outline type="rss" text="{planet:name}" title="{atom:title}"
+ xmlUrl="{atom:link[@rel='self']/@href}"/>
+ </xsl:for-each>
+ </body>
+ </opml>
+ </xsl:template>
+</xsl:stylesheet>
Deleted: trunk/lib/venus/themes/common/rss10.xml.tmpl
===================================================================
--- branches/sucs-site/lib/venus/themes/common/rss10.xml.tmpl 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/lib/venus/themes/common/rss10.xml.tmpl 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,37 +0,0 @@
-<?xml version="1.0"?>
-<rdf:RDF
- xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
- xmlns:dc="http://purl.org/dc/elements/1.1/"
- xmlns:foaf="http://xmlns.com/foaf/0.1/"
- xmlns:content="http://purl.org/rss/1.0/modules/content/"
- xmlns="http://purl.org/rss/1.0/"
->
-<channel rdf:about="<TMPL_VAR link ESCAPE="HTML">">
- <title><TMPL_VAR name ESCAPE="HTML"></title>
- <link><TMPL_VAR link ESCAPE="HTML"></link>
- <description><TMPL_VAR name ESCAPE="HTML"> - <TMPL_VAR link ESCAPE="HTML"></description>
-
- <items>
- <rdf:Seq>
-<TMPL_LOOP Items>
- <rdf:li rdf:resource="<TMPL_VAR id ESCAPE="HTML">" />
-</TMPL_LOOP>
- </rdf:Seq>
- </items>
-</channel>
-
-<TMPL_LOOP Items>
-<item rdf:about="<TMPL_VAR id ESCAPE="HTML">">
- <title><TMPL_VAR channel_name ESCAPE="HTML"><TMPL_IF title>: <TMPL_VAR title_plain ESCAPE="HTML"></TMPL_IF></title>
- <link><TMPL_VAR link ESCAPE="HTML"></link>
- <TMPL_IF content>
- <content:encoded><TMPL_VAR content ESCAPE="HTML"></content:encoded>
- </TMPL_IF>
- <dc:date><TMPL_VAR date_iso></dc:date>
- <TMPL_IF author_name>
- <dc:creator><TMPL_VAR author_name></dc:creator>
- </TMPL_IF>
-</item>
-</TMPL_LOOP>
-
-</rdf:RDF>
Copied: trunk/lib/venus/themes/common/rss10.xml.tmpl (from rev 656, branches/sucs-site/lib/venus/themes/common/rss10.xml.tmpl)
===================================================================
--- trunk/lib/venus/themes/common/rss10.xml.tmpl (rev 0)
+++ trunk/lib/venus/themes/common/rss10.xml.tmpl 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,37 @@
+<?xml version="1.0"?>
+<rdf:RDF
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:foaf="http://xmlns.com/foaf/0.1/"
+ xmlns:content="http://purl.org/rss/1.0/modules/content/"
+ xmlns="http://purl.org/rss/1.0/"
+>
+<channel rdf:about="<TMPL_VAR link ESCAPE="HTML">">
+ <title><TMPL_VAR name ESCAPE="HTML"></title>
+ <link><TMPL_VAR link ESCAPE="HTML"></link>
+ <description><TMPL_VAR name ESCAPE="HTML"> - <TMPL_VAR link ESCAPE="HTML"></description>
+
+ <items>
+ <rdf:Seq>
+<TMPL_LOOP Items>
+ <rdf:li rdf:resource="<TMPL_VAR id ESCAPE="HTML">" />
+</TMPL_LOOP>
+ </rdf:Seq>
+ </items>
+</channel>
+
+<TMPL_LOOP Items>
+<item rdf:about="<TMPL_VAR id ESCAPE="HTML">">
+ <title><TMPL_VAR channel_name ESCAPE="HTML"><TMPL_IF title>: <TMPL_VAR title_plain ESCAPE="HTML"></TMPL_IF></title>
+ <link><TMPL_VAR link ESCAPE="HTML"></link>
+ <TMPL_IF content>
+ <content:encoded><TMPL_VAR content ESCAPE="HTML"></content:encoded>
+ </TMPL_IF>
+ <dc:date><TMPL_VAR date_iso></dc:date>
+ <TMPL_IF author_name>
+ <dc:creator><TMPL_VAR author_name></dc:creator>
+ </TMPL_IF>
+</item>
+</TMPL_LOOP>
+
+</rdf:RDF>
Deleted: trunk/lib/venus/themes/common/rss20.xml.tmpl
===================================================================
--- branches/sucs-site/lib/venus/themes/common/rss20.xml.tmpl 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/lib/venus/themes/common/rss20.xml.tmpl 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,33 +0,0 @@
-<?xml version="1.0"?>
-<rss version="2.0">
-
-<channel>
- <title><TMPL_VAR name></title>
- <link><TMPL_VAR link ESCAPE="HTML"></link>
- <language>en</language>
- <description><TMPL_VAR name ESCAPE="HTML"> - <TMPL_VAR link ESCAPE="HTML"></description>
-
-<TMPL_LOOP Items>
-<item>
- <title><TMPL_VAR channel_name ESCAPE="HTML"><TMPL_IF title>: <TMPL_VAR title_plain ESCAPE="HTML"></TMPL_IF></title>
- <guid isPermaLink="<TMPL_VAR guid_isPermaLink>"><TMPL_VAR id ESCAPE="HTML"></guid>
- <link><TMPL_VAR link ESCAPE="HTML"></link>
- <TMPL_IF content>
- <description><TMPL_VAR content ESCAPE="HTML"></description>
- </TMPL_IF>
- <pubDate><TMPL_VAR date_822></pubDate>
- <TMPL_IF author_email>
- <TMPL_IF author_name>
- <author><TMPL_VAR author_email> (<TMPL_VAR author_name>)</author>
- <TMPL_ELSE>
- <author><TMPL_VAR author_email></author>
- </TMPL_IF>
- </TMPL_IF>
- <TMPL_IF enclosure_href>
- <enclosure url="<TMPL_VAR enclosure_href ESCAPE="HTML">" length="<TMPL_VAR enclosure_length>" type="<TMPL_VAR enclosure_type>"/>
- </TMPL_IF>
-</item>
-</TMPL_LOOP>
-
-</channel>
-</rss>
Copied: trunk/lib/venus/themes/common/rss20.xml.tmpl (from rev 656, branches/sucs-site/lib/venus/themes/common/rss20.xml.tmpl)
===================================================================
--- trunk/lib/venus/themes/common/rss20.xml.tmpl (rev 0)
+++ trunk/lib/venus/themes/common/rss20.xml.tmpl 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,33 @@
+<?xml version="1.0"?>
+<rss version="2.0">
+
+<channel>
+ <title><TMPL_VAR name></title>
+ <link><TMPL_VAR link ESCAPE="HTML"></link>
+ <language>en</language>
+ <description><TMPL_VAR name ESCAPE="HTML"> - <TMPL_VAR link ESCAPE="HTML"></description>
+
+<TMPL_LOOP Items>
+<item>
+ <title><TMPL_VAR channel_name ESCAPE="HTML"><TMPL_IF title>: <TMPL_VAR title_plain ESCAPE="HTML"></TMPL_IF></title>
+ <guid isPermaLink="<TMPL_VAR guid_isPermaLink>"><TMPL_VAR id ESCAPE="HTML"></guid>
+ <link><TMPL_VAR link ESCAPE="HTML"></link>
+ <TMPL_IF content>
+ <description><TMPL_VAR content ESCAPE="HTML"></description>
+ </TMPL_IF>
+ <pubDate><TMPL_VAR date_822></pubDate>
+ <TMPL_IF author_email>
+ <TMPL_IF author_name>
+ <author><TMPL_VAR author_email> (<TMPL_VAR author_name>)</author>
+ <TMPL_ELSE>
+ <author><TMPL_VAR author_email></author>
+ </TMPL_IF>
+ </TMPL_IF>
+ <TMPL_IF enclosure_href>
+ <enclosure url="<TMPL_VAR enclosure_href ESCAPE="HTML">" length="<TMPL_VAR enclosure_length>" type="<TMPL_VAR enclosure_type>"/>
+ </TMPL_IF>
+</item>
+</TMPL_LOOP>
+
+</channel>
+</rss>
Deleted: trunk/lib/venus/themes/common/validate.html.xslt
===================================================================
--- branches/sucs-site/lib/venus/themes/common/validate.html.xslt 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/lib/venus/themes/common/validate.html.xslt 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,146 +0,0 @@
-<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
- xmlns:atom="http://www.w3.org/2005/Atom"
- xmlns:xhtml="http://www.w3.org/1999/xhtml"
- xmlns:planet="http://planet.intertwingly.net/"
- xmlns="http://www.w3.org/1999/xhtml">
-
- <xsl:template match="atom:feed">
- <html xmlns="http://www.w3.org/1999/xhtml">
-
- <!-- head -->
- <xsl:text>
</xsl:text>
- <head>
- <title><xsl:value-of select="atom:title"/></title>
- <meta name="robots" content="noindex,nofollow" />
- <meta name="generator" content="{atom:generator}" />
- <link rel="shortcut icon" href="/favicon.ico" />
- <style type="text/css">
- img{border:0}
- a{text-decoration:none}
- a:hover{text-decoration:underline}
- .message{border-bottom:1px dashed red} a.message:hover{cursor: help;text-decoration: none}
- dl{margin:0}
- dt{float:left;width:9em}
- dt:after{content:':'}
- </style>
- </head>
-
- <!-- body -->
- <xsl:text>
</xsl:text>
- <body>
- <table border="1" cellpadding="3" cellspacing="0">
- <thead>
- <tr>
- <th></th>
- <th>Name</th>
- <th>Format</th>
- <xsl:if test="//planet:ignore_in_feed | //planet:filters |
- //planet:xml_base | //planet:*[contains(local-name(),'_type')]">
- <th>Notes</th>
- </xsl:if>
- </tr>
- </thead>
- <xsl:apply-templates select="planet:source">
- <xsl:sort select="planet:name"/>
- </xsl:apply-templates>
- <xsl:text>
</xsl:text>
- </table>
- </body>
- </html>
- </xsl:template>
-
- <xsl:template match="planet:source">
- <xsl:variable name="validome_format">
- <xsl:choose>
- <xsl:when test="planet:format = 'rss090'">rss_0_90</xsl:when>
- <xsl:when test="planet:format = 'rss091n'">rss_0_91</xsl:when>
- <xsl:when test="planet:format = 'rss091u'">rss_0_91</xsl:when>
- <xsl:when test="planet:format = 'rss10'">rss_1_0</xsl:when>
- <xsl:when test="planet:format = 'rss092'">rss_0_90</xsl:when>
- <xsl:when test="planet:format = 'rss093'"></xsl:when>
- <xsl:when test="planet:format = 'rss094'">rss_0_90</xsl:when>
- <xsl:when test="planet:format = 'rss20'">rss_2_0</xsl:when>
- <xsl:when test="planet:format = 'rss'">rss_2_0</xsl:when>
- <xsl:when test="planet:format = 'atom01'"></xsl:when>
- <xsl:when test="planet:format = 'atom02'"></xsl:when>
- <xsl:when test="planet:format = 'atom03'">atom_0_3</xsl:when>
- <xsl:when test="planet:format = 'atom10'">atom_1_0</xsl:when>
- <xsl:when test="planet:format = 'atom'">atom_1_0</xsl:when>
- <xsl:when test="planet:format = 'cdf'"></xsl:when>
- <xsl:when test="planet:format = 'hotrss'"></xsl:when>
- </xsl:choose>
- </xsl:variable>
-
- <xsl:text>
</xsl:text>
- <tr>
- <xsl:if test="planet:bozo='true'">
- <xsl:attribute name="style">background-color:#FCC</xsl:attribute>
- </xsl:if>
- <td>
- <a title="feed validator">
- <xsl:attribute name="href">
- <xsl:text>http://feedvalidator.org/check?url=</xsl:text>
- <xsl:choose>
- <xsl:when test="planet:http_location">
- <xsl:value-of select="planet:http_location"/>
- </xsl:when>
- <xsl:when test="atom:link[@rel='self']/@href">
- <xsl:value-of select="atom:link[@rel='self']/@href"/>
- </xsl:when>
- </xsl:choose>
- </xsl:attribute>
- <img src="http://feedvalidator.org/favicon.ico" hspace='2' vspace='1'/>
- </a>
- <a title="validome">
- <xsl:attribute name="href">
- <xsl:text>http://www.validome.org/rss-atom/validate?</xsl:text>
- <xsl:text>viewSourceCode=1&version=</xsl:text>
- <xsl:value-of select="$validome_format"/>
- <xsl:text>&url=</xsl:text>
- <xsl:choose>
- <xsl:when test="planet:http_location">
- <xsl:value-of select="planet:http_location"/>
- </xsl:when>
- <xsl:when test="atom:link[@rel='self']/@href">
- <xsl:value-of select="atom:link[@rel='self']/@href"/>
- </xsl:when>
- </xsl:choose>
- </xsl:attribute>
- <img src="http://validome.org/favicon.ico" hspace='2' vspace='1'/>
- </a>
- </td>
- <td>
- <a href="{atom:link[@rel='alternate']/@href}">
- <xsl:choose>
- <xsl:when test="planet:message">
- <xsl:attribute name="class">message</xsl:attribute>
- <xsl:attribute name="title">
- <xsl:value-of select="planet:message"/>
- </xsl:attribute>
- </xsl:when>
- <xsl:when test="atom:title">
- <xsl:attribute name="title">
- <xsl:value-of select="atom:title"/>
- </xsl:attribute>
- </xsl:when>
- </xsl:choose>
- <xsl:value-of select="planet:name"/>
- </a>
- </td>
- <td><xsl:value-of select="planet:format"/></td>
- <xsl:if test="planet:ignore_in_feed | planet:filters | planet:xml_base |
- planet:*[contains(local-name(),'_type')]">
- <td>
- <dl>
- <xsl:for-each select="planet:ignore_in_feed | planet:filters |
- planet:xml_base | planet:*[contains(local-name(),'_type')]">
- <xsl:sort select="local-name()"/>
- <dt><xsl:value-of select="local-name()"/></dt>
- <dd><xsl:value-of select="."/></dd>
- </xsl:for-each>
- </dl>
- </td>
- </xsl:if>
- </tr>
- </xsl:template>
-</xsl:stylesheet>
Copied: trunk/lib/venus/themes/common/validate.html.xslt (from rev 656, branches/sucs-site/lib/venus/themes/common/validate.html.xslt)
===================================================================
--- trunk/lib/venus/themes/common/validate.html.xslt (rev 0)
+++ trunk/lib/venus/themes/common/validate.html.xslt 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,146 @@
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
+ xmlns:atom="http://www.w3.org/2005/Atom"
+ xmlns:xhtml="http://www.w3.org/1999/xhtml"
+ xmlns:planet="http://planet.intertwingly.net/"
+ xmlns="http://www.w3.org/1999/xhtml">
+
+ <xsl:template match="atom:feed">
+ <html xmlns="http://www.w3.org/1999/xhtml">
+
+ <!-- head -->
+ <xsl:text>
</xsl:text>
+ <head>
+ <title><xsl:value-of select="atom:title"/></title>
+ <meta name="robots" content="noindex,nofollow" />
+ <meta name="generator" content="{atom:generator}" />
+ <link rel="shortcut icon" href="/favicon.ico" />
+ <style type="text/css">
+ img{border:0}
+ a{text-decoration:none}
+ a:hover{text-decoration:underline}
+ .message{border-bottom:1px dashed red} a.message:hover{cursor: help;text-decoration: none}
+ dl{margin:0}
+ dt{float:left;width:9em}
+ dt:after{content:':'}
+ </style>
+ </head>
+
+ <!-- body -->
+ <xsl:text>
</xsl:text>
+ <body>
+ <table border="1" cellpadding="3" cellspacing="0">
+ <thead>
+ <tr>
+ <th></th>
+ <th>Name</th>
+ <th>Format</th>
+ <xsl:if test="//planet:ignore_in_feed | //planet:filters |
+ //planet:xml_base | //planet:*[contains(local-name(),'_type')]">
+ <th>Notes</th>
+ </xsl:if>
+ </tr>
+ </thead>
+ <xsl:apply-templates select="planet:source">
+ <xsl:sort select="planet:name"/>
+ </xsl:apply-templates>
+ <xsl:text>
</xsl:text>
+ </table>
+ </body>
+ </html>
+ </xsl:template>
+
+ <xsl:template match="planet:source">
+ <xsl:variable name="validome_format">
+ <xsl:choose>
+ <xsl:when test="planet:format = 'rss090'">rss_0_90</xsl:when>
+ <xsl:when test="planet:format = 'rss091n'">rss_0_91</xsl:when>
+ <xsl:when test="planet:format = 'rss091u'">rss_0_91</xsl:when>
+ <xsl:when test="planet:format = 'rss10'">rss_1_0</xsl:when>
+ <xsl:when test="planet:format = 'rss092'">rss_0_90</xsl:when>
+ <xsl:when test="planet:format = 'rss093'"></xsl:when>
+ <xsl:when test="planet:format = 'rss094'">rss_0_90</xsl:when>
+ <xsl:when test="planet:format = 'rss20'">rss_2_0</xsl:when>
+ <xsl:when test="planet:format = 'rss'">rss_2_0</xsl:when>
+ <xsl:when test="planet:format = 'atom01'"></xsl:when>
+ <xsl:when test="planet:format = 'atom02'"></xsl:when>
+ <xsl:when test="planet:format = 'atom03'">atom_0_3</xsl:when>
+ <xsl:when test="planet:format = 'atom10'">atom_1_0</xsl:when>
+ <xsl:when test="planet:format = 'atom'">atom_1_0</xsl:when>
+ <xsl:when test="planet:format = 'cdf'"></xsl:when>
+ <xsl:when test="planet:format = 'hotrss'"></xsl:when>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:text>
</xsl:text>
+ <tr>
+ <xsl:if test="planet:bozo='true'">
+ <xsl:attribute name="style">background-color:#FCC</xsl:attribute>
+ </xsl:if>
+ <td>
+ <a title="feed validator">
+ <xsl:attribute name="href">
+ <xsl:text>http://feedvalidator.org/check?url=</xsl:text>
+ <xsl:choose>
+ <xsl:when test="planet:http_location">
+ <xsl:value-of select="planet:http_location"/>
+ </xsl:when>
+ <xsl:when test="atom:link[@rel='self']/@href">
+ <xsl:value-of select="atom:link[@rel='self']/@href"/>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:attribute>
+ <img src="http://feedvalidator.org/favicon.ico" hspace='2' vspace='1'/>
+ </a>
+ <a title="validome">
+ <xsl:attribute name="href">
+ <xsl:text>http://www.validome.org/rss-atom/validate?</xsl:text>
+ <xsl:text>viewSourceCode=1&version=</xsl:text>
+ <xsl:value-of select="$validome_format"/>
+ <xsl:text>&url=</xsl:text>
+ <xsl:choose>
+ <xsl:when test="planet:http_location">
+ <xsl:value-of select="planet:http_location"/>
+ </xsl:when>
+ <xsl:when test="atom:link[@rel='self']/@href">
+ <xsl:value-of select="atom:link[@rel='self']/@href"/>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:attribute>
+ <img src="http://validome.org/favicon.ico" hspace='2' vspace='1'/>
+ </a>
+ </td>
+ <td>
+ <a href="{atom:link[@rel='alternate']/@href}">
+ <xsl:choose>
+ <xsl:when test="planet:message">
+ <xsl:attribute name="class">message</xsl:attribute>
+ <xsl:attribute name="title">
+ <xsl:value-of select="planet:message"/>
+ </xsl:attribute>
+ </xsl:when>
+ <xsl:when test="atom:title">
+ <xsl:attribute name="title">
+ <xsl:value-of select="atom:title"/>
+ </xsl:attribute>
+ </xsl:when>
+ </xsl:choose>
+ <xsl:value-of select="planet:name"/>
+ </a>
+ </td>
+ <td><xsl:value-of select="planet:format"/></td>
+ <xsl:if test="planet:ignore_in_feed | planet:filters | planet:xml_base |
+ planet:*[contains(local-name(),'_type')]">
+ <td>
+ <dl>
+ <xsl:for-each select="planet:ignore_in_feed | planet:filters |
+ planet:xml_base | planet:*[contains(local-name(),'_type')]">
+ <xsl:sort select="local-name()"/>
+ <dt><xsl:value-of select="local-name()"/></dt>
+ <dd><xsl:value-of select="."/></dd>
+ </xsl:for-each>
+ </dl>
+ </td>
+ </xsl:if>
+ </tr>
+ </xsl:template>
+</xsl:stylesheet>
Deleted: trunk/lib/venus/themes/django/bland.css
===================================================================
--- branches/sucs-site/lib/venus/themes/django/bland.css 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/lib/venus/themes/django/bland.css 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,39 +0,0 @@
-body {
- margin: 50px 60px;
- font-family: Georgia, Times New Roman, serif;
-}
-
-h1 {
- font: normal 4em Georgia, serif;
- color: #900;
- margin-bottom: 0px;
-}
-
-.updated, .entry-tools {
- font: .8em Verdana, Arial, sans-serif;
- margin-bottom: 2em;
-}
-
-#channels {
- float: right;
- width: 30%;
- padding: 20px;
- margin: 20px;
- margin-top: 0px;
- border: 1px solid #FC6;
- background: #FFC;
-}
-
-#channels h2 {
- margin-top: 0px;
-}
-
-#channels ul {
- margin-bottom: 0px;
-}
-
-.entry {
- border-top: 1px solid #CCC;
- padding-top: 1em;
-}
-
Copied: trunk/lib/venus/themes/django/bland.css (from rev 656, branches/sucs-site/lib/venus/themes/django/bland.css)
===================================================================
--- trunk/lib/venus/themes/django/bland.css (rev 0)
+++ trunk/lib/venus/themes/django/bland.css 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,39 @@
+body {
+ margin: 50px 60px;
+ font-family: Georgia, Times New Roman, serif;
+}
+
+h1 {
+ font: normal 4em Georgia, serif;
+ color: #900;
+ margin-bottom: 0px;
+}
+
+.updated, .entry-tools {
+ font: .8em Verdana, Arial, sans-serif;
+ margin-bottom: 2em;
+}
+
+#channels {
+ float: right;
+ width: 30%;
+ padding: 20px;
+ margin: 20px;
+ margin-top: 0px;
+ border: 1px solid #FC6;
+ background: #FFC;
+}
+
+#channels h2 {
+ margin-top: 0px;
+}
+
+#channels ul {
+ margin-bottom: 0px;
+}
+
+.entry {
+ border-top: 1px solid #CCC;
+ padding-top: 1em;
+}
+
Deleted: trunk/lib/venus/themes/django/config.ini
===================================================================
--- branches/sucs-site/lib/venus/themes/django/config.ini 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/lib/venus/themes/django/config.ini 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,11 +0,0 @@
-# This theme is an example Planet Venus theme using the
-# Django template engine.
-
-[Planet]
-template_files:
- index.html.dj
-
-template_directories:
-
-bill_of_materials:
- bland.css
Copied: trunk/lib/venus/themes/django/config.ini (from rev 656, branches/sucs-site/lib/venus/themes/django/config.ini)
===================================================================
--- trunk/lib/venus/themes/django/config.ini (rev 0)
+++ trunk/lib/venus/themes/django/config.ini 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,11 @@
+# This theme is an example Planet Venus theme using the
+# Django template engine.
+
+[Planet]
+template_files:
+ index.html.dj
+
+template_directories:
+
+bill_of_materials:
+ bland.css
Deleted: trunk/lib/venus/themes/django/index.html.dj
===================================================================
--- branches/sucs-site/lib/venus/themes/django/index.html.dj 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/lib/venus/themes/django/index.html.dj 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,49 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
- "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head>
- <title>{{ name }}</title>
- <meta http-equiv="content-type" content="text/html; charset=utf-8" />
- <link rel="stylesheet" href="bland.css" type="text/css" />
-</head>
-
-<body>
-
-<h1>{{ name }}</h1>
-
-<p class="updated">
- last updated by <a href="http://intertwingly.net/code/venus/">Venus</a>
- on {{ date }} on behalf of {{ author_name }}
-</p>
-
-<div id="channels">
- <h2>Feeds</h2>
-
- <ul>
- {% for channel in Channels %}
- <li>{{ channel.title }} by {{ channel.author_name }}</li>
- {% endfor %}
- </ul>
-</div>
-
-{% for item in Items %}
-{% ifchanged item.channel_name %}
-<h3>{{ item.channel_name }}</h3>
-{% endifchanged %}
-
-<div class="entry">
- {% if item.title %}<h4>{{ item.title }}</h4>{% endif %}
-
- {{ item.content }}
-
- <p class="entry-tools">
- by {{ item.channel_author }} on
- {{ item.date }} ·
- <a href="{{ item.link }}">permalink</a>
- </p>
-</div>
-{% endfor %}
-
-</body>
-</html>
-
Copied: trunk/lib/venus/themes/django/index.html.dj (from rev 656, branches/sucs-site/lib/venus/themes/django/index.html.dj)
===================================================================
--- trunk/lib/venus/themes/django/index.html.dj (rev 0)
+++ trunk/lib/venus/themes/django/index.html.dj 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,49 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+ <title>{{ name }}</title>
+ <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+ <link rel="stylesheet" href="bland.css" type="text/css" />
+</head>
+
+<body>
+
+<h1>{{ name }}</h1>
+
+<p class="updated">
+ last updated by <a href="http://intertwingly.net/code/venus/">Venus</a>
+ on {{ date }} on behalf of {{ author_name }}
+</p>
+
+<div id="channels">
+ <h2>Feeds</h2>
+
+ <ul>
+ {% for channel in Channels %}
+ <li>{{ channel.title }} by {{ channel.author_name }}</li>
+ {% endfor %}
+ </ul>
+</div>
+
+{% for item in Items %}
+{% ifchanged item.channel_name %}
+<h3>{{ item.channel_name }}</h3>
+{% endifchanged %}
+
+<div class="entry">
+ {% if item.title %}<h4>{{ item.title }}</h4>{% endif %}
+
+ {{ item.content }}
+
+ <p class="entry-tools">
+ by {{ item.channel_author }} on
+ {{ item.date }} ·
+ <a href="{{ item.link }}">permalink</a>
+ </p>
+</div>
+{% endfor %}
+
+</body>
+</html>
+
Deleted: trunk/lib/venus/themes/genshi_fancy/config.ini
===================================================================
--- branches/sucs-site/lib/venus/themes/genshi_fancy/config.ini 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/lib/venus/themes/genshi_fancy/config.ini 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,20 +0,0 @@
-# This theme reimplements the classic "fancy" htmltmpl using genshi
-
-[Planet]
-template_files:
- atom.xml.xslt
- foafroll.xml.xslt
- index.html.genshi
- opml.xml.xslt
- rss10.xml.tmpl
- rss20.xml.tmpl
-
-template_directories:
- ../common
- ../classic_fancy
-
-bill_of_materials:
- planet.css
- images/feed-icon-10x10.png
- images/logo.png
- images/venus.png
Copied: trunk/lib/venus/themes/genshi_fancy/config.ini (from rev 656, branches/sucs-site/lib/venus/themes/genshi_fancy/config.ini)
===================================================================
--- trunk/lib/venus/themes/genshi_fancy/config.ini (rev 0)
+++ trunk/lib/venus/themes/genshi_fancy/config.ini 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,20 @@
+# This theme reimplements the classic "fancy" htmltmpl using genshi
+
+[Planet]
+template_files:
+ atom.xml.xslt
+ foafroll.xml.xslt
+ index.html.genshi
+ opml.xml.xslt
+ rss10.xml.tmpl
+ rss20.xml.tmpl
+
+template_directories:
+ ../common
+ ../classic_fancy
+
+bill_of_materials:
+ planet.css
+ images/feed-icon-10x10.png
+ images/logo.png
+ images/venus.png
Deleted: trunk/lib/venus/themes/genshi_fancy/index.html.genshi
===================================================================
--- branches/sucs-site/lib/venus/themes/genshi_fancy/index.html.genshi 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/lib/venus/themes/genshi_fancy/index.html.genshi 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,95 +0,0 @@
-<html xmlns="http://www.w3.org/1999/xhtml"
- xmlns:py="http://genshi.edgewall.org/">
-
-<!--!
-### Fancy Planet HTML template, converted to Genshi.
-###
-### When combined with the stylesheet and images in the output/ directory
-### of the Planet source, this gives you a much prettier result than the
-### default examples template and demonstrates how to use the config file
-### to support things like faces
-###
-### For documentation on the more boring template elements, see
-### http://www.intertwingly.net/code/venus/docs/templates.html
--->
-
-<head>
-<title>$feed.config.name</title>
-<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
-<meta name="generator" content="$feed.generator"/>
-<link rel="stylesheet" href="planet.css" type="text/css"/>
-<link py:for="link in feed.links"
- py:if="link.type in ['application/atom+xml','application/rss+xml']"
- href="$link.href" rel="alternate" title="$link.title" type="$link.type"/>
-</head>
-
-<body>
-<h1>$feed.config.name</h1>
-
-<py:for each="entry in entries">
-
-<div class="channelgroup" py:strip="not entry.new_date">
-<h2 py:if="entry.new_date">$entry.new_date</h2>
-
-<div class="entrygroup" py:strip="not entry.new_feed">
-<h3 py:if="entry.new_feed"><a href="$entry.link" title="$entry.source.title">$entry.source.config.name</a></h3>
-
-<img py:if="entry.new_feed and entry.source.config.face" class="face" src="images/$entry.source.config.face" width="$entry.source.config.facewidth" height="$entry.source.config.faceheight" alt=""/>
-
-<h4 py:if="entry.title" lang="$entry.title_detail.language"><a href="$entry.link">$entry.title_detail.stream</a></h4>
-
-<div class="entry">
-<div class="content" py:choose="">
-<py:when test="entry.content">${entry.content[0].stream}</py:when>
-<py:when test="entry.summary_detail">${entry.summary_detail.stream}</py:when>
-</div>
-
-<p class="date"><py:if test="entry.author_detail and entry.author_detail.name">by $entry.author_detail.name at </py:if>$entry.updated</p>
-</div>
-
-</div>
-</div>
-
-</py:for>
-
-<div class="sidebar">
-<img src="images/logo.png" width="136" height="136" alt=""/>
-
-<h2>Subscriptions</h2>
-<ul>
-<li py:for="feed in feeds">
-<a py:for="link in feed.links" py:if="link.rel == 'self' and
- link.type in ['application/atom+xml','application/rss+xml']"
- href="$link.href" title="subscribe"><img src="images/feed-icon-10x10.png" alt="(feed)"/></a>
-<py:choose>
-<a py:when="feed.planet_message" href="$feed.link" class="message" title="$feed.planet_message">$feed.config.name</a>
-<a py:otherwise="1" href="$feed.link" title="$feed.title">$feed.config.name</a>
-</py:choose>
-</li>
-</ul>
-
-<p>
-<strong>Last updated:</strong><br/>
-$feed.updated<br/>
-<em>All times are UTC.</em><br/>
-<br/>
-Powered by:<br/>
-<a href="http://intertwingly.net/code/venus/"><img src="images/venus.png" width="80" height="15" alt="Planet Venus" border="0"/></a>
-</p>
-
-<p>
-<h2>Planetarium:</h2>
-<ul>
-<li><a href="http://www.planetapache.org/">Planet Apache</a></li>
-<li><a href="http://planet.debian.net/">Planet Debian</a></li>
-<li><a href="http://planet.freedesktop.org/">Planet freedesktop.org</a></li>
-<li><a href="http://planet.gnome.org/">Planet GNOME</a></li>
-<li><a href="http://planetsun.org/">Planet Sun</a></li>
-<li><a href="http://fedora.linux.duke.edu/fedorapeople/">Fedora People</a></li>
-<li><a href="http://www.planetplanet.org/">more...</a></li>
-</ul>
-</p>
-</div>
-
-</body>
-</html>
Copied: trunk/lib/venus/themes/genshi_fancy/index.html.genshi (from rev 656, branches/sucs-site/lib/venus/themes/genshi_fancy/index.html.genshi)
===================================================================
--- trunk/lib/venus/themes/genshi_fancy/index.html.genshi (rev 0)
+++ trunk/lib/venus/themes/genshi_fancy/index.html.genshi 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,95 @@
+<html xmlns="http://www.w3.org/1999/xhtml"
+ xmlns:py="http://genshi.edgewall.org/">
+
+<!--!
+### Fancy Planet HTML template, converted to Genshi.
+###
+### When combined with the stylesheet and images in the output/ directory
+### of the Planet source, this gives you a much prettier result than the
+### default examples template and demonstrates how to use the config file
+### to support things like faces
+###
+### For documentation on the more boring template elements, see
+### http://www.intertwingly.net/code/venus/docs/templates.html
+-->
+
+<head>
+<title>$feed.config.name</title>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
+<meta name="generator" content="$feed.generator"/>
+<link rel="stylesheet" href="planet.css" type="text/css"/>
+<link py:for="link in feed.links"
+ py:if="link.type in ['application/atom+xml','application/rss+xml']"
+ href="$link.href" rel="alternate" title="$link.title" type="$link.type"/>
+</head>
+
+<body>
+<h1>$feed.config.name</h1>
+
+<py:for each="entry in entries">
+
+<div class="channelgroup" py:strip="not entry.new_date">
+<h2 py:if="entry.new_date">$entry.new_date</h2>
+
+<div class="entrygroup" py:strip="not entry.new_feed">
+<h3 py:if="entry.new_feed"><a href="$entry.link" title="$entry.source.title">$entry.source.config.name</a></h3>
+
+<img py:if="entry.new_feed and entry.source.config.face" class="face" src="images/$entry.source.config.face" width="$entry.source.config.facewidth" height="$entry.source.config.faceheight" alt=""/>
+
+<h4 py:if="entry.title" lang="$entry.title_detail.language"><a href="$entry.link">$entry.title_detail.stream</a></h4>
+
+<div class="entry">
+<div class="content" py:choose="">
+<py:when test="entry.content">${entry.content[0].stream}</py:when>
+<py:when test="entry.summary_detail">${entry.summary_detail.stream}</py:when>
+</div>
+
+<p class="date"><py:if test="entry.author_detail and entry.author_detail.name">by $entry.author_detail.name at </py:if>$entry.updated</p>
+</div>
+
+</div>
+</div>
+
+</py:for>
+
+<div class="sidebar">
+<img src="images/logo.png" width="136" height="136" alt=""/>
+
+<h2>Subscriptions</h2>
+<ul>
+<li py:for="feed in feeds">
+<a py:for="link in feed.links" py:if="link.rel == 'self' and
+ link.type in ['application/atom+xml','application/rss+xml']"
+ href="$link.href" title="subscribe"><img src="images/feed-icon-10x10.png" alt="(feed)"/></a>
+<py:choose>
+<a py:when="feed.planet_message" href="$feed.link" class="message" title="$feed.planet_message">$feed.config.name</a>
+<a py:otherwise="1" href="$feed.link" title="$feed.title">$feed.config.name</a>
+</py:choose>
+</li>
+</ul>
+
+<p>
+<strong>Last updated:</strong><br/>
+$feed.updated<br/>
+<em>All times are UTC.</em><br/>
+<br/>
+Powered by:<br/>
+<a href="http://intertwingly.net/code/venus/"><img src="images/venus.png" width="80" height="15" alt="Planet Venus" border="0"/></a>
+</p>
+
+<p>
+<h2>Planetarium:</h2>
+<ul>
+<li><a href="http://www.planetapache.org/">Planet Apache</a></li>
+<li><a href="http://planet.debian.net/">Planet Debian</a></li>
+<li><a href="http://planet.freedesktop.org/">Planet freedesktop.org</a></li>
+<li><a href="http://planet.gnome.org/">Planet GNOME</a></li>
+<li><a href="http://planetsun.org/">Planet Sun</a></li>
+<li><a href="http://fedora.linux.duke.edu/fedorapeople/">Fedora People</a></li>
+<li><a href="http://www.planetplanet.org/">more...</a></li>
+</ul>
+</p>
+</div>
+
+</body>
+</html>
Deleted: trunk/lib/venus/themes/genshi_fancy/planet.css
===================================================================
--- branches/sucs-site/lib/venus/themes/genshi_fancy/planet.css 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/lib/venus/themes/genshi_fancy/planet.css 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,150 +0,0 @@
-body {
- border-right: 1px solid black;
- margin-right: 200px;
-
- padding-left: 20px;
- padding-right: 20px;
-}
-
-h1 {
- margin-top: 0px;
- padding-top: 20px;
-
- font-family: "Bitstream Vera Sans", sans-serif;
- font-weight: normal;
- letter-spacing: -2px;
- text-transform: lowercase;
- text-align: right;
-
- color: grey;
-}
-
-.admin {
- text-align: right;
-}
-
-h2 {
- font-family: "Bitstream Vera Sans", sans-serif;
- font-weight: normal;
- color: #200080;
-
- margin-left: -20px;
-}
-
-h3 {
- font-family: "Bitstream Vera Sans", sans-serif;
- font-weight: normal;
-
- background-color: #a0c0ff;
- border: 1px solid #5080b0;
-
- padding: 4px;
-}
-
-h3 a {
- text-decoration: none;
- color: inherit;
-}
-
-h4 {
- font-family: "Bitstream Vera Sans", sans-serif;
- font-weight: bold;
-}
-
-h4 a {
- text-decoration: none;
- color: inherit;
-}
-
-img.face {
- float: right;
- margin-top: -3em;
-}
-
-.entry {
- margin-bottom: 2em;
-}
-
-.entry .date {
- font-family: "Bitstream Vera Sans", sans-serif;
- color: grey;
-}
-
-.entry .date a {
- text-decoration: none;
- color: inherit;
-}
-
-.sidebar {
- position: absolute;
- top: 0px;
- right: 0px;
- width: 200px;
-
- margin-left: 0px;
- margin-right: 0px;
- padding-right: 0px;
-
- padding-top: 20px;
- padding-left: 0px;
-
- font-family: "Bitstream Vera Sans", sans-serif;
- font-size: 85%;
-}
-
-.sidebar h2 {
- font-size: 110%;
- font-weight: bold;
- color: black;
-
- padding-left: 5px;
- margin-left: 0px;
-}
-
-.sidebar ul {
- padding-left: 1em;
- margin-left: 0px;
-
- list-style-type: none;
-}
-
-.sidebar ul li:hover {
- color: grey;
-}
-
-.sidebar ul li a {
- text-decoration: none;
-}
-
-.sidebar ul li a:hover {
- text-decoration: underline;
-}
-
-.sidebar ul li a img {
- border: 0;
-}
-
-.sidebar p {
- border-top: 1px solid grey;
- margin-top: 30px;
- padding-top: 10px;
-
- padding-left: 5px;
-}
-
-.sidebar .message {
- cursor: help;
- border-bottom: 1px dashed red;
-}
-
-.sidebar a.message:hover {
- cursor: help;
- background-color: #ff0000;
- color: #ffffff !important;
- text-decoration: none !important;
-}
-
-a:hover {
- text-decoration: underline !important;
- color: blue !important;
-}
Copied: trunk/lib/venus/themes/genshi_fancy/planet.css (from rev 656, branches/sucs-site/lib/venus/themes/genshi_fancy/planet.css)
===================================================================
--- trunk/lib/venus/themes/genshi_fancy/planet.css (rev 0)
+++ trunk/lib/venus/themes/genshi_fancy/planet.css 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,150 @@
+body {
+ border-right: 1px solid black;
+ margin-right: 200px;
+
+ padding-left: 20px;
+ padding-right: 20px;
+}
+
+h1 {
+ margin-top: 0px;
+ padding-top: 20px;
+
+ font-family: "Bitstream Vera Sans", sans-serif;
+ font-weight: normal;
+ letter-spacing: -2px;
+ text-transform: lowercase;
+ text-align: right;
+
+ color: grey;
+}
+
+.admin {
+ text-align: right;
+}
+
+h2 {
+ font-family: "Bitstream Vera Sans", sans-serif;
+ font-weight: normal;
+ color: #200080;
+
+ margin-left: -20px;
+}
+
+h3 {
+ font-family: "Bitstream Vera Sans", sans-serif;
+ font-weight: normal;
+
+ background-color: #a0c0ff;
+ border: 1px solid #5080b0;
+
+ padding: 4px;
+}
+
+h3 a {
+ text-decoration: none;
+ color: inherit;
+}
+
+h4 {
+ font-family: "Bitstream Vera Sans", sans-serif;
+ font-weight: bold;
+}
+
+h4 a {
+ text-decoration: none;
+ color: inherit;
+}
+
+img.face {
+ float: right;
+ margin-top: -3em;
+}
+
+.entry {
+ margin-bottom: 2em;
+}
+
+.entry .date {
+ font-family: "Bitstream Vera Sans", sans-serif;
+ color: grey;
+}
+
+.entry .date a {
+ text-decoration: none;
+ color: inherit;
+}
+
+.sidebar {
+ position: absolute;
+ top: 0px;
+ right: 0px;
+ width: 200px;
+
+ margin-left: 0px;
+ margin-right: 0px;
+ padding-right: 0px;
+
+ padding-top: 20px;
+ padding-left: 0px;
+
+ font-family: "Bitstream Vera Sans", sans-serif;
+ font-size: 85%;
+}
+
+.sidebar h2 {
+ font-size: 110%;
+ font-weight: bold;
+ color: black;
+
+ padding-left: 5px;
+ margin-left: 0px;
+}
+
+.sidebar ul {
+ padding-left: 1em;
+ margin-left: 0px;
+
+ list-style-type: none;
+}
+
+.sidebar ul li:hover {
+ color: grey;
+}
+
+.sidebar ul li a {
+ text-decoration: none;
+}
+
+.sidebar ul li a:hover {
+ text-decoration: underline;
+}
+
+.sidebar ul li a img {
+ border: 0;
+}
+
+.sidebar p {
+ border-top: 1px solid grey;
+ margin-top: 30px;
+ padding-top: 10px;
+
+ padding-left: 5px;
+}
+
+.sidebar .message {
+ cursor: help;
+ border-bottom: 1px dashed red;
+}
+
+.sidebar a.message:hover {
+ cursor: help;
+ background-color: #ff0000;
+ color: #ffffff !important;
+ text-decoration: none !important;
+}
+
+a:hover {
+ text-decoration: underline !important;
+ color: blue !important;
+}
Deleted: trunk/lib/venus/themes/mobile/config.ini
===================================================================
--- branches/sucs-site/lib/venus/themes/mobile/config.ini 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/lib/venus/themes/mobile/config.ini 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,24 +0,0 @@
-# In addition to the outputs produced by the 'asf' theme, this one adds
-# a 'mobile' version. For best results, this needs to be combined with
-# the 'excerpt.py' filter.
-
-[Planet]
-template_files:
- atom.xml.xslt
- foafroll.xml.xslt
- index.html.xslt
- mobile.html.xslt
- opml.xml.xslt
- validate.html.xslt
-
-template_directories:
- ../asf
- ../common
-
-bill_of_materials:
- default.css
- personalize.js
- images/feed-icon-10x10.png
- images/opml.png
- images/foaf.png
- images/venus.png
Copied: trunk/lib/venus/themes/mobile/config.ini (from rev 656, branches/sucs-site/lib/venus/themes/mobile/config.ini)
===================================================================
--- trunk/lib/venus/themes/mobile/config.ini (rev 0)
+++ trunk/lib/venus/themes/mobile/config.ini 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,24 @@
+# In addition to the outputs produced by the 'asf' theme, this one adds
+# a 'mobile' version. For best results, this needs to be combined with
+# the 'excerpt.py' filter.
+
+[Planet]
+template_files:
+ atom.xml.xslt
+ foafroll.xml.xslt
+ index.html.xslt
+ mobile.html.xslt
+ opml.xml.xslt
+ validate.html.xslt
+
+template_directories:
+ ../asf
+ ../common
+
+bill_of_materials:
+ default.css
+ personalize.js
+ images/feed-icon-10x10.png
+ images/opml.png
+ images/foaf.png
+ images/venus.png
Deleted: trunk/lib/venus/themes/mobile/mobile.html.xslt
===================================================================
--- branches/sucs-site/lib/venus/themes/mobile/mobile.html.xslt 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/lib/venus/themes/mobile/mobile.html.xslt 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,199 +0,0 @@
-<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
- xmlns:atom="http://www.w3.org/2005/Atom"
- xmlns:xhtml="http://www.w3.org/1999/xhtml"
- xmlns:planet="http://planet.intertwingly.net/"
- xmlns="http://www.w3.org/1999/xhtml">
-
- <xsl:template match="atom:feed">
- <html xmlns="http://www.w3.org/1999/xhtml">
-
- <!-- head -->
- <xsl:text>
</xsl:text>
- <head>
- <link rel="stylesheet" href="default.css" type="text/css" />
- <title><xsl:value-of select="atom:title"/></title>
- <meta name="robots" content="noindex,nofollow" />
- <meta name="generator" content="{atom:generator}" />
- <xsl:if test="atom:link[@rel='self']">
- <link rel="alternate" href="{atom:link[@rel='self']/@uri}"
- title="{atom:title}" type="{atom:link[@rel='self']/@type}" />
- </xsl:if>
- <link rel="shortcut icon" href="/favicon.ico" />
- <script type="text/javascript" src="personalize.js">
- <xsl:comment>HTML Compatibility</xsl:comment>
- </script>
- </head>
-
- <xsl:text>
</xsl:text>
- <body>
- <xsl:text>
</xsl:text>
- <h1><xsl:value-of select="atom:title"/></h1>
-
- <xsl:text>
</xsl:text>
- <div id="body">
- <xsl:apply-templates select="atom:entry"/>
- <xsl:text>
</xsl:text>
- </div>
-
- <xsl:text>
</xsl:text>
- <h1>Subscriptions</h1>
-
- <xsl:text>
</xsl:text>
- <div id="sidebar">
-
- <xsl:text>
</xsl:text>
- <h2>Info</h2>
-
- <dl>
- <dt>Last updated:</dt>
- <dd>
- <span class="date" title="GMT">
- <xsl:value-of select="atom:updated/@planet:format"/>
- </span>
- </dd>
- <dt>Powered by:</dt>
- <dd>
- <a href="http://intertwingly.net/code/venus/">
- <img src="images/venus.png" width="80" height="15"
- alt="Venus" border="0"/>
- </a>
- </dd>
- <dt>Export:</dt>
- <dd>
- <ul>
- <li>
- <a href="opml.xml">
- <img src="images/opml.png" alt="OPML"/>
- </a>
- </li>
- <li>
- <a href="foafroll.xml">
- <img src="images/foaf.png" alt="FOAF"/>
- </a>
- </li>
- </ul>
- </dd>
- </dl>
-
- </div>
-
- <xsl:text>
</xsl:text>
- <div id="footer">
-
- <xsl:text>
</xsl:text>
- <xsl:text>
</xsl:text>
- <ul>
- <xsl:for-each select="planet:source">
- <xsl:sort select="planet:name"/>
- <xsl:text>
</xsl:text>
- <li>
- <a href="{atom:link[@rel='alternate']/@href}">
- <xsl:value-of select="planet:name"/>
- </a>
- </li>
- </xsl:for-each>
- <xsl:text>
</xsl:text>
- </ul>
- </div>
-
- </body>
- </html>
- </xsl:template>
-
- <xsl:template match="atom:entry">
- <!-- date header -->
- <xsl:variable name="date" select="substring(atom:updated,1,10)"/>
- <xsl:if test="not(preceding-sibling::atom:entry
- [substring(atom:updated,1,10) = $date])">
- <xsl:text>
</xsl:text>
- <h2 class="date">
- <xsl:value-of select="substring-before(atom:updated/@planet:format,', ')"/>
- <xsl:text>, </xsl:text>
- <xsl:value-of select="substring-before(substring-after(atom:updated/@planet:format,', '), ' ')"/>
- </h2>
- </xsl:if>
-
- <xsl:text>
</xsl:text>
- <div class="news">
-
- <xsl:if test="@xml:lang">
- <xsl:attribute name="xml:lang">
- <xsl:value-of select="@xml:lang"/>
- </xsl:attribute>
- </xsl:if>
-
- <!-- entry title -->
- <xsl:text>
</xsl:text>
- <h3>
- <xsl:if test="atom:source/atom:icon">
- <img src="{atom:source/atom:icon}" class="icon"/>
- </xsl:if>
- <a href="{atom:source/atom:link['alternate']/@href}" class="icon">
- <xsl:attribute name="title" select="{atom:source/atom:title}"/>
- <xsl:value-of select="atom:source/planet:name"/>
- </a>
- <xsl:if test="string-length(atom:title) > 0">
- <xsl:text>—</xsl:text>
- <a href="{atom:link[@rel='alternate']/@href}">
- <xsl:if test="atom:title/@xml:lang != @xml:lang">
- <xsl:attribute name="xml:lang" select="{atom:title/@xml:lang}"/>
- </xsl:if>
- <xsl:value-of select="atom:title"/>
- </a>
- </xsl:if>
- </h3>
-
- <!-- entry content -->
- <xsl:text>
</xsl:text>
- <xsl:apply-templates select="planet:excerpt"/>
-
- <!-- entry footer -->
- <xsl:text>
</xsl:text>
- <div class="permalink">
- <a href="{atom:link[@rel='alternate']/@href}">
- <xsl:choose>
- <xsl:when test="atom:author/atom:name">
- <xsl:text>by </xsl:text>
- <xsl:value-of select="atom:author/atom:name"/>
- <xsl:text> at </xsl:text>
- </xsl:when>
- <xsl:when test="atom:source/atom:author/atom:name">
- <xsl:text>by </xsl:text>
- <xsl:value-of select="atom:source/atom:author/atom:name"/>
- <xsl:text> at </xsl:text>
- </xsl:when>
- </xsl:choose>
- <span class="date" title="GMT">
- <xsl:value-of select="atom:updated/@planet:format"/>
- </span>
- </a>
- </div>
- </div>
-
- </xsl:template>
-
- <!-- xhtml content -->
- <xsl:template match="planet:excerpt/xhtml:div">
- <xsl:copy>
- <xsl:if test="../@xml:lang and not(../@xml:lang = ../../@xml:lang)">
- <xsl:attribute name="xml:lang">
- <xsl:value-of select="../@xml:lang"/>
- </xsl:attribute>
- </xsl:if>
- <xsl:attribute name="class">content</xsl:attribute>
- <xsl:copy-of select="@*|node()"/>
- </xsl:copy>
- </xsl:template>
-
- <!-- plain text content -->
- <xsl:template match="planet:excerpt/text()">
- <div class="content" xmlns="http://www.w3.org/1999/xhtml">
- <xsl:if test="../@xml:lang and not(../@xml:lang = ../../@xml:lang)">
- <xsl:attribute name="xml:lang">
- <xsl:value-of select="../@xml:lang"/>
- </xsl:attribute>
- </xsl:if>
- <xsl:copy-of select="."/>
- </div>
- </xsl:template>
-</xsl:stylesheet>
Copied: trunk/lib/venus/themes/mobile/mobile.html.xslt (from rev 656, branches/sucs-site/lib/venus/themes/mobile/mobile.html.xslt)
===================================================================
--- trunk/lib/venus/themes/mobile/mobile.html.xslt (rev 0)
+++ trunk/lib/venus/themes/mobile/mobile.html.xslt 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,199 @@
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
+ xmlns:atom="http://www.w3.org/2005/Atom"
+ xmlns:xhtml="http://www.w3.org/1999/xhtml"
+ xmlns:planet="http://planet.intertwingly.net/"
+ xmlns="http://www.w3.org/1999/xhtml">
+
+ <xsl:template match="atom:feed">
+ <html xmlns="http://www.w3.org/1999/xhtml">
+
+ <!-- head -->
+ <xsl:text>
</xsl:text>
+ <head>
+ <link rel="stylesheet" href="default.css" type="text/css" />
+ <title><xsl:value-of select="atom:title"/></title>
+ <meta name="robots" content="noindex,nofollow" />
+ <meta name="generator" content="{atom:generator}" />
+ <xsl:if test="atom:link[@rel='self']">
+ <link rel="alternate" href="{atom:link[@rel='self']/@uri}"
+ title="{atom:title}" type="{atom:link[@rel='self']/@type}" />
+ </xsl:if>
+ <link rel="shortcut icon" href="/favicon.ico" />
+ <script type="text/javascript" src="personalize.js">
+ <xsl:comment>HTML Compatibility</xsl:comment>
+ </script>
+ </head>
+
+ <xsl:text>
</xsl:text>
+ <body>
+ <xsl:text>
</xsl:text>
+ <h1><xsl:value-of select="atom:title"/></h1>
+
+ <xsl:text>
</xsl:text>
+ <div id="body">
+ <xsl:apply-templates select="atom:entry"/>
+ <xsl:text>
</xsl:text>
+ </div>
+
+ <xsl:text>
</xsl:text>
+ <h1>Subscriptions</h1>
+
+ <xsl:text>
</xsl:text>
+ <div id="sidebar">
+
+ <xsl:text>
</xsl:text>
+ <h2>Info</h2>
+
+ <dl>
+ <dt>Last updated:</dt>
+ <dd>
+ <span class="date" title="GMT">
+ <xsl:value-of select="atom:updated/@planet:format"/>
+ </span>
+ </dd>
+ <dt>Powered by:</dt>
+ <dd>
+ <a href="http://intertwingly.net/code/venus/">
+ <img src="images/venus.png" width="80" height="15"
+ alt="Venus" border="0"/>
+ </a>
+ </dd>
+ <dt>Export:</dt>
+ <dd>
+ <ul>
+ <li>
+ <a href="opml.xml">
+ <img src="images/opml.png" alt="OPML"/>
+ </a>
+ </li>
+ <li>
+ <a href="foafroll.xml">
+ <img src="images/foaf.png" alt="FOAF"/>
+ </a>
+ </li>
+ </ul>
+ </dd>
+ </dl>
+
+ </div>
+
+ <xsl:text>
</xsl:text>
+ <div id="footer">
+
+ <xsl:text>
</xsl:text>
+ <xsl:text>
</xsl:text>
+ <ul>
+ <xsl:for-each select="planet:source">
+ <xsl:sort select="planet:name"/>
+ <xsl:text>
</xsl:text>
+ <li>
+ <a href="{atom:link[@rel='alternate']/@href}">
+ <xsl:value-of select="planet:name"/>
+ </a>
+ </li>
+ </xsl:for-each>
+ <xsl:text>
</xsl:text>
+ </ul>
+ </div>
+
+ </body>
+ </html>
+ </xsl:template>
+
+ <xsl:template match="atom:entry">
+ <!-- date header -->
+ <xsl:variable name="date" select="substring(atom:updated,1,10)"/>
+ <xsl:if test="not(preceding-sibling::atom:entry
+ [substring(atom:updated,1,10) = $date])">
+ <xsl:text>
</xsl:text>
+ <h2 class="date">
+ <xsl:value-of select="substring-before(atom:updated/@planet:format,', ')"/>
+ <xsl:text>, </xsl:text>
+ <xsl:value-of select="substring-before(substring-after(atom:updated/@planet:format,', '), ' ')"/>
+ </h2>
+ </xsl:if>
+
+ <xsl:text>
</xsl:text>
+ <div class="news">
+
+ <xsl:if test="@xml:lang">
+ <xsl:attribute name="xml:lang">
+ <xsl:value-of select="@xml:lang"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <!-- entry title -->
+ <xsl:text>
</xsl:text>
+ <h3>
+ <xsl:if test="atom:source/atom:icon">
+ <img src="{atom:source/atom:icon}" class="icon"/>
+ </xsl:if>
+ <a href="{atom:source/atom:link['alternate']/@href}" class="icon">
+ <xsl:attribute name="title" select="{atom:source/atom:title}"/>
+ <xsl:value-of select="atom:source/planet:name"/>
+ </a>
+ <xsl:if test="string-length(atom:title) > 0">
+ <xsl:text>—</xsl:text>
+ <a href="{atom:link[@rel='alternate']/@href}">
+ <xsl:if test="atom:title/@xml:lang != @xml:lang">
+ <xsl:attribute name="xml:lang" select="{atom:title/@xml:lang}"/>
+ </xsl:if>
+ <xsl:value-of select="atom:title"/>
+ </a>
+ </xsl:if>
+ </h3>
+
+ <!-- entry content -->
+ <xsl:text>
</xsl:text>
+ <xsl:apply-templates select="planet:excerpt"/>
+
+ <!-- entry footer -->
+ <xsl:text>
</xsl:text>
+ <div class="permalink">
+ <a href="{atom:link[@rel='alternate']/@href}">
+ <xsl:choose>
+ <xsl:when test="atom:author/atom:name">
+ <xsl:text>by </xsl:text>
+ <xsl:value-of select="atom:author/atom:name"/>
+ <xsl:text> at </xsl:text>
+ </xsl:when>
+ <xsl:when test="atom:source/atom:author/atom:name">
+ <xsl:text>by </xsl:text>
+ <xsl:value-of select="atom:source/atom:author/atom:name"/>
+ <xsl:text> at </xsl:text>
+ </xsl:when>
+ </xsl:choose>
+ <span class="date" title="GMT">
+ <xsl:value-of select="atom:updated/@planet:format"/>
+ </span>
+ </a>
+ </div>
+ </div>
+
+ </xsl:template>
+
+ <!-- xhtml content -->
+ <xsl:template match="planet:excerpt/xhtml:div">
+ <xsl:copy>
+ <xsl:if test="../@xml:lang and not(../@xml:lang = ../../@xml:lang)">
+ <xsl:attribute name="xml:lang">
+ <xsl:value-of select="../@xml:lang"/>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:attribute name="class">content</xsl:attribute>
+ <xsl:copy-of select="@*|node()"/>
+ </xsl:copy>
+ </xsl:template>
+
+ <!-- plain text content -->
+ <xsl:template match="planet:excerpt/text()">
+ <div class="content" xmlns="http://www.w3.org/1999/xhtml">
+ <xsl:if test="../@xml:lang and not(../@xml:lang = ../../@xml:lang)">
+ <xsl:attribute name="xml:lang">
+ <xsl:value-of select="../@xml:lang"/>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:copy-of select="."/>
+ </div>
+ </xsl:template>
+</xsl:stylesheet>
Deleted: trunk/lib/venus/themes/musings/config.ini
===================================================================
--- branches/sucs-site/lib/venus/themes/musings/config.ini 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/lib/venus/themes/musings/config.ini 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,18 +0,0 @@
-[Planet]
-template_files:
- atom.xml.xslt
- foafroll.xml.xslt
- opml.xml.xslt
- index.html.xslt
-
-template_directories:
- ../common
-
-bill_of_materials:
- default.css
- personalize.js
- images/feed-icon-10x10.png
- images/opml.png
- images/foaf.png
- images/venus.png
- images/venus.ico
Copied: trunk/lib/venus/themes/musings/config.ini (from rev 656, branches/sucs-site/lib/venus/themes/musings/config.ini)
===================================================================
--- trunk/lib/venus/themes/musings/config.ini (rev 0)
+++ trunk/lib/venus/themes/musings/config.ini 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,18 @@
+[Planet]
+template_files:
+ atom.xml.xslt
+ foafroll.xml.xslt
+ opml.xml.xslt
+ index.html.xslt
+
+template_directories:
+ ../common
+
+bill_of_materials:
+ default.css
+ personalize.js
+ images/feed-icon-10x10.png
+ images/opml.png
+ images/foaf.png
+ images/venus.png
+ images/venus.ico
Deleted: trunk/lib/venus/themes/musings/default.css
===================================================================
--- branches/sucs-site/lib/venus/themes/musings/default.css 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/lib/venus/themes/musings/default.css 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,402 +0,0 @@
-/*
- * Written by Stefano Mazzocchi <stefano at apache dot org>
- */
-
-/* ----------------------------- Global Definitions -------------------- */
-
-body {
- margin: 0px;
- padding: 0px;
- color: #222;
- background-color: #fff;
- quotes: "\201C" "\201E" "\2018" "\2019";
-}
-
-a:link {
- color: #222;
-}
-
-a:visited {
- color: #555;
-}
-
-a[rel~='license'] {
- text-decoration: none;
-}
-
-h1 {
- font-size: 1.75em;
- text-transform: uppercase;
- letter-spacing: 0.25em;
- padding: 10px;
- margin: 0px 0px 0px 0px;
- color: #FFF;
- font-weight: normal;
- background-color: #036;
- border-bottom: 2px solid #bbb
-}
-
-/* ----------------------------- Sidebar --------------------------- */
-
-#sidebar {
- float: right;
- top: 150px;
- right: 0px;
- width: 11em;
- background-color: white;
- padding: 0px 10px 20px 0px;
- margin: 0px 0px 20px 20px;
- border-left: 1px solid #ccc;
- border-bottom: 1px solid #ccc;
-}
-
-#sidebar h2 {
- letter-spacing: 0.15em;
- text-transform: uppercase;
- font-size: .9em;
- background-color: #BCD;
- color: #222;
- font-weight: bold;
- padding: 3px 0px 2px 4px;
- margin: 15px 0px 5px 10px;
- border: 1px solid #ccc;
-}
-
-#sidebar p {
- font-size: .8em;
- padding-left: 20px;
- padding-right: 5px;
-}
-
-#sidebar ul {
- font-family: sans-serif;
- margin-left: 5px;
- padding-left: 25px;
-}
-
-#sidebar li {
- margin-left: 0px;
- text-indent: -15px;
- list-style-type: none;
- font-size: .8em;
- line-height: 1.2em;
-}
-
-#sidebar ul li a {
- text-decoration: none;
-}
-
-#sidebar ul li a:hover {
- text-decoration: underline;
-}
-
-#sidebar img {
- border: 0;
-}
-
-#sidebar dl {
- font-size: .8em;
- padding-left: 1.0em;
-}
-
-#sidebar dl ul {
- padding-left: 1em;
-}
-
-#sidebar dt {
- margin-top: 1em;
- font-weight: bold;
- padding-left: 1.0em;
-}
-
-#sidebar dd {
- margin-left: 2.5em;
-}
-
-#sidebar .message {
- cursor: help;
- border-bottom: 1px dashed red;
-}
-
-#sidebar a:active,
-#sidebar a:hover {
- color: #FFCC66;
-}
-
-#sidebar a.message:hover {
- cursor: help;
- background-color: #ffD0D0;
- color:#000;
- border: 1px dashed red !important;
- text-decoration: none !important;
-}
-#sidebar dl a {
- text-decoration:none;
-}
-
-/* ----------------------------- Body ---------------------------- */
-
-#body {
- margin-top: 10px;
-}
-
-.admin {
- text-align: right;
-}
-
-#body h2.date {
- text-transform: none;
- font-size: 1em;
- color: #222;
- font-weight: bold;
- text-align: right;
- border-top: 1px solid #ccc;
- background-color: #BCD;
- border-bottom: 1px solid #ccc;
- padding: 3px 15px 2px 5px;
- max-width:43em;
- margin: 0;
-}
-
-/* ----------------------------- News ---------------------------- */
-
-.news {
- margin: 30px 10px 30px 10px;
- clear: left;
- max-width: 50em;
-}
-
-.news h3 {
- margin: 0 0 .5em 0;
- padding: 0px;
- font-size: 1.5em;
-}
-.news h3 a {
- color:#036;
- text-decoration:none;
-}
-
-.news .content {
- margin: 5px 5px 5px 15px;
- padding: 0px 1em 1em 1em;
- border-left: 1px solid #ccc;
- border-bottom: 1px solid #ccc;
- border-right: 1px solid #ccc;
- line-height: 1.5em;
- font-size: 1em;
- font-family: sans-serif;
- max-width:40em;
-}
-
-.news .links {
-
-}
-
-.news .permalink {
- text-align: right;
-}
-
-.news .icon {
- height: 1em;
- width: 1em;
- border: 0;
- bottom: 0;
-}
-
-/* ----------------------------- News Content ---------------------------- */
-
-.news .content p {
- line-height: 1.2em;
-}
-
-.news .content img {
- margin: 5px;
-}
-
-.news .content blockquote {
- margin: 10px 35px 10px 35px;
- padding: 5px;
-}
-
-.news .content pre {
- font-family: monospace;
- border: 1px solid #ddd;
- padding: 10px;
- margin: 10px 20px 10px 20px;
- background-color: #f8f8f8;
- overflow: auto;
-}
-.news .content code {
- font-family: monospace;
-}
-
-.news .content ul, .news .content ol {
- margin: 5px 35px 5px 35px;
- padding: 5px;
- counter-reset: item;
-}
-
-.news .content ul > ul, .news .content ul > ol, .news .content ol > ul, .news .content ol > ol {
- margin: 0px 0px 0px 35px;
- padding: 0px;
-}
-
-.news .content li {
- padding: 1px;
- line-height: 1.2em;
-}
-
-.news code {
- font-family: large;
-}
-
-.news .content :link,
-.news .content :visited {
- text-decoration: none;
- font-weight:bold;
- color:#036;
-}
-.news .content p:hover a,
-.news .content dt:hover a,
-.news .content dd:hover a,
-.news .content li:hover a {
- text-decoration: underline;
-}
-
-.news :link:active,
-.news :visited:active,
-.news :link:hover,
-.news :visited:hover {
- color: #FFCC66;
-}
-
-/* --------------------------- Accomodations ----------------------- */
-
-/* Cosmic Variance */
-.alignright {
- float:right;
-}
-.alignleft {
- float:left;
-}
-img.alignright {
- padding: 4px;
- margin: 0 0 2px 7px;
- display: inline;
-}
-img.centered {
- display: block;
- margin-left: auto;
- margin-right: auto;
-}
-/* Backreaction */
-div.content:hover a,
-div.permalink:hover a {
- text-decoration:underline;
-}
-
-/* Musings/String Coffee Table */
-math[display=block] {overflow:auto;}
-math { white-space: nowrap }
-.numberedEq span, .eqno {float:right}
-merror {display:inline;font-size:1em;}
-img.mathlogo, img.svglogo {
- float:right;
- border:0
-}
-.footnote {font-size: .9em}
-.update h4 {
- display:inline;
- font-size:1em;
- font-weight:bold;
-}
-table.plaintable {border-collapse:collapse;}
-.plaintable td {border:1px solid #000; padding: 3px;}
-.plaintable th {padding: 3px;}
-.plaintable caption {
- font-weight: bold;
- font-size:1.1em;
- text-align:center;
- margin-left:30px;
-}
-.centeredfigure {
- position:relative;
- margin:auto;
- text-align:center;
-}
-.figurecaption {color:#630;}
-
-/* Bosker Blog */
-p.center {text-align:center}
-
-/* boing boing */
-br {
- clear: none !important;
-}
-
-/* engadget */
-h6 {
- clear: left !important;
-}
-
-/* cadenhead */
-p.sourcecode {
- font-family: monospace;
- border: 1px solid #ddd;
- padding: 10px;
- margin: 10px 20px 10px 20px;
- background-color: #f8f8f8;
- overflow: auto;
-}
-
-/* programmableweb */
-.imgRight {
- float: right;
-}
-
-/* gizmodo */
-img.left {
- float: left;
-}
-
-/* gizmodo */
-img.right {
- float: right;
-}
-
-/* gizmodo */
-img.center {
- display: block;
- margin-left: auto;
- margin-right: auto;
-}
-
-/* wikipedia */
-table {
- width: auto !important;
-}
-
-/* del.icio.us */
-.delicious-tags {
- font-size: .8em;
- text-align: right;
-}
-
-/* ----------------------------- Footer ---------------------------- */
-
-#footer {
- padding: 0px;
- margin: 30px 0px 50px 50px;
-}
-
-#footer p {
- padding: 2px 2px 2px 5px;
- background-color: #ccc;
- border-top: 1px solid #aaa;
- border-bottom: 1px solid #aaa;
- border-left: 1px solid #aaa;
- letter-spacing: 0.15em;
- text-transform: uppercase;
- text-align: left;
-}
-
Copied: trunk/lib/venus/themes/musings/default.css (from rev 656, branches/sucs-site/lib/venus/themes/musings/default.css)
===================================================================
--- trunk/lib/venus/themes/musings/default.css (rev 0)
+++ trunk/lib/venus/themes/musings/default.css 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,402 @@
+/*
+ * Written by Stefano Mazzocchi <stefano at apache dot org>
+ */
+
+/* ----------------------------- Global Definitions -------------------- */
+
+body {
+ margin: 0px;
+ padding: 0px;
+ color: #222;
+ background-color: #fff;
+ quotes: "\201C" "\201E" "\2018" "\2019";
+}
+
+a:link {
+ color: #222;
+}
+
+a:visited {
+ color: #555;
+}
+
+a[rel~='license'] {
+ text-decoration: none;
+}
+
+h1 {
+ font-size: 1.75em;
+ text-transform: uppercase;
+ letter-spacing: 0.25em;
+ padding: 10px;
+ margin: 0px 0px 0px 0px;
+ color: #FFF;
+ font-weight: normal;
+ background-color: #036;
+ border-bottom: 2px solid #bbb
+}
+
+/* ----------------------------- Sidebar --------------------------- */
+
+#sidebar {
+ float: right;
+ top: 150px;
+ right: 0px;
+ width: 11em;
+ background-color: white;
+ padding: 0px 10px 20px 0px;
+ margin: 0px 0px 20px 20px;
+ border-left: 1px solid #ccc;
+ border-bottom: 1px solid #ccc;
+}
+
+#sidebar h2 {
+ letter-spacing: 0.15em;
+ text-transform: uppercase;
+ font-size: .9em;
+ background-color: #BCD;
+ color: #222;
+ font-weight: bold;
+ padding: 3px 0px 2px 4px;
+ margin: 15px 0px 5px 10px;
+ border: 1px solid #ccc;
+}
+
+#sidebar p {
+ font-size: .8em;
+ padding-left: 20px;
+ padding-right: 5px;
+}
+
+#sidebar ul {
+ font-family: sans-serif;
+ margin-left: 5px;
+ padding-left: 25px;
+}
+
+#sidebar li {
+ margin-left: 0px;
+ text-indent: -15px;
+ list-style-type: none;
+ font-size: .8em;
+ line-height: 1.2em;
+}
+
+#sidebar ul li a {
+ text-decoration: none;
+}
+
+#sidebar ul li a:hover {
+ text-decoration: underline;
+}
+
+#sidebar img {
+ border: 0;
+}
+
+#sidebar dl {
+ font-size: .8em;
+ padding-left: 1.0em;
+}
+
+#sidebar dl ul {
+ padding-left: 1em;
+}
+
+#sidebar dt {
+ margin-top: 1em;
+ font-weight: bold;
+ padding-left: 1.0em;
+}
+
+#sidebar dd {
+ margin-left: 2.5em;
+}
+
+#sidebar .message {
+ cursor: help;
+ border-bottom: 1px dashed red;
+}
+
+#sidebar a:active,
+#sidebar a:hover {
+ color: #FFCC66;
+}
+
+#sidebar a.message:hover {
+ cursor: help;
+ background-color: #ffD0D0;
+ color:#000;
+ border: 1px dashed red !important;
+ text-decoration: none !important;
+}
+#sidebar dl a {
+ text-decoration:none;
+}
+
+/* ----------------------------- Body ---------------------------- */
+
+#body {
+ margin-top: 10px;
+}
+
+.admin {
+ text-align: right;
+}
+
+#body h2.date {
+ text-transform: none;
+ font-size: 1em;
+ color: #222;
+ font-weight: bold;
+ text-align: right;
+ border-top: 1px solid #ccc;
+ background-color: #BCD;
+ border-bottom: 1px solid #ccc;
+ padding: 3px 15px 2px 5px;
+ max-width:43em;
+ margin: 0;
+}
+
+/* ----------------------------- News ---------------------------- */
+
+.news {
+ margin: 30px 10px 30px 10px;
+ clear: left;
+ max-width: 50em;
+}
+
+.news h3 {
+ margin: 0 0 .5em 0;
+ padding: 0px;
+ font-size: 1.5em;
+}
+.news h3 a {
+ color:#036;
+ text-decoration:none;
+}
+
+.news .content {
+ margin: 5px 5px 5px 15px;
+ padding: 0px 1em 1em 1em;
+ border-left: 1px solid #ccc;
+ border-bottom: 1px solid #ccc;
+ border-right: 1px solid #ccc;
+ line-height: 1.5em;
+ font-size: 1em;
+ font-family: sans-serif;
+ max-width:40em;
+}
+
+.news .links {
+
+}
+
+.news .permalink {
+ text-align: right;
+}
+
+.news .icon {
+ height: 1em;
+ width: 1em;
+ border: 0;
+ bottom: 0;
+}
+
+/* ----------------------------- News Content ---------------------------- */
+
+.news .content p {
+ line-height: 1.2em;
+}
+
+.news .content img {
+ margin: 5px;
+}
+
+.news .content blockquote {
+ margin: 10px 35px 10px 35px;
+ padding: 5px;
+}
+
+.news .content pre {
+ font-family: monospace;
+ border: 1px solid #ddd;
+ padding: 10px;
+ margin: 10px 20px 10px 20px;
+ background-color: #f8f8f8;
+ overflow: auto;
+}
+.news .content code {
+ font-family: monospace;
+}
+
+.news .content ul, .news .content ol {
+ margin: 5px 35px 5px 35px;
+ padding: 5px;
+ counter-reset: item;
+}
+
+.news .content ul > ul, .news .content ul > ol, .news .content ol > ul, .news .content ol > ol {
+ margin: 0px 0px 0px 35px;
+ padding: 0px;
+}
+
+.news .content li {
+ padding: 1px;
+ line-height: 1.2em;
+}
+
+.news code {
+ font-family: large;
+}
+
+.news .content :link,
+.news .content :visited {
+ text-decoration: none;
+ font-weight:bold;
+ color:#036;
+}
+.news .content p:hover a,
+.news .content dt:hover a,
+.news .content dd:hover a,
+.news .content li:hover a {
+ text-decoration: underline;
+}
+
+.news :link:active,
+.news :visited:active,
+.news :link:hover,
+.news :visited:hover {
+ color: #FFCC66;
+}
+
+/* --------------------------- Accomodations ----------------------- */
+
+/* Cosmic Variance */
+.alignright {
+ float:right;
+}
+.alignleft {
+ float:left;
+}
+img.alignright {
+ padding: 4px;
+ margin: 0 0 2px 7px;
+ display: inline;
+}
+img.centered {
+ display: block;
+ margin-left: auto;
+ margin-right: auto;
+}
+/* Backreaction */
+div.content:hover a,
+div.permalink:hover a {
+ text-decoration:underline;
+}
+
+/* Musings/String Coffee Table */
+math[display=block] {overflow:auto;}
+math { white-space: nowrap }
+.numberedEq span, .eqno {float:right}
+merror {display:inline;font-size:1em;}
+img.mathlogo, img.svglogo {
+ float:right;
+ border:0
+}
+.footnote {font-size: .9em}
+.update h4 {
+ display:inline;
+ font-size:1em;
+ font-weight:bold;
+}
+table.plaintable {border-collapse:collapse;}
+.plaintable td {border:1px solid #000; padding: 3px;}
+.plaintable th {padding: 3px;}
+.plaintable caption {
+ font-weight: bold;
+ font-size:1.1em;
+ text-align:center;
+ margin-left:30px;
+}
+.centeredfigure {
+ position:relative;
+ margin:auto;
+ text-align:center;
+}
+.figurecaption {color:#630;}
+
+/* Bosker Blog */
+p.center {text-align:center}
+
+/* boing boing */
+br {
+ clear: none !important;
+}
+
+/* engadget */
+h6 {
+ clear: left !important;
+}
+
+/* cadenhead */
+p.sourcecode {
+ font-family: monospace;
+ border: 1px solid #ddd;
+ padding: 10px;
+ margin: 10px 20px 10px 20px;
+ background-color: #f8f8f8;
+ overflow: auto;
+}
+
+/* programmableweb */
+.imgRight {
+ float: right;
+}
+
+/* gizmodo */
+img.left {
+ float: left;
+}
+
+/* gizmodo */
+img.right {
+ float: right;
+}
+
+/* gizmodo */
+img.center {
+ display: block;
+ margin-left: auto;
+ margin-right: auto;
+}
+
+/* wikipedia */
+table {
+ width: auto !important;
+}
+
+/* del.icio.us */
+.delicious-tags {
+ font-size: .8em;
+ text-align: right;
+}
+
+/* ----------------------------- Footer ---------------------------- */
+
+#footer {
+ padding: 0px;
+ margin: 30px 0px 50px 50px;
+}
+
+#footer p {
+ padding: 2px 2px 2px 5px;
+ background-color: #ccc;
+ border-top: 1px solid #aaa;
+ border-bottom: 1px solid #aaa;
+ border-left: 1px solid #aaa;
+ letter-spacing: 0.15em;
+ text-transform: uppercase;
+ text-align: left;
+}
+
Deleted: trunk/lib/venus/themes/musings/index.html.xslt
===================================================================
--- branches/sucs-site/lib/venus/themes/musings/index.html.xslt 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/lib/venus/themes/musings/index.html.xslt 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,293 +0,0 @@
-<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
- xmlns:atom="http://www.w3.org/2005/Atom"
- xmlns:xhtml="http://www.w3.org/1999/xhtml"
- xmlns:planet="http://planet.intertwingly.net/"
- xmlns="http://www.w3.org/1999/xhtml"
- exclude-result-prefixes="atom planet xhtml">
-
-<xsl:output method="xml" doctype-system="http://www.w3.org/Math/DTD/mathml2/xhtml-math11-f.dtd" doctype-public="-//W3C//DTD XHTML 1.1 plus MathML 2.0//EN"/>
-
- <xsl:template match="atom:feed">
- <html xmlns="http://www.w3.org/1999/xhtml">
-
- <!-- head -->
- <xsl:text>
</xsl:text>
- <head>
- <link rel="stylesheet" href="default.css" type="text/css" />
- <title><xsl:value-of select="atom:title"/></title>
- <meta name="robots" content="noindex,nofollow" />
- <meta name="generator" content="{atom:generator}" />
- <xsl:if test="atom:link[@rel='self']">
- <link rel="alternate" href="{atom:link[@rel='self']/@href}"
- title="{atom:title}" type="{atom:link[@rel='self']/@type}" />
- </xsl:if>
- <link rel="shortcut icon" type="image/x-icon" href="images/venus.ico" />
- <link rel="icon" type="image/x-icon" href="images/venus.ico" />
- <script type="text/javascript" src="personalize.js">
- <!-- hack to prevent XHTML tag minimization -->
- <xsl:text> </xsl:text>
- </script>
- </head>
-
- <xsl:text>
</xsl:text>
- <body>
- <xsl:text>
</xsl:text>
- <h1><xsl:value-of select="atom:title"/></h1>
-
- <xsl:text>
</xsl:text>
- <div id="sidebar">
-
- <xsl:text>
</xsl:text>
- <h2>Subscriptions</h2>
- <xsl:text>
</xsl:text>
- <ul>
- <xsl:for-each select="planet:source">
- <xsl:sort select="planet:name"/>
- <xsl:text>
</xsl:text>
- <li>
- <!-- icon -->
- <a title="subscribe to {planet:name}âs feed">
- <xsl:choose>
- <xsl:when test="planet:http_location">
- <xsl:attribute name="href">
- <xsl:value-of select="planet:http_location"/>
- </xsl:attribute>
- </xsl:when>
- <xsl:when test="atom:link[@rel='self']/@href">
- <xsl:attribute name="href">
- <xsl:value-of select="atom:link[@rel='self']/@href"/>
- </xsl:attribute>
- </xsl:when>
- </xsl:choose>
- <img src="images/feed-icon-10x10.png" alt="(feed)"/>
- </a>
- <xsl:text> </xsl:text>
-
- <!-- name -->
- <a href="{atom:link[@rel='alternate']/@href}">
- <xsl:choose>
- <xsl:when test="planet:message">
- <xsl:attribute name="class">message</xsl:attribute>
- <xsl:attribute name="title">
- <xsl:value-of select="planet:message"/>
- </xsl:attribute>
- </xsl:when>
- <xsl:when test="atom:title">
- <xsl:attribute name="title">
- <xsl:value-of select="atom:title"/>
- </xsl:attribute>
- </xsl:when>
- </xsl:choose>
- <xsl:value-of select="planet:name"/>
- </a>
- </li>
- </xsl:for-each>
- <xsl:text>
</xsl:text>
- </ul>
-
- <xsl:text>
</xsl:text>
- <h2>Info</h2>
-
- <dl>
- <dt>Last updated:</dt>
- <dd>
- <span class="date" title="GMT">
- <xsl:value-of select="atom:updated/@planet:format"/>
- </span>
- </dd>
- <dt>Powered by:</dt>
- <dd>
- <a href="http://intertwingly.net/code/venus/" title="Sam Rubyâs Venus">
- <img src="images/venus.png" width="80" height="15"
- alt="Planet" />
- </a>
- </dd>
- <dt>Export:</dt>
- <dd>
- <a href="opml.xml" title="export the {planet:name} subscription list in OPML format">
- <img src="images/opml.png" alt="OPML"/>
- </a>
- </dd>
- <dd>
- <a href="foafroll.xml" title="export the {planet:name} subscription list in FOAF format">
- <img src="images/foaf.png" alt="FOAF"/>
- </a>
- </dd>
- </dl>
-
- </div>
-
- <xsl:text>
</xsl:text>
- <div id="body">
- <xsl:apply-templates select="atom:entry"/>
- <xsl:text>
</xsl:text>
- </div>
- </body>
- </html>
- </xsl:template>
-
- <xsl:template match="atom:entry">
- <!-- date header -->
- <xsl:variable name="date" select="substring(atom:updated,1,10)"/>
- <xsl:if test="not(preceding-sibling::atom:entry
- [substring(atom:updated,1,10) = $date])">
- <xsl:text>
</xsl:text>
- <h2 class="date">
- <xsl:value-of select="substring-before(atom:updated/@planet:format,', ')"/>
- <xsl:text>, </xsl:text>
- <xsl:value-of select="substring-before(substring-after(atom:updated/@planet:format,', '), ' ')"/>
- </h2>
- </xsl:if>
-
- <xsl:text>
</xsl:text>
- <div class="news">
-
- <xsl:if test="@xml:lang">
- <xsl:attribute name="xml:lang">
- <xsl:value-of select="@xml:lang"/>
- </xsl:attribute>
- </xsl:if>
-
- <!-- entry title -->
- <xsl:text>
</xsl:text>
- <h3>
- <a href="{atom:source/atom:link[@rel='alternate']/@href}">
- <xsl:attribute name="title" select="{atom:source/atom:title}"/>
- <xsl:value-of select="atom:source/planet:name"/>
- </a>
- <xsl:if test="atom:title">
- <xsl:text> </xsl:text>
- <xsl:choose>
- <xsl:when test="atom:source/atom:icon">
- <img src="{atom:source/atom:icon}" class="icon" alt="" />
- </xsl:when>
- <xsl:otherwise>
- <xsl:text>—</xsl:text>
- </xsl:otherwise>
- </xsl:choose>
- <xsl:text> </xsl:text>
- <a href="{atom:link[@rel='alternate']/@href}">
- <xsl:if test="atom:title/@xml:lang != @xml:lang">
- <xsl:attribute name="xml:lang" select="{atom:title/@xml:lang}"/>
- </xsl:if>
- <xsl:value-of select="atom:title"/>
- </a>
- </xsl:if>
- </h3>
-
- <!-- entry content -->
- <xsl:text>
</xsl:text>
- <div class="content">
- <xsl:choose>
- <xsl:when test="atom:content">
- <xsl:apply-templates select="atom:content"/>
- </xsl:when>
- <xsl:otherwise>
- <xsl:apply-templates select="atom:summary"/>
- </xsl:otherwise>
- </xsl:choose>
-
- <!-- entry footer -->
- <xsl:text>
</xsl:text>
- <div class="permalink">
- <xsl:if test="atom:link[@rel='license'] or
- atom:source/atom:link[@rel='license'] or
- atom:rights or atom:source/atom:rights">
- <a>
- <xsl:if test="atom:source/atom:link[@rel='license']/@href">
- <xsl:attribute name="rel">license</xsl:attribute>
- <xsl:attribute name="href">
- <xsl:value-of select="atom:source/atom:link[@rel='license']/@href"/>
- </xsl:attribute>
- </xsl:if>
- <xsl:if test="atom:link[@rel='license']/@href">
- <xsl:attribute name="rel">license</xsl:attribute>
- <xsl:attribute name="href">
- <xsl:value-of select="atom:link[@rel='license']/@href"/>
- </xsl:attribute>
- </xsl:if>
- <xsl:if test="atom:source/atom:rights">
- <xsl:attribute name="title">
- <xsl:value-of select="atom:source/atom:rights"/>
- </xsl:attribute>
- </xsl:if>
- <xsl:if test="atom:rights">
- <xsl:attribute name="title">
- <xsl:value-of select="atom:rights"/>
- </xsl:attribute>
- </xsl:if>
- <xsl:text>©</xsl:text>
- </a>
- <xsl:text> </xsl:text>
- </xsl:if>
- <a href="{atom:link[@rel='alternate']/@href}" class="permalink">
- <xsl:choose>
- <xsl:when test="atom:author/atom:name">
- <xsl:if test="not(atom:link[@rel='license'] or
- atom:source/atom:link[@rel='license'] or
- atom:rights or atom:source/atom:rights)">
- <xsl:text>by </xsl:text>
- </xsl:if>
- <xsl:value-of select="atom:author/atom:name"/>
- <xsl:text> at </xsl:text>
- </xsl:when>
- <xsl:when test="atom:source/atom:author/atom:name">
- <xsl:if test="not(atom:link[@rel='license'] or
- atom:source/atom:link[@rel='license'] or
- atom:rights or atom:source/atom:rights)">
- <xsl:text>by </xsl:text>
- </xsl:if>
- <xsl:value-of select="atom:source/atom:author/atom:name"/>
- <xsl:text> at </xsl:text>
- </xsl:when>
- </xsl:choose>
- <span class="date" title="GMT">
- <xsl:value-of select="atom:updated/@planet:format"/>
- </span>
- </a>
- </div>
- </div>
- </div>
-
- </xsl:template>
-
- <!-- xhtml content -->
- <xsl:template match="atom:content/xhtml:div | atom:summary/xhtml:div">
- <xsl:copy>
- <xsl:if test="../@xml:lang and not(../@xml:lang = ../../@xml:lang)">
- <xsl:attribute name="xml:lang">
- <xsl:value-of select="../@xml:lang"/>
- </xsl:attribute>
- </xsl:if>
- <xsl:apply-templates select="@*|node()"/>
- </xsl:copy>
- </xsl:template>
-
- <!-- plain text content -->
- <xsl:template match="atom:content/text() | atom:summary/text()">
- <div>
- <xsl:if test="../@xml:lang and not(../@xml:lang = ../../@xml:lang)">
- <xsl:attribute name="xml:lang">
- <xsl:value-of select="../@xml:lang"/>
- </xsl:attribute>
- </xsl:if>
- <xsl:copy-of select="."/>
- </div>
- </xsl:template>
-
- <!-- Feedburner detritus -->
- <xsl:template match="xhtml:div[@class='feedflare']"/>
-
- <!-- Remove stray atom elements -->
- <xsl:template match="atom:*">
- <xsl:apply-templates/>
- </xsl:template>
-
- <!-- pass through everything else -->
- <xsl:template match="@*|node()">
- <xsl:copy>
- <xsl:apply-templates select="@*|node()"/>
- </xsl:copy>
- </xsl:template>
-
-</xsl:stylesheet>
Copied: trunk/lib/venus/themes/musings/index.html.xslt (from rev 656, branches/sucs-site/lib/venus/themes/musings/index.html.xslt)
===================================================================
--- trunk/lib/venus/themes/musings/index.html.xslt (rev 0)
+++ trunk/lib/venus/themes/musings/index.html.xslt 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,293 @@
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
+ xmlns:atom="http://www.w3.org/2005/Atom"
+ xmlns:xhtml="http://www.w3.org/1999/xhtml"
+ xmlns:planet="http://planet.intertwingly.net/"
+ xmlns="http://www.w3.org/1999/xhtml"
+ exclude-result-prefixes="atom planet xhtml">
+
+<xsl:output method="xml" doctype-system="http://www.w3.org/Math/DTD/mathml2/xhtml-math11-f.dtd" doctype-public="-//W3C//DTD XHTML 1.1 plus MathML 2.0//EN"/>
+
+ <xsl:template match="atom:feed">
+ <html xmlns="http://www.w3.org/1999/xhtml">
+
+ <!-- head -->
+ <xsl:text>
</xsl:text>
+ <head>
+ <link rel="stylesheet" href="default.css" type="text/css" />
+ <title><xsl:value-of select="atom:title"/></title>
+ <meta name="robots" content="noindex,nofollow" />
+ <meta name="generator" content="{atom:generator}" />
+ <xsl:if test="atom:link[@rel='self']">
+ <link rel="alternate" href="{atom:link[@rel='self']/@href}"
+ title="{atom:title}" type="{atom:link[@rel='self']/@type}" />
+ </xsl:if>
+ <link rel="shortcut icon" type="image/x-icon" href="images/venus.ico" />
+ <link rel="icon" type="image/x-icon" href="images/venus.ico" />
+ <script type="text/javascript" src="personalize.js">
+ <!-- hack to prevent XHTML tag minimization -->
+ <xsl:text> </xsl:text>
+ </script>
+ </head>
+
+ <xsl:text>
</xsl:text>
+ <body>
+ <xsl:text>
</xsl:text>
+ <h1><xsl:value-of select="atom:title"/></h1>
+
+ <xsl:text>
</xsl:text>
+ <div id="sidebar">
+
+ <xsl:text>
</xsl:text>
+ <h2>Subscriptions</h2>
+ <xsl:text>
</xsl:text>
+ <ul>
+ <xsl:for-each select="planet:source">
+ <xsl:sort select="planet:name"/>
+ <xsl:text>
</xsl:text>
+ <li>
+ <!-- icon -->
+ <a title="subscribe to {planet:name}âs feed">
+ <xsl:choose>
+ <xsl:when test="planet:http_location">
+ <xsl:attribute name="href">
+ <xsl:value-of select="planet:http_location"/>
+ </xsl:attribute>
+ </xsl:when>
+ <xsl:when test="atom:link[@rel='self']/@href">
+ <xsl:attribute name="href">
+ <xsl:value-of select="atom:link[@rel='self']/@href"/>
+ </xsl:attribute>
+ </xsl:when>
+ </xsl:choose>
+ <img src="images/feed-icon-10x10.png" alt="(feed)"/>
+ </a>
+ <xsl:text> </xsl:text>
+
+ <!-- name -->
+ <a href="{atom:link[@rel='alternate']/@href}">
+ <xsl:choose>
+ <xsl:when test="planet:message">
+ <xsl:attribute name="class">message</xsl:attribute>
+ <xsl:attribute name="title">
+ <xsl:value-of select="planet:message"/>
+ </xsl:attribute>
+ </xsl:when>
+ <xsl:when test="atom:title">
+ <xsl:attribute name="title">
+ <xsl:value-of select="atom:title"/>
+ </xsl:attribute>
+ </xsl:when>
+ </xsl:choose>
+ <xsl:value-of select="planet:name"/>
+ </a>
+ </li>
+ </xsl:for-each>
+ <xsl:text>
</xsl:text>
+ </ul>
+
+ <xsl:text>
</xsl:text>
+ <h2>Info</h2>
+
+ <dl>
+ <dt>Last updated:</dt>
+ <dd>
+ <span class="date" title="GMT">
+ <xsl:value-of select="atom:updated/@planet:format"/>
+ </span>
+ </dd>
+ <dt>Powered by:</dt>
+ <dd>
+ <a href="http://intertwingly.net/code/venus/" title="Sam Rubyâs Venus">
+ <img src="images/venus.png" width="80" height="15"
+ alt="Planet" />
+ </a>
+ </dd>
+ <dt>Export:</dt>
+ <dd>
+ <a href="opml.xml" title="export the {planet:name} subscription list in OPML format">
+ <img src="images/opml.png" alt="OPML"/>
+ </a>
+ </dd>
+ <dd>
+ <a href="foafroll.xml" title="export the {planet:name} subscription list in FOAF format">
+ <img src="images/foaf.png" alt="FOAF"/>
+ </a>
+ </dd>
+ </dl>
+
+ </div>
+
+ <xsl:text>
</xsl:text>
+ <div id="body">
+ <xsl:apply-templates select="atom:entry"/>
+ <xsl:text>
</xsl:text>
+ </div>
+ </body>
+ </html>
+ </xsl:template>
+
+ <xsl:template match="atom:entry">
+ <!-- date header -->
+ <xsl:variable name="date" select="substring(atom:updated,1,10)"/>
+ <xsl:if test="not(preceding-sibling::atom:entry
+ [substring(atom:updated,1,10) = $date])">
+ <xsl:text>
</xsl:text>
+ <h2 class="date">
+ <xsl:value-of select="substring-before(atom:updated/@planet:format,', ')"/>
+ <xsl:text>, </xsl:text>
+ <xsl:value-of select="substring-before(substring-after(atom:updated/@planet:format,', '), ' ')"/>
+ </h2>
+ </xsl:if>
+
+ <xsl:text>
</xsl:text>
+ <div class="news">
+
+ <xsl:if test="@xml:lang">
+ <xsl:attribute name="xml:lang">
+ <xsl:value-of select="@xml:lang"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <!-- entry title -->
+ <xsl:text>
</xsl:text>
+ <h3>
+ <a href="{atom:source/atom:link[@rel='alternate']/@href}">
+ <xsl:attribute name="title" select="{atom:source/atom:title}"/>
+ <xsl:value-of select="atom:source/planet:name"/>
+ </a>
+ <xsl:if test="atom:title">
+ <xsl:text> </xsl:text>
+ <xsl:choose>
+ <xsl:when test="atom:source/atom:icon">
+ <img src="{atom:source/atom:icon}" class="icon" alt="" />
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>—</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:text> </xsl:text>
+ <a href="{atom:link[@rel='alternate']/@href}">
+ <xsl:if test="atom:title/@xml:lang != @xml:lang">
+ <xsl:attribute name="xml:lang" select="{atom:title/@xml:lang}"/>
+ </xsl:if>
+ <xsl:value-of select="atom:title"/>
+ </a>
+ </xsl:if>
+ </h3>
+
+ <!-- entry content -->
+ <xsl:text>
</xsl:text>
+ <div class="content">
+ <xsl:choose>
+ <xsl:when test="atom:content">
+ <xsl:apply-templates select="atom:content"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="atom:summary"/>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <!-- entry footer -->
+ <xsl:text>
</xsl:text>
+ <div class="permalink">
+ <xsl:if test="atom:link[@rel='license'] or
+ atom:source/atom:link[@rel='license'] or
+ atom:rights or atom:source/atom:rights">
+ <a>
+ <xsl:if test="atom:source/atom:link[@rel='license']/@href">
+ <xsl:attribute name="rel">license</xsl:attribute>
+ <xsl:attribute name="href">
+ <xsl:value-of select="atom:source/atom:link[@rel='license']/@href"/>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:if test="atom:link[@rel='license']/@href">
+ <xsl:attribute name="rel">license</xsl:attribute>
+ <xsl:attribute name="href">
+ <xsl:value-of select="atom:link[@rel='license']/@href"/>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:if test="atom:source/atom:rights">
+ <xsl:attribute name="title">
+ <xsl:value-of select="atom:source/atom:rights"/>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:if test="atom:rights">
+ <xsl:attribute name="title">
+ <xsl:value-of select="atom:rights"/>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:text>©</xsl:text>
+ </a>
+ <xsl:text> </xsl:text>
+ </xsl:if>
+ <a href="{atom:link[@rel='alternate']/@href}" class="permalink">
+ <xsl:choose>
+ <xsl:when test="atom:author/atom:name">
+ <xsl:if test="not(atom:link[@rel='license'] or
+ atom:source/atom:link[@rel='license'] or
+ atom:rights or atom:source/atom:rights)">
+ <xsl:text>by </xsl:text>
+ </xsl:if>
+ <xsl:value-of select="atom:author/atom:name"/>
+ <xsl:text> at </xsl:text>
+ </xsl:when>
+ <xsl:when test="atom:source/atom:author/atom:name">
+ <xsl:if test="not(atom:link[@rel='license'] or
+ atom:source/atom:link[@rel='license'] or
+ atom:rights or atom:source/atom:rights)">
+ <xsl:text>by </xsl:text>
+ </xsl:if>
+ <xsl:value-of select="atom:source/atom:author/atom:name"/>
+ <xsl:text> at </xsl:text>
+ </xsl:when>
+ </xsl:choose>
+ <span class="date" title="GMT">
+ <xsl:value-of select="atom:updated/@planet:format"/>
+ </span>
+ </a>
+ </div>
+ </div>
+ </div>
+
+ </xsl:template>
+
+ <!-- xhtml content -->
+ <xsl:template match="atom:content/xhtml:div | atom:summary/xhtml:div">
+ <xsl:copy>
+ <xsl:if test="../@xml:lang and not(../@xml:lang = ../../@xml:lang)">
+ <xsl:attribute name="xml:lang">
+ <xsl:value-of select="../@xml:lang"/>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:apply-templates select="@*|node()"/>
+ </xsl:copy>
+ </xsl:template>
+
+ <!-- plain text content -->
+ <xsl:template match="atom:content/text() | atom:summary/text()">
+ <div>
+ <xsl:if test="../@xml:lang and not(../@xml:lang = ../../@xml:lang)">
+ <xsl:attribute name="xml:lang">
+ <xsl:value-of select="../@xml:lang"/>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:copy-of select="."/>
+ </div>
+ </xsl:template>
+
+ <!-- Feedburner detritus -->
+ <xsl:template match="xhtml:div[@class='feedflare']"/>
+
+ <!-- Remove stray atom elements -->
+ <xsl:template match="atom:*">
+ <xsl:apply-templates/>
+ </xsl:template>
+
+ <!-- pass through everything else -->
+ <xsl:template match="@*|node()">
+ <xsl:copy>
+ <xsl:apply-templates select="@*|node()"/>
+ </xsl:copy>
+ </xsl:template>
+
+</xsl:stylesheet>
Deleted: trunk/lib/venus/themes/musings/personalize.js
===================================================================
--- branches/sucs-site/lib/venus/themes/musings/personalize.js 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/lib/venus/themes/musings/personalize.js 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,220 +0,0 @@
-var entries = []; // list of news items
-
-var days = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday",
- "Friday", "Saturday"];
-var months = ["January", "February", "March", "April", "May", "June", "July",
- "August", "September", "October", "November", "December"];
-
-// event complete: stop propagation of the event
-function stopPropagation(event) {
- if (event.preventDefault) {
- event.preventDefault();
- event.stopPropagation();
- } else {
- event.returnValue = false;
- }
-}
-
-// scroll back to the previous article
-function prevArticle(event) {
- for (var i=entries.length; --i>=0;) {
- if (entries[i].anchor.offsetTop < document.documentElement.scrollTop) {
- window.location.hash=entries[i].anchor.id;
- stopPropagation(event);
- break;
- }
- }
-}
-
-// advance to the next article
-function nextArticle(event) {
- for (var i=1; i<entries.length; i++) {
- if (entries[i].anchor.offsetTop-20 > document.documentElement.scrollTop) {
- window.location.hash=entries[i].anchor.id;
- stopPropagation(event);
- break;
- }
- }
-}
-
-// process keypresses
-function navkey(event) {
- var checkbox = document.getElementById('navkeys');
- if (!checkbox || !checkbox.checked) return;
-
- if (!event) event=window.event;
- key=event.keyCode;
-
- if (!document.documentElement) return;
- if (!entries[0].anchor || !entries[0].anchor.offsetTop) return;
-
- if (key == 'J'.charCodeAt(0)) nextArticle(event);
- if (key == 'K'.charCodeAt(0)) prevArticle(event);
-}
-
-// create (or reset) a cookie
-function createCookie(name,value,days) {
- if (days) {
- var date = new Date();
- date.setTime(date.getTime()+(days*24*60*60*1000));
- var expires = "; expires="+date.toGMTString();
- }
- else expires = "";
- document.cookie = name+"="+value+expires+"; path=/";
-}
-
-// read a cookie
-function readCookie(name) {
- var nameEQ = name + "=";
- var ca = document.cookie.split(';');
- for(var i=0;i < ca.length;i++) {
- var c = ca[i];
- while (c.charAt(0)==' ') c = c.substring(1,c.length);
- if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
- }
- return null;
-}
-
-// each time the value of the option changes, update the cookie
-function selectOption() {
- var checkbox = document.getElementById('navkeys');
- if (!checkbox) return;
- createCookie("navkeys", checkbox.checked?'true':'false', 365);
-}
-
-// add navkeys option to sidebar
-function addOption(event) {
- if (entries.length > 1 && entries[entries.length-1].parent.offsetTop > 0) {
- var sidebar = document.getElementById('sidebar');
- if (!sidebar) return;
-
- for (var i=entries.length; --i>=0;) {
- var a = entries[i].anchor = document.createElement('a');
- a.id = "news-" + i;
- entries[i].parent.insertBefore(a, entries[i].parent.firstChild);
- }
-
- var h2 = document.createElement('h2');
- h2.appendChild(document.createTextNode('Options'));
- sidebar.appendChild(h2);
-
- var form = document.createElement('form');
- var p = document.createElement('p');
- var input = document.createElement('input');
- input.type = "checkbox";
- input.id = "navkeys";
- p.appendChild(input);
- var a = document.createElement('a');
- a.title = "Navigate entries";
- a.appendChild(document.createTextNode('Enable '));
- var code = document.createElement('code');
- code.appendChild(document.createTextNode('J'));
- a.appendChild(code);
- a.appendChild(document.createTextNode(' and '));
- code = document.createElement('code');
- code.appendChild(document.createTextNode('K'));
- a.appendChild(code);
- a.appendChild(document.createTextNode(' keys'));
- p.appendChild(a);
- form.appendChild(p);
- sidebar.appendChild(form);
-
- var cookie = readCookie("navkeys");
- if (cookie && cookie == 'true') input.checked = true;
- input.onclick = selectOption;
- document.onkeydown = navkey;
- }
-}
-
-// convert date to local time
-var localere = /^(\w+) (\d+) (\w+) \d+ 0?(\d\d?:\d\d):\d\d ([AP]M) (EST|EDT|CST|CDT|MST|MDT|PST|PDT)/;
-function localizeDate(element) {
- var date = new Date();
- date.setTime(Date.parse(element.innerHTML + " GMT"));
-
- var local = date.toLocaleString();
- var match = local.match(localere);
- if (match) {
- element.innerHTML = match[4] + ' ' + match[5].toLowerCase();
- element.title = match[6] + " \u2014 " +
- match[1] + ', ' + match[3] + ' ' + match[2];
- return days[date.getDay()] + ', ' + months[date.getMonth()] + ' ' +
- date.getDate() + ', ' + date.getFullYear();
- } else {
- element.title = element.innerHTML + ' GMT';
- element.innerHTML = local;
- return days[date.getDay()] + ', ' + date.getDate() + ' ' +
- months[date.getMonth()] + ' ' + date.getFullYear();
- }
-
-}
-
-// find entries (and localizeDates)
-function findEntries() {
-
- var span = document.getElementsByTagName('span');
-
- for (var i=0; i<span.length; i++) {
- if (span[i].className == "date" && span[i].title == "GMT") {
- var date = localizeDate(span[i]);
-
- var parent = span[i];
- while (parent && parent.className != 'news') {
- parent = parent.parentNode;
- }
-
- if (parent) {
- var info = entries[entries.length] = new Object();
- info.parent = parent;
- info.date = date;
- }
- }
- }
-
-}
-
-// insert/remove date headers to indicate change of date in local time zone
-function moveDateHeaders() {
- lastdate = ''
- for (var i=0; i<entries.length; i++) {
- var parent = entries[i].parent;
- var date = entries[i].date;
-
- sibling = parent.previousSibling;
- while (sibling && sibling.nodeType != 1) {
- sibling = sibling.previousSibling;
- }
-
- if (sibling && sibling.nodeName.toLowerCase() == 'h2') {
- if (lastdate == date) {
- sibling.parentNode.removeChild(sibling);
- } else {
- sibling.innerHTML = date;
- lastdate = date;
- }
- } else if (lastdate != date) {
- var h2 = document.createElement('h2');
- h2.className = 'date'
- h2.appendChild(document.createTextNode(date));
- parent.parentNode.insertBefore(h2, parent);
- lastdate = date;
- }
- }
-}
-
-// adjust dates to local time zones, optionally provide navigation keys
-function personalize() {
- findEntries();
- addOption();
- moveDateHeaders();
-}
-
-// hook event
-window.onload = personalize;
-if (document.addEventListener) {
- onDOMLoad = function() {
- window.onload = undefined;
- personalize();
- };
- document.addEventListener("DOMContentLoaded", onDOMLoad, false);
-}
Copied: trunk/lib/venus/themes/musings/personalize.js (from rev 656, branches/sucs-site/lib/venus/themes/musings/personalize.js)
===================================================================
--- trunk/lib/venus/themes/musings/personalize.js (rev 0)
+++ trunk/lib/venus/themes/musings/personalize.js 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,220 @@
+var entries = []; // list of news items
+
+var days = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday",
+ "Friday", "Saturday"];
+var months = ["January", "February", "March", "April", "May", "June", "July",
+ "August", "September", "October", "November", "December"];
+
+// event complete: stop propagation of the event
+function stopPropagation(event) {
+ if (event.preventDefault) {
+ event.preventDefault();
+ event.stopPropagation();
+ } else {
+ event.returnValue = false;
+ }
+}
+
+// scroll back to the previous article
+function prevArticle(event) {
+ for (var i=entries.length; --i>=0;) {
+ if (entries[i].anchor.offsetTop < document.documentElement.scrollTop) {
+ window.location.hash=entries[i].anchor.id;
+ stopPropagation(event);
+ break;
+ }
+ }
+}
+
+// advance to the next article
+function nextArticle(event) {
+ for (var i=1; i<entries.length; i++) {
+ if (entries[i].anchor.offsetTop-20 > document.documentElement.scrollTop) {
+ window.location.hash=entries[i].anchor.id;
+ stopPropagation(event);
+ break;
+ }
+ }
+}
+
+// process keypresses
+function navkey(event) {
+ var checkbox = document.getElementById('navkeys');
+ if (!checkbox || !checkbox.checked) return;
+
+ if (!event) event=window.event;
+ key=event.keyCode;
+
+ if (!document.documentElement) return;
+ if (!entries[0].anchor || !entries[0].anchor.offsetTop) return;
+
+ if (key == 'J'.charCodeAt(0)) nextArticle(event);
+ if (key == 'K'.charCodeAt(0)) prevArticle(event);
+}
+
+// create (or reset) a cookie
+function createCookie(name,value,days) {
+ if (days) {
+ var date = new Date();
+ date.setTime(date.getTime()+(days*24*60*60*1000));
+ var expires = "; expires="+date.toGMTString();
+ }
+ else expires = "";
+ document.cookie = name+"="+value+expires+"; path=/";
+}
+
+// read a cookie
+function readCookie(name) {
+ var nameEQ = name + "=";
+ var ca = document.cookie.split(';');
+ for(var i=0;i < ca.length;i++) {
+ var c = ca[i];
+ while (c.charAt(0)==' ') c = c.substring(1,c.length);
+ if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
+ }
+ return null;
+}
+
+// each time the value of the option changes, update the cookie
+function selectOption() {
+ var checkbox = document.getElementById('navkeys');
+ if (!checkbox) return;
+ createCookie("navkeys", checkbox.checked?'true':'false', 365);
+}
+
+// add navkeys option to sidebar
+function addOption(event) {
+ if (entries.length > 1 && entries[entries.length-1].parent.offsetTop > 0) {
+ var sidebar = document.getElementById('sidebar');
+ if (!sidebar) return;
+
+ for (var i=entries.length; --i>=0;) {
+ var a = entries[i].anchor = document.createElement('a');
+ a.id = "news-" + i;
+ entries[i].parent.insertBefore(a, entries[i].parent.firstChild);
+ }
+
+ var h2 = document.createElement('h2');
+ h2.appendChild(document.createTextNode('Options'));
+ sidebar.appendChild(h2);
+
+ var form = document.createElement('form');
+ var p = document.createElement('p');
+ var input = document.createElement('input');
+ input.type = "checkbox";
+ input.id = "navkeys";
+ p.appendChild(input);
+ var a = document.createElement('a');
+ a.title = "Navigate entries";
+ a.appendChild(document.createTextNode('Enable '));
+ var code = document.createElement('code');
+ code.appendChild(document.createTextNode('J'));
+ a.appendChild(code);
+ a.appendChild(document.createTextNode(' and '));
+ code = document.createElement('code');
+ code.appendChild(document.createTextNode('K'));
+ a.appendChild(code);
+ a.appendChild(document.createTextNode(' keys'));
+ p.appendChild(a);
+ form.appendChild(p);
+ sidebar.appendChild(form);
+
+ var cookie = readCookie("navkeys");
+ if (cookie && cookie == 'true') input.checked = true;
+ input.onclick = selectOption;
+ document.onkeydown = navkey;
+ }
+}
+
+// convert date to local time
+var localere = /^(\w+) (\d+) (\w+) \d+ 0?(\d\d?:\d\d):\d\d ([AP]M) (EST|EDT|CST|CDT|MST|MDT|PST|PDT)/;
+function localizeDate(element) {
+ var date = new Date();
+ date.setTime(Date.parse(element.innerHTML + " GMT"));
+
+ var local = date.toLocaleString();
+ var match = local.match(localere);
+ if (match) {
+ element.innerHTML = match[4] + ' ' + match[5].toLowerCase();
+ element.title = match[6] + " \u2014 " +
+ match[1] + ', ' + match[3] + ' ' + match[2];
+ return days[date.getDay()] + ', ' + months[date.getMonth()] + ' ' +
+ date.getDate() + ', ' + date.getFullYear();
+ } else {
+ element.title = element.innerHTML + ' GMT';
+ element.innerHTML = local;
+ return days[date.getDay()] + ', ' + date.getDate() + ' ' +
+ months[date.getMonth()] + ' ' + date.getFullYear();
+ }
+
+}
+
+// find entries (and localizeDates)
+function findEntries() {
+
+ var span = document.getElementsByTagName('span');
+
+ for (var i=0; i<span.length; i++) {
+ if (span[i].className == "date" && span[i].title == "GMT") {
+ var date = localizeDate(span[i]);
+
+ var parent = span[i];
+ while (parent && parent.className != 'news') {
+ parent = parent.parentNode;
+ }
+
+ if (parent) {
+ var info = entries[entries.length] = new Object();
+ info.parent = parent;
+ info.date = date;
+ }
+ }
+ }
+
+}
+
+// insert/remove date headers to indicate change of date in local time zone
+function moveDateHeaders() {
+ lastdate = ''
+ for (var i=0; i<entries.length; i++) {
+ var parent = entries[i].parent;
+ var date = entries[i].date;
+
+ sibling = parent.previousSibling;
+ while (sibling && sibling.nodeType != 1) {
+ sibling = sibling.previousSibling;
+ }
+
+ if (sibling && sibling.nodeName.toLowerCase() == 'h2') {
+ if (lastdate == date) {
+ sibling.parentNode.removeChild(sibling);
+ } else {
+ sibling.innerHTML = date;
+ lastdate = date;
+ }
+ } else if (lastdate != date) {
+ var h2 = document.createElement('h2');
+ h2.className = 'date'
+ h2.appendChild(document.createTextNode(date));
+ parent.parentNode.insertBefore(h2, parent);
+ lastdate = date;
+ }
+ }
+}
+
+// adjust dates to local time zones, optionally provide navigation keys
+function personalize() {
+ findEntries();
+ addOption();
+ moveDateHeaders();
+}
+
+// hook event
+window.onload = personalize;
+if (document.addEventListener) {
+ onDOMLoad = function() {
+ window.onload = undefined;
+ personalize();
+ };
+ document.addEventListener("DOMContentLoaded", onDOMLoad, false);
+}
Modified: trunk/plugins/function.articlesummary.php
===================================================================
--- trunk/plugins/function.articlesummary.php 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/plugins/function.articlesummary.php 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,7 +1,17 @@
<?php
+
function smarty_function_articlesummary($params, &$smarty) {
+
+ $article = $params['article'];
+ $id = $params['id'];
+ $title = rawurlencode($params['title']);
+
+ $linky = "<span style=\"float: right\"><a href=\"/News/".rawurlencode($title)."\">Read More</a></span>";
+
$matches = array();
- preg_match("/^(<p>.*?<\/p>)/", $params['article'], $matches);
- return $matches[0];
+ preg_match("/^(<p>.*?<\/p>)/s", $article, $matches);
+ $summary = preg_replace("/<\/p>/","$linky</p>", $matches[0]);
+ return $summary;
}
+
?>
Modified: trunk/plugins/function.bananaprint.php
===================================================================
--- trunk/plugins/function.bananaprint.php 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/plugins/function.bananaprint.php 2015-04-05 16:42:47 UTC (rev 657)
@@ -3,6 +3,10 @@
$output = "";
$score = $params['score'];
if ($score > 0) {
+ while ($score >= 250) {
+ $output .= " <img src=\"/images/bananas/banana-container.png\" width=\"92\" height=\"64\" alt=\"250\" title=\"Container of 250 Bananas\" />\n";
+ $score -= 250;
+ }
while ($score >= 50) {
$output .= " <img src=\"/images/bananas/banana-crate.png\" width=\"92\" height=\"64\" alt=\"50\" title=\"Crate of 50 Bananas\" />\n";
$score -= 50;
@@ -18,6 +22,11 @@
}else if ($score == 0) {
$output .= " <img src=\"/images/bananas/banana-zero.png\" alt=\"0\" width=\"25px\" height=\"64px\" title=\"0 Bananas\" />\n";
}else {
+ while ($score <= -250) {
+ $output .= " <img src=\"/images/bananas/banana-g-container.png\" width=\"92\" height=\"64\" alt=\"250\" title=\"Container of 250 Green Bananas\" />\n";
+ $score += 250;
+ }
+
while ($score <= -50) {
$output .= " <img src=\"/images/bananas/banana-g-crate.png\" width=\"92\" height=\"64\" alt=\"-50\" title=\"Crate of 50 Green Bananas\" />\n";
$score += 50;
Modified: trunk/plugins/function.buildpath.php
===================================================================
--- trunk/plugins/function.buildpath.php 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/plugins/function.buildpath.php 2015-04-05 16:42:47 UTC (rev 657)
@@ -2,7 +2,7 @@
function smarty_function_buildpath($params, &$smarty) {
if ($params['item']=="") return "/";
foreach ($params['list'] as $crumb) {
- if ($crumb!="") $output.="/".$crumb;
+ if ($crumb!="") $output.="/".rawurlencode($crumb);
if ($crumb==$params['item']) return $output;
}
Modified: trunk/settingstemplate
===================================================================
--- trunk/settingstemplate 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/settingstemplate 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,45 +1,16 @@
<?php
-// Name of the website
-define('SUCS_SITENAME', 'SUCS');
-
-// Disclaimer/Copyright notice
-define('SUCS_FOOTERMSG', 'SUCSsite - created by members of <a href="http://sucs.org/">SUCS</a>');
-// ...in Welsh
-define('SUCS_FOOTERMSG_cy', 'SUCSsite - creu gan ymaelodau <a href="http://sucs.org/">CGPA</a>');
-
// root directory for website - *with* trailing /
-define('SUCS_BASEDIR', '$BASEDIR/');
+$base = "$BASEDIR/";
+$baseurl = "/~$USERNAME/sucssite";
+$preferred_hostname = "sucs.org";
+$dbname="beta";
+$sucsdbname="sucs";
+$dbuser="$USERNAME";
-// path to root dir on web server
-define('SUCS_BASEURL', '/~$USERNAME/sucssite');
+// Settings for current election (god knows why they are here):
+define('ELECTION_YEAR', '2015');
+define('ELECTION_START', '2014-12-01 00:00');
+define('ELECTION_END', '2014-12-07 23:59');
+define('ELECTION_NO_MANIFESTO', 'https://sucs.org/~$USERNAME/sucssite/Vote/No%20Manifesto');
-// Hostname of the server
-define('SUCS_PREFERRED_HOSTNAME', 'sucs.org');
-
-// Path of ADOdb
-define('ADODB_DIR', '/usr/share/adodb/');
-
-// Path of Smarty
-define('SMARTY_DIR', '/usr/share/Smarty/');
-
-// Session timeout in minutes
-define('SUCS_SESSION_TIMEOUT', '300');
-
-// Use HTTPS?
-define('SUCS_USE_HTTPS', TRUE);
-
-// Database type
-define('SUCS_DBTYPE', 'postgres8');
-
-// Name of the database
-define('SUCS_DBNAME', 'beta');
-
-// Authentication method - valid options are currently "LDAP" and "DB"
-define('SUCS_AUTH_METHOD', 'LDAP');
-
-// LDAP Server
-define('SUCS_LDAP_SERVER', 'ldap://localhost');
-
-// LDAP Search Base
-define('SUCS_LDAP_SEARCH', 'dc=sucs,dc=org');
?>
Property changes on: trunk/setup.sh
___________________________________________________________________
Added: svn:executable
+ *
Modified: trunk/templates/banana-award.tpl
===================================================================
--- trunk/templates/banana-award.tpl 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/templates/banana-award.tpl 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,12 +1,5 @@
{* Banana awarding widget *}
-{if $errormsg}
- <div class="errorbar">
- <div><div><div>
- Error: {$errormsg}
- </div></div></div>
- </div>
-{/if}
<div class="cbb">
{if $awarded == true}
<h3>Nomination Received</h3>
Copied: trunk/templates/banana-awardlist.tpl (from rev 656, branches/sucs-site/templates/banana-awardlist.tpl)
===================================================================
--- trunk/templates/banana-awardlist.tpl (rev 0)
+++ trunk/templates/banana-awardlist.tpl 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,14 @@
+<ul class="bananas">
+{foreach name=awards from=$awards item=award}
+<li class="{award_image_class number=$award.score}">
+ {if !isset($singlemember)}
+ <strong>{if $award.score >0}+{/if}{$award.score}</strong> awarded to
+ <a href="{$baseurl}{if $award.real == TRUE}/Community/Members/{else}/Community/Bananas{/if}{$award.username}">{$award.username}</a>
+ <small>(from {$award.who}, {$award.whn|date_format:"%d %b %Y"})</small><br /> {/if}
+ <q>{$award.why}</q> <br />
+ {if isset($singlemember)} <small>
+ <strong>{if $award.score >0}+{/if}{$award.score}</strong> awarded by {$award.who} on {$award.whn|date_format:"%d %b %Y"}
+ </small>{/if}
+</li>
+{/foreach}
+</ul>
Modified: trunk/templates/bananas.tpl
===================================================================
--- trunk/templates/bananas.tpl 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/templates/bananas.tpl 2015-04-05 16:42:47 UTC (rev 657)
@@ -31,14 +31,3 @@
</div>
{/if}
-<h3>Banana Summary</h3>
-<table border="0" cellpadding="5">
-
-{foreach name=users from=$users key=key2 item=user}
-<tr>
- <td><a href="/Community/Bananas/{$user.username}">{$user.username}</a></td>
- <td>{$user.sum}</td>
- <td>{bananaprint score=$user.sum}</td>
-</tr>
-{/foreach}
-</table>
Modified: trunk/templates/branding.tpl
===================================================================
--- trunk/templates/branding.tpl 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/templates/branding.tpl 2015-04-05 16:42:47 UTC (rev 657)
@@ -3,7 +3,7 @@
<div class="cornerTopLeft">
<div class="cornerTopRight">
<div id="logo">
- <a href="/"><img src="/images/sucslogo-halo.png" width="170px" height="76px" alt="SUCS" /></a>
+ <a href="/"><img src="/images/sucslogo-halo.png" width="170" height="76" alt="SUCS" /></a>
</div>
{include file="login.tpl"}
Modified: trunk/templates/breadcrumb.tpl
===================================================================
--- trunk/templates/breadcrumb.tpl 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/templates/breadcrumb.tpl 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,7 +1,9 @@
<div id="breadcrumb">
+{if $pathlist}
<ul>
{foreach name=pathlist from=$pathlist key=key item=item}
- <li>{if !$smarty.foreach.pathlist.first}{if $item!=""}> {/if}{/if}{if !$smarty.foreach.pathlist.last}<a href="{buildpath list=$pathlist item=$item|escape:'url'}">{/if}{if $item}{$item|escape:'htmlall'}{else}{if $smarty.foreach.pathlist.first}SUCS{/if}{/if}{if !$smarty.foreach.pathlist.last}</a>{/if}</li>
+ <li>{if !$smarty.foreach.pathlist.first}{if $item!=""}> {/if}{/if}{if !$smarty.foreach.pathlist.last}<a href="{buildpath list=$pathlist item=$item}">{/if}{if $item}{$item|escape:'htmlall'}{else}{if $smarty.foreach.pathlist.first}SUCS{/if}{/if}{if !$smarty.foreach.pathlist.last}</a>{/if}</li>
{/foreach}
</ul>
+{/if}
</div>
Copied: trunk/templates/election-results.tpl (from rev 656, branches/sucs-site/templates/election-results.tpl)
===================================================================
--- trunk/templates/election-results.tpl (rev 0)
+++ trunk/templates/election-results.tpl 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,26 @@
+<h2>Election Results</h2>
+
+{foreach name=outer key=position item=cand from=$candidate}
+<h2>{$position|capitalize}</h2>
+{if count($cand) > 1}
+<table>
+<tr>
+ <th>Candidate</th>
+ <th>Votes</th>
+</tr>
+
+{foreach item=person from=$cand}
+<tr>
+ <td><a href="{$person.manifesto_link}">{$person.realname}</a> ({$person.username})</td>
+ <td style="text-align: right;">{$person.votes}</td>
+</tr>
+{/foreach}
+
+</table>
+
+{else}
+There is no vote for {$position|capitalize} as only one candidate was nominated:<br />
+<a href="{$cand.0.manifesto_link}">{$cand.0.realname}</a> ({$cand.0.username})<br />
+{/if}
+
+{/foreach}
Copied: trunk/templates/election-vote.tpl (from rev 656, branches/sucs-site/templates/election-vote.tpl)
===================================================================
--- trunk/templates/election-vote.tpl (rev 0)
+++ trunk/templates/election-vote.tpl 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,36 @@
+<p>Please use the form below to cast your votes for the {$election_year}
+SUCS executive committee. Note that you have to be a <strong>current student
+member</strong> of SUCS in order for your vote to be valid.<br />
+
+(Click on a candidate's name to view their manifesto)</p>
+
+<form method="post" action="{$smarty.server.REQUEST_URI}">
+{foreach name=outer key=position item=cand from=$candidate}
+<h2>{$position|capitalize}</h2>
+ {if count($cand) > 1}
+ {foreach item=person from=$cand}
+<input type="radio" name="{$position}" value="{$person.username}" id="{$position}{$person.username}" /><label for="{$position}{$person.username}"><a href="{$person.manifesto_link}">{$person.realname}</a> ({$person.username})</label><br />
+ {/foreach}
+<input type="radio" name="{$position}" value="abstain" id="{$position}abstain" /><label for="{$position}abstain"><em>Abstain</em></label><br />
+ {else}
+There is no vote for {$position|capitalize} as only one candidate was nominated:<br />
+<a href="{$cand.0.manifesto_link}">{$cand.0.realname}</a> ({$cand.0.username})
+ {/if}
+
+{/foreach}
+
+<div class="row">
+ <label for="vote_passwd">SUCS Password:</label>
+ <span class="textinput">
+ <input name="vote_passwd" id="vote_passwd" type="password" />
+ <div class="note">Your SUCS password is required to ensure that the vote is from you.</div>
+ </span>
+</div>
+<div class="row">
+ <span class="textinput">
+ <input type="submit" value="Cast Votes" name="submit" />
+ </span>
+</div>
+
+</form>
+
\ No newline at end of file
Copied: trunk/templates/event.tpl (from rev 656, branches/sucs-site/templates/event.tpl)
===================================================================
--- trunk/templates/event.tpl (rev 0)
+++ trunk/templates/event.tpl 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,26 @@
+{if $editable}
+ <div style="float: right">
+ <a href="{$baseurl}/Community/Events/{$event.category}_{$event.id}?action=edit">(Edit)</a>
+ </div>
+{/if}
+
+<div>
+ <h2 style="text-align:left;display:inline">What?</h2>
+ <h1 style="text-align:right;display:inline">{$event.name}</h1>
+</div>
+<br>
+<div>
+ <h2 style="text-align:left;display:inline">Where?</h2>
+ <h1 style="text-align:right;display:inline">{$event.location}</h1>
+</div>
+<br>
+<div>
+ <h2 style="text-align:left;display:inline">When?</h2>
+ <h1 style="text-align:right;display:inline">{$event.whn|date_format:"l \t\h\e jS \o\f F Y \a\t h:i:s A"}{if $event.show_time},{$event.whn_timestamp|date_format:"%H:%M"}{/if}</h1>
+</div>
+
+<h1>Why?</h1>
+
+<p1>
+{$event.description}
+</p1>
\ No newline at end of file
Copied: trunk/templates/event_edit.tpl (from rev 656, branches/sucs-site/templates/event_edit.tpl)
===================================================================
--- trunk/templates/event_edit.tpl (rev 0)
+++ trunk/templates/event_edit.tpl 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,36 @@
+<form class="admin" method="post" action="{$baseurl}{$path}">
+<input type="hidden" name="action" value="save" />
+<input type="hidden" name="id" value="{$event.id}" />
+<div class="row">
+ <label for="name">Event Name</label>
+ <span class="textinput"><input type="text" name="name" {if $event.name}value="{$event.name}"{/if} /></span>
+</div>
+<div class="row">
+ <label>Date</label>
+ <span class="textinput">{html_select_date end_year='+2' }</span>
+</div>
+<div class="row">
+ <label>Time</label>
+ <span class="textinput">{html_select_time display_seconds=false minute_interval=5}</span>
+</div>
+<div class="row">
+ <label for="category">Event Type</label>
+ <span class="textinput">
+ {foreach from=$event_categories item=category}
+ <input type="radio" name="category" value="{$category}" {if $category eq $event.category}checked="checked"{/if} /> {$category}<br />
+ {/foreach}
+ </span>
+</div>
+<div class="row">
+ <label for="location">Location</label>
+ <span class="textinput"><input type="text" name="location" {if $event.location}value="{$event.location}"{/if} /></span>
+</div>
+<div class="row">
+ <label for="description">Description</label>
+ <span class="textinput"><textarea name="description" cols="50" rows="15">{if $event.description}{$event.description}{/if}</textarea></span>
+</div>
+<div class="row">
+<input type="submit" value="Save" />
+</div>
+
+</form>
\ No newline at end of file
Copied: trunk/templates/events.tpl (from rev 656, branches/sucs-site/templates/events.tpl)
===================================================================
--- trunk/templates/events.tpl (rev 0)
+++ trunk/templates/events.tpl 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,44 @@
+{include file="../static/fragments/Events.txt"}
+ <div class="box">
+ <div class="boxhead">
+ <h3>Got an idea?</h3>
+ </div>
+ <div class="boxcontent">
+ <p>Got an idea for a event you'd like to see hosted? Email {mailto address="exec at sucs.org" encode='javascript'}</p>
+ </div>
+ <div class="hollowfoot"><div><div></div></div></div>
+ </div>
+
+{if $editable}
+<a href="?action=create">Add Event</a>
+{/if}
+
+<div class="box">
+<div class="boxhead"><h2>Upcoming Events</h2></div>
+<div class="boxcontent">
+{if $events|@count < 1}
+<p>No events :(</p>
+<p>Pester {mailto address="exec at sucs.org" encode='javascript'} to organise some!</p>
+
+{else}
+{foreach from=$events item=event}
+<h2>
+ <a href="{$baseurl}/Community/Events/{$event.category}_{$event.id}">{$event.name}</a>
+</h2>
+<div><b>{$event.whn_timestamp|date_format:"l, jS F Y"}{if $event.show_time},{$event.whn_timestamp|date_format:"%H:%M"}{/if}</b></div>
+<div>at <b>{$event.location}</b></div>
+<div><p>{$event.description}</p></div>
+
+{/foreach}
+{/if}
+</div>
+<div class="hollowfoot"><div><div></div></div></div>
+</div>
+
+<hr />
+
+<h2>Recent Events</h2>
+<p><small>You missed them. Too bad!</small></p>
+{foreach from=$oldevents item=event}
+<h4><a href="{$baseurl}/Community/Events/{$event.category}_{$event.id}">{$event.name}</a> - <small>{$event.whn_timestamp|date_format:"%A, %e %B"}</small></h4>
+{/foreach}
Copied: trunk/templates/feedback.tpl (from rev 656, branches/sucs-site/templates/feedback.tpl)
===================================================================
--- trunk/templates/feedback.tpl (rev 0)
+++ trunk/templates/feedback.tpl 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,20 @@
+{* form logged-in members can fill in to give us feedback on a website page *}
+
+<div class="cbb">
+{if $feedbacked == true}
+ <h3>Thanks!</h3>
+ <p>Your comments have been sent to the SUCS admin team</p>
+{else}
+ <h3>Something you think we should know?</h3>
+<form name="feedback" action="{$baseurl}{$path}" method="post">
+ <input type="hidden" name="action" value="feedback" />
+ <p>Spotted a mistake on this page? Have some useful info? Let us know below:</p>
+ <div>
+ <span class="textinput"><textarea id="pagefeedback" name="feedback" cols="10" rows="6"></textarea></span>
+ </div>
+ <div>
+ <span class="textinput"><input type="submit" value="Feed back!" /></span>
+ </div>
+</form>
+{/if}
+</div>
Modified: trunk/templates/foot.tpl
===================================================================
--- trunk/templates/foot.tpl 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/templates/foot.tpl 2015-04-05 16:42:47 UTC (rev 657)
@@ -6,6 +6,11 @@
{include file="search.tpl"}
+{if $session->loggedin}
+ <div style="resize: both;">
+ {include file="feedback.tpl"}
+ </div>
+{/if}
{* include file="valid.tpl" *}
Deleted: trunk/templates/forumposts.tpl
===================================================================
--- trunk/templates/forumposts.tpl 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/templates/forumposts.tpl 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,25 +0,0 @@
-{if count($posts) > 0 }
-<div class="cbb">
-<h3>Looking for Something?</h3>
-<p>We are looking to remove the Forum component from the SUCS site.</p>
-<p>We recommend that you backup your data. Forum links will still work.</p>
-<p>If you don't want us to remove it please share your opinion admin at sucs.org</p>
-
-{*
-<h3>Recent Forum posts</h3>
-
-<table width="100%" class="border">
-<tr>
-<th>Subject</th>
-<th>by</th>
-</tr>
-{foreach name=posts from=$posts item=post}
-<tr>
- <td><a href="/Community/Forum/viewtopic.php?pid={$post.last_post_id}#p{$post.last_post_id}">{$post.subject}</a></td>
- <td><a href="/Community/Members/{$post.last_poster}">{$post.last_poster}</a></td>
-</tr>
-{/foreach}
-</table>
-*}
-</div>
-{/if}
Modified: trunk/templates/head.tpl
===================================================================
--- trunk/templates/head.tpl 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/templates/head.tpl 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,23 +1,24 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+<!doctype html>
+<html lang="{$language.code}">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="{$language.code}">
-
<head>
- <title>{$title} - {$smarty.const.SUCS_SITENAME}</title>
+ <meta http-equiv="Content-type" content="text/html;charset=UTF-8" />
+ <title>{$title} - SUCS</title>
<link rel="SHORTCUT ICON" href="/favicon.ico" />
+ <link rel="apple-touch-icon" href="/images/apple-touch-icon.png" />
- <script type="text/javascript" src="/js/cb.js"></script>
-
- <link rel="stylesheet" type="text/css" href="{$smarty.const.SUCS_BASEURL}/css/common.css" media="screen,print" />
- <link rel="stylesheet" type="text/css" href="{$smarty.const.SUCS_BASEURL}/css/sucs.css" media="screen" />
- <link rel="stylesheet" type="text/css" href="{$smarty.const.SUCS_BASEURL}/css/box.css" media="screen" />
- <link rel="stylesheet" type="text/css" href="{$smarty.const.SUCS_BASEURL}/css/downloads.css" media="screen" />
+ <script type="text/javascript" src="/videos/talks/ufo.js"></script>
+
+ <link rel="stylesheet" type="text/css" href="{$baseurl}/css/common.css" media="screen,print" />
+ <link rel="stylesheet" type="text/css" href="{$baseurl}/css/sucs.css" media="screen" />
+ <link rel="stylesheet" type="text/css" href="{$baseurl}/css/box.css" media="screen" />
+ <link rel="stylesheet" type="text/css" href="{$baseurl}/css/downloads.css" media="screen" />
{if isset($extra_styles)}
{foreach from=$extra_styles item=style}
<link rel="stylesheet" type="text/css" href="{$style}" media="screen" />
{/foreach}
{/if}
- <link rel="stylesheet" type="text/css" href="{$smarty.const.SUCS_BASEURL}/css/print.css" media="print" />
+ <link rel="stylesheet" type="text/css" href="{$baseurl}/css/print.css" media="print" />
{if isset($rss_url)}
<link rel="alternate" type="application/rss+xml" title="{$title}" href="{$rss_url}" />
@@ -25,14 +26,13 @@
{if isset($atom_url)}
<link rel="alternate" type="application/atom+xml" title="{$title}" href="{$atom_url}" />
{/if}
- <meta name="author" content="Denis Walker" />
+<!-- <meta name="author" content="Denis Walker" /> -->
<meta name="description" content="Swansea University Computer Society - providing student computing facilities and personal web pages." />
-<!-- <meta name="keywords" content="" /> -->
{if $refresh} <meta http-equiv="REFRESH" content="{$refresh}" />{/if}
{if $action=="edit"}
- <script language="javascript" type="text/javascript" src="{$smarty.const.SUCS_BASEURL}/js/tinymce/jscripts/tiny_mce/tiny_mce.js"></script>
- <script language="javascript" type="text/javascript" src="{$smarty.const.SUCS_BASEURL}/js/tiny_mce.js"></script>
+ <script language="javascript" type="text/javascript" src="{$baseurl}/js/tinymce/jscripts/tiny_mce/tiny_mce.js"></script>
+ <script language="javascript" type="text/javascript" src="{$baseurl}/js/tiny_mce.js"></script>
{/if}
{if isset($extra_scripts)}
@@ -42,15 +42,21 @@
{/if}
<!--[if IE]>
- <link rel="stylesheet" type="text/css" href="{$smarty.const.SUCS_BASEURL}/css/ie.css" />
+ <link rel="stylesheet" type="text/css" href="{$baseurl}/css/ie.css" />
+ <script type="text/javascript" src="/js/cb.js"></script>
<![endif]-->
+<!--[if IE 8]>
+ <link rel="stylesheet" type="text/css" href="{$baseurl}/css/ie8.css" />
+<![endif]-->
+<!--[if lt IE 8]>
+ <link rel="stylesheet" type="text/css" href="{$baseurl}/css/ielt8.css" media="screen" />
+<![endif]-->
+
<!--[if lt IE 7]>
- <link rel="stylesheet" type="text/css" href="{$smarty.const.SUCS_BASEURL}/css/ielt7.css" media="screen" />
- <link rel="stylesheet" type="text/css" href="{$smarty.const.SUCS_BASEURL}/css/boxie.css" media="screen" />
-
- <script defer type="text/javascript" language="JavaScript" src="{$smarty.const.SUCS_BASEURL}/js/pngfix.js"></script>
-
+ <link rel="stylesheet" type="text/css" href="{$baseurl}/css/ielt7.css" media="screen" />
+ <link rel="stylesheet" type="text/css" href="{$baseurl}/css/boxie.css" media="screen" />
+ <script defer type="text/javascript" language="JavaScript" src="{$baseurl}/js/pngfix.js"></script>
<![endif]-->
</head>
Modified: trunk/templates/index.tpl
===================================================================
--- trunk/templates/index.tpl 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/templates/index.tpl 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,17 +1,3 @@
-{if $session->errormsg}
- <div class="errorbar">
- <div><div><div>
- Session: {$session->errormsg}
- </div></div></div>
- </div>
-{/if}
-{if $fileerror}
- <div class="errorbar">
- <div><div><div>
- File error: {$fileerror}
- </div></div></div>
- </div>
-{/if}
{if $secondary}
<div id="primary">
@@ -40,6 +26,8 @@
</div>
<div id="secondary">
-{$secondary}
+{foreach from=$secondary item=widget}
+{$widget}
+{/foreach}
</div>
{/if}
Copied: trunk/templates/junk.tpl (from rev 656, branches/sucs-site/templates/junk.tpl)
===================================================================
--- trunk/templates/junk.tpl (rev 0)
+++ trunk/templates/junk.tpl 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,140 @@
+{if $mode == 'nojunk'}
+ {include file="../static/fragments/Junk.txt"}
+ <div class="box">
+ <div class="boxhead">
+ <h3>No Junk</h3>
+ </div>
+ <div class="boxcontent">
+ <h4>There is currently no junk</h4>
+ <h4></h4>
+ </div>
+ <div class="hollowfoot"><div><div></div></div></div>
+ </div>
+ {if $admin}
+ <div class="edit">
+ <a href="{$componentpath}/Add">Add</a>
+ <div class="clear"></div>
+ </div>
+ {/if}
+{/if}
+{if $mode == 'list'}
+{include file="../static/fragments/Junk.txt"}
+{foreach name=junk from=$junk key=status item=statusitems}
+ <div class="box">
+ <div class="boxhead">
+ {if $status == 'available'} <h3>Free Stuff!</h3>
+ {elseif $status == 'requested'} <h3>Reserved Items</h3>
+ {elseif $status == 'taken'} <h3>Recently Taken</h3>
+ {else} <h3>Not Junk</h3> {/if}
+ </div>
+ <div class="boxcontent">
+ {foreach from=$statusitems item=category key=categoryname}
+ <h4>{$categoryname}</h4>
+ <ul>
+ {foreach from=$category item=item}
+ <li>
+ <strong>{$item.title}:</strong> {$item.description}
+ {if $item.donated_by != null}
+ <br /><small>Donated by {$item.donated_by}</small>
+ {/if}
+ {if $status == 'requested'}
+ <br /><small>Requested by {$item.requested_by} on {$item.requested_on|date_format:"%e %b %Y"}</small>
+ {elseif $status == "taken"}
+ <br /><small>Taken by {$item.requested_by} on {$item.taken_on|date_format:"%e %b %Y"}</small>
+ {/if}
+ {if $session->loggedin}
+ {if $admin || $item.status=='junk'}
+ <form action="{$url}" method="POST">
+ <input type="hidden" name="item" value="{$item.id}" />
+ {if $item.status=='junk'}
+ {if $item.requested_by==null}
+ <input type="submit" name="action" value="Request" />
+ {elseif ($item.requested_by==$session->username || $admin) && $item.taken_on==null}
+ <input type="submit" name="action" value="Un-Request" />
+ {/if}
+ {if $admin}
+ {if $item.requested_by!=null && $item.taken_on==null}
+ <input type="submit" name="action" value="Item Taken" />
+ {elseif $item.requested_by==null}
+ <input type="submit" name="action" value="Not Junk" />
+ <input type="submit" name="action" value="Remove" />
+ {/if}
+ {/if}
+ {elseif $admin}
+ <input type="submit" name="action" value="Junk" />
+ {/if}
+ </form>
+ {/if}
+ {/if}
+ {if $admin && $item.requested_by==null}
+ <div class="edit">
+ <a href="{$componentpath}/Edit/{$item.id}">Edit</a>
+ <div class="clear"></div>
+ </div>
+ {/if}
+ </li>
+ {/foreach}
+ </ul>
+{/foreach}
+ </div>
+ <div class="hollowfoot"><div><div></div></div></div>
+</div>
+{/foreach}
+{if $admin}
+ <div class="edit">
+ <a href="{$componentpath}/Add">Add</a>
+ <div class="clear"></div>
+ </div>
+{/if}
+{elseif ($mode == 'edit' || $mode == 'add') && $admin}
+<fieldset>
+ <legend>{if $mode=='edit'}Edit{else}New{/if} Item</legend>
+ <form action="{$componentpath}" method="POST">
+ <input type="hidden" name="id" value="{$item.id}" />
+ <div class="row">
+ <label for="title">Title*</label>
+ <span class="textinput"><input type="text" name="title"{if $mode == 'edit'} value="{$item.title}"{/if} /></span>
+ </div>
+ <div class="row">
+ <label for="category">Category*</label>
+ <span class="textinput">
+ <select name="categorymenu">
+ <option value="">Other...</option>
+ {foreach name=categories from=$categories item=category}
+ <option{if ($category == $item.category) && ($mode == 'edit')} selected="selected"{/if}>{$category}</option>
+ {/foreach}
+ </select>
+ </span>
+ <span class="textinput">
+ <div class="note">If none of the existing categories apply, enter one below:</div>
+ <input type="text" name="category"/>
+ </span>
+ </div>
+ <div class="row">
+ <label for="description">Description</label>
+ <span class="textinput"><textarea name="description" cols="25" rows="3">{if $mode == 'edit'}{$item.description}{/if}</textarea></span>
+ </div>
+ <div class="row">
+ <label for="donated_by">Donated by</label>
+ <span class="textinput"><input type="text" name="donated_by"{if $mode == 'edit'} value="{$item.donated_by}"{/if} /></span>
+ </div>
+ <div class="row">
+ <label for="status">Status</label>
+ <span class="textinput">
+ <select name="status">
+ {foreach name=statuses from=$statuses item=status}
+ <option{if ($status == $item.status) && ($mode == 'edit')} selected="selected"{/if}>{$status}</option>
+ {foreachelse}
+ <option>unknown</option>
+ {/foreach}
+ </select>
+ </span>
+ </div>
+ <div class="row">
+ <span class="textinput"><input type="submit" name="{if $mode == 'edit'}update{else}add{/if}" value="{if $mode == 'edit'}Update{else}Add{/if}" /></span>
+ <div class="note row">* denotes required fields</div>
+ </div>
+ <div class="clear"></div>
+ </form>
+</fieldset>
+{/if}
Copied: trunk/templates/library-addbook.tpl (from rev 656, branches/sucs-site/templates/library-addbook.tpl)
===================================================================
--- trunk/templates/library-addbook.tpl (rev 0)
+++ trunk/templates/library-addbook.tpl 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,52 @@
+
+<fieldset>
+<legend>Add Book</legend>
+<form action="{$self}" method="POST">
+<input type="hidden" name="action" value="search" />
+<div class="note row">Enter an ISBN to attempt to auto-fill book details</div>
+<div class="row">
+ <label for="isbn">ISBN</label>
+ <span class="textinput"><input type="text" name="isbn" /></span>
+</div>
+<div class="row">
+ <span class="textinput"><input type="submit" value="Auto-fill" /></span>
+</div>
+</form>
+
+{if isset($book.image_url)}
+ <div class="emblem">
+ <img src="{$book.image_url}" />
+ </div>
+{/if}
+
+<div>
+<form action="{$self}" method="POST">
+ <input type="hidden" name="action" value="add" />
+ <input type="hidden" name="image_url" value="{$book.image_url}" />
+ <div class="row">
+ <label for="isbn">ISBN Number</label>
+ <span class="textinput"><input type="text" name="isbn" value="{$book.isbn}"/></span>
+ </div>
+
+ <div class="row">
+ <label for="title">Title</label>
+ <span class="textinput"><input type="text" name="title" width="200" value="{$book.title|escape}" /></span>
+ </div>
+ <div class="row">
+ <label for="author">Author</label>
+ <span class="textinput"><input type="text" name="author" value="{$book.author|escape}" /></span>
+ </div>
+ <div class="row">
+ <label for="publisher">Publisher</label>
+ <span class="textinput"><input type="text" name="publisher" value="{$book.publisher|escape}" /></span>
+ </div>
+ <div class="row">
+ <label for="comments">Comments</label>
+ <span class="textinput"><textarea name="comments"></textarea></span>
+ </div>
+ <div class="row">
+ <input type="submit" name="add" value="Add Book" />
+ </div>
+</form>
+</div>
+</fieldset>
Copied: trunk/templates/library-book-edit.tpl (from rev 656, branches/sucs-site/templates/library-book-edit.tpl)
===================================================================
--- trunk/templates/library-book-edit.tpl (rev 0)
+++ trunk/templates/library-book-edit.tpl 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,32 @@
+
+<div class="box">
+ <div class="boxhead"><h2>{$book.title}</h2></div>
+ <div class="boxcontent">
+
+ <strong>{if $book.onloan}On loan{else}Book Available{/if}</strong>
+ {if $book.image_url != ""}<img class="emblem" src="{$book.image_url|escape}" alt="{$book.title|escape}" />{/if}
+{if $editable == true}
+ <form class="admin" action="{$baseurl}{$path}?action=save" method="POST">
+ <div class="row">
+ <label for="title">Title</label>
+ <span class="textinput"><input type="text" name="title" value="{$book.title}" /></span>
+ </div>
+ <div class="row">
+ <label for="author">Author</label>
+ <span class="textinput"><input type="text" name="author" value="{$book.author}" /></span>
+ </div>
+ <div class="row">
+ <label for="publisher">Publisher</label>
+ <span class="textinput"><input type="text" name="publisher" value="{$book.publisher}" /></span>
+ </div>
+ <div class="row"><label for="description">Description</label><textarea cols="50" rows="20" name="description">{$book.description|escape}</textarea></div>
+ <input type="submit" value="Save" />
+ </form>
+{else}
+ <p>You don't have permission to edit books</p>
+
+{/if}
+ <div class="clear"></div>
+ </div>
+ <div class="hollowfoot"><div><div></div></div></div>
+</div>
Copied: trunk/templates/library-book.tpl (from rev 656, branches/sucs-site/templates/library-book.tpl)
===================================================================
--- trunk/templates/library-book.tpl (rev 0)
+++ trunk/templates/library-book.tpl 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,20 @@
+
+<div class="box">
+ <div class="boxhead"><h2>{$book.title}</h2></div>
+ <div class="boxcontent">
+
+ <strong>{if $book.onloan}On loan{else}Book Available{/if}</strong>
+ {if $book.image_url != ""}<img class="emblem" src="{$book.image_url|escape}" alt="{$book.title|escape}" />{/if}
+ <p>Author: {$book.author}</p>
+ {if isset($book.description)}
+ <div>{$book.description}</div>
+ {/if}
+{if $editable == true}
+ <div class="edit">
+ <ul><li><a href="?action=edit">Edit</a></li></ul>
+ </div>
+{/if}
+ <div class="clear"></div>
+ </div>
+ <div class="hollowfoot"><div><div></div></div></div>
+</div>
Modified: trunk/templates/library.tpl
===================================================================
--- trunk/templates/library.tpl 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/templates/library.tpl 2015-04-05 16:42:47 UTC (rev 657)
@@ -4,46 +4,38 @@
<h3>Browse by category</h3>
<ul>
{foreach name=tags from=$tags item=tag}
-<li><a href="/Knowledge/Library/Tags/{$tag.name|escape:'url'}">{$tag.name}</a></li>
+<li><a href="{$baseurl}/Knowledge/Library/Tags/{$tag.name|escape:'url'}">{$tag.name}</a></li>
{/foreach}
</ul>
<h3>Random Books</h3>
{foreach name=randoms from=$randoms item=randomitem}
- <a href="/Knowledge/Library/{$randomitem.id}"><img src="{$randomitem.image_url}" alt="{$randomitem.title}" height="120" /></a>
+ <a href="{$baseurl}/Knowledge/Library/{$randomitem.id}"><img src="{$randomitem.image_url}" alt="{$randomitem.title}" height="120" /></a>
{/foreach}
{elseif $mode == 'display'}
-<div class="box">
- <div class="boxhead"><h2>{$book.title}</h2></div>
- <div class="boxcontent">
- {if $book.image_url != ""}<img class="emblem" src="{$book.image_url}" alt="{$book.title}" />{/if}
- <p>{$book.author}</p>
- <p>{$book.description}</p>
- {if $book.onloan}<p>On loan</p>{else}<p>Book Available</p>{/if}
- {if $editable==true}
- <p>Loan stuff to people maybe</p>
- {/if}
- <div class="clear"></div>
- </div>
- <div class="hollowfoot"><div><div></div></div></div>
-</div>
+
+{include file='library-book.tpl' book=$book}
+
{elseif $mode == 'search'}
<h3>Search Results</h3>
{if $results|@count < 1}<p>No results found</p>
{else}
<ul>
{foreach name=results from=$results item=result}
-<li><a href="/Knowledge/Library/{$result.id}">{$result.title}</a>{if $result.onloan} <em>(on loan)</em>{/if} </li>
+<li><a href="{$baseurl}/Knowledge/Library/{$result.id}">{$result.title}</a>{if $result.onloan} <em>(on loan)</em>{/if} </li>
{/foreach}
</ul>
{/if}
{elseif $mode == 'tagdisplay'}
{foreach name=results from=$results item=result}
- <li><a href="/Knowledge/Library/{$result.id}">{$result.title}</a> </li>
+ <li><a href="{$baseurl}/Knowledge/Library/{$result.id}">{$result.title}</a> </li>
{/foreach}
{elseif $mode == 'bookerror'}
<p>The requested book does not exist</p>
{elseif $mode == 'tagerror'}
<p>The requested tag does not exist</p>
{/if}
-<p>Images provided by <a href="http://www.amazon.co.uk">Amazon</a></p>
+{if $librarian == true}
+<p><a href="{$baseurl}/Knowledge/Library/Admin">Library Admin</a></p>
+{/if}
+<p>Images and descriptions provided by <a href="http://www.amazon.co.uk">Amazon</a></p>
Modified: trunk/templates/login.tpl
===================================================================
--- trunk/templates/login.tpl 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/templates/login.tpl 2015-04-05 16:42:47 UTC (rev 657)
@@ -2,32 +2,27 @@
<form method="post" action="{$ssl_url|escape:'htmlall'}{getparams gets=$gets}">
<div>
{if $session->loggedin}
-Logged in as {$session->username}<br />
-<a href="{$smarty.const.SUCS_BASEURL}/Options">Membership Options</a><br />
-
-{if $session->email_forward}
-Mail forwarded to {$session->email_forward}<br />
-
-
-{* Don't bother alerting users to new mail at present; it's all broken because of noatime
+ Hello <a href="{$baseurl}/Community/Members/{$session->username}">{$session->username}</a>! You have
+ {if $session->email_forward}
+ mail forwarded to {$session->email_forward}<br />
+ {else}
+ {if $session->email==0}
+ no new email
+ {elseif $session->email==1}
+ <a href="https://sucs.org/webmail/">new email</a>
+ {/if}
+ <br />
+ Print balance: {$session->printbalance} | <a href="{$baseurl}/Options">Membership Options</a>
+ <br />
+ {/if}
+ <input type="submit" class="button" name="Logout" id="Logout" value="Logout" />
{else}
-{if $session->email=="0"}
-No email<br />
-{elseif $session->email=="1"}
-No new email<br />
-{elseif $session->email=="2"}
-<a href="https://sucs.org/webmail/">New email</a><br />
-{/if}
-*}
-
-{/if}
-
- <input type="submit" class="button" name="Logout" id="Logout" value="Logout" />
-{else}
- <label for="session_user">Username</label> <input type="text" class="text" name="session_user" id="session_user" /><br />
- <label for="session_pass">Password</label> <input type="password" class="text" name="session_pass" id="session_pass" /><br />
+ <input type="text" class="text" name="session_user" id="session_user" placeholder="Username" />
+ <input type="password" class="text" name="session_pass" id="session_pass" placeholder="Password" />
<input type="hidden" name="token" value="{$session->token}" />
<input type="submit" class="button" name="Login" id="Login" value="Login" />
+ <br>
+ <a href="{$baseurl}/join">No Account? Don't worry, sign up today!</a>
{/if}
</div>
</form>
Modified: trunk/templates/members.tpl
===================================================================
--- trunk/templates/members.tpl 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/templates/members.tpl 2015-04-05 16:42:47 UTC (rev 657)
@@ -8,41 +8,38 @@
{/foreach}
</ul>
{elseif count($results) == 1 }
+{assign var=member value=$results[0]}
<div class="box">
-<div class="boxhead"><h2>Membership Details for {$results[0].uid}</h2></div>
+<div class="boxhead"><h2>Membership Details for {$member.uid}</h2></div>
<div class="boxcontent">
-{if isset($results[0].picture) }
- <img class="emblem" src="{$smarty.const.SUCS_BASEURL}{$results[0].picture}" alt="Picture of {$results[0].uid}" />
+{if isset($member.picture) }
+ <img class="emblem" src="{$baseurl}{$member.picture}" alt="Picture of {$member.uid}" />
{/if}
<dl class="member">
<dt>Username</dt>
- <dd>{$results[0].uid|escape:'htmlall'}</dd>
+ <dd>{$member.uid|escape:'htmlall'}</dd>
<dt>Real Name</dt>
- <dd>{$results[0].cn|escape:'htmlall'}</dd>
+ <dd>{$member.cn|escape:'htmlall'}</dd>
<dt>Account Type</dt>
- <dd>{$results[0].acctype|escape:'htmlall'}</dd>
-{if $results[0].website }
+ <dd>{$member.acctype|escape:'htmlall'}</dd>
+{if $member.website }
<dt>Website</dt>
- <dd><a href="http://sucs.org/~{$results[0].uid|escape:'url'}/">http://sucs.org/~{$results[0].uid|escape:'url'}/</a></dd>
+ <dd><a href="http://sucs.org/~{$member.uid|escape:'url'}/">http://sucs.org/~{$member.uid|escape:'url'}/</a></dd>
{/if}
-{if isset($results[0].blog) }
- <dt>Blog</dt>
- <dd><a href="/Blogs/{$results[0].uid|escape:'url'}">{$results[0].blog}</a></dd>
-{/if}
-{if isset($results[0].project) }
+{if isset($member.project) }
<dt>Project</dt>
- <dd id="project"><pre style="clear: left;">{$results[0].project|escape:'htmlall'}</pre></dd>
+ <dd id="project">{$member.project|escape:'htmlall'}</dd>
{/if}
-{if isset($results[0].plan) }
+{if isset($member.plan) }
<dt>Plan</dt>
- <dd id="plan"><pre style="clear: left;">{$results[0].plan|escape:'htmlall'}</pre></dd>
+ <dd id="plan">{$member.plan|escape:'htmlall'}</dd>
{/if}
<dt>Banana Score</dt>
-{if $results[0].awards|@count >= 1}
- <dd>{bananaprint score=$results[0].bananascore}{$results[0].bananascore} banana{if $results[0].bananascore<>1}s{/if}</dd>
+{if $member.awardsbyyear|@count >= 1}
+ <dd>{bananaprint score=$member.bananascore}{$member.bananascore} banana{if $member.bananascore<>1}s{/if}</dd>
{else}
- <dd>{$results[0].uid} doesn't have any banana awards</dd>
+ <dd>{$member.uid} doesn't have any banana awards</dd>
{/if}
</dl>
@@ -51,29 +48,16 @@
</div>
<div class="hollowfoot"><div><div></div></div></div>
</div>
-{if $results[0].awards|@count >= 1}
+{if $member.awardsbyyear|@count >= 1}
<div class="box">
-<div class="boxhead"><h2>Banana Awards for {$results[0].uid}</h2></div>
+<div class="boxhead"><h2>Banana Awards for {$member.uid}</h2></div>
<div class="boxcontent">
<dl class="bananas">
- {foreach name=awards from=$results[0].awards key=key item=award}
- {if $acYear != $award.acYear}
- {assign var='acYear' value=$award.acYear}
- {if !$smarty.foreach.awards.first}</ul></dd>{/if}
- <dt>{$award.acYear}/{math equation="x + 1" x=$award.acYear}: <small>{$award.yearSum} banana{if $award.yearSum|abs != 1}s{/if}</small>
-</dt>
- <dd><ul class="bananas">
- {/if}
- <li class="{award_image_class number=$award.score}">
- <q>{$award.why}</q> <br/>
- <small>
- <strong>{if $award.score > 0}+{/if}{$award.score}</strong> awarded by {$award.who} on {$award.whn|date_format:"%d %b %Y"}
- </small>
-
- </li>
- {if $smarty.foreach.awards.last}</ul>{/if}
+ {foreach name=awardsbyyear from=$member.awardsbyyear key=yearname item=year}
+ <dt>{$yearname}/{math equation="x + 1" x=$yearname}: <small>{$year.sum} banana{if $year.sum|abs != 1}s{/if}</small></dt>
+ <dd>{include file='banana-awardlist.tpl' awards=$year.awards singlemember=true}</dd>
{/foreach}
- </dd></dl>
+ </dl>
</div>
<div class="hollowfoot"><div><div></div></div></div>
</div>
@@ -86,21 +70,9 @@
</div>
{/if}
{else}
-<p> Please Search for a member in the sidebar.</p>
+<p> Please search for a member in the sidebar.</p>
<h3>Recent Awards</h3>
-<table>
-{foreach name=recent from=$stats.recent key=key item=award}
- <tr>
- {if $award.real == TRUE}
- <td><a href="/Community/Members/{$award.username}">{$award.username}</a></td>
- {else}
- <td><a href="/Community/Bananas/{$award.username}">{$award.username}</a></td>
- {/if}
- <td>{bananaprint score=$award.score}</td>
- <td><q>{$award.why}</q><br /><small>Awarded by {$award.who} on {$award.whn|date_format:"%d %b %Y"}</small></td>
- </tr>
-{/foreach}
-</table>
+{include file='banana-awardlist.tpl' awards=$stats.recent}
{/if}
{else}
<p>Please log in to view full member details.</p>
Copied: trunk/templates/membershiprenew-options.tpl (from rev 656, branches/sucs-site/templates/membershiprenew-options.tpl)
===================================================================
--- trunk/templates/membershiprenew-options.tpl (rev 0)
+++ trunk/templates/membershiprenew-options.tpl 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,18 @@
+{if $staff == TRUE}
+ <div class="cbb">
+ <h3>Settings</h3>
+ <form method="get" action="{$baseurl}{$path}">
+ <h4>Sort</h4>
+ <p>Select a sort column from the list:</p>
+ <select name="sort">
+ <option value="username"{if $optionsort == "username"} selected="selected"{/if}>Username</option>
+ <option value="sid"{if $optionsort == "sid"} selected="selected"{/if}>Student Number</option>
+ <option value="realname"{if $optionsort == "realname"} selected="selected"{/if}>Real Name</option>
+ </select>
+ <h4>Auto Refresh</h4>
+ <p>Enter a value in seconds or n to disable:</p>
+ <input class="text" type="text" name="autorefresh" value="{$optionrefresh}" size="5" /><br />
+ <input class="submit" type="submit" value="Update" />
+ </form>
+ </div>
+{/if}
Copied: trunk/templates/membershiprenew.tpl (from rev 656, branches/sucs-site/templates/membershiprenew.tpl)
===================================================================
--- trunk/templates/membershiprenew.tpl (rev 0)
+++ trunk/templates/membershiprenew.tpl 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,29 @@
+{if $staff == TRUE}
+<h2>DO NOT RENEW MEMBERSHIP UNLESS THE MONEY IS ACTUALLY IN THE POT!</h2>
+<p>Pay until: {$paydate}</p>
+<table border='1'>
+<tr><th>Type</th><th>Username</th><th>Student Number</th><th>Real Name</th><th>Paid</th><th>Renew</th></tr>
+{foreach name=members from=$members item=member}
+<tr>
+ <td>{$member.typename|escape}</td>
+ <td>{$member.username|escape}</td>
+ <td>{$member.sid|escape}</td>
+ <td>{$member.realname|escape}</td>
+ <td>{$member.paid|escape}</td>
+ <td>
+ <form action='{$self}' method='POST' style="margin-bottom: 0px;">
+ <input type='hidden' name='uid' value='{$member.uid|escape}' />
+ <input type='hidden' name='lastupdate' value='{$member.lastupdate|escape}' />
+ <input type='submit' value='Renew'/>
+ </form>
+ </td>
+ </tr>
+{/foreach}
+</table>
+{else}
+ <div class="errorbar">
+ <div><div><div>
+ You must be logged in and be a staff member to renew memberships.
+ </div></div></div>
+ </div>
+{/if}
Modified: trunk/templates/menu.tpl
===================================================================
--- trunk/templates/menu.tpl 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/templates/menu.tpl 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,13 +1,13 @@
<div id="navigationC">
<ul>
{foreach name=menu from=$menu key=name item=target}
- <li>{if is_array($target)}<a href="{$smarty.const.SUCS_BASEURL}/{$name}"{if $select==$name} class="select"{/if}>{$name}</a>
+ {if is_array($target)}<li><a href="{$baseurl}/{$name}"{if $select==$name} class="select"{/if}>{$name}</a>
<ul>
{foreach name=submenu from=$target key=subitem item=subname}
- <li><a href="{$smarty.const.SUCS_BASEURL}{$subname}"{if $subselect==$subitem} class="select"{/if}>{if $smarty.foreach.submenu.last}<span>{/if}{$subitem}{if $smarty.foreach.submenu.last}</span>{/if}</a></li>
+ <li{if $smarty.foreach.submenu.last} class="lastsub"{/if}><a href="{$baseurl}{$subname}"{if $subselect==$subitem} class="select"{/if}>{if $smarty.foreach.submenu.last}<span>{/if}{$subitem}{if $smarty.foreach.submenu.last}</span>{/if}</a></li>
{/foreach}
</ul>
- {else}<a href="{$smarty.const.SUCS_BASEURL}{$target}"{if $select==$name} class="select"{/if}><span>{$name}</span></a>{/if}</li>
+ {else}<li class="lastsub"><a href="{$baseurl}{$target}"{if $select==$name} class="select"{/if}><span>{$name}</span></a>{/if}</li>
{/foreach}
</ul>
</div>
Modified: trunk/templates/milliways.tpl
===================================================================
--- trunk/templates/milliways.tpl 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/templates/milliways.tpl 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,24 +1,30 @@
-{include file="../static/fragments/Milliways.txt"}
-
-<h2>Current Milliways Users</h2>
+<div class="cbb">
+<h3>Current Milliways Users</h3>
{if $people|@count < 1}
-<p>No-one logged on to Milliways</p>
+<p>No-one active on Milliways</p>
{else}
-<table class="border">
- <tr>
- <th>Username</th>
- <th>Idle time</th>
- <th>What</th>
- </tr>
+<ul>
{foreach name=people from=$people key=personnum item=person}
- <tr>
- <td>{$person.username}</td>
- <td>{$person.idle}</td>
- <td>{$person.what}</td>
- </tr>
+ <li>{$person.username} <small>({$person.idle} idle)</small></li>
{/foreach}
-</table>
+</ul>
{/if}
+</div>
-<a href="#" onclick="window.open('/mw/','Milliways','height=380,width=610,menubar=no,resizable=no,location=no,directories=no,scr
-ollbars=no,status=no,toolbar=no')">Use Milliways now</a>
\ No newline at end of file
+<div class="cbb">
+<h3><a href="{$mwpath}/URI">Recent URIs</a></h3>
+<ul>
+ {foreach name=list from=$urilist item=uri}
+ <li style="white-space: nowrap">{$uri.user} <small><a href="{$uri.url|escape:'html'}" title="{$uri.title|escape:'htmlall'}">{$uri.title|truncate:18:"..":true:false|escape:'htmlall'}</a></small></li>
+ {/foreach}
+</ul>
+</div>
+
+<div class="cbb">
+<h3><a href="{$mwpath}/tag">Recent TAGs</a></h3>
+<ul>
+ {foreach name=taglist from=$taglist item=tag}
+ <li>{$tag.user} <a href="{$mwpath}/tag/{$tag.name|escape:'url'}">{$tag.tag}</a></li>
+ {/foreach}
+</ul>
+</div>
Copied: trunk/templates/milliways_status.tpl (from rev 656, branches/sucs-site/templates/milliways_status.tpl)
===================================================================
--- trunk/templates/milliways_status.tpl (rev 0)
+++ trunk/templates/milliways_status.tpl 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,35 @@
+<table>
+<tr>
+ <td nowrap="nowrap" class="date" colspan="3">
+Year: {foreach from=$yearlist item=year}{if $year != $thisyear}<a href="{$mwpath}/Status/{$year}-01-01">{$year}</a> {else}{$year} {/if}{/foreach}
+ </td>
+</tr>
+<tr>
+ <td nowrap="nowrap" class="date" colspan="3">
+Month: {foreach from=$monthlist key=num item=month}{if $num != $thismonth}<a href="{$mwpath}/Status/{$thisyear}-{$num}-01">{$month}</a> {else}{$month} {/if}{/foreach}
+ </td>
+</tr>
+{* do whole months for now
+<tr>
+ <td nowrap="nowrap" class="date" colspan="3">
+Day: {foreach from=$daylist item=day}{if $day != $thisday}<a href="{$mwpath}/Status/{$thisyear}-{$thismonth}-{$day}">{$day}</a> {else}{$day} {/if}{/foreach}
+ </td>
+</tr>
+*}
+{assign var=lastday value=''}
+{foreach from=$statuslist item=row name=list}
+{if $row.day != $lastday}
+{assign var=lastday value=$row.day}
+<tr>
+ <td nowrap="nowrap" class="date" colspan="3">{$row.added|date_format:'%d %b %Y'}</td>
+</tr>
+{/if}
+{assign var=rows value=1}
+{if $row.title}{assign var=rows value=$rows+1}{/if}
+{if count($row.taglist)}{assign var=rows value=$rows+1}{/if}
+<tr>
+ <td nowrap="nowrap" class="time" rowspan="{$rows}">{$row.hour}</td>
+ <td ><a href="{$mwpath}/Status/user/{$row.user|escape:'url'}">{$row.user|escape:'htmlall'}</a> {$row.doing|escape:'htmlall'}</td>
+</tr>
+{/foreach}
+</table>
Copied: trunk/templates/milliways_tag.tpl (from rev 656, branches/sucs-site/templates/milliways_tag.tpl)
===================================================================
--- trunk/templates/milliways_tag.tpl (rev 0)
+++ trunk/templates/milliways_tag.tpl 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,16 @@
+<table>
+{assign var=lastday value=''}
+{foreach from=$taglist item=row name=list}
+{if $row.day != $lastday}
+{assign var=lastday value=$row.day}
+<tr>
+ <td nowrap="nowrap" class="date" colspan="3">{$row.added|date_format:'%d %b %Y'}</td>
+</tr>
+{/if}
+<tr>
+ <td nowrap="nowrap" class="time">{$row.added|date_format:'%H:%M:%S'}</td>
+ <td nowrap="nowrap" class="user">{$row.user}</td>
+ <td>{$row.line|escape:'htmlall'}</td>
+</tr>
+{/foreach}
+</table>
Copied: trunk/templates/milliways_taglist.tpl (from rev 656, branches/sucs-site/templates/milliways_taglist.tpl)
===================================================================
--- trunk/templates/milliways_taglist.tpl (rev 0)
+++ trunk/templates/milliways_taglist.tpl 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,34 @@
+<table cellspacing="20">
+<tr><td valign="top">
+<table>
+<tr><th colspan="2">Most Popular</th></tr>
+{foreach from=$toplist item=row name=toplist}
+<tr>
+ <td nowrap="nowrap" class="user">
+<a href="{$mwpath}/tag/{$row.name|escape:'url'}">{$row.tag}</a>
+</td>
+ <td class="time">{$row.count}</td>
+</tr>
+{/foreach}
+</table>
+
+</td><td valign="top">
+<table>
+<tr><th colspan="2">Latest</th></tr>
+{assign var=lastday value=''}
+{foreach from=$latestlist item=row name=list}
+{if $row.day != $lastday}
+{assign var=lastday value=$row.day}
+<tr>
+ <td nowrap="nowrap" class="date" colspan="3">{$row.dated|date_format:'%d %b %Y'}</td>
+</tr>
+{/if}
+<tr>
+ <td nowrap="nowrap" class="user">
+<a href="{$mwpath}/tag/{$row.name|escape:'url'}">{$row.tag}</a>
+ </td>
+ <td nowrap="nowrap" class="time">{$row.dated|date_format:'%H:%M:%S'}</td>
+</tr>
+{/foreach}
+</table>
+</td></tr></table>
Copied: trunk/templates/milliways_uri.tpl (from rev 656, branches/sucs-site/templates/milliways_uri.tpl)
===================================================================
--- trunk/templates/milliways_uri.tpl (rev 0)
+++ trunk/templates/milliways_uri.tpl 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,47 @@
+<table>
+<tr>
+ <td nowrap="nowrap" class="date" colspan="3">
+Year: {foreach from=$yearlist item=year}{if $year != $thisyear}<a href="{$mwpath}/uri/{$year}-01-01">{$year}</a> {else}{$year} {/if}{/foreach}
+ </td>
+</tr>
+<tr>
+ <td nowrap="nowrap" class="date" colspan="3">
+Month: {foreach from=$monthlist key=num item=month}{if $num != $thismonth}<a href="{$mwpath}/uri/{$thisyear}-{$num}-01">{$month}</a> {else}{$month} {/if}{/foreach}
+ </td>
+</tr>
+<tr>
+ <td nowrap="nowrap" class="date" colspan="3">
+Day: {foreach from=$daylist item=day}{if $day != $thisday}<a href="{$mwpath}/uri/{$thisyear}-{$thismonth}-{$day}">{$day}</a> {else}{$day} {/if}{/foreach}
+ </td>
+</tr>
+{assign var=lastday value=''}
+{foreach from=$urilist item=row name=list}
+{if stristr($row.flags,"sucs")===FALSE || $session->loggedin}
+{if $row.day != $lastday}
+{assign var=lastday value=$row.day}
+<tr>
+ <td nowrap="nowrap" class="date" colspan="3">{$row.added|date_format:'%d %b %Y'}</td>
+</tr>
+{/if}
+{assign var=rows value=1}
+{if $row.title}{assign var=rows value=$rows+1}{/if}
+{if count($row.taglist)}{assign var=rows value=$rows+1}{/if}
+<tr>
+ <td nowrap="nowrap" class="time" rowspan="{$rows}">{$row.hour}</td>
+ <td nowrap="nowrap" class="user" rowspan="{$rows}">{if stristr($row.flags,"anon")===FALSE}{$row.user}{else}<i>Anonymous</i>{/if}</td>
+ <td ><a href="{$row.url|escape:"hexentity"}">{$row.url|truncate:80:" ... ":true:true|escape:"html"}</a>{if stristr($row.flags,"nsfw")!==FALSE} (NSFW){/if}</td>
+</tr>
+{if $row.title}
+<tr><td>{$row.title|escape:"hexentity"}</td></tr>
+{/if}
+{if count($row.taglist)}
+<tr>
+ <td class="taglist">
+ Tags:
+{foreach from=$row.taglist item=tcount key=tname name=tags}{$tname}{if !$smarty.foreach.tags.last}, {/if}{/foreach}
+ </td>
+</tr>
+{/if}
+{/if}
+{/foreach}
+</table>
Modified: trunk/templates/news.tpl
===================================================================
--- trunk/templates/news.tpl 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/templates/news.tpl 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,3 +1,12 @@
+{if $editable}
+<div class="edit">
+<ul>
+<li><a href="?action=create">Create</a></li>
+</ul>
+<div class="clear"></div>
+</div>
+{/if}
+
<div id="news">
{foreach name=news from=$news key=itemnum item=item}
<div class="box">
@@ -8,10 +17,10 @@
{if $editable}
<div class="edit">
<ul>
-<li><a href="{$item.title|encodestring}?action=delete-query">Delete</a></li>
-<li><a href="{$item.title|encodestring}?action=edit">Edit</a></li>
+<li><a href="{$item.title|escape:'url'}?action=delete-query">Delete</a></li>
+<li><a href="{$item.title|escape:'url'}?action=edit">Edit</a></li>
{if $item.expirytime > $smarty.now}
-<li><a href="{$item.title|encodestring}?action=expire-query">Expire</a></li>
+<li><a href="{$item.title|escape:'url'}?action=expire-query">Expire</a></li>
{/if}
</ul>
<div class="clear"></div>
Modified: trunk/templates/news_delete.tpl
===================================================================
--- trunk/templates/news_delete.tpl 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/templates/news_delete.tpl 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,4 +1,4 @@
-<form class="dialog" action="{$path}" method="post">
+<form class="dialog" action="{$baseurl}{$path}" method="post">
<div class="box">
<div class="boxhead"><h2>Warning</h2></div>
<div class="boxcontent">
Modified: trunk/templates/news_edit.tpl
===================================================================
--- trunk/templates/news_edit.tpl 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/templates/news_edit.tpl 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,7 +1,7 @@
<h2>{if $action == 'edit'}Edit{else}Post{/if} a news item</h2>
-<form class="admin" action="{$path}" method="POST">
+<form class="admin" action="{$baseurl}{$path}" method="POST">
<div class="row">
<label for="edittitle">Title</label>
<span class="textinput"><input type="text" name="edittitle" id="edittitle" value="{$news[0].title}" style="width: 100%;" /></span>
Modified: trunk/templates/news_expire.tpl
===================================================================
--- trunk/templates/news_expire.tpl 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/templates/news_expire.tpl 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,4 +1,4 @@
-<form class="dialog" action="{$path}" method="post">
+<form class="dialog" action="{$baseurl}{$path}" method="post">
<div class="box">
<div class="boxhead"><h2>Warning</h2></div>
<div class="boxcontent">
Modified: trunk/templates/options.tpl
===================================================================
--- trunk/templates/options.tpl 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/templates/options.tpl 2015-04-05 16:42:47 UTC (rev 657)
@@ -3,8 +3,6 @@
<div class="box" >
<div class="boxhead"><h2>User Settings</h2></div>
<div class="boxcontent">
-<form class="admin" action="{$baseurl}{$path}" method="POST">
-
<fieldset>
<legend> System Details </legend>
<div class="row">
@@ -191,7 +189,6 @@
{/if}
<div class="clear"></div>
-</form>
</div>
<div class="hollowfoot"><div><div></div></div></div>
</div>
Modified: trunk/templates/pagemap.tpl
===================================================================
--- trunk/templates/pagemap.tpl 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/templates/pagemap.tpl 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,3 +1,4 @@
+{if $html == TRUE}
The Pagemap<br/>
<table style="border:1px">
<tr>
@@ -20,3 +21,10 @@
</tr>
{/foreach}
</table>
+{else}
+ <div class="errorbar">
+ <div><div><div>
+ You do not have access to this component.
+ </div></div></div>
+ </div>
+{/if}
\ No newline at end of file
Modified: trunk/templates/pastebin-sidebar.tpl
===================================================================
--- trunk/templates/pastebin-sidebar.tpl 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/templates/pastebin-sidebar.tpl 2015-04-05 16:42:47 UTC (rev 657)
@@ -2,7 +2,7 @@
{if count($pasteList) > 0 }
<ul id="lstSidebar">
{foreach name=pasteList from=$pasteList item=pasteItem}
- <li><a href="{$urifragment}{$pasteItem.id}"> {$pasteItem.name} - {$pasteItem.time_diff} ago </a></li>
+ <li><a href="{$baseurl}{$urifragment}{$pasteItem.id}"> {$pasteItem.name} - {$pasteItem.time_diff} ago </a></li>
{/foreach}
</ul>
{else}
Modified: trunk/templates/pastebin.tpl
===================================================================
--- trunk/templates/pastebin.tpl 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/templates/pastebin.tpl 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,8 +1,4 @@
-{if !empty($error) }
-{foreach name=error from=$error item=errorMessage}
- <p>{$errorMessage}</p>
-{/foreach}
-{elseif isset($userInfo)}
+{if isset($userInfo)}
<div id="userInfo">
<h3> {$userInfo}</h3>
<a href="{$uri}{$id}">{$uri}{$id}</a>
Deleted: trunk/templates/planetposts.tpl
===================================================================
--- trunk/templates/planetposts.tpl 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/templates/planetposts.tpl 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,19 +0,0 @@
-{if count($planetposts) > 0 }
-<div class="cbb">
-
-<h3><a href="/planet/">Recent Blog entries</a></h3>
-
-<table width="100%" class="border">
-<tr>
-<th>Subject</th>
-<th>by</th>
-</tr>
-{foreach name=planetposts from=$planetposts item=post}
-<tr>
- <td><a href="{$post.post_uri}">{$post.post}</a></td>
- <td><a href="{$post.user_uri}">{$post.user}</a></td>
-</tr>
-{/foreach}
-</table>
-</div>
-{/if}
Modified: trunk/templates/search.cy.tpl
===================================================================
--- trunk/templates/search.cy.tpl 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/templates/search.cy.tpl 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,6 +1,6 @@
- <div class="cbb">
+ <div id="searchbox" class="cbb">
<h3>Chwiliwch CGPA</h3>
- <form method="get" action="http://www.google.co.uk/custom">
+ <form method="get" action="http://www.google.co.uk/cse">
<div id="search">
<input type="text" class="text" name="q" maxlength="255" value="" /><br />
@@ -9,9 +9,9 @@
<input class="submit" type="submit" name="sa" value="Chwilio" />
</div>
- <input type="hidden" name="cof" value="S:http://{$smarty.const.SUCS_BASEURL};AH:left;LH:76;L:http://{$smarty.const.SUCS_PREFERRED_HOSTNAME}{$smarty.const.SUCS_BASEURL}/images/sucslogo-halo.png;LW:170;AWFID:624aceb6f2753532;" />
- <input type="hidden" name="domains" value="{$smarty.const.SUCS_BASEURL}" />
- <input type="hidden" name="sitesearch" value="{$smarty.const.SUCS_BASEURL}" />
+ <input type="hidden" name="cof" value="S:http://sucs.org;AH:left;LH:76;L:http://sucs.org/images/sucslogo-halo.png;LW:170;AWFID:624aceb6f2753532;" />
+ <input type="hidden" name="domains" value="sucs.org" />
+ <input type="hidden" name="sitesearch" value="sucs.org" />
</div>
</form>
<div class="clear"> </div>
Modified: trunk/templates/search.tpl
===================================================================
--- trunk/templates/search.tpl 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/templates/search.tpl 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,6 +1,6 @@
- <div class="cbb">
- <h3>Search {$smarty.const.SUCS_SITENAME}</h3>
- <form method="get" action="http://www.google.co.uk/custom">
+ <div id="searchbox" class="cbb">
+ <h3>Search SUCS</h3>
+ <form method="get" action="http://www.google.co.uk/cse">
<div id="search">
<input type="text" class="text" name="q" maxlength="255" value="" /><br />
@@ -9,9 +9,9 @@
<input class="submit" type="submit" name="sa" value="Search" />
</div>
- <input type="hidden" name="cof" value="S:http://{$smarty.const.SUCS_PREFERRED_HOSTNAME};AH:left;LH:76;L:http://{$smarty.const.SUCS_PREFERRED_HOSTNAME}{$smarty.const.SUCS_BASEURL}/images/sucslogo-halo.png;LW:170;AWFID:624aceb6f2753532;" />
- <input type="hidden" name="domains" value="{$smarty.const.SUCS_PREFERRED_HOSTNAME}" />
- <input type="hidden" name="sitesearch" value="{$smarty.const.SUCS_PREFERRED_HOSTNAME}" />
+ <input type="hidden" name="cof" value="S:http://sucs.org;AH:left;LH:76;L:http://sucs.org/images/sucslogo-halo.png;LW:170;AWFID:624aceb6f2753532;" />
+ <input type="hidden" name="domains" value="sucs.org" />
+ <input type="hidden" name="sitesearch" value="sucs.org" />
</div>
</form>
Modified: trunk/templates/shop.tpl
===================================================================
--- trunk/templates/shop.tpl 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/templates/shop.tpl 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,5 +1,5 @@
{* Terribly crude i know, but include the spreadshirt sucs shop *}
-<iframe src="http://www.spreadshirt.net/shop.php?sid=170367" frameborder="0" style="width: 100%; height: 1240px;">
+<iframe src="https://sucs.spreadshirt.co.uk/" frameborder="0" style="width: 100%; height: 1240px;">
</iframe>
<!-- <object data="/~dez/shop.php" width="100%" height="1240" type="text/html"></object> -->
Copied: trunk/templates/signup-admin.tpl (from rev 656, branches/sucs-site/templates/signup-admin.tpl)
===================================================================
--- trunk/templates/signup-admin.tpl (rev 0)
+++ trunk/templates/signup-admin.tpl 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,26 @@
+{if $staff == TRUE}
+<form action="" method="post">
+<table border='1'>
+<tr><th>ID</th><th>SID</th><th>Type</th><th>Issued By</th><th>Card Number</th></tr>
+{foreach name=signups from=$signups item=signup}
+<tr>
+ <td>{$signup.id|escape}</td>
+ <td><input type="text" size="10" name="sid:{$signup.id|escape}" value="{$signup.sid|escape}" /></td>
+ <td>{$signup.typename|escape}</td>
+ <td>{$signup.username|escape}</td>
+ <td>{$signup.card|escape}</td>
+</tr>
+{/foreach}
+</table>
+<input type='hidden' name='command' value='update' />
+<input type='submit' value='Update Records'/>
+<input type='reset' value='Reset'/>
+</form>
+{else}
+ <div class="errorbar">
+ <div><div><div>
+ You must be logged in and be a staff member to modify signup details;
+ </div></div></div>
+ </div>
+{/if}
+
Copied: trunk/templates/signup.tpl (from rev 656, branches/sucs-site/templates/signup.tpl)
===================================================================
--- trunk/templates/signup.tpl (rev 0)
+++ trunk/templates/signup.tpl 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,106 @@
+{if $mode=='login'}
+<form action="{$componentpath}" method="post">
+ <div class="box" style="width: 70%; margin: auto;">
+ <div class="boxhead"><h2>Membership Signup</h2></div>
+ <div class="boxcontent">
+
+ <p>Please enter the details from your signup receipt</p>
+
+ <div class="row">
+ <label for="signupid">Signup ID:</label>
+ <span class="textinput"><input type="text" size="20" name="signupid" id="signupid" /></span>
+ </div>
+ <div class="row">
+ <label for="signuppw">Password:</label>
+ <span class="textinput"><input type="text" size="20" name="signuppw" id="signuppw" /></span>
+ </div>
+ <div class="row"><span class="textinput">
+ <input type="submit" name="submit" value="Sign Up" /></span>
+ </div>
+ <div class="clear"></div>
+ <div class="note">If you wish to renew an existing account instead, please login to <a href="https://sucs.org/Options">Membership Options</a> using your existing account details.</div>
+ </div>
+ <div class="hollowfoot"><div><div></div></div></div>
+ </div>
+</form>
+{elseif $mode=='form' || $mode=="re-form"}
+ <h1>Signup</h1>
+ <form id = "mainform" action="{$componentpath}" method="post">
+ {if $usertype==1}
+ <div class="row" id="studentiddiv">
+ <label for="studentid">Student Number</label>
+ <span class="textinput"><input type="text" id="studentid" name="studentid" size="30" {if $mode=='re-form'}value='{$fields.studentid}'{/if} /></span>
+ <div id="studentidmessage"{if $mode=='re-form'}{if isset($errors.studentid)} style="color:red; float:right; clear:right;">{$errors.studentid}{else} style="color:green; float:right; clear:right;">OK{/if}{else}>{/if}</div>
+ </div>
+ {/if}
+ <div class="row" id="usernamediv">
+ <label for="username">Username</label>
+ <span class="textinput"><input type="text" id="username" name="username" size="30" {if $mode=='re-form'}value='{$fields.username}'{/if}/></span>
+ <div id="usernamemessage"{if $mode=='re-form'}{if isset($errors.username)} style="color:red; float:right; clear:right;">{$errors.username}{else} style="color:green; float:right; clear:right;">OK{/if}{else}>{/if}</div>
+ </div>
+ <div class="row" id="realnamediv">
+ <label for="realname">{if $usertype!=2}Real Name{else}Society Name{/if}</label>
+ <span class="textinput"><input type="text" id="realname" name="realname" size="30" {if $mode=='re-form'}value='{$fields.realname}'{/if}/></span>
+ <div id="realnamemessage"{if $mode=='re-form'}{if isset($errors.realname)} style="color:red; float:right; clear:right;">{$errors.realname}{else} style="color:green; float:right; clear:right;">OK{/if}{else}>{/if}</div>
+ </div>
+ {if $usertype!=2}
+ <div class="row" id="postcodediv" style="display:none">
+ <label for="postcode">Post Code</label>
+ <span class="textinput"><input type="text" id="postcode" size="10" value=""/></span>
+ <div id="postcodemessage"></div>
+ </div>
+ <div class="row" id="addseldiv" style="display:none">
+ <label for="addsel">Address Selector</label>
+ <span class="textinput"><select id="addsel" value=""></select></span>
+ </div>
+ <div class="row" id="addressdiv">
+ <label for="address">{if $usertype==1}Term Time {/if}Address</label>
+ <span class="textinput"><textarea id="address" name="address" cols="35" rows="4">{if $mode=='re-form'}{$fields.address}{/if}</textarea></span>
+ <div id="addressmessage"{if $mode=='re-form'}{if isset($errors.address)} style="color:red; float:right; clear:right;">{$errors.address}{else} style="color:green; float:right; clear:right;">OK{/if}{else}>{/if}</div>
+ </div>
+ {else}
+ <div class="row" id="contactdiv">
+ <label for="contact">Contact Name</label>
+ <span class="textinput"><input type="text" id="contact" name="contact" size="30" {if $mode=='re-form'}value='{$fields.contact}'{/if}/></span>
+ <div id="contactmessage"{if $mode=='re-form'}{if isset($errors.contact)} style="color:red; float:right; clear:right;">{$errors.contact}{else} style="color:green; float:right; clear:right;">OK{/if}{else}>{/if}</div>
+ </div>
+ {/if}
+ <div class="row" id="emaildiv">
+ <label for="email">Email Address</label>
+ <span class="textinput"><input type="text" id="email" name="email" size="30" {if $mode=='re-form'}value='{$fields.email}'{/if}/></span>
+ <div id="emailmessage"{if $mode=='re-form'}{if isset($errors.email)} style="color:red; float:right; clear:right;">{$errors.email}{else} style="color:green; float:right; clear:right;">OK{/if}{else}>{/if}</div>
+ </div>
+ <div class="row" id="phonediv">
+ <label for="phone">Phone Number</label>
+ <span class="textinput"><input type="text" id="phone" name="phone" size="30" {if $mode=='re-form'}value='{$fields.phone}'{/if}/></span>
+ <div id="phonemessage"{if $mode=='re-form'}{if isset($errors.phone)} style="color:red; float:right; clear:right;">{$errors.phone}{else} style="color:green; float:right; clear:right;">OK{/if}{else}>{/if}</div>
+ </div>
+ <div class="row" id="tncdiv">
+ <span class="textinput"><input type="checkbox" id="tnc" name="tnc" size="30" {if $mode=='re-form'}value='{$fields.tnc}'{/if}/>I have read and understood, and agree to be bound by the <a href="/About/Conditions">Terms and Conditions</a>.</span>
+ <div id="tncmessage"{if $mode=='re-form'}{if isset($errors.tnc)} style="color:red; float:right; clear:right;">{$errors.tnc}{else} style="color:green; float:right; clear:right;">OK{/if}{else}>{/if}</div>
+ </div>
+ {if $overridable}
+ <div class="row" id="overridediv">
+ <label for="overridable">Override Validation</label>
+ <span class="textinput"><input type="checkbox" id="override" name="override" /></span>
+ </div>
+ {/if}
+ <input type="hidden" id="signupid" name="signupid" value="{$signupid}" />
+ <input type="hidden" id="signuppw" name="signuppw" value="{$signuppw}" />
+ <div class="row" id="submitdiv">
+ <input type="submit" id="submit" value="Submit" />
+ </div>
+ </form>
+{elseif $mode=='result'}
+{if !$failed}
+<h1>Welcome to SUCS</h1>
+<p>Signup is complete, please see below for your password, a copy has also been send to {$email}, we request you change this immediatley. See our <a href="/Getting%20Started">Getting Started</a> page for some ways you can start using your new SUCS account!</p>
+<p>
+Username: <strong>{$username}</strong><br />
+Password: <strong>{$password}</strong><br />
+</p>
+{else}
+<h1>Error</h1>
+An error occured during signup, please email <a href='mailto:admin at sucs.org'>admin at sucs.org</a> for assistance.
+{/if}
+{/if}
Modified: trunk/templates/societies.tpl
===================================================================
--- trunk/templates/societies.tpl 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/templates/societies.tpl 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,9 +1,9 @@
-<p>The Student Union's societies website can be found at <a href="http://www.societies.swansea-union.co.uk/">http://www.societies.swansea-union.co.uk/</a>.</p>
+<p>The Student Union's societies website can be found at <a href="http://swansea-union.co.uk/societies">http://swansea-union.co.uk/societies</a>.</p>
<p>The following societies' websites are hosted by SUCS:</p>
<ul>
{foreach name=societies from=$societies item=society}
-<li><a href="http://society.swan.ac.uk/~{$society.username|escape:'url'}">{$society.fullname|escape:'htmlall'}</a>{if $society.descr} - {$society.descr}{/if}</li>
+<li><a href="https://sucs.org/~{$society.username|escape:'url'}">{$society.fullname|escape:'htmlall'}</a>{if $society.descr} - {$society.descr}{/if}</li>
{/foreach}
</ul>
Copied: trunk/templates/susignup-admin.tpl (from rev 656, branches/sucs-site/templates/susignup-admin.tpl)
===================================================================
--- trunk/templates/susignup-admin.tpl (rev 0)
+++ trunk/templates/susignup-admin.tpl 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,130 @@
+{if $staff == TRUE}
+ {if $mode == 'error'}
+ <div class='errorbar'>
+ <strong>Error: </strong> {$error_text}
+ </div>
+ {/if}
+ {if $mode == 'renewals'}
+<form action='{$componentpath}' method='post'>
+ <table id='susignup-renewals'>
+ <thead>
+ <tr><th>Renew Now?</th><th>Name (SU)</th><th>Name (SUCS)</th><th>Student ID</th><th>SUCS Username</th><th>Paid Until</th></tr>
+ </thead>
+ <tbody>
+{foreach from=$matches item=match}
+ <tr><td class='centre'><input name='renew[]' id='renew' value='{$match[3]}' type='checkbox' checked='checked'/></td><td>{$match[0]}</td><td>{$match[1]}</td><td class='centre'>{$match[2]}</td><td>{$match[3]}</td><td class='centre'>{$match[4]}</td></tr>
+{foreachelse}
+ <tr><td colspan='6'><em>No matches found</em></td></tr>
+{/foreach}
+ </tbody>
+ <tfoot>
+ <tr><td colspan='5'><strong>For large numbers of renewals, this can take a while!</strong></td><td class='centre'><input type='submit' name='rwsubmit' id='rwsubmit' value='Go!' /></td></tr>
+ </tfoot>
+</table>
+<input type='hidden' name='mode' id='mode' value='renewals2' />
+</form>
+{if $others > 0}
+<p>There were also <strong>{$others}</strong> other records found.<br />
+Of these, {$paidup} are current members and {$pending} are pending signups.</p>
+{/if}
+ {elseif $mode == 'renewals2'}
+<div class='centre'>
+<div class='cbb' style='text-align: left'>
+<h3> Mass renewal results </h3>
+<strong>{$attempt}</strong> accounts marked for renewal<br />
+<hr />
+{if $successes == $attempt}
+<strong>All</strong> of these requests were successful.<br />
+{else}
+<strong>{$successes}</strong> requests were successful, and <span style='color: red'><strong>{$failures}</strong></span> requests failed.<br />
+The following accounts failed to renew:
+<ul>
+{foreach from=$failusers item=f}
+<li>{$f}</li>
+{/foreach}
+</ul>
+{/if}
+</div>
+</div>
+ {elseif $mode == 'list'}
+
+ <table id='susignup-renewals'>
+ <thead>
+ <tr><th>Name (SU)</th><th>Name (SUCS)</th><th>Student ID</th><th>SUCS Username</th><th>Paid Until</th></tr>
+ </thead>
+ <tbody>
+{foreach from=$matches item=match}
+ <tr><td>{$match[0]}</td><td>{$match[1]}</td><td class='centre'>{$match[2]}</td><td>{$match[3]}</td><td class='centre'>{$match[4]}</td></tr>
+{foreachelse}
+ <tr><td colspan='6'><em>Oh Noes! No members found in the SU database</em></td></tr>
+{/foreach}
+ </tbody>
+</table>
+ {elseif $mode == 'search'}
+<div style='text-align: center'>
+ <div class='cbb' style='text-align: left'>
+ Student {$sid} appears to have paid, and a signup slip has been generated.<br />
+ The details are:<br />
+ <strong>Slip ID: </strong> {$slipid}<br />
+ <strong>Slip Password: </strong> {$slippass} <br />
+ <form action="https://sucs.org/signup/" method="post">
+ <input type=hidden name="signupid" id="id" value="{$slipid}" />
+ <input type=hidden name="signuppw" id="pass" value="{$slippass}" />
+ <input type=submit name="submit" value="Proceed" />
+ </form>
+ </div>
+</div>
+ {elseif $mode == 'menu' || $mode == 'error' || $mode == 'renew'}
+ <p>
+This component allows staff members to sort out memberships and renewals that have been paid for via the SU payments system. </p>
+<p>Renew an individual member, generate a list of members that look like they've paid via the SU system or begin the signup process for a newbie who doesn't have their transaction ID by selecting the appropriate option below.
+ </p>
+<div style='text-align: center'>
+<div class='susignup-admin-menu cbb'>
+<h3>Signup a newbie</h3>
+<form action='{$componentpath}' method='post'>
+ <label for='sid'>Student Number:</label>
+ <input type='text' name='sid' id='sid' maxlength=6 />
+ <input type='hidden' name='mode' id='mode' value="search" />
+ <input type='submit' name='snsubmit' id='snsubmit' value="Start" />
+</form>
+</div>
+<div class='susignup-admin-menu cbb'>
+<h3>Renew existing account:</h3>
+<form action='{$componentpath}' method='post'>
+ <label for='member'>Account:</label>
+ {html_options name=member options=$renewables}
+ <input type='hidden' name='mode' id='mode' value="renew" />
+ <input type='submit' name='rnsubmit' id='rnsubmit' value="Renew" />
+</form>
+</div>
+<div class='susignup-admin-menu cbb'>
+<h3>Bulk Renewals</h3>
+<p style='text-align: left'>This will query the SU API and generate a list of corresponding SUCS accounts to be renewed.<br /> This process can take a little while to run</p><br />
+<form action='{$componentpath}' method='post'>
+ <input type='submit' name='rwsubmit' id='rwsubmit' value='Generate List' />
+ <input type='hidden' name='mode' id='mode' value='renewals' />
+</form>
+</div>
+<div class='susignup-admin-menu cbb'>
+<h3>SU Membership List</h3>
+<p style='text-align: left'>This will query the SU API for all current SUCS members<br /> This process can take a little while to run</p><br />
+<form action='{$componentpath}' method='post'>
+ <input type='submit' name='lssubmit' id='lssubmit' value='View List' />
+ <input type='hidden' name='mode' id='mode' value='list' />
+</form>
+</div>
+</div>
+ {else}
+ <div class="errorbar">
+ Invalid mode - {$mode}
+ </div>
+ {/if}
+{else}
+ <div class="errorbar">
+ <div><div><div>
+ You must be logged in and be a staff member to use this component;
+ </div></div></div>
+ </div>
+{/if}
+
Copied: trunk/templates/susignup.tpl (from rev 656, branches/sucs-site/templates/susignup.tpl)
===================================================================
--- trunk/templates/susignup.tpl (rev 0)
+++ trunk/templates/susignup.tpl 2015-04-05 16:42:47 UTC (rev 657)
@@ -0,0 +1,60 @@
+{if $mode=='login'}
+<form action="{$componentpath}" method="post">
+ <div class="box" style="width: 70%; margin: auto;">
+ <div class="boxhead"><h2>Membership Signup</h2></div>
+ <div class="boxcontent">
+
+ <p>Please enter your Transation ID. It can be found by logging into <a href='http://www.swansea-union.co.uk/shop/purchasehistory/'>swansea-union.com</a> and selecting purchase history.</p>
+
+ <div class="row">
+ <label for="sid">Student Number:</label>
+ <span class="textinput"><input type="text" size="20" name="sid" id="sid" /></span>
+ </div>
+ <div class="row">
+ <label for="transactionID">Transaction ID:</label>
+ <span class="textinput"><input type="text" size="20" name="transactionID" id="transactionID" /></span>
+ </div>
+ <div class="row"><span class="textinput">
+ <input type="submit" name="submit" value="Join" /></span>
+ </div>
+ <div class="clear"></div>
+ <div class="note">If you already have an account and wish to renew, simply buy an additional years membership from the <a href='http://www.swansea-union.co.uk/mysociety/sucs/'>SUSU website</a>. Enter the details above and click "Join"</div>
+ </div>
+ <div class="hollowfoot"><div><div></div></div></div>
+ </div>
+</form>
+{elseif $mode=='form' || $mode=="re-form"}
+ <h1>Signup</h1>
+ <p>To continue signup later please use the link below to dispay and print off your signup slip</p>
+ <form action="https://sucs.org/~kais58/sucstest/sucs/generate.php" method="post" target="_blank">
+ <input type=hidden name="id" id="id" value="{$id}" />
+ <input type=hidden name="pass" id="pass" value="{$pass}" />
+ <input type=submit name="submit" value="Proceed" />
+ </form>
+ <p>To finish signup now click below to continue</p>
+ <form action="https://sucs.org/signup/" method="post">
+ <input type=hidden name="signupid" id="id" value="{$id}" />
+ <input type=hidden name="signuppw" id="pass" value="{$pass}" />
+ <input type=submit name="submit" value="Proceed" />
+ </form>
+{elseif $mode=='numpty'}
+ <p>You appear to have completed this part of signup before, please check your emails for your signup ID and password. Alternatively click below to continue.</p>
+ <form action="https://sucs.org/signup/" method="post">
+ <input type=hidden name="signupid" id="id" value="{$id}" />
+ <input type=hidden name="signuppw" id="pass" value="{$pass}" />
+ <input type=submit name="submit" value="Proceed" />
+ </form>
+{elseif $mode=='numpty2'}
+ <p>You appear to have already completed this step and registered with SUCS with the username <strong>{$username}</strong>.<br/>If you have forgotten your login password please email <a href='mailto:admin at sucs.org'>admin at sucs.org</a> or drop by the SUCS room and find an admin.</p>
+
+{elseif $mode=='renew'}
+ <h1>Renewed</h1>
+ <p>Thankyou for renewing your membership, it has completed succesfully</p>
+{else}
+<h1>Error</h1>
+ <div class='errorbar'>
+ <strong>Error: </strong> {$error_text}
+ </div>
+An error occured during signup, please email, with as much information as you can provide, <a href='mailto:admin at sucs.org'>admin at sucs.org</a> for assistance.
+{/if}
+
Modified: trunk/templates/uri.tpl
===================================================================
--- trunk/templates/uri.tpl 2015-04-05 15:53:18 UTC (rev 656)
+++ trunk/templates/uri.tpl 2015-04-05 16:42:47 UTC (rev 657)
@@ -1,4 +1,4 @@
-{php}
+{* {php}
$script = "<script type=\"text/javascript\">\n";
$script .= "window.addEventListener('load', function(e) {\n";
$script .= "\tdocument.getElementById(\"uri\").focus();\n";
@@ -7,15 +7,8 @@
$this->append('extra_scripts', $script);
{/php}
+*}
-{if $errormsg}
- <div class="errorbar">
- <div><div><div>
- ShortURI: {$errormsg}
- </div></div></div>
- </div>
-{/if}
-
{if $session->loggedin}
<div class="box" style="width: 80%; margin: auto;">
Property changes on: trunk/templates_c
___________________________________________________________________
Added: svn:ignore
+ *
More information about the Devel
mailing list