Commit d7959a83 authored by Tristan Cavelier's avatar Tristan Cavelier Committed by Sebastien Robin

Adding lib Xinha to OfficeJS (text editor)

parent ac7a9039

Too many changes to show.

To preserve performance only 1000 of 1000+ files are displayed.

.htmlarea { background: #fff; }
.htmlarea td { margin:0;padding:0; }
.htmlarea .toolbarRow {
width:1px;
}
.htmlarea .toolbar {
cursor: default;
background: ButtonFace;
padding: 3px;
border: 1px solid;
border-color: ButtonHighlight ButtonShadow ButtonShadow ButtonHighlight;
}
.htmlarea .toolbar table { margin: 0; font-family: Tahoma, Verdana,sans-serif; font-size: 11px; }
.htmlarea .toolbar img { border: none; vertical-align: top; }
.htmlarea .toolbar .label { padding: 0 3px; }
.htmlarea .toolbar .button {
background: ButtonFace;
color: ButtonText;
border: 1px solid ButtonFace;
padding: 1px;
margin: 0;
width: 18px;
height: 18px;
}
.htmlarea .toolbar a.button:hover {
border: 1px solid;
border-color: ButtonHighlight ButtonShadow ButtonShadow ButtonHighlight;
}
.htmlarea .toolbar a.buttonDisabled:hover {
border-color: ButtonFace;
}
.htmlarea .toolbar .buttonActive,
.htmlarea .toolbar .buttonPressed
{
padding: 2px 0 0 2px;
border: 1px solid;
border-color: ButtonShadow ButtonHighlight ButtonHighlight ButtonShadow;
}
.htmlarea .toolbar .buttonPressed {
background: ButtonHighlight;
}
.htmlarea .toolbar .indicator {
padding: 0 3px;
overflow: hidden;
width: 20px;
text-align: center;
cursor: default;
border: 1px solid ButtonShadow;
}
.htmlarea .toolbar .buttonDisabled img {
filter: gray() alpha(opacity = 25);
-moz-opacity: 0.25;
opacity: 0.25;
}
.htmlarea .toolbar .separator {
/*position: relative;*/
margin:0 3px;
border-left: 1px solid ButtonShadow;
border-right: 1px solid ButtonHighlight;
width: 0;
height: 18px;
padding: 0;
}
.htmlarea .toolbar .space { width: 5px; }
.htmlarea .toolbar select, .htmlarea .toolbar option { font: 11px Tahoma,Verdana,sans-serif;}
.htmlarea .toolbar select,
.htmlarea .toolbar select:hover,
.htmlarea .toolbar select:active {
position:relative;
top:-2px;
margin-bottom:-2px;
color: ButtonText;
}
.htmlarea iframe.xinha_iframe, .htmlarea textarea.xinha_textarea
{
border: none; /*1px solid;*/
}
.htmlarea .statusBar {
border: 1px solid;
border-color: ButtonShadow ButtonHighlight ButtonHighlight ButtonShadow;
padding: 2px 4px;
background-color: ButtonFace;
color: ButtonText;
font: 11px Tahoma,Verdana,sans-serif;
height:16px;
overflow: hidden;
}
.htmlarea .statusBar .statusBarTree a {
padding: 2px 5px;
color: #00f;
}
.htmlarea .statusBar .statusBarTree a:visited { color: #00f; }
.htmlarea .statusBar .statusBarTree a:hover {
background-color: Highlight;
color: HighlightText;
padding: 1px 4px;
border: 1px solid HighlightText;
}
.statusBarWidgetContainer {
background-color: ButtonFace;
}
/* popup dialogs */
.dialog {
color: ButtonText;
background: ButtonFace;
border: 1px outset;
border-color: WindowFrame;
}
div.dialog {
padding-bottom:10px;
border-radius: 8px 8px 0 0;
-moz-border-radius: 8px 8px 0 0;
-webkit-border-top-left-radius: 8px;
-webkit-border-top-right-radius: 8px;
box-shadow: 9px 9px 10px #444;
-moz-box-shadow: 9px 9px 10px #444;
-webkit-box-shadow: 9px 9px 10px #444;
}
div.dialog.modeless {
box-shadow: 4px 4px 5px #888;
-moz-box-shadow: 4px 4px 5px #888;
-webkit-box-shadow: 4px 4px 5px #888;
}
div.dialog.chrome {
-webkit-box-shadow: none !IMPORTANT;
}
.panels div.dialog.panel {
border-radius:0;
-moz-border-radius: 0;
-webkit-border-radius:0;
box-shadow: none;
-moz-box-shadow: none;
-webkit-box-shadow: none;
}
.xinha_dialog_background {
filter: alpha(opacity=0);
-moz-opacity: 0;
opacity: 0;
border:none;
}
.xinha_dialog_background_modal_greyout {
background-color:#666;
filter: alpha(opacity=70) !IMPORTANT;
-moz-opacity: 0.7;
opacity: 0.7;
}
.xinha_dialog_background_modal {
filter: alpha(opacity=0) !IMPORTANT;
-moz-opacity: 0;
opacity: 0;
border:none;
}
body.xinha_dialog_background_modal_greyout {
filter: alpha(opacity=100) !IMPORTANT;
}
body.xinha_dialog_background_modal {
filter: alpha(opacity=0);
}
.dialog .content { padding: 2px; }
.dialog, .dialog button, .dialog input, .dialog select, .dialog textarea, .dialog table {
font: 11px Tahoma,Verdana,sans-serif;
}
.dialog table { border-collapse: collapse; }
.dialog .title, .dialog h1
{
background: ActiveCaption;
color: CaptionText;
border-bottom: 1px solid #000;
padding: 1px 0 2px 5px;
font-size: 12px;
font-weight: bold;
cursor: default;
letter-spacing: 0.01em;
}
.dialog h1 {
padding-left:22px;
margin:0;
border-radius: 8px 8px 0 0;
-moz-border-radius: 8px 8px 0 0;
-webkit-border-top-left-radius: 8px;
-webkit-border-top-right-radius: 8px;
}
.panels .dialog.panel h1 {
-moz-border-radius: 0;
-webkit-border-radius:0;
}
.dialog .title .button {
float: right;
border: 1px solid #66a;
padding: 0 1px 0 2px;
margin-right: 1px;
color: #fff;
text-align: center;
}
.dialog .title .button-hilite { border-color: #88f; background: #44c; }
.dialog button {
width: 5.5em;
padding: 0;
}
.dialog .closeButton {
padding: 0;
cursor: default;
border: 1px solid;
border-color: ButtonHighlight ButtonShadow ButtonShadow ButtonHighlight;
height : 11px;
width : 11px;
vertical-align : top;
position : absolute;
top : 3px;
right : 2px;
background-color: ButtonFace;
color: ButtonText;
font-size: 13px;
font-family: Tahoma,Verdana,sans-serif;
text-align:center;
letter-spacing:0;
overflow:hidden;
}
.dialog .buttonColor {
width :1em;
padding: 1px;
cursor: default;
border: 1px solid;
border-color: ButtonHighlight ButtonShadow ButtonShadow ButtonHighlight;
}
.dialog .buttonColor .chooser, .dialog .buttonColor .nocolor {
height: 0.6em;
border: 1px solid;
padding: 0 1em;
border-color: ButtonShadow ButtonHighlight ButtonHighlight ButtonShadow;
}
.dialog .buttonClick {
border-color: ButtonShadow ButtonHighlight ButtonHighlight ButtonShadow;
}
.dialog .buttonColor-hilite {
border-color: ButtonShadow ButtonHighlight ButtonHighlight ButtonShadow;
}
.dialog .buttonColor .nocolor { padding: 0; }
.dialog .buttonColor .nocolor-hilite { background-color: #fff; color: #f00; }
.dialog .label { text-align: right; width: 6em; }
.dialog .value input { width: 100%; }
.dialog legend { font-weight: bold; }
.dialog fieldset table { margin: 2px 0; }
.dialog .buttons {
padding: 1em;
text-align: center;
}
.dialog .resizeHandle {
-moz-appearance : resizer;
width: 12px;
height: 12px;
border-bottom: 2px solid #000;
border-right: 2px solid #000;
cursor : se-resize;
}
.popupwin {
padding: 0;
margin: 0;
}
.popupwin .title {
background: #fff;
color: #000;
font-weight: bold;
font-size: 120%;
padding: 3px 10px;
margin-bottom: 10px;
border-bottom: 1px solid black;
letter-spacing: 2px;
}
form { margin: 0; border: none; }
/** Panels **/
.htmlarea .panels_top
{
border-bottom : 1px solid;
border-color: ButtonShadow;
}
.htmlarea .panels_right
{
border-left : 1px solid;
border-color: ButtonShadow;
}
.htmlarea .panels_left
{
border-right : 1px solid;
border-color: ButtonShadow;
}
.htmlarea .panels_bottom
{
border-top : 1px solid;
border-color: ButtonShadow;
}
.htmlarea .panel h1 {
clear:left;
font-size:0.9em;
}
.htmlarea .panel {
overflow:hidden;
background-color:white;
padding-bottom:0 !IMPORTANT;
border: none !IMPORTANT;
}
.htmlarea .panels_left .panel { border-right:none; border-left:none; }
.htmlarea .panels_left h1 { border-right:none; }
.htmlarea .panels_right .panel { border-right:none; border-left:none; }
.htmlarea .panels_left h1 { border-left:none; }
.htmlarea { border: 1px solid black; }
.loading
{
font-family:sans-serif;
position:absolute;
z-index:998;
text-align:center;
width:212px;
padding: 55px 0 5px 0;
border:2px solid #ccc;
/* border-color: ButtonHighlight ButtonShadow ButtonShadow ButtonHighlight;*/
background: url(images/xinha_logo.gif) no-repeat #fff center 5px;
}
.loading_main
{
font-size:11px;
color:#000;
}
.loading_sub
{
font-size:9px;
color:#666;
text-align:center;
}
/* Classes for filemanager styles in a dialog. */
.dialog a img
{
border: 0 none transparent;
}
.dialog fieldset.collapsed {
border: 0 none transparent;
}
.dialog fieldset.collapsed form {
display: none;
}
.hidden
{
display: none;
}
.placesmanager
{
width: 95%;
overflow: auto;
}
.filemanager
{
width: 95%;
height: 200px;
overflow: auto;
background-color: #fff;
}
.filemanager div.file
{
min-width: 80px;
height: 100px;
position: relative;
float: left;
border: 1px outset #666;
margin: 4px;
}
.placesmanager div.file
{
min-width: 60px;
height: 70px;
position: relative;
float: left;
border: 1px outset #666;
margin: 4px;
}
.filemanager div.file:hover,
.placesmanager div.file:hover
{
border: 1px solid #333;
background: #fffff3;
}
.filemanager div.selected,
.filemanager div.selected:hover,
.placesmanager div.selected,
.placesmanager div.selected:hover
{
background: #ffffda;
border: 1px solid #000;
}
.filemanager .filename {
margin: 0.5em;
color: #222;
}
.filemanager div.selected .filename {
color: #000;
}
.filemanager img.thumb
{
width: 50px;
height: 50px;
position: absolute;
top: 50%;
left: 50%;
margin: -25px 0 0 -25px;
border: 1px solid black;
}
.filemanager img.icon
{
width: 32px;
height: 32px;
position: absolute;
top: 50%;
left: 50%;
margin: -16px 0 0 -16px;
}
.filemanager img.action
{
width: 15px;
height: 15px;
position: absolute;
}
.filemanager img.delete
{
bottom: 3px;
left: 20px;
}
.filemanager img.copy
{
bottom: 3px;
left: 3px;
}
This diff is collapsed.
var Xinha = {};
// Auto detect _editor_url if it's not set.
if (!window._editor_url)
{
(function() // wrap this in an ad-hoc function to avoid unecessary pollution of global namespace
{
// Because of the way the DOM is loaded, this is guaranteed to always pull our script tag.
var scripts = document.getElementsByTagName('script');
var this_script = scripts[scripts.length - 1];
// We'll allow two ways to specify arguments. We'll accept them in the
// argument of the script, or we'll accept them embedded into our script tag.
var args = this_script.src.split('?');
args = args.length == 2 ? args[1].split('&') : '';
for (var index = 0; index < args.length; ++index)
{
var arg = args[index].split('=');
if (arg.length == 2)
{
switch (arg[0])
{
case 'lang':
case 'icons':
case 'skin':
case 'url':
window['_editor_' + arg[0]] = arg[1];
break;
}
}
}
// We can grab the script innerHTML and execute that to cut down on script
// tags. Thanks John Resig!
// http://ejohn.org/blog/degrading-script-tags/
if (this_script.innerHTML.replace(/\s+/, ''))
{
eval(this_script.innerHTML);
}
// Default values
_editor_lang = window._editor_lang || 'en';
// Chop off any query string. Chop the filename off of the URL.
_editor_url = window._editor_url || this_script.src.split('?')[0].split('/').slice(0, -1).join('/');
})()
}
_editor_url = _editor_url.replace(/\x2f*$/, '/');
Xinha.agt = navigator.userAgent.toLowerCase();
Xinha.is_ie = ((Xinha.agt.indexOf("msie") != -1) && (Xinha.agt.indexOf("opera") == -1));
Xinha.ie_version= parseFloat(Xinha.agt.substring(Xinha.agt.indexOf("msie")+5));
Xinha.is_opera = (Xinha.agt.indexOf("opera") != -1);
Xinha.is_khtml = (Xinha.agt.indexOf("khtml") != -1);
Xinha.is_webkit = (Xinha.agt.indexOf("applewebkit") != -1);
Xinha.is_safari = (Xinha.agt.indexOf("safari") != -1);
Xinha.opera_version = navigator.appVersion.substring(0, navigator.appVersion.indexOf(" "))*1;
Xinha.is_mac = (Xinha.agt.indexOf("mac") != -1);
Xinha.is_mac_ie = (Xinha.is_ie && Xinha.is_mac);
Xinha.is_win_ie = (Xinha.is_ie && !Xinha.is_mac);
Xinha.is_gecko = (navigator.product == "Gecko" && !Xinha.is_safari); // Safari lies!
Xinha.isRunLocally = document.URL.toLowerCase().search(/^file:/) != -1;
Xinha.is_designMode = (typeof document.designMode != 'undefined' && !Xinha.is_ie); // IE has designMode, but we're not using it
Xinha.isSupportedBrowser = Xinha.is_gecko || (Xinha.is_opera && Xinha.opera_version >= 9.1) || Xinha.ie_version >= 5.5 || Xinha.is_safari;
Xinha.loadPlugins = function(plugins, callbackIfNotReady)
{
if ( !Xinha.isSupportedBrowser ) return;
Xinha.loadStyle(typeof _editor_css == "string" ? _editor_css : "Xinha.css","XinhaCoreDesign");
Xinha.createLoadingMessages(xinha_editors);
var loadingMessages = Xinha.loadingMessages;
Xinha._loadback(_editor_url + "XinhaCore.js",function () {
Xinha.removeLoadingMessages(xinha_editors);
Xinha.createLoadingMessages(xinha_editors);
callbackIfNotReady()
});
return false;
}
Xinha._loadback = function(Url, Callback, Scope, Bonus)
{
var T = !Xinha.is_ie ? "onload" : 'onreadystatechange';
var S = document.createElement("script");
S.type = "text/javascript";
S.src = Url;
if ( Callback )
{
S[T] = function()
{
if ( Xinha.is_ie && ( ! ( /loaded|complete/.test(window.event.srcElement.readyState) ) ) )
{
return;
}
Callback.call(Scope ? Scope : this, Bonus);
S[T] = null;
};
}
document.getElementsByTagName("head")[0].appendChild(S);
};
Xinha.getElementTopLeft = function(element)
{
var curleft = 0;
var curtop = 0;
if (element.offsetParent)
{
curleft = element.offsetLeft
curtop = element.offsetTop
while (element = element.offsetParent)
{
curleft += element.offsetLeft
curtop += element.offsetTop
}
}
return { top:curtop, left:curleft };
}
// find X position of an element
Xinha.findPosX = function(obj)
{
var curleft = 0;
if ( obj.offsetParent )
{
return Xinha.getElementTopLeft(obj).left;
}
else if ( obj.x )
{
curleft += obj.x;
}
return curleft;
};
// find Y position of an element
Xinha.findPosY = function(obj)
{
var curtop = 0;
if ( obj.offsetParent )
{
return Xinha.getElementTopLeft(obj).top;
}
else if ( obj.y )
{
curtop += obj.y;
}
return curtop;
};
Xinha.createLoadingMessages = function(xinha_editors)
{
if ( Xinha.loadingMessages || !Xinha.isSupportedBrowser )
{
return;
}
Xinha.loadingMessages = [];
for (var i=0;i<xinha_editors.length;i++)
{
if (!document.getElementById(xinha_editors[i]))
{
continue;
}
Xinha.loadingMessages.push(Xinha.createLoadingMessage(document.getElementById(xinha_editors[i])));
}
}
Xinha.createLoadingMessage = function(textarea,text)
{
if ( document.getElementById("loading_" + textarea.id) || !Xinha.isSupportedBrowser)
{
return;
}
// Create and show the main loading message and the sub loading message for details of loading actions
// global element
var loading_message = document.createElement("div");
loading_message.id = "loading_" + textarea.id;
loading_message.className = "loading";
loading_message.style.left = (Xinha.findPosX(textarea) + textarea.offsetWidth / 2) - 106 + 'px';
loading_message.style.top = (Xinha.findPosY(textarea) + textarea.offsetHeight / 2) - 50 + 'px';
// main static message
var loading_main = document.createElement("div");
loading_main.className = "loading_main";
loading_main.id = "loading_main_" + textarea.id;
loading_main.appendChild(document.createTextNode(Xinha._lc("Loading in progress. Please wait!")));
// sub dynamic message
var loading_sub = document.createElement("div");
loading_sub.className = "loading_sub";
loading_sub.id = "loading_sub_" + textarea.id;
text = text ? text : Xinha._lc("Loading Core");
loading_sub.appendChild(document.createTextNode(text));
loading_message.appendChild(loading_main);
loading_message.appendChild(loading_sub);
document.body.appendChild(loading_message);
return loading_sub;
}
Xinha.loadStyle = function(style, id)
{
var url = _editor_url || '';
url += style;
var head = document.getElementsByTagName("head")[0];
var link = document.createElement("link");
link.rel = "stylesheet";
link.href = url;
if (id) link.id = id;
head.appendChild(link);
};
Xinha._lc = function(string) {return string;}
Xinha._addEvent = function(el, evname, func)
{
if ( document.addEventListener )
{
el.addEventListener(evname, func, true);
}
else
{
el.attachEvent("on" + evname, func);
}
}
Xinha.addOnloadHandler = function (func)
{
// Dean Edwards/Matthias Miller/John Resig
// http://dean.edwards.name/weblog/2006/06/again/
// IE part from jQuery
var init = function ()
{
// quit if this function has already been called
if (arguments.callee.done) return;
// flag this function so we don't do the same thing twice
arguments.callee.done = true;
// kill the timer
if (Xinha.onloadTimer) clearInterval(Xinha.onloadTimer);
func.call();
}
if (Xinha.is_ie)
{
// ensure firing before onload,
// maybe late but safe also for iframes
document.attachEvent("onreadystatechange", function(){
if ( document.readyState === "complete" ) {
document.detachEvent( "onreadystatechange", arguments.callee );
init();
}
});
if ( document.documentElement.doScroll && typeof window.frameElement === "undefined" ) (function(){
if (arguments.callee.done) return;
try {
// If IE is used, use the trick by Diego Perini
// http://javascript.nwbox.com/IEContentLoaded/
document.documentElement.doScroll("left");
} catch( error ) {
setTimeout( arguments.callee, 0 );
return;
}
// and execute any waiting functions
init();
})();
}
else if (/WebKit/i.test(navigator.userAgent))
{
Xinha.onloadTimer = setInterval(function()
{
if (/loaded|complete/.test(document.readyState))
{
init(); // call the onload handler
}
}, 10);
}
else /* for Mozilla/Opera9 */
{
document.addEventListener("DOMContentLoaded", init, false);
}
}
The XinhaLoader is a subset of Xinha only containing functions to fetch further files from the server and displaying a loading message.
It gives visual feedback to the user quite quickly so they don't have to watch the plain textarea and wonder if anything is happening.
Usage in short: Follow the NewbieGuide, but load XinhaLoader.js instead of XinhaCore.js.
Make shure you define xinha_editors before calling Xinha.loadPlugins! This is different to earlier versions of the NewbieGuide (steps 1 and 2 reversed)
\ No newline at end of file
You can use the contrib/compress.php to batch-convert the current Xinha snapshot. To use this script, open it in a text editor, comment out the die() command at the top and open it in your browser.
You can use the contrib/compress.bat to compress JavaScript files by drag&drop in Windows.
Please be aware that the language files cannot be compressed.
If you want the original files to be kept, open compress.bat and remvove the # in the line
# FOR %%V IN (%*) DO del %%V_uncompressed.js
\ No newline at end of file
<IfModule mod_php.c>
php_flag engine off
</IfModule>
AddType text/html .html .htm .shtml .php .php3 .php4 .php5 .php6 .php7 .php8 .phtml .phtm .pl .py .cgi
RemoveHandler .php
RemoveHandler .php8
RemoveHandler .php7
RemoveHandler .php6
RemoveHandler .php5
RemoveHandler .php4
RemoveHandler .php3
\ No newline at end of file
@echo off
FOR %%V IN (%*) DO copy %%V %%V_uncompressed.js
FOR %%V IN (%*) DO java -jar %~p0dojo_js_compressor.jar -c %%V_uncompressed.js > %%V 2>&1
FOR %%V IN (%*) DO del %%V_uncompressed.js
# pause
\ No newline at end of file
<?
die("Run this script to batch-compress the current Xinha snapshot. To run the script, open the file and comment out the die() command");
$repository_url = 'http://svn.xinha.org/trunk';
$version ='';
$date = date('r');
error_reporting(E_ALL);
ini_set('show_errors',1);
$return = array();
function scan($dir, $durl = '',$min_size="0")
{
static $seen = array();
global $return;
$files = array();
$dir = realpath($dir);
if(isset($seen[$dir]))
{
return $files;
}
$seen[$dir] = TRUE;
$dh = @opendir($dir);
while($dh && ($file = readdir($dh)))
{
if($file !== '.' && $file !== '..')
{
$path = realpath($dir . '/' . $file);
$url = $durl . '/' . $file;
if(preg_match("/\.svn|lang/",$path)) continue;
if(is_dir($path))
{
scan($path);
}
elseif(is_file($path))
{
if(!preg_match("/\.js$/",$path) || filesize($path) < $min_size) continue;
$return[] = $path;
}
}
}
@closedir($dh);
return $files;
}
scan("../");
$cwd = getcwd();
$root_dir = realpath($cwd.'/..');
print "Processing ".count($return)." files<br />";
$prefix = "/* This compressed file is part of Xinha. For uncompressed sources, forum, and bug reports, go to xinha.org */";
if ($version) $prefix .= "\n/* This file is part of version $version released $date */";
$core_prefix = '
/*--------------------------------------------------------------------------
-- Xinha (is not htmlArea) - http://xinha.org
--
-- Use of Xinha is granted by the terms of the htmlArea License (based on
-- BSD license) please read license.txt in this package for details.
--
-- Copyright (c) 2005-2008 Xinha Developer Team and contributors
--
-- Xinha was originally based on work by Mihai Bazon which is:
-- Copyright (c) 2003-2004 dynarch.com.
-- Copyright (c) 2002-2003 interactivetools.com, inc.
-- This copyright notice MUST stay intact for use.
-------------------------------------------------------------------------*/
';
foreach ($return as $file)
{
set_time_limit ( 60 );
print "Processed $file<br />";
flush();
$file_url = $repository_url.str_replace($root_dir,'',$file);
copy($file,$file."_uncompr.js");
$file_prefix = $prefix."\n/* The URL of the most recent version of this file is $file_url */";
exec("echo \"".(preg_match('/XinhaCore.js$/',$file) ? $file_prefix.$core_prefix : $file_prefix)."\" > $file && java -jar ${cwd}/dojo_js_compressor.jar -c ${file}_uncompr.js >> $file 2>&1");
if (preg_match('/js: ".*?", line \d+:/',file_get_contents($file)) || preg_match('/sh: java: command not found/', file_get_contents($file)))
{
unlink($file);
rename($file."_uncompr.js",$file);
}
else
{
unlink($file."_uncompr.js");
}
}
print "Operation complete."
?>
<?
// This is script that uses the YUI compressor (http://www.julienlecomte.net/blog/2007/08/11/)
// It yields gradually better results than the dojo comressor, but it produces unreadable code
//die("Run this script to batch-compress the current Xinha snapshot. To run the script, open the file and comment out the die() command");
$repository_url = 'http://svn.xinha.org/trunk';
$version ='';
$date = date('r');
$xinha_root = realpath(dirname(__FILE__).'/..');
error_reporting(E_ALL);
ini_set('show_errors',1);
$return = array();
function scan($dir, $durl = '',$min_size="3000")
{
static $seen = array();
global $return;
$files = array();
$dir = realpath($dir);
if(isset($seen[$dir]))
{
return $files;
}
$seen[$dir] = TRUE;
$dh = @opendir($dir);
while($dh && ($file = readdir($dh)))
{
if($file !== '.' && $file !== '..')
{
$path = realpath($dir . '/' . $file);
$url = $durl . '/' . $file;
if(preg_match("/\.svn|lang/",$path)) continue;
if(is_dir($path))
{
scan($path);
}
elseif(is_file($path))
{
if(!preg_match("/\.(js|css)$/",$path) || filesize($path) < $min_size) continue;
$return[] = $path;
}
}
}
@closedir($dh);
return $files;
}
scan($xinha_root,0);
print "Processing ".count($return)." files<br />";
$prefix = "/* This compressed file is part of Xinha. For uncompressed sources, forum, and bug reports, go to xinha.org */";
if ($version) $prefix .= "\n/* This file is part of version $version released $date */";
$core_prefix = '
/*--------------------------------------------------------------------------
-- Xinha (is not htmlArea) - http://xinha.org
--
-- Use of Xinha is granted by the terms of the htmlArea License (based on
-- BSD license) please read license.txt in this package for details.
--
-- Copyright (c) 2005-'.date('Y').' Xinha Developer Team and contributors
--
-- Xinha was originally based on work by Mihai Bazon which is:
-- Copyright (c) 2003-2004 dynarch.com.
-- Copyright (c) 2002-2003 interactivetools.com, inc.
-- This copyright notice MUST stay intact for use.
-------------------------------------------------------------------------*/
';
foreach ($return as $file)
{
set_time_limit ( 60 );
print "Processing $file\n";
flush();
$file_url = $repository_url.str_replace($xinha_root,'',$file);
copy($file,$file."_uncompr.js");
$file_prefix = $prefix."\n/* The URL of the most recent uncompressed version of this file is $file_url */";
$ext = preg_replace('/.*?(\.js|\.css)$/','$1',$file);
file_put_contents($file."_uncompr${ext}", preg_replace('/(\/\/[^\n]*)?(?![*])\\\[\n]/','',file_get_contents($file)));
passthru("echo \"".(preg_match('/XinhaCore.js$/',$file) ? $file_prefix.$core_prefix : $prefix)."\" > $file && java -jar {$xinha_root}/contrib/yuicompressor-2.4.2.jar --charset UTF-8 ${file}_uncompr${ext} >> $file 2>&1");
if (preg_match('/\d+:\d+:syntax error/',file_get_contents($file)) || preg_match('/sh: java: command not found/', file_get_contents($file)))
{
unlink($file);
rename($file."_uncompr${ext}",$file);
}
else
{
unlink($file."_uncompr${ext}");
}
}
print "Operation complete."
?>
<?php
// Author: Niels Baggesen, <nba@users.sourceforge.net>, 2009-08-16
// Distributed under the same terms as Xinha itself.
// This notice MUST stay intact for use (see license.txt).
// merge-strings.php - merge translation strings from master into
// individual language files.
function usage()
{
print "merge-strings.php - merge translation strings\n";
print "Options:\n";
print " -l xx Process language xx. Required option\n";
print " -m master Master file. Defaults to 'de.js'\n";
print " -m base Base directory. Defaults to '..'\n";
print " -v Verbose\n";
print " -c Tell about files that must be created\n";
print " -d Debug. Very noisy\n";
exit(1);
}
// This function taken from the php.net manual page for glob
function rglob($pattern='*', $flags = 0, $path='')
{
$paths=glob($path.'*', GLOB_MARK|GLOB_ONLYDIR|GLOB_NOSORT);
$files=glob($path.$pattern, $flags);
foreach ($paths as $path)
{
$files=array_merge($files,rglob($pattern, $flags, $path));
}
return $files;
}
error_reporting(E_ALL);
$opts = getopt('l:b:m:cvd');
if ($opts === false) usage;
// here we should check extra options, but php lacks that functionality
$lang = 'xx'; // The language we process
$create = 0; // Tell about missing files?
$verbose = 0; // Log the details to stdout?
$debug = 0; // ?
$basedir = '..'; // Base directory to process
$mastername = 'de.js'; // The best bet on a complete translation file
if (isset($opts['l'])) $lang = $opts['l'];
else die("Missing -l option\n");
if (isset($opts['c'])) $create = 1;
if (isset($opts['v'])) $verbose = 1;
if (isset($opts['d'])) $debug = 1;
if (isset($opts['b'])) $basedir = $opts['b'];
if (isset($opts['m'])) $mastername = $opts['m'];
if (!preg_match('#/$#', $basedir)) $basedir .= '/';
// So, find all the master files
$files = rglob($mastername, 0, $basedir);
if (count($files) == 0)
{
print "No master files found. Check your -b and -m options!\n";
exit(1);
}
// and process them
$filenum = 0;
foreach ($files as $masterjs)
{
$langjs = preg_replace("/$mastername/", "$lang.js", $masterjs);
$langnew = $langjs.'.new';
if (!file_exists($langjs))
{
if ($create) print "Missing file: $langjs\n";
continue;
}
// Populate $trans with the strings that must be translated
$filenum++;
$min = fopen($masterjs, "r");
$trans = array();
$strings = 0;
while ($str = fgets($min))
{
$str = trim($str);
if (preg_match('#^ *"([^"]*)" *: *"([^"]*)"(,)? *(//.*)?$#', $str, $m))
{
if (isset($trans[$m[1]]))
{
print "Duplicate string in $masterjs: $m[1]\n";
continue;
}
if ($debug) print "Translate: $m[1]\n";
$trans[$m[1]] = 1;
$strings++;
}
}
fclose($min);
// Now copy from $lin to $lout while verifying that the strings
// are still current.
// Break out when we hit the last string in the master (no ','
// after the translation.
$lin = fopen($langjs, "r");
$lout = fopen($langnew, "w");
$obsolete = 0;
$new = 0;
$kept = 0;
while ($fstr = fgets($lin))
{
$str = trim($fstr);
if (preg_match('#^ *"([^"]*)" *: *"([^"]*)"(,)? *(//.*)?$#', $str, $m))
{
if (!isset($trans[$m[1]]))
{
if ($verbose) print "Obsolete: $m[1]\n";
$obsolete++;
fprintf($lout, " // \"%s\": \"%s\" // OBSOLETE\n", $m[1], $m[2]);
}
else
{
if ($debug) print "Keep: $m[1]\n";
unset($trans[$m[1]]);
$strings--;
$kept++;
fprintf($lout, " \"%s\": \"%s\"%s\n", $m[1], $m[2], $strings ? ',' : '');
}
if (!isset($m[3]) || $m[3] != ',')
break;
}
else
fprintf($lout, "%s", $fstr);
}
// Add the strings that are missing
foreach ($trans as $tr => $v)
{
if ($verbose) print("New: $tr\n");
$new++;
$strings--;
fprintf($lout, " \"%s\": \"%s\"%s // NEW\n", $tr, $tr, $strings ? ',' : '');
}
// And then the final part of $lin
while ($str = fgets($lin))
fprintf($lout, "%s", $str);
// Clean up, and tell user what happened
fclose($lin);
fclose($lout);
if ($obsolete == 0 && $new == 0)
{
if ($verbose) print "$langjs: Unchanged\n";
unlink($langnew);
}
else
{
print "$langnew: $new new, $obsolete obsoleted, $kept unchanged entries.\n";
// rename($langnew, $langjs);
}
}
print "$filenum files processed.\n";
?>
This diff is collapsed.
<?php
/** Write the appropriate xinha_config directives to pass data to a PHP (Plugin) backend file.
*
* ImageManager Example:
* The following would be placed in step 3 of your configuration (see the NewbieGuide
* (http://xinha.python-hosting.com/wiki/NewbieGuide)
*
* <script language="javascript">
* with (xinha_config.ImageManager)
* {
* <?php
* xinha_pass_to_php_backend
* (
* array
* (
* 'images_dir' => '/home/your/directory',
* 'images_url' => '/directory'
* )
* )
* ?>
* }
* </script>
*
*/
function xinha_pass_to_php_backend($Data, $KeyLocation = 'Xinha:BackendKey', $ReturnPHP = FALSE)
{
$bk = array();
$bk['data'] = serialize($Data);
@session_start();
if(!isset($_SESSION[$KeyLocation]))
{
$_SESSION[$KeyLocation] = uniqid('Key_');
}
$bk['session_name'] = session_name();
$bk['key_location'] = $KeyLocation;
$bk['hash'] =
function_exists('sha1') ?
sha1($_SESSION[$KeyLocation] . $bk['data'])
: md5($_SESSION[$KeyLocation] . $bk['data']);
// The data will be passed via a postback to the
// backend, we want to make sure these are going to come
// out from the PHP as an array like $bk above, so
// we need to adjust the keys.
$backend_data = array();
foreach($bk as $k => $v)
{
$backend_data["backend_data[$k]"] = $v;
}
// The session_start() above may have been after data was sent, so cookies
// wouldn't have worked.
$backend_data[session_name()] = session_id();
if($ReturnPHP)
{
return array('backend_data' => $backend_data);
}
else
{
echo 'backend_data = ' . xinha_to_js($backend_data) . "; \n";
}
}
/** Convert PHP data structure to Javascript */
function xinha_to_js($var, $tabs = 0)
{
if(is_numeric($var))
{
return $var;
}
if(is_string($var))
{
return "'" . xinha_js_encode($var) . "'";
}
if(is_bool($var))
{
return $var ? 'true': 'false';
}
if(is_array($var))
{
$useObject = false;
foreach(array_keys($var) as $k) {
if(!is_numeric($k)) $useObject = true;
}
$js = array();
foreach($var as $k => $v)
{
$i = "";
if($useObject) {
if(preg_match('#^[a-zA-Z]+[a-zA-Z0-9]*$#', $k)) {
$i .= "$k: ";
} else {
$i .= "'$k': ";
}
}
$i .= xinha_to_js($v, $tabs + 1);
$js[] = $i;
}
if($useObject) {
$ret = "{\n" . xinha_tabify(implode(",\n", $js), $tabs) . "\n}";
} else {
$ret = "[\n" . xinha_tabify(implode(",\n", $js), $tabs) . "\n]";
}
return $ret;
}
return 'null';
}
/** Like htmlspecialchars() except for javascript strings. */
function xinha_js_encode($string)
{
static $strings = "\\,\",',%,&,<,>,{,},@,\n,\r";
if(!is_array($strings))
{
$tr = array();
foreach(explode(',', $strings) as $chr)
{
$tr[$chr] = sprintf('\x%02X', ord($chr));
}
$strings = $tr;
}
return strtr($string, $strings);
}
/** Used by plugins to get the config passed via
* xinha_pass_to_backend()
* returns either the structure given, or NULL
* if none was passed or a security error was encountered.
*/
function xinha_read_passed_data($KeyLocation = 'Xinha:BackendKey')
{
if(isset($_REQUEST['backend_data']) && is_array($_REQUEST['backend_data']))
{
$bk = $_REQUEST['backend_data'];
session_name($bk['session_name']);
@session_start();
if(!isset($_SESSION[$bk['key_location']])) return NULL;
if($KeyLocation !== $bk['key_location'])
{
trigger_error('Programming Error - please contact the website administrator/programmer to alert them to this problem. A non-default backend key location is being used to pass backend data to Xinha, but the same key location is not being used to receive data. The special backend configuration has been ignored. To resolve this, find where you are using xinha_pass_to_php_backend and remove the non default key, or find the locations where xinha_read_passed_data is used (in Xinha) and add a parameter with the non default key location, or edit contrib/php-xinha.php and change the default key location in both these functions. See: http://trac.xinha.org/ticket/1518', E_USER_ERROR);
return NULL;
}
if($bk['hash'] ===
function_exists('sha1') ?
sha1($_SESSION[$bk['key_location']] . $bk['data'])
: md5($_SESSION[$bk['key_location']] . $bk['data']))
{
return unserialize(ini_get('magic_quotes_gpc') ? stripslashes($bk['data']) : $bk['data']);
}
}
return NULL;
}
/** Used by plugins to get a query string that can be sent to the backend
* (or another part of the backend) to send the same data.
*/
function xinha_passed_data_querystring()
{
$qs = array();
if(isset($_REQUEST['backend_data']) && is_array($_REQUEST['backend_data']))
{
foreach($_REQUEST['backend_data'] as $k => $v)
{
$v = ini_get('magic_quotes_gpc') ? stripslashes($v) : $v;
$qs[] = "backend_data[" . rawurlencode($k) . "]=" . rawurlencode($v);
}
}
$qs[] = session_name() . '=' . session_id();
return implode('&', $qs);
}
/** Just space-tab indent some text */
function xinha_tabify($text, $tabs)
{
if($text)
{
return str_repeat(" ", $tabs) . preg_replace('/\n(.)/', "\n" . str_repeat(" ", $tabs) . "\$1", $text);
}
}
/** Return upload_max_filesize value from php.ini in kilobytes (function adapted from php.net)**/
function upload_max_filesize_kb()
{
$val = ini_get('upload_max_filesize');
$val = trim($val);
$last = strtolower($val{strlen($val)-1});
switch($last)
{
// The 'G' modifier is available since PHP 5.1.0
case 'g':
$val *= 1024;
case 'm':
$val *= 1024;
}
return $val;
}
?>
#!/usr/bin/python
"""Runs a very basic file server so that we can test Xinha. By default, the
server runs on port 8080, but you can pass the -p or --port option to change
the port used."""
import os
import SimpleHTTPServer
import SocketServer
# File server for testing Xinha
def __main():
"""Use the embed_url.py program from the command-line
The embed_url.py program downloads files and processes links in the case of
HTML files. See embed_url.py -h for more info. This procedure has the
sole purpose of reading in and verifying the command-line arguments before
passing them to the embed_url funtion."""
from getopt import getopt, GetoptError
from sys import argv, exit, stderr
try:
options, arguments = getopt(argv[1:], "p:", ["port="])
except GetoptError:
print "Invalid option"
__usage()
exit(2)
PORT = 8080
for option, value in options:
if option in ("-p", "--port"):
try:
PORT = int(value)
except ValueError:
print "'%s' is not a valid port number" % value
__usage()
exit(2)
# SimpleHTTPRequestHandler serves data from the current directory, so if we
# are running from inside contrib, we have to change our current working
# directory
if os.path.split(os.getcwd())[1] == 'contrib':
os.chdir('..')
Handler = SimpleHTTPServer.SimpleHTTPRequestHandler
httpd = SocketServer.TCPServer(("", PORT), Handler)
print "Serving at port %s" % PORT
print "Try viewing the example at http://localhost:%s/examples/Newbie.html" % PORT
httpd.serve_forever()
def __usage():
"""
Print the usage information contained in the module docstring
"""
print __doc__
if __name__ == '__main__':
__main()
<html>
<head><title>Xinha Extended Example</title></head>
<!--------------------------------------:noTabs=true:tabSize=2:indentSize=2:--
-- Xinha example frameset.
--
-- $HeadURL: http://svn.xinha.org/trunk/examples/ExtendedDemo.html $
-- $LastChangedDate: 2008-10-13 06:42:42 +1300 (Mon, 13 Oct 2008) $
-- $LastChangedRevision: 1084 $
-- $LastChangedBy: ray $
--------------------------------------------------------------------------->
<frameset cols="240,*">
<frame src="files/ext_example-menu.php" name="menu" id="menu">
<frame src="about:blank" name="body" id="body">
</frameset>
</html>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title>Xinha Newbie Guide</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<script type="text/javascript" src="../XinhaLoader.js?lang=en&skin=silva"></script>
<script type="text/javascript">
_editor_icons = "Tango" // You can pass arguments via the script URL or embed them here.
</script>
<script type="text/javascript" src="XinhaConfig.js"></script>
</head>
<body>
<form action="">
<div>
<textarea id="myTextArea" name="myTextArea" rows="25" cols="50" style="width: 100%"></textarea>
</div>
</form>
</body>
</html>
xinha_editors = null;
xinha_init = null;
xinha_config = null;
xinha_plugins = null;
// This contains the names of textareas we will make into Xinha editors
xinha_init = xinha_init ? xinha_init : function()
{
/** STEP 1 ***************************************************************
* First, specify the textareas that shall be turned into Xinhas.
* For each one add the respective id to the xinha_editors array.
* I you want add more than on textarea, keep in mind that these
* values are comma seperated BUT there is no comma after the last value.
* If you are going to use this configuration on several pages with different
* textarea ids, you can add them all. The ones that are not found on the
* current page will just be skipped.
************************************************************************/
xinha_editors = xinha_editors ? xinha_editors :
[
'myTextArea', 'anotherOne'
];
/** STEP 2 ***************************************************************
* Now, what are the plugins you will be using in the editors on this
* page. List all the plugins you will need, even if not all the editors
* will use all the plugins.
*
* The list of plugins below is a good starting point, but if you prefer
* a simpler editor to start with then you can use the following
*
* xinha_plugins = xinha_plugins ? xinha_plugins : [ ];
*
* which will load no extra plugins at all.
************************************************************************/
xinha_plugins = xinha_plugins ? xinha_plugins :
[
'CharacterMap',
'ContextMenu',
'SmartReplace',
'Stylist',
'ExtendedFileManager',
'Linker',
'SuperClean',
'TableOperations'
];
// THIS BIT OF JAVASCRIPT LOADS THE PLUGINS, NO TOUCHING :)
if(!Xinha.loadPlugins(xinha_plugins, xinha_init)) return;
/** STEP 3 ***************************************************************
* We create a default configuration to be used by all the editors.
* If you wish to configure some of the editors differently this will be
* done in step 5.
*
* If you want to modify the default config you might do something like this.
*
* xinha_config = new Xinha.Config();
* xinha_config.width = '640px';
* xinha_config.height = '420px';
*
*
* For a list of the available configuration options, see:
* http://trac.xinha.org/wiki/Documentation/ConfigVariablesList
*
*************************************************************************/
xinha_config = xinha_config ? xinha_config() : new Xinha.Config();
//this is the standard toolbar, feel free to remove buttons as you like
xinha_config.toolbar =
[
["popupeditor"],
["separator","formatblock","fontname","fontsize","bold","italic","underline","strikethrough"],
["separator","forecolor","hilitecolor","textindicator"],
["separator","subscript","superscript"],
["linebreak","separator","justifyleft","justifycenter","justifyright","justifyfull"],
["separator","insertorderedlist","insertunorderedlist","outdent","indent"],
["separator","inserthorizontalrule","createlink","insertimage","inserttable"],
["linebreak","separator","undo","redo","selectall","print"], (Xinha.is_gecko ? [] : ["cut","copy","paste","overwrite","saveas"]),
["separator","killword","clearfonts","removeformat","toggleborders","splitblock","lefttoright", "righttoleft"],
["separator","htmlmode","showhelp","about"]
];
// To adjust the styling inside the editor, we can load an external stylesheet like this
// NOTE : YOU MUST GIVE AN ABSOLUTE URL
xinha_config.pageStyleSheets = [ _editor_url + "examples/files/full_example.css" ];
//if you're using Stylist, import a stylesheet like this
xinha_config.stylistLoadStylesheet(_editor_url + "examples/files/stylist.css");
/** STEP 4 ***************************************************************
* We first create editors for the textareas.
*
* You can do this in two ways, either
*
* xinha_editors = Xinha.makeEditors(xinha_editors, xinha_config, xinha_plugins);
*
* if you want all the editor objects to use the same set of plugins, OR;
*
* xinha_editors = Xinha.makeEditors(xinha_editors, xinha_config);
* xinha_editors.myTextArea.registerPlugins(['Stylist']);
* xinha_editors.anotherOne.registerPlugins(['CSS','SuperClean']);
*
* if you want to use a different set of plugins for one or more of the
* editors.
************************************************************************/
xinha_editors = Xinha.makeEditors(xinha_editors, xinha_config, xinha_plugins);
/** STEP 5 ***************************************************************
* If you want to change the configuration variables of any of the
* editors, this is the place to do that, for example you might want to
* change the width and height of one of the editors, like this...
*
* xinha_editors.myTextArea.config.width = '640px';
* xinha_editors.myTextArea.config.height = '480px';
*
************************************************************************/
/** STEP 6 ***************************************************************
* Finally we "start" the editors, this turns the textareas into
* Xinha editors.
************************************************************************/
Xinha.startEditors(xinha_editors);
}
Xinha.addOnloadHandler(xinha_init); // this executes the xinha_init function on page load
// and does not interfere with window.onload properties set by other scripts
This diff is collapsed.
/*--------------------------------------:noTabs=true:tabSize=2:indentSize=2:--
-- CSS plugin example CSS file. This file is used by full_example.js
-- when the CSS plugin is included in an auto-generated example.
-- @TODO Make this CSS more useful.
--
-- $HeadURL:http://svn.xinha.webfactional.com/trunk/examples/files/custom.css $
-- $LastChangedDate:2008-02-04 01:43:21 +0100 (Mo, 04 Feb 2008) $
-- $LastChangedRevision:962 $
-- $LastChangedBy:ray $
--------------------------------------------------------------------------*/
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; }
/*--------------------------------------:noTabs=true:tabSize=2:indentSize=2:--
-- DynamicCSS plugin example CSS file. Used by full_example.js
-- when the DynamicCSS plugin is included in an auto-generated example.
-- @TODO Make this CSS more useful.
--
-- $HeadURL:http://svn.xinha.webfactional.com/trunk/examples/files/dynamic.css $
-- $LastChangedDate:2008-02-04 01:43:21 +0100 (Mo, 04 Feb 2008) $
-- $LastChangedRevision:962 $
-- $LastChangedBy:ray $
--------------------------------------------------------------------------*/
p {
FONT-FAMILY: Arial, Helvetica;
FONT-SIZE: 9pt;
FONT-WEIGHT: normal;
COLOR: #000000;
}
p.p1 {
FONT-FAMILY: Arial, Helvetica;
FONT-SIZE: 11pt;
FONT-WEIGHT: normal;
COLOR: #000000;
}
p.p2 {
FONT-FAMILY: Arial, Helvetica;
FONT-SIZE: 13pt;
FONT-WEIGHT: normal;
COLOR: #000000;
}
div {
FONT-FAMILY: Arial, Helvetica;
FONT-SIZE: 9pt;
FONT-WEIGHT: bold;
COLOR: #000000;
}
div.div1 {
FONT-FAMILY: Arial, Helvetica;
FONT-SIZE: 11pt;
FONT-WEIGHT: bold;
COLOR: #000000;
}
div.div2 {
FONT-FAMILY: Arial, Helvetica;
FONT-SIZE: 13pt;
FONT-WEIGHT: bold;
COLOR: #000000;
}
.quote { font-style: italic; color: #ee9; }
.highlight { background-color: yellow; color: #000; }
.deprecated { text-decoration: line-through; color: #aaa; }
<!DOCTYPE BHTML PUBLIC "-//BC//DTD BHTML 3.2 Final//EN">
<html>
<head>
<!-- ---------------------------------------------------------------------
-- $HeadURL: http://svn.xinha.org/trunk/examples/files/ext_example-body.html $
-- $LastChangedDate: 2008-10-13 06:42:42 +1300 (Mon, 13 Oct 2008) $
-- $LastChangedRevision: 1084 $
-- $LastChangedBy: ray $
------------------------------------------------------------------------ -->
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Example of Xinha</title>
<link rel="stylesheet" type="text/css" href="full_example.css" />
<script type="text/javascript">
function showError( sMsg, sUrl, sLine){
document.getElementById('errors').value += 'Error: ' + sMsg + '\n' +
'Source File: ' + sUrl + '\n' +
'Line: ' + sLine + '\n';
return false;
}
// You must set _editor_url to the URL (including trailing slash) where
// where xinha is installed, it's highly recommended to use an absolute URL
// eg: _editor_url = "/path/to/xinha/";
// You may try a relative URL if you wish]
// eg: _editor_url = "../";
// in this example we do a little regular expression to find the absolute path.
_editor_url = document.location.href.replace(/examples\/files\/ext_example-body\.html.*/, '')
//moved _editor_lang & _editor_skin to init function because of error thrown when frame document not ready
</script>
<!-- Load up the actual editor core -->
<script type="text/javascript" src="../../XinhaCore.js"></script>
<script type="text/javascript">
xinha_editors = null;
xinha_init = null;
xinha_config = null;
xinha_plugins = null;
xinha_init = xinha_init ? xinha_init : function() {
window.onerror = showError;
document.onerror = showError;
var f = top.frames["menu"].document.forms["fsettings"];
_editor_lang = f.lang[f.lang.selectedIndex].value; // the language we need to use in the editor.
_editor_skin = f.skin[f.skin.selectedIndex].value; // the skin we use in the editor
// What are the plugins you will be using in the editors on this page.
// List all the plugins you will need, even if not all the editors will use all the plugins.
xinha_plugins = [ ];
for(var x = 0; x < f.plugins.length; x++) {
if(f.plugins[x].checked) xinha_plugins.push(f.plugins[x].value);
}
// THIS BIT OF JAVASCRIPT LOADS THE PLUGINS, NO TOUCHING :)
if(!Xinha.loadPlugins(xinha_plugins, xinha_init)) return;
// What are the names of the textareas you will be turning into editors?
var num = 1;
num = parseInt(f.num.value);
if(isNaN(num)) {
num = 1;
f.num.value = 1;
}
var dest = document.getElementById("editors_here");
var lipsum = window.parent.menu.document.getElementById('myTextarea0').value;
xinha_editors = [ ]
for(var x = 0; x < num; x++) {
var ta = 'myTextarea' + x;
xinha_editors.push(ta);
var div = document.createElement('div');
div.className = 'area_holder';
var txta = document.createElement('textarea');
txta.id = ta;
txta.name = ta;
txta.value = lipsum;
txta.style.width="100%";
txta.style.height="420px";
div.appendChild(txta);
dest.appendChild(div);
}
// Create a default configuration to be used by all the editors.
settings = top.frames["menu"].settings;
xinha_config = new Xinha.Config();
xinha_config.width = settings.width;
xinha_config.height = settings.height;
xinha_config.sizeIncludesBars = settings.sizeIncludesBars;
xinha_config.sizeIncludesPanels = settings.sizeIncludesPanels;
xinha_config.statusBar = settings.statusBar;
xinha_config.htmlareaPaste = settings.htmlareaPaste;
xinha_config.mozParaHandler = settings.mozParaHandler;
xinha_config.getHtmlMethod = settings.getHtmlMethod;
xinha_config.undoSteps = settings.undoSteps;
xinha_config.undoTimeout = settings.undoTimeout;
xinha_config.changeJustifyWithDirection = settings.changeJustifyWithDirection;
xinha_config.fullPage = settings.fullPage;
xinha_config.pageStyle = settings.pageStyle;
xinha_config.baseHref = settings.baseHref;
xinha_config.expandRelativeUrl = settings.expandRelativeUrl;
xinha_config.stripBaseHref = settings.stripBaseHref;
xinha_config.stripSelfNamedAnchors = settings.stripSelfNamedAnchors;
xinha_config.only7BitPrintablesInURLs = settings.only7BitPrintablesInURLs;
xinha_config.sevenBitClean = settings.sevenBitClean;
xinha_config.killWordOnPaste = settings.killWordOnPaste;
xinha_config.makeLinkShowsTarget = settings.makeLinkShowsTarget;
xinha_config.flowToolbars = settings.flowToolbars;
xinha_config.stripScripts = settings.stripScripts;
xinha_config.flowToolbars = settings.flowToolbars;
xinha_config.showLoading = settings.showLoading;
xinha_config.pageStyleSheets = ["full_example.css"];
// Create a default configuration for the plugins
if (typeof CharCounter != 'undefined') {
xinha_config.CharCounter.showChar = settings.showChar;
xinha_config.CharCounter.showWord = settings.showWord;
xinha_config.CharCounter.showHtml = settings.showHtml;
}
if(typeof CharacterMap != 'undefined') xinha_config.CharacterMap.mode = settings.CharacterMapMode;
if(typeof ListType != 'undefined') xinha_config.ListType.mode = settings.ListTypeMode;
if(typeof CSS != 'undefined') xinha_config.pageStyle = xinha_config.pageStyle + "\n" + "@import url(custom.css);";
if(typeof DynamicCSS != 'undefined') xinha_config.pageStyle = "@import url(dynamic.css);";
if(typeof Filter != 'undefined') xinha_config.Filters = ["Word", "Paragraph"];
if(typeof Stylist != 'undefined') {
// We can load an external stylesheet like this - NOTE : YOU MUST GIVE AN ABSOLUTE URL
// otherwise it won't work!
xinha_config.stylistLoadStylesheet(document.location.href.replace(/[^\/]*\.html/, 'stylist.css'));
// Or we can load styles directly
xinha_config.stylistLoadStyles('p.red_text { color:red }');
// If you want to provide "friendly" names you can do so like
// (you can do this for stylistLoadStylesheet as well)
xinha_config.stylistLoadStyles('p.pink_text { color:pink }', {'p.pink_text' : 'Pretty Pink'});
}
if(typeof InsertWords != 'undefined') {
// Register the keyword/replacement list
var keywrds1 = new Object();
var keywrds2 = new Object();
keywrds1['-- Dropdown Label --'] = '';
keywrds1['onekey'] = 'onevalue';
keywrds1['twokey'] = 'twovalue';
keywrds1['threekey'] = 'threevalue';
keywrds2['-- Insert Keyword --'] = '';
keywrds2['Username'] = '%user%';
keywrds2['Last login date'] = '%last_login%';
xinha_config.InsertWords = {
combos : [ { options: keywrds1, context: "body" },
{ options: keywrds2, context: "li" } ]
}
}
// First create editors for the textareas.
// You can do this in two ways, either
// xinha_editors = Xinha.makeEditors(xinha_editors, xinha_config, xinha_plugins);
// if you want all the editor objects to use the same set of plugins, OR;
// xinha_editors = Xinha.makeEditors(xinha_editors, xinha_config);
// xinha_editors['myTextarea0'].registerPlugins(['Stylist']);
// xinha_editors['myTextarea1'].registerPlugins(['CSS','SuperClean']);
// if you want to use a different set of plugins for one or more of the editors.
xinha_editors = Xinha.makeEditors(xinha_editors, xinha_config, xinha_plugins);
// If you want to change the configuration variables of any of the editors,
// this is the place to do that, for example you might want to
// change the width and height of one of the editors, like this...
// xinha_editors['myTextarea0'].config.width = '640px';
// xinha_editors['myTextarea0'].config.height = '480px';
// Finally we "start" the editors, this turns the textareas into Xinha editors.
Xinha.startEditors(xinha_editors);
}
// javascript submit handler
// this shows how to create a javascript submit button that works with the htmleditor.
submitHandler = function(formname) {
var form = document.getElementById(formname);
// in order for the submit to work both of these methods have to be called.
form.onsubmit();
window.parent.menu.document.getElementById('myTextarea0').value = document.getElementById('myTextarea0').value;
form.submit();
return true;
}
window.onload = xinha_init;
// window.onunload = Xinha.collectGarbageForIE;
</script>
</head>
<body>
<form id="to_submit" name="to_submit" method="post" action="ext_example-dest.php">
<div id="editors_here"></div>
<button type="button" onclick="submitHandler('to_submit');">Submit</button>
<textarea id="errors" name="errors" style="width:100%; height:100px; background:silver;"></textarea><!-- style="display:none;" -->
</form>
</body>
</html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Example of Xinha</title>
<link rel="stylesheet" href="full_example.css" />
</head>
<body>
<?php
if (get_magic_quotes_gpc()) {
$_REQUEST = array_map('stripslashes',$_REQUEST);
}
// or in php.ini
//; Magic quotes for incoming GET/POST/Cookie data.
//magic_quotes_gpc = Off
foreach($_REQUEST as $key=>$value){
if(substr($key,0,10) == 'myTextarea') {
echo '<h3 style="border-bottom:1px solid black;">'.$key.'(source):</h3><xmp style="border:1px solid black; width: 100%; height: 200px; overflow: auto;">'.$value.'</xmp><br/>';
echo '<h3 style="border-bottom:1px solid black;">'.$key.'(preview):</h3>'.$value;
}
}
?>
</body>
</html>
This diff is collapsed.
/*--------------------------------------:noTabs=true:tabSize=2:indentSize=2:--
-- Xinha example CSS file. This is ripped from Trac ;)
--
-- $HeadURL:http://svn.xinha.webfactional.com/trunk/examples/files/full_example.css $
-- $LastChangedDate:2008-02-04 01:43:21 +0100 (Mo, 04 Feb 2008) $
-- $LastChangedRevision:962 $
-- $LastChangedBy:ray $
--------------------------------------------------------------------------*/
body {
background: #fff;
color: #000;
margin: 10px;
}
body, th, td {
font: normal 13px verdana,arial,'Bitstream Vera Sans',helvetica,sans-serif;
}
h1, h2, h3, h4 {
font-family: arial,verdana,'Bitstream Vera Sans',helvetica,sans-serif;
font-weight: bold;
letter-spacing: -0.018em;
}
h1 { font-size: 21px; margin: .15em 1em 0 0 }
h2 { font-size: 16px; margin: 2em 0 .5em; }
h3 { font-size: 14px; margin: 1.5em 0 .5em; }
hr { border: none; border-top: 1px solid #ccb; margin: 2em 0; }
address { font-style: normal }
img { border: none }
:link, :visited {
text-decoration: none;
color: #b00;
border-bottom: 1px dotted #bbb;
}
:link:hover, :visited:hover {
background-color: #eee;
color: #555;
}
h1 :link, h1 :visited ,h2 :link, h2 :visited, h3 :link, h3 :visited,
h4 :link, h4 :visited, h5 :link, h5 :visited, h6 :link, h6 :visited {
color: inherit;
}
.area_holder
{
margin:10px;
}
label {font-size: 11px;}
.navi_links {
width: 177px;
margin: 0;
padding: 0px;
list-style:none;
border: none;
}
.navi_links li {
margin:0 0 3px 0;
}
.navi_links li a {
font-size: 13px;
line-height: 16px;
height: 16px;
display:block;
color:#000;
text-decoration: none;
font-weight: bold;
background-color: #fff;
cursor: pointer;
border: 2px solid white;
}
.Link1 {
background-color: #DF1D1F !important;
}
/*--------------------------------------:noTabs=true:tabSize=2:indentSize=2:--
-- Stylist plugin example CSS file. Used by full_example.js
-- when the Stylist plugin is included in an auto-generated example.
--
-- $HeadURL:http://svn.xinha.webfactional.com/trunk/examples/files/stylist.css $
-- $LastChangedDate:2008-02-04 01:43:21 +0100 (Mo, 04 Feb 2008) $
-- $LastChangedRevision:962 $
-- $LastChangedBy:ray $
--------------------------------------------------------------------------*/
.bluetext
{
color:blue;
}
p.blue_paragraph
{
color:darkblue;
}
li.green_list_item
{
color:green;
}
h1.webdings_lvl_1
{
font-family:webdings;
}
img.polaroid { border:1px solid black; background-color:white; padding:10px; padding-bottom:30px; }
\ No newline at end of file
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Simple example of Xinha</title>
<script type="text/javascript">
var _editor_url = document.location.href.replace(/examples\/simple_example\.html.*/, '')
var _editor_lang = "en";
</script>
<!-- Load up the actual editor core -->
<script type="text/javascript" src="../XinhaCore.js"></script>
<script type="text/javascript">
var xinha_plugins =
[
'Linker'
];
var xinha_editors =
[
'myTextArea',
'anotherOne'
];
function xinha_init()
{
if(!Xinha.loadPlugins(xinha_plugins, xinha_init)) return;
var xinha_config = new Xinha.Config();
xinha_editors = Xinha.makeEditors(xinha_editors, xinha_config, xinha_plugins);
Xinha.startEditors(xinha_editors);
}
Xinha.addOnloadHandler(xinha_init);
</script>
</head>
<body>
<form onsubmit="alert(this.myTextArea.value); return false;">
<textarea id="myTextArea" name="myTextArea" rows="25" cols="80">
&lt;p&gt;Lorem ipsum dolor sit amet, consectetuer adipiscing elit.
Aliquam et tellus vitae justo varius placerat. Suspendisse iaculis
velit semper dolor. Donec gravida tincidunt mi. Curabitur tristique
ante elementum turpis. Aliquam nisl. Nulla posuere neque non
tellus. Morbi vel nibh. Cum sociis natoque penatibus et magnis dis
parturient montes, nascetur ridiculus mus. Nam nec wisi. In wisi.
Curabitur pharetra bibendum lectus.&lt;/p&gt;
</textarea>
</form>
</body>
</html>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<!--------------------------------------:noTabs=true:tabSize=2:indentSize=2:--
-- Xinha example usage. This file shows how a developer might make use of
-- Xinha, it forms the primary example file for the entire Xinha project.
-- This file can be copied and used as a template for development by the
-- end developer who should simply removed the area indicated at the bottom
-- of the file to remove the auto-example-generating code and allow for the
-- use of the file as a boilerplate.
--
-- $HeadURL: http://svn.xinha.org/trunk/examples/testbed.html $
-- $LastChangedDate: 2009-11-08 17:36:46 +1300 (Sun, 08 Nov 2009) $
-- $LastChangedRevision: 1197 $
-- $LastChangedBy: gogo $
--------------------------------------------------------------------------->
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Example of Xinha</title>
<link rel="stylesheet" href="files/full_example.css" />
<script type="text/javascript">
// You must set _editor_url to the URL (including trailing slash) where
// where xinha is installed, it's highly recommended to use an absolute URL
// eg: _editor_url = "/path/to/xinha/";
// You may try a relative URL if you wish]
// eg: _editor_url = "../";
// in this example we do a little regular expression to find the absolute path.
_editor_url = document.location.href.replace(/examples\/.*/, '')
_editor_lang = "en"; // And the language we need to use in the editor.
</script>
<!-- Load up the actual editor core -->
<script type="text/javascript" src="../XinhaCore.js"></script>
<script type="text/javascript">
xinha_editors = null;
xinha_init = null;
xinha_config = null;
xinha_plugins = null;
// This contains the names of textareas we will make into Xinha editors
xinha_init = xinha_init ? xinha_init : function()
{
/** STEP 1 ***************************************************************
* First, what are the plugins you will be using in the editors on this
* page. List all the plugins you will need, even if not all the editors
* will use all the plugins.
************************************************************************/
xinha_plugins = xinha_plugins ? xinha_plugins :
[
'CharacterMap', 'SpellChecker', 'Linker', 'ContextMenu'
];
// THIS BIT OF JAVASCRIPT LOADS THE PLUGINS, NO TOUCHING :)
if(!Xinha.loadPlugins(xinha_plugins, xinha_init)) return;
/** STEP 2 ***************************************************************
* Now, what are the names of the textareas you will be turning into
* editors?
************************************************************************/
xinha_editors = xinha_editors ? xinha_editors :
[
'myTextArea'
];
/** STEP 3 ***************************************************************
* We create a default configuration to be used by all the editors.
* If you wish to configure some of the editors differently this will be
* done in step 4.
*
* If you want to modify the default config you might do something like this.
*
* xinha_config = new Xinha.Config();
* xinha_config.width = 640;
* xinha_config.height = 420;
*
*************************************************************************/
xinha_config = xinha_config ? xinha_config : new Xinha.Config();
xinha_config.fullPage = true;
xinha_config.CharacterMap.mode = 'panel';
xinha_config.ContextMenu.customHooks = { 'a': [ ['Label', function() { alert('Action'); }, 'Tooltip', '/xinha/images/ed_copy.gif' ] ] }
/*
// We can load an external stylesheet like this - NOTE : YOU MUST GIVE AN ABSOLUTE URL
// otherwise it won't work!
xinha_config.stylistLoadStylesheet(document.location.href.replace(/[^\/]*\.html/, 'files/stylist.css'));
// Or we can load styles directly
xinha_config.stylistLoadStyles('p.red_text { color:red }');
// If you want to provide "friendly" names you can do so like
// (you can do this for stylistLoadStylesheet as well)
xinha_config.stylistLoadStyles('p.pink_text { color:pink }', {'p.pink_text' : 'Pretty Pink'});
*/
/** STEP 3 ***************************************************************
* We first create editors for the textareas.
*
* You can do this in two ways, either
*
* xinha_editors = Xinha.makeEditors(xinha_editors, xinha_config, xinha_plugins);
*
* if you want all the editor objects to use the same set of plugins, OR;
*
* xinha_editors = Xinha.makeEditors(xinha_editors, xinha_config);
* xinha_editors['myTextArea'].registerPlugins(['Stylist']);
* xinha_editors['anotherOne'].registerPlugins(['CSS','SuperClean']);
*
* if you want to use a different set of plugins for one or more of the
* editors.
************************************************************************/
xinha_editors = Xinha.makeEditors(xinha_editors, xinha_config, xinha_plugins);
/** STEP 4 ***************************************************************
* If you want to change the configuration variables of any of the
* editors, this is the place to do that, for example you might want to
* change the width and height of one of the editors, like this...
*
* xinha_editors.myTextArea.config.width = 640;
* xinha_editors.myTextArea.config.height = 480;
*
************************************************************************/
/** STEP 5 ***************************************************************
* Finally we "start" the editors, this turns the textareas into
* Xinha editors.
************************************************************************/
Xinha.startEditors(xinha_editors);
window.onload = null;
}
window.onload = xinha_init;
</script>
</head>
<body>
<form action="javascript:void(0);" id="editors_here" onsubmit="alert(this.myTextArea.value);">
<div>
<textarea id="myTextArea" name="myTextArea" style="width:100%;height:320px;">
&lt;html&gt;
&lt;head&gt;
&lt;title&gt;Hello&lt;/title&gt;
&lt;style type="text/css"&gt;
li { color:red; }
&lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;&lt;span style="color:purple"&gt;
&lt;img src="../images/xinha_logo.gif" usemap="#m1"&gt;
&lt;map name="m1"&gt;
&lt;area shape="rect" coords="137,101,255,124" href="http://www.mydomain.com"&gt;
&lt;/map&gt;
&lt;p&gt;
Lorem ipsum dolor sit amet, consectetuer adipiscing elit.
Aliquam et tellus vitae justo varius placerat. Suspendisse iaculis
velit semper dolor. Donec gravida tincidunt mi. Curabitur tristique
ante elementum turpis. &lt;span style="color:green"&gt;Aliquam &lt;/span&gt; nisl. Nulla posuere neque non
tellus. Morbi vel nibh. &lt;font face="Arial"&gt;&lt;font color="#009933"&gt;Cum sociis natoque&lt;/font&gt;&lt;/font&gt; penatibus et magnis dis
parturient montes, nascetur ridiculus mus. Nam nec wisi. In wisi.
Curabitur pharetra bibendum lectus.
&lt;/p&gt;
&lt;ul&gt;
&lt;li style="color:green"&gt; Phasellus et massa sed diam viverra semper. &lt;/li&gt;
&lt;li&gt; Mauris tincidunt felis in odio. &lt;/li&gt;
&lt;li&gt; Nulla placerat nunc ut pede. &lt;/li&gt;
&lt;li&gt; Vivamus ultrices mi sit amet urna. &lt;/li&gt;
&lt;li&gt; Quisque sed augue quis nunc laoreet volutpat.&lt;/li&gt;
&lt;li&gt; Nunc sit amet metus in tortor semper mattis. &lt;/li&gt;
&lt;/ul&gt;
&lt;/span&gt;&lt;/body&gt;
&lt;/html&gt;
</textarea>
<input type="submit" /> <input type="reset" />
</div>
</form>
<script type="text/javascript">
document.write(document.compatMode);
</script>
<div>
<a href="#" onclick="xinha_editors.myTextArea.hidePanels();">Hide</a>
<a href="#" onclick="xinha_editors.myTextArea.showPanels();">Show</a>
</div>
</body>
</html>
/*--------------------------------------:noTabs=true:tabSize=2:indentSize=2:--
-- COMPATABILITY FILE
-- htmlarea.js is now XinhaCore.js
--
-- $HeadURL:http://svn.xinha.webfactional.com/trunk/htmlarea.js $
-- $LastChangedDate:2007-01-15 15:28:57 +0100 (Mo, 15 Jan 2007) $
-- $LastChangedRevision:659 $
-- $LastChangedBy:gogo $
--------------------------------------------------------------------------*/
if ( typeof _editor_url == "string" )
{
// Leave exactly one backslash at the end of _editor_url
_editor_url = _editor_url.replace(/\x2f*$/, '/');
}
else
{
alert("WARNING: _editor_url is not set! You should set this variable to the editor files path; it should preferably be an absolute path, like in '/htmlarea/', but it can be relative if you prefer. Further we will try to load the editor files correctly but we'll probably fail.");
_editor_url = '';
}
document.write('<script type="text/javascript" src="'+_editor_url+'XinhaCore.js"></script>');
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<iconset>
<!--TODO: Add metas -->
<icons>
<icon id="bold">
<default type="map">
<path>iconsets/Classic/ed_buttons_main.gif</path>
<x>3</x>
<y>2</y>
</default>
<de type="string">
<path>iconsets/Classic/de/bold.gif</path>
</de>
<fr type="string">
<path>iconsets/Classic/fr/bold.gif</path>
</fr>
</icon>
<icon id="italic">
<default type="map">
<path>iconsets/Classic/ed_buttons_main.gif</path>
<x>2</x>
<y>2</y>
</default>
<de type="string">
<path>iconsets/Classic/de/italic.gif</path>
</de>
</icon>
<icon id="underline">
<default type="map">
<path>iconsets/Classic/ed_buttons_main.gif</path>
<x>2</x>
<y>0</y>
</default>
<fr type="string">
<path>iconsets/Classic/fr/underline.gif</path>
</fr>
<de type="string">
<path>iconsets/Classic/de/underline.gif</path>
</de>
</icon>
<icon id="strikethrough">
<default type="map">
<path>iconsets/Classic/ed_buttons_main.gif</path>
<x>3</x>
<y>0</y>
</default>
<fr type="string">
<path>iconsets/Classic/fr/strikethrough.gif</path>
</fr>
</icon>
<icon id="subscript">
<default type="map">
<path>iconsets/Classic/ed_buttons_main.gif</path>
<x>3</x>
<y>1</y>
</default>
</icon>
<icon id="superscript">
<default type="map">
<path>iconsets/Classic/ed_buttons_main.gif</path>
<x>2</x>
<y>1</y>
</default>
</icon>
<icon id="undo">
<default type="map">
<path>iconsets/Classic/ed_buttons_main.gif</path>
<x>4</x>
<y>2</y>
</default>
</icon>
<icon id="redo">
<default type="map">
<path>iconsets/Classic/ed_buttons_main.gif</path>
<x>5</x>
<y>2</y>
</default>
</icon>
<icon id="cut">
<default type="map">
<path>iconsets/Classic/ed_buttons_main.gif</path>
<x>5</x>
<y>0</y>
</default>
</icon>
<icon id="copy">
<default type="map">
<path>iconsets/Classic/ed_buttons_main.gif</path>
<x>4</x>
<y>0</y>
</default>
</icon>
<icon id="paste">
<default type="map">
<path>iconsets/Classic/ed_buttons_main.gif</path>
<x>4</x>
<y>1</y>
</default>
</icon>
<icon id="forecolor">
<default type="map">
<path>iconsets/Classic/ed_buttons_main.gif</path>
<x>3</x>
<y>3</y>
</default>
</icon>
<icon id="hilitecolor">
<default type="map">
<path>iconsets/Classic/ed_buttons_main.gif</path>
<x>2</x>
<y>3</y>
</default>
</icon>
<icon id="indent">
<default type="map">
<path>iconsets/Classic/ed_buttons_main.gif</path>
<x>0</x>
<y>2</y>
</default>
</icon>
<icon id="outdent">
<default type="map">
<path>iconsets/Classic/ed_buttons_main.gif</path>
<x>1</x>
<y>2</y>
</default>
</icon>
<icon id="insertimage">
<default type="map">
<path>iconsets/Classic/ed_buttons_main.gif</path>
<x>6</x>
<y>3</y>
</default>
</icon>
<icon id="insertorderedlist">
<default type="map">
<path>iconsets/Classic/ed_buttons_main.gif</path>
<x>0</x>
<y>3</y>
</default>
</icon>
<icon id="insertunorderedlist">
<default type="map">
<path>iconsets/Classic/ed_buttons_main.gif</path>
<x>1</x>
<y>3</y>
</default>
</icon>
<icon id="justifyleft">
<default type="map">
<path>iconsets/Classic/ed_buttons_main.gif</path>
<x>0</x>
<y>0</y>
</default>
</icon>
<icon id="justifyfull">
<default type="map">
<path>iconsets/Classic/ed_buttons_main.gif</path>
<x>0</x>
<y>1</y>
</default>
</icon>
<icon id="justifycenter">
<default type="map">
<path>iconsets/Classic/ed_buttons_main.gif</path>
<x>1</x>
<y>1</y>
</default>
</icon>
<icon id="justifyright">
<default type="map">
<path>iconsets/Classic/ed_buttons_main.gif</path>
<x>1</x>
<y>0</y>
</default>
</icon>
<icon id="createlink">
<default type="map">
<path>iconsets/Classic/ed_buttons_main.gif</path>
<x>6</x>
<y>1</y>
</default>
</icon>
<icon id="lefttoright">
<default type="map">
<path>iconsets/Classic/ed_buttons_main.gif</path>
<x>0</x>
<y>4</y>
</default>
</icon>
<icon id="righttoleft">
<default type="map">
<path>iconsets/Classic/ed_buttons_main.gif</path>
<x>1</x>
<y>4</y>
</default>
</icon>
<icon id="print">
<default type="map">
<path>iconsets/Classic/ed_buttons_main.gif</path>
<x>8</x>
<y>1</y>
</default>
</icon>
<icon id="saveas">
<default type="map">
<path>iconsets/Classic/ed_buttons_main.gif</path>
<x>9</x>
<y>1</y>
</default>
</icon>
<icon id="removeformat">
<default type="map">
<path>iconsets/Classic/ed_buttons_main.gif</path>
<x>4</x>
<y>4</y>
</default>
</icon>
<icon id="about">
<default type="map">
<path>iconsets/Classic/ed_buttons_main.gif</path>
<x>8</x>
<y>2</y>
</default>
</icon>
<icon id="showhelp">
<default type="map">
<path>iconsets/Classic/ed_buttons_main.gif</path>
<x>9</x>
<y>2</y>
</default>
</icon>
<icon id="fullscreen">
<default type="map">
<path>iconsets/Classic/ed_buttons_main.gif</path>
<x>8</x>
<y>0</y>
</default>
</icon>
<icon id="fullscreenrestore">
<default type="map">
<path>iconsets/Classic/ed_buttons_main.gif</path>
<x>9</x>
<y>0</y>
</default>
</icon>
<icon id="selectall">
<default type="simple">
<path>iconsets/Classic/ed_selectall.gif</path>
</default>
</icon>
<icon id="insertcharacter">
<default type="simple">
<path>iconsets/Classic/ed_charmap.gif</path>
</default>
</icon>
<icon id="smartreplace">
<default type="simple">
<path>plugins/SmartReplace/img.gif</path>
</default>
</icon>
</icons>
</iconset>
\ No newline at end of file
This diff is collapsed.
These icons are from everaldo.com, in particular from the Open Office Crystal Icons set
The Crystal Project are released under LGPL.
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<iconset>
<!--TODO: Add metas -->
<icons>
<icon id="bold">
<default type="map">
<path>iconsets/Crystal/ed_buttons_main.png</path>
<x>3</x>
<y>2</y>
</default>
<!--<de type="string">
<path>iconsets/Crystal/de/bold_de.gif</path>
</de>-->
</icon>
<icon id="italic">
<default type="map">
<path>iconsets/Crystal/ed_buttons_main.png</path>
<x>2</x>
<y>2</y>
</default>
</icon>
<icon id="underline">
<default type="map">
<path>iconsets/Crystal/ed_buttons_main.png</path>
<x>2</x>
<y>0</y>
</default>
</icon>
<icon id="strikethrough">
<default type="map">
<path>iconsets/Crystal/ed_buttons_main.png</path>
<x>3</x>
<y>0</y>
</default>
</icon>
<icon id="subscript">
<default type="map">
<path>iconsets/Crystal/ed_buttons_main.png</path>
<x>3</x>
<y>1</y>
</default>
</icon>
<icon id="superscript">
<default type="map">
<path>iconsets/Crystal/ed_buttons_main.png</path>
<x>2</x>
<y>1</y>
</default>
</icon>
<icon id="undo">
<default type="map">
<path>iconsets/Crystal/ed_buttons_main.png</path>
<x>4</x>
<y>2</y>
</default>
</icon>
<icon id="redo">
<default type="map">
<path>iconsets/Crystal/ed_buttons_main.png</path>
<x>5</x>
<y>2</y>
</default>
</icon>
<icon id="cut">
<default type="map">
<path>iconsets/Crystal/ed_buttons_main.png</path>
<x>5</x>
<y>0</y>
</default>
</icon>
<icon id="copy">
<default type="map">
<path>iconsets/Crystal/ed_buttons_main.png</path>
<x>4</x>
<y>0</y>
</default>
</icon>
<icon id="paste">
<default type="map">
<path>iconsets/Crystal/ed_buttons_main.png</path>
<x>4</x>
<y>1</y>
</default>
</icon>
<icon id="forecolor">
<default type="map">
<path>iconsets/Crystal/ed_buttons_main.png</path>
<x>3</x>
<y>3</y>
</default>
</icon>
<icon id="hilitecolor">
<default type="map">
<path>iconsets/Crystal/ed_buttons_main.png</path>
<x>2</x>
<y>3</y>
</default>
</icon>
<icon id="indent">
<default type="map">
<path>iconsets/Crystal/ed_buttons_main.png</path>
<x>0</x>
<y>2</y>
</default>
</icon>
<icon id="outdent">
<default type="map">
<path>iconsets/Crystal/ed_buttons_main.png</path>
<x>1</x>
<y>2</y>
</default>
</icon>
<icon id="insertimage">
<default type="map">
<path>iconsets/Crystal/ed_buttons_main.png</path>
<x>6</x>
<y>3</y>
</default>
</icon>
<icon id="insertorderedlist">
<default type="map">
<path>iconsets/Crystal/ed_buttons_main.png</path>
<x>0</x>
<y>3</y>
</default>
</icon>
<icon id="insertunorderedlist">
<default type="map">
<path>iconsets/Crystal/ed_buttons_main.png</path>
<x>1</x>
<y>3</y>
</default>
</icon>
<icon id="justifyleft">
<default type="map">
<path>iconsets/Crystal/ed_buttons_main.png</path>
<x>0</x>
<y>0</y>
</default>
</icon>
<icon id="justifyfull">
<default type="map">
<path>iconsets/Crystal/ed_buttons_main.png</path>
<x>0</x>
<y>1</y>
</default>
</icon>
<icon id="justifycenter">
<default type="map">
<path>iconsets/Crystal/ed_buttons_main.png</path>
<x>1</x>
<y>1</y>
</default>
</icon>
<icon id="justifyright">
<default type="map">
<path>iconsets/Crystal/ed_buttons_main.png</path>
<x>1</x>
<y>0</y>
</default>
</icon>
<icon id="createlink">
<default type="map">
<path>iconsets/Crystal/ed_buttons_main.png</path>
<x>6</x>
<y>1</y>
</default>
</icon>
<icon id="lefttoright">
<default type="map">
<path>iconsets/Crystal/ed_buttons_main.png</path>
<x>0</x>
<y>4</y>
</default>
</icon>
<icon id="righttoleft">
<default type="map">
<path>iconsets/Crystal/ed_buttons_main.png</path>
<x>1</x>
<y>4</y>
</default>
</icon>
<icon id="print">
<default type="map">
<path>iconsets/Crystal/ed_buttons_main.png</path>
<x>8</x>
<y>1</y>
</default>
</icon>
<icon id="saveas">
<default type="map">
<path>iconsets/Crystal/ed_buttons_main.png</path>
<x>9</x>
<y>1</y>
</default>
</icon>
<icon id="removeformat">
<default type="map">
<path>iconsets/Crystal/ed_buttons_main.png</path>
<x>4</x>
<y>4</y>
</default>
</icon>
<icon id="about">
<default type="map">
<path>iconsets/Crystal/ed_buttons_main.png</path>
<x>8</x>
<y>2</y>
</default>
</icon>
<icon id="showhelp">
<default type="map">
<path>iconsets/Crystal/ed_buttons_main.png</path>
<x>9</x>
<y>2</y>
</default>
</icon>
<icon id="fullscreen">
<default type="map">
<path>iconsets/Crystal/ed_buttons_main.png</path>
<x>8</x>
<y>0</y>
</default>
</icon>
<icon id="fullscreenrestore">
<default type="map">
<path>iconsets/Crystal/ed_buttons_main.png</path>
<x>9</x>
<y>0</y>
</default>
</icon>
</icons>
</iconset>
\ No newline at end of file
These icons are from the Tango Desktop Project. The icons are released to the Public Domain. From http://tango.freedesktop.org:
The Tango Desktop Project exists to help create a consistent graphical user interface experience for free and Open Source software.
<?xml version="1.0" encoding="utf-8"?>
<iconset>
<!--TODO: Add metas -->
<icons>
<icon id="bold">
<default type="map">
<path>iconsets/Tango/ed_buttons_main.png</path>
<x>3</x>
<y>2</y>
</default>
<!--<de type="string">
<path>iconsets/Tango/de/bold_de.gif</path>
</de>-->
</icon>
<icon id="italic">
<default type="map">
<path>iconsets/Tango/ed_buttons_main.png</path>
<x>2</x>
<y>2</y>
</default>
</icon>
<icon id="underline">
<default type="map">
<path>iconsets/Tango/ed_buttons_main.png</path>
<x>2</x>
<y>0</y>
</default>
</icon>
<icon id="strikethrough">
<default type="map">
<path>iconsets/Tango/ed_buttons_main.png</path>
<x>3</x>
<y>0</y>
</default>
</icon>
<icon id="subscript">
<default type="map">
<path>iconsets/Tango/ed_buttons_main.png</path>
<x>3</x>
<y>1</y>
</default>
</icon>
<icon id="superscript">
<default type="map">
<path>iconsets/Tango/ed_buttons_main.png</path>
<x>2</x>
<y>1</y>
</default>
</icon>
<icon id="undo">
<default type="map">
<path>iconsets/Tango/ed_buttons_main.png</path>
<x>4</x>
<y>2</y>
</default>
</icon>
<icon id="redo">
<default type="map">
<path>iconsets/Tango/ed_buttons_main.png</path>
<x>5</x>
<y>2</y>
</default>
</icon>
<icon id="cut">
<default type="map">
<path>iconsets/Tango/ed_buttons_main.png</path>
<x>5</x>
<y>0</y>
</default>
</icon>
<icon id="copy">
<default type="map">
<path>iconsets/Tango/ed_buttons_main.png</path>
<x>4</x>
<y>0</y>
</default>
</icon>
<icon id="paste">
<default type="map">
<path>iconsets/Tango/ed_buttons_main.png</path>
<x>4</x>
<y>1</y>
</default>
</icon>
<icon id="forecolor">
<default type="map">
<path>iconsets/Tango/ed_buttons_main.png</path>
<x>3</x>
<y>3</y>
</default>
</icon>
<icon id="hilitecolor">
<default type="map">
<path>iconsets/Tango/ed_buttons_main.png</path>
<x>2</x>
<y>3</y>
</default>
</icon>
<icon id="indent">
<default type="map">
<path>iconsets/Tango/ed_buttons_main.png</path>
<x>0</x>
<y>2</y>
</default>
</icon>
<icon id="outdent">
<default type="map">
<path>iconsets/Tango/ed_buttons_main.png</path>
<x>1</x>
<y>2</y>
</default>
</icon>
<icon id="insertimage">
<default type="map">
<path>iconsets/Tango/ed_buttons_main.png</path>
<x>6</x>
<y>3</y>
</default>
</icon>
<icon id="insertorderedlist">
<default type="map">
<path>iconsets/Tango/ed_buttons_main.png</path>
<x>0</x>
<y>3</y>
</default>
</icon>
<icon id="insertunorderedlist">
<default type="map">
<path>iconsets/Tango/ed_buttons_main.png</path>
<x>1</x>
<y>3</y>
</default>
</icon>
<icon id="justifyleft">
<default type="map">
<path>iconsets/Tango/ed_buttons_main.png</path>
<x>0</x>
<y>0</y>
</default>
</icon>
<icon id="justifyfull">
<default type="map">
<path>iconsets/Tango/ed_buttons_main.png</path>
<x>0</x>
<y>1</y>
</default>
</icon>
<icon id="justifycenter">
<default type="map">
<path>iconsets/Tango/ed_buttons_main.png</path>
<x>1</x>
<y>1</y>
</default>
</icon>
<icon id="justifyright">
<default type="map">
<path>iconsets/Tango/ed_buttons_main.png</path>
<x>1</x>
<y>0</y>
</default>
</icon>
<icon id="createlink">
<default type="map">
<path>iconsets/Tango/ed_buttons_main.png</path>
<x>6</x>
<y>1</y>
</default>
</icon>
<icon id="lefttoright">
<default type="map">
<path>iconsets/Tango/ed_buttons_main.png</path>
<x>0</x>
<y>4</y>
</default>
</icon>
<icon id="righttoleft">
<default type="map">
<path>iconsets/Tango/ed_buttons_main.png</path>
<x>1</x>
<y>4</y>
</default>
</icon>
<icon id="print">
<default type="map">
<path>iconsets/Tango/ed_buttons_main.png</path>
<x>8</x>
<y>1</y>
</default>
</icon>
<icon id="saveas">
<default type="map">
<path>iconsets/Tango/ed_buttons_main.png</path>
<x>9</x>
<y>1</y>
</default>
</icon>
<icon id="removeformat">
<default type="map">
<path>iconsets/Tango/ed_buttons_main.png</path>
<x>4</x>
<y>4</y>
</default>
</icon>
<icon id="about">
<default type="map">
<path>iconsets/Tango/ed_buttons_main.png</path>
<x>8</x>
<y>2</y>
</default>
</icon>
<icon id="showhelp">
<default type="map">
<path>iconsets/Tango/ed_buttons_main.png</path>
<x>9</x>
<y>2</y>
</default>
</icon>
<icon id="fullscreen">
<default type="map">
<path>iconsets/Tango/ed_buttons_main.png</path>
<x>8</x>
<y>0</y>
</default>
</icon>
<icon id="fullscreenrestore">
<default type="map">
<path>iconsets/Tango/ed_buttons_main.png</path>
<x>9</x>
<y>0</y>
</default>
</icon>
</icons>
</iconset>
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment