Added htmlArea3

This commit is contained in:
Len Kranendonk 2004-08-18 18:09:32 +00:00
parent 4489a747fc
commit 8976c0f18c
68 changed files with 5708 additions and 0 deletions

View file

@ -0,0 +1,16 @@
#! /usr/bin/perl -w
use strict;
use CGI;
my $cgi = new CGI;
my $text1 = $cgi->param('text1');
my $text2 = $cgi->param('text2');
print "Content-type: text/html\n\n";
print "<p>You submitted:</p>";
print "<table border='1'>";
print "<thead><tr bgcolor='#cccccc'><td width='50%'>text1</td><td width='50%'>text2</td></tr></thead>";
print "<tbody><tr><td>$text1</td><td>$text2</td></tr></tbody>";
print "</table>";

View file

@ -0,0 +1,158 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Example with 2 HTMLAreas in the same form</title>
<script type="text/javascript">
// the _editor_url is REQUIRED! don't forget to set it.
_editor_url = "../";
// implicit language will be "en", but let's set it for brevity
_editor_lang = "en";
</script>
<script type="text/javascript" src="../htmlarea.js"></script>
<script type="text/javascript">
// load the plugins that we will use
// loading is necessary ONLY ONCE, regardless on how many editors you create
// basically calling the following functions will load the plugin files as if
// we would have wrote script src="..." but with easier and cleaner code
HTMLArea.loadPlugin("TableOperations");
HTMLArea.loadPlugin("SpellChecker");
HTMLArea.loadPlugin("CSS");
// this function will get called at body.onload
function initDocument() {
// cache these values as we need to pass it for both editors
var css_plugin_args = {
combos : [
{ label: "Syntax",
// menu text // CSS class
options: { "None" : "",
"Code" : "code",
"String" : "string",
"Comment" : "comment",
"Variable name" : "variable-name",
"Type" : "type",
"Reference" : "reference",
"Preprocessor" : "preprocessor",
"Keyword" : "keyword",
"Function name" : "function-name",
"Html tag" : "html-tag",
"Html italic" : "html-helper-italic",
"Warning" : "warning",
"Html bold" : "html-helper-bold"
},
context: "pre"
},
{ label: "Info",
options: { "None" : "",
"Quote" : "quote",
"Highlight" : "highlight",
"Deprecated" : "deprecated"
}
}
]
};
//---------------------------------------------------------------------
// GENERAL PATTERN
//
// 1. Instantitate an editor object.
// 2. Register plugins (note, it's required to have them loaded).
// 3. Configure any other items in editor.config.
// 4. generate() the editor
//
// The above are steps that you use to create one editor. Nothing new
// so far. In order to create more than one editor, you just have to
// repeat those steps for each of one. Of course, you can register any
// plugins you want (no need to register the same plugins for all
// editors, and to demonstrate that we'll skip the TableOperations
// plugin for the second editor). Just be careful to pass different
// ID-s in the constructor (you don't want to _even try_ to create more
// editors for the same TEXTAREA element ;-)).
//
// So much for the noise, see the action below.
//---------------------------------------------------------------------
//---------------------------------------------------------------------
// CREATE FIRST EDITOR
//
var editor1 = new HTMLArea("text-area-1");
// plugins must be registered _per editor_. Therefore, we register
// plugins for the first editor here, and we will also do this for the
// second editor.
editor1.registerPlugin(TableOperations);
editor1.registerPlugin(SpellChecker);
editor1.registerPlugin(CSS, css_plugin_args);
// custom config must be done per editor. Here we're importing the
// stylesheet used by the CSS plugin.
editor1.config.pageStyle = "@import url(custom.css);";
// generate first editor
editor1.generate();
//---------------------------------------------------------------------
//---------------------------------------------------------------------
// CREATE SECOND EDITOR
//
var editor2 = new HTMLArea("text-area-2");
// we are using the same plugins
editor2.registerPlugin(TableOperations);
editor2.registerPlugin(SpellChecker);
editor2.registerPlugin(CSS, css_plugin_args);
// import the CSS plugin styles
editor2.config.pageStyle = "@import url(custom.css);";
// generate the second editor
// IMPORTANT: if we don't give it a timeout, the first editor will
// not function in Mozilla. Soon I'll think about starting to
// implement some kind of event that will fire when the editor
// finished creating, then we'll be able to chain the generate()
// calls in an elegant way. But right now there's no other solution
// than the following.
setTimeout(function() {
editor2.generate();
}, 500);
//---------------------------------------------------------------------
};
</script>
</head>
<body onload="initDocument()">
<h1>Example with 2 HTMLAreas in the same form</h1>
<form action="2-areas.cgi" method="post" target="_blank">
<input type="submit" value=" Submit " />
<br />
<textarea id="text-area-1" name="text1" style="width: 100%; height: 12em">
&lt;h3&gt;HTMLArea #1&lt;/h3&gt;
&lt;p&gt;This will submit a field named &lt;em&gt;text1&lt;/em&gt;.&lt;/p&gt;
</textarea>
<br />
<textarea id="text-area-2" name="text2" style="width: 100%; height: 12em">
&lt;h3&gt;Second HTMLArea&lt;/h3&gt; &lt;p&gt;&lt;em&gt;text2&lt;/em&gt; submission. Both are
located in the same FORM element and the script action is
2-areas.cgi (see it in the examples directory)&lt;/p&gt;
</textarea>
<br />
<input type="submit" value=" Submit " />
</form>
<hr>
<address><a href="http://dynarch.com/mishoo/">Mihai Bazon</a></address>
<!-- Created: Fri Oct 31 09:37:10 EET 2003 -->
<!-- hhmts start --> Last modified: Wed Jan 28 11:10:40 EET 2004 <!-- hhmts end -->
<!-- doc-lang: English -->
</body>
</html>

View file

@ -0,0 +1,95 @@
<html>
<head>
<title>Test of ContextMenu plugin</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<script type="text/javascript">
_editor_url = "../";
_editor_lang = "en";
</script>
<!-- load the main HTMLArea file -->
<script type="text/javascript" src="../htmlarea.js"></script>
<script type="text/javascript">
HTMLArea.loadPlugin("ContextMenu");
HTMLArea.loadPlugin("TableOperations");
function initDocument() {
var editor = new HTMLArea("editor");
editor.registerPlugin(ContextMenu);
editor.registerPlugin(TableOperations);
editor.generate();
}
</script>
</head>
<body onload="initDocument()">
<h1>Test of ContextMenu plugin</h1>
<textarea id="editor" style="height: 30em; width: 100%;">
&lt;table border="1" style="border: 1px dotted rgb(0, 102, 255); width:
100%; background-color: rgb(255, 204, 51); background-image: none; float:
none; text-align: left; vertical-align: top; border-collapse: collapse;"
summary="" cellspacing="" cellpadding="" frame="box"
rules="all"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="border: 1px solid
rgb(255, 0, 0); background-color: rgb(0, 51, 51); background-image: none;
text-align: left; vertical-align: top;"&gt;&lt;a
href="http://dynarch.com/mishoo/articles.epl?art_id=430"&gt;&lt;img
src="http://127.0.0.1/~mishoo/htmlarea/examples/pieng.png" alt="" align=""
border="0" hspace="0" vspace="0" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;td
style="border: 1px solid rgb(255, 0, 0); background-color: rgb(255, 255, 0);
background-image: none; text-align: left; vertical-align: top;"&gt;The
article linked on the left image presents a script that allows Internet
Explorer to use PNG images. We hope to be able to implement IE PNG support
in HTMLArea soon.&lt;br /&gt; &lt;br /&gt; Go on, right-click everywhere and
test our new context menus. And be thankful to &lt;a
href="http://www.americanbible.org/"&gt;American Bible Society&lt;/a&gt; who
sponsored the development, &lt;a
href="http://dynarch.com/mishoo/"&gt;mishoo&lt;/a&gt; who made it happen and
God, Who keeps mishoo alife. ;-)&lt;br /&gt; &lt;br /&gt;&lt;span
style="font-style: italic;"&gt;P.S.&lt;/span&gt; No animals were harmed
while producing this movie.&lt;br /&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="border-style: none;
background-color: rgb(255, 255, 51); background-image: none; text-align:
left; vertical-align: top;"&gt;Welcome to HTMLArea, the best online
editor.&lt;br /&gt;&lt;/td&gt;&lt;td&gt;HTMLArea is a project initiated by
&lt;a href="http://interactivetools.com/"&gt;InteractiveTools.com&lt;/a&gt;.
Other companies contributed largely by sponsoring the development of
additional extensions. Many thanks to:&lt;br /&gt; &lt;br
style="font-family: courier new,courier,monospace;" /&gt; &lt;div
style="margin-left: 40px;"&gt;&lt;a href="http://www.zapatec.com/"
style="font-family: courier
new,courier,monospace;"&gt;http://www.zapatec.com&lt;/a&gt;&lt;br
style="font-family: courier new,courier,monospace;" /&gt; &lt;a
href="http://www.americanbible.org/" style="font-family: courier
new,courier,monospace;"&gt;http://www.americanbible.org&lt;/a&gt;&lt;br
style="font-family: courier new,courier,monospace;" /&gt; &lt;a
href="http://www.neomedia.ro/" style="font-family: courier
new,courier,monospace;"&gt;http://www.neomedia.ro&lt;/a&gt;&lt;br
style="font-family: courier new,courier,monospace;" /&gt; &lt;a
href="http://www.os3.it/" style="font-family: courier
new,courier,monospace;"&gt;http://www.os3.it&lt;/a&gt;&lt;br
style="font-family: courier new,courier,monospace;" /&gt; &lt;a
href="http://www.miro.com.au/" style="font-family: courier
new,courier,monospace;"&gt;http://www.miro.com.au&lt;/a&gt;&lt;br
style="font-family: courier new,courier,monospace;" /&gt; &lt;a
href="http://www.thycotic.com/" style="font-family: courier
new,courier,monospace;"&gt;http://www.thycotic.com&lt;/a&gt;&lt;br /&gt;
&lt;/div&gt; &lt;br /&gt; and to all the posters at <a
href="http://www.interactivetools.com/iforum/Open_Source_C3/htmlArea_v3.0_-_Alpha_Release_F14/
">InteractiveTools</a> HTMLArea forums, whose feedback is continually
useful in polishing HTMLArea.&lt;br /&gt; &lt;br /&gt;&lt;div
style="text-align: right;"&gt;-- developers and maintainers of version 3,
&lt;a href="http://dynarch.com/"&gt;dynarch.com&lt;/a&gt;.&lt;br
/&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
</textarea>
<hr />
<address><a href="http://dynarch.com/mishoo/">Mihai Bazon</a></address>
<!-- Created: Wed Oct 1 19:55:37 EEST 2003 -->
<!-- hhmts start --> Last modified: Wed Jan 28 11:10:29 EET 2004 <!-- hhmts end -->
<!-- doc-lang: English -->
</body>
</html>

View file

@ -0,0 +1,184 @@
<html>
<head>
<title>Example of HTMLArea 3.0</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<!-- Configure the path to the editor. We make it relative now, so that the
example ZIP file will work anywhere, but please NOTE THAT it's better to
have it an absolute path, such as '/htmlarea/'. -->
<script type="text/javascript">
_editor_url = "../";
_editor_lang = "en";
</script>
<script type="text/javascript" src="../htmlarea.js"></script>
<style type="text/css">
html, body {
font-family: Verdana,sans-serif;
background-color: #fea;
color: #000;
}
a:link, a:visited { color: #00f; }
a:hover { color: #048; }
a:active { color: #f00; }
textarea { background-color: #fff; border: 1px solid 00f; }
</style>
<script type="text/javascript">
var editor = null;
function initEditor() {
editor = new HTMLArea("ta");
// comment the following two lines to see how customization works
editor.generate();
return false;
var cfg = editor.config; // this is the default configuration
cfg.registerButton({
id : "my-hilite",
tooltip : "Highlight text",
image : "ed_custom.gif",
textMode : false,
action : function(editor) {
editor.surroundHTML("<span class=\"hilite\">", "</span>");
},
context : 'table'
});
cfg.toolbar.push(["linebreak", "my-hilite"]); // add the new button to the toolbar
// BEGIN: code that adds a custom button
// uncomment it to test
var cfg = editor.config; // this is the default configuration
/*
cfg.registerButton({
id : "my-hilite",
tooltip : "Highlight text",
image : "ed_custom.gif",
textMode : false,
action : function(editor) {
editor.surroundHTML("<span class=\"hilite\">", "</span>");
}
});
*/
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;
}
};
cfg.registerButton("my-toc", "Insert TOC", "ed_custom.gif", false, clickHandler);
cfg.registerButton("my-date", "Insert date/time", "ed_custom.gif", false, clickHandler);
cfg.registerButton("my-bold", "Toggle bold/italic", "ed_custom.gif", false, clickHandler);
cfg.registerButton("my-hilite", "Hilite selection", "ed_custom.gif", false, clickHandler);
cfg.registerButton("my-sample", "Class: sample", "ed_custom.gif", false,
function(editor) {
if (HTMLArea.is_ie) {
editor.insertHTML("<span class=\"sample\">&nbsp;&nbsp;</span>");
var r = editor._doc.selection.createRange();
r.move("character", -2);
r.moveEnd("character", 2);
r.select();
} else { // Gecko/W3C compliant
var n = editor._doc.createElement("span");
n.className = "sample";
editor.insertNodeAtSelection(n);
var sel = editor._iframe.contentWindow.getSelection();
sel.removeAllRanges();
var r = editor._doc.createRange();
r.setStart(n, 0);
r.setEnd(n, 0);
sel.addRange(r);
}
}
);
/*
cfg.registerButton("my-hilite", "Highlight text", "ed_custom.gif", false,
function(editor) {
editor.surroundHTML('<span class="hilite">', '</span>');
}
);
*/
cfg.pageStyle = "body { background-color: #efd; } .hilite { background-color: yellow; } "+
".sample { color: green; font-family: monospace; }";
cfg.toolbar.push(["linebreak", "my-toc", "my-date", "my-bold", "my-hilite", "my-sample"]); // add the new button to the toolbar
// END: code that adds a custom button
editor.generate();
}
function insertHTML() {
var html = prompt("Enter some HTML code here");
if (html) {
editor.insertHTML(html);
}
}
function highlight() {
editor.surroundHTML('<span style="background-color: yellow">', '</span>');
}
</script>
</head>
<!-- use <body onload="HTMLArea.replaceAll()" if you don't care about
customizing the editor. It's the easiest way! :) -->
<body onload="initEditor()">
<h1>HTMLArea 3.0</h1>
<p>A replacement for <code>TEXTAREA</code> elements. &copy; <a
href="http://interactivetools.com">InteractiveTools.com</a>, 2003-2004.</p>
<form action="test.cgi" method="post" id="edit" name="edit">
<textarea id="ta" name="ta" style="width:100%" rows="20" cols="80">
&lt;p&gt;Here is some sample text: &lt;b&gt;bold&lt;/b&gt;, &lt;i&gt;italic&lt;/i&gt;, &lt;u&gt;underline&lt;/u&gt;. &lt;/p&gt;
&lt;p align=center&gt;Different fonts, sizes and colors (all in bold):&lt;/p&gt;
&lt;p&gt;&lt;b&gt;
&lt;font face="arial" size="7" color="#000066"&gt;arial&lt;/font&gt;,
&lt;font face="courier new" size="6" color="#006600"&gt;courier new&lt;/font&gt;,
&lt;font face="georgia" size="5" color="#006666"&gt;georgia&lt;/font&gt;,
&lt;font face="tahoma" size="4" color="#660000"&gt;tahoma&lt;/font&gt;,
&lt;font face="times new roman" size="3" color="#660066"&gt;times new roman&lt;/font&gt;,
&lt;font face="verdana" size="2" color="#666600"&gt;verdana&lt;/font&gt;,
&lt;font face="tahoma" size="1" color="#666666"&gt;tahoma&lt;/font&gt;
&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Click on &lt;a href="http://www.interactivetools.com/"&gt;this link&lt;/a&gt; and then on the link button to the details ... OR ... select some text and click link to create a &lt;b&gt;new&lt;/b&gt; link.&lt;/p&gt;
</textarea>
<p />
<input type="submit" name="ok" value=" submit " />
<input type="button" name="ins" value=" insert html " onclick="return insertHTML();" />
<input type="button" name="hil" value=" highlight text " onclick="return highlight();" />
<a href="javascript:mySubmit()">submit</a>
<script type="text/javascript">
function mySubmit() {
// document.edit.save.value = "yes";
document.edit.onsubmit(); // workaround browser bugs.
document.edit.submit();
};
</script>
</form>
</body>
</html>

View file

@ -0,0 +1,88 @@
<html>
<head>
<title>Test of CSS plugin</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<script type="text/javascript">
_editor_url = "../";
_editor_lang = "en";
</script>
<!-- load the main HTMLArea files -->
<script type="text/javascript" src="../htmlarea.js"></script>
<script type="text/javascript">
HTMLArea.loadPlugin("CSS");
function initDocument() {
var editor = new HTMLArea("editor");
editor.config.pageStyle = "@import url(custom.css);";
editor.registerPlugin(CSS, {
combos : [
{ label: "Syntax",
// menu text // CSS class
options: { "None" : "",
"Code" : "code",
"String" : "string",
"Comment" : "comment",
"Variable name" : "variable-name",
"Type" : "type",
"Reference" : "reference",
"Preprocessor" : "preprocessor",
"Keyword" : "keyword",
"Function name" : "function-name",
"Html tag" : "html-tag",
"Html italic" : "html-helper-italic",
"Warning" : "warning",
"Html bold" : "html-helper-bold"
},
context: "pre"
},
{ label: "Info",
options: { "None" : "",
"Quote" : "quote",
"Highlight" : "highlight",
"Deprecated" : "deprecated"
}
}
]
});
editor.generate();
}
</script>
</head>
<body onload="initDocument()">
<h1>Test of FullPage plugin</h1>
<textarea id="editor" style="height: 30em; width: 100%;"
>&lt;h1&gt;&lt;tt&gt;registerDropdown&lt;/tt&gt;&lt;/h1&gt;
&lt;p&gt;Here's some sample code that adds a dropdown to the toolbar. Go on, do
syntax highlighting on it ;-)&lt;/p&gt;
&lt;pre&gt;var the_options = {
"Keyword" : "keyword",
"Function name" : "function-name",
"String" : "string",
"Numeric" : "integer",
"Variable name" : "variable"
};
var css_class = {
id : "CSS-class",
tooltip : i18n["tooltip"],
options : the_options,
action : function(editor) { self.onSelect(editor, this); }
};
cfg.registerDropdown(css_class);
toolbar[0].unshift(["CSS-class"]);&lt;/pre&gt;
&lt;p&gt;Easy, eh? ;-)&lt;/p&gt;</textarea>
<hr />
<address><a href="http://dynarch.com/mishoo/">Mihai Bazon</a></address>
<!-- Created: Wed Oct 1 19:55:37 EEST 2003 -->
<!-- hhmts start --> Last modified: Wed Jan 28 11:10:16 EET 2004 <!-- hhmts end -->
<!-- doc-lang: English -->
</body>
</html>

View file

@ -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; }

View file

@ -0,0 +1,75 @@
<html>
<head>
<title>Test of FullPage plugin</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<script type="text/javascript">
_editor_url = "../";
_editor_lang = "en";
</script>
<!-- load the main HTMLArea files -->
<script type="text/javascript" src="../htmlarea.js"></script>
<script type="text/javascript">
HTMLArea.loadPlugin("FullPage");
function initDocument() {
var editor = new HTMLArea("editor");
editor.registerPlugin(FullPage);
editor.generate();
}
</script>
</head>
<body onload="initDocument()">
<h1>Test of FullPage plugin</h1>
<textarea id="editor" style="height: 30em; width: 100%;">
&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"&gt;
&lt;html&gt;
&lt;head&gt;
&lt;title&gt;FullPage plugin for HTMLArea&lt;/title&gt;
&lt;link rel="alternate stylesheet" href="http://dynarch.com/mishoo/css/dark.css" /&gt;
&lt;link rel="stylesheet" href="http://dynarch.com/mishoo/css/cool-light.css" /&gt;
&lt;/head&gt;
&lt;body style="background-color: #ddddee; color: #000077;"&gt;
&lt;table style="width:60%; height: 90%; margin: 2% auto 1% auto;" align="center" border="0" cellpadding="0" cellspacing="0"&gt;
&lt;tr&gt;
&lt;td style="background-color: #ddeedd; border: 2px solid #002; height: 1.5em; padding: 2px; font: bold 24px Verdana;"&gt;
FullPage plugin
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="background-color: #fff; border: 1px solid #aab; padding: 1em 3em; font: 12px Verdana;"&gt;
&lt;p&gt;
This plugin enables one to edit a full HTML file in &lt;a
href="http://dynarch.com/htmlarea/"&gt;HTMLArea&lt;/a&gt;. This is not
normally possible with just the core editor since it only
retrieves the HTML inside the &lt;code&gt;body&lt;/code&gt; tag.
&lt;/p&gt;
&lt;p&gt;
It provides the ability to change the &lt;code&gt;DOCTYPE&lt;/code&gt; of
the document, &lt;code&gt;body&lt;/code&gt; &lt;code&gt;bgcolor&lt;/code&gt; and
&lt;code&gt;fgcolor&lt;/code&gt; attributes as well as to add additional
&lt;code&gt;link&lt;/code&gt;-ed stylesheets. Cool, eh?
&lt;/p&gt;
&lt;p&gt;
The development of this plugin was initiated and sponsored by
&lt;a href="http://thycotic.com"&gt;Thycotic Software Ltd.&lt;/a&gt;.
That's also cool, isn't it? ;-)
&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/body&gt;
&lt;/html&gt;
</textarea>
<hr />
<address><a href="http://dynarch.com/mishoo/">Mihai Bazon</a></address>
<!-- Created: Wed Oct 1 19:55:37 EEST 2003 -->
<!-- hhmts start --> Last modified: Wed Jan 28 11:10:07 EET 2004 <!-- hhmts end -->
<!-- doc-lang: English -->
</body>
</html>

View file

@ -0,0 +1,248 @@
<html>
<head>
<title>Example of HTMLArea 3.0</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<!-- Configure the path to the editor. We make it relative now, so that the
example ZIP file will work anywhere, but please NOTE THAT it's better to
have it an absolute path, such as '/htmlarea/'. -->
<script type="text/javascript">
_editor_url = "../";
_editor_lang = "en";
</script>
<!-- load the main HTMLArea file, this will take care of loading the CSS and
other required core scripts. -->
<script type="text/javascript" src="../htmlarea.js"></script>
<!-- load the plugins -->
<script type="text/javascript">
// WARNING: using this interface to load plugin
// will _NOT_ work if plugins do not have the language
// loaded by HTMLArea.
// In other words, this function generates SCRIPT tags
// that load the plugin and the language file, based on the
// global variable HTMLArea.I18N.lang (defined in the lang file,
// in our case "lang/en.js" loaded above).
// If this lang file is not found the plugin will fail to
// load correctly and nothing will work.
HTMLArea.loadPlugin("TableOperations");
HTMLArea.loadPlugin("SpellChecker");
HTMLArea.loadPlugin("FullPage");
HTMLArea.loadPlugin("CSS");
HTMLArea.loadPlugin("ContextMenu");
</script>
<style type="text/css">
html, body {
font-family: Verdana,sans-serif;
background-color: #fea;
color: #000;
}
a:link, a:visited { color: #00f; }
a:hover { color: #048; }
a:active { color: #f00; }
textarea { background-color: #fff; border: 1px solid 00f; }
</style>
<script type="text/javascript">
var editor = null;
function initEditor() {
// create an editor for the "ta" textbox
editor = new HTMLArea("ta");
// register the FullPage plugin
editor.registerPlugin(FullPage);
// register the SpellChecker plugin
editor.registerPlugin(TableOperations);
// register the SpellChecker plugin
editor.registerPlugin(SpellChecker);
// register the CSS plugin
editor.registerPlugin(CSS, {
combos : [
{ label: "Syntax:",
// menu text // CSS class
options: { "None" : "",
"Code" : "code",
"String" : "string",
"Comment" : "comment",
"Variable name" : "variable-name",
"Type" : "type",
"Reference" : "reference",
"Preprocessor" : "preprocessor",
"Keyword" : "keyword",
"Function name" : "function-name",
"Html tag" : "html-tag",
"Html italic" : "html-helper-italic",
"Warning" : "warning",
"Html bold" : "html-helper-bold"
},
context: "pre"
},
{ label: "Info:",
options: { "None" : "",
"Quote" : "quote",
"Highlight" : "highlight",
"Deprecated" : "deprecated"
}
}
]
});
// add a contextual menu
editor.registerPlugin("ContextMenu");
// load the stylesheet used by our CSS plugin configuration
editor.config.pageStyle = "@import url(custom.css);";
setTimeout(function() {
editor.generate();
}, 500);
return false;
}
function insertHTML() {
var html = prompt("Enter some HTML code here");
if (html) {
editor.insertHTML(html);
}
}
function highlight() {
editor.surroundHTML('<span style="background-color: yellow">', '</span>');
}
</script>
</head>
<!-- use <body onload="HTMLArea.replaceAll()" if you don't care about
customizing the editor. It's the easiest way! :) -->
<body onload="initEditor()">
<h1>HTMLArea 3.0</h1>
<p>A replacement for <code>TEXTAREA</code> elements. &copy; <a
href="http://interactivetools.com">InteractiveTools.com</a>, 2003-2004.</p>
<form action="test.cgi" method="post" id="edit" name="edit">
<textarea id="ta" name="ta" style="width:100%" rows="24" cols="80">
&lt;!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 3.2//EN"&gt;
&lt;html&gt;
&lt;head&gt;
&lt;title&gt;Passing parameters to JavaScript code&lt;/title&gt;
&lt;link rel="stylesheet" href="custom.css" /&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;h1&gt;Passing parameters to JavaScript code&lt;/h1&gt;
&lt;p&gt;Sometimes we need to pass parameters to some JavaScript function that we
wrote ourselves. But sometimes it's simply more convenient to include the
parameter not in the function call, but in the affected HTML elements.
Usually, all JavaScript calls affect some element, right? ;-)&lt;/p&gt;
&lt;p&gt;Well, here's an original way to do it. Or at least, I think it's
original.&lt;/p&gt;
&lt;h2&gt;But first...&lt;/h2&gt;
&lt;p&gt;... an example. Why would I need such thing? I have a JS function that
is called on &lt;code&gt;BODY&lt;/code&gt; &lt;code&gt;onload&lt;/code&gt; handler. This function
tries to retrieve the element with the ID "conttoc" and, if present, it will
&lt;a href="toc.epl" title="Automatic TOC generation"&gt;generate an index&lt;/a&gt;.
The problem is, this function exists in some external JavaScript library
that it's loaded in page. I only needed to pass the parameter from
&lt;em&gt;one&lt;/em&gt; page. Thus, it makes sense to pass the parameter from the HTML
code on &lt;em&gt;that&lt;/em&gt; page, not to affect the others.&lt;/p&gt;
&lt;p&gt;The first idea that came to me was to use some attribute, like "id" or
"class". But "id" was locked already, it &lt;em&gt;had&lt;/em&gt; to be "conttoc". Use
"class"? It's not elegant.. what if I really wanted to give it a class, at
some point?&lt;/p&gt;
&lt;h2&gt;The idea&lt;/h2&gt;
&lt;p&gt;So I thought: what are the HTML elements that do not affect the page
rendering in any way? Well, comments. I mean, &lt;em&gt;comments&lt;/em&gt;, HTML
comments. You know, like &lt;code&gt;&amp;lt;!-- this is a comment --&amp;gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Though comments do not normally affect the way browser renders the page,
they are still parsed and are part of the DOM, as well as any other node.
But this mean that we can access comments from JavaScript code, just like we
access any other element, right? Which means that they &lt;em&gt;can&lt;/em&gt; affect
the way that page finally appears ;-)&lt;/p&gt;
&lt;h2&gt;The code&lt;/h2&gt;
&lt;p&gt;The main part was the idea. The code is simple ;-) Suppose we have the
following HTML code:&lt;/p&gt;
&lt;pre class="code"&gt;&lt;span class="function-name"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html-tag"&gt;div&lt;/span&gt; &lt;span class="variable-name"&gt;id=&lt;/span&gt;&lt;span class="string"&gt;&amp;quot;conttoc&amp;quot;&lt;/span&gt;&lt;span class="paren-face-match"&gt;&amp;gt;&lt;/span&gt;&lt;span class="function-name"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html-tag"&gt;/div&lt;/span&gt;&lt;span class="function-name"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;and our function checks for the presence an element having the ID
"conttoc", and generates a table of contents into it. Our code will also
check if the "conttoc" element's first child is a comment node, and if so
will parse additional parameters from there, for instance, a desired prefix
for the links that are to be generated into it. Why did I need it? Because
if the page uses a &lt;code&gt;&amp;lt;base&amp;gt;&lt;/code&gt; element to specify the default
link prefix, then links like "#gen1" generated by the &lt;a href="toc.epl"&gt;toc
generator&lt;/a&gt; will not point to that same page as they should, but to the
page reffered from &lt;code&gt;&amp;lt;base&amp;gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;So the HTML would now look like this:&lt;/p&gt;
&lt;pre class="code"&gt;&lt;span class="function-name"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html-tag"&gt;div&lt;/span&gt; &lt;span class="variable-name"&gt;id=&lt;/span&gt;&lt;span class="string"&gt;&amp;quot;conttoc&amp;quot;&lt;/span&gt;&lt;span class="function-name"&gt;&amp;gt;&lt;/span&gt;&lt;span class="comment"&gt;&amp;lt;!-- base:link/prefix.html --&amp;gt;&lt;/span&gt;&lt;span class="paren-face-match"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html-tag"&gt;/div&lt;/span&gt;&lt;span class="paren-face-match"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;And our TOC generation function does something like this:&lt;/p&gt;
&lt;pre class="code"&gt;&lt;span class="keyword"&gt;var&lt;/span&gt; &lt;span class="variable-name"&gt;element&lt;/span&gt; = getElementById(&amp;quot;&lt;span class="string"&gt;conttoc&lt;/span&gt;&amp;quot;);
&lt;span class="keyword"&gt;if&lt;/span&gt; (element.firstChild &amp;amp;&amp;amp; element.firstChild.nodeType == 8) {
&lt;span class="comment"&gt;// 8 means Node.COMMENT_NODE. We're using numeric values
&lt;/span&gt; &lt;span class="comment"&gt;// because IE6 does not support constant names.
&lt;/span&gt; &lt;span class="keyword"&gt;var&lt;/span&gt; &lt;span class="variable-name"&gt;parameters&lt;/span&gt; = element.firstChild.data;
&lt;span class="comment"&gt;// at this point &amp;quot;parameters&amp;quot; contains base:link/prefix.html
&lt;/span&gt; &lt;span class="comment"&gt;// ...
&lt;/span&gt;}&lt;/pre&gt;
&lt;p&gt;So we retrieved the value passed to the script from the HTML code. This
was the goal of this article.&lt;/p&gt;
&lt;hr /&gt;
&lt;address&gt;&lt;a href="http://students.infoiasi.ro/~mishoo/"&gt;Mihai Bazon&lt;/a&gt;&lt;/address&gt;
&lt;!-- hhmts start --&gt; Last modified on Thu Apr 3 20:34:17 2003
&lt;!-- hhmts end --&gt;
&lt;!-- doc-lang: English --&gt;
&lt;/body&gt;
&lt;/html&gt;
</textarea>
<p />
<input type="submit" name="ok" value=" submit " />
<input type="button" name="ins" value=" insert html " onclick="return insertHTML();" />
<input type="button" name="hil" value=" highlight text " onclick="return highlight();" />
<a href="javascript:mySubmit()">submit</a>
<script type="text/javascript">
function mySubmit() {
// document.edit.save.value = "yes";
document.edit.onsubmit(); // workaround browser bugs.
document.edit.submit();
};
</script>
</form>
</body>
</html>

View file

@ -0,0 +1,40 @@
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
<html> <head>
<title>HTMLArea examples index</title>
</head>
<body>
<h1>HTMLArea: auto-generated examples index</h1>
<ul>
<li>
<a href="2-areas.html">2-areas.html</a>
</li>
<li>
<a href="context-menu.html">context-menu.html</a>
</li>
<li>
<a href="core.html">core.html</a>
</li>
<li>
<a href="css.html">css.html</a>
</li>
<li>
<a href="full-page.html">full-page.html</a>
</li>
<li>
<a href="fully-loaded.html">fully-loaded.html</a>
</li>
<li>
<a href="spell-checker.html">spell-checker.html</a>
</li>
<li>
<a href="table-operations.html">table-operations.html</a>
</li>
</ul>
<hr />
<address>mishoo@infoiasi.ro</address>
<!-- hhmts start --> Last modified: Sun Feb 1 13:30:39 EET 2004 <!-- hhmts end -->
</body> </html>

View file

@ -0,0 +1,132 @@
<html>
<head>
<title>Example of HTMLArea 3.0</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<!-- Configure the path to the editor. We make it relative now, so that the
example ZIP file will work anywhere, but please NOTE THAT it's better to
have it an absolute path, such as '/htmlarea/'. -->
<script type="text/javascript">
_editor_lang = "en";
_editor_url = "../";
</script>
<!-- load the main HTMLArea files -->
<script type="text/javascript" src="../htmlarea.js"></script>
<style type="text/css">
html, body {
font-family: Verdana,sans-serif;
background-color: #fea;
color: #000;
}
a:link, a:visited { color: #00f; }
a:hover { color: #048; }
a:active { color: #f00; }
textarea { background-color: #fff; border: 1px solid 00f; }
</style>
<script type="text/javascript">
HTMLArea.loadPlugin("SpellChecker");
var editor = null;
function initEditor() {
// create an editor for the "ta" textbox
editor = new HTMLArea("ta");
// register the SpellChecker plugin
editor.registerPlugin(SpellChecker);
editor.generate();
return false;
}
function insertHTML() {
var html = prompt("Enter some HTML code here");
if (html) {
editor.insertHTML(html);
}
}
function highlight() {
editor.surroundHTML('<span style="background-color: yellow">', '</span>');
}
</script>
</head>
<!-- use <body onload="HTMLArea.replaceAll()" if you don't care about
customizing the editor. It's the easiest way! :) -->
<body onload="initEditor()">
<h1>HTMLArea 3.0</h1>
<p>A replacement for <code>TEXTAREA</code> elements. &copy; <a
href="http://interactivetools.com">InteractiveTools.com</a>, 2003-2004.</p>
<p>Plugins:
<tt>SpellChecker</tt> (sponsored by <a
href="http://americanbible.org">American Bible Society</a>).
</p>
<form action="test.cgi" method="post" id="edit" name="edit">
<textarea id="ta" name="ta" style="width:100%" rows="24" cols="80">
<h1>The <tt>SpellChecker</tt> plugin</h1>
<p>This file deminstrates the <tt>SpellChecker</tt> plugin of
HTMLArea. To inwoke the spell checkert you need to press the
<em>spell-check</em> buton in the toolbar.</p>
<p>The spell-checker uses a serverside script written in Perl. The
Perl script calls <a href="http://aspell.net">aspell</a> for any
word in the text and reports wordz that aren't found in the
dyctionari.</p>
<p>The document that yu are reading now <b>intentionaly</b> containes
some errorz, so that you have something to corect ;-)</p>
<p>Credits for the <tt>SpellChecker</tt> plugin go to:</p>
<ul>
<li><a href="http://aspell.net">Aspell</a> -- spell
checker</li>
<li>The <a href="http://perl.org">Perl</a> programming language</li>
<li><tt><a
href="http://cpan.org/modules/by-module/Text/Text-Aspell-0.02.readme">Text::Aspell</a></tt>
-- Perl interface to Aspell</li>
<li><a href="http://americanbible.org">American Bible Society</a> --
for sponsoring the <tt>SpellChecker</tt> plugin for
<tt>HTMLArea</tt></li>
<li><a href="http://dynarch.com/mishoo/">Your humble servant</a> for
implementing it ;-)</li>
</ul>
</textarea>
<p />
<input type="submit" name="ok" value=" submit " />
<input type="button" name="ins" value=" insert html " onclick="return insertHTML();" />
<input type="button" name="hil" value=" highlight text " onclick="return highlight();" />
<a href="javascript:mySubmit()">submit</a>
<script type="text/javascript">
function mySubmit() {
// document.edit.save.value = "yes";
document.edit.onsubmit(); // workaround browser bugs.
document.edit.submit();
};
</script>
</form>
</body>
</html>

View file

@ -0,0 +1,116 @@
<html>
<head>
<title>Example of HTMLArea 3.0</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<!-- Configure the path to the editor. We make it relative now, so that the
example ZIP file will work anywhere, but please NOTE THAT it's better to
have it an absolute path, such as '/htmlarea/'. -->
<script type="text/javascript">
_editor_lang = "en";
_editor_url = "../";
</script>
<!-- load the main HTMLArea files -->
<script type="text/javascript" src="../htmlarea.js"></script>
<style type="text/css">
html, body {
font-family: Verdana,sans-serif;
background-color: #fea;
color: #000;
}
a:link, a:visited { color: #00f; }
a:hover { color: #048; }
a:active { color: #f00; }
textarea { background-color: #fff; border: 1px solid 00f; }
</style>
<script type="text/javascript">
// load the plugin files
HTMLArea.loadPlugin("TableOperations");
var editor = null;
function initEditor() {
// create an editor for the "ta" textbox
editor = new HTMLArea("ta");
// register the TableOperations plugin with our editor
editor.registerPlugin(TableOperations);
editor.generate();
return false;
}
function insertHTML() {
var html = prompt("Enter some HTML code here");
if (html) {
editor.insertHTML(html);
}
}
function highlight() {
editor.surroundHTML('<span style="background-color: yellow">', '</span>');
}
</script>
</head>
<!-- use <body onload="HTMLArea.replaceAll()" if you don't care about
customizing the editor. It's the easiest way! :) -->
<body onload="initEditor()">
<h1>HTMLArea 3.0</h1>
<p>A replacement for <code>TEXTAREA</code> elements. &copy; <a
href="http://interactivetools.com">InteractiveTools.com</a>, 2003-2004.</p>
<p>Page that demonstrates the additional features of the
<tt>TableOperations</tt> plugin (sponsored by <a
href="http://www.bloki.com">Zapatec Inc.</a>).</p>
<form action="test.cgi" method="post" id="edit" name="edit">
<textarea id="ta" name="ta" style="width:100%" rows="24" cols="80">
<h1>Plugin: <tt>TableOperations</tt></h1>
<p>This page exemplifies the table operations toolbar, provided by the
TableOperations plugin.</p>
<p>Following there is a table.</p>
<table border="1" style="border: 2px solid rgb(255, 0, 0); width: 80%; background-image: none; border-collapse: collapse; color: rgb(153, 102, 0); background-color: rgb(255, 255, 51);" align="center" cellspacing="2" cellpadding="1" summary="">
<caption>This <span style="font-weight: bold;">is</span> a table</caption>
<tbody>
<tr style="border-style: none; background-image: none; background-color: rgb(255, 255, 153);" char="." align="left" valign="middle"> <td>1.1</td> <td>1.2</td> <td>1.3</td> <td>1.4</td> </tr>
<tr> <td>2.1</td> <td style="border: 1px solid rgb(51, 51, 255); background-image: none; background-color: rgb(102, 255, 255); color: rgb(0, 0, 51);" char="." align="left" valign="middle">2.2</td> <td>2.3</td> <td>2.4</td> </tr>
<tr> <td>3.1</td> <td>3.2</td> <td style="border: 2px dashed rgb(51, 204, 102); background-image: none; background-color: rgb(102, 255, 153); color: rgb(0, 51, 0);" char="." align="left" valign="middle">3.3</td> <td>3.4</td> </tr>
<tr> <td style="background-color: rgb(255, 204, 51);">4.1</td> <td style="background-color: rgb(255, 204, 51);">4.2</td> <td style="background-color: rgb(255, 204, 51);">4.3</td> <td style="background-color: rgb(255, 204, 51);">4.4</td> </tr>
</tbody>
</table>
<p>Text after the table</p>
</textarea>
<p />
<input type="submit" name="ok" value=" submit " />
<input type="button" name="ins" value=" insert html " onclick="return insertHTML();" />
<input type="button" name="hil" value=" highlight text " onclick="return highlight();" />
<a href="javascript:mySubmit()">submit</a>
<script type="text/javascript">
function mySubmit() {
// document.edit.save.value = "yes";
document.edit.onsubmit(); // workaround browser bugs.
document.edit.submit();
};
</script>
</form>
</body>
</html>

View file

@ -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 <<EOF;
<html>
<body>
<textarea style="width: 100%; height: 200px">$ta</textarea>
$ta
</body>
</html>
EOF

View file

@ -0,0 +1,116 @@
// Simple CSS (className) plugin for the editor
// Sponsored by http://www.miro.com.au
// 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$
function CSS(editor, params) {
this.editor = editor;
var cfg = editor.config;
var toolbar = cfg.toolbar;
var self = this;
var i18n = CSS.I18N;
var plugin_config = params[0];
var combos = plugin_config.combos;
var first = true;
for (var i = combos.length; --i >= 0;) {
var combo = combos[i];
var id = "CSS-class" + i;
var css_class = {
id : id,
options : combo.options,
action : function(editor) { self.onSelect(editor, this, combo.context, combo.updatecontextclass); },
refresh : function(editor) { self.updateValue(editor, this); },
context : combo.context
};
cfg.registerDropdown(css_class);
// prepend to the toolbar
toolbar[1].splice(0, 0, first ? "separator" : "space");
toolbar[1].splice(0, 0, id);
if (combo.label)
toolbar[1].splice(0, 0, "T[" + combo.label + "]");
first = false;
}
};
CSS._pluginInfo = {
name : "CSS",
version : "1.0",
developer : "Mihai Bazon",
developer_url : "http://dynarch.com/mishoo/",
c_owner : "Mihai Bazon",
sponsor : "Miro International",
sponsor_url : "http://www.miro.com.au",
license : "htmlArea"
};
CSS.prototype.onSelect = function(editor, obj, context, updatecontextclass) {
var tbobj = editor._toolbarObjects[obj.id];
var index = tbobj.element.selectedIndex;
var className = tbobj.element.value;
// retrieve parent element of the selection
var parent = editor.getParentElement();
var surround = true;
var is_span = (parent && parent.tagName.toLowerCase() == "span");
var update_parent = (context && updatecontextclass && parent && parent.tagName.toLowerCase() == context);
if (update_parent) {
parent.className = className;
editor.updateToolbar();
return;
}
if (is_span && index == 0 && !/\S/.test(parent.style.cssText)) {
while (parent.firstChild) {
parent.parentNode.insertBefore(parent.firstChild, parent);
}
parent.parentNode.removeChild(parent);
editor.updateToolbar();
return;
}
if (is_span) {
// maybe we could simply change the class of the parent node?
if (parent.childNodes.length == 1) {
parent.className = className;
surround = false;
// in this case we should handle the toolbar updation
// ourselves.
editor.updateToolbar();
}
}
// Other possibilities could be checked but require a lot of code. We
// can't afford to do that now.
if (surround) {
// shit happens ;-) most of the time. this method works, but
// it's dangerous when selection spans multiple block-level
// elements.
editor.surroundHTML("<span class='" + className + "'>", "</span>");
}
};
CSS.prototype.updateValue = function(editor, obj) {
var select = editor._toolbarObjects[obj.id].element;
var parent = editor.getParentElement();
if (typeof parent.className != "undefined" && /\S/.test(parent.className)) {
var options = select.options;
var value = parent.className;
for (var i = options.length; --i >= 0;) {
var option = options[i];
if (value == option.value) {
select.selectedIndex = i;
return;
}
}
}
select.selectedIndex = 0;
};

View file

@ -0,0 +1,2 @@
// none yet; this file is a stub.
CSS.I18N = {};

View file

@ -0,0 +1,416 @@
// Context Menu 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$
HTMLArea.loadStyle("menu.css", "ContextMenu");
function ContextMenu(editor) {
this.editor = editor;
};
ContextMenu._pluginInfo = {
name : "ContextMenu",
version : "1.0",
developer : "Mihai Bazon",
developer_url : "http://dynarch.com/mishoo/",
c_owner : "dynarch.com",
sponsor : "American Bible Society",
sponsor_url : "http://www.americanbible.org",
license : "htmlArea"
};
ContextMenu.prototype.onGenerate = function() {
var self = this;
var doc = this.editordoc = this.editor._iframe.contentWindow.document;
HTMLArea._addEvents(doc, ["contextmenu"],
function (event) {
return self.popupMenu(HTMLArea.is_ie ? self.editor._iframe.contentWindow.event : event);
});
this.currentMenu = null;
};
ContextMenu.prototype.getContextMenu = function(target) {
var self = this;
var editor = this.editor;
var config = editor.config;
var menu = [];
var tbo = this.editor.plugins.TableOperations;
if (tbo) tbo = tbo.instance;
var i18n = ContextMenu.I18N;
var selection = editor.hasSelectedText();
if (selection)
menu.push([ i18n["Cut"], function() { editor.execCommand("cut"); }, null, config.btnList["cut"][1] ],
[ i18n["Copy"], function() { editor.execCommand("copy"); }, null, config.btnList["copy"][1] ]);
menu.push([ i18n["Paste"], function() { editor.execCommand("paste"); }, null, config.btnList["paste"][1] ]);
var currentTarget = target;
var elmenus = [];
var link = null;
var table = null;
var tr = null;
var td = null;
var img = null;
function tableOperation(opcode) {
tbo.buttonPress(editor, opcode);
};
for (; target; target = target.parentNode) {
var tag = target.tagName;
if (!tag)
continue;
tag = tag.toLowerCase();
switch (tag) {
case "img":
img = target;
elmenus.push(null,
[ i18n["Image Properties"],
function() {
editor._insertImage(img);
},
i18n["Show the image properties dialog"],
config.btnList["insertimage"][1] ]
);
break;
case "a":
link = target;
elmenus.push(null,
[ i18n["Modify Link"],
function() { editor.execCommand("createlink", true); },
i18n["Current URL is"] + ': ' + link.href,
config.btnList["createlink"][1] ],
[ i18n["Check Link"],
function() { window.open(link.href); },
i18n["Opens this link in a new window"] ],
[ i18n["Remove Link"],
function() {
if (confirm(i18n["Please confirm that you want to unlink this element."] + "\n" +
i18n["Link points to:"] + " " + link.href)) {
while (link.firstChild)
link.parentNode.insertBefore(link.firstChild, link);
link.parentNode.removeChild(link);
}
},
i18n["Unlink the current element"] ]
);
break;
case "td":
td = target;
if (!tbo) break;
elmenus.push(null,
[ i18n["Cell Properties"],
function() { tableOperation("TO-cell-prop"); },
i18n["Show the Table Cell Properties dialog"],
config.btnList["TO-cell-prop"][1] ]
);
break;
case "tr":
tr = target;
if (!tbo) break;
elmenus.push(null,
[ i18n["Row Properties"],
function() { tableOperation("TO-row-prop"); },
i18n["Show the Table Row Properties dialog"],
config.btnList["TO-row-prop"][1] ],
[ i18n["Insert Row Before"],
function() { tableOperation("TO-row-insert-above"); },
i18n["Insert a new row before the current one"],
config.btnList["TO-row-insert-above"][1] ],
[ i18n["Insert Row After"],
function() { tableOperation("TO-row-insert-under"); },
i18n["Insert a new row after the current one"],
config.btnList["TO-row-insert-under"][1] ],
[ i18n["Delete Row"],
function() { tableOperation("TO-row-delete"); },
i18n["Delete the current row"],
config.btnList["TO-row-delete"][1] ]
);
break;
case "table":
table = target;
if (!tbo) break;
elmenus.push(null,
[ i18n["Table Properties"],
function() { tableOperation("TO-table-prop"); },
i18n["Show the Table Properties dialog"],
config.btnList["TO-table-prop"][1] ],
[ i18n["Insert Column Before"],
function() { tableOperation("TO-col-insert-before"); },
i18n["Insert a new column before the current one"],
config.btnList["TO-col-insert-before"][1] ],
[ i18n["Insert Column After"],
function() { tableOperation("TO-col-insert-after"); },
i18n["Insert a new column after the current one"],
config.btnList["TO-col-insert-after"][1] ],
[ i18n["Delete Column"],
function() { tableOperation("TO-col-delete"); },
i18n["Delete the current column"],
config.btnList["TO-col-delete"][1] ]
);
break;
case "body":
elmenus.push(null,
[ i18n["Justify Left"],
function() { editor.execCommand("justifyleft"); }, null,
config.btnList["justifyleft"][1] ],
[ i18n["Justify Center"],
function() { editor.execCommand("justifycenter"); }, null,
config.btnList["justifycenter"][1] ],
[ i18n["Justify Right"],
function() { editor.execCommand("justifyright"); }, null,
config.btnList["justifyright"][1] ],
[ i18n["Justify Full"],
function() { editor.execCommand("justifyfull"); }, null,
config.btnList["justifyfull"][1] ]
);
break;
}
}
if (selection && !link)
menu.push(null, [ i18n["Make link"],
function() { editor.execCommand("createlink", true); },
i18n["Create a link"],
config.btnList["createlink"][1] ]);
for (var i in elmenus)
menu.push(elmenus[i]);
menu.push(null,
[ i18n["Remove the"] + " &lt;" + currentTarget.tagName + "&gt; " + i18n["Element"],
function() {
if (confirm(i18n["Please confirm that you want to remove this element:"] + " " + currentTarget.tagName)) {
var el = currentTarget;
var p = el.parentNode;
p.removeChild(el);
if (HTMLArea.is_gecko) {
if (p.tagName.toLowerCase() == "td" && !p.hasChildNodes())
p.appendChild(editor._doc.createElement("br"));
editor.forceRedraw();
editor.focusEditor();
editor.updateToolbar();
if (table) {
var save_collapse = table.style.borderCollapse;
table.style.borderCollapse = "collapse";
table.style.borderCollapse = "separate";
table.style.borderCollapse = save_collapse;
}
}
}
},
i18n["Remove this node from the document"] ]);
return menu;
};
ContextMenu.prototype.popupMenu = function(ev) {
var self = this;
var i18n = ContextMenu.I18N;
if (this.currentMenu)
this.currentMenu.parentNode.removeChild(this.currentMenu);
function getPos(el) {
var r = { x: el.offsetLeft, y: el.offsetTop };
if (el.offsetParent) {
var tmp = getPos(el.offsetParent);
r.x += tmp.x;
r.y += tmp.y;
}
return r;
};
function documentClick(ev) {
ev || (ev = window.event);
if (!self.currentMenu) {
alert(i18n["How did you get here? (Please report!)"]);
return false;
}
var el = HTMLArea.is_ie ? ev.srcElement : ev.target;
for (; el != null && el != self.currentMenu; el = el.parentNode);
if (el == null)
self.closeMenu();
//HTMLArea._stopEvent(ev);
//return false;
};
var keys = [];
function keyPress(ev) {
ev || (ev = window.event);
HTMLArea._stopEvent(ev);
if (ev.keyCode == 27) {
self.closeMenu();
return false;
}
var key = String.fromCharCode(HTMLArea.is_ie ? ev.keyCode : ev.charCode).toLowerCase();
for (var i = keys.length; --i >= 0;) {
var k = keys[i];
if (k[0].toLowerCase() == key)
k[1].__msh.activate();
}
};
self.closeMenu = function() {
self.currentMenu.parentNode.removeChild(self.currentMenu);
self.currentMenu = null;
HTMLArea._removeEvent(document, "mousedown", documentClick);
HTMLArea._removeEvent(self.editordoc, "mousedown", documentClick);
if (keys.length > 0)
HTMLArea._removeEvent(self.editordoc, "keypress", keyPress);
if (HTMLArea.is_ie)
self.iePopup.hide();
};
var target = HTMLArea.is_ie ? ev.srcElement : ev.target;
var ifpos = getPos(self.editor._iframe);
var x = ev.clientX + ifpos.x;
var y = ev.clientY + ifpos.y;
var div;
var doc;
if (!HTMLArea.is_ie) {
doc = document;
} else {
// IE stinks
var popup = this.iePopup = window.createPopup();
doc = popup.document;
doc.open();
doc.write("<html><head><style type='text/css'>@import url(" + _editor_url + "plugins/ContextMenu/menu.css); html, body { padding: 0px; margin: 0px; overflow: hidden; border: 0px; }</style></head><body unselectable='yes'></body></html>");
doc.close();
}
div = doc.createElement("div");
if (HTMLArea.is_ie)
div.unselectable = "on";
div.oncontextmenu = function() { return false; };
div.className = "htmlarea-context-menu";
if (!HTMLArea.is_ie)
div.style.left = div.style.top = "0px";
doc.body.appendChild(div);
var table = doc.createElement("table");
div.appendChild(table);
table.cellSpacing = 0;
table.cellPadding = 0;
var parent = doc.createElement("tbody");
table.appendChild(parent);
var options = this.getContextMenu(target);
for (var i = 0; i < options.length; ++i) {
var option = options[i];
var item = doc.createElement("tr");
parent.appendChild(item);
if (HTMLArea.is_ie)
item.unselectable = "on";
else item.onmousedown = function(ev) {
HTMLArea._stopEvent(ev);
return false;
};
if (!option) {
item.className = "separator";
var td = doc.createElement("td");
td.className = "icon";
var IE_IS_A_FUCKING_SHIT = '>';
if (HTMLArea.is_ie) {
td.unselectable = "on";
IE_IS_A_FUCKING_SHIT = " unselectable='on' style='height=1px'>&nbsp;";
}
td.innerHTML = "<div" + IE_IS_A_FUCKING_SHIT + "</div>";
var td1 = td.cloneNode(true);
td1.className = "label";
item.appendChild(td);
item.appendChild(td1);
} else {
var label = option[0];
item.className = "item";
item.__msh = {
item: item,
label: label,
action: option[1],
tooltip: option[2] || null,
icon: option[3] || null,
activate: function() {
self.closeMenu();
self.editor.focusEditor();
this.action();
}
};
label = label.replace(/_([a-zA-Z0-9])/, "<u>$1</u>");
if (label != option[0])
keys.push([ RegExp.$1, item ]);
label = label.replace(/__/, "_");
var td1 = doc.createElement("td");
if (HTMLArea.is_ie)
td1.unselectable = "on";
item.appendChild(td1);
td1.className = "icon";
if (item.__msh.icon)
td1.innerHTML = "<img align='middle' src='" + item.__msh.icon + "' />";
var td2 = doc.createElement("td");
if (HTMLArea.is_ie)
td2.unselectable = "on";
item.appendChild(td2);
td2.className = "label";
td2.innerHTML = label;
item.onmouseover = function() {
this.className += " hover";
self.editor._statusBarTree.innerHTML = this.__msh.tooltip || '&nbsp;';
};
item.onmouseout = function() { this.className = "item"; };
item.oncontextmenu = function(ev) {
this.__msh.activate();
if (!HTMLArea.is_ie)
HTMLArea._stopEvent(ev);
return false;
};
item.onmouseup = function(ev) {
var timeStamp = (new Date()).getTime();
if (timeStamp - self.timeStamp > 500)
this.__msh.activate();
if (!HTMLArea.is_ie)
HTMLArea._stopEvent(ev);
return false;
};
//if (typeof option[2] == "string")
//item.title = option[2];
}
}
if (!HTMLArea.is_ie) {
var dx = x + div.offsetWidth - window.innerWidth + 4;
var dy = y + div.offsetHeight - window.innerHeight + 4;
if (dx > 0) x -= dx;
if (dy > 0) y -= dy;
div.style.left = x + "px";
div.style.top = y + "px";
} else {
// determine the size (did I mention that IE stinks?)
var foobar = document.createElement("div");
foobar.className = "htmlarea-context-menu";
foobar.innerHTML = div.innerHTML;
document.body.appendChild(foobar);
var w = foobar.offsetWidth;
var h = foobar.offsetHeight;
document.body.removeChild(foobar);
this.iePopup.show(ev.screenX, ev.screenY, w, h);
}
this.currentMenu = div;
this.timeStamp = (new Date()).getTime();
HTMLArea._addEvent(document, "mousedown", documentClick);
HTMLArea._addEvent(this.editordoc, "mousedown", documentClick);
if (keys.length > 0)
HTMLArea._addEvent(this.editordoc, "keypress", keyPress);
HTMLArea._stopEvent(ev);
return false;
};

View file

@ -0,0 +1,59 @@
// I18N constants
// LANG: "de", ENCODING: UTF-8 | ISO-8859-1
// translated: <]{MJ}[> i@student.ethz.ch
ContextMenu.I18N = {
// Items that appear in menu. Please note that an underscore (_)
// character in the translation (right column) will cause the following
// letter to become underlined and be shortcut for that menu option.
"Cut" : "Ausschneiden",
"Copy" : "Kopieren",
"Paste" : "Einfügen",
"Image Properties" : "_Bild Einstellungen...",
"Modify Link" : "_Link ändern...",
"Check Link" : "Link testen...",
"Remove Link" : "Link entfernen...",
"Cell Properties" : "Z_ellen Einstellungen...",
"Row Properties" : "Ze_ilen Einstellungen...",
"Insert Row Before" : "Zeile einfügen v_or Position",
"Insert Row After" : "Zeile einfügen n_ach Position",
"Delete Row" : "Zeile löschen",
"Table Properties" : "_Tabellen Einstellungen...",
"Insert Column Before" : "Spalte einfügen vo_r Position",
"Insert Column After" : "Spalte einfügen na_ch Position",
"Delete Column" : "Spalte löschen",
"Justify Left" : "Links ausrichten",
"Justify Center" : "Zentriert",
"Justify Right" : "Rechts ausrichten",
"Justify Full" : "Blocksatz",
"Make link" : "Lin_k erstellen...",
"Remove the" : "",
"Element" : "Element entfernen...",
// Other labels (tooltips and alert/confirm box messages)
"Please confirm that you want to remove this element:" : "Wollen sie dieses Element wirklich entfernen ?",
"Remove this node from the document" : "Dieses Element aus dem Dokument entfernen",
"How did you get here? (Please report!)" : "How did you get here? (Please report!)",
"Show the image properties dialog" : "Fenster für die Bild-Einstellungen anzeigen",
"Modify URL" : "URL ändern",
"Current URL is" : "Aktuelle URL ist",
"Opens this link in a new window" : "Diesen Link in neuem Fenster öffnen",
"Please confirm that you want to unlink this element." : "Wollen sie diesen Link wirklich entfernen ?",
"Link points to:" : "Link zeigt auf:",
"Unlink the current element" : "Link auf Element entfernen",
"Show the Table Cell Properties dialog" : "Zellen-Einstellungen anzeigen",
"Show the Table Row Properties dialog" : "Zeilen-Einstellungen anzeigen",
"Insert a new row before the current one" : "Zeile einfügen vor der aktuellen Position",
"Insert a new row after the current one" : "Zeile einfügen nach der aktuellen Position",
"Delete the current row" : "Zeile löschen",
"Show the Table Properties dialog" : "Show the Table Properties dialog",
"Insert a new column before the current one" : "Spalte einfügen vor der aktuellen Position",
"Insert a new column after the current one" : "Spalte einfügen nach der aktuellen Position",
"Delete the current column" : "Spalte löschen",
"Create a link" : "Link erstellen"
};

View file

@ -0,0 +1,57 @@
// I18N constants
// LANG: "el", ENCODING: UTF-8 | ISO-8859-7
// Author: Dimitris Glezos, dimitris@glezos.com
ContextMenu.I18N = {
// Items that appear in menu. Please note that an underscore (_)
// character in the translation (right column) will cause the following
// letter to become underlined and be shortcut for that menu option.
"Cut" : "Αποκοπή",
"Copy" : "Αντιγραφή",
"Paste" : "Επικόλληση",
"Image Properties" : "Ιδιότητες Εικόνας...",
"Modify Link" : "Τροποποίηση συνδέσμου...",
"Check Link" : "Έλεγχος συνδέσμων...",
"Remove Link" : "Διαγραφή συνδέσμου...",
"Cell Properties" : "Ιδιότητες κελιού...",
"Row Properties" : "Ιδιότητες γραμμής...",
"Insert Row Before" : "Εισαγωγή γραμμής πριν",
"Insert Row After" : "Εισαγωγή γραμμής μετά",
"Delete Row" : "Διαγραφή γραμμής",
"Table Properties" : "Ιδιότητες πίνακα...",
"Insert Column Before" : "Εισαγωγή στήλης πριν",
"Insert Column After" : "Εισαγωγή στήλης μετά",
"Delete Column" : "Διαγραφή στήλης",
"Justify Left" : "Στοίχηση Αριστερά",
"Justify Center" : "Στοίχηση Κέντρο",
"Justify Right" : "Στοίχηση Δεξιά",
"Justify Full" : "Πλήρης Στοίχηση",
"Make link" : "Δημιουργία συνδέσμου...",
"Remove the" : "Αφαίρεση",
"Element" : "στοιχείου...",
// Other labels (tooltips and alert/confirm box messages)
"Please confirm that you want to remove this element:" : "Είστε βέβαιος πως θέλετε να αφαιρέσετε το στοιχείο ",
"Remove this node from the document" : "Αφαίρεση αυτού του κόμβου από το έγγραφο",
"How did you get here? (Please report!)" : "Πώς ήρθατε μέχρι εδώ; (Παρακαλούμε αναφέρετε το!)",
"Show the image properties dialog" : "Εμφάνιση διαλόγου με τις Ιδιότητες εικόνας",
"Modify URL" : "Τροποποίηση URL",
"Current URL is" : "Το τρέχων URL είναι",
"Opens this link in a new window" : "Ανοίγει αυτό τον σύνδεσμο σε ένα νέο παράθυρο",
"Please confirm that you want to unlink this element." : "Είστε βέβαιος πως θέλετε να αφαιρέσετε τον σύνδεσμο από αυτό το στοιχείο:",
"Link points to:" : "Ο σύνδεμος οδηγεί εδώ:",
"Unlink the current element" : "Αφαίρεση συνδέσμου από το παρών στοιχείο",
"Show the Table Cell Properties dialog" : "Εμφάνιση διαλόγου με τις Ιδιότητες κελιού Πίνακα",
"Show the Table Row Properties dialog" : "Εμφάνιση διαλόγου με τις Ιδιότητες γραμμής Πίνακα",
"Insert a new row before the current one" : "Εισαγωγή μιας νέας γραμμής πριν την επιλεγμένη",
"Insert a new row after the current one" : "Εισαγωγή μιας νέας γραμμής μετά την επιλεγμένη",
"Delete the current row" : "Διαγραφή επιλεγμένης γραμμής",
"Show the Table Properties dialog" : "Εμφάνιση διαλόγου με τις Ιδιότητες Πίνακα",
"Insert a new column before the current one" : "Εισαγωγή νέας στήλης πριν την επιλεγμένη",
"Insert a new column after the current one" : "Εισαγωγή νέας στήλης μετά την επιλεγμένη",
"Delete the current column" : "Διαγραφή επιλεγμένης στήλης",
"Create a link" : "Δημιουργία συνδέσμου"
};

View file

@ -0,0 +1,66 @@
// 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.)
ContextMenu.I18N = {
// Items that appear in menu. Please note that an underscore (_)
// character in the translation (right column) will cause the following
// letter to become underlined and be shortcut for that menu option.
"Cut" : "Cut",
"Copy" : "Copy",
"Paste" : "Paste",
"Image Properties" : "_Image Properties...",
"Modify Link" : "_Modify Link...",
"Check Link" : "Chec_k Link...",
"Remove Link" : "_Remove Link...",
"Cell Properties" : "C_ell Properties...",
"Row Properties" : "Ro_w Properties...",
"Insert Row Before" : "I_nsert Row Before",
"Insert Row After" : "In_sert Row After",
"Delete Row" : "_Delete Row",
"Table Properties" : "_Table Properties...",
"Insert Column Before" : "Insert _Column Before",
"Insert Column After" : "Insert C_olumn After",
"Delete Column" : "De_lete Column",
"Justify Left" : "Justify Left",
"Justify Center" : "Justify Center",
"Justify Right" : "Justify Right",
"Justify Full" : "Justify Full",
"Make link" : "Make lin_k...",
"Remove the" : "Remove the",
"Element" : "Element...",
// Other labels (tooltips and alert/confirm box messages)
"Please confirm that you want to remove this element:" : "Please confirm that you want to remove this element:",
"Remove this node from the document" : "Remove this node from the document",
"How did you get here? (Please report!)" : "How did you get here? (Please report!)",
"Show the image properties dialog" : "Show the image properties dialog",
"Modify URL" : "Modify URL",
"Current URL is" : "Current URL is",
"Opens this link in a new window" : "Opens this link in a new window",
"Please confirm that you want to unlink this element." : "Please confirm that you want to unlink this element.",
"Link points to:" : "Link points to:",
"Unlink the current element" : "Unlink the current element",
"Show the Table Cell Properties dialog" : "Show the Table Cell Properties dialog",
"Show the Table Row Properties dialog" : "Show the Table Row Properties dialog",
"Insert a new row before the current one" : "Insert a new row before the current one",
"Insert a new row after the current one" : "Insert a new row after the current one",
"Delete the current row" : "Delete the current row",
"Show the Table Properties dialog" : "Show the Table Properties dialog",
"Insert a new column before the current one" : "Insert a new column before the current one",
"Insert a new column after the current one" : "Insert a new column after the current one",
"Delete the current column" : "Delete the current column",
"Create a link" : "Create a link"
};

View file

@ -0,0 +1,66 @@
// 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.)
ContextMenu.I18N = {
// Items that appear in menu. Please note that an underscore (_)
// character in the translation (right column) will cause the following
// letter to become underlined and be shortcut for that menu option.
"Cut" : "Knippen",
"Copy" : "Kopiëren",
"Paste" : "Plakken",
"Image Properties" : "Eigenschappen afbeelding...",
"Modify Link" : "Hyperlin_k aanpassen...",
"Check Link" : "Controleer hyperlin_k...",
"Remove Link" : "Ve_rwijder hyperlink...",
"Cell Properties" : "C_eleigenschappen...",
"Row Properties" : "Rijeigenscha_ppen...",
"Insert Row Before" : "Rij invoegen boven",
"Insert Row After" : "Rij invoegen onder",
"Delete Row" : "Rij _verwijderen",
"Table Properties" : "_Tabeleigenschappen...",
"Insert Column Before" : "Kolom invoegen voor",
"Insert Column After" : "Kolom invoegen na",
"Delete Column" : "Kolom verwijderen",
"Justify Left" : "Links uitlijnen",
"Justify Center" : "Centreren",
"Justify Right" : "Rechts uitlijnen",
"Justify Full" : "Uitvullen",
"Make link" : "Maak hyperlin_k...",
"Remove the" : "Verwijder het",
"Element" : "element...",
// Other labels (tooltips and alert/confirm box messages)
"Please confirm that you want to remove this element:" : "Is het werkelijk de bedoeling dit element te verwijderen:",
"Remove this node from the document" : "Verwijder dit punt van het document",
"How did you get here? (Please report!)" : "Hoe kwam je hier? (A.U.B. doorgeven!)",
"Show the image properties dialog" : "Laat het afbeeldingseigenschappen dialog zien",
"Modify URL" : "Aanpassen URL",
"Current URL is" : "Huidig URL is",
"Opens this link in a new window" : "Opend deze hyperlink in een nieuw venster",
"Please confirm that you want to unlink this element." : "Is het werkelijk de bedoeling dit element te unlinken.",
"Link points to:" : "Hyperlink verwijst naar:",
"Unlink the current element" : "Unlink het huidige element",
"Show the Table Cell Properties dialog" : "Laat de tabel celeigenschappen dialog zien",
"Show the Table Row Properties dialog" : "Laat de tabel rijeigenschappen dialog zien",
"Insert a new row before the current one" : "Voeg een nieuwe rij in boven de huidige",
"Insert a new row after the current one" : "Voeg een nieuwe rij in onder de huidige",
"Delete the current row" : "Verwijder de huidige rij",
"Show the Table Properties dialog" : "Laat de tabel eigenschappen dialog zien",
"Insert a new column before the current one" : "Voeg een nieuwe kolom in voor de huidige",
"Insert a new column after the current one" : "Voeg een nieuwe kolom in na de huidige",
"Delete the current column" : "Verwijder de huidige kolom",
"Create a link" : "Maak een hyperlink"
};

View file

@ -0,0 +1,64 @@
/* styles for the ContextMenu /HTMLArea */
/* The ContextMenu plugin is (c) dynarch.com 2003. */
/* Distributed under the same terms as HTMLArea itself */
div.htmlarea-context-menu {
position: absolute;
border: 1px solid #aca899;
padding: 2px;
background-color: #fff;
cursor: default;
z-index: 1000;
}
div.htmlarea-context-menu table {
font: 11px tahoma,verdana,sans-serif;
border-collapse: collapse;
}
div.htmlarea-context-menu tr.item td.icon img {
width: 18px;
height: 18px;
}
div.htmlarea-context-menu tr.item td.icon {
padding: 0px 3px;
height: 18px;
background-color: #cdf;
}
div.htmlarea-context-menu tr.item td.label {
padding: 1px 10px 1px 3px;
}
div.htmlarea-context-menu tr.separator td {
padding: 2px 0px;
}
div.htmlarea-context-menu tr.separator td div {
border-top: 1px solid #aca899;
overflow: hidden;
position: relative;
}
div.htmlarea-context-menu tr.separator td.icon {
background-color: #cdf;
}
div.htmlarea-context-menu tr.separator td.icon div {
/* margin-left: 3px; */
border-color: #fff;
}
div.htmlarea-context-menu tr.separator td.label div {
margin-right: 3px;
}
div.htmlarea-context-menu tr.item.hover {
background-color: #316ac5;
color: #fff;
}
div.htmlarea-context-menu tr.item.hover td.icon {
background-color: #619af5;
}

View file

@ -0,0 +1,143 @@
// FullPage Plugin for HTMLArea-3.0
// Implementation by Mihai Bazon. Sponsored by http://thycotic.com
//
// htmlArea v3.0 - Copyright (c) 2002 interactivetools.com, inc.
// This notice MUST stay intact for use (see license.txt).
//
// A free WYSIWYG editor replacement for <textarea> fields.
// For full source code and docs, visit http://www.interactivetools.com/
//
// Version 3.0 developed by Mihai Bazon for InteractiveTools.
// http://dynarch.com/mishoo
//
// $Id$
function FullPage(editor) {
this.editor = editor;
var cfg = editor.config;
cfg.fullPage = true;
var tt = FullPage.I18N;
var self = this;
cfg.registerButton("FP-docprop", tt["Document properties"], editor.imgURL("docprop.gif", "FullPage"), false,
function(editor, id) {
self.buttonPress(editor, id);
});
// add a new line in the toolbar
cfg.toolbar[0].splice(0, 0, "separator");
cfg.toolbar[0].splice(0, 0, "FP-docprop");
};
FullPage._pluginInfo = {
name : "FullPage",
version : "1.0",
developer : "Mihai Bazon",
developer_url : "http://dynarch.com/mishoo/",
c_owner : "Mihai Bazon",
sponsor : "Thycotic Software Ltd.",
sponsor_url : "http://thycotic.com",
license : "htmlArea"
};
FullPage.prototype.buttonPress = function(editor, id) {
var self = this;
switch (id) {
case "FP-docprop":
var doc = editor._doc;
var links = doc.getElementsByTagName("link");
var style1 = '';
var style2 = '';
for (var i = links.length; --i >= 0;) {
var link = links[i];
if (/stylesheet/i.test(link.rel)) {
if (/alternate/i.test(link.rel))
style2 = link.href;
else
style1 = link.href;
}
}
var title = doc.getElementsByTagName("title")[0];
title = title ? title.innerHTML : '';
var init = {
f_doctype : editor.doctype,
f_title : title,
f_body_bgcolor : HTMLArea._colorToRgb(doc.body.style.backgroundColor),
f_body_fgcolor : HTMLArea._colorToRgb(doc.body.style.color),
f_base_style : style1,
f_alt_style : style2,
editor : editor
};
editor._popupDialog("plugin://FullPage/docprop", function(params) {
self.setDocProp(params);
}, init);
break;
}
};
FullPage.prototype.setDocProp = function(params) {
var txt = "";
var doc = this.editor._doc;
var head = doc.getElementsByTagName("head")[0];
var links = doc.getElementsByTagName("link");
var style1 = null;
var style2 = null;
for (var i = links.length; --i >= 0;) {
var link = links[i];
if (/stylesheet/i.test(link.rel)) {
if (/alternate/i.test(link.rel))
style2 = link;
else
style1 = link;
}
}
function createLink(alt) {
var link = doc.createElement("link");
link.rel = alt ? "alternate stylesheet" : "stylesheet";
head.appendChild(link);
return link;
};
if (!style1 && params.f_base_style)
style1 = createLink(false);
if (params.f_base_style)
style1.href = params.f_base_style;
else if (style1)
head.removeChild(style1);
if (!style2 && params.f_alt_style)
style2 = createLink(true);
if (params.f_alt_style)
style2.href = params.f_alt_style;
else if (style2)
head.removeChild(style2);
for (var i in params) {
var val = params[i];
switch (i) {
case "f_title":
var title = doc.getElementsByTagName("title")[0];
if (!title) {
title = doc.createElement("title");
head.appendChild(title);
} else while (node = title.lastChild)
title.removeChild(node);
if (!HTMLArea.is_ie)
title.appendChild(doc.createTextNode(val));
else
doc.title = val;
break;
case "f_doctype":
this.editor.setDoctype(val);
break;
case "f_body_bgcolor":
doc.body.style.backgroundColor = val;
break;
case "f_body_fgcolor":
doc.body.style.color = val;
break;
}
}
};

Binary file not shown.

After

Width:  |  Height:  |  Size: 302 B

View file

@ -0,0 +1,25 @@
// I18N for the FullPage plugin
// 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.)
FullPage.I18N = {
"Alternate style-sheet:": "Alternate style-sheet:",
"Background color:": "Background color:",
"Cancel": "Cancel",
"DOCTYPE:": "DOCTYPE:",
"Document properties": "Document properties",
"Document title:": "Document title:",
"OK": "OK",
"Primary style-sheet:": "Primary style-sheet:",
"Text color:": "Text color:"
};

View file

@ -0,0 +1,25 @@
// I18N for the FullPage plugin
// 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.)
FullPage.I18N = {
"Alternate style-sheet:": "Template CSS alternativ:",
"Background color:": "Culoare de fundal:",
"Cancel": "Renunţă",
"DOCTYPE:": "DOCTYPE:",
"Document properties": "Proprietăţile documentului",
"Document title:": "Titlul documentului:",
"OK": "Acceptă",
"Primary style-sheet:": "Template CSS principal:",
"Text color:": "Culoare text:"
};

View file

@ -0,0 +1,131 @@
<html>
<head>
<title>Document properties</title>
<script type="text/javascript" src="../../../popups/popup.js"></script>
<script type="text/javascript">
FullPage = window.opener.FullPage; // load the FullPage plugin and lang file ;-)
window.resizeTo(400, 100);
var accepted = {
f_doctype : true,
f_title : true,
f_body_bgcolor : true,
f_body_fgcolor : true,
f_base_style : true,
f_alt_style : true
};
var editor = null;
function Init() {
__dlg_translate(FullPage.I18N);
__dlg_init();
var params = window.dialogArguments;
for (var i in params) {
if (i in accepted) {
var el = document.getElementById(i);
el.value = params[i];
}
}
editor = params.editor;
document.getElementById("f_title").focus();
document.getElementById("f_title").select();
};
function onOK() {
var required = {
};
for (var i in required) {
var el = document.getElementById(i);
if (!el.value) {
alert(required[i]);
el.focus();
return false;
}
}
var param = {};
for (var i in accepted) {
var el = document.getElementById(i);
param[i] = el.value;
}
__dlg_close(param);
return false;
};
function onCancel() {
__dlg_close(null);
return false;
};
</script>
<style type="text/css">
html, body {
background: ButtonFace;
color: ButtonText;
font: 11px Tahoma,Verdana,sans-serif;
margin: 0px;
padding: 0px;
}
body { padding: 5px; }
table {
font: 11px Tahoma,Verdana,sans-serif;
}
select, input, button { font: 11px Tahoma,Verdana,sans-serif; }
button { width: 70px; }
table .label { text-align: right; width: 12em; }
.title { background: #ddf; color: #000; font-weight: bold; font-size: 120%; padding: 3px 10px; margin-bottom: 10px;
border-bottom: 1px solid black; letter-spacing: 2px;
}
#buttons {
margin-top: 1em; border-top: 1px solid #999;
padding: 2px; text-align: right;
}
</style>
</head>
<body onload="Init()">
<div class="title"><span>Document properties</span></div>
<table style="width: 100%">
<tr>
<td class="label"><span>Document title:</span></td>
<td><input type="text" id="f_title" style="width: 100%" /></td>
</tr>
<tr>
<td class="label"><span>DOCTYPE:</span></td>
<td><input type="text" id="f_doctype" style="width: 100%" /></td>
</tr>
<tr>
<td class="label"><span>Primary style-sheet:</span></td>
<td><input type="text" id="f_base_style" style="width: 100%" /></td>
</tr>
<tr>
<td class="label"><span>Alternate style-sheet:</span></td>
<td><input type="text" id="f_alt_style" style="width: 100%" /></td>
</tr>
<tr>
<td class="label"><span>Background color:</span></td>
<td><input type="text" id="f_body_bgcolor" size="7" /></td>
</tr>
<tr>
<td class="label"><span>Text color:</span></td>
<td><input type="text" id="f_body_fgcolor" size="7" /></td>
</tr>
</table>
<div id="buttons">
<button type="button" name="ok" onclick="return onOK();"><span>OK</span></button>
<button type="button" name="cancel" onclick="return onCancel();"><span>Cancel</span></button>
</div>
</body>
</html>

View file

@ -0,0 +1,89 @@
<html>
<head>
<title>Test of FullPage plugin</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<script type="text/javascript">
_editor_url = "../../";
</script>
<!-- load the main HTMLArea files -->
<script type="text/javascript" src="../../htmlarea.js"></script>
<script type="text/javascript" src="../../lang/en.js"></script>
<script type="text/javascript" src="../../dialog.js"></script>
<!-- <script type="text/javascript" src="popupdiv.js"></script> -->
<script type="text/javascript" src="../../popupwin.js"></script>
<script type="text/javascript">
HTMLArea.loadPlugin("TableOperations");
HTMLArea.loadPlugin("SpellChecker");
HTMLArea.loadPlugin("FullPage");
function initDocument() {
var editor = new HTMLArea("editor");
editor.registerPlugin(TableOperations);
editor.registerPlugin(SpellChecker);
editor.registerPlugin(FullPage);
editor.generate();
}
</script>
<style type="text/css">
@import url(../../htmlarea.css);
</style>
</head>
<body onload="initDocument()">
<h1>Test of FullPage plugin</h1>
<textarea id="editor" style="height: 30em; width: 100%;">
&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"&gt;
&lt;html&gt;
&lt;head&gt;
&lt;title&gt;FullPage plugin for HTMLArea&lt;/title&gt;
&lt;link rel="alternate stylesheet" href="http://dynarch.com/mishoo/css/dark.css" /&gt;
&lt;link rel="stylesheet" href="http://dynarch.com/mishoo/css/cool-light.css" /&gt;
&lt;/head&gt;
&lt;body style="background-color: #ddddee; color: #000077;"&gt;
&lt;table style="width:60%; height: 90%; margin: 2% auto 1% auto;" align="center" border="0" cellpadding="0" cellspacing="0"&gt;
&lt;tr&gt;
&lt;td style="background-color: #ddeedd; border: 2px solid #002; height: 1.5em; padding: 2px; font: bold 24px Verdana;"&gt;
FullPage plugin
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="background-color: #fff; border: 1px solid #aab; padding: 1em 3em; font: 12px Verdana;"&gt;
&lt;p&gt;
This plugin enables one to edit a full HTML file in &lt;a
href="http://dynarch.com/htmlarea/"&gt;HTMLArea&lt;/a&gt;. This is not
normally possible with just the core editor since it only
retrieves the HTML inside the &lt;code&gt;body&lt;/code&gt; tag.
&lt;/p&gt;
&lt;p&gt;
It provides the ability to change the &lt;code&gt;DOCTYPE&lt;/code&gt; of
the document, &lt;code&gt;body&lt;/code&gt; &lt;code&gt;bgcolor&lt;/code&gt; and
&lt;code&gt;fgcolor&lt;/code&gt; attributes as well as to add additional
&lt;code&gt;link&lt;/code&gt;-ed stylesheets. Cool, eh?
&lt;/p&gt;
&lt;p&gt;
The development of this plugin was initiated and sponsored by
&lt;a href="http://thycotic.com"&gt;Thycotic Software Ltd.&lt;/a&gt;.
That's also cool, isn't it? ;-)
&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/body&gt;
&lt;/html&gt;
</textarea>
<hr />
<address><a href="http://dynarch.com/mishoo/">Mihai Bazon</a></address>
<!-- Created: Wed Oct 1 19:55:37 EEST 2003 -->
<!-- hhmts start -->
Last modified on Sat Oct 25 01:06:59 2003
<!-- hhmts end -->
<!-- doc-lang: English -->
</body>
</html>

Binary file not shown.

After

Width:  |  Height:  |  Size: 107 B

View file

@ -0,0 +1,37 @@
// I18N constants
// LANG: "cz", ENCODING: UTF-8 | ISO-8859-2
// Author: Jiri Löw, <jirilow@jirilow.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.)
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 ;-)"
};

View file

@ -0,0 +1,37 @@
// I18N constants
// LANG: "en", ENCODING: UTF-8 | ISO-8859-1
// Author: Steen Sønderup, <steen@soenderup.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.)
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"
};

View file

@ -0,0 +1,28 @@
// I18N constants
// LANG: "en", ENCODING: UTF-8 | ISO-8859-1
// Author: Broxx, <broxx@broxx.com>
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 ;-)"
};

View file

@ -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 ;-)"
};

View file

@ -0,0 +1,37 @@
// I18N constants
// LANG: "hu", ENCODING: UTF-8
// Author: Miklós Somogyi, <somogyine@vnet.hu>
// 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 ;-)"
};

View file

@ -0,0 +1,28 @@
// I18N constants
// LANG: "it", ENCODING: UTF-8 | ISO-8859-1
// Author: Fabio Rotondo, <fabio@rotondo.it>
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 ;-)"
};

View file

@ -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 ;-)"
};

View file

@ -0,0 +1,114 @@
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 3.2//EN">
<html>
<head>
<title>HTMLArea Spell Checker</title>
</head>
<body>
<h1>HTMLArea Spell Checker</h1>
<p>The HTMLArea Spell Checker subsystem consists of the following
files:</p>
<ul>
<li>spell-checker.js &mdash; the spell checker plugin interface for
HTMLArea</li>
<li>spell-checker-ui.html &mdash; the HTML code for the user
interface</li>
<li>spell-checker-ui.js &mdash; functionality of the user
interface</li>
<li>spell-checker-logic.cgi &mdash; Perl CGI script that checks a text
given through POST for spelling errors</li>
<li>spell-checker-style.css &mdash; style for mispelled words</li>
<li>lang/en.js &mdash; main language file (English).</li>
</ul>
<h2>Process overview</h2>
<p>
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
<tt>window.opener.SpellChecker.editor</tt> 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.
</p>
<p>
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.
</p>
<h2>The server-side script (spell-check-logic.cgi)</h2>
<p>
<strong>Unicode safety</strong> &mdash; the program <em>is</em>
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). <strike>However, Aspell seems to not support Unicode
yet (<a
href="http://mail.gnu.org/archive/html/aspell-user/2000-11/msg00007.html">thread concerning Aspell and Unicode</a>).
This mean that words containing Unicode
characters that are not in 0..255 are likely to be reported as "mispelled" by Aspell.</strike>
</p>
<p>
<strong style="font-variant: small-caps; color:
red;">Update:</strong> though I've never seen it mentioned
anywhere, it looks that Aspell <em>does</em>, in fact, speak
Unicode. Or else, maybe <code>Text::Aspell</code> does
transparent conversion; anyway, this new version of our
SpellChecker plugin is, as tests show so far, fully
Unicode-safe... well, probably the <em>only</em> freeware
Web-based spell-checker which happens to have Unicode support.
</p>
<p>
The Perl Unicode manual (man perluniintro) states:
</p>
<blockquote>
<em>
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.
</em>
</blockquote>
<p>In other words, do <em>not</em> assume that this script is
Unicode-safe on Perl interpreters older than 5.8.0.</p>
<p>The following Perl modules are required:</p>
<ul>
<li><a href="http://search.cpan.org/search?query=Text%3A%3AAspell&mode=all" target="_blank">Text::Aspell</a></li>
<li><a href="http://search.cpan.org/search?query=XML%3A%3ADOM&mode=all" target="_blank">XML::DOM</a></li>
<li><a href="http://search.cpan.org/search?query=CGI&mode=all" target="_blank">CGI</a></li>
</ul>
<p>Of these, only Text::Aspell might need to be installed manually. The
others are likely to be available by default in most Perl distributions.</p>
<hr />
<address><a href="http://dynarch.com/mishoo/">Mihai Bazon</a></address>
<!-- Created: Thu Jul 17 13:22:27 EEST 2003 -->
<!-- hhmts start --> Last modified: Fri Jan 30 19:14:11 EET 2004 <!-- hhmts end -->
<!-- doc-lang: English -->
</body>
</html>

View file

@ -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^<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<link rel="stylesheet" type="text/css" media="all" href="spell-check-style.css" />
<script type="text/javascript">
var suggested_words = { $js_suggested_words };
var spellcheck_info = { $js_spellcheck_info }; </script>
</head>
<body onload="window.parent.finishedSpellChecking();">^;
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^<div id="HA-spellcheck-dictionaries">$dictionaries</div>^;
}
print '</body></html>';
# 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 = '<spellchecker>'.$text.'</spellchecker>';
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{<spellchecker>(.*)</spellchecker>}{$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;
};

View file

@ -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; }

View file

@ -0,0 +1,122 @@
<!--
Strangely, IE sucks with or without the DOCTYPE switch.
I thought it would only suck without it.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
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$
-->
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Spell Checker</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<script type="text/javascript" src="spell-check-ui.js"></script>
<style type="text/css">
html, body { height: 100%; margin: 0px; padding: 0px; background-color: #fff;
color: #000; }
a:link, a:visited { color: #00f; text-decoration: none; }
a:hover { color: #f00; text-decoration: underline; }
table { background-color: ButtonFace; color: ButtonText;
font-family: tahoma,verdana,sans-serif; font-size: 11px; }
iframe { background-color: #fff; color: #000; height: 100%; width: 100%; }
.controls { width: 13em; }
.controls .sectitle { /* background-color: #736c6c; color: #fff;
border-top: 1px solid #000; border-bottom: 1px solid #fff; */
text-align: center;
font-weight: bold; padding: 2px 4px; }
.controls .secbody { margin-bottom: 10px; }
button, select { font-family: tahoma,verdana,sans-serif; font-size: 11px; }
button { width: 6em; padding: 0px; }
input, select { font-family: fixed,"andale mono",monospace; }
#v_currentWord { color: #f00; font-weight: bold; }
#statusbar { padding: 7px 0px 0px 5px; }
#status { font-weight: bold; }
</style>
</head>
<body onload="initDocument()">
<form style="display: none;" action="spell-check-logic.cgi"
method="post" target="framecontent"
accept-charset="UTF-8"
><input type="hidden" name="content" id="f_content"
/><input type="hidden" name="dictionary" id="f_dictionary"
/><input type="hidden" name="init" id="f_init" value="1"
/></form>
<table style="height: 100%; width: 100%; border-collapse: collapse;" cellspacing="0" cellpadding="0">
<tr>
<td colspan="2" style="height: 1em; padding: 2px;">
<div style="float: right; padding: 2px;"><span>Dictionary</span>
<select id="v_dictionaries" style="width: 10em"></select>
<button id="b_recheck">Re-check</button>
</div>
<span id="status">Please wait. Calling spell checker.</span>
</td>
</tr>
<tr>
<td valign="top" class="controls">
<div class="secbody" style="text-align: center">
<button id="b_info">Info</button>
</div>
<div class="sectitle">Original word</div>
<div class="secbody" id="v_currentWord" style="text-align:
center; margin-bottom: 0px;">pliz weit ;-)</div>
<div class="secbody" style="text-align: center">
<button id="b_revert">Revert</button>
</div>
<div class="sectitle">Replace with</div>
<div class="secbody">
<input type="text" id="v_replacement" style="width: 94%; margin-left: 3%;" /><br />
<div style="text-align: center; margin-top: 2px;">
<button id="b_replace">Replace</button><button
id="b_replall">Replace all</button><br /><button
id="b_ignore">Ignore</button><button
id="b_ignall">Ignore all</button>
</div>
</div>
<div class="sectitle">Suggestions</div>
<div class="secbody">
<select size="11" style="width: 94%; margin-left: 3%;" id="v_suggestions"></select>
</div>
</td>
<td>
<iframe src="about:blank" width="100%" height="100%"
id="i_framecontent" name="framecontent"></iframe>
</td>
</tr>
<tr>
<td style="height: 1em;" colspan="2">
<div style="padding: 4px 2px 2px 2px; float: right;">
<button id="b_ok">OK</button>
<button id="b_cancel">Cancel</button>
</div>
<div id="statusbar"></div>
</td>
</tr>
</table>
</body>
</html>

View file

@ -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.
// 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 in spans) {
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 in types) {
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 in a) {
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 in a) {
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 "<b>' + currentElement.__msh_origWord + '</b>"';
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 (<a href='readme-tech.html' target='_blank' title='Technical information'>info</a>)";
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);
}
}
};

View file

@ -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.
// 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 in bl) {
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 in toolbar) {
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;

Binary file not shown.

After

Width:  |  Height:  |  Size: 101 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 118 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 118 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 896 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 155 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 907 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 100 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 111 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 110 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 908 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 104 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 116 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 115 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 149 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 895 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 145 B

View file

@ -0,0 +1,90 @@
// I18N constants
// LANG: "cz", ENCODING: UTF-8 | ISO-8859-2
// Author: Jiri Löw, <jirilow@jirilow.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": "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ů"
};

View file

@ -0,0 +1,90 @@
// I18N constants
// LANG: "da", ENCODING: UTF-8 | ISO-8859-1
// Author: Steen Sønderup, <steen@soenderup.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": "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"
};

View file

@ -0,0 +1,81 @@
// I18N constants
// LANG: "de", ENCODING: UTF-8 | ISO-8859-1
// Author: broxx, <broxx@broxx.com>
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"
};

View file

@ -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"
};

View file

@ -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"
};

View file

@ -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": "Väri",
"Description": "Kuvaus",
"FG Color": "FG Väri",
"Frames": "Kehykset",
"Image URL": "Kuvan osoite",
"Layout": "Sommittelu",
"Left": "Vasen",
"Margin": "Marginaali",
"Middle": "Keskelle",
"No rules": "Ei viivoja",
"No sides": "Ei sivuja",
"Padding": "Palstantäyte",
"Right": "Oikea",
"Row Properties": "Rivin asetukset",
"Rules will appear between all rows and columns": "Viivat jokaisen rivin ja sarakkeen välillä",
"Rules will appear between columns only": "Viivat ainoastaan sarakkeiden välillä",
"Rules will appear between rows only": "Viivat ainoastaan rivien välillä",
"Rules": "Viivat",
"Spacing": "Palstatila",
"Summary": "Yhteenveto",
"TO-cell-delete": "Poista solu",
"TO-cell-insert-after": "Lisää solu perään",
"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 perään",
"TO-col-insert-before": "Lisää sarake ennen",
"TO-col-split": "Jaa sarake",
"TO-row-delete": "Poista rivi",
"TO-row-insert-above": "Lisää rivi yläpuolelle",
"TO-row-insert-under": "Lisää rivi alapuolelle",
"TO-row-prop": "Rivin asetukset",
"TO-row-split": "Jaa rivi",
"TO-table-prop": "Taulukon asetukset",
"Top": "Ylös",
"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 yläpuoli",
"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ä"
};

View file

@ -0,0 +1,63 @@
// I18N constants
// LANG: "hu", ENCODING: UTF-8
// Author: Miklós Somogyi, <somogyine@vnet.hu>
// 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"
}
};

View file

@ -0,0 +1,81 @@
// I18N constants
// LANG: "it", ENCODING: UTF-8 | ISO-8859-1
// Author: Fabio Rotondo <fabio@rotondo.it>
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"
};

View file

@ -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"
};

View file

@ -0,0 +1,91 @@
// I18N constants
// LANG: "en", ENCODING: UTF-8 | ISO-8859-1
// Author: Mihai Bazon, <mishoo@infoiasi.ro>
// 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": "Høyde",
"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": "Høyre",
"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 før",
"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": "Høyre- og venstresiden kun",
"The right-hand side only": "Høyresiden 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"
};

View file

@ -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"
};

File diff suppressed because it is too large Load diff