svn commit: r578051 [27/31] - in /lenya/branches/revolution/1.3.x/src: java/org/apache/lenya/cms/content/flat/ webapp/lenya/modules/xinha/ webapp/lenya/modules/xinha/contrib/ webapp/lenya/modules/xinha/examples/ webapp/lenya/modules/xinha/images/ webap...

[email protected]
Newsgroups gmane.comp.cms.lenya.cvs
Message-ID <[email protected]>
Added: lenya/branches/revolution/1.3.x/src/webapp/lenya/modules/xinha/plugins/SpellChecker/spell-check-logic.cgi
URL: http://svn.apache.org/viewvc/lenya/branches/revolution/1.3.x/src/webapp/lenya/modules/xinha/plugins/SpellChecker/spell-check-logic.cgi?rev=578051&view=auto
==============================================================================
--- lenya/branches/revolution/1.3.x/src/webapp/lenya/modules/xinha/plugins/SpellChecker/spell-check-logic.cgi (added)
+++ lenya/branches/revolution/1.3.x/src/webapp/lenya/modules/xinha/plugins/SpellChecker/spell-check-logic.cgi Fri Sep 21 03:36:30 2007
@@ -0,0 +1,210 @@
+#! /usr/bin/perl -w
+
+# Spell Checker Plugin for HTMLArea-3.0
+# Sponsored by www.americanbible.org
+# Implementation by Mihai Bazon, http://dynarch.com/mishoo/
+#
+# (c) dynarch.com 2003.
+# Distributed under the same terms as HTMLArea itself.
+# This notice MUST stay intact for use (see license.txt).
+#
+# $Id: spell-check-logic.cgi 21 2005-02-19 05:23:56Z gogo $
+
+use strict;
+use utf8;
+use Encode;
+use Text::Aspell;
+use XML::DOM;
+use CGI;
+
+my $TIMER_start = undef;
+eval {
+    use Time::HiRes qw( gettimeofday tv_interval );
+    $TIMER_start = [gettimeofday()];
+};
+# use POSIX qw( locale_h );
+
+binmode STDIN, ':utf8';
+binmode STDOUT, ':utf8';
+
+my $debug = 0;
+
+my $speller = new Text::Aspell;
+my $cgi = new CGI;
+
+my $total_words = 0;
+my $total_mispelled = 0;
+my $total_suggestions = 0;
+my $total_words_suggested = 0;
+
+# FIXME: report a nice error...
+die "Can't create speller!" unless $speller;
+
+my $dict = $cgi->param('dictionary') || $cgi->cookie('dictionary') || 'en';
+
+# add configurable option for this
+$speller->set_option('lang', $dict);
+$speller->set_option('encoding', 'UTF-8');
+#setlocale(LC_CTYPE, $dict);
+
+# ultra, fast, normal, bad-spellers
+# bad-spellers seems to cause segmentation fault
+$speller->set_option('sug-mode', 'normal');
+
+my %suggested_words = ();
+keys %suggested_words = 128;
+
+my $file_content = decode('UTF-8', $cgi->param('content'));
+$file_content = parse_with_dom($file_content);
+
+my $ck_dictionary = $cgi->cookie(-name     => 'dictionary',
+                                 -value    => $dict,
+                                 -expires  => '+30d');
+
+print $cgi->header(-type    => 'text/html; charset: utf-8',
+                   -cookie  => $ck_dictionary);
+
+my $js_suggested_words = make_js_hash(\%suggested_words);
+my $js_spellcheck_info = make_js_hash_from_array
+  ([
+    [ 'Total words'           , $total_words ],
+    [ 'Mispelled words'       , $total_mispelled . ' in dictionary \"'.$dict.'\"' ],
+    [ 'Total suggestions'     , $total_suggestions ],
+    [ 'Total words suggested' , $total_words_suggested ],
+    [ 'Spell-checked in'      , defined $TIMER_start ? (tv_interval($TIMER_start) . ' seconds') : 'n/a' ]
+   ]);
+
+print qq^<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+<link rel="stylesheet" type="text/css" media="all" href="spell-check-style.css" />
+<script type="text/javascript">
+  var suggested_words = { $js_suggested_words };
+  var spellcheck_info = { $js_spellcheck_info }; </script>
+</head>
+<body onload="window.parent.finishedSpellChecking();">^;
+
+print $file_content;
+if ($cgi->param('init') eq '1') {
+    my @dicts = $speller->dictionary_info();
+    my $dictionaries = '';
+    foreach my $i (@dicts) {
+        next if $i->{jargon};
+        my $name = $i->{name};
+        if ($name eq $dict) {
+            $name = '@'.$name;
+        }
+        $dictionaries .= ',' . $name;
+    }
+    $dictionaries =~ s/^,//;
+    print qq^<div id="HA-spellcheck-dictionaries">$dictionaries</div>^;
+}
+
+print '</body></html>';
+
+# Perl is beautiful.
+sub spellcheck {
+    my $node = shift;
+    my $doc = $node->getOwnerDocument;
+    my $check = sub {                 # called for each word in the text
+        # input is in UTF-8
+        my $word = shift;
+        my $already_suggested = defined $suggested_words{$word};
+        ++$total_words;
+        if (!$already_suggested && $speller->check($word)) {
+            return undef;
+        } else {
+            # we should have suggestions; give them back to browser in UTF-8
+            ++$total_mispelled;
+            if (!$already_suggested) {
+                # compute suggestions for this word
+                my @suggestions = $speller->suggest($word);
+                my $suggestions = decode($speller->get_option('encoding'), join(',', @suggestions));
+                $suggested_words{$word} = $suggestions;
+                ++$total_suggestions;
+                $total_words_suggested += scalar @suggestions;
+            }
+            # HA-spellcheck-error
+            my $err = $doc->createElement('span');
+            $err->setAttribute('class', 'HA-spellcheck-error');
+            my $tmp = $doc->createTextNode;
+            $tmp->setNodeValue($word);
+            $err->appendChild($tmp);
+            return $err;
+        }
+    };
+    while ($node->getNodeValue =~ /([\p{IsWord}']+)/) {
+        my $word = $1;
+        my $before = $`;
+        my $after = $';
+        my $df = &$check($word);
+        if (!$df) {
+            $before .= $word;
+        }
+        {
+            my $parent = $node->getParentNode;
+            my $n1 = $doc->createTextNode;
+            $n1->setNodeValue($before);
+            $parent->insertBefore($n1, $node);
+            $parent->insertBefore($df, $node) if $df;
+            $node->setNodeValue($after);
+        }
+    }
+};
+
+sub check_inner_text {
+    my $node = shift;
+    my $text = '';
+    for (my $i = $node->getFirstChild; defined $i; $i = $i->getNextSibling) {
+        if ($i->getNodeType == TEXT_NODE) {
+            spellcheck($i);
+        }
+    }
+};
+
+sub parse_with_dom {
+    my ($text) = @_;
+    $text = '<spellchecker>'.$text.'</spellchecker>';
+
+    my $parser = new XML::DOM::Parser;
+    if ($debug) {
+        open(FOO, '>:utf8', '/tmp/foo');
+        print FOO $text;
+        close FOO;
+    }
+    my $doc = $parser->parse($text);
+    my $nodes = $doc->getElementsByTagName('*');
+    my $n = $nodes->getLength;
+
+    for (my $i = 0; $i < $n; ++$i) {
+        my $node = $nodes->item($i);
+        if ($node->getNodeType == ELEMENT_NODE) {
+            check_inner_text($node);
+        }
+    }
+
+    my $ret = $doc->toString;
+    $ret =~ s{<spellchecker>(.*)</spellchecker>}{$1}sg;
+    return $ret;
+};
+
+sub make_js_hash {
+    my ($hash) = @_;
+    my $js_hash = '';
+    while (my ($key, $val) = each %$hash) {
+        $js_hash .= ',' if $js_hash;
+        $js_hash .= '"'.$key.'":"'.$val.'"';
+    }
+    return $js_hash;
+};
+
+sub make_js_hash_from_array {
+    my ($array) = @_;
+    my $js_hash = '';
+    foreach my $i (@$array) {
+        $js_hash .= ',' if $js_hash;
+        $js_hash .= '"'.$i->[0].'":"'.$i->[1].'"';
+    }
+    return $js_hash;
+};

Added: lenya/branches/revolution/1.3.x/src/webapp/lenya/modules/xinha/plugins/SpellChecker/spell-check-logic.php
URL: http://svn.apache.org/viewvc/lenya/branches/revolution/1.3.x/src/webapp/lenya/modules/xinha/plugins/SpellChecker/spell-check-logic.php?rev=578051&view=auto
==============================================================================
--- lenya/branches/revolution/1.3.x/src/webapp/lenya/modules/xinha/plugins/SpellChecker/spell-check-logic.php (added)
+++ lenya/branches/revolution/1.3.x/src/webapp/lenya/modules/xinha/plugins/SpellChecker/spell-check-logic.php Fri Sep 21 03:36:30 2007
@@ -0,0 +1,171 @@
+<?php
+  $text = stripslashes($_POST['content']);
+
+  // Convert UTF-8 multi-bytes into decimal character entities.  This is because
+  // aspell isn't fully utf8-aware - ticket:120 raises the possibility 
+  // that this is not required (any more) and so you can turn it off
+  // with editor.config.SpellChecker.utf8_to_entities = false 
+  if(!isset($_REQUEST['utf8_to_entitis']) || $_REQUEST['utf8_to_entities'])
+  {
+    $text = preg_replace('/([\xC0-\xDF][\x80-\xBF])/e', "'&#' . utf8_ord('\$1') . ';'", $text);
+    $text = preg_replace('/([\xE0-\xEF][\x80-\xBF][\x80-\xBF])/e',             "'&#' . utf8_ord('\$1') . ';'",  $text);
+    $text = preg_replace('/([\xF0-\xF7][\x80-\xBF][\x80-\xBF][\x80-\xBF])/e', "'&#' . utf8_ord('\$1') . ';'",   $text);
+  }
+  
+  function utf8_ord($chr)
+  {
+    switch(strlen($chr))
+    {
+      case 1 :
+        return ord($chr);
+
+      case 2 :
+        $ord = ord($chr{1}) & 63;
+        $ord = $ord | ((ord($chr{0}) & 31) << 6);
+        return $ord;
+
+      case 3 :
+        $ord = ord($chr{2}) & 63;
+        $ord = $ord | ((ord($chr{1}) & 63) << 6);
+        $ord = $ord | ((ord($chr{0}) & 15) << 12);
+        return $ord;
+
+      case 4 :
+        $ord = ord($chr{3}) & 63;
+        $ord = $ord | ((ord($chr{2}) & 63) << 6);
+        $ord = $ord | ((ord($chr{1}) & 63) << 12);
+        $ord = $ord | ((ord($chr{0}) & 7)  << 18);
+        return $ord;
+
+      default :
+        trigger_error('Character not utf-8', E_USER_ERROR);
+    }
+  }
+
+  require_once(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'aspell_setup.php');
+
+##############################################################################
+header('Content-Type: text/html; charset=utf-8');
+  echo '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+<link rel="stylesheet" type="text/css" media="all" href="spell-check-style.css" />';
+
+// Lets define some values outside the condition below, in case we have an empty 
+// document.                                                                     
+$textarray = array();
+$varlines = '<script type="text/javascript">var suggested_words = { ';
+$infolines = 'var spellcheck_info = {';
+$counter = 0;
+$suggest_count = 0;
+
+if (trim($text) != "")
+{
+    if ($fd = fopen($temptext, 'w'))
+    {
+        $textarray = explode("\n", $text);
+        fwrite ($fd, "!\n");
+        foreach ($textarray as $key=>$value)
+        {
+            // adding the carat to each line prevents the use of aspell commands within the text...
+            fwrite($fd, "^$value\n");
+        }
+        fclose($fd);
+        chmod($temptext, 0777);
+        // next run aspell
+        $return = shell_exec($aspellcommand . ' 2>&1');
+        // echo $return;
+        unlink($temptext);
+        $returnarray = explode("\n", $return);
+        $returnlines = count($returnarray);
+//print_r(htmlentities($return));
+        $textlines = count($textarray);
+
+        $lineindex = -1;
+        $poscorrect = 0;
+        foreach ($returnarray as $key=>$value)
+        {
+            // if there is a correction here, processes it, else move the $textarray pointer to the next line
+            if (substr($value, 0, 1) == '&')
+            {
+               $counter=$counter+1;
+                $correction = explode(' ', $value);
+                $word = $correction[1];
+                $suggest_count += $correction[2];
+                $absposition = substr($correction[3], 0, -1) - 1;
+                $position = $absposition + $poscorrect;
+                $niceposition = $lineindex.','.$absposition;
+                $suggstart = strpos($value, ':') + 2;
+                $suggestions = substr($value, $suggstart);
+                $suggestionarray = explode(', ', $suggestions);
+
+                $beforeword = substr($textarray[$lineindex], 0, $position);
+                $afterword = substr($textarray[$lineindex], $position + strlen($word));
+                $textarray[$lineindex] = $beforeword.'<span class="HA-spellcheck-error">'.$word.'</span>'.$afterword;
+
+             $suggestion_list = '';
+                foreach ($suggestionarray as $key=>$value)
+                {
+                    $suggestion_list .= $value.',';
+                }
+                $suggestion_list = substr($suggestion_list, 0, strlen($suggestion_list) - 1);
+                $varlines .= '"'.$word.'":"'.$suggestion_list.'",';
+
+                $poscorrect = $poscorrect + 41;
+            }
+            elseif (substr($value, 0, 1) == '#')
+            {
+                $correction = explode(' ', $value);
+                $word = $correction[1];
+                $absposition = $correction[2] - 1;
+                $position = $absposition + $poscorrect;
+                $niceposition = $lineindex.','.$absposition;
+                $beforeword = substr($textarray[$lineindex], 0, $position);
+                $afterword = substr($textarray[$lineindex], $position + strlen($word));
+                $textarray[$lineindex] = $beforeword.$word.$afterword;
+                $textarray[$lineindex] = $beforeword.'<span class="HA-spellcheck-error">'.$word.'</span><span class="HA-spellcheck-suggestions">'.$word.'</span>'.$afterword;
+//                $poscorrect = $poscorrect;
+                $poscorrect = $poscorrect + 88 + strlen($word);
+            }
+            else
+            {
+                //print "Done with line $lineindex, next line...<br><br>";
+                $poscorrect = 0;
+                $lineindex = $lineindex + 1;
+            }
+         }
+     }
+     else
+     {
+       // This one isnt used for anything at the moment!
+       $return = 'failed to open!';
+     }
+} 
+else 
+{ 
+  $returnlines=0; 
+}
+$infolines .= '"Language Used":"'.$lang.'",';
+$infolines .= '"Mispelled words":"'.$counter.'",';
+$infolines .= '"Total words suggested":"'.$suggest_count.'",';
+$infolines .= '"Total Lines Checked":"'.$returnlines.'"';
+$infolines .= '};';
+$varlines = substr($varlines, 0, strlen($varlines) - 1);
+echo $varlines.'};'.$infolines.'</script>';
+
+echo '</head>
+<body onload="window.parent.finishedSpellChecking();">';
+
+foreach ($textarray as $key=>$value)
+{
+  echo $value;
+}
+
+$dictionaries = str_replace(chr(10),",", shell_exec($aspelldictionaries));
+if(ereg(",$",$dictionaries))
+  $dictionaries = ereg_replace(",$","",$dictionaries);
+echo '<div id="HA-spellcheck-dictionaries">'.$dictionaries.'</div>';
+
+echo '</body></html>';
+?>
\ No newline at end of file

Added: lenya/branches/revolution/1.3.x/src/webapp/lenya/modules/xinha/plugins/SpellChecker/spell-check-savedicts.php
URL: http://svn.apache.org/viewvc/lenya/branches/revolution/1.3.x/src/webapp/lenya/modules/xinha/plugins/SpellChecker/spell-check-savedicts.php?rev=578051&view=auto
==============================================================================
--- lenya/branches/revolution/1.3.x/src/webapp/lenya/modules/xinha/plugins/SpellChecker/spell-check-savedicts.php (added)
+++ lenya/branches/revolution/1.3.x/src/webapp/lenya/modules/xinha/plugins/SpellChecker/spell-check-savedicts.php Fri Sep 21 03:36:30 2007
@@ -0,0 +1,38 @@
+<?php
+  require_once(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'aspell_setup.php');
+
+
+  $to_p_dict = $_REQUEST['to_p_dict'] ? $_REQUEST['to_p_dict'] : array();
+  $to_r_list = $_REQUEST['to_r_list'] ? $_REQUEST['to_r_list'] : array();
+print_r($to_r_list);
+  if($to_p_dict || $to_r_list)
+  {
+    if($fh = fopen($temptext, 'w'))
+    {
+      foreach($to_p_dict as $personal_word)
+      {
+        $cmd = '&' . $personal_word . "\n";
+        echo $cmd;
+        fwrite($fh, $cmd, strlen($cmd));
+      }
+
+      foreach($to_r_list as $replace_pair)
+      {
+        $cmd = '$$ra ' . $replace_pair[0] . ' , ' . $replace_pair[1] . "\n";
+        echo $cmd;
+        fwrite($fh, $cmd, strlen($cmd));
+      }
+      $cmd = "#\n";
+      echo $cmd;
+      fwrite($fh, $cmd, strlen($cmd));
+      fclose($fh);
+    }
+    else
+    {
+      die("Can't Write");
+    }
+    echo $aspellcommand."\n";
+    echo shell_exec($aspellcommand . ' 2>&1');
+    unlink($temptext);
+  }
+?>
\ No newline at end of file

Added: lenya/branches/revolution/1.3.x/src/webapp/lenya/modules/xinha/plugins/SpellChecker/spell-check-style.css
URL: http://svn.apache.org/viewvc/lenya/branches/revolution/1.3.x/src/webapp/lenya/modules/xinha/plugins/SpellChecker/spell-check-style.css?rev=578051&view=auto
==============================================================================
--- lenya/branches/revolution/1.3.x/src/webapp/lenya/modules/xinha/plugins/SpellChecker/spell-check-style.css (added)
+++ lenya/branches/revolution/1.3.x/src/webapp/lenya/modules/xinha/plugins/SpellChecker/spell-check-style.css Fri Sep 21 03:36:30 2007
@@ -0,0 +1,10 @@
+.HA-spellcheck-error { border-bottom: 1px dashed #f00; cursor: default; }
+.HA-spellcheck-same { background-color: #cef; color: #000; }
+.HA-spellcheck-hover { background-color: #433; color: white; }
+.HA-spellcheck-fixed { border-bottom: 1px dashed #0b8; }
+.HA-spellcheck-current { background-color: #9be; color: #000; }
+.HA-spellcheck-suggestions { display: none; }
+
+#HA-spellcheck-dictionaries { display: none; }
+
+a:link, a:visited { color: #55e; }

Added: lenya/branches/revolution/1.3.x/src/webapp/lenya/modules/xinha/plugins/SpellChecker/spell-check-ui.html
URL: http://svn.apache.org/viewvc/lenya/branches/revolution/1.3.x/src/webapp/lenya/modules/xinha/plugins/SpellChecker/spell-check-ui.html?rev=578051&view=auto
==============================================================================
--- lenya/branches/revolution/1.3.x/src/webapp/lenya/modules/xinha/plugins/SpellChecker/spell-check-ui.html (added)
+++ lenya/branches/revolution/1.3.x/src/webapp/lenya/modules/xinha/plugins/SpellChecker/spell-check-ui.html Fri Sep 21 03:36:30 2007
@@ -0,0 +1,125 @@
+<!--
+
+  Strangely, IE sucks with or without the DOCTYPE switch.
+  I thought it would only suck without it.
+
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
+    "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+
+   Spell Checker Plugin for HTMLArea-3.0
+   Sponsored by www.americanbible.org
+   Implementation by Mihai Bazon, http://dynarch.com/mishoo/
+
+   (c) dynarch.com 2003.
+   Distributed under the same terms as HTMLArea itself.
+   This notice MUST stay intact for use (see license.txt).
+
+   $Id: spell-check-ui.html 498 2006-04-30 09:46:23Z gogo $
+
+-->
+<html xmlns="http://www.w3.org/1999/xhtml">
+
+  <head>
+    <title>Spell Checker</title>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+    <script type="text/javascript" src="spell-check-ui.js"></script>
+
+    <style type="text/css">
+      html, body { height: 100%; margin: 0px; padding: 0px; background-color: #fff;
+      color: #000; }
+      a:link, a:visited { color: #00f; text-decoration: none; }
+      a:hover { color: #f00; text-decoration: underline; }
+
+      table { background-color: ButtonFace; color: ButtonText;
+      font-family: tahoma,verdana,sans-serif; font-size: 11px; }
+
+      iframe { background-color: #fff; color: #000; height: 100%; width: 100%; }
+
+      .controls { width: 13em; }
+      .controls .sectitle { /* background-color: #736c6c; color: #fff;
+      border-top: 1px solid #000; border-bottom: 1px solid #fff; */
+      text-align: center;
+      font-weight: bold; padding: 2px 4px; }
+      .controls .secbody { margin-bottom: 10px; }
+
+      button, select { font-family: tahoma,verdana,sans-serif; font-size: 11px; }
+      button { width: 6em; padding: 0px; }
+
+      input, select { font-family: fixed,"andale mono",monospace; }
+
+      #v_currentWord { color: #f00; font-weight: bold; }
+      #statusbar { padding: 7px 0px 0px 5px; }
+      #status { font-weight: bold; }
+    </style>
+
+  </head>
+
+  <body onload="initDocument()">
+
+    <form style="display: none;" action="spell-check-logic.cgi"
+          method="post" target="framecontent"
+          accept-charset="UTF-8"
+          ><input type="hidden" name="content" id="f_content"
+          /><input type="hidden" name="dictionary" id="f_dictionary"
+          /><input type="hidden" name="init" id="f_init" value="1"
+          /><input type="hidden" name="utf8_to_entities" id="utf8_to_entities" value="1"
+    /></form>
+
+    <table style="height: 100%; width: 100%; border-collapse: collapse;" cellspacing="0" cellpadding="0">
+      <tr>
+        <td colspan="2" style="height: 1em; padding: 2px;">
+          <div style="float: right; padding: 2px;"><span>Dictionary</span>
+            <select id="v_dictionaries" style="width: 10em"></select>
+            <button id="b_recheck">Re-check</button>
+          </div>
+          <span id="status">Please wait.  Calling spell checker.</span>
+        </td>
+      </tr>
+      <tr>
+        <td valign="top" class="controls">
+          <div class="secbody" style="text-align: center">
+            <button id="b_info">Info</button>
+          </div>
+          <div class="sectitle">Original word</div>
+          <div class="secbody" id="v_currentWord" style="text-align:
+          center; margin-bottom: 0px;">pliz weit ;-)</div>
+          <div class="secbody" style="text-align: center">
+            <button id="b_revert">Revert</button>
+          </div>
+          <div class="sectitle">Replace with</div>
+          <div class="secbody">
+            <input type="text" id="v_replacement" style="width: 94%; margin-left: 3%;" /><br />
+            <div style="text-align: center; margin-top: 2px;">
+              <button id="b_replace">Replace</button><button
+                id="b_replall">Replace all</button><br /><button
+                id="b_ignore">Ignore</button><button
+                id="b_ignall">Ignore all</button>
+                <button
+                id="b_learn">Learn</button>
+            </div>
+          </div>
+          <div class="sectitle">Suggestions</div>
+          <div class="secbody">
+            <select size="11" style="width: 94%; margin-left: 3%;" id="v_suggestions"></select>
+          </div>
+        </td>
+
+        <td>
+          <iframe src="../../popups/blank.html" width="100%" height="100%"
+            id="i_framecontent" name="framecontent"></iframe>
+        </td>
+      </tr>
+      <tr>
+        <td style="height: 1em;" colspan="2">
+          <div style="padding: 4px 2px 2px 2px; float: right;">
+            <button id="b_ok">OK</button>
+            <button id="b_cancel">Cancel</button>
+          </div>
+          <div id="statusbar"></div>
+        </td>
+      </tr>
+    </table>
+
+  </body>
+
+</html>

Added: lenya/branches/revolution/1.3.x/src/webapp/lenya/modules/xinha/plugins/SpellChecker/spell-check-ui.js
URL: http://svn.apache.org/viewvc/lenya/branches/revolution/1.3.x/src/webapp/lenya/modules/xinha/plugins/SpellChecker/spell-check-ui.js?rev=578051&view=auto
==============================================================================
--- lenya/branches/revolution/1.3.x/src/webapp/lenya/modules/xinha/plugins/SpellChecker/spell-check-ui.js (added)
+++ lenya/branches/revolution/1.3.x/src/webapp/lenya/modules/xinha/plugins/SpellChecker/spell-check-ui.js Fri Sep 21 03:36:30 2007
@@ -0,0 +1,392 @@
+var SpellChecker=window.opener.SpellChecker;
+var Xinha=window.opener.Xinha;
+var HTMLArea=Xinha;
+var _editor_url=window.opener._editor_url;
+var is_ie=HTMLArea.is_ie;
+var editor=SpellChecker.editor;
+var frame=null;
+var currentElement=null;
+var wrongWords=null;
+var modified=false;
+var allWords={};
+var fixedWords=[];
+var suggested_words={};
+var to_p_dict=[];
+var to_r_list=[];
+function _lc(_1){
+return HTMLArea._lc(_1,"SpellChecker");
+}
+function makeCleanDoc(_2){
+var _3=wrongWords.concat(fixedWords);
+for(var i=_3.length;--i>=0;){
+var el=_3[i];
+if(!(_2&&/HA-spellcheck-fixed/.test(el.className))){
+if(el.firstChild){
+el.parentNode.insertBefore(el.firstChild,el);
+}
+el.parentNode.removeChild(el);
+}else{
+el.className="HA-spellcheck-fixed";
+}
+}
+return Xinha.getHTML(frame.contentWindow.document.body,true,editor);
+}
+function recheckClicked(){
+document.getElementById("status").innerHTML=_lc("Please wait: changing dictionary to")+": \""+document.getElementById("f_dictionary").value+"\".";
+var _6=document.getElementById("f_content");
+_6.value=makeCleanDoc(true);
+_6.form.submit();
+}
+function saveClicked(){
+if(modified){
+editor.setHTML(makeCleanDoc(false));
+}
+if(to_p_dict.length||to_r_list.length&&editor.config.SpellChecker.backend=="php"){
+var _7={};
+for(var i=0;i<to_p_dict.length;i++){
+_7["to_p_dict["+i+"]"]=to_p_dict[i];
+}
+for(var i=0;i<to_r_list.length;i++){
+_7["to_r_list["+i+"][0]"]=to_r_list[i][0];
+_7["to_r_list["+i+"][1]"]=to_r_list[i][1];
+}
+window.opener.HTMLArea._postback(_editor_url+"/plugins/SpellChecker/spell-check-savedicts.php",_7);
+window.close();
+}else{
+window.close();
+}
+return false;
+}
+function cancelClicked(){
+var ok=true;
+if(modified){
+ok=confirm(_lc("This will drop changes and quit spell checker.  Please confirm."));
+}
+if(ok){
+window.close();
+}
+return false;
+}
+function replaceWord(el){
+var _b=document.getElementById("v_replacement").value;
+var _c=(el.innerHTML!=_b);
+if(_c){
+modified=true;
+}
+if(el){
+el.className=el.className.replace(/\s*HA-spellcheck-(hover|fixed)\s*/g," ");
+}
+el.className+=" HA-spellcheck-fixed";
+el.__msh_fixed=true;
+if(!_c){
+return false;
+}
+to_r_list.push([el.innerHTML,_b]);
+el.innerHTML=_b;
+}
+function replaceClicked(){
+replaceWord(currentElement);
+var _d=currentElement.__msh_id;
+var _e=_d;
+do{
+++_e;
+if(_e==wrongWords.length){
+_e=0;
+}
+}while((_e!=_d)&&wrongWords[_e].__msh_fixed);
+if(_e==_d){
+_e=0;
+alert(_lc("Finished list of mispelled words"));
+}
+wrongWords[_e].__msh_wordClicked(true);
+return false;
+}
+function revertClicked(){
+document.getElementById("v_replacement").value=currentElement.__msh_origWord;
+replaceWord(currentElement);
+currentElement.className="HA-spellcheck-error HA-spellcheck-current";
+return false;
+}
+function replaceAllClicked(){
+var _f=document.getElementById("v_replacement").value;
+var ok=true;
+var _11=allWords[currentElement.__msh_origWord];
+if(_11.length==0){
+alert("An impossible condition just happened.  Call FBI.  ;-)");
+}else{
+if(_11.length==1){
+replaceClicked();
+return false;
+}
+}
+if(ok){
+for(var i=0;i<_11.length;++i){
+if(_11[i]!=currentElement){
+replaceWord(_11[i]);
+}
+}
+replaceClicked();
+}
+return false;
+}
+function ignoreClicked(){
+document.getElementById("v_replacement").value=currentElement.__msh_origWord;
+replaceClicked();
+return false;
+}
+function ignoreAllClicked(){
+document.getElementById("v_replacement").value=currentElement.__msh_origWord;
+replaceAllClicked();
+return false;
+}
+function learnClicked(){
+to_p_dict.push(currentElement.__msh_origWord);
+return ignoreAllClicked();
+}
+function internationalizeWindow(){
+var _13=["div","span","button"];
+for(var i=0;i<_13.length;++i){
+var tag=_13[i];
+var els=document.getElementsByTagName(tag);
+for(var j=els.length;--j>=0;){
+var el=els[j];
+if(el.childNodes.length==1&&/\S/.test(el.innerHTML)){
+var txt=el.innerHTML;
+el.innerHTML=_lc(txt);
+}
+}
+}
+}
+function initDocument(){
+internationalizeWindow();
+modified=false;
+frame=document.getElementById("i_framecontent");
+var _1a=document.getElementById("f_content");
+_1a.value=HTMLArea.getHTML(editor._doc.body,false,editor);
+var _1b=document.getElementById("f_dictionary");
+if(typeof editor.config.SpellChecker.defaultDictionary!="undefined"&&editor.config.SpellChecker.defaultDictionary!=""){
+_1b.value=editor.config.SpellChecker.defaultDictionary;
+}else{
+_1b.value="en_GB";
+}
+if(editor.config.SpellChecker.backend=="php"){
+_1a.form.action=_editor_url+"/plugins/SpellChecker/spell-check-logic.php";
+}
+if(editor.config.SpellChecker.utf8_to_entities){
+document.getElementById("utf8_to_entities").value=1;
+}else{
+document.getElementById("utf8_to_entities").value=0;
+}
+_1a.form.submit();
+document.getElementById("f_init").value="0";
+var _1c=document.getElementById("v_suggestions");
+_1c.onchange=function(){
+document.getElementById("v_replacement").value=this.value;
+};
+if(is_ie){
+_1c.attachEvent("ondblclick",replaceClicked);
+}else{
+_1c.addEventListener("dblclick",replaceClicked,true);
+}
+document.getElementById("b_replace").onclick=replaceClicked;
+if(editor.config.SpellChecker.backend=="php"){
+document.getElementById("b_learn").onclick=learnClicked;
+}else{
+document.getElementById("b_learn").parentNode.removeChild(document.getElementById("b_learn"));
+}
+document.getElementById("b_replall").onclick=replaceAllClicked;
+document.getElementById("b_ignore").onclick=ignoreClicked;
+document.getElementById("b_ignall").onclick=ignoreAllClicked;
+document.getElementById("b_recheck").onclick=recheckClicked;
+document.getElementById("b_revert").onclick=revertClicked;
+document.getElementById("b_info").onclick=displayInfo;
+document.getElementById("b_ok").onclick=saveClicked;
+document.getElementById("b_cancel").onclick=cancelClicked;
+_1c=document.getElementById("v_dictionaries");
+_1c.onchange=function(){
+document.getElementById("f_dictionary").value=this.value;
+};
+}
+function getAbsolutePos(el){
+var r={x:el.offsetLeft,y:el.offsetTop};
+if(el.offsetParent){
+var tmp=getAbsolutePos(el.offsetParent);
+r.x+=tmp.x;
+r.y+=tmp.y;
+}
+return r;
+}
+function wordClicked(_20){
+var _21=this;
+if(_20){
+(function(){
+var pos=getAbsolutePos(_21);
+var ws={x:frame.offsetWidth-4,y:frame.offsetHeight-4};
+var wp={x:frame.contentWindow.document.body.scrollLeft,y:frame.contentWindow.document.body.scrollTop};
+pos.x-=Math.round(ws.x/2);
+if(pos.x<0){
+pos.x=0;
+}
+pos.y-=Math.round(ws.y/2);
+if(pos.y<0){
+pos.y=0;
+}
+frame.contentWindow.scrollTo(pos.x,pos.y);
+})();
+}
+if(currentElement){
+var a=allWords[currentElement.__msh_origWord];
+currentElement.className=currentElement.className.replace(/\s*HA-spellcheck-current\s*/g," ");
+for(var i=0;i<a.length;++i){
+var el=a[i];
+if(el!=currentElement){
+el.className=el.className.replace(/\s*HA-spellcheck-same\s*/g," ");
+}
+}
+}
+currentElement=this;
+this.className+=" HA-spellcheck-current";
+var a=allWords[currentElement.__msh_origWord];
+for(var i=0;i<a.length;++i){
+var el=a[i];
+if(el!=currentElement){
+el.className+=" HA-spellcheck-same";
+}
+}
+var txt;
+if(a.length==1){
+txt="one occurrence";
+}else{
+if(a.length==2){
+txt="two occurrences";
+}else{
+txt=a.length+" occurrences";
+}
+}
+var _29=suggested_words[this.__msh_origWord];
+if(_29){
+_29=_29.split(/,/);
+}else{
+_29=[];
+}
+var _2a=document.getElementById("v_suggestions");
+document.getElementById("statusbar").innerHTML="Found "+txt+" for word \"<b>"+currentElement.__msh_origWord+"</b>\"";
+for(var i=_2a.length;--i>=0;){
+_2a.remove(i);
+}
+for(var i=0;i<_29.length;++i){
+var txt=_29[i];
+var _2b=document.createElement("option");
+_2b.value=txt;
+_2b.appendChild(document.createTextNode(txt));
+_2a.appendChild(_2b);
+}
+document.getElementById("v_currentWord").innerHTML=this.__msh_origWord;
+if(_29.length>0){
+_2a.selectedIndex=0;
+_2a.onchange();
+}else{
+document.getElementById("v_replacement").value=this.innerHTML;
+}
+_2a.style.display="none";
+_2a.style.display="block";
+return false;
+}
+function wordMouseOver(){
+this.className+=" HA-spellcheck-hover";
+}
+function wordMouseOut(){
+this.className=this.className.replace(/\s*HA-spellcheck-hover\s*/g," ");
+}
+function displayInfo(){
+var _2c=frame.contentWindow.spellcheck_info;
+if(!_2c){
+alert("No information available");
+}else{
+var txt="** Document information **";
+for(var i in _2c){
+txt+="\n"+i+" : "+_2c[i];
+}
+alert(txt);
+}
+return false;
+}
+function finishedSpellChecking(){
+currentElement=null;
+wrongWords=null;
+allWords={};
+fixedWords=[];
+suggested_words=frame.contentWindow.suggested_words;
+document.getElementById("status").innerHTML="HTMLArea Spell Checker (<a href='readme-tech.html' target='_blank' title='Technical information'>info</a>)";
+var doc=frame.contentWindow.document;
+var _30=doc.getElementsByTagName("span");
+var sps=[];
+var id=0;
+for(var i=0;i<_30.length;++i){
+var el=_30[i];
+if(/HA-spellcheck-error/.test(el.className)){
+sps.push(el);
+el.__msh_wordClicked=wordClicked;
+el.onclick=function(ev){
+ev||(ev=window.event);
+ev&&HTMLArea._stopEvent(ev);
+return this.__msh_wordClicked(false);
+};
+el.onmouseover=wordMouseOver;
+el.onmouseout=wordMouseOut;
+el.__msh_id=id++;
+var txt=(el.__msh_origWord=el.firstChild.data);
+el.__msh_fixed=false;
+if(typeof allWords[txt]=="undefined"){
+allWords[txt]=[el];
+}else{
+allWords[txt].push(el);
+}
+}else{
+if(/HA-spellcheck-fixed/.test(el.className)){
+fixedWords.push(el);
+}
+}
+}
+var _37=doc.getElementById("HA-spellcheck-dictionaries");
+if(_37){
+_37.parentNode.removeChild(_37);
+_37=_37.innerHTML.split(/,/);
+var _38=document.getElementById("v_dictionaries");
+for(var i=_38.length;--i>=0;){
+_38.remove(i);
+}
+var _39=document.getElementById("f_dictionary").value;
+for(var i=0;i<_37.length;++i){
+var txt=_37[i];
+var _3a=document.createElement("option");
+if(txt==_39){
+_3a.selected=true;
+}
+_3a.value=txt;
+_3a.appendChild(document.createTextNode(txt));
+_38.appendChild(_3a);
+}
+}
+wrongWords=sps;
+if(sps.length==0){
+if(!modified){
+alert(_lc("No mispelled words found with the selected dictionary."));
+}else{
+alert(_lc("No mispelled words found with the selected dictionary."));
+}
+return false;
+}
+(currentElement=sps[0]).__msh_wordClicked(true);
+var as=doc.getElementsByTagName("a");
+for(var i=as.length;--i>=0;){
+var a=as[i];
+a.onclick=function(){
+if(confirm(_lc("Please confirm that you want to open this link")+":\n"+this.href+"\n"+_lc("I will open it in a new page."))){
+window.open(this.href);
+}
+return false;
+};
+}
+}
+

Added: lenya/branches/revolution/1.3.x/src/webapp/lenya/modules/xinha/plugins/SpellChecker/spell-checker.js
URL: http://svn.apache.org/viewvc/lenya/branches/revolution/1.3.x/src/webapp/lenya/modules/xinha/plugins/SpellChecker/spell-checker.js?rev=578051&view=auto
==============================================================================
--- lenya/branches/revolution/1.3.x/src/webapp/lenya/modules/xinha/plugins/SpellChecker/spell-checker.js (added)
+++ lenya/branches/revolution/1.3.x/src/webapp/lenya/modules/xinha/plugins/SpellChecker/spell-checker.js Fri Sep 21 03:36:30 2007
@@ -0,0 +1,73 @@
+// Spell Checker Plugin for HTMLArea-3.0
+// Sponsored by www.americanbible.org
+// Implementation by Mihai Bazon, http://dynarch.com/mishoo/
+//
+// (c) dynarch.com 2003.
+// Distributed under the same terms as HTMLArea itself.
+// This notice MUST stay intact for use (see license.txt).
+//
+// $Id: spell-checker.js 498 2006-04-30 09:46:23Z gogo $
+
+HTMLArea.Config.prototype.SpellChecker = { 'backend': 'php', 'personalFilesDir' : '', 'defaultDictionary' : 'en_GB', 'utf8_to_entities' : true };
+
+function SpellChecker(editor) {
+  this.editor = editor;
+
+  var cfg = editor.config;
+  var bl = SpellChecker.btnList;
+  var self = this;
+
+  // see if we can find the mode switch button, insert this before that
+  var id = "SC-spell-check";
+  cfg.registerButton(id, this._lc("Spell-check"), editor.imgURL("spell-check.gif", "SpellChecker"), false,
+             function(editor, id) {
+               // dispatch button press event
+               self.buttonPress(editor, id);
+             });
+
+  cfg.addToolbarElement("SC-spell-check", "htmlmode", 1);
+}
+
+SpellChecker._pluginInfo = {
+  name          : "SpellChecker",
+  version       : "1.0",
+  developer     : "Mihai Bazon",
+  developer_url : "http://dynarch.com/mishoo/",
+  c_owner       : "Mihai Bazon",
+  sponsor       : "American Bible Society",
+  sponsor_url   : "http://www.americanbible.org",
+  license       : "htmlArea"
+};
+
+SpellChecker.prototype._lc = function(string) {
+    return HTMLArea._lc(string, 'SpellChecker');
+};
+
+SpellChecker.btnList = [
+  null, // separator
+  ["spell-check"]
+  ];
+
+SpellChecker.prototype.buttonPress = function(editor, id) {
+  switch (id) {
+      case "SC-spell-check":
+    SpellChecker.editor = editor;
+    SpellChecker.init = true;
+    var uiurl = _editor_url + "plugins/SpellChecker/spell-check-ui.html";
+    var win;
+    if (HTMLArea.is_ie) {
+      win = window.open(uiurl, "SC_spell_checker",
+            "toolbar=no,location=no,directories=no,status=no,menubar=no," +
+            "scrollbars=no,resizable=yes,width=600,height=450");
+    } else {
+      win = window.open(uiurl, "SC_spell_checker",
+            "toolbar=no,menubar=no,personalbar=no,width=600,height=450," +
+            "scrollbars=no,resizable=yes");
+    }
+    win.focus();
+    break;
+  }
+};
+
+// this needs to be global, it's accessed from spell-check-ui.html
+SpellChecker.editor = null;
\ No newline at end of file

Added: lenya/branches/revolution/1.3.x/src/webapp/lenya/modules/xinha/plugins/Stylist/lang/de.js
URL: http://svn.apache.org/viewvc/lenya/branches/revolution/1.3.x/src/webapp/lenya/modules/xinha/plugins/Stylist/lang/de.js?rev=578051&view=auto
==============================================================================
--- lenya/branches/revolution/1.3.x/src/webapp/lenya/modules/xinha/plugins/Stylist/lang/de.js (added)
+++ lenya/branches/revolution/1.3.x/src/webapp/lenya/modules/xinha/plugins/Stylist/lang/de.js Fri Sep 21 03:36:30 2007
@@ -0,0 +1,6 @@
+// I18N constants
+// LANG: "de", ENCODING: UTF-8
+// Author: Mihai Bazon, http://dynarch.com/mishoo
+{
+  "Styles": "Stile"
+};

Added: lenya/branches/revolution/1.3.x/src/webapp/lenya/modules/xinha/plugins/Stylist/lang/fr.js
URL: http://svn.apache.org/viewvc/lenya/branches/revolution/1.3.x/src/webapp/lenya/modules/xinha/plugins/Stylist/lang/fr.js?rev=578051&view=auto
==============================================================================
--- lenya/branches/revolution/1.3.x/src/webapp/lenya/modules/xinha/plugins/Stylist/lang/fr.js (added)
+++ lenya/branches/revolution/1.3.x/src/webapp/lenya/modules/xinha/plugins/Stylist/lang/fr.js Fri Sep 21 03:36:30 2007
@@ -0,0 +1,5 @@
+// I18N constants
+// LANG: "fr", ENCODING: UTF-8
+{
+  "Styles": "Styles"
+};
\ No newline at end of file

Added: lenya/branches/revolution/1.3.x/src/webapp/lenya/modules/xinha/plugins/Stylist/lang/ja.js
URL: http://svn.apache.org/viewvc/lenya/branches/revolution/1.3.x/src/webapp/lenya/modules/xinha/plugins/Stylist/lang/ja.js?rev=578051&view=auto
==============================================================================
--- lenya/branches/revolution/1.3.x/src/webapp/lenya/modules/xinha/plugins/Stylist/lang/ja.js (added)
+++ lenya/branches/revolution/1.3.x/src/webapp/lenya/modules/xinha/plugins/Stylist/lang/ja.js Fri Sep 21 03:36:30 2007
@@ -0,0 +1,5 @@
+// I18N constants
+// LANG: "ja", ENCODING: UTF-8
+{
+  "Styles": "スタイル"
+};
\ No newline at end of file

Added: lenya/branches/revolution/1.3.x/src/webapp/lenya/modules/xinha/plugins/Stylist/lang/nb.js
URL: http://svn.apache.org/viewvc/lenya/branches/revolution/1.3.x/src/webapp/lenya/modules/xinha/plugins/Stylist/lang/nb.js?rev=578051&view=auto
==============================================================================
--- lenya/branches/revolution/1.3.x/src/webapp/lenya/modules/xinha/plugins/Stylist/lang/nb.js (added)
+++ lenya/branches/revolution/1.3.x/src/webapp/lenya/modules/xinha/plugins/Stylist/lang/nb.js Fri Sep 21 03:36:30 2007
@@ -0,0 +1,6 @@
+// I18N constants
+// LANG: "nb", ENCODING: UTF-8
+// translated: Kim Steinhaug, http://www.steinhaug.com/, [email protected]
+{
+  "Styles": "Stiler"
+};
\ No newline at end of file

Added: lenya/branches/revolution/1.3.x/src/webapp/lenya/modules/xinha/plugins/Stylist/lang/pl.js
URL: http://svn.apache.org/viewvc/lenya/branches/revolution/1.3.x/src/webapp/lenya/modules/xinha/plugins/Stylist/lang/pl.js?rev=578051&view=auto
==============================================================================
--- lenya/branches/revolution/1.3.x/src/webapp/lenya/modules/xinha/plugins/Stylist/lang/pl.js (added)
+++ lenya/branches/revolution/1.3.x/src/webapp/lenya/modules/xinha/plugins/Stylist/lang/pl.js Fri Sep 21 03:36:30 2007
@@ -0,0 +1,6 @@
+// I18N constants
+// LANG: "pl", ENCODING: UTF-8
+// translated: Krzysztof Kotowicz [email protected]
+{
+  "Styles": "Style"
+};

Added: lenya/branches/revolution/1.3.x/src/webapp/lenya/modules/xinha/plugins/Stylist/stylist.js
URL: http://svn.apache.org/viewvc/lenya/branches/revolution/1.3.x/src/webapp/lenya/modules/xinha/plugins/Stylist/stylist.js?rev=578051&view=auto
==============================================================================
--- lenya/branches/revolution/1.3.x/src/webapp/lenya/modules/xinha/plugins/Stylist/stylist.js (added)
+++ lenya/branches/revolution/1.3.x/src/webapp/lenya/modules/xinha/plugins/Stylist/stylist.js Fri Sep 21 03:36:30 2007
@@ -0,0 +1,372 @@
+Xinha.Config.prototype.css_style={};
+Xinha.Config.prototype.stylistLoadStylesheet=function(_1,_2){
+if(!_2){
+_2={};
+}
+var _3=Xinha.ripStylesFromCSSFile(_1);
+for(var i in _3){
+if(_2[i]){
+this.css_style[i]=_2[i];
+}else{
+this.css_style[i]=_3[i];
+}
+}
+this.pageStyleSheets[this.pageStyleSheets.length]=_1;
+};
+Xinha.Config.prototype.stylistLoadStyles=function(_5,_6){
+if(!_6){
+_6={};
+}
+var _7=Xinha.ripStylesFromCSSString(_5);
+for(var i in _7){
+if(_6[i]){
+this.css_style[i]=_6[i];
+}else{
+this.css_style[i]=_7[i];
+}
+}
+this.pageStyle+=_5;
+};
+Xinha.prototype._fillStylist=function(){
+if(!this._stylist){
+return false;
+}
+this.plugins.Stylist.instance.main.innerHTML="";
+var _9=true;
+var _a=this._getSelection();
+var _b=this._activeElement(_a);
+for(var x in this.config.css_style){
+var _d=null;
+var _e=x.trim();
+var _f=true;
+var _10=_b;
+if(_f&&/[^a-zA-Z0-9_.-]/.test(_e)){
+_f=false;
+}
+if(_e.indexOf(".")<0){
+_f=false;
+}
+if(_f&&(_e.indexOf(".")>0)){
+_d=_e.substring(0,_e.indexOf(".")).toLowerCase();
+_e=_e.substring(_e.indexOf("."),_e.length);
+if(_b!=null&&_b.tagName.toLowerCase()==_d){
+_f=true;
+_10=_b;
+}else{
+if(this._getFirstAncestor(this._getSelection(),[_d])!=null){
+_f=true;
+_10=this._getFirstAncestor(this._getSelection(),[_d]);
+}else{
+if((_d=="div"||_d=="span"||_d=="p"||(_d.substr(0,1)=="h"&&_d.length==2&&_d!="hr"))){
+if(!this._selectionEmpty(this._getSelection())){
+_f=true;
+_10="new";
+}else{
+_10=this._getFirstAncestor(_a,["p","h1","h2","h3","h4","h5","h6","h7"]);
+if(_10!=null){
+_f=true;
+}
+}
+}else{
+_f=false;
+}
+}
+}
+}
+if(_f){
+_e=_e.substring(_e.indexOf("."),_e.length);
+_e=_e.replace("."," ");
+if(_10==null){
+if(this._selectionEmpty(this._getSelection())){
+_10=this._getFirstAncestor(this._getSelection(),null);
+}else{
+_10="new";
+_d="span";
+}
+}
+}
+var _11=(this._ancestorsWithClasses(_a,_d,_e).length>0?true:false);
+var _12=this._ancestorsWithClasses(_a,_d,_e);
+if(_f){
+var _13=document.createElement("a");
+_13._stylist_className=_e.trim();
+_13._stylist_applied=_11;
+_13._stylist_appliedTo=_12;
+_13._stylist_applyTo=_10;
+_13._stylist_applyTag=_d;
+_13.innerHTML=this.config.css_style[x];
+_13.href="javascript:void(0)";
+var _14=this;
+_13.onclick=function(){
+if(this._stylist_applied==true){
+_14._stylistRemoveClasses(this._stylist_className,this._stylist_appliedTo);
+}else{
+_14._stylistAddClasses(this._stylist_applyTo,this._stylist_applyTag,this._stylist_className);
+}
+return false;
+};
+_13.style.display="block";
+_13.style.paddingLeft="3px";
+_13.style.paddingTop="1px";
+_13.style.paddingBottom="1px";
+_13.style.textDecoration="none";
+if(_11){
+_13.style.background="Highlight";
+_13.style.color="HighlightText";
+}
+this.plugins.Stylist.instance.main.appendChild(_13);
+}
+}
+};
+Xinha.prototype._stylistAddClasses=function(el,tag,_17){
+if(el=="new"){
+this.insertHTML("<"+tag+" class=\""+_17+"\">"+this.getSelectedHTML()+"</"+tag+">");
+}else{
+if(tag!=null&&el.tagName.toLowerCase()!=tag){
+var _18=this.switchElementTag(el,tag);
+if(typeof el._stylist_usedToBe!="undefined"){
+_18._stylist_usedToBe=el._stylist_usedToBe;
+_18._stylist_usedToBe[_18._stylist_usedToBe.length]={"tagName":el.tagName,"className":el.getAttribute("class")};
+}else{
+_18._stylist_usedToBe=[{"tagName":el.tagName,"className":el.getAttribute("class")}];
+}
+Xinha.addClasses(_18,_17);
+}else{
+Xinha._addClasses(el,_17);
+}
+}
+this.focusEditor();
+this.updateToolbar();
+};
+Xinha.prototype._stylistRemoveClasses=function(_19,_1a){
+for(var x=0;x<_1a.length;x++){
+this._stylistRemoveClassesFull(_1a[x],_19);
+}
+this.focusEditor();
+this.updateToolbar();
+};
+Xinha.prototype._stylistRemoveClassesFull=function(el,_1d){
+if(el!=null){
+var _1e=el.className.trim().split(" ");
+var _1f=[];
+var _20=_1d.split(" ");
+for(var x=0;x<_1e.length;x++){
+var _22=false;
+for(var i=0;_22==false&&i<_20.length;i++){
+if(_20[i]==_1e[x]){
+_22=true;
+}
+}
+if(_22==false){
+_1f[_1f.length]=_1e[x];
+}
+}
+if(_1f.length==0&&el._stylist_usedToBe&&el._stylist_usedToBe.length>0&&el._stylist_usedToBe[el._stylist_usedToBe.length-1].className!=null){
+var _24=el._stylist_usedToBe[el._stylist_usedToBe.length-1];
+var _25=Xinha.arrayFilter(_24.className.trim().split(" "),function(c){
+if(c==null||c.trim()==""){
+return false;
+}
+return true;
+});
+if((_1f.length==0)||(Xinha.arrayContainsArray(_1f,_25)&&Xinha.arrayContainsArray(_25,_1f))){
+el=this.switchElementTag(el,_24.tagName);
+_1f=_25;
+}else{
+el._stylist_usedToBe=[];
+}
+}
+if(_1f.length>0||el.tagName.toLowerCase()!="span"||(el.id&&el.id!="")){
+el.className=_1f.join(" ").trim();
+}else{
+var _27=el.parentNode;
+var _28=el.childNodes;
+for(var x=0;x<_28.length;x++){
+_27.insertBefore(_28[x],el);
+}
+_27.removeChild(el);
+}
+}
+};
+Xinha.prototype.switchElementTag=function(el,tag){
+var _2b=el.parentNode;
+var _2c=this._doc.createElement(tag);
+if(Xinha.is_ie||el.hasAttribute("id")){
+_2c.setAttribute("id",el.getAttribute("id"));
+}
+if(Xinha.is_ie||el.hasAttribute("style")){
+_2c.setAttribute("style",el.getAttribute("style"));
+}
+var _2d=el.childNodes;
+for(var x=0;x<_2d.length;x++){
+_2c.appendChild(_2d[x].cloneNode(true));
+}
+_2b.insertBefore(_2c,el);
+_2c._stylist_usedToBe=[el.tagName];
+_2b.removeChild(el);
+this.selectNodeContents(_2c);
+return _2c;
+};
+Xinha.prototype._getAncestorsClassNames=function(sel){
+var _30=this._activeElement(sel);
+if(_30==null){
+_30=(Xinha.is_ie?this._createRange(sel).parentElement():this._createRange(sel).commonAncestorContainer);
+}
+var _31=[];
+while(_30){
+if(_30.nodeType==1){
+var _32=_30.className.trim().split(" ");
+for(var x=0;x<_32.length;x++){
+_31[_31.length]=_32[x];
+}
+if(_30.tagName.toLowerCase()=="body"){
+break;
+}
+if(_30.tagName.toLowerCase()=="table"){
+break;
+}
+}
+_30=_30.parentNode;
+}
+return _31;
+};
+Xinha.prototype._ancestorsWithClasses=function(sel,tag,_36){
+var _37=[];
+var _38=this._activeElement(sel);
+if(_38==null){
+try{
+_38=(Xinha.is_ie?this._createRange(sel).parentElement():this._createRange(sel).commonAncestorContainer);
+}
+catch(e){
+return _37;
+}
+}
+var _39=_36.trim().split(" ");
+while(_38){
+if(_38.nodeType==1&&_38.className){
+if(tag==null||_38.tagName.toLowerCase()==tag){
+var _36=_38.className.trim().split(" ");
+var _3a=true;
+for(var i=0;i<_39.length;i++){
+var _3c=false;
+for(var x=0;x<_36.length;x++){
+if(_39[i]==_36[x]){
+_3c=true;
+break;
+}
+}
+if(!_3c){
+_3a=false;
+break;
+}
+}
+if(_3a){
+_37[_37.length]=_38;
+}
+}
+if(_38.tagName.toLowerCase()=="body"){
+break;
+}
+if(_38.tagName.toLowerCase()=="table"){
+break;
+}
+}
+_38=_38.parentNode;
+}
+return _37;
+};
+Xinha.ripStylesFromCSSFile=function(URL){
+var css=Xinha._geturlcontent(URL);
+return Xinha.ripStylesFromCSSString(css);
+};
+Xinha.ripStylesFromCSSString=function(css){
+RE_comment=/\/\*(.|\r|\n)*?\*\//g;
+RE_rule=/\{(.|\r|\n)*?\}/g;
+css=css.replace(RE_comment,"");
+css=css.replace(RE_rule,",");
+css=css.split(",");
+var _41={};
+for(var x=0;x<css.length;x++){
+if(css[x].trim()){
+_41[css[x].trim()]=css[x].trim();
+}
+}
+return _41;
+};
+function Stylist(_43,_44){
+this.editor=_43;
+var _45=this;
+}
+Stylist._pluginInfo={name:"Stylist",version:"1.0",developer:"James Sleeman",developer_url:"http://www.gogo.co.nz/",c_owner:"Gogo Internet Services",license:"HTMLArea",sponsor:"Gogo Internet Services",sponsor_url:"http://www.gogo.co.nz/"};
+Stylist.prototype.onGenerateOnce=function(){
+var _46=this.editor;
+var _47=this;
+if(typeof _46.config.css_style!="undefined"&&Xinha.objectProperties(_46.config.css_style).length!=0){
+_46._stylist=null;
+_46._stylist=_46.addPanel("right");
+Xinha.addClass(_46._stylist,"stylist");
+this.caption=document.createElement("h1");
+this.caption.innerHTML=Xinha._lc("Styles","Stylist");
+_46._stylist.appendChild(this.caption);
+this.main=document.createElement("div");
+this.main.style.overflow="auto";
+this.main.style.height=this.editor._framework.ed_cell.offsetHeight-this.caption.offsetHeight+"px";
+_46._stylist.appendChild(this.main);
+Xinha.freeLater(this,"caption");
+Xinha.freeLater(this,"main");
+_46.notifyOn("modechange",function(e,_49){
+switch(_49.mode){
+case "text":
+_46.hidePanel(_46._stylist);
+break;
+case "wysiwyg":
+_46.showPanel(_46._stylist);
+break;
+}
+});
+_46.notifyOn("panel_change",function(e,_4b){
+switch(_4b.action){
+case "show":
+var _4c=_47.main.offsetHeight-_4b.panel.offsetHeight;
+_47.main.style.height=((_4c>0)?_47.main.offsetHeight-_4b.panel.offsetHeight:0)+"px";
+_46._stylist.style.height=_47.caption.offsetHeight+"px";
+_46.sizeEditor();
+break;
+case "hide":
+_47.resize();
+break;
+}
+});
+_46.notifyOn("before_resize",function(){
+_46._stylist.style.height=_47.caption.offsetHeight+"px";
+});
+_46.notifyOn("resize",function(){
+_47.resize();
+});
+}
+};
+Stylist.prototype.resize=function(){
+var _4d=this.editor;
+var _4e=_4d._stylist.parentNode;
+var _4f=_4e.offsetHeight;
+for(var i=0;i<_4e.childNodes.length;++i){
+if(_4e.childNodes[i]==_4d._stylist||!_4e.childNodes[i].offsetHeight){
+continue;
+}
+_4f-=_4e.childNodes[i].offsetHeight;
+}
+_4d._stylist.style.height=_4f+"px";
+this.main.style.height=_4f-this.caption.offsetHeight+"px";
+};
+Stylist.prototype.onUpdateToolbar=function(){
+if(this.editor._stylist){
+if(this._timeoutID){
+window.clearTimeout(this._timeoutID);
+}
+var e=this.editor;
+this._timeoutID=window.setTimeout(function(){
+e._fillStylist();
+},250);
+}
+};
+

Added: lenya/branches/revolution/1.3.x/src/webapp/lenya/modules/xinha/plugins/SuperClean/dialog.html
URL: http://svn.apache.org/viewvc/lenya/branches/revolution/1.3.x/src/webapp/lenya/modules/xinha/plugins/SuperClean/dialog.html?rev=578051&view=auto
==============================================================================
--- lenya/branches/revolution/1.3.x/src/webapp/lenya/modules/xinha/plugins/SuperClean/dialog.html (added)
+++ lenya/branches/revolution/1.3.x/src/webapp/lenya/modules/xinha/plugins/SuperClean/dialog.html Fri Sep 21 03:36:30 2007
@@ -0,0 +1,9 @@
+<h1 id="[h1]"><l10n>Clean up HTML</l10n></h1>
+<div style="margin-left: 10px;">
+    <l10n>Please select from the following cleaning options...</l10n>
+    <!--filters-->
+  <div style="margin-top: 10px;">
+    <input type="button" id="[ok]"     value="_(OK)"     />
+    <input type="button" id="[cancel]" value="_(Cancel)" />
+  </div>
+</div>
\ No newline at end of file

Added: lenya/branches/revolution/1.3.x/src/webapp/lenya/modules/xinha/plugins/SuperClean/filters/paragraph.js
URL: http://svn.apache.org/viewvc/lenya/branches/revolution/1.3.x/src/webapp/lenya/modules/xinha/plugins/SuperClean/filters/paragraph.js?rev=578051&view=auto
==============================================================================
--- lenya/branches/revolution/1.3.x/src/webapp/lenya/modules/xinha/plugins/SuperClean/filters/paragraph.js (added)
+++ lenya/branches/revolution/1.3.x/src/webapp/lenya/modules/xinha/plugins/SuperClean/filters/paragraph.js Fri Sep 21 03:36:30 2007
@@ -0,0 +1,6 @@
+function(html) {
+  html = html.replace(/<\s*p[^>]*>/gi, '');
+  html = html.replace(/<\/\s*p\s*>/gi, '');
+  html = html.trim();
+  return html;
+} 
\ No newline at end of file

Added: lenya/branches/revolution/1.3.x/src/webapp/lenya/modules/xinha/plugins/SuperClean/filters/word.js
URL: http://svn.apache.org/viewvc/lenya/branches/revolution/1.3.x/src/webapp/lenya/modules/xinha/plugins/SuperClean/filters/word.js?rev=578051&view=auto
==============================================================================
--- lenya/branches/revolution/1.3.x/src/webapp/lenya/modules/xinha/plugins/SuperClean/filters/word.js (added)
+++ lenya/branches/revolution/1.3.x/src/webapp/lenya/modules/xinha/plugins/SuperClean/filters/word.js Fri Sep 21 03:36:30 2007
@@ -0,0 +1,53 @@
+function(html) {
+    // Remove HTML comments
+	html = html.replace(/<!--[\w\s\d@{}:.;,'"%!#_=&|?~()[*+\/\-\]]*-->/gi, "" );
+	html = html.replace(/<!--[^\0]*-->/gi, '');
+    // Remove all HTML tags
+	html = html.replace(/<\/?\s*HTML[^>]*>/gi, "" );
+    // Remove all BODY tags
+    html = html.replace(/<\/?\s*BODY[^>]*>/gi, "" );
+    // Remove all META tags
+	html = html.replace(/<\/?\s*META[^>]*>/gi, "" );
+    // Remove all SPAN tags
+	html = html.replace(/<\/?\s*SPAN[^>]*>/gi, "" );
+	// Remove all FONT tags
+    html = html.replace(/<\/?\s*FONT[^>]*>/gi, "");
+    // Remove all IFRAME tags.
+    html = html.replace(/<\/?\s*IFRAME[^>]*>/gi, "");
+    // Remove all STYLE tags & content
+	html = html.replace(/<\/?\s*STYLE[^>]*>(.|[\n\r\t])*<\/\s*STYLE\s*>/gi, "" );
+    // Remove all TITLE tags & content
+	html = html.replace(/<\s*TITLE[^>]*>(.|[\n\r\t])*<\/\s*TITLE\s*>/gi, "" );
+	// Remove javascript
+    html = html.replace(/<\s*SCRIPT[^>]*>[^\0]*<\/\s*SCRIPT\s*>/gi, "");
+    // Remove all HEAD tags & content
+	html = html.replace(/<\s*HEAD[^>]*>(.|[\n\r\t])*<\/\s*HEAD\s*>/gi, "" );
+	// Remove Class attributes
+	html = html.replace(/<\s*(\w[^>]*) class=([^ |>]*)([^>]*)/gi, "<$1$3") ;
+	// Remove Style attributes
+	html = html.replace(/<\s*(\w[^>]*) style="([^"]*)"([^>]*)/gi, "<$1$3") ;
+	// Remove Lang attributes
+	html = html.replace(/<\s*(\w[^>]*) lang=([^ |>]*)([^>]*)/gi, "<$1$3") ;
+	// Remove XML elements and declarations
+	html = html.replace(/<\\?\?xml[^>]*>/gi, "") ;
+	// Remove Tags with XML namespace declarations: <o:p></o:p>
+	html = html.replace(/<\/?\w+:[^>]*>/gi, "") ;
+	// Replace the &nbsp;
+	html = html.replace(/&nbsp;/, " " );
+
+	// Transform <p><br /></p> to <br>
+	//html = html.replace(/<\s*p[^>]*>\s*<\s*br\s*\/>\s*<\/\s*p[^>]*>/gi, "<br>");
+	html = html.replace(/<\s*p[^>]*><\s*br\s*\/?>\s*<\/\s*p[^>]*>/gi, "<br>");
+	
+	// Remove <P> 
+	html = html.replace(/<\s*p[^>]*>/gi, "");
+	
+	// Replace </p> with <br>
+	html = html.replace(/<\/\s*p[^>]*>/gi, "<br>");
+	
+	// Remove any <br> at the end
+	html = html.replace(/(\s*<br>\s*)*$/, "");
+	
+	html = html.trim();
+	return html;
+} 
\ No newline at end of file

Added: lenya/branches/revolution/1.3.x/src/webapp/lenya/modules/xinha/plugins/SuperClean/img/ed_superclean.gif
URL: http://svn.apache.org/viewvc/lenya/branches/revolution/1.3.x/src/webapp/lenya/modules/xinha/plugins/SuperClean/img/ed_superclean.gif?rev=578051&view=auto
==============================================================================
Binary file - no diff available.

Propchange: lenya/branches/revolution/1.3.x/src/webapp/lenya/modules/xinha/plugins/SuperClean/img/ed_superclean.gif
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: lenya/branches/revolution/1.3.x/src/webapp/lenya/modules/xinha/plugins/SuperClean/lang/de.js
URL: http://svn.apache.org/viewvc/lenya/branches/revolution/1.3.x/src/webapp/lenya/modules/xinha/plugins/SuperClean/lang/de.js?rev=578051&view=auto
==============================================================================
--- lenya/branches/revolution/1.3.x/src/webapp/lenya/modules/xinha/plugins/SuperClean/lang/de.js (added)
+++ lenya/branches/revolution/1.3.x/src/webapp/lenya/modules/xinha/plugins/SuperClean/lang/de.js Fri Sep 21 03:36:30 2007
@@ -0,0 +1,17 @@
+// I18N constants
+// LANG: "de", ENCODING: UTF-8
+// translated: Raimund Meyer [email protected]
+{
+  "Clean up HTML": "HTML säubern",
+  "Please select from the following cleaning options...": "Bitte Optionen auswählen...",
+  "General tidy up and correction of some problems.": "Allgemeines aufräumen und Korrektur einiger Probleme.",
+  "Clean bad HTML from Microsoft Word": "Schlechtes HTML aus Microsoft Word aufräumen",
+  "Remove custom typefaces (font \"styles\").": "Schriftarten entfernen (font face).",
+  "Remove custom font sizes.": "Schriftgrößen entfernen (font size).",
+  "Remove custom text colors.": "Schriftfarben entfernen (font color).",
+  "Remove lang attributes.": "Sprachattribute entfernen.",
+  "Go": "Go",
+  "Cancel": "Abbrechen",
+  "Tidy failed.  Check your HTML for syntax errors.": "Säubern fehlgeschlagen. Überprüfen Sie Ihren Code auf Fehler.",
+  "You don't have anything to tidy!": "Es gibt nichts zu säubern...!"
+};

Added: lenya/branches/revolution/1.3.x/src/webapp/lenya/modules/xinha/plugins/SuperClean/lang/fr.js
URL: http://svn.apache.org/viewvc/lenya/branches/revolution/1.3.x/src/webapp/lenya/modules/xinha/plugins/SuperClean/lang/fr.js?rev=578051&view=auto
==============================================================================
--- lenya/branches/revolution/1.3.x/src/webapp/lenya/modules/xinha/plugins/SuperClean/lang/fr.js (added)
+++ lenya/branches/revolution/1.3.x/src/webapp/lenya/modules/xinha/plugins/SuperClean/lang/fr.js Fri Sep 21 03:36:30 2007
@@ -0,0 +1,16 @@
+// I18N constants
+// LANG: "fr", ENCODING: UTF-8
+{
+  "Clean up HTML": "Nettoyer le code HTML",
+  "Please select from the following cleaning options...": "Veuillez sélectionner une option de nettoyage.",
+  "General tidy up and correction of some problems.": "Nettoyage générique et correction des problèmes mineurs.",
+  "Clean bad HTML from Microsoft Word": "Nettoyer les balises HTML de Microsoft Word",
+  "Remove custom typefaces (font \"styles\").": "Supprimer les polices personalisées (font \"styles\").",
+  "Remove custom font sizes.": "Supprimer les tailles de polices personnalisées.",
+  "Remove custom text colors.": "Supprimer les couleurs de texte personalisées.",
+  "Remove lang attributes.": "Supprimer les attributs de langue.",
+  "Go": "Commencer",
+  "Cancel": "Annuler",
+  "Tidy failed.  Check your HTML for syntax errors.": "Tidy a échoué. Vérifier la syntaxe HTML.",
+  "You don't have anything to tidy!": "Rien à transmettre à tidy !"
+};
\ No newline at end of file

Added: lenya/branches/revolution/1.3.x/src/webapp/lenya/modules/xinha/plugins/SuperClean/lang/ja.js
URL: http://svn.apache.org/viewvc/lenya/branches/revolution/1.3.x/src/webapp/lenya/modules/xinha/plugins/SuperClean/lang/ja.js?rev=578051&view=auto
==============================================================================
--- lenya/branches/revolution/1.3.x/src/webapp/lenya/modules/xinha/plugins/SuperClean/lang/ja.js (added)
+++ lenya/branches/revolution/1.3.x/src/webapp/lenya/modules/xinha/plugins/SuperClean/lang/ja.js Fri Sep 21 03:36:30 2007
@@ -0,0 +1,18 @@
+// I18N constants
+// LANG: "ja", ENCODING: UTF-8
+{
+  "Clean up HTML": "HTMLのクリーンナップ",
+  "Please select from the following cleaning options...": "以下のクリーンナップオプションを選択してください...",
+  "General tidy up and correction of some problems.": "一般的な適正化といくつかの問題を修正します。",
+  "Clean bad HTML from Microsoft Word": "Microsoft Wordによる不正なHTMLの清潔化",
+  "Remove custom typefaces (font \"styles\").": "独自フォント名設定の除去 (font face)。",
+  "Remove custom font sizes.": "独自フォントサイズ設定の除去。",
+  "Remove custom text colors.": "独自文字色設定の除去。",
+  "Remove lang attributes.": "言語属性の除去。",
+  "Go": "実行",
+  "Cancel": "中止",
+  "Tidy failed.  Check your HTML for syntax errors.": "適正化に失敗しました。HTMLの文法エラーを確認してください。",
+  "You don't have anything to tidy!": "適正化するものは何もありません!",
+  "Replace directional quote marks with non-directional quote marks.": "方向つき引用符を方向なし引用符に置換。",
+  "CANCEL": "中止"
+};
\ No newline at end of file

Added: lenya/branches/revolution/1.3.x/src/webapp/lenya/modules/xinha/plugins/SuperClean/lang/nb.js
URL: http://svn.apache.org/viewvc/lenya/branches/revolution/1.3.x/src/webapp/lenya/modules/xinha/plugins/SuperClean/lang/nb.js?rev=578051&view=auto
==============================================================================
--- lenya/branches/revolution/1.3.x/src/webapp/lenya/modules/xinha/plugins/SuperClean/lang/nb.js (added)
+++ lenya/branches/revolution/1.3.x/src/webapp/lenya/modules/xinha/plugins/SuperClean/lang/nb.js Fri Sep 21 03:36:30 2007
@@ -0,0 +1,17 @@
+// I18N constants
+// LANG: "nb", ENCODING: UTF-8
+// translated: Kim Steinhaug, http://www.steinhaug.com/, [email protected]
+{
+  "Clean up HTML": "Vask HTML kode",
+  "Please select from the following cleaning options...": "Vennligst velg blandt de forskjellige mulighetene å vaske/ rydde i HTML koden",
+  "General tidy up and correction of some problems.": "Generell opprydding i HTML koden samt korrigering av typiske feil",
+  "Clean bad HTML from Microsoft Word": "Vask HTML kode for feil og problemer etter Microsoft Word",
+  "Remove custom typefaces (font \"styles\").": "Fjerne egendefinerte skrifttyper (font face)",
+  "Remove custom font sizes.": "Fjerne egendefinerte skriftstørrelser (font size)",
+  "Remove custom text colors.": "Fjerne egendefinerte skriftfarger (font color)",
+  "Remove lang attributes.": "Fjerne lang-attributter.",
+  "Go": "Utfør",
+  "Cancel": "Avbryt",
+  "Tidy failed.  Check your HTML for syntax errors.": "Tidy (Programmet som retter HTML koden) feilet. Vennligst se over HTML koden for feil.",
+  "You don't have anything to tidy!": "Det finnes ingen HTML kode å vaske!"
+};
\ No newline at end of file

Added: lenya/branches/revolution/1.3.x/src/webapp/lenya/modules/xinha/plugins/SuperClean/super-clean.js
URL: http://svn.apache.org/viewvc/lenya/branches/revolution/1.3.x/src/webapp/lenya/modules/xinha/plugins/SuperClean/super-clean.js?rev=578051&view=auto
==============================================================================
--- lenya/branches/revolution/1.3.x/src/webapp/lenya/modules/xinha/plugins/SuperClean/super-clean.js (added)
+++ lenya/branches/revolution/1.3.x/src/webapp/lenya/modules/xinha/plugins/SuperClean/super-clean.js Fri Sep 21 03:36:30 2007
@@ -0,0 +1,211 @@
+function SuperClean(_1,_2){
+this.editor=_1;
+var _3=this;
+_1._superclean_on=false;
+_1.config.registerButton("superclean",this._lc("Clean up HTML"),_1.imgURL("ed_superclean.gif","SuperClean"),true,function(e,_5,_6){
+_3._superClean(null,_6);
+});
+_1.config.addToolbarElement("superclean","killword",0);
+}
+SuperClean._pluginInfo={name:"SuperClean",version:"1.0",developer:"James Sleeman, Niko Sams",developer_url:"http://www.gogo.co.nz/",c_owner:"Gogo Internet Services",license:"htmlArea",sponsor:"Gogo Internet Services",sponsor_url:"http://www.gogo.co.nz/"};
+SuperClean.prototype._lc=function(_7){
+return Xinha._lc(_7,"SuperClean");
+};
+SuperClean.prototype._superClean=function(_8,_9){
+var _a=this;
+var _b=function(){
+var _c=_a._dialog.hide();
+var _d=_a.editor;
+if(_c.word_clean){
+_d._wordClean();
+}
+var D=_d.getInnerHTML();
+for(var _f in _d.config.SuperClean.filters){
+if(_f=="tidy"||_f=="word_clean"){
+continue;
+}
+if(_c[_f]){
+D=SuperClean.filterFunctions[_f](D,_d);
+}
+}
+D=D.replace(/(style|class)="\s*"/gi,"");
+D=D.replace(/<(font|span)\s*>/gi,"");
+_d.setHTML(D);
+if(_c.tidy){
+var _10=function(_11){
+eval("var response = "+_11);
+switch(response.action){
+case "setHTML":
+_d.setHTML(response.value);
+break;
+case "alert":
+alert(_a._lc(response.value));
+break;
+}
+};
+Xinha._postback(_d.config.SuperClean.tidy_handler,{"content":_d.getInnerHTML()},_10);
+}
+return true;
+};
+if(this.editor.config.SuperClean.show_dialog){
+var _12={};
+this._dialog.show(_12,_b);
+}else{
+var _13=this.editor;
+var _14=_13.getInnerHTML();
+for(var _15 in _13.config.SuperClean.filters){
+if(_15=="tidy"){
+continue;
+}
+_14=SuperClean.filterFunctions[_15](_14,_13);
+}
+_14=_14.replace(/(style|class)="\s*"/gi,"");
+_14=_14.replace(/<(font|span)\s*>/gi,"");
+_13.setHTML(_14);
+if(_13.config.SuperClean.filters.tidy){
+SuperClean.filterFunctions.tidy(_14,_13);
+}
+}
+};
+Xinha.Config.prototype.SuperClean={"tidy_handler":_editor_url+"plugins/SuperClean/tidy.php","filters":{"tidy":Xinha._lc("General tidy up and correction of some problems.","SuperClean"),"word_clean":Xinha._lc("Clean bad HTML from Microsoft Word","SuperClean"),"remove_faces":Xinha._lc("Remove custom typefaces (font \"styles\").","SuperClean"),"remove_sizes":Xinha._lc("Remove custom font sizes.","SuperClean"),"remove_colors":Xinha._lc("Remove custom text colors.","SuperClean"),"remove_lang":Xinha._lc("Remove lang attributes.","SuperClean"),"remove_fancy_quotes":{label:Xinha._lc("Replace directional quote marks with non-directional quote marks.","SuperClean"),checked:false}},"show_dialog":true};
+SuperClean.filterFunctions={};
+SuperClean.filterFunctions.remove_colors=function(D){
+D=D.replace(/color="?[^" >]*"?/gi,"");
+D=D.replace(/([^-])color:[^;}"']+;?/gi,"$1");
+return (D);
+};
+SuperClean.filterFunctions.remove_sizes=function(D){
+D=D.replace(/size="?[^" >]*"?/gi,"");
+D=D.replace(/font-size:[^;}"']+;?/gi,"");
+return (D);
+};
+SuperClean.filterFunctions.remove_faces=function(D){
+D=D.replace(/face="?[^" >]*"?/gi,"");
+D=D.replace(/font-family:[^;}"']+;?/gi,"");
+return (D);
+};
+SuperClean.filterFunctions.remove_lang=function(D){
+D=D.replace(/lang="?[^" >]*"?/gi,"");
+return (D);
+};
+SuperClean.filterFunctions.word_clean=function(_1a,_1b){
+_1b.setHTML(_1a);
+_1b._wordClean();
+return _1b.getInnerHTML();
+};
+SuperClean.filterFunctions.remove_fancy_quotes=function(D){
+D=D.replace(new RegExp(String.fromCharCode(8216),"g"),"'");
+D=D.replace(new RegExp(String.fromCharCode(8217),"g"),"'");
+D=D.replace(new RegExp(String.fromCharCode(8218),"g"),"'");
+D=D.replace(new RegExp(String.fromCharCode(8219),"g"),"'");
+D=D.replace(new RegExp(String.fromCharCode(8220),"g"),"\"");
+D=D.replace(new RegExp(String.fromCharCode(8221),"g"),"\"");
+D=D.replace(new RegExp(String.fromCharCode(8222),"g"),"\"");
+D=D.replace(new RegExp(String.fromCharCode(8223),"g"),"\"");
+return D;
+};
+SuperClean.filterFunctions.tidy=function(_1d,_1e){
+Xinha._postback(_1e.config.SuperClean.tidy_handler,{"content":_1d},function(_1f){
+eval(_1f);
+});
+};
+SuperClean.prototype.onGenerate=function(){
+if(this.editor.config.SuperClean.show_dialog&&!this._dialog){
+this._dialog=new SuperClean.Dialog(this);
+}
+if(this.editor.config.tidy_handler){
+this.editor.config.SuperClean.tidy_handler=this.editor.config.tidy_handler;
+this.editor.config.tidy_handler=null;
+}
+if(!this.editor.config.SuperClean.tidy_handler&&this.editor.config.filters.tidy){
+this.editor.config.filters.tidy=null;
+}
+var sc=this;
+for(var _21 in this.editor.config.SuperClean.filters){
+if(!SuperClean.filterFunctions[_21]){
+var _22=this.editor.config.SuperClean.filters[_21];
+if(typeof _22.filterFunction!="undefined"){
+SuperClean.filterFunctions[_21]=filterFunction;
+}else{
+Xinha._getback(_editor_url+"plugins/SuperClean/filters/"+_21+".js",function(_23){
+eval("SuperClean.filterFunctions."+_21+"="+_23+";");
+sc.onGenerate();
+});
+}
+return;
+}
+}
+};
+SuperClean.Dialog=function(_24){
+var _25=this;
+this.Dialog_nxtid=0;
+this.SuperClean=_24;
+this.id={};
+this.ready=false;
+this.files=false;
+this.html=false;
+this.dialog=false;
+this._prepareDialog();
+};
+SuperClean.Dialog.prototype._prepareDialog=function(){
+var _26=this;
+var _27=this.SuperClean;
+if(this.html==false){
+Xinha._getback(_editor_url+"plugins/SuperClean/dialog.html",function(txt){
+_26.html=txt;
+_26._prepareDialog();
+});
+return;
+}
+var _29="";
+for(var _2a in this.SuperClean.editor.config.SuperClean.filters){
+_29+="    <div>\n";
+var _2b=this.SuperClean.editor.config.SuperClean.filters[_2a];
+if(typeof _2b.label=="undefined"){
+_29+="        <input type=\"checkbox\" name=\"["+_2a+"]\" id=\"["+_2a+"]\" checked />\n";
+_29+="        <label for=\"["+_2a+"]\">"+this.SuperClean.editor.config.SuperClean.filters[_2a]+"</label>\n";
+}else{
+_29+="        <input type=\"checkbox\" name=\"["+_2a+"]\" id=\"["+_2a+"]\" "+(_2b.checked?"checked":"")+" />\n";
+_29+="        <label for=\"["+_2a+"]\">"+_2b.label+"</label>\n";
+}
+_29+="    </div>\n";
+}
+this.html=this.html.replace("<!--filters-->",_29);
+var _2c=this.html;
+var _2d=this.dialog=new Xinha.Dialog(_27.editor,this.html,"SuperClean");
+this.ready=true;
+};
+SuperClean.Dialog.prototype._lc=SuperClean.prototype._lc;
+SuperClean.Dialog.prototype.show=function(_2e,ok,_30){
+if(!this.ready){
+var _31=this;
+window.setTimeout(function(){
+_31.show(_2e,ok,_30);
+},100);
+return;
+}
+var _32=this.dialog;
+var _31=this;
+if(ok){
+this.dialog.getElementById("ok").onclick=ok;
+}else{
+this.dialog.getElementById("ok").onclick=function(){
+_31.hide();
+};
+}
+if(_30){
+this.dialog.getElementById("cancel").onclick=_30;
+}else{
+this.dialog.getElementById("cancel").onclick=function(){
+_31.hide();
+};
+}
+this.SuperClean.editor.disableToolbar(["fullscreen","SuperClean"]);
+this.dialog.show(_2e);
+this.dialog.onresize();
+};
+SuperClean.Dialog.prototype.hide=function(){
+this.SuperClean.editor.enableToolbar();
+return this.dialog.hide();
+};
+

Added: lenya/branches/revolution/1.3.x/src/webapp/lenya/modules/xinha/plugins/SuperClean/tidy.php
URL: http://svn.apache.org/viewvc/lenya/branches/revolution/1.3.x/src/webapp/lenya/modules/xinha/plugins/SuperClean/tidy.php?rev=578051&view=auto
==============================================================================
--- lenya/branches/revolution/1.3.x/src/webapp/lenya/modules/xinha/plugins/SuperClean/tidy.php (added)
+++ lenya/branches/revolution/1.3.x/src/webapp/lenya/modules/xinha/plugins/SuperClean/tidy.php Fri Sep 21 03:36:30 2007
@@ -0,0 +1,179 @@
+<?php
+  /** This PHP file is intended for use with XMLHTTPRequest from Xinha
+   * it requrns javascript to set the Xinha html with tidied html that is
+   * submitted in a $_POST parameter called 'content'
+   */
+
+  if(get_magic_quotes_gpc())
+  {
+    // trigger_error('Magic Quotes GPC is on, cleaning GPC.', E_USER_NOTICE);
+    $to_clean = array(&$_GET, &$_POST, &$_REQUEST, &$_COOKIE);
+    while(count($to_clean))
+    {
+      $cleaning =& $to_clean[array_pop(array_keys($to_clean))];
+      unset($to_clean[array_pop(array_keys($to_clean))]);
+      foreach(array_keys($cleaning) as $k)
+      {
+        if(is_array($cleaning[$k]))
+        {
+          $to_clean[] =& $cleaning[$k];
+        }
+        else
+        {
+          $cleaning[$k] = stripslashes($cleaning[$k]);
+        }
+      }
+    }
+  }
+
+  header('Content-Type: text/javascript; charset=utf-8');
+
+  /** Function to POST some data to a URL */
+  function PostIt($DataStream, $URL)
+  {
+
+//  Strip http:// from the URL if present
+    $URL = ereg_replace("^http://", "", $URL);
+
+//  Separate into Host and URI
+    $Host = substr($URL, 0, strpos($URL, "/"));
+    $URI = strstr($URL, "/");
+
+//  Form up the request body
+    $ReqBody = "";
+    while (list($key, $val) = each($DataStream)) {
+      if ($ReqBody) $ReqBody.= "&";
+      $ReqBody.= $key."=".urlencode($val);
+    }
+    $ContentLength = strlen($ReqBody);
+
+//  Generate the request header
+    $ReqHeader =
+      "POST $URI HTTP/1.0\n".
+      "Host: $Host\n".
+      "User-Agent: PostIt\n".
+      "Content-Type: application/x-www-form-urlencoded\n".
+      "Content-Length: $ContentLength\n\n".
+      "$ReqBody\n";
+
+//     echo $ReqHeader;
+
+
+//  Open the connection to the host
+    $socket = fsockopen($Host, 80, &$errno, &$errstr);
+    if (!$socket) {
+      $result = "($errno) $errstr";
+      return $Result;
+    }
+
+    fputs($socket, $ReqHeader);
+
+    $result = '';
+    while(!feof($socket))
+    {
+      $result .= fgets($socket);
+    }
+    return $result;
+  }
+
+
+  function 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);
+  }
+
+  // Any errors would screq up our javascript
+  error_reporting(E_NONE);
+  ini_set('display_errors', false);
+
+  if(trim(@$_REQUEST['content']))
+  {
+    // PHP's urldecode doesn't understand %uHHHH for unicode
+    $_REQUEST['content'] = preg_replace('/%u([a-f0-9]{4,4})/ei', 'utf8_chr(0x$1)', $_REQUEST['content']);
+    function utf8_chr($num)
+    {
+      if($num<128)return chr($num);
+      if($num<1024)return chr(($num>>6)+192).chr(($num&63)+128);
+      if($num<32768)return chr(($num>>12)+224).chr((($num>>6)&63)+128).chr(($num&63)+128);
+      if($num<2097152)return chr(($num>>18)+240).chr((($num>>12)&63)+128).chr((($num>>6)&63)+128) .chr(($num&63)+128);
+      return '';
+    }
+    ob_start();
+      passthru("echo " .  escapeshellarg($_REQUEST['content']) . " | tidy -q -i -u -wrap 9999 -utf8 -bare -asxhtml 2>/dev/null", $result);
+      $content = ob_get_contents();
+    ob_end_clean();
+
+    if(strlen($content) < 4)
+    {
+      // Tidy on the local machine failed, try a post
+      $res_1
+        = PostIt(
+          array
+            (
+              '_function' => 'tidy',
+              '_html'   => $_REQUEST['content'],
+              'char-encoding' => 'utf8',
+              '_output'       => 'warn',
+              'indent'        => 'auto',
+              'wrap'          => 9999,
+              'break-before-br' => 'y',
+              'bare'          => 'n',
+              'word-2000'     => 'n',
+              'drop-empty-paras' => 'y',
+              'drop-font-tags' => 'n',
+
+            ),
+          'http://infohound.net/tidy/tidy.pl');
+
+      if(preg_match('/<a href="([^"]+)" title="Save the tidied HTML/', $res_1, $m))
+      {
+        $tgt = strtr($m[1], array_flip(get_html_translation_table(HTML_ENTITIES)));
+        $content = implode('', file('http://infohound.net/tidy/' . $tgt));
+      }
+    }
+
+    if(strlen($content) && ! preg_match('/<\/body>/i', $_REQUEST['content']))
+    {
+      if( preg_match('/<body[^>]*>(.*)<\/body>/is', $content, $matches) )
+      {
+        $content = $matches[1];
+      }
+    }
+    elseif(!strlen($content))
+    {
+      $content = $_REQUEST['content'];
+    }
+
+    if($content)
+    {
+      ?>
+      {action:'setHTML',value:'<?php echo js_encode($content) ?>'};
+      <?php
+    }
+    else
+    {
+      ?>
+      {action:'alert',value:'Tidy failed.  Check your HTML for syntax errors.'};
+      <?php
+    }
+  }
+  else
+  {
+    ?>
+    {action:'alert',value:"You don't have anything to tidy!"}
+    <?php
+  }
+
+?>

Added: lenya/branches/revolution/1.3.x/src/webapp/lenya/modules/xinha/plugins/TableOperations/img/cell-delete.gif
URL: http://svn.apache.org/viewvc/lenya/branches/revolution/1.3.x/src/webapp/lenya/modules/xinha/plugins/TableOperations/img/cell-delete.gif?rev=578051&view=auto
==============================================================================
Binary file - no diff available.

Propchange: lenya/branches/revolution/1.3.x/src/webapp/lenya/modules/xinha/plugins/TableOperations/img/cell-delete.gif
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: lenya/branches/revolution/1.3.x/src/webapp/lenya/modules/xinha/plugins/TableOperations/img/cell-insert-after.gif
URL: http://svn.apache.org/viewvc/lenya/branches/revolution/1.3.x/src/webapp/lenya/modules/xinha/plugins/TableOperations/img/cell-insert-after.gif?rev=578051&view=auto
==============================================================================
Binary file - no diff available.

Propchange: lenya/branches/revolution/1.3.x/src/webapp/lenya/modules/xinha/plugins/TableOperations/img/cell-insert-after.gif
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: lenya/branches/revolution/1.3.x/src/webapp/lenya/modules/xinha/plugins/TableOperations/img/cell-insert-before.gif
URL: http://svn.apache.org/viewvc/lenya/branches/revolution/1.3.x/src/webapp/lenya/modules/xinha/plugins/TableOperations/img/cell-insert-before.gif?rev=578051&view=auto
==============================================================================
Binary file - no diff available.

Propchange: lenya/branches/revolution/1.3.x/src/webapp/lenya/modules/xinha/plugins/TableOperations/img/cell-insert-before.gif
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: lenya/branches/revolution/1.3.x/src/webapp/lenya/modules/xinha/plugins/TableOperations/img/cell-merge.gif
URL: http://svn.apache.org/viewvc/lenya/branches/revolution/1.3.x/src/webapp/lenya/modules/xinha/plugins/TableOperations/img/cell-merge.gif?rev=578051&view=auto
==============================================================================
Binary file - no diff available.

Propchange: lenya/branches/revolution/1.3.x/src/webapp/lenya/modules/xinha/plugins/TableOperations/img/cell-merge.gif
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: lenya/branches/revolution/1.3.x/src/webapp/lenya/modules/xinha/plugins/TableOperations/img/cell-prop.gif
URL: http://svn.apache.org/viewvc/lenya/branches/revolution/1.3.x/src/webapp/lenya/modules/xinha/plugins/TableOperations/img/cell-prop.gif?rev=578051&view=auto
==============================================================================
Binary file - no diff available.

Propchange: lenya/branches/revolution/1.3.x/src/webapp/lenya/modules/xinha/plugins/TableOperations/img/cell-prop.gif
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: lenya/branches/revolution/1.3.x/src/webapp/lenya/modules/xinha/plugins/TableOperations/img/cell-split.gif
URL: http://svn.apache.org/viewvc/lenya/branches/revolution/1.3.x/src/webapp/lenya/modules/xinha/plugins/TableOperations/img/cell-split.gif?rev=578051&view=auto
==============================================================================
Binary file - no diff available.

Propchange: lenya/branches/revolution/1.3.x/src/webapp/lenya/modules/xinha/plugins/TableOperations/img/cell-split.gif
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: lenya/branches/revolution/1.3.x/src/webapp/lenya/modules/xinha/plugins/TableOperations/img/col-delete.gif
URL: http://svn.apache.org/viewvc/lenya/branches/revolution/1.3.x/src/webapp/lenya/modules/xinha/plugins/TableOperations/img/col-delete.gif?rev=578051&view=auto
==============================================================================
Binary file - no diff available.

Propchange: lenya/branches/revolution/1.3.x/src/webapp/lenya/modules/xinha/plugins/TableOperations/img/col-delete.gif
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: lenya/branches/revolution/1.3.x/src/webapp/lenya/modules/xinha/plugins/TableOperations/img/col-insert-after.gif
URL: http://svn.apache.org/viewvc/lenya/branches/revolution/1.3.x/src/webapp/lenya/modules/xinha/plugins/TableOperations/img/col-insert-after.gif?rev=578051&view=auto
==============================================================================
Binary file - no diff available.

Propchange: lenya/branches/revolution/1.3.x/src/webapp/lenya/modules/xinha/plugins/TableOperations/img/col-insert-after.gif
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: lenya/branches/revolution/1.3.x/src/webapp/lenya/modules/xinha/plugins/TableOperations/img/col-insert-before.gif
URL: http://svn.apache.org/viewvc/lenya/branches/revolution/1.3.x/src/webapp/lenya/modules/xinha/plugins/TableOperations/img/col-insert-before.gif?rev=578051&view=auto
==============================================================================
Binary file - no diff available.

Propchange: lenya/branches/revolution/1.3.x/src/webapp/lenya/modules/xinha/plugins/TableOperations/img/col-insert-before.gif
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: lenya/branches/revolution/1.3.x/src/webapp/lenya/modules/xinha/plugins/TableOperations/img/col-split.gif
URL: http://svn.apache.org/viewvc/lenya/branches/revolution/1.3.x/src/webapp/lenya/modules/xinha/plugins/TableOperations/img/col-split.gif?rev=578051&view=auto
==============================================================================
Binary file - no diff available.

Propchange: lenya/branches/revolution/1.3.x/src/webapp/lenya/modules/xinha/plugins/TableOperations/img/col-split.gif
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: lenya/branches/revolution/1.3.x/src/webapp/lenya/modules/xinha/plugins/TableOperations/img/row-delete.gif
URL: http://svn.apache.org/viewvc/lenya/branches/revolution/1.3.x/src/webapp/lenya/modules/xinha/plugins/TableOperations/img/row-delete.gif?rev=578051&view=auto
==============================================================================
Binary file - no diff available.

Propchange: lenya/branches/revolution/1.3.x/src/webapp/lenya/modules/xinha/plugins/TableOperations/img/row-delete.gif
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: lenya/branches/revolution/1.3.x/src/webapp/lenya/modules/xinha/plugins/TableOperations/img/row-insert-above.gif
URL: http://svn.apache.org/viewvc/lenya/branches/revolution/1.3.x/src/webapp/lenya/modules/xinha/plugins/TableOperations/img/row-insert-above.gif?rev=578051&view=auto
==============================================================================
Binary file - no diff available.

Propchange: lenya/branches/revolution/1.3.x/src/webapp/lenya/modules/xinha/plugins/TableOperations/img/row-insert-above.gif
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: lenya/branches/revolution/1.3.x/src/webapp/lenya/modules/xinha/plugins/TableOperations/img/row-insert-under.gif
URL: http://svn.apache.org/viewvc/lenya/branches/revolution/1.3.x/src/webapp/lenya/modules/xinha/plugins/TableOperations/img/row-insert-under.gif?rev=578051&view=auto
==============================================================================
Binary file - no diff available.

Propchange: lenya/branches/revolution/1.3.x/src/webapp/lenya/modules/xinha/plugins/TableOperations/img/row-insert-under.gif
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: lenya/branches/revolution/1.3.x/src/webapp/lenya/modules/xinha/plugins/TableOperations/img/row-prop.gif
URL: http://svn.apache.org/viewvc/lenya/branches/revolution/1.3.x/src/webapp/lenya/modules/xinha/plugins/TableOperations/img/row-prop.gif?rev=578051&view=auto
==============================================================================
Binary file - no diff available.

Propchange: lenya/branches/revolution/1.3.x/src/webapp/lenya/modules/xinha/plugins/TableOperations/img/row-prop.gif
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: lenya/branches/revolution/1.3.x/src/webapp/lenya/modules/xinha/plugins/TableOperations/img/row-split.gif
URL: http://svn.apache.org/viewvc/lenya/branches/revolution/1.3.x/src/webapp/lenya/modules/xinha/plugins/TableOperations/img/row-split.gif?rev=578051&view=auto
==============================================================================
Binary file - no diff available.

Propchange: lenya/branches/revolution/1.3.x/src/webapp/lenya/modules/xinha/plugins/TableOperations/img/row-split.gif
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: lenya/branches/revolution/1.3.x/src/webapp/lenya/modules/xinha/plugins/TableOperations/img/table-prop.gif
URL: http://svn.apache.org/viewvc/lenya/branches/revolution/1.3.x/src/webapp/lenya/modules/xinha/plugins/TableOperations/img/table-prop.gif?rev=578051&view=auto
==============================================================================
Binary file - no diff available.

Propchange: lenya/branches/revolution/1.3.x/src/webapp/lenya/modules/xinha/plugins/TableOperations/img/table-prop.gif
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.