diff --git a/htmlarea/dialog.js b/htmlarea/dialog.js new file mode 100644 index 0000000..c42bfa6 --- /dev/null +++ b/htmlarea/dialog.js @@ -0,0 +1,74 @@ +// htmlArea v3.0 - Copyright (c) 2003-2005 dynarch.com +// 2002-2003 interactivetools.com, inc. +// This copyright notice MUST stay intact for use (see license.txt). +// +// Portions (c) dynarch.com, 2003-2004 +// +// A free WYSIWYG editor replacement for + +
+ + + +
+ + + + +
+
Mihai Bazon
+ + Last modified: Wed Jan 28 11:10:40 EET 2004 + + + diff --git a/htmlarea/examples/character_map.html b/htmlarea/examples/character_map.html new file mode 100644 index 0000000..678a281 --- /dev/null +++ b/htmlarea/examples/character_map.html @@ -0,0 +1,30 @@ + + + Test of CharacterMap plugin + + + + + + + + + + + +

Test of DynamicCSS plugin

+ + + + diff --git a/htmlarea/examples/context-menu.html b/htmlarea/examples/context-menu.html new file mode 100644 index 0000000..e2c2a45 --- /dev/null +++ b/htmlarea/examples/context-menu.html @@ -0,0 +1,95 @@ + + + Test of ContextMenu plugin + + + + + + + + + + + +

Test of ContextMenu plugin

+ + + + +
+
Mihai Bazon
+ + Last modified: Wed Jan 28 11:10:29 EET 2004 + + + diff --git a/htmlarea/examples/core.html b/htmlarea/examples/core.html new file mode 100644 index 0000000..204c81d --- /dev/null +++ b/htmlarea/examples/core.html @@ -0,0 +1,184 @@ + + +Example of HTMLArea 3.0 + + + + + + + + + + + + + + + + +

HTMLArea 3.0

+ +

A replacement for TEXTAREA elements. © InteractiveTools.com, 2003-2004.

+ +
+ + + +

+ + + + + +submit + + + +

+ + + diff --git a/htmlarea/examples/css.html b/htmlarea/examples/css.html new file mode 100644 index 0000000..ffbc27e --- /dev/null +++ b/htmlarea/examples/css.html @@ -0,0 +1,90 @@ + + + Test of CSS plugin + + + + + + + + + + + +

Test of FullPage plugin

+ + + +
+
Mihai Bazon
+ + Last modified: Wed Jan 28 11:10:16 EET 2004 + + + diff --git a/htmlarea/examples/custom.css b/htmlarea/examples/custom.css new file mode 100644 index 0000000..dbcb310 --- /dev/null +++ b/htmlarea/examples/custom.css @@ -0,0 +1,29 @@ +body { background-color: #234; color: #dd8; font-family: tahoma; font-size: 12px; } + +a:link, a:visited { color: #8cf; } +a:hover { color: #ff8; } + +h1 { background-color: #456; color: #ff8; padding: 2px 5px; border: 1px solid; border-color: #678 #012 #012 #678; } + +/* syntax highlighting (used by the first combo defined for the CSS plugin) */ + +pre { margin: 0px 1em; padding: 5px 1em; background-color: #000; border: 1px dotted #02d; border-left: 2px solid #04f; } +.code { color: #f5deb3; } +.string { color: #00ffff; } +.comment { color: #8fbc8f; } +.variable-name { color: #fa8072; } +.type { color: #90ee90; font-weight: bold; } +.reference { color: #ee82ee; } +.preprocessor { color: #faf; } +.keyword { color: #ffffff; font-weight: bold; } +.function-name { color: #ace; } +.html-tag { font-weight: bold; } +.html-helper-italic { font-style: italic; } +.warning { color: #ffa500; font-weight: bold; } +.html-helper-bold { font-weight: bold; } + +/* info combo */ + +.quote { font-style: italic; color: #ee9; } +.highlight { background-color: yellow; color: #000; } +.deprecated { text-decoration: line-through; color: #aaa; } diff --git a/htmlarea/examples/dynamic.css b/htmlarea/examples/dynamic.css new file mode 100644 index 0000000..af7ac98 --- /dev/null +++ b/htmlarea/examples/dynamic.css @@ -0,0 +1,45 @@ +p { + FONT-FAMILY: Arial, Helvetica; + FONT-SIZE: 9pt; + FONT-WEIGHT: normal; + COLOR: #000000; +} + +p.p1 { + FONT-FAMILY: Arial, Helvetica; + FONT-SIZE: 11pt; + FONT-WEIGHT: normal; + COLOR: #000000; +} + +p.p2 { + FONT-FAMILY: Arial, Helvetica; + FONT-SIZE: 13pt; + FONT-WEIGHT: normal; + COLOR: #000000; +} + +div { + FONT-FAMILY: Arial, Helvetica; + FONT-SIZE: 9pt; + FONT-WEIGHT: bold; + COLOR: #000000; +} + +div.div1 { + FONT-FAMILY: Arial, Helvetica; + FONT-SIZE: 11pt; + FONT-WEIGHT: bold; + COLOR: #000000; +} + +div.div2 { + FONT-FAMILY: Arial, Helvetica; + FONT-SIZE: 13pt; + FONT-WEIGHT: bold; + COLOR: #000000; +} + +.quote { font-style: italic; color: #ee9; } +.highlight { background-color: yellow; color: #000; } +.deprecated { text-decoration: line-through; color: #aaa; } diff --git a/htmlarea/examples/dynamic_css.html b/htmlarea/examples/dynamic_css.html new file mode 100644 index 0000000..2e0a346 --- /dev/null +++ b/htmlarea/examples/dynamic_css.html @@ -0,0 +1,44 @@ + + + Test of CSS plugin + + + + + + + + + + + +

Test of DynamicCSS plugin

+ + + + diff --git a/htmlarea/examples/empty.html b/htmlarea/examples/empty.html new file mode 100644 index 0000000..db5af47 --- /dev/null +++ b/htmlarea/examples/empty.html @@ -0,0 +1,22 @@ + + + HTMLArea 3.0 core test + + + + + + + + diff --git a/htmlarea/examples/full-page.html b/htmlarea/examples/full-page.html new file mode 100644 index 0000000..d7e7537 --- /dev/null +++ b/htmlarea/examples/full-page.html @@ -0,0 +1,77 @@ + + + Test of FullPage plugin + + + + + + + + + + + +

Test of FullPage plugin

+ + + +
+
Mihai Bazon
+ + Last modified: Wed Aug 11 13:59:07 CEST 2004 + + + diff --git a/htmlarea/examples/fully-loaded.html b/htmlarea/examples/fully-loaded.html new file mode 100644 index 0000000..e0330dc --- /dev/null +++ b/htmlarea/examples/fully-loaded.html @@ -0,0 +1,262 @@ + + +Example of HTMLArea 3.0 + + + + + + + + + + + + + + + + + + + + + +

HTMLArea 3.0

+ +

A replacement for TEXTAREA elements. © InteractiveTools.com, 2003-2004.

+ +
+ + + +

+ + + + + +submit + + + +

+ + + diff --git a/htmlarea/examples/index.html b/htmlarea/examples/index.html new file mode 100644 index 0000000..15a5b64 --- /dev/null +++ b/htmlarea/examples/index.html @@ -0,0 +1,43 @@ + + +HTMLArea examples index + + + +

HTMLArea: auto-generated examples index

+ + + +
+
mihai_bazon@yahoo.com
+ Last modified: Sun Feb 1 13:30:39 EET 2004 + + diff --git a/htmlarea/examples/list-type.html b/htmlarea/examples/list-type.html new file mode 100644 index 0000000..e7f2096 --- /dev/null +++ b/htmlarea/examples/list-type.html @@ -0,0 +1,66 @@ + + + +Example of HTMLArea 3.0 -- ListType plugin + + + + + + + + + + + + + + +

HTMLArea :: the ListType plugin

+ +
+ + + +
+ + + diff --git a/htmlarea/examples/remove-font-tags.html b/htmlarea/examples/remove-font-tags.html new file mode 100644 index 0000000..646eb23 --- /dev/null +++ b/htmlarea/examples/remove-font-tags.html @@ -0,0 +1,41 @@ + + + The "htmlRemoveTags" feature + + + + + + + + + + + +

Remove FONT tags

+ + + + +
+
Mihai Bazon
+ + Last modified: Wed Apr 28 15:09:09 EEST 2004 + + + diff --git a/htmlarea/examples/spell-checker.html b/htmlarea/examples/spell-checker.html new file mode 100644 index 0000000..2e95951 --- /dev/null +++ b/htmlarea/examples/spell-checker.html @@ -0,0 +1,132 @@ + + +Example of HTMLArea 3.0 + + + + + + + + + + + + + + + + + +

HTMLArea 3.0

+ +

A replacement for TEXTAREA elements. © InteractiveTools.com, 2003-2004.

+ +

Plugins: + SpellChecker (sponsored by American Bible Society). +

+ +
+ + + +

+ + + + + +submit + + + +

+ + + diff --git a/htmlarea/examples/table-operations.html b/htmlarea/examples/table-operations.html new file mode 100644 index 0000000..94b9670 --- /dev/null +++ b/htmlarea/examples/table-operations.html @@ -0,0 +1,116 @@ + + +Example of HTMLArea 3.0 + + + + + + + + + + + + + + + + + +

HTMLArea 3.0

+ +

A replacement for TEXTAREA elements. © InteractiveTools.com, 2003-2004.

+ +

Page that demonstrates the additional features of the +TableOperations plugin (sponsored by Zapatec Inc.).

+ +
+ + + +

+ + + + + +submit + + + +

+ + + diff --git a/htmlarea/examples/test.cgi b/htmlarea/examples/test.cgi new file mode 100644 index 0000000..7645962 --- /dev/null +++ b/htmlarea/examples/test.cgi @@ -0,0 +1,21 @@ +#! /usr/bin/perl -w +# +# +# + + + +use CGI; + +print "Content-type: text/html\n\n"; +$c = new CGI; +$ta = $c->param('ta'); + +print < + + +$ta + + +EOF diff --git a/htmlarea/htmlarea.css b/htmlarea/htmlarea.css new file mode 100644 index 0000000..0b84fc7 --- /dev/null +++ b/htmlarea/htmlarea.css @@ -0,0 +1,180 @@ +.htmlarea { background: #fff; } + +.htmlarea .toolbar { + cursor: default; + background: ButtonFace; + padding: 3px; + border: 1px solid; + border-color: ButtonHighlight ButtonShadow ButtonShadow ButtonHighlight; +} +.htmlarea .toolbar table { font-family: tahoma,verdana,sans-serif; font-size: 11px; } +.htmlarea .toolbar img { border: none; } +.htmlarea .toolbar .label { padding: 0px 3px; } + +.htmlarea .toolbar .button { + background: ButtonFace; + color: ButtonText; + border: 1px solid ButtonFace; + padding: 1px; + margin: 0px; + width: 18px; + height: 18px; +} +.htmlarea .toolbar .buttonHover { + border: 1px solid; + border-color: ButtonHighlight ButtonShadow ButtonShadow ButtonHighlight; +} +.htmlarea .toolbar .buttonActive, .htmlarea .toolbar .buttonPressed { + padding: 2px 0px 0px 2px; + border: 1px solid; + border-color: ButtonShadow ButtonHighlight ButtonHighlight ButtonShadow; +} +.htmlarea .toolbar .buttonPressed { + background: ButtonHighlight; +} +.htmlarea .toolbar .indicator { + padding: 0px 3px; + overflow: hidden; + width: 20px; + text-align: center; + cursor: default; + border: 1px solid ButtonShadow; +} + +.htmlarea .toolbar .buttonDisabled img { + filter: gray() alpha(opacity = 25); + -moz-opacity: 0.25; +} + +.htmlarea .toolbar .separator { + position: relative; + margin: 3px; + border-left: 1px solid ButtonShadow; + border-right: 1px solid ButtonHighlight; + width: 0px; + height: 16px; + padding: 0px; +} + +.htmlarea .toolbar .space { width: 5px; } + +.htmlarea .toolbar select { font: 11px Tahoma,Verdana,sans-serif; } + +.htmlarea .toolbar select, +.htmlarea .toolbar select:hover, +.htmlarea .toolbar select:active { background: FieldFace; color: ButtonText; } + +.htmlarea .statusBar { + border: 1px solid; + border-color: ButtonShadow ButtonHighlight ButtonHighlight ButtonShadow; + padding: 2px 4px; + background-color: ButtonFace; + color: ButtonText; + font: 11px Tahoma,Verdana,sans-serif; +} + +.htmlarea .statusBar .statusBarTree a { + padding: 2px 5px; + color: #00f; +} + +.htmlarea .statusBar .statusBarTree a:visited { color: #00f; } +.htmlarea .statusBar .statusBarTree a:hover { + background-color: Highlight; + color: HighlightText; + padding: 1px 4px; + border: 1px solid HighlightText; +} + + +/* Hidden DIV popup dialogs (PopupDiv) */ + +.dialog { + color: ButtonText; + background: ButtonFace; +} + +.dialog .content { padding: 2px; } + +.dialog, .dialog button, .dialog input, .dialog select, .dialog textarea, .dialog table { + font: 11px Tahoma,Verdana,sans-serif; +} + +.dialog table { border-collapse: collapse; } + +.dialog .title { + background: #008; + color: #ff8; + border-bottom: 1px solid #000; + padding: 1px 0px 2px 5px; + font-size: 12px; + font-weight: bold; + cursor: default; +} + +.dialog .title .button { + float: right; + border: 1px solid #66a; + padding: 0px 1px 0px 2px; + margin-right: 1px; + color: #fff; + text-align: center; +} + +.dialog .title .button-hilite { border-color: #88f; background: #44c; } + +.dialog button { + width: 5em; + padding: 0px; +} + +.dialog .buttonColor { + padding: 1px; + cursor: default; + border: 1px solid; + border-color: ButtonHighlight ButtonShadow ButtonShadow ButtonHighlight; +} + +.dialog .buttonColor-hilite { + border-color: #000; +} + +.dialog .buttonColor .chooser, .dialog .buttonColor .nocolor { + height: 0.6em; + border: 1px solid; + padding: 0px 1em; + border-color: ButtonShadow ButtonHighlight ButtonHighlight ButtonShadow; +} + +.dialog .buttonColor .nocolor { padding: 0px; } +.dialog .buttonColor .nocolor-hilite { background-color: #fff; color: #f00; } + +.dialog .label { text-align: right; width: 6em; } +.dialog .value input { width: 100%; } +.dialog .buttons { text-align: right; padding: 2px 4px 0px 4px; } + +.dialog legend { font-weight: bold; } +.dialog fieldset table { margin: 2px 0px; } + +.popupdiv { + border: 2px solid; + border-color: ButtonHighlight ButtonShadow ButtonShadow ButtonHighlight; +} + +.popupwin { + padding: 0px; + margin: 0px; +} + +.popupwin .title { + background: #fff; + color: #000; + font-weight: bold; + font-size: 120%; + padding: 3px 10px; + margin-bottom: 10px; + border-bottom: 1px solid black; + letter-spacing: 2px; +} + +form { margin: 0px; border: none; } diff --git a/htmlarea/htmlarea.js b/htmlarea/htmlarea.js new file mode 100644 index 0000000..e710cbc --- /dev/null +++ b/htmlarea/htmlarea.js @@ -0,0 +1,2595 @@ +// htmlArea v3.0 - Copyright (c) 2003-2005 dynarch.com +// 2002-2003 interactivetools.com, inc. +// This copyright notice MUST stay intact for use (see license.txt). +// +// A free WYSIWYG editor replacement for + +
+
Mihai Bazon
+ + +Last modified on Sat Oct 25 01:06:59 2003 + + + + diff --git a/htmlarea/plugins/HtmlTidy/README b/htmlarea/plugins/HtmlTidy/README new file mode 100644 index 0000000..c77f450 --- /dev/null +++ b/htmlarea/plugins/HtmlTidy/README @@ -0,0 +1,104 @@ +// Plugin for htmlArea to run code through the server's HTML Tidy +// By Adam Wright, for The University of Western Australia +// +// Email: zeno@ucc.gu.uwa.edu.au +// Homepage: http://blog.hipikat.org/ +// +// Distributed under the same terms as HTMLArea itself. +// This notice MUST stay intact for use (see license.txt). +// +// Version: 0.5 +// Released to the outside world: 04/03/04 + + +HtmlTidy is a plugin for the popular cross-browser TTY WYSIWYG editor, +htmlArea (http://www.htmlarea.com/). HtmlTidy +basically queries HTML Tidy (http://tidy.sourceforge.net/) on the +server side, getting it to make-html-nice, instead of relying on masses +of javascript, which the client would have to download. + +Hi, this is a quick explanation of how to install HtmlTidy. Much better +documentation is probably required, and you're welcome to write it :) + + +* The HtmlTidy directory you should have found this file in should + include the following: + + - README + This file, providing help installing the plugin. + + - html-tidy-config.cfg + This file contains the configuration options HTML Tidy uses to + clean html, and can be modified to suit your organizations + requirements. + + - html-tidy-logic.php + This is the php script, which is queried with dirty html and is + responsible for invoking HTML Tidy, getting nice new html and + returning it to the client. + + - html-tidy.js + The main htmlArea plugin, providing functionality to tidy html + through the htmlArea interface. + + - htmlarea.js.onmode_event.diff + At the time of publishing, an extra event handler was required + inside the main htmlarea.js file. htmlarea.js may be patched + against this file to make the changes reuquired, but be aware + that the event handler may either now be in the core or + htmlarea.js may have changed enough to invalidate the patch. + + UPDATE: now it exists in the official htmlarea.js; applying + this patch is thus no longer necessary. + + - img/html-tidy.gif + The HtmlTidy icon, for the htmlArea toolbar. Created by Dan + Petty for The University of Western Australia. + + - lang/en.js + English language file. Add your own language files here and + please contribute back into the htmlArea community! + + The HtmlArea directory should be extracted to your htmlarea/plugins/ + directory. + + +* Make sure the onMode event handler mentioned above, regarding + htmlarea.js.onmode_event.diff, exists in your htmlarea.js + + +* html-tidy-logic.php should be executable, and your web server should + be configured to execute php scripts in the directory + html-tidy-logic.php exists in. + + +* HTML Tidy needs to be installed on your server, and 'tidy' should be + an alias to it, lying in the PATH known to the user executing such + web scripts. + + +* In your htmlArea configuration, do something like this: + + HTMLArea.loadPlugin("HtmlTidy"); + + editor = new HTMLArea("doc"); + editor.registerPlugin("HtmlTidy"); + + +* Then, in your htmlArea toolbar configuration, use: + + - "HT-html-tidy" + This will create the 'tidy broom' icon on the toolbar, which + will attempt to tidy html source when clicked, and; + + - "HT-auto-tidy" + This will create an "Auto Tidy" / "Don't Tidy" dropdown, to + select whether the source should be tidied automatically when + entering source view. On by default, if you'd like it otherwise + you can do so programatically after generating the toolbar :) + (Or just hack it to be otherwise...) + + +Thank you. + +Any bugs you find can be emailed to zeno@ucc.gu.uwa.edu.au diff --git a/htmlarea/plugins/HtmlTidy/html-tidy-config.cfg b/htmlarea/plugins/HtmlTidy/html-tidy-config.cfg new file mode 100644 index 0000000..4315dd7 --- /dev/null +++ b/htmlarea/plugins/HtmlTidy/html-tidy-config.cfg @@ -0,0 +1,29 @@ +// Default configuration file for the htmlArea, HtmlTidy plugin +// By Adam Wright, for The University of Western Australia +// +// Evertything you always wanted to know about HTML Tidy * +// can be found at http://tidy.sourceforge.net/, and a +// quick reference to the configuration options exists at +// http://tidy.sourceforge.net/docs/quickref.html +// +// * But were afraid to ask +// +// Distributed under the same terms as HTMLArea itself. +// This notice MUST stay intact for use (see license.txt). + +word-2000: yes +clean: no +drop-font-tags: yes +doctype: auto +drop-empty-paras: yes +drop-proprietary-attributes: yes +enclose-block-text: yes +enclose-text: yes +escape-cdata: yes +logical-emphasis: yes +indent: auto +indent-spaces: 2 +break-before-br: yes +output-xhtml: yes + +force-output: yes diff --git a/htmlarea/plugins/HtmlTidy/html-tidy-logic.php b/htmlarea/plugins/HtmlTidy/html-tidy-logic.php new file mode 100644 index 0000000..a8fabeb --- /dev/null +++ b/htmlarea/plugins/HtmlTidy/html-tidy-logic.php @@ -0,0 +1,83 @@ + array("pipe", "r"), + 1 => array("pipe", "w"), + 2 => array("file", "/dev/null", "a") + ); + $process = proc_open("tidy -config html-tidy-config.cfg", $descriptorspec, $pipes); + + // Make sure the program started and we got the hooks... + // Either way, get some source code into $source + if (is_resource($process)) { + + // Feed untidy source into the stdin + fwrite($pipes[0], $source); + fclose($pipes[0]); + + // Read clean source out to the browser + while (!feof($pipes[1])) { + //echo fgets($pipes[1], 1024); + $newsrc .= fgets($pipes[1], 1024); + } + fclose($pipes[1]); + + // Clean up after ourselves + proc_close($process); + + } else { + // Better give them back what they came with, so they don't lose it all... + $newsrc = "\n" .$source. "\n"; + } + + // Split our source into an array by lines + $srcLines = explode("\n",$newsrc); + + // Get only the lines between the body tags + $startLn = 0; + while ( strpos( $srcLines[$startLn++], ' + + + + + + + + + + diff --git a/htmlarea/plugins/HtmlTidy/html-tidy.js b/htmlarea/plugins/HtmlTidy/html-tidy.js new file mode 100644 index 0000000..d403bf3 --- /dev/null +++ b/htmlarea/plugins/HtmlTidy/html-tidy.js @@ -0,0 +1,128 @@ +// Plugin for htmlArea to run code through the server's HTML Tidy +// By Adam Wright, for The University of Western Australia +// +// Distributed under the same terms as HTMLArea itself. +// This notice MUST stay intact for use (see license.txt). + +function HtmlTidy(editor) { + this.editor = editor; + + var cfg = editor.config; + var tt = HtmlTidy.I18N; + var bl = HtmlTidy.btnList; + var self = this; + + this.onMode = this.__onMode; + + // register the toolbar buttons provided by this plugin + var toolbar = []; + for (var i = 0; i < bl.length; ++i) { + var btn = bl[i]; + if (btn == "html-tidy") { + var id = "HT-html-tidy"; + cfg.registerButton(id, tt[id], editor.imgURL(btn[0] + ".gif", "HtmlTidy"), true, + function(editor, id) { + // dispatch button press event + self.buttonPress(editor, id); + }, btn[1]); + toolbar.push(id); + } else if (btn == "html-auto-tidy") { + var ht_class = { + id : "HT-auto-tidy", + options : { "Auto-Tidy" : "auto", "Don't Tidy" : "noauto" }, + action : function (editor) { self.__onSelect(editor, this); }, + refresh : function (editor) { }, + context : "body" + }; + cfg.registerDropdown(ht_class); + } + } + + for (var i in toolbar) { + cfg.toolbar[0].push(toolbar[i]); + } +}; + +HtmlTidy._pluginInfo = { + name : "HtmlTidy", + version : "1.0", + developer : "Adam Wright", + developer_url : "http://blog.hipikat.org/", + sponsor : "The University of Western Australia", + sponsor_url : "http://www.uwa.edu.au/", + license : "htmlArea" +}; + +HtmlTidy.prototype.__onSelect = function(editor, obj) { + // Get the toolbar element object + var elem = editor._toolbarObjects[obj.id].element; + + // Set our onMode event appropriately + if (elem.value == "auto") + this.onMode = this.__onMode; + else + this.onMode = null; +}; + +HtmlTidy.prototype.__onMode = function(mode) { + if ( mode == "textmode" ) { + this.buttonPress(this.editor, "HT-html-tidy"); + } +}; + +HtmlTidy.btnList = [ + null, // separator + ["html-tidy"], + ["html-auto-tidy"] +]; + +HtmlTidy.prototype.onGenerateOnce = function() { + var editor = this.editor; + + var ifr = document.createElement("iframe"); + ifr.name = "htiframe_name"; + var s = ifr.style; + s.position = "absolute"; + s.width = s.height = s.border = s.left = s.top = s.padding = s.margin = "0px"; + document.body.appendChild(ifr); + + var frm = '
'; + + var newdiv = document.createElement('div'); + newdiv.style.display = "none"; + newdiv.innerHTML = frm; + document.body.appendChild(newdiv); +}; + +HtmlTidy.prototype.buttonPress = function(editor, id) { + var i18n = HtmlTidy.I18N; + + switch (id) { + case "HT-html-tidy": + + var oldhtml = editor.getHTML(); + + // Ask the server for some nice new html, based on the old... + var myform = document.getElementById('htiform_id'); + var txtarea = document.getElementById('htisource_id'); + txtarea.value = editor.getHTML(); + + // Apply the 'meanwhile' text, e.g. "Tidying HTML, please wait..." + editor.setHTML(i18n['tidying']); + + // The returning tidying processing script needs to find the editor + window._editorRef = editor; + + // ...And send our old source off for processing! + myform.submit(); + break; + } +}; + +HtmlTidy.prototype.processTidied = function(newSrc) { + editor = this.editor; + editor.setHTML(newSrc); +}; diff --git a/htmlarea/plugins/HtmlTidy/img/html-tidy.gif b/htmlarea/plugins/HtmlTidy/img/html-tidy.gif new file mode 100644 index 0000000..ed1cbb1 Binary files /dev/null and b/htmlarea/plugins/HtmlTidy/img/html-tidy.gif differ diff --git a/htmlarea/plugins/HtmlTidy/lang/en.js b/htmlarea/plugins/HtmlTidy/lang/en.js new file mode 100644 index 0000000..26c19c8 --- /dev/null +++ b/htmlarea/plugins/HtmlTidy/lang/en.js @@ -0,0 +1,18 @@ +// I18N constants + +// LANG: "en", ENCODING: UTF-8 | ISO-8859-1 +// Author: Adam Wright, http://blog.hipikat.org/ + +// FOR TRANSLATORS: +// +// 1. PLEASE PUT YOUR CONTACT INFO IN THE ABOVE LINE +// (at least a valid email address) +// +// 2. PLEASE TRY TO USE UTF-8 FOR ENCODING; +// (if this is not possible, please include a comment +// that states what encoding is necessary.) + +HtmlTidy.I18N = { + "tidying" : "\n Tidying up the HTML source, please wait...", + "HT-html-tidy" : "HTML Tidy" +}; diff --git a/htmlarea/plugins/ListType/lang/de.js b/htmlarea/plugins/ListType/lang/de.js new file mode 100644 index 0000000..0265f1a --- /dev/null +++ b/htmlarea/plugins/ListType/lang/de.js @@ -0,0 +1,23 @@ +// I18N constants + +// LANG: "en", ENCODING: UTF-8 | ISO-8859-1 +// Author: Holger Hees, http://www.systemconcept.de + +// FOR TRANSLATORS: +// +// 1. PLEASE PUT YOUR CONTACT INFO IN THE ABOVE LINE +// (at least a valid email address) +// +// 2. PLEASE TRY TO USE UTF-8 FOR ENCODING; +// (if this is not possible, please include a comment +// that states what encoding is necessary.) + +ListType.I18N = { + "Decimal" : "1-Zahlen", + "Lower roman" : "i-Roemisch", + "Upper roman" : "I-Roemisch", + "Lower latin" : "a-Zeichen", + "Upper latin" : "A-Zeichen", + "Lower greek" : "Griechisch", + "ListStyleTooltip" : "Whlen Sie einen Typ fr die Nummerierung aus" +}; diff --git a/htmlarea/plugins/ListType/lang/en.js b/htmlarea/plugins/ListType/lang/en.js new file mode 100644 index 0000000..8dd2790 --- /dev/null +++ b/htmlarea/plugins/ListType/lang/en.js @@ -0,0 +1,23 @@ +// I18N constants + +// LANG: "en", ENCODING: UTF-8 | ISO-8859-1 +// Author: Mihai Bazon, http://dynarch.com/mishoo + +// FOR TRANSLATORS: +// +// 1. PLEASE PUT YOUR CONTACT INFO IN THE ABOVE LINE +// (at least a valid email address) +// +// 2. PLEASE TRY TO USE UTF-8 FOR ENCODING; +// (if this is not possible, please include a comment +// that states what encoding is necessary.) + +ListType.I18N = { + "Decimal" : "Decimal numbers", + "Lower roman" : "Lower roman numbers", + "Upper roman" : "Upper roman numbers", + "Lower latin" : "Lower latin letters", + "Upper latin" : "Upper latin letters", + "Lower greek" : "Lower greek letters", + "ListStyleTooltip" : "Choose list style type (for ordered lists)" +}; diff --git a/htmlarea/plugins/ListType/list-type.js b/htmlarea/plugins/ListType/list-type.js new file mode 100644 index 0000000..7df6d85 --- /dev/null +++ b/htmlarea/plugins/ListType/list-type.js @@ -0,0 +1,89 @@ +// ListType Plugin for HTMLArea-3.0 +// Sponsored by MEdTech Unit - Queen's University +// Implementation by Mihai Bazon, http://dynarch.com/mishoo/ +// +// (c) dynarch.com 2003-2005. +// Distributed under the same terms as HTMLArea itself. +// This notice MUST stay intact for use (see license.txt). +// +// $Id$ + +function ListType(editor) { + this.editor = editor; + var cfg = editor.config; + var toolbar = cfg.toolbar; + var self = this; + var i18n = ListType.I18N; + var options = {}; + options[i18n["Decimal"]] = "decimal"; + options[i18n["Lower roman"]] = "lower-roman"; + options[i18n["Upper roman"]] = "upper-roman"; + options[i18n["Lower latin"]] = "lower-alpha"; + options[i18n["Upper latin"]] = "upper-alpha"; + if (!HTMLArea.is_ie) + // IE doesn't support this property; even worse, it complains + // with a gross error message when we tried to select it, + // therefore let's hide it from the damn "browser". + options[i18n["Lower greek"]] = "lower-greek"; + var obj = { + id : "ListType", + tooltip : i18n["ListStyleTooltip"], + options : options, + action : function(editor) { self.onSelect(editor, this); }, + refresh : function(editor) { self.updateValue(editor, this); }, + context : "ol" + }; + cfg.registerDropdown(obj); + var a, i, j, found = false; + for (i = 0; !found && i < toolbar.length; ++i) { + a = toolbar[i]; + for (j = 0; j < a.length; ++j) { + if (a[j] == "unorderedlist") { + found = true; + break; + } + } + } + if (found) + a.splice(j, 0, "space", "ListType", "space"); +}; + +ListType._pluginInfo = { + name : "ListType", + version : "1.0", + developer : "Mihai Bazon", + developer_url : "http://dynarch.com/mishoo/", + c_owner : "dynarch.com", + sponsor : "MEdTech Unit - Queen's University", + sponsor_url : "http://www.queensu.ca/", + license : "htmlArea" +}; + +ListType.prototype.onSelect = function(editor, combo) { + var tbobj = editor._toolbarObjects[combo.id].element; + var parent = editor.getParentElement(); + while (!/^ol$/i.test(parent.tagName)) { + parent = parent.parentNode; + } + parent.style.listStyleType = tbobj.value; +}; + +ListType.prototype.updateValue = function(editor, combo) { + var tbobj = editor._toolbarObjects[combo.id].element; + var parent = editor.getParentElement(); + while (parent && !/^ol$/i.test(parent.tagName)) { + parent = parent.parentNode; + } + if (!parent) { + tbobj.selectedIndex = 0; + return; + } + var type = parent.style.listStyleType; + if (!type) { + tbobj.selectedIndex = 0; + } else { + for (var i = tbobj.firstChild; i; i = i.nextSibling) { + i.selected = (type.indexOf(i.value) != -1); + } + } +}; diff --git a/htmlarea/plugins/SpellChecker/img/he-spell-check.gif b/htmlarea/plugins/SpellChecker/img/he-spell-check.gif new file mode 100644 index 0000000..a9ddac9 Binary files /dev/null and b/htmlarea/plugins/SpellChecker/img/he-spell-check.gif differ diff --git a/htmlarea/plugins/SpellChecker/img/spell-check.gif b/htmlarea/plugins/SpellChecker/img/spell-check.gif new file mode 100644 index 0000000..29bd11a Binary files /dev/null and b/htmlarea/plugins/SpellChecker/img/spell-check.gif differ diff --git a/htmlarea/plugins/SpellChecker/lang/cz.js b/htmlarea/plugins/SpellChecker/lang/cz.js new file mode 100644 index 0000000..7bd7f66 --- /dev/null +++ b/htmlarea/plugins/SpellChecker/lang/cz.js @@ -0,0 +1,37 @@ +// I18N constants + +// LANG: "cz", ENCODING: UTF-8 | ISO-8859-2 +// Author: Jiri Löw, + +// FOR TRANSLATORS: +// +// 1. PLEASE PUT YOUR CONTACT INFO IN THE ABOVE LINE +// (at least a valid email address) +// +// 2. PLEASE TRY TO USE UTF-8 FOR ENCODING; +// (if this is not possible, please include a comment +// that states what encoding is necessary.) + +SpellChecker.I18N = { + "CONFIRM_LINK_CLICK" : "Prosím potvrďte otevření tohoto odkazu", + "Cancel" : "Zrušit", + "Dictionary" : "Slovník", + "Finished list of mispelled words" : "Dokončen seznam chybných slov", + "I will open it in a new page." : "Bude otevřen jej v nové stránce.", + "Ignore all" : "Ignorovat vše", + "Ignore" : "Ignorovat", + "NO_ERRORS" : "Podle zvoleného slovníku nebyla nalezena žádná chybná slova.", + "NO_ERRORS_CLOSING" : "Kontrola správnosti slov dokončena, nebyla nalezena žádná chybná slova. Ukončování ...", + "OK" : "OK", + "Original word" : "Původní slovo", + "Please wait. Calling spell checker." : "Prosím čekejte. Komunikuace s kontrolou správnosti slov.", + "Please wait: changing dictionary to" : "Prosím čekejte: změna adresáře na", + "QUIT_CONFIRMATION" : "Změny budou zrušeny a kontrola správnosti slov ukončena. Prosím potvrďte.", + "Re-check" : "Překontrolovat", + "Replace all" : "Zaměnit všechno", + "Replace with" : "Zaměnit za", + "Replace" : "Zaměnit", + "SC-spell-check" : "Kontrola správnosti slov", + "Suggestions" : "Doporučení", + "pliz weit ;-)" : "strpení prosím ;-)" +}; diff --git a/htmlarea/plugins/SpellChecker/lang/da.js b/htmlarea/plugins/SpellChecker/lang/da.js new file mode 100644 index 0000000..f3ab054 --- /dev/null +++ b/htmlarea/plugins/SpellChecker/lang/da.js @@ -0,0 +1,37 @@ +// I18N constants + +// LANG: "en", ENCODING: UTF-8 | ISO-8859-1 +// Author: Steen Sønderup, + +// FOR TRANSLATORS: +// +// 1. PLEASE PUT YOUR CONTACT INFO IN THE ABOVE LINE +// (at least a valid email address) +// +// 2. PLEASE TRY TO USE UTF-8 FOR ENCODING; +// (if this is not possible, please include a comment +// that states what encoding is necessary.) + +SpellChecker.I18N = { + "CONFIRM_LINK_CLICK" : "Vil du følge dette link?", + "Cancel" : "Anuler", + "Dictionary" : "Ordbog", + "Finished list of mispelled words" : "Listen med stavefejl er gennemgået", + "I will open it in a new page." : "Jeg vil åbne det i en ny side.", + "Ignore all" : "Ignorer alle", + "Ignore" : "Ignorer", + "NO_ERRORS" : "Der blev ikke fundet nogle stavefejl med den valgte ordbog.", + "NO_ERRORS_CLOSING" : "Stavekontrollen er gennemført, der blev ikke fundet nogle stavefejl. Lukker...", + "OK" : "OK", + "Original word" : "Oprindeligt ord", + "Please wait. Calling spell checker." : "Vent venligst. Henter stavekontrol.", + "Please wait: changing dictionary to" : "Vent venligst: skifter ordbog til", + "QUIT_CONFIRMATION" : "Alle dine ændringer vil gå tabt, vil du fortsætte?", + "Re-check" : "Tjek igen", + "Replace all" : "Erstat alle", + "Replace with" : "Erstat med", + "Replace" : "Erstat", + "SC-spell-check" : "Stavekontrol", + "Suggestions" : "Forslag", + "pliz weit ;-)" : "Vent venligst" +}; diff --git a/htmlarea/plugins/SpellChecker/lang/de.js b/htmlarea/plugins/SpellChecker/lang/de.js new file mode 100644 index 0000000..efc5f57 --- /dev/null +++ b/htmlarea/plugins/SpellChecker/lang/de.js @@ -0,0 +1,28 @@ +// I18N constants + +// LANG: "en", ENCODING: UTF-8 | ISO-8859-1 +// Author: Broxx, + +SpellChecker.I18N = { + "CONFIRM_LINK_CLICK" : "Wollen Sie diesen Link oeffnen", + "Cancel" : "Abbrechen", + "Dictionary" : "Woerterbuch", + "Finished list of mispelled words" : "Liste der nicht bekannten Woerter", + "I will open it in a new page." : "Wird auf neuer Seite geoeffnet", + "Ignore all" : "Alle ignorieren", + "Ignore" : "Ignorieren", + "NO_ERRORS" : "Keine falschen Woerter mit gewaehlten Woerterbuch gefunden", + "NO_ERRORS_CLOSING" : "Rechtsschreibpruefung wurde ohne Fehler fertiggestellt. Wird nun geschlossen...", + "OK" : "OK", + "Original word" : "Original Wort", + "Please wait. Calling spell checker." : "Bitte warten. Woerterbuch wird durchsucht.", + "Please wait: changing dictionary to" : "Bitte warten: Woerterbuch wechseln zu", + "QUIT_CONFIRMATION" : "Aenderungen werden nicht uebernommen. Bitte bestaettigen.", + "Re-check" : "Neuueberpruefung", + "Replace all" : "Alle ersetzen", + "Replace with" : "Ersetzen mit", + "Replace" : "Ersetzen", + "SC-spell-check" : "Ueberpruefung", + "Suggestions" : "Vorschlag", + "pliz weit ;-)" : "bittsche wartn ;-)" +}; diff --git a/htmlarea/plugins/SpellChecker/lang/en.js b/htmlarea/plugins/SpellChecker/lang/en.js new file mode 100644 index 0000000..ac7a84a --- /dev/null +++ b/htmlarea/plugins/SpellChecker/lang/en.js @@ -0,0 +1,38 @@ +// I18N constants + +// LANG: "en", ENCODING: UTF-8 | ISO-8859-1 +// Author: Mihai Bazon, http://dynarch.com/mishoo + +// FOR TRANSLATORS: +// +// 1. PLEASE PUT YOUR CONTACT INFO IN THE ABOVE LINE +// (at least a valid email address) +// +// 2. PLEASE TRY TO USE UTF-8 FOR ENCODING; +// (if this is not possible, please include a comment +// that states what encoding is necessary.) + +SpellChecker.I18N = { + "CONFIRM_LINK_CLICK" : "Please confirm that you want to open this link", + "Cancel" : "Cancel", + "Dictionary" : "Dictionary", + "Finished list of mispelled words" : "Finished list of mispelled words", + "I will open it in a new page." : "I will open it in a new page.", + "Ignore all" : "Ignore all", + "Ignore" : "Ignore", + "NO_ERRORS" : "No mispelled words found with the selected dictionary.", + "NO_ERRORS_CLOSING" : "Spell check complete, didn't find any mispelled words. Closing now...", + "OK" : "OK", + "Original word" : "Original word", + "Please wait. Calling spell checker." : "Please wait. Calling spell checker.", + "Please wait: changing dictionary to" : "Please wait: changing dictionary to", + "QUIT_CONFIRMATION" : "This will drop changes and quit spell checker. Please confirm.", + "Re-check" : "Re-check", + "Replace all" : "Replace all", + "Replace with" : "Replace with", + "Replace" : "Replace", + "Revert" : "Revert", + "SC-spell-check" : "Spell-check", + "Suggestions" : "Suggestions", + "pliz weit ;-)" : "pliz weit ;-)" +}; diff --git a/htmlarea/plugins/SpellChecker/lang/he.js b/htmlarea/plugins/SpellChecker/lang/he.js new file mode 100644 index 0000000..f5ef286 --- /dev/null +++ b/htmlarea/plugins/SpellChecker/lang/he.js @@ -0,0 +1,38 @@ +// I18N constants + +// LANG: "en", ENCODING: UTF-8 | ISO-8859-1 +// Author: Mihai Bazon, http://dynarch.com/mishoo + +// FOR TRANSLATORS: +// +// 1. PLEASE PUT YOUR CONTACT INFO IN THE ABOVE LINE +// (at least a valid email address) +// +// 2. PLEASE TRY TO USE UTF-8 FOR ENCODING; +// (if this is not possible, please include a comment +// that states what encoding is necessary.) + +SpellChecker.I18N = { + "CONFIRM_LINK_CLICK" : "אנא אשר שברצונך לפתוח קישור זה", + "Cancel" : "ביטול", + "Dictionary" : "מילון", + "Finished list of mispelled words" : "הסתיימה רשימת המילים המאויתות באופן שגוי", + "I will open it in a new page." : "אני אפתח את זה בחלון חדש.", + "Ignore all" : "התעלם מהכל", + "Ignore" : "התעלם", + "NO_ERRORS" : "לא נמצאו מילים מאויתות באופן שגוי עם המילון הנבחר.", + "NO_ERRORS_CLOSING" : "בדיקת האיות נסתיימה, לא נמצאו מילים מאויתות באופן שגוי. נסגר כעת...", + "OK" : "אישור", + "Original word" : "המילה המקורית", + "Please wait. Calling spell checker." : "אנא המתן. קורא לבודק איות.", + "Please wait: changing dictionary to" : "אנא המתן: מחליף מילון ל-", + "QUIT_CONFIRMATION" : "זה יבטל את השינויים ויצא מבודק האיות. אנא אשר.", + "Re-check" : "בדוק מחדש", + "Replace all" : "החלף הכל", + "Replace with" : "החלף ב-", + "Replace" : "החלף", + "Revert" : "החזר שינויים", + "SC-spell-check" : "בדיקת איות", + "Suggestions" : "הצעות", + "pliz weit ;-)" : "ענא המטן ;-)" +}; diff --git a/htmlarea/plugins/SpellChecker/lang/hu.js b/htmlarea/plugins/SpellChecker/lang/hu.js new file mode 100644 index 0000000..0d414b3 --- /dev/null +++ b/htmlarea/plugins/SpellChecker/lang/hu.js @@ -0,0 +1,37 @@ +// I18N constants + +// LANG: "hu", ENCODING: UTF-8 +// Author: Miklós Somogyi, + +// FOR TRANSLATORS: +// +// 1. PLEASE PUT YOUR CONTACT INFO IN THE ABOVE LINE +// (at least a valid email address) +// +// 2. PLEASE TRY TO USE UTF-8 FOR ENCODING; +// (if this is not possible, please include a comment +// that states what encoding is necessary.) + +SpellChecker.I18N = { + "CONFIRM_LINK_CLICK" : "Megerősítés", + "Cancel" : "Mégsem", + "Dictionary" : "Szótár", + "Finished list of mispelled words" : "A tévesztett szavak listájának vége", + "I will open it in a new page." : "Megnyitás új lapon", + "Ignore all" : "Minden elvetése", + "Ignore" : "Elvetés", + "NO_ERRORS" : "A választott szótár szerint nincs tévesztett szó.", + "NO_ERRORS_CLOSING" : "A helyesírásellenőrzés kész, tévesztett szó nem fordult elő. Bezárás...", + "OK" : "Rendben", + "Original word" : "Eredeti szó", + "Please wait. Calling spell checker." : "Kis türelmet, a helyesírásellenőrző hívása folyamatban.", + "Please wait: changing dictionary to" : "Kis türelmet, szótár cseréje", + "QUIT_CONFIRMATION" : "Kilépés a változások eldobásával. Jóváhagyja?", + "Re-check" : "Újraellenőrzés", + "Replace all" : "Mind cseréje", + "Replace with" : "Csere a következőre:", + "Replace" : "Csere", + "SC-spell-check" : "Helyesírásellenőrzés", + "Suggestions" : "Tippek", + "pliz weit ;-)" : "Kis türelmet ;-)" +}; diff --git a/htmlarea/plugins/SpellChecker/lang/it.js b/htmlarea/plugins/SpellChecker/lang/it.js new file mode 100644 index 0000000..e6ddd09 --- /dev/null +++ b/htmlarea/plugins/SpellChecker/lang/it.js @@ -0,0 +1,28 @@ +// I18N constants + +// LANG: "it", ENCODING: UTF-8 | ISO-8859-1 +// Author: Fabio Rotondo, + +SpellChecker.I18N = { + "CONFIRM_LINK_CLICK" : "Devi confermare l'apertura di questo link", + "Cancel" : "Annulla", + "Dictionary" : "Dizionario", + "Finished list of mispelled words" : "La lista delle parole scritte male è terminata", + "I will open it in a new page." : "Lo aprirò in una nuova pagina.", + "Ignore all" : "Ignora sempre", + "Ignore" : "Ignora", + "NO_ERRORS" : "Non sono state trovate parole scritte male con il dizionario selezionato.", + "NO_ERRORS_CLOSING" : "Controllo completato, non sono state trovate parole scritte male. Sto chiudendo...", + "OK" : "OK", + "Original word" : "Parola originale", + "Please wait. Calling spell checker." : "Attendere. Sto invocando lo Spell Checker.", + "Please wait: changing dictionary to" : "Attendere. Cambio il dizionario in", + "QUIT_CONFIRMATION" : "Questo annullerà le modifiche e chiuderà lo Spell Checker. Conferma.", + "Re-check" : "Ricontrolla", + "Replace all" : "Sostituisci sempre", + "Replace with" : "Stostituisci con", + "Replace" : "Sostituisci", + "SC-spell-check" : "Spell-check", + "Suggestions" : "Suggerimenti", + "pliz weit ;-)" : "Attendere Prego ;-)" +}; diff --git a/htmlarea/plugins/SpellChecker/lang/nl.js b/htmlarea/plugins/SpellChecker/lang/nl.js new file mode 100644 index 0000000..254a6b5 --- /dev/null +++ b/htmlarea/plugins/SpellChecker/lang/nl.js @@ -0,0 +1,39 @@ +// I18N constants + +// LANG: "nl", ENCODING: UTF-8 | ISO-8859-1 +// Author: A.H van den Broek http://www.kontaktfm.nl +// Email : tonbroek@kontaktfm.nl + +// FOR TRANSLATORS: +// +// 1. PLEASE PUT YOUR CONTACT INFO IN THE ABOVE LINE +// (at least a valid email address) +// +// 2. PLEASE TRY TO USE UTF-8 FOR ENCODING; +// (if this is not possible, please include a comment +// that states what encoding is necessary.) + +SpellChecker.I18N = { + "CONFIRM_LINK_CLICK" : "Weet u zeker dat u deze link wilt openen?", + "Cancel" : "Annuleer", + "Dictionary" : "Woordenboek", + "Finished list of mispelled words" : "klaar met de lijst van fouten woorden", + "I will open it in a new page." : "Ik zal het in een nieuwe pagina openen.", + "Ignore all" : "alles overslaan", + "Ignore" : "Overslaan", + "NO_ERRORS" : "Geen fouten gevonden met dit woordenboek.", + "NO_ERRORS_CLOSING" : "Spell checking is klaar, geen fouten gevonden. spell checking word gesloten...", + "OK" : "OK", + "Original word" : "Originele woord", + "Please wait. Calling spell checker." : "Even wachten. spell checker wordt geladen.", + "Please wait: changing dictionary to" : "even wachten: woordenboek wordt veranderd naar", + "QUIT_CONFIRMATION" : "Dit zal alle veranderingen annuleren en de spell checker sluiten. Weet u het zeker?", + "Re-check" : "Opnieuw", + "Replace all" : "Alles vervangen", + "Replace with" : "Vervangen met", + "Replace" : "Vervangen", + "Revert" : "Omkeren", + "SC-spell-check" : "Spell-check", + "Suggestions" : "Suggestie", + "pliz weit ;-)" : "Even wachten ;-)" +}; diff --git a/htmlarea/plugins/SpellChecker/lang/ro.js b/htmlarea/plugins/SpellChecker/lang/ro.js new file mode 100644 index 0000000..41aa63f --- /dev/null +++ b/htmlarea/plugins/SpellChecker/lang/ro.js @@ -0,0 +1,37 @@ +// I18N constants + +// LANG: "ro", ENCODING: UTF-8 +// Author: Mihai Bazon, http://dynarch.com/mishoo + +// FOR TRANSLATORS: +// +// 1. PLEASE PUT YOUR CONTACT INFO IN THE ABOVE LINE +// (at least a valid email address) +// +// 2. PLEASE TRY TO USE UTF-8 FOR ENCODING; +// (if this is not possible, please include a comment +// that states what encoding is necessary.) + +SpellChecker.I18N = { + "CONFIRM_LINK_CLICK" : "Vă rog confirmaţi că vreţi să deschideţi acest link", + "Cancel" : "Anulează", + "Dictionary" : "Dicţionar", + "Finished list of mispelled words" : "Am terminat lista de cuvinte greşite", + "I will open it in a new page." : "O voi deschide într-o altă fereastră.", + "Ignore all" : "Ignoră toate", + "Ignore" : "Ignoră", + "NO_ERRORS" : "Nu am găsit nici un cuvânt greşit cu acest dicţionar.", + "NO_ERRORS_CLOSING" : "Am terminat, nu am detectat nici o greşeală. Acum închid fereastra...", + "OK" : "OK", + "Original word" : "Cuvântul original", + "Please wait. Calling spell checker." : "Vă rog aşteptaţi. Apelez spell-checker-ul.", + "Please wait: changing dictionary to" : "Vă rog aşteptaţi. Schimb dicţionarul cu", + "QUIT_CONFIRMATION" : "Doriţi să renunţaţi la modificări şi să închid spell-checker-ul?", + "Re-check" : "Scanează", + "Replace all" : "Înlocuieşte toate", + "Replace with" : "Înlocuieşte cu", + "Replace" : "Înlocuieşte", + "SC-spell-check" : "Detectează greşeli", + "Suggestions" : "Sugestii", + "pliz weit ;-)" : "va rog ashteptatzi ;-)" +}; diff --git a/htmlarea/plugins/SpellChecker/readme-tech.html b/htmlarea/plugins/SpellChecker/readme-tech.html new file mode 100644 index 0000000..c1703ec --- /dev/null +++ b/htmlarea/plugins/SpellChecker/readme-tech.html @@ -0,0 +1,114 @@ + + + + HTMLArea Spell Checker + + + +

HTMLArea Spell Checker

+ +

The HTMLArea Spell Checker subsystem consists of the following + files:

+ +
    + +
  • spell-checker.js — the spell checker plugin interface for + HTMLArea
  • + +
  • spell-checker-ui.html — the HTML code for the user + interface
  • + +
  • spell-checker-ui.js — functionality of the user + interface
  • + +
  • spell-checker-logic.cgi — Perl CGI script that checks a text + given through POST for spelling errors
  • + +
  • spell-checker-style.css — style for mispelled words
  • + +
  • lang/en.js — main language file (English).
  • + +
+ +

Process overview

+ +

+ When an end-user clicks the "spell-check" button in the HTMLArea + editor, a new window is opened with the URL of "spell-check-ui.html". + This window initializes itself with the text found in the editor (uses + window.opener.SpellChecker.editor global variable) and it + submits the text to the server-side script "spell-check-logic.cgi". + The target of the FORM is an inline frame which is used both to + display the text and correcting. +

+ +

+ Further, spell-check-logic.cgi calls Aspell for each portion of plain + text found in the given HTML. It rebuilds an HTML file that contains + clear marks of which words are incorrect, along with suggestions for + each of them. This file is then loaded in the inline frame. Upon + loading, a JavaScript function from "spell-check-ui.js" is called. + This function will retrieve all mispelled words from the HTML of the + iframe and will setup the user interface so that it allows correction. +

+ +

The server-side script (spell-check-logic.cgi)

+ +

+ Unicode safety — the program is + Unicode safe. HTML entities are expanded into their corresponding + Unicode characters. These characters will be matched as part of the + word passed to Aspell. All texts passed to Aspell are in Unicode + (when appropriate). However, Aspell seems to not support Unicode + yet (thread concerning Aspell and Unicode). + This mean that words containing Unicode + characters that are not in 0..255 are likely to be reported as "mispelled" by Aspell. +

+ +

+ Update: though I've never seen it mentioned + anywhere, it looks that Aspell does, in fact, speak + Unicode. Or else, maybe Text::Aspell does + transparent conversion; anyway, this new version of our + SpellChecker plugin is, as tests show so far, fully + Unicode-safe... well, probably the only freeware + Web-based spell-checker which happens to have Unicode support. +

+ +

+ The Perl Unicode manual (man perluniintro) states: +

+ +
+ + Starting from Perl 5.6.0, Perl has had the capacity to handle Unicode + natively. Perl 5.8.0, however, is the first recommended release for + serious Unicode work. The maintenance release 5.6.1 fixed many of the + problems of the initial Unicode implementation, but for example regular + expressions still do not work with Unicode in 5.6.1. + +
+ +

In other words, do not assume that this script is + Unicode-safe on Perl interpreters older than 5.8.0.

+ +

The following Perl modules are required:

+ + + +

Of these, only Text::Aspell might need to be installed manually. The + others are likely to be available by default in most Perl distributions.

+ +
+
Mihai Bazon
+ + Last modified: Fri Jan 30 19:14:11 EET 2004 + + + diff --git a/htmlarea/plugins/SpellChecker/spell-check-logic.cgi b/htmlarea/plugins/SpellChecker/spell-check-logic.cgi new file mode 100644 index 0000000..6c68f24 --- /dev/null +++ b/htmlarea/plugins/SpellChecker/spell-check-logic.cgi @@ -0,0 +1,210 @@ +#! /usr/bin/perl -w + +# Spell Checker Plugin for HTMLArea-3.0 +# Sponsored by www.americanbible.org +# Implementation by Mihai Bazon, http://dynarch.com/mishoo/ +# +# (c) dynarch.com 2003. +# Distributed under the same terms as HTMLArea itself. +# This notice MUST stay intact for use (see license.txt). +# +# $Id$ + +use strict; +use utf8; +use Encode; +use Text::Aspell; +use XML::DOM; +use CGI; + +my $TIMER_start = undef; +eval { + use Time::HiRes qw( gettimeofday tv_interval ); + $TIMER_start = [gettimeofday()]; +}; +# use POSIX qw( locale_h ); + +binmode STDIN, ':utf8'; +binmode STDOUT, ':utf8'; + +my $debug = 0; + +my $speller = new Text::Aspell; +my $cgi = new CGI; + +my $total_words = 0; +my $total_mispelled = 0; +my $total_suggestions = 0; +my $total_words_suggested = 0; + +# FIXME: report a nice error... +die "Can't create speller!" unless $speller; + +my $dict = $cgi->param('dictionary') || $cgi->cookie('dictionary') || 'en'; + +# add configurable option for this +$speller->set_option('lang', $dict); +$speller->set_option('encoding', 'UTF-8'); +#setlocale(LC_CTYPE, $dict); + +# ultra, fast, normal, bad-spellers +# bad-spellers seems to cause segmentation fault +$speller->set_option('sug-mode', 'normal'); + +my %suggested_words = (); +keys %suggested_words = 128; + +my $file_content = decode('UTF-8', $cgi->param('content')); +$file_content = parse_with_dom($file_content); + +my $ck_dictionary = $cgi->cookie(-name => 'dictionary', + -value => $dict, + -expires => '+30d'); + +print $cgi->header(-type => 'text/html; charset: utf-8', + -cookie => $ck_dictionary); + +my $js_suggested_words = make_js_hash(\%suggested_words); +my $js_spellcheck_info = make_js_hash_from_array + ([ + [ 'Total words' , $total_words ], + [ 'Mispelled words' , $total_mispelled . ' in dictionary \"'.$dict.'\"' ], + [ 'Total suggestions' , $total_suggestions ], + [ 'Total words suggested' , $total_words_suggested ], + [ 'Spell-checked in' , defined $TIMER_start ? (tv_interval($TIMER_start) . ' seconds') : 'n/a' ] + ]); + +print qq^ + + + + + + +^; + +print $file_content; +if ($cgi->param('init') eq '1') { + my @dicts = $speller->dictionary_info(); + my $dictionaries = ''; + foreach my $i (@dicts) { + next if $i->{jargon}; + my $name = $i->{name}; + if ($name eq $dict) { + $name = '@'.$name; + } + $dictionaries .= ',' . $name; + } + $dictionaries =~ s/^,//; + print qq^
$dictionaries
^; +} + +print ''; + +# Perl is beautiful. +sub spellcheck { + my $node = shift; + my $doc = $node->getOwnerDocument; + my $check = sub { # called for each word in the text + # input is in UTF-8 + my $word = shift; + my $already_suggested = defined $suggested_words{$word}; + ++$total_words; + if (!$already_suggested && $speller->check($word)) { + return undef; + } else { + # we should have suggestions; give them back to browser in UTF-8 + ++$total_mispelled; + if (!$already_suggested) { + # compute suggestions for this word + my @suggestions = $speller->suggest($word); + my $suggestions = decode($speller->get_option('encoding'), join(',', @suggestions)); + $suggested_words{$word} = $suggestions; + ++$total_suggestions; + $total_words_suggested += scalar @suggestions; + } + # HA-spellcheck-error + my $err = $doc->createElement('span'); + $err->setAttribute('class', 'HA-spellcheck-error'); + my $tmp = $doc->createTextNode; + $tmp->setNodeValue($word); + $err->appendChild($tmp); + return $err; + } + }; + while ($node->getNodeValue =~ /([\p{IsWord}']+)/) { + my $word = $1; + my $before = $`; + my $after = $'; + my $df = &$check($word); + if (!$df) { + $before .= $word; + } + { + my $parent = $node->getParentNode; + my $n1 = $doc->createTextNode; + $n1->setNodeValue($before); + $parent->insertBefore($n1, $node); + $parent->insertBefore($df, $node) if $df; + $node->setNodeValue($after); + } + } +}; + +sub check_inner_text { + my $node = shift; + my $text = ''; + for (my $i = $node->getFirstChild; defined $i; $i = $i->getNextSibling) { + if ($i->getNodeType == TEXT_NODE) { + spellcheck($i); + } + } +}; + +sub parse_with_dom { + my ($text) = @_; + $text = ''.$text.''; + + my $parser = new XML::DOM::Parser; + if ($debug) { + open(FOO, '>:utf8', '/tmp/foo'); + print FOO $text; + close FOO; + } + my $doc = $parser->parse($text); + my $nodes = $doc->getElementsByTagName('*'); + my $n = $nodes->getLength; + + for (my $i = 0; $i < $n; ++$i) { + my $node = $nodes->item($i); + if ($node->getNodeType == ELEMENT_NODE) { + check_inner_text($node); + } + } + + my $ret = $doc->toString; + $ret =~ s{(.*)}{$1}sg; + return $ret; +}; + +sub make_js_hash { + my ($hash) = @_; + my $js_hash = ''; + while (my ($key, $val) = each %$hash) { + $js_hash .= ',' if $js_hash; + $js_hash .= '"'.$key.'":"'.$val.'"'; + } + return $js_hash; +}; + +sub make_js_hash_from_array { + my ($array) = @_; + my $js_hash = ''; + foreach my $i (@$array) { + $js_hash .= ',' if $js_hash; + $js_hash .= '"'.$i->[0].'":"'.$i->[1].'"'; + } + return $js_hash; +}; diff --git a/htmlarea/plugins/SpellChecker/spell-check-style.css b/htmlarea/plugins/SpellChecker/spell-check-style.css new file mode 100644 index 0000000..ef3874f --- /dev/null +++ b/htmlarea/plugins/SpellChecker/spell-check-style.css @@ -0,0 +1,10 @@ +.HA-spellcheck-error { border-bottom: 1px dashed #f00; cursor: default; } +.HA-spellcheck-same { background-color: #cef; color: #000; } +.HA-spellcheck-hover { background-color: #433; color: white; } +.HA-spellcheck-fixed { border-bottom: 1px dashed #0b8; } +.HA-spellcheck-current { background-color: #9be; color: #000; } +.HA-spellcheck-suggestions { display: none; } + +#HA-spellcheck-dictionaries { display: none; } + +a:link, a:visited { color: #55e; } diff --git a/htmlarea/plugins/SpellChecker/spell-check-ui.html b/htmlarea/plugins/SpellChecker/spell-check-ui.html new file mode 100644 index 0000000..322aa68 --- /dev/null +++ b/htmlarea/plugins/SpellChecker/spell-check-ui.html @@ -0,0 +1,122 @@ + + + + + Spell Checker + + + + + + + + + +
+ + + + + + + + + + + + + +
+
Dictionary + + +
+ Please wait. Calling spell checker. +
+
+ +
+
Original word
+
pliz weit ;-)
+
+ +
+
Replace with
+
+
+
+
+
+
+
Suggestions
+
+ +
+
+ +
+
+ + +
+
+
+ + + + diff --git a/htmlarea/plugins/SpellChecker/spell-check-ui.js b/htmlarea/plugins/SpellChecker/spell-check-ui.js new file mode 100644 index 0000000..618ed45 --- /dev/null +++ b/htmlarea/plugins/SpellChecker/spell-check-ui.js @@ -0,0 +1,397 @@ +// Spell Checker Plugin for HTMLArea-3.0 +// Sponsored by www.americanbible.org +// Implementation by Mihai Bazon, http://dynarch.com/mishoo/ +// +// (c) dynarch.com 2003-2005. +// Distributed under the same terms as HTMLArea itself. +// This notice MUST stay intact for use (see license.txt). +// +// $Id$ + +// internationalization file was already loaded in parent ;-) +var SpellChecker = window.opener.SpellChecker; +var i18n = SpellChecker.I18N; + +var HTMLArea = window.opener.HTMLArea; +var is_ie = HTMLArea.is_ie; +var editor = SpellChecker.editor; +var frame = null; +var currentElement = null; +var wrongWords = null; +var modified = false; +var allWords = {}; +var fixedWords = []; +var suggested_words = {}; + +function makeCleanDoc(leaveFixed) { + // document.getElementById("status").innerHTML = 'Please wait: rendering valid HTML'; + var words = wrongWords.concat(fixedWords); + for (var i = words.length; --i >= 0;) { + var el = words[i]; + if (!(leaveFixed && /HA-spellcheck-fixed/.test(el.className))) { + el.parentNode.insertBefore(el.firstChild, el); + el.parentNode.removeChild(el); + } else + el.className = "HA-spellcheck-fixed"; + } + // we should use innerHTML here, but IE6's implementation fucks up the + // HTML to such extent that our poor Perl parser doesn't understand it + // anymore. + return window.opener.HTMLArea.getHTML(frame.contentWindow.document.body, false, editor); +}; + +function recheckClicked() { + document.getElementById("status").innerHTML = i18n["Please wait: changing dictionary to"] + ': "' + document.getElementById("f_dictionary").value + '".'; + var field = document.getElementById("f_content"); + field.value = makeCleanDoc(true); + field.form.submit(); +}; + +function saveClicked() { + if (modified) { + editor.setHTML(makeCleanDoc(false)); + } + window.close(); + return false; +}; + +function cancelClicked() { + var ok = true; + if (modified) { + ok = confirm(i18n["QUIT_CONFIRMATION"]); + } + if (ok) { + window.close(); + } + return false; +}; + +function replaceWord(el) { + var replacement = document.getElementById("v_replacement").value; + var this_word_modified = (el.innerHTML != replacement); + if (this_word_modified) + modified = true; + if (el) { + el.className = el.className.replace(/\s*HA-spellcheck-(hover|fixed)\s*/g, " "); + } + el.className += " HA-spellcheck-fixed"; + el.__msh_fixed = true; + if (!this_word_modified) { + return false; + } + el.innerHTML = replacement; +}; + +function replaceClicked() { + replaceWord(currentElement); + var start = currentElement.__msh_id; + var index = start; + do { + ++index; + if (index == wrongWords.length) { + index = 0; + } + } while ((index != start) && wrongWords[index].__msh_fixed); + if (index == start) { + index = 0; + alert(i18n["Finished list of mispelled words"]); + } + wrongWords[index].__msh_wordClicked(true); + return false; +}; + +function revertClicked() { + document.getElementById("v_replacement").value = currentElement.__msh_origWord; + replaceWord(currentElement); + currentElement.className = "HA-spellcheck-error HA-spellcheck-current"; + return false; +}; + +function replaceAllClicked() { + var replacement = document.getElementById("v_replacement").value; + var ok = true; + var spans = allWords[currentElement.__msh_origWord]; + if (spans.length == 0) { + alert("An impossible condition just happened. Call FBI. ;-)"); + } else if (spans.length == 1) { + replaceClicked(); + return false; + } + /* + var message = "The word \"" + currentElement.__msh_origWord + "\" occurs " + spans.length + " times.\n"; + if (replacement == currentElement.__msh_origWord) { + ok = confirm(message + "Ignore all occurrences?"); + } else { + ok = confirm(message + "Replace all occurrences with \"" + replacement + "\"?"); + } + */ + if (ok) { + for (var i = 0; i < spans.length; ++i) { + if (spans[i] != currentElement) { + replaceWord(spans[i]); + } + } + // replace current element the last, so that we jump to the next word ;-) + replaceClicked(); + } + return false; +}; + +function ignoreClicked() { + document.getElementById("v_replacement").value = currentElement.__msh_origWord; + replaceClicked(); + return false; +}; + +function ignoreAllClicked() { + document.getElementById("v_replacement").value = currentElement.__msh_origWord; + replaceAllClicked(); + return false; +}; + +function learnClicked() { + alert("Not [yet] implemented"); + return false; +}; + +function internationalizeWindow() { + var types = ["div", "span", "button"]; + for (var i = 0; i < types.length; ++i) { + var tag = types[i]; + var els = document.getElementsByTagName(tag); + for (var j = els.length; --j >= 0;) { + var el = els[j]; + if (el.childNodes.length == 1 && /\S/.test(el.innerHTML)) { + var txt = el.innerHTML; + if (typeof i18n[txt] != "undefined") { + el.innerHTML = i18n[txt]; + } + } + } + } +}; + +function initDocument() { + internationalizeWindow(); + modified = false; + frame = document.getElementById("i_framecontent"); + var field = document.getElementById("f_content"); + field.value = HTMLArea.getHTML(editor._doc.body, false, editor); + field.form.submit(); + document.getElementById("f_init").value = "0"; + + // assign some global event handlers + + var select = document.getElementById("v_suggestions"); + select.onchange = function() { + document.getElementById("v_replacement").value = this.value; + }; + if (is_ie) { + select.attachEvent("ondblclick", replaceClicked); + } else { + select.addEventListener("dblclick", replaceClicked, true); + } + + document.getElementById("b_replace").onclick = replaceClicked; + // document.getElementById("b_learn").onclick = learnClicked; + document.getElementById("b_replall").onclick = replaceAllClicked; + document.getElementById("b_ignore").onclick = ignoreClicked; + document.getElementById("b_ignall").onclick = ignoreAllClicked; + document.getElementById("b_recheck").onclick = recheckClicked; + document.getElementById("b_revert").onclick = revertClicked; + document.getElementById("b_info").onclick = displayInfo; + + document.getElementById("b_ok").onclick = saveClicked; + document.getElementById("b_cancel").onclick = cancelClicked; + + select = document.getElementById("v_dictionaries"); + select.onchange = function() { + document.getElementById("f_dictionary").value = this.value; + }; +}; + +function getAbsolutePos(el) { + var r = { x: el.offsetLeft, y: el.offsetTop }; + if (el.offsetParent) { + var tmp = getAbsolutePos(el.offsetParent); + r.x += tmp.x; + r.y += tmp.y; + } + return r; +}; + +function wordClicked(scroll) { + var self = this; + if (scroll) (function() { + var pos = getAbsolutePos(self); + var ws = { x: frame.offsetWidth - 4, + y: frame.offsetHeight - 4 }; + var wp = { x: frame.contentWindow.document.body.scrollLeft, + y: frame.contentWindow.document.body.scrollTop }; + pos.x -= Math.round(ws.x/2); + if (pos.x < 0) pos.x = 0; + pos.y -= Math.round(ws.y/2); + if (pos.y < 0) pos.y = 0; + frame.contentWindow.scrollTo(pos.x, pos.y); + })(); + if (currentElement) { + var a = allWords[currentElement.__msh_origWord]; + currentElement.className = currentElement.className.replace(/\s*HA-spellcheck-current\s*/g, " "); + for (var i = 0; i < a.length; ++i) { + var el = a[i]; + if (el != currentElement) { + el.className = el.className.replace(/\s*HA-spellcheck-same\s*/g, " "); + } + } + } + currentElement = this; + this.className += " HA-spellcheck-current"; + var a = allWords[currentElement.__msh_origWord]; + for (var i = 0; i < a.length; ++i) { + var el = a[i]; + if (el != currentElement) { + el.className += " HA-spellcheck-same"; + } + } + // document.getElementById("b_replall").disabled = (a.length <= 1); + // document.getElementById("b_ignall").disabled = (a.length <= 1); + var txt; + if (a.length == 1) { + txt = "one occurrence"; + } else if (a.length == 2) { + txt = "two occurrences"; + } else { + txt = a.length + " occurrences"; + } + var suggestions = suggested_words[this.__msh_origWord]; + if (suggestions) + suggestions = suggestions.split(/,/); + else + suggestions = []; + var select = document.getElementById("v_suggestions"); + document.getElementById("statusbar").innerHTML = "Found " + txt + + ' for word "' + currentElement.__msh_origWord + '"'; + for (var i = select.length; --i >= 0;) { + select.remove(i); + } + for (var i = 0; i < suggestions.length; ++i) { + var txt = suggestions[i]; + var option = document.createElement("option"); + option.value = txt; + option.appendChild(document.createTextNode(txt)); + select.appendChild(option); + } + document.getElementById("v_currentWord").innerHTML = this.__msh_origWord; + if (suggestions.length > 0) { + select.selectedIndex = 0; + select.onchange(); + } else { + document.getElementById("v_replacement").value = this.innerHTML; + } + select.style.display = "none"; + select.style.display = "block"; + return false; +}; + +function wordMouseOver() { + this.className += " HA-spellcheck-hover"; +}; + +function wordMouseOut() { + this.className = this.className.replace(/\s*HA-spellcheck-hover\s*/g, " "); +}; + +function displayInfo() { + var info = frame.contentWindow.spellcheck_info; + if (!info) + alert("No information available"); + else { + var txt = "** Document information **"; + for (var i in info) { + txt += "\n" + i + " : " + info[i]; + } + alert(txt); + } + return false; +}; + +function finishedSpellChecking() { + // initialization of global variables + currentElement = null; + wrongWords = null; + allWords = {}; + fixedWords = []; + suggested_words = frame.contentWindow.suggested_words; + + document.getElementById("status").innerHTML = "HTMLArea Spell Checker (info)"; + var doc = frame.contentWindow.document; + var spans = doc.getElementsByTagName("span"); + var sps = []; + var id = 0; + for (var i = 0; i < spans.length; ++i) { + var el = spans[i]; + if (/HA-spellcheck-error/.test(el.className)) { + sps.push(el); + el.__msh_wordClicked = wordClicked; + el.onclick = function(ev) { + ev || (ev = window.event); + ev && HTMLArea._stopEvent(ev); + return this.__msh_wordClicked(false); + }; + el.onmouseover = wordMouseOver; + el.onmouseout = wordMouseOut; + el.__msh_id = id++; + var txt = (el.__msh_origWord = el.firstChild.data); + el.__msh_fixed = false; + if (typeof allWords[txt] == "undefined") { + allWords[txt] = [el]; + } else { + allWords[txt].push(el); + } + } else if (/HA-spellcheck-fixed/.test(el.className)) { + fixedWords.push(el); + } + } + wrongWords = sps; + if (sps.length == 0) { + if (!modified) { + alert(i18n["NO_ERRORS_CLOSING"]); + window.close(); + } else { + alert(i18n["NO_ERRORS"]); + } + return false; + } + (currentElement = sps[0]).__msh_wordClicked(true); + var as = doc.getElementsByTagName("a"); + for (var i = as.length; --i >= 0;) { + var a = as[i]; + a.onclick = function() { + if (confirm(i18n["CONFIRM_LINK_CLICK"] + ":\n" + + this.href + "\n" + i18n["I will open it in a new page."])) { + window.open(this.href); + } + return false; + }; + } + var dicts = doc.getElementById("HA-spellcheck-dictionaries"); + if (dicts) { + dicts.parentNode.removeChild(dicts); + dicts = dicts.innerHTML.split(/,/); + var select = document.getElementById("v_dictionaries"); + for (var i = select.length; --i >= 0;) { + select.remove(i); + } + for (var i = 0; i < dicts.length; ++i) { + var txt = dicts[i]; + var option = document.createElement("option"); + if (/^@(.*)$/.test(txt)) { + txt = RegExp.$1; + option.selected = true; + } + option.value = txt; + option.appendChild(document.createTextNode(txt)); + select.appendChild(option); + } + } +}; diff --git a/htmlarea/plugins/SpellChecker/spell-checker.js b/htmlarea/plugins/SpellChecker/spell-checker.js new file mode 100644 index 0000000..cc2cb10 --- /dev/null +++ b/htmlarea/plugins/SpellChecker/spell-checker.js @@ -0,0 +1,79 @@ +// Spell Checker Plugin for HTMLArea-3.0 +// Sponsored by www.americanbible.org +// Implementation by Mihai Bazon, http://dynarch.com/mishoo/ +// +// (c) dynarch.com 2003-2005. +// Distributed under the same terms as HTMLArea itself. +// This notice MUST stay intact for use (see license.txt). +// +// $Id$ + +function SpellChecker(editor) { + this.editor = editor; + + var cfg = editor.config; + var tt = SpellChecker.I18N; + var bl = SpellChecker.btnList; + var self = this; + + // register the toolbar buttons provided by this plugin + var toolbar = []; + for (var i = 0; i < bl.length; ++i) { + var btn = bl[i]; + if (!btn) { + toolbar.push("separator"); + } else { + var id = "SC-" + btn[0]; + cfg.registerButton(id, tt[id], editor.imgURL(btn[0] + ".gif", "SpellChecker"), false, + function(editor, id) { + // dispatch button press event + self.buttonPress(editor, id); + }, btn[1]); + toolbar.push(id); + } + } + + for (var i = 0; i < toolbar.length; ++i) { + cfg.toolbar[0].push(toolbar[i]); + } +}; + +SpellChecker._pluginInfo = { + name : "SpellChecker", + version : "1.0", + developer : "Mihai Bazon", + developer_url : "http://dynarch.com/mishoo/", + c_owner : "Mihai Bazon", + sponsor : "American Bible Society", + sponsor_url : "http://www.americanbible.org", + license : "htmlArea" +}; + +SpellChecker.btnList = [ + null, // separator + ["spell-check"] + ]; + +SpellChecker.prototype.buttonPress = function(editor, id) { + switch (id) { + case "SC-spell-check": + SpellChecker.editor = editor; + SpellChecker.init = true; + var uiurl = _editor_url + "plugins/SpellChecker/spell-check-ui.html"; + var win; + if (HTMLArea.is_ie) { + win = window.open(uiurl, "SC_spell_checker", + "toolbar=no,location=no,directories=no,status=no,menubar=no," + + "scrollbars=no,resizable=yes,width=600,height=450"); + } else { + win = window.open(uiurl, "SC_spell_checker", + "toolbar=no,menubar=no,personalbar=no,width=600,height=450," + + "scrollbars=no,resizable=yes"); + } + win.focus(); + break; + } +}; + +// this needs to be global, it's accessed from spell-check-ui.html +SpellChecker.editor = null; diff --git a/htmlarea/plugins/TableOperations/img/cell-delete.gif b/htmlarea/plugins/TableOperations/img/cell-delete.gif new file mode 100644 index 0000000..df9594f Binary files /dev/null and b/htmlarea/plugins/TableOperations/img/cell-delete.gif differ diff --git a/htmlarea/plugins/TableOperations/img/cell-insert-after.gif b/htmlarea/plugins/TableOperations/img/cell-insert-after.gif new file mode 100644 index 0000000..6ff2154 Binary files /dev/null and b/htmlarea/plugins/TableOperations/img/cell-insert-after.gif differ diff --git a/htmlarea/plugins/TableOperations/img/cell-insert-before.gif b/htmlarea/plugins/TableOperations/img/cell-insert-before.gif new file mode 100644 index 0000000..632b315 Binary files /dev/null and b/htmlarea/plugins/TableOperations/img/cell-insert-before.gif differ diff --git a/htmlarea/plugins/TableOperations/img/cell-merge.gif b/htmlarea/plugins/TableOperations/img/cell-merge.gif new file mode 100644 index 0000000..35e4af1 Binary files /dev/null and b/htmlarea/plugins/TableOperations/img/cell-merge.gif differ diff --git a/htmlarea/plugins/TableOperations/img/cell-prop.gif b/htmlarea/plugins/TableOperations/img/cell-prop.gif new file mode 100644 index 0000000..2f71bae Binary files /dev/null and b/htmlarea/plugins/TableOperations/img/cell-prop.gif differ diff --git a/htmlarea/plugins/TableOperations/img/cell-split.gif b/htmlarea/plugins/TableOperations/img/cell-split.gif new file mode 100644 index 0000000..8bd011e Binary files /dev/null and b/htmlarea/plugins/TableOperations/img/cell-split.gif differ diff --git a/htmlarea/plugins/TableOperations/img/col-delete.gif b/htmlarea/plugins/TableOperations/img/col-delete.gif new file mode 100644 index 0000000..565afdc Binary files /dev/null and b/htmlarea/plugins/TableOperations/img/col-delete.gif differ diff --git a/htmlarea/plugins/TableOperations/img/col-insert-after.gif b/htmlarea/plugins/TableOperations/img/col-insert-after.gif new file mode 100644 index 0000000..648e54f Binary files /dev/null and b/htmlarea/plugins/TableOperations/img/col-insert-after.gif differ diff --git a/htmlarea/plugins/TableOperations/img/col-insert-before.gif b/htmlarea/plugins/TableOperations/img/col-insert-before.gif new file mode 100644 index 0000000..9be8a6e Binary files /dev/null and b/htmlarea/plugins/TableOperations/img/col-insert-before.gif differ diff --git a/htmlarea/plugins/TableOperations/img/col-split.gif b/htmlarea/plugins/TableOperations/img/col-split.gif new file mode 100644 index 0000000..83f21d1 Binary files /dev/null and b/htmlarea/plugins/TableOperations/img/col-split.gif differ diff --git a/htmlarea/plugins/TableOperations/img/row-delete.gif b/htmlarea/plugins/TableOperations/img/row-delete.gif new file mode 100644 index 0000000..e649d9f Binary files /dev/null and b/htmlarea/plugins/TableOperations/img/row-delete.gif differ diff --git a/htmlarea/plugins/TableOperations/img/row-insert-above.gif b/htmlarea/plugins/TableOperations/img/row-insert-above.gif new file mode 100644 index 0000000..e39c948 Binary files /dev/null and b/htmlarea/plugins/TableOperations/img/row-insert-above.gif differ diff --git a/htmlarea/plugins/TableOperations/img/row-insert-under.gif b/htmlarea/plugins/TableOperations/img/row-insert-under.gif new file mode 100644 index 0000000..2005358 Binary files /dev/null and b/htmlarea/plugins/TableOperations/img/row-insert-under.gif differ diff --git a/htmlarea/plugins/TableOperations/img/row-prop.gif b/htmlarea/plugins/TableOperations/img/row-prop.gif new file mode 100644 index 0000000..7639725 Binary files /dev/null and b/htmlarea/plugins/TableOperations/img/row-prop.gif differ diff --git a/htmlarea/plugins/TableOperations/img/row-split.gif b/htmlarea/plugins/TableOperations/img/row-split.gif new file mode 100644 index 0000000..0df4697 Binary files /dev/null and b/htmlarea/plugins/TableOperations/img/row-split.gif differ diff --git a/htmlarea/plugins/TableOperations/img/table-prop.gif b/htmlarea/plugins/TableOperations/img/table-prop.gif new file mode 100644 index 0000000..e15a4a4 Binary files /dev/null and b/htmlarea/plugins/TableOperations/img/table-prop.gif differ diff --git a/htmlarea/plugins/TableOperations/lang/cz.js b/htmlarea/plugins/TableOperations/lang/cz.js new file mode 100644 index 0000000..47de146 --- /dev/null +++ b/htmlarea/plugins/TableOperations/lang/cz.js @@ -0,0 +1,90 @@ +// I18N constants + +// LANG: "cz", ENCODING: UTF-8 | ISO-8859-2 +// Author: Jiri Löw, + +// FOR TRANSLATORS: +// +// 1. PLEASE PUT YOUR CONTACT INFO IN THE ABOVE LINE +// (at least a valid email address) +// +// 2. PLEASE TRY TO USE UTF-8 FOR ENCODING; +// (if this is not possible, please include a comment +// that states what encoding is necessary.) + +TableOperations.I18N = { + "Align": "Zarovnání", + "All four sides": "Všechny čtyři strany", + "Background": "Pozadí", + "Baseline": "Základní linka", + "Border": "Obrys", + "Borders": "Obrysy", + "Bottom": "Dolů", + "CSS Style": "Kaskádové styly (CSS)", + "Caption": "Titulek", + "Cell Properties": "Vlastnosti buňky", + "Center": "Na střed", + "Char": "Znak", + "Collapsed borders": "Stlačené okraje", + "Color": "Barva", + "Description": "Popis", + "FG Color": "Barva popředí", + "Float": "Obtékání", + "Frames": "Rámečky", + "Height": "Výška", + "How many columns would you like to merge?": "Kolik sloupců si přejete spojit?", + "How many rows would you like to merge?": "Kolik řádků si přejete spojit?", + "Image URL": "Adresa obrázku", + "Justify": "Do stran", + "Layout": "Rozložení", + "Left": "Vlevo", + "Margin": "Okraj", + "Middle": "Na střed", + "No rules": "Žádné čáry", + "No sides": "Žádné strany", + "None": "Žádné", + "Padding": "Odsazování", + "Please click into some cell": "Prosím klikněte do některé buňky", + "Right": "Vpravo", + "Row Properties": "Vlastnosti řádku", + "Rules will appear between all rows and columns": "Čáry mezi všemi řádky i sloupci", + "Rules will appear between columns only": "Čáry pouze mezi sloupci", + "Rules will appear between rows only": "Čáry pouze mezi řádky", + "Rules": "Čáry", + "Spacing and padding": "Mezery a odsazování", + "Spacing": "Mezery", + "Summary": "Shrnutí", + "TO-cell-delete": "Smazat buňku", + "TO-cell-insert-after": "Vložit buňku za", + "TO-cell-insert-before": "Vložit buňku před", + "TO-cell-merge": "Spojit buňky", + "TO-cell-prop": "Vlastnosti buňky", + "TO-cell-split": "Rozdělit buňku", + "TO-col-delete": "Smazat sloupec", + "TO-col-insert-after": "Vložit sloupec za", + "TO-col-insert-before": "Vložit sloupec před", + "TO-col-split": "Rozdělit sloupec", + "TO-row-delete": "Smazat řádek", + "TO-row-insert-above": "Smazat řádek nad", + "TO-row-insert-under": "Smazat řádek pod", + "TO-row-prop": "Vlastnosti řádku", + "TO-row-split": "Rozdělit řádek", + "TO-table-prop": "Vlastnosti tabulky", + "Table Properties": "Vlastnosti tabulky", + "Text align": "Zarovnání textu", + "The bottom side only": "Pouze spodní strana", + "The left-hand side only": "Pouze levá strana", + "The right and left sides only": "Pouze levá a pravá strana", + "The right-hand side only": "Pouze pravá strana", + "The top and bottom sides only": "Pouze horní a dolní strana", + "The top side only": "Pouze horní strana", + "Top": "Nahoru", + "Unset color": "Zrušit barvu", + "Vertical align": "Svislé zarovnání", + "Width": "Šířka", + "not-del-last-cell": "HTMLArea zbaběle odmítá smazat poslední buňku v řádku.", + "not-del-last-col": "HTMLArea zbaběle odmítá smazat poslední sloupec v tabulce.", + "not-del-last-row": "HTMLArea zbaběle odmítá smazat poslední řádek v tabulce.", + "percent": "procent", + "pixels": "pixelů" +}; diff --git a/htmlarea/plugins/TableOperations/lang/da.js b/htmlarea/plugins/TableOperations/lang/da.js new file mode 100644 index 0000000..bae8d1e --- /dev/null +++ b/htmlarea/plugins/TableOperations/lang/da.js @@ -0,0 +1,90 @@ +// I18N constants + +// LANG: "da", ENCODING: UTF-8 | ISO-8859-1 +// Author: Steen Sønderup, + +// FOR TRANSLATORS: +// +// 1. PLEASE PUT YOUR CONTACT INFO IN THE ABOVE LINE +// (at least a valid email address) +// +// 2. PLEASE TRY TO USE UTF-8 FOR ENCODING; +// (if this is not possible, please include a comment +// that states what encoding is necessary.) + +TableOperations.I18N = { + "Align": "Placer", + "All four sides": "Alle fire sider", + "Background": "Baggrund", + "Baseline": "Bundlinie", + "Border": "Kant", + "Borders": "Kanter", + "Bottom": "Bund", + "CSS Style": "Stil [CSS]", + "Caption": "Titel", + "Cell Properties": "Celle egenskaber", + "Center": "Centrer", + "Char": "Plads", + "Collapsed borders": "Sammensmelt rammer", + "Color": "Farve", + "Description": "Beskrivelse", + "FG Color": "Font farve", + "Float": "Justering", + "Frames": "Udvendig", + "Height": "Højde", + "How many columns would you like to merge?": "Hvor mange kollonner vil du samle?", + "How many rows would you like to merge?": "Hvor mange rækker vil du samle?", + "Image URL": "Billede URL", + "Justify": "Lige margener", + "Layout": "Opsætning", + "Left": "Venstre", + "Margin": "Margen", + "Middle": "Centrer", + "No rules": "Ingen rammer", + "No sides": "Ingen sider", + "None": "Ingen", + "Padding": "Margen", + "Please click into some cell": "Klik på en celle", + "Right": "Højre", + "Row Properties": "Række egenskaber", + "Rules will appear between all rows and columns": "Rammer mellem rækker og kolonner", + "Rules will appear between columns only": "Kun rammer mellem kolonner", + "Rules will appear between rows only": "Kun rammer mellem rækker", + "Rules": "Invendig", + "Spacing and padding": "Afstand og margen", + "Spacing": "Afstand", + "Summary": "Beskrivelse", + "TO-cell-delete": "Slet celle", + "TO-cell-insert-after": "Indsæt celle efter", + "TO-cell-insert-before": "Indsæt celle før", + "TO-cell-merge": "Sammensæt celler", + "TO-cell-prop": "Celle egenskaber", + "TO-cell-split": "Opdel celle", + "TO-col-delete": "Slet kollonne", + "TO-col-insert-after": "Indsæt kolonne efter", + "TO-col-insert-before": "Indsæt kolonne før", + "TO-col-split": "Opdel kolonne", + "TO-row-delete": "Slet række", + "TO-row-insert-above": "Indsæt række før", + "TO-row-insert-under": "Indsæt række efter", + "TO-row-prop": "Række egenskaber", + "TO-row-split": "Opdel række", + "TO-table-prop": "Tabel egenskaber", + "Table Properties": "Tabel egenskaber", + "Text align": "Tekst", + "The bottom side only": "Kun i bunden", + "The left-hand side only": "Kun i højre side", + "The right and left sides only": "Kun i siderne", + "The right-hand side only": "Kun i venstre side", + "The top and bottom sides only": "Kun i top og bund", + "The top side only": "Kun i toppen", + "Top": "Top", + "Unset color": "Farve ikke valgt", + "Vertical align": "Vertikal placering", + "Width": "Bredde", + "not-del-last-cell": "Du kan ikke slette den sidste celle i en række.", + "not-del-last-col": "Du kan ikke slette den sidste kolonne i en tabel.", + "not-del-last-row": "Du kan ikke slette den sidste række i en tabel.", + "percent": "procent", + "pixels": "pixel" +}; diff --git a/htmlarea/plugins/TableOperations/lang/de.js b/htmlarea/plugins/TableOperations/lang/de.js new file mode 100644 index 0000000..8730518 --- /dev/null +++ b/htmlarea/plugins/TableOperations/lang/de.js @@ -0,0 +1,81 @@ +// I18N constants + +// LANG: "de", ENCODING: UTF-8 | ISO-8859-1 +// Author: broxx, + +TableOperations.I18N = { + "Align": "Ausrichten", + "All four sides": "Alle 4 Seiten", + "Background": "Hintergrund", + "Baseline": "Basislinie", + "Border": "Rand", + "Borders": "Raender", + "Bottom": "Unten", + "CSS Style": "Style [CSS]", + "Caption": "Ueberschrift", + "Cell Properties": "Zellen", + "Center": "Zentrieren", + "Char": "Zeichen", + "Collapsed borders": "Collapsed borders", + "Color": "Farbe", + "Description": "Beschreibung", + "FG Color": "FG Farbe", + "Float": "Ausrichtung", + "Frames": "Rahmen", + "Height": "Hoehe", + "How many columns would you like to merge?": "Wieviele Spalten willst du verbinden?", + "How many rows would you like to merge?": "Wieviele Zeilen willst du verbinden?", + "Image URL": "Bild URL", + "Justify": "Justieren", + "Layout": "Layout", + "Left": "Links", + "Margin": "Rand", + "Middle": "Mitte", + "No rules": "Keine Balken", + "No sides": "Keine Seiten", + "None": "Keine", + "Padding": "Auffuellung", + "Please click into some cell": "Waehle eine Zelle", + "Right": "Rechts", + "Row Properties": "Reihen", + "Rules will appear between all rows and columns": "Balken zwischen Reihen und Spalten", + "Rules will appear between columns only": "Balken zwischen Spalten", + "Rules will appear between rows only": "Balken zwischen Reihen", + "Rules": "Balken", + "Spacing and padding": "Abstaende", + "Spacing": "Abstand", + "Summary": "Zusammenfassung", + "TO-cell-delete": "Zelle loeschen", + "TO-cell-insert-after": "Zelle einfuegen nach", + "TO-cell-insert-before": "Zelle einfuegen bevor", + "TO-cell-merge": "Zellen zusammenfuegen", + "TO-cell-prop": "Zelleinstellungen", + "TO-cell-split": "Zellen aufteilen", + "TO-col-delete": "Spalte loeschen", + "TO-col-insert-after": "Spalte einfuegen nach", + "TO-col-insert-before": "Spalte einfuegen bevor", + "TO-col-split": "Spalte aufteilen", + "TO-row-delete": "Reihe loeschen", + "TO-row-insert-above": "Reihe einfuegen vor", + "TO-row-insert-under": "Reihe einfuegen nach", + "TO-row-prop": "Reiheneinstellungen", + "TO-row-split": "Reihen aufteilen", + "TO-table-prop": "Tabelle", + "Table Properties": "Tabelle", + "Text align": "Ausrichtung", + "The bottom side only": "Nur untere Seite", + "The left-hand side only": "Nur linke Seite", + "The right and left sides only": "Nur linke und rechte Seite", + "The right-hand side only": "Nur rechte Seite", + "The top and bottom sides only": "Nur obere und untere Seite", + "The top side only": "Nur obere Seite", + "Top": "Oben", + "Unset color": "Farbe", + "Vertical align": "Ausrichtung", + "Width": "Breite", + "not-del-last-cell": "Letzte Zelle in dieser Reihe!", + "not-del-last-col": "Letzte Spalte in dieser Tabelle!", + "not-del-last-row": "Letzte Reihe in dieser Tabelle", + "percent": "%", + "pixels": "pixels" +}; diff --git a/htmlarea/plugins/TableOperations/lang/el.js b/htmlarea/plugins/TableOperations/lang/el.js new file mode 100644 index 0000000..119a6f6 --- /dev/null +++ b/htmlarea/plugins/TableOperations/lang/el.js @@ -0,0 +1,81 @@ +// I18N constants + +// LANG: "el", ENCODING: UTF-8 | ISO-8859-7 +// Author: Dimitris Glezos, dimitris@glezos.com + +TableOperations.I18N = { + "Align": "Στοίχηση", + "All four sides": "Και οι 4 πλευρές", + "Background": "Φόντο", + "Baseline": "Baseline", + "Border": "Περίγραμμα", + "Borders": "Περιγράμματα", + "Bottom": "Κάτω μέρος", + "CSS Style": "Στυλ [CSS]", + "Caption": "Λεζάντα", + "Cell Properties": "Ιδιότητες Κελιού", + "Center": "Κέντρο", + "Char": "Χαρακτήρας", + "Collapsed borders": "Συμπτυγμένα περιγράμματα", + "Color": "Χρώμα", + "Description": "Περιγραφή", + "FG Color": "Χρώμα αντικειμένων", + "Float": "Float", + "Frames": "Frames", + "Height": "Ύψος", + "How many columns would you like to merge?": "Πόσες στήλες θέλετε να ενώσετε;", + "How many rows would you like to merge?": "Πόσες γραμμές θέλετε να ενώσετε;", + "Image URL": "URL εικόνας", + "Justify": "Πλήρης στοίχηση", + "Layout": "Διάταξη", + "Left": "Αριστερά", + "Margin": "Περιθώριο", + "Middle": "Κέντρο", + "No rules": "Χωρίς Γραμμές", + "No sides": "No sides", + "None": "Τίποτα", + "Padding": "Εσοχή", + "Please click into some cell": "Κάντε κλικ μέσα σε κάποιο κελί", + "Right": "Δεξιά", + "Row Properties": "Ιδιότητες Γραμμής", + "Rules will appear between all rows and columns": "Γραμμές θα εμφανίζονται μεταξύ όλων των γραμμών και στηλών", + "Rules will appear between columns only": "Γραμμές θα εμφανίζονται μόνο μεταξύ στηλών", + "Rules will appear between rows only": "Γραμμές θα εμφανίζονται μόνο μεταξύ γραμμών", + "Rules": "Γραμμές", + "Spacing and padding": "Αποστάσεις και εσοχές", + "Spacing": "Αποστάσεις", + "Summary": "Σύνοψη", + "TO-cell-delete": "Διαγραφή κελιού", + "TO-cell-insert-after": "Εισαγωγή κελιού μετά", + "TO-cell-insert-before": "Εισαγωγή κελιού πριν", + "TO-cell-merge": "Συγχώνευση κελιών", + "TO-cell-prop": "Ιδιότητες κελιού", + "TO-cell-split": "Διαίρεση κελιού", + "TO-col-delete": "Διαγραφή στήλης", + "TO-col-insert-after": "Εισαγωγή στήλης μετά", + "TO-col-insert-before": "Εισαγωγή στήλης πριν", + "TO-col-split": "Διαίρεση στήλης", + "TO-row-delete": "Διαγραφή γραμμής", + "TO-row-insert-above": "Εισαγωγή γραμμής μετά", + "TO-row-insert-under": "Εισαγωγή γραμμής πριν", + "TO-row-prop": "Ιδιότητες γραμμής", + "TO-row-split": "Διαίρεση γραμμής", + "TO-table-prop": "Ιδιότητες πίνακα", + "Table Properties": "Ιδιότητες πίνακα", + "Text align": "Στοίχηση κειμένου", + "The bottom side only": "Η κάτω πλευρά μόνο", + "The left-hand side only": "Η αριστερή πλευρά μόνο", + "The right and left sides only": "Οι δεξιές και αριστερές πλευρές μόνο", + "The right-hand side only": "Η δεξιά πλευρά μόνο", + "The top and bottom sides only": "Οι πάνω και κάτω πλευρές μόνο", + "The top side only": "Η πάνω πλευρά μόνο", + "Top": "Πάνω", + "Unset color": "Αναίρεση χρώματος", + "Vertical align": "Κατακόρυφη στοίχηση", + "Width": "Πλάτος", + "not-del-last-cell": "Δεν μπορεί να διαγραφεί το τελευταίο κελί σε μια γραμμή.", + "not-del-last-col": "Δεν μπορεί να διαγραφεί η τελευταία στήλη σε ένα πίνακα.", + "not-del-last-row": "Δεν μπορεί να διαγραφεί η τελευταία γραμμή σε ένα πίνακα.", + "percent": "τοις εκατόν", + "pixels": "pixels" +}; diff --git a/htmlarea/plugins/TableOperations/lang/en.js b/htmlarea/plugins/TableOperations/lang/en.js new file mode 100644 index 0000000..17d3101 --- /dev/null +++ b/htmlarea/plugins/TableOperations/lang/en.js @@ -0,0 +1,90 @@ +// I18N constants + +// LANG: "en", ENCODING: UTF-8 | ISO-8859-1 +// Author: Mihai Bazon, http://dynarch.com/mishoo + +// FOR TRANSLATORS: +// +// 1. PLEASE PUT YOUR CONTACT INFO IN THE ABOVE LINE +// (at least a valid email address) +// +// 2. PLEASE TRY TO USE UTF-8 FOR ENCODING; +// (if this is not possible, please include a comment +// that states what encoding is necessary.) + +TableOperations.I18N = { + "Align": "Align", + "All four sides": "All four sides", + "Background": "Background", + "Baseline": "Baseline", + "Border": "Border", + "Borders": "Borders", + "Bottom": "Bottom", + "CSS Style": "Style [CSS]", + "Caption": "Caption", + "Cell Properties": "Cell Properties", + "Center": "Center", + "Char": "Char", + "Collapsed borders": "Collapsed borders", + "Color": "Color", + "Description": "Description", + "FG Color": "FG Color", + "Float": "Float", + "Frames": "Frames", + "Height": "Height", + "How many columns would you like to merge?": "How many columns would you like to merge?", + "How many rows would you like to merge?": "How many rows would you like to merge?", + "Image URL": "Image URL", + "Justify": "Justify", + "Layout": "Layout", + "Left": "Left", + "Margin": "Margin", + "Middle": "Middle", + "No rules": "No rules", + "No sides": "No sides", + "None": "None", + "Padding": "Padding", + "Please click into some cell": "Please click into some cell", + "Right": "Right", + "Row Properties": "Row Properties", + "Rules will appear between all rows and columns": "Rules will appear between all rows and columns", + "Rules will appear between columns only": "Rules will appear between columns only", + "Rules will appear between rows only": "Rules will appear between rows only", + "Rules": "Rules", + "Spacing and padding": "Spacing and padding", + "Spacing": "Spacing", + "Summary": "Summary", + "TO-cell-delete": "Delete cell", + "TO-cell-insert-after": "Insert cell after", + "TO-cell-insert-before": "Insert cell before", + "TO-cell-merge": "Merge cells", + "TO-cell-prop": "Cell properties", + "TO-cell-split": "Split cell", + "TO-col-delete": "Delete column", + "TO-col-insert-after": "Insert column after", + "TO-col-insert-before": "Insert column before", + "TO-col-split": "Split column", + "TO-row-delete": "Delete row", + "TO-row-insert-above": "Insert row before", + "TO-row-insert-under": "Insert row after", + "TO-row-prop": "Row properties", + "TO-row-split": "Split row", + "TO-table-prop": "Table properties", + "Table Properties": "Table Properties", + "Text align": "Text align", + "The bottom side only": "The bottom side only", + "The left-hand side only": "The left-hand side only", + "The right and left sides only": "The right and left sides only", + "The right-hand side only": "The right-hand side only", + "The top and bottom sides only": "The top and bottom sides only", + "The top side only": "The top side only", + "Top": "Top", + "Unset color": "Unset color", + "Vertical align": "Vertical align", + "Width": "Width", + "not-del-last-cell": "HTMLArea cowardly refuses to delete the last cell in row.", + "not-del-last-col": "HTMLArea cowardly refuses to delete the last column in table.", + "not-del-last-row": "HTMLArea cowardly refuses to delete the last row in table.", + "percent": "percent", + "pixels": "pixels" +}; diff --git a/htmlarea/plugins/TableOperations/lang/fi.js b/htmlarea/plugins/TableOperations/lang/fi.js new file mode 100644 index 0000000..2af3541 --- /dev/null +++ b/htmlarea/plugins/TableOperations/lang/fi.js @@ -0,0 +1,66 @@ +TableOperations.I18N = { + "Align": "Kohdistus", + "All four sides": "Kaikki nelj sivua", + "Background": "Tausta", + "Baseline": "Takaraja", + "Border": "Reuna", + "Borders": "Reunat", + "Bottom": "Alle", + "CSS Style": "Tyyli [CSS]", + "Caption": "Otsikko", + "Cell Properties": "Solun asetukset", + "Center": "Keskelle", + "Char": "Merkki", + "Collapsed borders": "Luhistetut reunat", + "Color": "Vri", + "Description": "Kuvaus", + "FG Color": "FG Vri", + "Frames": "Kehykset", + "Image URL": "Kuvan osoite", + "Layout": "Sommittelu", + "Left": "Vasen", + "Margin": "Marginaali", + "Middle": "Keskelle", + "No rules": "Ei viivoja", + "No sides": "Ei sivuja", + "Padding": "Palstantyte", + "Right": "Oikea", + "Row Properties": "Rivin asetukset", + "Rules will appear between all rows and columns": "Viivat jokaisen rivin ja sarakkeen vlill", + "Rules will appear between columns only": "Viivat ainoastaan sarakkeiden vlill", + "Rules will appear between rows only": "Viivat ainoastaan rivien vlill", + "Rules": "Viivat", + "Spacing": "Palstatila", + "Summary": "Yhteenveto", + "TO-cell-delete": "Poista solu", + "TO-cell-insert-after": "Lis solu pern", + "TO-cell-insert-before": "Lis solu ennen", + "TO-cell-merge": "Yhdist solut", + "TO-cell-prop": "Solun asetukset", + "TO-cell-split": "Jaa solu", + "TO-col-delete": "Poista sarake", + "TO-col-insert-after": "Lis sarake pern", + "TO-col-insert-before": "Lis sarake ennen", + "TO-col-split": "Jaa sarake", + "TO-row-delete": "Poista rivi", + "TO-row-insert-above": "Lis rivi ylpuolelle", + "TO-row-insert-under": "Lis rivi alapuolelle", + "TO-row-prop": "Rivin asetukset", + "TO-row-split": "Jaa rivi", + "TO-table-prop": "Taulukon asetukset", + "Top": "Yls", + "Table Properties": "Taulukon asetukset", + "The bottom side only": "Ainoastaan alapuolelle", + "The left-hand side only": "Ainoastaan vasenreuna", + "The right and left sides only": "Oikea- ja vasenreuna", + "The right-hand side only": "Ainoastaan oikeareuna", + "The top and bottom sides only": "Yl- ja alapuoli.", + "The top side only": "Ainoastaan ylpuoli", + "Vertical align": "Vertikaali kohdistus", + "Width": "Leveys", + "not-del-last-cell": "Ei voida poistaa viimeist solua rivist.", + "not-del-last-col": "Ei voida poistaa viimeist saraketta taulusta.", + "not-del-last-row": "Ei voida poistaa viimeist rivi taulusta.", + "percent": "prosenttia", + "pixels": "pikseli" +}; diff --git a/htmlarea/plugins/TableOperations/lang/fr.js b/htmlarea/plugins/TableOperations/lang/fr.js new file mode 100644 index 0000000..1e7e5fc --- /dev/null +++ b/htmlarea/plugins/TableOperations/lang/fr.js @@ -0,0 +1,90 @@ +// I18N constants + +// LANG: "fr", ENCODING: UTF-8 | ISO-8859-1 +// Author: Cédric Guillemette, http://www.ebdata.com + +// FOR TRANSLATORS: +// +// 1. PLEASE PUT YOUR CONTACT INFO IN THE ABOVE LINE +// (at least a valid email address) +// +// 2. PLEASE TRY TO USE UTF-8 FOR ENCODING; +// (if this is not possible, please include a comment +// that states what encoding is necessary.) + +TableOperations.I18N = { + "Align": "Aligner", + "All four sides": "Quatre cotés", + "Background": "Arrière plan", + "Baseline": "Ligne de base", + "Border": "Bordure", + "Borders": "Bordures", + "Bottom": "Bas", + "CSS Style": "Style [CSS]", + "Caption": "Étiquette", + "Cell Properties": "Propriétés de cellule", + "Center": "Centre", + "Char": "Charactère", + "Collapsed borders": "Bordure effondrés", + "Color": "Couleur", + "Description": "Description", + "FG Color": "Couleur de face", + "Float": "Flotteur", + "Frames": "Vues", + "Height": "Largeur", + "How many columns would you like to merge?": "Combien de colonnes voulez-vous fusionner?", + "How many rows would you like to merge?": "Combien de rangées voulez-vous fusionner?", + "Image URL": "URL pour l'image", + "Justify": "Justifié", + "Layout": "Arrangement", + "Left": "Gauche", + "Margin": "Marge", + "Middle": "Milieu", + "No rules": "Aucun règlement", + "No sides": "Aucun côtés", + "None": "Aucun", + "Padding": "Remplissage", + "Please click into some cell": "Cliquer sur une cellule", + "Right": "Droit", + "Row Properties": "Propriétés de rangée", + "Rules will appear between all rows and columns": "Les règles vont apparaître entre les rangées et les cellules", + "Rules will appear between columns only": "Les règles vont apparaître entre les colonnes seulement", + "Rules will appear between rows only": "Les règles vont apparaître entre les rangées seulement", + "Rules": "Les règles", + "Spacing and padding": "Espacement et remplissage", + "Spacing": "Espacement", + "Summary": "Sommaire", + "TO-cell-delete": "Supprimer une cellule", + "TO-cell-insert-after": "Insérer une cellule après", + "TO-cell-insert-before": "Insérer une cellule avant", + "TO-cell-merge": "Fusionner les cellules", + "TO-cell-prop": "Cell properties", + "TO-cell-split": "Diviser la cellule", + "TO-col-delete": "Supprimer la colonne", + "TO-col-insert-after": "Insérer une colonne après", + "TO-col-insert-before": "Insérer une colonne avant", + "TO-col-split": "Diviser une colonne", + "TO-row-delete": "Supprimer une rangée", + "TO-row-insert-above": "Insérer une rangée avant", + "TO-row-insert-under": "Insérer une rangée après", + "TO-row-prop": "Propriétés de rangée", + "TO-row-split": "Diviser la rangée", + "TO-table-prop": "Propriétés de table", + "Table Properties": "Propriétés de table", + "Text align": "Aligner le texte", + "The bottom side only": "Côté du bas seulement", + "The left-hand side only": "Côté gauche seulement", + "The right and left sides only": "Côté gauche et droit seulement", + "The right-hand side only": "Côté droit seulement", + "The top and bottom sides only": "Côté haut et bas seulement", + "The top side only": "Côté haut seulement", + "Top": "Haut", + "Unset color": "Enlever la couleur", + "Vertical align": "Alignement vertical", + "Width": "Longeur", + "not-del-last-cell": "HTMLArea refuse de supprimer la dernière cellule de la rangée.", + "not-del-last-col": "HTMLArea refuse de supprimer la dernière colonne de la table.", + "not-del-last-row": "HTMLArea refuse de supprimer la dernière rangée de la table", + "percent": "pourcentage", + "pixels": "pixels" +}; diff --git a/htmlarea/plugins/TableOperations/lang/he.js b/htmlarea/plugins/TableOperations/lang/he.js new file mode 100644 index 0000000..b685c7b --- /dev/null +++ b/htmlarea/plugins/TableOperations/lang/he.js @@ -0,0 +1,90 @@ +// I18N constants + +// LANG: "he", ENCODING: UTF-8 +// Author: Liron Newman, http://www.eesh.net, + +// FOR TRANSLATORS: +// +// 1. PLEASE PUT YOUR CONTACT INFO IN THE ABOVE LINE +// (at least a valid email address) +// +// 2. PLEASE TRY TO USE UTF-8 FOR ENCODING; +// (if this is not possible, please include a comment +// that states what encoding is necessary.) + +TableOperations.I18N = { + "Align": "ישור", + "All four sides": "כל ארבעת הצדדים", + "Background": "רקע", + "Baseline": "קו בסיס", + "Border": "גבול", + "Borders": "גבולות", + "Bottom": "תחתון", + "CSS Style": "סגנון [CSS]", + "Caption": "כותרת", + "Cell Properties": "מאפייני תא", + "Center": "מרכז", + "Char": "תו", + "Collapsed borders": "גבולות קורסים", + "Color": "צבע", + "Description": "תיאור", + "FG Color": "צבע קידמה", + "Float": "מרחף", + "Frames": "מסגרות", + "Height": "גובה", + "How many columns would you like to merge?": "כמה טורים ברצונך למזג?", + "How many rows would you like to merge?": "כמה שורות ברצונך למזג?", + "Image URL": "URL התמונה", + "Justify": "ישור", + "Layout": "פריסה", + "Left": "שמאל", + "Margin": "שוליים", + "Middle": "אמצע", + "No rules": "ללא קווים", + "No sides": "ללא צדדים", + "None": "אין", + "Padding": "ריווח בשוליים", + "Please click into some cell": "אנא לחץ על תא כלשהו", + "Right": "ימין", + "Row Properties": "מאפייני שורה", + "Rules will appear between all rows and columns": "קווים יופיעו בין כל השורות והטורים", + "Rules will appear between columns only": "קווים יופיעו בין טורים בלבד", + "Rules will appear between rows only": "קווים יופיעו בין שורות בלבד", + "Rules": "קווים", + "Spacing and padding": "ריווח ושוליים", + "Spacing": "ריווח", + "Summary": "סיכום", + "TO-cell-delete": "מחק תא", + "TO-cell-insert-after": "הכנס תא אחרי", + "TO-cell-insert-before": "הכנס תא לפני", + "TO-cell-merge": "מזג תאים", + "TO-cell-prop": "מאפייני תא", + "TO-cell-split": "פצל תא", + "TO-col-delete": "מחק טור", + "TO-col-insert-after": "הכנס טור אחרי", + "TO-col-insert-before": "הכנס טור לפני", + "TO-col-split": "פצל טור", + "TO-row-delete": "מחק שורה", + "TO-row-insert-above": "הכנס שורה לפני", + "TO-row-insert-under": "הכנס שורה אחרי", + "TO-row-prop": "מאפייני שורה", + "TO-row-split": "פצל שורה", + "TO-table-prop": "מאפייני טבלה", + "Table Properties": "מאפייני טבלה", + "Text align": "ישור טקסט", + "The bottom side only": "הצד התחתון בלבד", + "The left-hand side only": "הצד השמאלי בלבד", + "The right and left sides only": "הצדדים הימני והשמאלי בלבד", + "The right-hand side only": "הצד הימני בלבד", + "The top and bottom sides only": "הצדדים העליון והתחתון בלבד", + "The top side only": "הצד העליון בלבד", + "Top": "עליון", + "Unset color": "צבע לא נבחר", + "Vertical align": "יישור אנכי", + "Width": "רוחב", + "not-del-last-cell": "HTMLArea מסרב בפחדנות למחוק את התא האחרון בשורה.", + "not-del-last-col": "HTMLArea מסרב בפחדנות למחוק את הטור האחרון בטבלה.", + "not-del-last-row": "HTMLArea מסרב בפחדנות למחוק את השורה האחרונה בטבלה.", + "percent": "אחוז", + "pixels": "פיקסלים" +}; diff --git a/htmlarea/plugins/TableOperations/lang/hu.js b/htmlarea/plugins/TableOperations/lang/hu.js new file mode 100644 index 0000000..58b66f6 --- /dev/null +++ b/htmlarea/plugins/TableOperations/lang/hu.js @@ -0,0 +1,63 @@ +// I18N constants + +// LANG: "hu", ENCODING: UTF-8 +// Author: Miklós Somogyi, + +// FOR TRANSLATORS: +// +// 1. PLEASE PUT YOUR CONTACT INFO IN THE ABOVE LINE +// (at least a valid email address) +// +// 2. PLEASE TRY TO USE UTF-8 FOR ENCODING; +// (if this is not possible, please include a comment +// that states what encoding is necessary.) + +HTMLArea.I18N = { + + // the following should be the filename without .js extension + // it will be used for automatically load plugin language. + lang: "hu", + + tooltips: { + bold: "Félkövér", + italic: "Dőlt", + underline: "Aláhúzott", + strikethrough: "Áthúzott", + subscript: "Alsó index", + superscript: "Felső index", + justifyleft: "Balra zárt", + justifycenter: "Középre zárt", + justifyright: "Jobbra zárt", + justifyfull: "Sorkizárt", + orderedlist: "Számozott lista", + unorderedlist: "Számozatlan lista", + outdent: "Behúzás csökkentése", + indent: "Behúzás növelése", + forecolor: "Karakterszín", + hilitecolor: "Háttérszín", + horizontalrule: "Elválasztó vonal", + createlink: "Hiperhivatkozás beszúrása", + insertimage: "Kép beszúrása", + inserttable: "Táblázat beszúrása", + htmlmode: "HTML forrás be/ki", + popupeditor: "Szerkesztő külön ablakban", + about: "Névjegy", + showhelp: "Súgó", + textindicator: "Aktuális stílus", + undo: "Visszavonás", + redo: "Újra végrehajtás", + cut: "Kivágás", + copy: "Másolás", + paste: "Beillesztés" + }, + + buttons: { + "ok": "Rendben", + "cancel": "Mégsem" + }, + + msg: { + "Path": "Hierarchia", + "TEXT_MODE": "Forrás mód. Visszaváltás [<>] gomb" + } +}; diff --git a/htmlarea/plugins/TableOperations/lang/it.js b/htmlarea/plugins/TableOperations/lang/it.js new file mode 100644 index 0000000..2025162 --- /dev/null +++ b/htmlarea/plugins/TableOperations/lang/it.js @@ -0,0 +1,81 @@ +// I18N constants + +// LANG: "it", ENCODING: UTF-8 | ISO-8859-1 +// Author: Fabio Rotondo + +TableOperations.I18N = { + "Align": "Allinea", + "All four sides": "Tutti e quattro i lati", + "Background": "Sfondo", + "Baseline": "Allineamento", + "Border": "Bordo", + "Borders": "Bordi", + "Bottom": "Basso", + "CSS Style": "Stile [CSS]", + "Caption": "Titolo", + "Cell Properties": "Proprietà della Cella", + "Center": "Centra", + "Char": "Carattere", + "Collapsed borders": "Bordi chiusi", + "Color": "Colore", + "Description": "Descrizione", + "FG Color": "Colore Principale", + "Float": "Fluttuante", + "Frames": "Frames", + "Height": "Altezza", + "How many columns would you like to merge?": "Quante colonne vuoi unire?", + "How many rows would you like to merge?": "Quante righe vuoi unire?", + "Image URL": "URL dell'Immagine", + "Justify": "Justifica", + "Layout": "Layout", + "Left": "Sinistra", + "Margin": "Margine", + "Middle": "Centrale", + "No rules": "Nessun righello", + "No sides": "Nessun lato", + "None": "Nulla", + "Padding": "Padding", + "Please click into some cell": "Per favore, clicca in una cella", + "Right": "Destra", + "Row Properties": "Proprietà della Riga", + "Rules will appear between all rows and columns": "Le linee appariranno tra tutte le righe e colonne", + "Rules will appear between columns only": "Le linee appariranno solo tra le colonne", + "Rules will appear between rows only": "Le linee appariranno solo tra le righe", + "Rules": "Linee", + "Spacing and padding": "Spaziatura e Padding", + "Spacing": "Spaziatura", + "Summary": "Sommario", + "TO-cell-delete": "Cancella cella", + "TO-cell-insert-after": "Inserisci cella dopo", + "TO-cell-insert-before": "Inserisci cella prima", + "TO-cell-merge": "Unisci celle", + "TO-cell-prop": "Proprietà della cella", + "TO-cell-split": "Dividi cella", + "TO-col-delete": "Cancella colonna", + "TO-col-insert-after": "Inserisci colonna dopo", + "TO-col-insert-before": "Inserisci colonna prima", + "TO-col-split": "Dividi colonna", + "TO-row-delete": "Cancella riga", + "TO-row-insert-above": "Inserisci riga prima", + "TO-row-insert-under": "Inserisci riga dopo", + "TO-row-prop": "Proprietà della riga", + "TO-row-split": "Dividi riga", + "TO-table-prop": "Proprietà della Tabella", + "Table Properties": "Proprietà della Tabella", + "Text align": "Allineamento del Testo", + "The bottom side only": "Solo la parte inferiore", + "The left-hand side only": "Solo la parte sinistra", + "The right and left sides only": "Solo destra e sinistra", + "The right-hand side only": "Solo la parte destra", + "The top and bottom sides only": "Solo sopra e sotto", + "The top side only": "Solo la parte sopra", + "Top": "Alto", + "Unset color": "Rimuovi colore", + "Vertical align": "Allineamento verticale", + "Width": "Larghezza", + "not-del-last-cell": "HTMLArea si rifiuta codardamente di cancellare l'ultima cella nella riga.", + "not-del-last-col": "HTMLArea si rifiuta codardamente di cancellare l'ultima colonna nella tabella.", + "not-del-last-row": "HTMLArea si rifiuta codardamente di cancellare l'ultima riga nella tabella.", + "percent": "percento", + "pixels": "pixels" +}; diff --git a/htmlarea/plugins/TableOperations/lang/nl.js b/htmlarea/plugins/TableOperations/lang/nl.js new file mode 100644 index 0000000..744ab16 --- /dev/null +++ b/htmlarea/plugins/TableOperations/lang/nl.js @@ -0,0 +1,90 @@ +// I18N constants + +// LANG: "nl", ENCODING: UTF-8 | ISO-8859-1 +// Author: Michel Weegeerink (info@mmc-shop.nl), http://mmc-shop.nl + +// FOR TRANSLATORS: +// +// 1. PLEASE PUT YOUR CONTACT INFO IN THE ABOVE LINE +// (at least a valid email address) +// +// 2. PLEASE TRY TO USE UTF-8 FOR ENCODING; +// (if this is not possible, please include a comment +// that states what encoding is necessary.) + +TableOperations.I18N = { + "Align": "Uitlijning", + "All four sides": "Alle 4 zijden", + "Background": "Achtergrond", + "Baseline": "Basis", + "Border": "Rand", + "Borders": "Randen", + "Bottom": "Onder", + "CSS Style": "CSS Style", + "Caption": "Opmerking", + "Cell Properties": "Celeigenschappen", + "Center": "Centreren", + "Char": "Karakter", + "Collapsed borders": "Geen randen", + "Color": "Kleur", + "Description": "Omschrijving", + "FG Color": "Voorgrond", + "Float": "Zwevend", + "Frames": "Frames", + "Height": "Hoogte", + "How many columns would you like to merge?": "Hoeveel kolommen wilt u samenvoegen?", + "How many rows would you like to merge?": "Hoeveel rijen wilt u samenvoegen?", + "Image URL": "Afbeelding URL", + "Justify": "Uitvullen", + "Layout": "Opmaak", + "Left": "Links", + "Margin": "Marge", + "Middle": "Midden", + "No rules": "Geen regels", + "No sides": "Geen zijlijnen", + "None": "Geen", + "Padding": "Celmarge", + "Please click into some cell": "Klik in een cel a.u.b.", + "Right": "Rechts", + "Row Properties": "Rijeigenschappen", + "Rules will appear between all rows and columns": "Regels verschijnen tussen alle rijen en kolommen", + "Rules will appear between columns only": "Regels verschijnen enkel tussen de kolommen", + "Rules will appear between rows only": "Regels verschijnen enkel tussen de rijen", + "Rules": "Regels", + "Spacing and padding": "Celmarge en afstand tussen cellen", + "Spacing": "marge", + "Summary": "Overzicht", + "TO-cell-delete": "Cel verwijderen", + "TO-cell-insert-after": "Voeg cel toe achter", + "TO-cell-insert-before": "Voeg cel toe voor", + "TO-cell-merge": "Cellen samenvoegen", + "TO-cell-prop": "Celeigenschappen", + "TO-cell-split": "Cel splitsen", + "TO-col-delete": "Kolom verwijderen", + "TO-col-insert-after": "Kolom invoegen achter", + "TO-col-insert-before": "Kolom invoegen voor", + "TO-col-split": "Kolom splitsen", + "TO-row-delete": "Rij verwijderen", + "TO-row-insert-above": "Rij invoegen boven", + "TO-row-insert-under": "Rij invoegen onder", + "TO-row-prop": "Rij eigenschappen", + "TO-row-split": "Rij splitsen", + "TO-table-prop": "Tabel eigenschappen", + "Table Properties": "Tabel eigenschappen", + "Text align": "Text uitlijning", + "The bottom side only": "Enkel aan de onderkant", + "The left-hand side only": "Enkel aan de linkerkant", + "The right and left sides only": "Enkel aan de linker en rechterkant", + "The right-hand side only": "Enkel aan de rechterkant", + "The top and bottom sides only": "Enkel aan de bovenen onderkant", + "The top side only": "Enkel aan de bovenkant", + "Top": "Boven", + "Unset color": "Wis kleur", + "Vertical align": "Vertikale uitlijning", + "Width": "Breedte", + "not-del-last-cell": "HTMLArea kan de laatste cel in deze tabel niet verwijderen.", + "not-del-last-col": "HTMLArea kan de laatste kolom in deze tabel niet verwijderen.", + "not-del-last-row": "HTMLArea kan de laatste rij in deze tabel niet verwijderen.", + "percent": "procent", + "pixels": "pixels" +}; diff --git a/htmlarea/plugins/TableOperations/lang/no.js b/htmlarea/plugins/TableOperations/lang/no.js new file mode 100644 index 0000000..015fa3b --- /dev/null +++ b/htmlarea/plugins/TableOperations/lang/no.js @@ -0,0 +1,91 @@ +// I18N constants + +// LANG: "en", ENCODING: UTF-8 | ISO-8859-1 +// Author: Mihai Bazon, +// translated into Norwegia: ses@online.no 11.11.03 + +// FOR TRANSLATORS: +// +// 1. PLEASE PUT YOUR CONTACT INFO IN THE ABOVE LINE +// (at least a valid email address) +// +// 2. PLEASE TRY TO USE UTF-8 FOR ENCODING; +// (if this is not possible, please include a comment +// that states what encoding is necessary.) + +TableOperations.I18N = { + "Align": "Juster", + "All four sides": "Alle fire sider", + "Background": "Bakgrund", + "Baseline": "Grunnlinje", + "Border": "Kantlinje", + "Borders": "Kantlinjer", + "Bottom": "Bunn", + "CSS Style": "Stil [CSS]", + "Caption": "Overskrift", + "Cell Properties": "Celleegenskaper", + "Center": "Sentrer", + "Char": "Tegn", + "Collapsed borders": "Fjern kantlinjer", + "Color": "Farge", + "Description": "Beskrivelse", + "FG Color": "FG farge", + "Float": "Flytende", + "Frames": "rammer", + "Height": "Hyde", + "How many columns would you like to merge?": "Hvor mange kolonner vil du sl sammen?", + "How many rows would you like to merge?": "Hvor mange rader vil du sl sammen?", + "Image URL": "Bildets URL", + "Justify": "Juster", + "Layout": "Layout", + "Left": "Venstre", + "Margin": "Marg", + "Middle": "Midten", + "No rules": "Ingen linjal", + "No sides": "Ingen sider", + "None": "Ingen", + "Padding": "Luft", + "Please click into some cell": "Klikk i en eller annen celle", + "Right": "Hyre", + "Row Properties": "Egenskaper for rad", + "Rules will appear between all rows and columns": "Linjer vil synes mellom alle rader og kolonner", + "Rules will appear between columns only": "Linjer vil synes kun mellom kolonner", + "Rules will appear between rows only": "Linjer vil synes kun mellom rader", + "Rules": "Linjer", + "Spacing and padding": "Luft", + "Spacing": "Luft", + "Summary": "Sammendrag", + "TO-cell-delete": "Slett celle", + "TO-cell-insert-after": "Sett inn celle etter", + "TO-cell-insert-before": "Sett inn celle foran", + "TO-cell-merge": "Sl sammen celler", + "TO-cell-prop": "Egenskaper for celle", + "TO-cell-split": "Del celle", + "TO-col-delete": "Slett kolonne", + "TO-col-insert-after": "Skyt inn kolonne etter", + "TO-col-insert-before": "Skyt inn kolonne fr", + "TO-col-split": "Del kolonne", + "TO-row-delete": "Slett rad", + "TO-row-insert-above": "Skyt inn rad foran", + "TO-row-insert-under": "Skyt inn rad etter", + "TO-row-prop": "Egenskaper for rad", + "TO-row-split": "Del rad", + "TO-table-prop": "Tabellegenskaper", + "Table Properties": "Tabellegenskaper", + "Text align": "Juster tekst", + "The bottom side only": "Bunnen kun", + "The left-hand side only": "Venstresiden kun", + "The right and left sides only": "Hyre- og venstresiden kun", + "The right-hand side only": "Hyresiden kun", + "The top and bottom sides only": "The top and bottom sides only", + "The top side only": "Overkanten kun", + "Top": "Overkant", + "Unset color": "Ikke-bestemt farge", + "Vertical align": "Vertikal justering", + "Width": "Bredde", + "not-del-last-cell": "HTMLArea nekter slette siste cellen i tabellen.", + "not-del-last-col": "HTMLArea nekter slette siste kolonnen i tabellen.", + "not-del-last-row": "HTMLArea nekter slette siste raden i tabellen.", + "percent": "prosent", + "pixels": "billedpunkter" +}; diff --git a/htmlarea/plugins/TableOperations/lang/ro.js b/htmlarea/plugins/TableOperations/lang/ro.js new file mode 100644 index 0000000..beb2260 --- /dev/null +++ b/htmlarea/plugins/TableOperations/lang/ro.js @@ -0,0 +1,90 @@ +// I18N constants + +// LANG: "ro", ENCODING: UTF-8 +// Author: Mihai Bazon, http://dynarch.com/mishoo + +// FOR TRANSLATORS: +// +// 1. PLEASE PUT YOUR CONTACT INFO IN THE ABOVE LINE +// (at least a valid email address) +// +// 2. PLEASE TRY TO USE UTF-8 FOR ENCODING; +// (if this is not possible, please include a comment +// that states what encoding is necessary.) + +TableOperations.I18N = { + "Align": "Aliniere", + "All four sides": "Toate părţile", + "Background": "Fundal", + "Baseline": "Baseline", + "Border": "Chenar", + "Borders": "Chenare", + "Bottom": "Jos", + "CSS Style": "Stil [CSS]", + "Caption": "Titlu de tabel", + "Cell Properties": "Proprietăţile celulei", + "Center": "Centru", + "Char": "Caracter", + "Collapsed borders": "Chenare asimilate", + "Color": "Culoare", + "Description": "Descriere", + "FG Color": "Culoare text", + "Float": "Poziţie", + "Frames": "Chenare", + "Height": "Înălţimea", + "How many columns would you like to merge?": "Câte coloane vrei să uneşti?", + "How many rows would you like to merge?": "Câte linii vrei să uneşti?", + "Image URL": "URL-ul imaginii", + "Justify": "Justify", + "Layout": "Aranjament", + "Left": "Stânga", + "Margin": "Margine", + "Middle": "Mijloc", + "No rules": "Fără linii", + "No sides": "Fără părţi", + "None": "Nimic", + "Padding": "Spaţiere", + "Please click into some cell": "Vă rog să daţi click într-o celulă", + "Right": "Dreapta", + "Row Properties": "Proprietăţile liniei", + "Rules will appear between all rows and columns": "Vor apărea linii între toate rândurile şi coloanele", + "Rules will appear between columns only": "Vor apărea doar linii verticale", + "Rules will appear between rows only": "Vor apărea doar linii orizontale", + "Rules": "Linii", + "Spacing and padding": "Spaţierea", + "Spacing": "Între celule", + "Summary": "Sumar", + "TO-cell-delete": "Şterge celula", + "TO-cell-insert-after": "Inserează o celulă la dreapta", + "TO-cell-insert-before": "Inserează o celulă la stânga", + "TO-cell-merge": "Uneşte celulele", + "TO-cell-prop": "Proprietăţile celulei", + "TO-cell-split": "Împarte celula", + "TO-col-delete": "Şterge coloana", + "TO-col-insert-after": "Inserează o coloană la dreapta", + "TO-col-insert-before": "Inserează o coloană la stânga", + "TO-col-split": "Împarte coloana", + "TO-row-delete": "Şterge rândul", + "TO-row-insert-above": "Inserează un rând înainte", + "TO-row-insert-under": "Inserează un rând după", + "TO-row-prop": "Proprietăţile rândului", + "TO-row-split": "Împarte rândul", + "TO-table-prop": "Proprietăţile tabelei", + "Table Properties": "Proprietăţile tabelei", + "Text align": "Aliniere", + "The bottom side only": "Doar partea de jos", + "The left-hand side only": "Doar partea din stânga", + "The right and left sides only": "Partea din stânga şi cea din dreapta", + "The right-hand side only": "Doar partea din dreapta", + "The top and bottom sides only": "Partea de sus si cea de jos", + "The top side only": "Doar partea de sus", + "Top": "Sus", + "Unset color": "Dezactivează culoarea", + "Vertical align": "Aliniere pe verticală", + "Width": "Lăţime", + "not-del-last-cell": "HTMLArea refuză cu laşitate să şteargă ultima celulă din rând.", + "not-del-last-col": "HTMLArea refuză cu laşitate să şteargă ultima coloamă din tabela.", + "not-del-last-row": "HTMLArea refuză cu laşitate să şteargă ultimul rând din tabela.", + "percent": "procente", + "pixels": "pixeli" +}; diff --git a/htmlarea/plugins/TableOperations/table-operations.js b/htmlarea/plugins/TableOperations/table-operations.js new file mode 100644 index 0000000..540bd71 --- /dev/null +++ b/htmlarea/plugins/TableOperations/table-operations.js @@ -0,0 +1,1113 @@ +// Table Operations Plugin for HTMLArea-3.0 +// Implementation by Mihai Bazon. Sponsored by http://www.zapatec.com +// +// Copyright (c) dynarch.com 2003-2005 +// This copyright notice must stay intact for use. +// +// $Id$ + +// Object that will encapsulate all the table operations provided by +// HTMLArea-3.0 (except "insert table" which is included in the main file) +function TableOperations(editor) { + this.editor = editor; + + var cfg = editor.config; + var tt = TableOperations.I18N; + var bl = TableOperations.btnList; + var self = this; + + // register the toolbar buttons provided by this plugin + var toolbar = ["linebreak"]; + for (var i = 0; i < bl.length; ++i) { + var btn = bl[i]; + if (!btn) { + toolbar.push("separator"); + } else { + var id = "TO-" + btn[0]; + cfg.registerButton(id, tt[id], editor.imgURL(btn[0] + ".gif", "TableOperations"), false, + function(editor, id) { + // dispatch button press event + self.buttonPress(editor, id); + }, btn[1]); + toolbar.push(id); + } + } + + // add a new line in the toolbar + cfg.toolbar.push(toolbar); +}; + +TableOperations._pluginInfo = { + name : "TableOperations", + version : "1.0", + developer : "Mihai Bazon", + developer_url : "http://dynarch.com/mishoo/", + c_owner : "Mihai Bazon", + sponsor : "Zapatec Inc.", + sponsor_url : "http://www.bloki.com", + license : "htmlArea" +}; + +/************************ + * UTILITIES + ************************/ + +// retrieves the closest element having the specified tagName in the list of +// ancestors of the current selection/caret. +TableOperations.prototype.getClosest = function(tagName) { + var editor = this.editor; + var ancestors = editor.getAllAncestors(); + var ret = null; + tagName = ("" + tagName).toLowerCase(); + for (var i = 0; i < ancestors.length; ++i) { + var el = ancestors[i]; + if (el.tagName.toLowerCase() == tagName) { + ret = el; + break; + } + } + return ret; +}; + +// this function requires the file PopupDiv/PopupWin to be loaded from browser +TableOperations.prototype.dialogTableProperties = function() { + var i18n = TableOperations.I18N; + // retrieve existing values + var table = this.getClosest("table"); + // this.editor.selectNodeContents(table); + // this.editor.updateToolbar(); + + var dialog = new PopupWin(this.editor, i18n["Table Properties"], function(dialog, params) { + TableOperations.processStyle(params, table); + for (var i in params) { + var val = params[i]; + switch (i) { + case "f_caption": + if (/\S/.test(val)) { + // contains non white-space characters + var caption = table.getElementsByTagName("caption")[0]; + if (!caption) { + caption = dialog.editor._doc.createElement("caption"); + table.insertBefore(caption, table.firstChild); + } + caption.innerHTML = val; + } else { + // search for caption and delete it if found + var caption = table.getElementsByTagName("caption")[0]; + if (caption) { + caption.parentNode.removeChild(caption); + } + } + break; + case "f_summary": + table.summary = val; + break; + case "f_width": + table.style.width = ("" + val) + params.f_unit; + break; + case "f_align": + table.align = val; + break; + case "f_spacing": + table.cellSpacing = val; + break; + case "f_padding": + table.cellPadding = val; + break; + case "f_borders": + table.border = val; + break; + case "f_frames": + table.frame = val; + break; + case "f_rules": + table.rules = val; + break; + } + } + // various workarounds to refresh the table display (Gecko, + // what's going on?! do not disappoint me!) + dialog.editor.forceRedraw(); + dialog.editor.focusEditor(); + dialog.editor.updateToolbar(); + var save_collapse = table.style.borderCollapse; + table.style.borderCollapse = "collapse"; + table.style.borderCollapse = "separate"; + table.style.borderCollapse = save_collapse; + }, + + // this function gets called when the dialog needs to be initialized + function (dialog) { + + var f_caption = ""; + var capel = table.getElementsByTagName("caption")[0]; + if (capel) { + f_caption = capel.innerHTML; + } + var f_summary = table.summary; + var f_width = parseInt(table.style.width); + isNaN(f_width) && (f_width = ""); + var f_unit = /%/.test(table.style.width) ? 'percent' : 'pixels'; + var f_align = table.align; + var f_spacing = table.cellSpacing; + var f_padding = table.cellPadding; + var f_borders = table.border; + var f_frames = table.frame; + var f_rules = table.rules; + + function selected(val) { + return val ? " selected" : ""; + }; + + // dialog contents + dialog.content.style.width = "400px"; + dialog.content.innerHTML = " \ +
" + i18n["Table Properties"] + "\ +
\ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ +
\ +
" + i18n["Description"] + " \ + \ + \ + \ + \ + \ + \ + \ + \ +
" + i18n["Caption"] + ":
" + i18n["Summary"] + ":
\ +
\ +
\ +
" + i18n["Spacing and padding"] + " \ + \ + \ + \ + \ + \ +
" + i18n["Spacing"] + ":  " + i18n["Padding"] + ":\ +   " + i18n["pixels"] + "\ +
\ +
\ +
\ +
Frame and borders \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ +
" + i18n["Borders"] + ":   " + i18n["pixels"] + "
" + i18n["Frames"] + ": \ + \ +
" + i18n["Rules"] + ": \ + \ +
\ +
\ +
\ +"; + var st_prop = TableOperations.createStyleFieldset(dialog.doc, dialog.editor, table); + var p = dialog.doc.getElementById("--HA-style"); + p.appendChild(st_prop); + var st_layout = TableOperations.createStyleLayoutFieldset(dialog.doc, dialog.editor, table); + p = dialog.doc.getElementById("--HA-layout"); + p.appendChild(st_layout); + dialog.modal = true; + dialog.addButtons("ok", "cancel"); + dialog.showAtElement(dialog.editor._iframe, "c"); + }); +}; + +// this function requires the file PopupDiv/PopupWin to be loaded from browser +TableOperations.prototype.dialogRowCellProperties = function(cell) { + var i18n = TableOperations.I18N; + // retrieve existing values + var element = this.getClosest(cell ? "td" : "tr"); + var table = this.getClosest("table"); + // this.editor.selectNodeContents(element); + // this.editor.updateToolbar(); + + var dialog = new PopupWin(this.editor, i18n[cell ? "Cell Properties" : "Row Properties"], function(dialog, params) { + TableOperations.processStyle(params, element); + for (var i in params) { + var val = params[i]; + switch (i) { + case "f_align": + element.align = val; + break; + case "f_char": + element.ch = val; + break; + case "f_valign": + element.vAlign = val; + break; + } + } + // various workarounds to refresh the table display (Gecko, + // what's going on?! do not disappoint me!) + dialog.editor.forceRedraw(); + dialog.editor.focusEditor(); + dialog.editor.updateToolbar(); + var save_collapse = table.style.borderCollapse; + table.style.borderCollapse = "collapse"; + table.style.borderCollapse = "separate"; + table.style.borderCollapse = save_collapse; + }, + + // this function gets called when the dialog needs to be initialized + function (dialog) { + + var f_align = element.align; + var f_valign = element.vAlign; + var f_char = element.ch; + + function selected(val) { + return val ? " selected" : ""; + }; + + // dialog contents + dialog.content.style.width = "400px"; + dialog.content.innerHTML = " \ +
" + i18n[cell ? "Cell Properties" : "Row Properties"] + "
\ + \ + \ + \ + \ + \ + \ + \ +
\ +
\ +"; + var st_prop = TableOperations.createStyleFieldset(dialog.doc, dialog.editor, element); + var p = dialog.doc.getElementById("--HA-style"); + p.appendChild(st_prop); + var st_layout = TableOperations.createStyleLayoutFieldset(dialog.doc, dialog.editor, element); + p = dialog.doc.getElementById("--HA-layout"); + p.appendChild(st_layout); + dialog.modal = true; + dialog.addButtons("ok", "cancel"); + dialog.showAtElement(dialog.editor._iframe, "c"); + }); +}; + +// this function gets called when some button from the TableOperations toolbar +// was pressed. +TableOperations.prototype.buttonPress = function(editor, button_id) { + this.editor = editor; + var mozbr = HTMLArea.is_gecko ? "
" : ""; + var i18n = TableOperations.I18N; + + // helper function that clears the content in a table row + function clearRow(tr) { + var tds = tr.getElementsByTagName("td"); + for (var i = tds.length; --i >= 0;) { + var td = tds[i]; + td.rowSpan = 1; + td.innerHTML = mozbr; + } + }; + + function splitRow(td) { + var n = parseInt("" + td.rowSpan); + var nc = parseInt("" + td.colSpan); + td.rowSpan = 1; + tr = td.parentNode; + var itr = tr.rowIndex; + var trs = tr.parentNode.rows; + var index = td.cellIndex; + while (--n > 0) { + tr = trs[++itr]; + var otd = editor._doc.createElement("td"); + otd.colSpan = td.colSpan; + otd.innerHTML = mozbr; + tr.insertBefore(otd, tr.cells[index]); + } + editor.forceRedraw(); + editor.updateToolbar(); + }; + + function splitCol(td) { + var nc = parseInt("" + td.colSpan); + td.colSpan = 1; + tr = td.parentNode; + var ref = td.nextSibling; + while (--nc > 0) { + var otd = editor._doc.createElement("td"); + otd.rowSpan = td.rowSpan; + otd.innerHTML = mozbr; + tr.insertBefore(otd, ref); + } + editor.forceRedraw(); + editor.updateToolbar(); + }; + + function splitCell(td) { + var nc = parseInt("" + td.colSpan); + splitCol(td); + var items = td.parentNode.cells; + var index = td.cellIndex; + while (nc-- > 0) { + splitRow(items[index++]); + } + }; + + function selectNextNode(el) { + var node = el.nextSibling; + while (node && node.nodeType != 1) { + node = node.nextSibling; + } + if (!node) { + node = el.previousSibling; + while (node && node.nodeType != 1) { + node = node.previousSibling; + } + } + if (!node) { + node = el.parentNode; + } + editor.selectNodeContents(node); + }; + + switch (button_id) { + // ROWS + + case "TO-row-insert-above": + case "TO-row-insert-under": + var tr = this.getClosest("tr"); + if (!tr) { + break; + } + var otr = tr.cloneNode(true); + clearRow(otr); + tr.parentNode.insertBefore(otr, /under/.test(button_id) ? tr.nextSibling : tr); + editor.forceRedraw(); + editor.focusEditor(); + break; + case "TO-row-delete": + var tr = this.getClosest("tr"); + if (!tr) { + break; + } + var par = tr.parentNode; + if (par.rows.length == 1) { + alert(i18n["not-del-last-row"]); + break; + } + // set the caret first to a position that doesn't + // disappear. + selectNextNode(tr); + par.removeChild(tr); + editor.forceRedraw(); + editor.focusEditor(); + editor.updateToolbar(); + break; + case "TO-row-split": + var td = this.getClosest("td"); + if (!td) { + break; + } + splitRow(td); + break; + + // COLUMNS + + case "TO-col-insert-before": + case "TO-col-insert-after": + var td = this.getClosest("td"); + if (!td) { + break; + } + var rows = td.parentNode.parentNode.rows; + var index = td.cellIndex; + for (var i = rows.length; --i >= 0;) { + var tr = rows[i]; + var ref = tr.cells[index + (/after/.test(button_id) ? 1 : 0)]; + var otd = editor._doc.createElement("td"); + otd.innerHTML = mozbr; + tr.insertBefore(otd, ref); + } + editor.focusEditor(); + break; + case "TO-col-split": + var td = this.getClosest("td"); + if (!td) { + break; + } + splitCol(td); + break; + case "TO-col-delete": + var td = this.getClosest("td"); + if (!td) { + break; + } + var index = td.cellIndex; + if (td.parentNode.cells.length == 1) { + alert(i18n["not-del-last-col"]); + break; + } + // set the caret first to a position that doesn't disappear + selectNextNode(td); + var rows = td.parentNode.parentNode.rows; + for (var i = rows.length; --i >= 0;) { + var tr = rows[i]; + tr.removeChild(tr.cells[index]); + } + editor.forceRedraw(); + editor.focusEditor(); + editor.updateToolbar(); + break; + + // CELLS + + case "TO-cell-split": + var td = this.getClosest("td"); + if (!td) { + break; + } + splitCell(td); + break; + case "TO-cell-insert-before": + case "TO-cell-insert-after": + var td = this.getClosest("td"); + if (!td) { + break; + } + var tr = td.parentNode; + var otd = editor._doc.createElement("td"); + otd.innerHTML = mozbr; + tr.insertBefore(otd, /after/.test(button_id) ? td.nextSibling : td); + editor.forceRedraw(); + editor.focusEditor(); + break; + case "TO-cell-delete": + var td = this.getClosest("td"); + if (!td) { + break; + } + if (td.parentNode.cells.length == 1) { + alert(i18n["not-del-last-cell"]); + break; + } + // set the caret first to a position that doesn't disappear + selectNextNode(td); + td.parentNode.removeChild(td); + editor.forceRedraw(); + editor.updateToolbar(); + break; + case "TO-cell-merge": + // !! FIXME: Mozilla specific !! + var sel = editor._getSelection(); + var range, i = 0; + var rows = []; + var row = null; + var cells = null; + if (!HTMLArea.is_ie) { + try { + while (range = sel.getRangeAt(i++)) { + var td = range.startContainer.childNodes[range.startOffset]; + if (td.parentNode != row) { + row = td.parentNode; + (cells) && rows.push(cells); + cells = []; + } + cells.push(td); + } + } catch(e) {/* finished walking through selection */} + rows.push(cells); + } else { + // Internet Explorer "browser" + var td = this.getClosest("td"); + if (!td) { + alert(i18n["Please click into some cell"]); + break; + } + var tr = td.parentElement; + var no_cols = prompt(i18n["How many columns would you like to merge?"], 2); + if (!no_cols) { + // cancelled + break; + } + var no_rows = prompt(i18n["How many rows would you like to merge?"], 2); + if (!no_rows) { + // cancelled + break; + } + var cell_index = td.cellIndex; + while (no_rows-- > 0) { + td = tr.cells[cell_index]; + cells = [td]; + for (var i = 1; i < no_cols; ++i) { + td = td.nextSibling; + if (!td) { + break; + } + cells.push(td); + } + rows.push(cells); + tr = tr.nextSibling; + if (!tr) { + break; + } + } + } + var HTML = ""; + for (i = 0; i < rows.length; ++i) { + // i && (HTML += "
"); + var cells = rows[i]; + for (var j = 0; j < cells.length; ++j) { + // j && (HTML += " "); + var cell = cells[j]; + HTML += cell.innerHTML; + (i || j) && (cell.parentNode.removeChild(cell)); + } + } + var td = rows[0][0]; + td.innerHTML = HTML; + td.rowSpan = rows.length; + td.colSpan = rows[0].length; + editor.selectNodeContents(td); + editor.forceRedraw(); + editor.focusEditor(); + break; + + // PROPERTIES + + case "TO-table-prop": + this.dialogTableProperties(); + break; + + case "TO-row-prop": + this.dialogRowCellProperties(false); + break; + + case "TO-cell-prop": + this.dialogRowCellProperties(true); + break; + + default: + alert("Button [" + button_id + "] not yet implemented"); + } +}; + +// the list of buttons added by this plugin +TableOperations.btnList = [ + // table properties button + ["table-prop", "table"], + null, // separator + + // ROWS + ["row-prop", "tr"], + ["row-insert-above", "tr"], + ["row-insert-under", "tr"], + ["row-delete", "tr"], + ["row-split", "td[rowSpan!=1]"], + null, + + // COLS + ["col-insert-before", "td"], + ["col-insert-after", "td"], + ["col-delete", "td"], + ["col-split", "td[colSpan!=1]"], + null, + + // CELLS + ["cell-prop", "td"], + ["cell-insert-before", "td"], + ["cell-insert-after", "td"], + ["cell-delete", "td"], + ["cell-merge", "tr"], + ["cell-split", "td[colSpan!=1,rowSpan!=1]"] + ]; + + + +//// GENERIC CODE [style of any element; this should be moved into a separate +//// file as it'll be very useful] +//// BEGIN GENERIC CODE ----------------------------------------------------- + +TableOperations.getLength = function(value) { + var len = parseInt(value); + if (isNaN(len)) { + len = ""; + } + return len; +}; + +// Applies the style found in "params" to the given element. +TableOperations.processStyle = function(params, element) { + var style = element.style; + for (var i in params) { + var val = params[i]; + switch (i) { + case "f_st_backgroundColor": + style.backgroundColor = val; + break; + case "f_st_color": + style.color = val; + break; + case "f_st_backgroundImage": + if (/\S/.test(val)) { + style.backgroundImage = "url(" + val + ")"; + } else { + style.backgroundImage = "none"; + } + break; + case "f_st_borderWidth": + style.borderWidth = val; + break; + case "f_st_borderStyle": + style.borderStyle = val; + break; + case "f_st_borderColor": + style.borderColor = val; + break; + case "f_st_borderCollapse": + style.borderCollapse = val ? "collapse" : ""; + break; + case "f_st_width": + if (/\S/.test(val)) { + style.width = val + params["f_st_widthUnit"]; + } else { + style.width = ""; + } + break; + case "f_st_height": + if (/\S/.test(val)) { + style.height = val + params["f_st_heightUnit"]; + } else { + style.height = ""; + } + break; + case "f_st_textAlign": + if (val == "char") { + var ch = params["f_st_textAlignChar"]; + if (ch == '"') { + ch = '\\"'; + } + style.textAlign = '"' + ch + '"'; + } else { + style.textAlign = val; + } + break; + case "f_st_verticalAlign": + style.verticalAlign = val; + break; + case "f_st_float": + style.cssFloat = val; + break; +// case "f_st_margin": +// style.margin = val + "px"; +// break; +// case "f_st_padding": +// style.padding = val + "px"; +// break; + } + } +}; + +// Returns an HTML element for a widget that allows color selection. That is, +// a button that contains the given color, if any, and when pressed will popup +// the sooner-or-later-to-be-rewritten select_color.html dialog allowing user +// to select some color. If a color is selected, an input field with the name +// "f_st_"+name will be updated with the color value in #123456 format. +TableOperations.createColorButton = function(doc, editor, color, name) { + if (!color) { + color = ""; + } else if (!/#/.test(color)) { + color = HTMLArea._colorToRgb(color); + } + + var df = doc.createElement("span"); + var field = doc.createElement("input"); + field.type = "hidden"; + df.appendChild(field); + field.name = "f_st_" + name; + field.value = color; + var button = doc.createElement("span"); + button.className = "buttonColor"; + df.appendChild(button); + var span = doc.createElement("span"); + span.className = "chooser"; + // span.innerHTML = "       "; + span.style.backgroundColor = color; + button.appendChild(span); + button.onmouseover = function() { if (!this.disabled) { this.className += " buttonColor-hilite"; }}; + button.onmouseout = function() { if (!this.disabled) { this.className = "buttonColor"; }}; + span.onclick = function() { + if (this.parentNode.disabled) { + return false; + } + editor._popupDialog("select_color.html", function(color) { + if (color) { + span.style.backgroundColor = "#" + color; + field.value = "#" + color; + } + }, color); + }; + var span2 = doc.createElement("span"); + span2.innerHTML = "×"; + span2.className = "nocolor"; + span2.title = TableOperations.I18N["Unset color"]; + button.appendChild(span2); + span2.onmouseover = function() { if (!this.parentNode.disabled) { this.className += " nocolor-hilite"; }}; + span2.onmouseout = function() { if (!this.parentNode.disabled) { this.className = "nocolor"; }}; + span2.onclick = function() { + span.style.backgroundColor = ""; + field.value = ""; + }; + return df; +}; + +TableOperations.createStyleLayoutFieldset = function(doc, editor, el) { + var i18n = TableOperations.I18N; + var fieldset = doc.createElement("fieldset"); + var legend = doc.createElement("legend"); + fieldset.appendChild(legend); + legend.innerHTML = i18n["Layout"]; + var table = doc.createElement("table"); + fieldset.appendChild(table); + table.style.width = "100%"; + var tbody = doc.createElement("tbody"); + table.appendChild(tbody); + + var tagname = el.tagName.toLowerCase(); + var tr, td, input, select, option, options, i; + + if (tagname != "td" && tagname != "tr" && tagname != "th") { + tr = doc.createElement("tr"); + tbody.appendChild(tr); + td = doc.createElement("td"); + td.className = "label"; + tr.appendChild(td); + td.innerHTML = i18n["Float"] + ":"; + td = doc.createElement("td"); + tr.appendChild(td); + select = doc.createElement("select"); + td.appendChild(select); + select.name = "f_st_float"; + options = ["None", "Left", "Right"]; + for (var i = 0; i < options.length; ++i) { + var Val = options[i]; + var val = options[i].toLowerCase(); + option = doc.createElement("option"); + option.innerHTML = i18n[Val]; + option.value = val; + option.selected = (("" + el.style.cssFloat).toLowerCase() == val); + select.appendChild(option); + } + } + + tr = doc.createElement("tr"); + tbody.appendChild(tr); + td = doc.createElement("td"); + td.className = "label"; + tr.appendChild(td); + td.innerHTML = i18n["Width"] + ":"; + td = doc.createElement("td"); + tr.appendChild(td); + input = doc.createElement("input"); + input.type = "text"; + input.value = TableOperations.getLength(el.style.width); + input.size = "5"; + input.name = "f_st_width"; + input.style.marginRight = "0.5em"; + td.appendChild(input); + select = doc.createElement("select"); + select.name = "f_st_widthUnit"; + option = doc.createElement("option"); + option.innerHTML = i18n["percent"]; + option.value = "%"; + option.selected = /%/.test(el.style.width); + select.appendChild(option); + option = doc.createElement("option"); + option.innerHTML = i18n["pixels"]; + option.value = "px"; + option.selected = /px/.test(el.style.width); + select.appendChild(option); + td.appendChild(select); + + select.style.marginRight = "0.5em"; + td.appendChild(doc.createTextNode(i18n["Text align"] + ":")); + select = doc.createElement("select"); + select.style.marginLeft = select.style.marginRight = "0.5em"; + td.appendChild(select); + select.name = "f_st_textAlign"; + options = ["Left", "Center", "Right", "Justify"]; + if (tagname == "td") { + options.push("Char"); + } + input = doc.createElement("input"); + input.name = "f_st_textAlignChar"; + input.size = "1"; + input.style.fontFamily = "monospace"; + td.appendChild(input); + for (var i = 0; i < options.length; ++i) { + var Val = options[i]; + var val = Val.toLowerCase(); + option = doc.createElement("option"); + option.value = val; + option.innerHTML = i18n[Val]; + option.selected = (el.style.textAlign.toLowerCase() == val); + select.appendChild(option); + } + function setCharVisibility(value) { + input.style.visibility = value ? "visible" : "hidden"; + if (value) { + input.focus(); + input.select(); + } + }; + select.onchange = function() { setCharVisibility(this.value == "char"); }; + setCharVisibility(select.value == "char"); + + tr = doc.createElement("tr"); + tbody.appendChild(tr); + td = doc.createElement("td"); + td.className = "label"; + tr.appendChild(td); + td.innerHTML = i18n["Height"] + ":"; + td = doc.createElement("td"); + tr.appendChild(td); + input = doc.createElement("input"); + input.type = "text"; + input.value = TableOperations.getLength(el.style.height); + input.size = "5"; + input.name = "f_st_height"; + input.style.marginRight = "0.5em"; + td.appendChild(input); + select = doc.createElement("select"); + select.name = "f_st_heightUnit"; + option = doc.createElement("option"); + option.innerHTML = i18n["percent"]; + option.value = "%"; + option.selected = /%/.test(el.style.height); + select.appendChild(option); + option = doc.createElement("option"); + option.innerHTML = i18n["pixels"]; + option.value = "px"; + option.selected = /px/.test(el.style.height); + select.appendChild(option); + td.appendChild(select); + + select.style.marginRight = "0.5em"; + td.appendChild(doc.createTextNode(i18n["Vertical align"] + ":")); + select = doc.createElement("select"); + select.name = "f_st_verticalAlign"; + select.style.marginLeft = "0.5em"; + td.appendChild(select); + options = ["Top", "Middle", "Bottom", "Baseline"]; + for (var i = 0; i < options.length; ++i) { + var Val = options[i]; + var val = Val.toLowerCase(); + option = doc.createElement("option"); + option.value = val; + option.innerHTML = i18n[Val]; + option.selected = (el.style.verticalAlign.toLowerCase() == val); + select.appendChild(option); + } + + return fieldset; +}; + +// Returns an HTML element containing the style attributes for the given +// element. This can be easily embedded into any dialog; the functionality is +// also provided. +TableOperations.createStyleFieldset = function(doc, editor, el) { + var i18n = TableOperations.I18N; + var fieldset = doc.createElement("fieldset"); + var legend = doc.createElement("legend"); + fieldset.appendChild(legend); + legend.innerHTML = i18n["CSS Style"]; + var table = doc.createElement("table"); + fieldset.appendChild(table); + table.style.width = "100%"; + var tbody = doc.createElement("tbody"); + table.appendChild(tbody); + + var tr, td, input, select, option, options, i; + + tr = doc.createElement("tr"); + tbody.appendChild(tr); + td = doc.createElement("td"); + tr.appendChild(td); + td.className = "label"; + td.innerHTML = i18n["Background"] + ":"; + td = doc.createElement("td"); + tr.appendChild(td); + var df = TableOperations.createColorButton(doc, editor, el.style.backgroundColor, "backgroundColor"); + df.firstChild.nextSibling.style.marginRight = "0.5em"; + td.appendChild(df); + td.appendChild(doc.createTextNode(i18n["Image URL"] + ": ")); + input = doc.createElement("input"); + input.type = "text"; + input.name = "f_st_backgroundImage"; + if (el.style.backgroundImage.match(/url\(\s*(.*?)\s*\)/)) { + input.value = RegExp.$1; + } + // input.style.width = "100%"; + td.appendChild(input); + + tr = doc.createElement("tr"); + tbody.appendChild(tr); + td = doc.createElement("td"); + tr.appendChild(td); + td.className = "label"; + td.innerHTML = i18n["FG Color"] + ":"; + td = doc.createElement("td"); + tr.appendChild(td); + td.appendChild(TableOperations.createColorButton(doc, editor, el.style.color, "color")); + + // for better alignment we include an invisible field. + input = doc.createElement("input"); + input.style.visibility = "hidden"; + input.type = "text"; + td.appendChild(input); + + tr = doc.createElement("tr"); + tbody.appendChild(tr); + td = doc.createElement("td"); + tr.appendChild(td); + td.className = "label"; + td.innerHTML = i18n["Border"] + ":"; + td = doc.createElement("td"); + tr.appendChild(td); + + var colorButton = TableOperations.createColorButton(doc, editor, el.style.borderColor, "borderColor"); + var btn = colorButton.firstChild.nextSibling; + td.appendChild(colorButton); + // borderFields.push(btn); + btn.style.marginRight = "0.5em"; + + select = doc.createElement("select"); + var borderFields = []; + td.appendChild(select); + select.name = "f_st_borderStyle"; + options = ["none", "dotted", "dashed", "solid", "double", "groove", "ridge", "inset", "outset"]; + var currentBorderStyle = el.style.borderStyle; + // Gecko reports "solid solid solid solid" for "border-style: solid". + // That is, "top right bottom left" -- we only consider the first + // value. + (currentBorderStyle.match(/([^\s]*)\s/)) && (currentBorderStyle = RegExp.$1); + for (var i in options) { + var val = options[i]; + option = doc.createElement("option"); + option.value = val; + option.innerHTML = val; + (val == currentBorderStyle) && (option.selected = true); + select.appendChild(option); + } + select.style.marginRight = "0.5em"; + function setBorderFieldsStatus(value) { + for (var i = 0; i < borderFields.length; ++i) { + var el = borderFields[i]; + el.style.visibility = value ? "hidden" : "visible"; + if (!value && (el.tagName.toLowerCase() == "input")) { + el.focus(); + el.select(); + } + } + }; + select.onchange = function() { setBorderFieldsStatus(this.value == "none"); }; + + input = doc.createElement("input"); + borderFields.push(input); + input.type = "text"; + input.name = "f_st_borderWidth"; + input.value = TableOperations.getLength(el.style.borderWidth); + input.size = "5"; + td.appendChild(input); + input.style.marginRight = "0.5em"; + var span = doc.createElement("span"); + span.innerHTML = i18n["pixels"]; + td.appendChild(span); + borderFields.push(span); + + setBorderFieldsStatus(select.value == "none"); + + if (el.tagName.toLowerCase() == "table") { + // the border-collapse style is only for tables + tr = doc.createElement("tr"); + tbody.appendChild(tr); + td = doc.createElement("td"); + td.className = "label"; + tr.appendChild(td); + input = doc.createElement("input"); + input.type = "checkbox"; + input.name = "f_st_borderCollapse"; + input.id = "f_st_borderCollapse"; + var val = (/collapse/i.test(el.style.borderCollapse)); + input.checked = val ? 1 : 0; + td.appendChild(input); + + td = doc.createElement("td"); + tr.appendChild(td); + var label = doc.createElement("label"); + label.htmlFor = "f_st_borderCollapse"; + label.innerHTML = i18n["Collapsed borders"]; + td.appendChild(label); + } + +// tr = doc.createElement("tr"); +// tbody.appendChild(tr); +// td = doc.createElement("td"); +// td.className = "label"; +// tr.appendChild(td); +// td.innerHTML = i18n["Margin"] + ":"; +// td = doc.createElement("td"); +// tr.appendChild(td); +// input = doc.createElement("input"); +// input.type = "text"; +// input.size = "5"; +// input.name = "f_st_margin"; +// td.appendChild(input); +// input.style.marginRight = "0.5em"; +// td.appendChild(doc.createTextNode(i18n["Padding"] + ":")); + +// input = doc.createElement("input"); +// input.type = "text"; +// input.size = "5"; +// input.name = "f_st_padding"; +// td.appendChild(input); +// input.style.marginLeft = "0.5em"; +// input.style.marginRight = "0.5em"; +// td.appendChild(doc.createTextNode(i18n["pixels"])); + + return fieldset; +}; + +//// END GENERIC CODE ------------------------------------------------------- diff --git a/htmlarea/popupdiv.js b/htmlarea/popupdiv.js new file mode 100644 index 0000000..8348882 --- /dev/null +++ b/htmlarea/popupdiv.js @@ -0,0 +1,369 @@ +/** This file is derived from PopupDiv, developed by Mihai Bazon for + * SamWare.net. Modifications were needed to make it usable in HTMLArea. + * HTMLArea is a free WYSIWYG online HTML editor from InteractiveTools.com. + * + * This file does not function standalone. It is dependent of global functions + * defined in HTMLArea-3.0 (htmlarea.js). + * + * Please see file htmlarea.js for further details. + **/ + +var is_ie = ( (navigator.userAgent.toLowerCase().indexOf("msie") != -1) && + (navigator.userAgent.toLowerCase().indexOf("opera") == -1) ); +var is_compat = (document.compatMode == "BackCompat"); + +function PopupDiv(editor, titleText, handler, initFunction) { + var self = this; + + this.editor = editor; + this.doc = editor._mdoc; + this.handler = handler; + + var el = this.doc.createElement("div"); + el.className = "content"; + + var popup = this.doc.createElement("div"); + popup.className = "dialog popupdiv"; + this.element = popup; + var s = popup.style; + s.position = "absolute"; + s.left = "0px"; + s.top = "0px"; + + var title = this.doc.createElement("div"); + title.className = "title"; + this.title = title; + popup.appendChild(title); + + HTMLArea._addEvent(title, "mousedown", function(ev) { + self._dragStart(is_ie ? window.event : ev); + }); + + var button = this.doc.createElement("div"); + button.className = "button"; + title.appendChild(button); + button.innerHTML = "×"; + title.appendChild(this.doc.createTextNode(titleText)); + this.titleText = titleText; + + button.onmouseover = function() { + this.className += " button-hilite"; + }; + button.onmouseout = function() { + this.className = this.className.replace(/\s*button-hilite\s*/g, " "); + }; + button.onclick = function() { + this.className = this.className.replace(/\s*button-hilite\s*/g, " "); + self.close(); + }; + + popup.appendChild(el); + this.content = el; + + this.doc.body.appendChild(popup); + + this.dragging = false; + this.onShow = null; + this.onClose = null; + this.modal = false; + + initFunction(this); +}; + +PopupDiv.currentPopup = null; + +PopupDiv.prototype.showAtElement = function(el, mode) { + this.defaultSize(); + var pos, ew, eh; + var popup = this.element; + popup.style.display = "block"; + var w = popup.offsetWidth; + var h = popup.offsetHeight; + popup.style.display = "none"; + if (el != window) { + pos = PopupDiv.getAbsolutePos(el); + ew = el.offsetWidth; + eh = el.offsetHeight; + } else { + pos = {x:0, y:0}; + var size = PopupDiv.getWindowSize(); + ew = size.x; + eh = size.y; + } + var FX = false, FY = false; + if (mode.indexOf("l") != -1) { + pos.x -= w; + FX = true; + } + if (mode.indexOf("r") != -1) { + pos.x += ew; + FX = true; + } + if (mode.indexOf("t") != -1) { + pos.y -= h; + FY = true; + } + if (mode.indexOf("b") != -1) { + pos.y += eh; + FY = true; + } + if (mode.indexOf("c") != -1) { + FX || (pos.x += Math.round((ew - w) / 2)); + FY || (pos.y += Math.round((eh - h) / 2)); + } + this.showAt(pos.x, pos.y); +}; + +PopupDiv.prototype.defaultSize = function() { + var s = this.element.style; + var cs = this.element.currentStyle; + var addX = (is_ie && is_compat) ? (parseInt(cs.borderLeftWidth) + + parseInt(cs.borderRightWidth) + + parseInt(cs.paddingLeft) + + parseInt(cs.paddingRight)) : 0; + var addY = (is_ie && is_compat) ? (parseInt(cs.borderTopWidth) + + parseInt(cs.borderBottomWidth) + + parseInt(cs.paddingTop) + + parseInt(cs.paddingBottom)) : 0; + s.display = "block"; + s.width = (this.content.offsetWidth + addX) + "px"; + s.height = (this.content.offsetHeight + this.title.offsetHeight) + "px"; + s.display = "none"; +}; + +PopupDiv.prototype.showAt = function(x, y) { + this.defaultSize(); + var s = this.element.style; + s.display = "block"; + s.left = x + "px"; + s.top = y + "px"; + this.hideShowCovered(); + + PopupDiv.currentPopup = this; + HTMLArea._addEvents(this.doc.body, ["mousedown", "click"], PopupDiv.checkPopup); + HTMLArea._addEvents(this.editor._doc.body, ["mousedown", "click"], PopupDiv.checkPopup); + if (is_ie && this.modal) { + this.doc.body.setCapture(false); + this.doc.body.onlosecapture = function() { + (PopupDiv.currentPopup) && (this.doc.body.setCapture(false)); + }; + } + window.event && HTMLArea._stopEvent(window.event); + + if (typeof this.onShow == "function") { + this.onShow(); + } else if (typeof this.onShow == "string") { + eval(this.onShow); + } + + var field = this.element.getElementsByTagName("input")[0]; + if (!field) { + field = this.element.getElementsByTagName("select")[0]; + } + if (!field) { + field = this.element.getElementsByTagName("textarea")[0]; + } + if (field) { + field.focus(); + } +}; + +PopupDiv.prototype.close = function() { + this.element.style.display = "none"; + PopupDiv.currentPopup = null; + this.hideShowCovered(); + HTMLArea._removeEvents(this.doc.body, ["mousedown", "click"], PopupDiv.checkPopup); + HTMLArea._removeEvents(this.editor._doc.body, ["mousedown", "click"], PopupDiv.checkPopup); + is_ie && this.modal && this.doc.body.releaseCapture(); + if (typeof this.onClose == "function") { + this.onClose(); + } else if (typeof this.onClose == "string") { + eval(this.onClose); + } + this.element.parentNode.removeChild(this.element); +}; + +PopupDiv.prototype.getForm = function() { + var forms = this.content.getElementsByTagName("form"); + return (forms.length > 0) ? forms[0] : null; +}; + +PopupDiv.prototype.callHandler = function() { + var tags = ["input", "textarea", "select"]; + var params = new Object(); + for (var ti = tags.length; --ti >= 0;) { + var tag = tags[ti]; + var els = this.content.getElementsByTagName(tag); + for (var j = 0; j < els.length; ++j) { + var el = els[j]; + params[el.name] = el.value; + } + } + this.handler(this, params); + return false; +}; + +PopupDiv.getAbsolutePos = function(el) { + var r = { x: el.offsetLeft, y: el.offsetTop }; + if (el.offsetParent) { + var tmp = PopupDiv.getAbsolutePos(el.offsetParent); + r.x += tmp.x; + r.y += tmp.y; + } + return r; +}; + +PopupDiv.getWindowSize = function() { + if (window.innerHeight) { + return { y: window.innerHeight, x: window.innerWidth }; + } + if (this.doc.body.clientHeight) { + return { y: this.doc.body.clientHeight, x: this.doc.body.clientWidth }; + } + return { y: this.doc.documentElement.clientHeight, x: this.doc.documentElement.clientWidth }; +}; + +PopupDiv.prototype.hideShowCovered = function () { + var self = this; + function isContained(el) { + while (el) { + if (el == self.element) { + return true; + } + el = el.parentNode; + } + return false; + }; + var tags = new Array("applet", "select"); + var el = this.element; + + var p = PopupDiv.getAbsolutePos(el); + var EX1 = p.x; + var EX2 = el.offsetWidth + EX1; + var EY1 = p.y; + var EY2 = el.offsetHeight + EY1; + + if (el.style.display == "none") { + EX1 = EX2 = EY1 = EY2 = 0; + } + + for (var k = tags.length; k > 0; ) { + var ar = this.doc.getElementsByTagName(tags[--k]); + var cc = null; + + for (var i = ar.length; i > 0;) { + cc = ar[--i]; + if (isContained(cc)) { + cc.style.visibility = "visible"; + continue; + } + + p = PopupDiv.getAbsolutePos(cc); + var CX1 = p.x; + var CX2 = cc.offsetWidth + CX1; + var CY1 = p.y; + var CY2 = cc.offsetHeight + CY1; + + if ((CX1 > EX2) || (CX2 < EX1) || (CY1 > EY2) || (CY2 < EY1)) { + cc.style.visibility = "visible"; + } else { + cc.style.visibility = "hidden"; + } + } + } +}; + +PopupDiv.prototype._dragStart = function (ev) { + if (this.dragging) { + return false; + } + this.dragging = true; + PopupDiv.currentPopup = this; + var posX = ev.clientX; + var posY = ev.clientY; + if (is_ie) { + posY += this.doc.body.scrollTop; + posX += this.doc.body.scrollLeft; + } else { + posY += window.scrollY; + posX += window.scrollX; + } + var st = this.element.style; + this.xOffs = posX - parseInt(st.left); + this.yOffs = posY - parseInt(st.top); + HTMLArea._addEvent(this.doc, "mousemove", PopupDiv.dragIt); + HTMLArea._addEvent(this.doc, "mouseover", HTMLArea._stopEvent); + HTMLArea._addEvent(this.doc, "mouseup", PopupDiv.dragEnd); + HTMLArea._stopEvent(ev); +}; + +PopupDiv.dragIt = function (ev) { + var popup = PopupDiv.currentPopup; + if (!(popup && popup.dragging)) { + return false; + } + is_ie && (ev = window.event); + var posX = ev.clientX; + var posY = ev.clientY; + if (is_ie) { + posY += this.doc.body.scrollTop; + posX += this.doc.body.scrollLeft; + } else { + posY += window.scrollY; + posX += window.scrollX; + } + popup.hideShowCovered(); + var st = popup.element.style; + st.left = (posX - popup.xOffs) + "px"; + st.top = (posY - popup.yOffs) + "px"; + HTMLArea._stopEvent(ev); +}; + +PopupDiv.dragEnd = function () { + var popup = PopupDiv.currentPopup; + if (!popup) { + return false; + } + popup.dragging = false; + HTMLArea._removeEvent(popup.doc, "mouseup", PopupDiv.dragEnd); + HTMLArea._removeEvent(popup.doc, "mouseover", HTMLArea._stopEvent); + HTMLArea._removeEvent(popup.doc, "mousemove", PopupDiv.dragIt); + popup.hideShowCovered(); +}; + +PopupDiv.checkPopup = function (ev) { + is_ie && (ev = window.event); + var el = is_ie ? ev.srcElement : ev.target; + var cp = PopupDiv.currentPopup; + for (; (el != null) && (el != cp.element); el = el.parentNode); + if (el == null) { + cp.modal || ev.type == "mouseover" || cp.close(); + HTMLArea._stopEvent(ev); + } +}; + +PopupDiv.prototype.addButtons = function() { + var self = this; + var div = this.doc.createElement("div"); + this.content.appendChild(div); + div.className = "buttons"; + for (var i = 0; i < arguments.length; ++i) { + var btn = arguments[i]; + var button = this.doc.createElement("button"); + div.appendChild(button); + button.innerHTML = HTMLArea.I18N.buttons[btn]; + switch (btn) { + case "ok": + button.onclick = function() { + self.callHandler(); + self.close(); + }; + break; + case "cancel": + button.onclick = function() { + self.close(); + }; + break; + } + } +}; diff --git a/htmlarea/popups/about.html b/htmlarea/popups/about.html new file mode 100644 index 0000000..22a8fd4 --- /dev/null +++ b/htmlarea/popups/about.html @@ -0,0 +1,375 @@ + + + + + +About HTMLArea + + + + + + + +
+ + + +
+ +
+
+ +
+ +

HTMLArea

+ +

A free WYSIWYG editor replacement for <textarea> fields.
+ For Mozilla 1.3+ (any platform) or Internet Explorer 5.5+ (Windows). +

+ +

© 2002-2004 interactivetools.com, inc.
+ © 2003-2005 dynarch.com LLC.
+ All Rights Reserved.

+ +

Project resources

+ + + +

+ For download section please see the project page @ SourceForge. +

+ +
+ +
+

Thank you

+ +

+ dynarch.com would like to thank the following + companies/persons for their donations to support development of HTMLArea (listed alphabetically): +

+ + + +

Also many thanks to all people at InteractiveTools.com + HTMLArea forums for + contributing translations, feedback, bug reports and fixes.

+ +

+ Last but not least, this project wouldn't have existed without + InteractiveTools.com. +

+ +
+ +
+

htmlArea License (based on BSD license)

+ +

© 2002-2004, interactivetools.com, inc.
+ © 2003-2004 dynarch.com LLC
+ All rights reserved.

+ +

+Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: +

+ +
    +
  1. +Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +
  2. + +
  3. +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. +
  4. + +
  5. +Neither the name of interactivetools.com, inc. nor the names of its +contributors may be used to endorse or promote products derived from this +software without specific prior written permission. +
  6. +
+ +

+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. +

+ +
+ +
+

Plugins

+
+
+
+ +
+ + +
+ + +
+
About
Thanks
License
Plugins
+ +
+ +
+ + + + diff --git a/htmlarea/popups/blank.html b/htmlarea/popups/blank.html new file mode 100644 index 0000000..766e2b0 --- /dev/null +++ b/htmlarea/popups/blank.html @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/htmlarea/popups/custom2.html b/htmlarea/popups/custom2.html new file mode 100644 index 0000000..e78ec33 --- /dev/null +++ b/htmlarea/popups/custom2.html @@ -0,0 +1,35 @@ + + + Select Phrase + + + + +
+
+ + + + + +
+
+ \ No newline at end of file diff --git a/htmlarea/popups/editor_help.html b/htmlarea/popups/editor_help.html new file mode 100644 index 0000000..4a173a1 --- /dev/null +++ b/htmlarea/popups/editor_help.html @@ -0,0 +1,16 @@ + + + Editor Help + + + + +

Editor Help

+ +Todo... + + + + \ No newline at end of file diff --git a/htmlarea/popups/fullscreen.html b/htmlarea/popups/fullscreen.html new file mode 100644 index 0000000..f56d3bc --- /dev/null +++ b/htmlarea/popups/fullscreen.html @@ -0,0 +1,139 @@ + + + + Fullscreen HTMLArea + + + + + + + + + + +
+ +
+ + diff --git a/htmlarea/popups/insert_image.html b/htmlarea/popups/insert_image.html new file mode 100644 index 0000000..cef3adb --- /dev/null +++ b/htmlarea/popups/insert_image.html @@ -0,0 +1,191 @@ + + + + Insert Image + + + + + + + + + + + +
Insert Image
+ +
+ + + + + + + + + + + + + +
Image URL: + +
Alternate text:
+ +

+ +

+Layout + +
+ +
Alignment:
+ + +

+ +

Border thickness:
+ + +
+ +
+ +
+Spacing + +
+ +
Horizontal:
+ + +

+ +

Vertical:
+ + +
+ +
+
+ + + + + +
+ Image Preview:
+ +
+
+ +
+
+ + diff --git a/htmlarea/popups/insert_table.html b/htmlarea/popups/insert_table.html new file mode 100644 index 0000000..84dc85b --- /dev/null +++ b/htmlarea/popups/insert_table.html @@ -0,0 +1,175 @@ + + + + Insert Table + + + + + + + + + + + +
Insert Table
+ +
+ + + + + + + + + + + + + + + + + +
Rows:Width:
Cols:
+ +

+ +

+Layout + +
+ +
Alignment:
+ + +

+ +

Border thickness:
+ + +
+ +
+ +
+Spacing + +
+ +
Cell spacing:
+ + +

+ +

Cell padding:
+ + +
+ +
+ +
+ + +
+ +
+ + + diff --git a/htmlarea/popups/link.html b/htmlarea/popups/link.html new file mode 100644 index 0000000..34e20fa --- /dev/null +++ b/htmlarea/popups/link.html @@ -0,0 +1,155 @@ + + + + Insert/Modify Link + + + + + + + + +
Insert/Modify Link
+
+ + + + + + + + + + + + + +
URL:
Title (tooltip):
Target: + +
+ +
+ + +
+
+ + diff --git a/htmlarea/popups/old-fullscreen.html b/htmlarea/popups/old-fullscreen.html new file mode 100644 index 0000000..6ecfb8e --- /dev/null +++ b/htmlarea/popups/old-fullscreen.html @@ -0,0 +1,131 @@ + +Fullscreen Editor + + + + + + +
+ +
+ + \ No newline at end of file diff --git a/htmlarea/popups/old_insert_image.html b/htmlarea/popups/old_insert_image.html new file mode 100644 index 0000000..632bb7a --- /dev/null +++ b/htmlarea/popups/old_insert_image.html @@ -0,0 +1,206 @@ + + + + + + + +Insert Image + + + + + +
Image URL:
+ + +
Alternate Text:
+ + +
+Layout +
+ +
+Spacing +
+ +
Alignment:
+ + +
Horizontal:
+ + +
Border Thickness:
+ + +
Vertical:
+ + + + + + + \ No newline at end of file diff --git a/htmlarea/popups/popup.js b/htmlarea/popups/popup.js new file mode 100644 index 0000000..151563b --- /dev/null +++ b/htmlarea/popups/popup.js @@ -0,0 +1,114 @@ +// htmlArea v3.0 - Copyright (c) 2002, 2003 interactivetools.com, inc. +// This copyright notice MUST stay intact for use (see license.txt). +// +// Portions (c) dynarch.com, 2003 +// +// A free WYSIWYG editor replacement for + + +

Where can I find out more info, download the latest version and talk to +other HTMLArea users?

+ +

You can find out more about HTMLArea and download the latest version on +the HTMLArea +homepage and you can talk to other HTMLArea users and post any comments +or suggestions you have in the HTMLArea forum.

+ +

Keyboard shortcuts

+ +

The editor provides the following key combinations:

+ +
    +
  • CTRL-A -- select all
  • +
  • CTRL-B -- bold
  • +
  • CTRL-I -- italic
  • +
  • CTRL-U -- underline
  • +
  • CTRL-S -- strikethrough
  • +
  • CTRL-L -- justify left
  • +
  • CTRL-E -- justify center
  • +
  • CTRL-R -- justify right
  • +
  • CTRL-J -- justify full
  • +
  • CTRL-1 .. CTRL-6 -- headings (<h1> .. <h6>)
  • +
  • CTRL-0 (zero) -- clean content pasted from Word
  • +
+ +

Installation

+ +

How do I add HTMLArea to my web page?

+ +

It's easy. First you need to upload HTMLArea files to your website. +Just follow these steps.

+ +
    +
  1. Download the latest version from the htmlArea + homepage.
  2. +
  3. Unzip the files onto your local computer (making sure to maintain the + directory structure contained in the zip).
  4. +
  5. Create a new folder on your website called /htmlarea/ (make sure it's + NOT inside the cgi-bin).
  6. +
  7. Transfer all the HTMLArea files from your local computer into the + /htmlarea/ folder on your website.
  8. +
  9. Open the example page /htmlarea/examples/core.html with your browser to make + sure everything works.
  10. +
+ +

Once htmlArea is on your website all you need to do is add some +JavaScript to any pages that you want to add WYSIWYG editors to. Here's how +to do that.

+ +
    + +
  1. Define some global variables. "_editor_url" has to be the absolute + URL where HTMLArea resides within your + website; as we discussed, this would be “/htmlarea/”. "_editor_lang" must + be the language code in which you want HTMLArea to appear. This defaults + to "en" (English); for a list of supported languages, please look into + the "lang" subdirectory in the distribution. +
    <script type="text/javascript">
    +   _editor_url = "/htmlarea/";
    +   _editor_lang = "en";
    +</script>
    + +
  2. Include the "htmlarea.js" script: +
    <script type="text/javascript" src="/htmlarea/htmlarea.js"></script>
    +
  3. + +
  4. If you want to change all your <textarea>-s into + HTMLArea-s then you can use the simplest way to create HTMLArea:

    +
    <script type="text/javascript" defer="1">
    +    HTMLArea.replaceAll();
    +</script>
    +

    Note: you can also add the + HTMLArea.replaceAll() code to the onload + event handler for the body element, if you find it more appropriate.

    + +

    A different approach, if you have more than one textarea and only want + to change one of them, is to use HTMLArea.replace("id") -- + pass the id of your textarea. Do not use the + name attribute anymore, it's not a standard solution!

    + +
+ +

This section applies to HTMLArea-3.0 release candidate 1 or later; prior +to this version, one needed to include more files; however, now HTMLArea is +able to include other files too (such as stylesheet, language definition +file, etc.) so you only need to define the editor path and load +"htmlarea.js". Nice, eh? ;-)

+ +

I want to change the editor settings, how do I do that?

+ +

While it's true that all you need is one line of JavaScript to create an +htmlArea WYSIWYG editor, you can also specify more config settings in the +code to control how the editor works and looks. Here's an example of some of +the available settings:

+ +
var config = new HTMLArea.Config(); // create a new configuration object
+                                    // having all the default values
+config.width = '90%';
+config.height = '200px';
+
+// the following sets a style for the page body (black text on yellow page)
+// and makes all paragraphs be bold by default
+config.pageStyle =
+  'body { background-color: yellow; color: black; font-family: verdana,sans-serif } ' +
+  'p { font-width: bold; } ';
+
+// the following replaces the textarea with the given id with a new
+// HTMLArea object having the specified configuration
+HTMLArea.replace('id', config);
+ +

Important: It's recommended that you add +custom features and configuration to a separate file. This will ensure you +that when we release a new official version of HTMLArea you'll have less +trouble upgrading it.

+ +

How do I customize the toolbar?

+ +

Using the configuration object introduced above allows you to completely +control what the toolbar contains. Following is an example of a one-line, +customized toolbar, much simpler than the default one:

+ +
var config = new HTMLArea.Config();
+config.toolbar = [
+  ['fontname', 'space',
+   'fontsize', 'space',
+   'formatblock', 'space',
+   'bold', 'italic', 'underline']
+];
+HTMLArea.replace('id', config);
+ +

The toolbar is an Array of Array objects. Each array in the toolbar +defines a new line. The default toolbar looks like this:

+ +
config.toolbar = [
+[ "fontname", "space",
+  "fontsize", "space",
+  "formatblock", "space",
+  "bold", "italic", "underline", "separator",
+  "strikethrough", "subscript", "superscript", "separator",
+  "copy", "cut", "paste", "space", "undo", "redo" ],
+
+[ "justifyleft", "justifycenter", "justifyright", "justifyfull", "separator",
+  "insertorderedlist", "insertunorderedlist", "outdent", "indent", "separator",
+  "forecolor", "hilitecolor", "textindicator", "separator",
+  "inserthorizontalrule", "createlink", "insertimage", "inserttable", "htmlmode", "separator",
+  "popupeditor", "separator", "showhelp", "about" ]
+];
+ +

Except three strings, all others in the examples above need to be defined +in the config.btnList object (detailed a bit later in this +document). The three exceptions are: 'space', 'separator' and 'linebreak'. +These three have the following meaning, and need not be present in +btnList:

+ +
    +
  • 'space' -- Inserts a space of 5 pixels (the width is configurable by external + CSS) at the current + position in the toolbar.
  • +
  • 'separator' -- Inserts a small vertical separator, for visually grouping related + buttons.
  • +
  • 'linebreak' -- Starts a new line in the toolbar. Subsequent controls will be + inserted on the new line.
  • +
+ +

Important: It's recommended that you add +custom features and configuration to a separate file. This will ensure you +that when we release a new official version of HTMLArea you'll have less +trouble upgrading it.

+ +

How do I create custom buttons?

+ +

By design, the toolbar is easily extensible. For adding a custom button +one needs to follow two steps.

+ +

1. Register the button in config.btnList.

+ +

For each button in the toolbar, HTMLArea needs to know the following +information:

+
    +
  • a name for it (we call it the ID of the button);
  • +
  • the path to an image to be displayed in the toolbar;
  • +
  • a tooltip for it;
  • +
  • whether the button is enabled or not in text mode;
  • +
  • what to do when the button is clicked;
  • +
+

You need to provide all this information for registering a new button +too. The button ID can be any string identifier and it's used when +defining the toolbar, as you saw above. We recommend starting +it with "my-" so that it won't clash with the standard ID-s (those from +the default toolbar).

+ +

Register button example #1

+ +
// get a default configuration
+var config = new HTMLArea.Config();
+// register the new button using Config.registerButton.
+// parameters:        button ID,   tooltip,          image,           textMode,
+config.registerButton("my-hilite", "Highlight text", "my-hilite.gif", false,
+// function that gets called when the button is clicked
+  function(editor, id) {
+    editor.surroundHTML('<span class="hilite">', '</span>');
+  }
+);
+ +

An alternate way of calling registerButton is exemplified above. Though +the code might be a little bit larger, using this form makes your code more +maintainable. It doesn't even needs comments as it's pretty clear.

+ +

Register button example #2

+ +
var config = new HTMLArea.Config();
+config.registerButton({
+  id        : "my-hilite",
+  tooltip   : "Highlight text",
+  image     : "my-hilite.gif",
+  textMode  : false,
+  action    : function(editor, id) {
+                editor.surroundHTML('<span class="hilite">', '</span>');
+              }
+});
+ +

You might notice that the "action" function receives two parameters: +editor and id. In the examples above we only used the +editor parameter. But it could be helpful for you to understand +both:

+ +
    +
  • editor is a reference to the HTMLArea object. Since our entire + code now has an OOP-like + design, you need to have a reference to + the editor object in order to do things with it. In previous versions of + HTMLArea, in order to identify the object an ID was used -- the ID of the + HTML element. In this version ID-s are no longer necessary.
  • + +
  • id is the button ID. Wondering why is this useful? Well, you + could use the same handler function (presuming that it's not an anonymous + function like in the examples above) for more buttons. You can see an example a bit later in this document.
  • +
+ +

2. Inserting it into the toolbar

+ +

At this step you need to specify where in the toolbar to insert the +button, or just create the whole toolbar again as you saw in the previous +section. You use the button ID, as shown in the examples of customizing the +toolbar in the previous section.

+ +

For the sake of completion, following there are another examples.

+ +

Append your button to the default toolbar

+ +
config.toolbar.push([ "my-hilite" ]);
+ +

Customized toolbar

+ +
config.toolbar = [
+  ['fontname', 'space',
+   'fontsize', 'space',
+   'formatblock', 'space',
+   'separator', 'my-hilite', 'separator', 'space', // here's your button
+   'bold', 'italic', 'underline', 'space']
+];
+ +

Note: in the example above our new button is +between two vertical separators. But this is by no means required. You can +put it wherever you like. Once registered in the btnList (step 1) your custom button behaves just like a default +button.

+ +

Important: It's recommended that you add +custom features and configuration to a separate file. This will ensure you +that when we release a new official version of HTMLArea you'll have less +trouble upgrading it.

+ +

A complete example

+ +

Please note that it is by no means necessary to include the following +code into the htmlarea.js file. On the contrary, it might not work there. +The configuration system is designed such that you can always customize the +editor from outside files, thus keeping the htmlarea.js file +intact. This will make it easy for you to upgrade your HTMLArea when we +release a new official version. OK, I promise it's the last time I said +this. ;)

+ +
// All our custom buttons will call this function when clicked.
+// We use the buttonId parameter to determine what button
+// triggered the call.
+function clickHandler(editor, buttonId) {
+  switch (buttonId) {
+    case "my-toc":
+      editor.insertHTML("<h1>Table Of Contents</h1>");
+      break;
+    case "my-date":
+      editor.insertHTML((new Date()).toString());
+      break;
+    case "my-bold":
+      editor.execCommand("bold");
+      editor.execCommand("italic");
+      break;
+    case "my-hilite":
+      editor.surroundHTML("<span class=\"hilite\">", "</span>");
+      break;
+  }
+};
+
+// Create a new configuration object
+var config = new HTMLArea.Config();
+
+// Register our custom buttons
+config.registerButton("my-toc",  "Insert TOC", "my-toc.gif", false, clickHandler);
+config.registerButton("my-date", "Insert date/time", "my-date.gif", false, clickHandler);
+config.registerButton("my-bold", "Toggle bold/italic", "my-bold.gif", false, clickHandler);
+config.registerButton("my-hilite", "Hilite selection", "my-hilite.gif", false, clickHandler);
+
+// Append the buttons to the default toolbar
+config.toolbar.push(["linebreak", "my-toc", "my-date", "my-bold", "my-hilite"]);
+
+// Replace an existing textarea with an HTMLArea object having the above config.
+HTMLArea.replace("textAreaID", config);
+ + +
+
© InteractiveTools.com 2002-2004. +
dynarch.com 2003-2004
+HTMLArea v3.0 developed by Mihai Bazon. +
+Documentation written by Mihai Bazon. +
+ Last modified: Wed Jan 28 12:18:23 EET 2004 + + diff --git a/htmlarea/release-notes.html b/htmlarea/release-notes.html new file mode 100644 index 0000000..cd06a3c --- /dev/null +++ b/htmlarea/release-notes.html @@ -0,0 +1,182 @@ + + + + + HTMLArea-3.0-RC3 release notes + + + + + +

HTMLArea-3.0-RC3 release notes

+ +

This release was compiled on Jan , 2005 [23:43] GMT.

+ +

Changes since 3.0-RC2b:

+ +
    +
  • Restored broken images and re-committed ALL images back to CVS in binary mode. +
  • Added error with instructions for when HTMLArea.init() isn't called first. +
  • Fixed examples to call HTMLArea.init() first: +
      +
    • 2-areas.html +
    • character_map.html +
    • css.html +
    • dynamic_css.html +
    • list-type.html +
    • remove-font-tags.html +
    +
  • +
+ + +

Changes since 3.0-Beta:

+ +
    +
  • + New plugins +
      +
    • + ContextMenu plugin (provides a nice context menu with common + operations, including table ops, link ops, etc.) +
    • +
    • + CSS plugin (provides an easy way to insert/change CSS classes) +
    • +
    • + FullPage plugin (allows HTMLArea to edit a whole HTML file, + not only the content within <body>.) +
    • +
    +
  • +
  • + Changes in the SpellChecker plugin +
      +
    • + Many bugfixes: now it works ;-) Fully Unicode-safe. +
    • +
    • + Speed and bandwidth optimization: reports the list of + suggestions only once for each mispelled word; this helps + in cases where you have, for instance, the word “HTMLArea” + in 10 places all over the document; the list of + suggestions for it--which is kind of huge--will only be + included once. +
    • +
    • + User interface improvements: the highlighted word will + remain in view; in cases where it's normally outside, the + window will be scrolled to it. +
    • +
    • + Added a "Revert" button for those that change their minds ;-) +
    • +
    • + Added a "Info" button which reports information about the + document, retrieved by the server-side spell checker: + total number of words, total number of mispelled words, + number of suggestions made, spell check time, etc. More + can be easily added. FIXME: this part + is not yet internationalized. +
    • +
    • + The server-side spell checker now uses XML::DOM instead of + HTML::Parser, which means that it will be unable to parse + “tag-soup” HTML. It needs valid code. Usually HTMLArea + generates valid code, but on rare occasions it might fail + and the spell checker will report a gross error message. + This gonna have to be fixed, but instead of making the + spell checker accept invalid HTML I prefer to make + HTMLArea generate valid code, so changes are to be done in + other places ;-) +
    • +
    +
  • +
  • + Changes in the core editor +
      +
    • + Easier to setup: you only need to load + htmlarea.js; other scripts will be loaded + automatically. Documentation + and examples updated. +
    • +
    • + Better plugin support (they register information about + themselves with the editor; can register event handlers for + the editor, etc.) +
    • +
    • + New about box; check it out, it's cool ;-) +
    • +
    • + Word cleaner (can be enabled to automatically kill Word crap + on paste (see Config.killWordOnPaste); otherwise accessible by + pressing CTRL-0 in the editor; a toolbar button will come up + soon) +
    • +
    • + Image preview in "insert image" dialog. Also allows + modification of current image, if selected. +
    • +
    • + New "insert link" dialog, allows target and title + specification, allows editing links. +
    • +
    • + Implemented support for text direction (left-to-right or + right-to-left). +
    • +
    • + Lots of bug fixes! ... and more, I guess ;-) an + automatically generated change log + is now available. +
    • +
    +
  • +
+ +

I don't have the power to go through the bug +system at SourceForge + now. Some of the bugs reported there may be fixed; I'll update + their status, some other time. If you reported bugs there and now + find them to be fixed, please let me know.

+ +

3.0-Beta

+ +

Changes since 3.0-Alpha:

+ +
    + +
  • Performance improvements.
  • + +
  • Many bugs fixed.
  • + +
  • Plugin infrastructure.
  • + +
  • TableOperations plugin.
  • + +
  • SpellChecker plugin.
  • + +
  • Status bar.
  • + +
  • API for registering custom buttons and drop-down boxes in the + toolbar.
  • + +
  • Toolbar can contain text labels.
  • + +
  • Cut, copy, paste, undo, redo buttons.
  • + +
+
+
Mihai Bazon
+ + Last modified: Wed Mar 31 19:18:26 EEST 2004 + + + + +