| Current Path : /home/wuectly/www/03cbe/ |
| Current File : /home/wuectly/www/03cbe/cleanup.zip |
PK r�#]\��?N N plugin.jsnu &1i� /* jce - 2.9.99.2 | 2026-04-22 | https://www.joomlacontenteditor.net | Source: https://github.com/widgetfactory/jce | Copyright (C) 2006 - 2026 Ryan Demmer. All rights reserved | GNU/GPL Version 2 or later - http://www.gnu.org/licenses/gpl-2.0.html */
import split from "./src/utils/split";
import {
TAGS,
PADDED_RX
} from "./src/constants";
import createPadding from "./src/filters/padding";
import {
processAttributes
} from "./src/filters/processAttributes";
import {
convertFromGeshi,
convertToGeshi
} from "./src/geshi";
var each = tinymce.each, Node = tinymce.html.Node;
tinymce.PluginManager.add("cleanup", function(ed, url) {
!1 === ed.settings.verify_html && (ed.settings.validate = !1);
var padding = createPadding(Node);
ed.onPreInit.add(function() {
var elements;
ed.serializer.addAttributeFilter("data-mce-caret", function(nodes) {
for (var i = nodes.length; i--; ) nodes[i].remove();
}), !1 === ed.settings.remove_trailing_brs && ed.serializer.addAttributeFilter("data-mce-bogus", function(nodes) {
for (var node, textNode, i = nodes.length; i--; ) "br" === (node = nodes[i]).name && (node.prev || node.next ? node.remove() : ((textNode = new Node("#text", 3)).value = "\xa0",
node.replace(textNode)));
}), ed.serializer.addAttributeFilter("data-mce-tmp", function(nodes, name) {
for (var i = nodes.length; i--; ) nodes[i].attr("data-mce-tmp", null);
}), ed.parser.addAttributeFilter("data-mce-tmp", function(nodes, name) {
for (var i = nodes.length; i--; ) nodes[i].attr("data-mce-tmp", null);
}), !1 !== ed.settings.verify_html && (ed.settings.allow_event_attributes || each(ed.schema.elements, function(elm) {
if (!elm.attributesOrder || 0 === elm.attributesOrder.length) return !0;
each(elm.attributes, function(obj, name) {
0 === name.indexOf("on") && (delete elm.attributes[name], elm.attributesOrder.splice(tinymce.inArray(elm, elm.attributesOrder, name), 1));
});
}), elements = ed.schema.elements, each(split("ol ul sub sup blockquote font table tbody tr strong b"), function(name) {
elements[name] && (elements[name].removeEmpty = !1);
}), ed.getParam("pad_empty_tags", !0) || each(elements, function(v, k) {
v.paddEmpty && (v.paddEmpty = !1);
}), ed.getParam("table_pad_empty_cells", !0) || (elements.th.paddEmpty = !1,
elements.td.paddEmpty = !1), each(elements, function(v, k) {
if (0 === k.indexOf("mce:")) return !0;
-1 === tinymce.inArray(TAGS, k) && ed.schema.addCustomElements(k);
})), ed.parser.addNodeFilter("a,i,span,li", function(nodes, name) {
padding.ensureEmptyInlineNodes(nodes, name);
}), ed.serializer.addAttributeFilter("data-mce-empty", function(nodes) {
padding.cleanupEmptyInlineNodes(nodes);
});
}), !1 === ed.settings.verify_html && ed.addCommand("mceCleanup", function() {
var s = ed.settings, se = ed.selection, bm = se.getBookmark(), content = ed.getContent({
cleanup: !0
}), s = (s.verify_html = !0, new tinymce.html.Schema(s)), content = new tinymce.html.Serializer({
validate: !0
}, s).serialize(new tinymce.html.DomParser({
validate: !0,
allow_event_attributes: !!ed.settings.allow_event_attributes
}, s).parse(content));
ed.setContent(content, {
cleanup: !0
}), se.moveToBookmark(bm);
}), ed.onBeforeSetContent.add(function(ed, o) {
o.content = o.content.replace(/^<br>/, ""), o.content = convertFromGeshi(o.content),
o.content = padding.paddEmptyTags(o.content), o.content = processAttributes(ed, o.content);
}), ed.onPostProcess.add(function(ed, o) {
o.set && (o.content = convertFromGeshi(o.content)), o.get && (o.content = convertToGeshi(o.content),
o.content = o.content.replace(/<a([^>]*)class="jce(box|popup|lightbox|tooltip|_tooltip)"([^>]*)><\/a>/gi, ""),
o.content = o.content.replace(/<span class="jce(box|popup|lightbox|tooltip|_tooltip)">(.*?)<\/span>/gi, "$2"),
o.content = o.content.replace(/_mce_(src|href|style|coords|shape)="([^"]+)"\s*?/gi, ""),
!1 === ed.settings.validate && (o.content = o.content.replace(/<body([^>]*)>([\s\S]*)<\/body>/, "$2"),
ed.getParam("remove_tag_padding") || (o.content = o.content.replace(/<(p|h1|h2|h3|h4|h5|h6|th|td|pre|div|address|caption)\b([^>]*)><\/\1>/gi, "<$1$2> </$1>"))),
ed.getParam("table_pad_empty_cells", !0) || (o.content = o.content.replace(/<(th|td)([^>]*)>( |\u00a0)<\/\1>/gi, "<$1$2></$1>")),
o.content = o.content.replace(/<(a|i|span)([^>]+)>( |\u00a0)<\/\1>/gi, function(match, tag, attribs) {
return attribs = attribs.replace('data-mce-empty="1"', ""), "<" + tag + " " + tinymce.trim(attribs) + "></" + tag + ">";
}), o.content = o.content.replace(/<li data-mce-empty="1">( |\u00a0)<\/li>/gi, "<li></li>"),
ed.getParam("remove_div_padding") && (o.content = o.content.replace(/<div([^>]*)>( |\u00a0)<\/div>/g, "<div$1></div>")),
!1 === ed.getParam("pad_empty_tags", !0) && (o.content = o.content.replace(PADDED_RX, "<$1$2></$1>")),
ed.getParam("keep_nbsp", !0) && "raw" === ed.settings.entity_encoding && (o.content = o.content.replace(/\u00a0/g, " ")),
o.content = o.content.replace(/(uk|v|ng|data)-([\w-]+)=""(\s|>)/gi, "$1-$2$3"),
ed.settings.padd_empty_editor && (o.content = o.content.replace(/^(<div>( | |\s|\u00a0|)<\/div>[\r\n]*|<br(\s*\/)?>[\r\n]*)$/, "")),
o.content = o.content.replace(/<hr(.*)class="system-pagebreak"(.*?)\/?>/gi, '<hr$1class="system-pagebreak"$2/>'),
o.content = o.content.replace(/<hr id="system-readmore"(.*?)>/gi, '<hr id="system-readmore" />'));
}), ed.onSaveContent.add(function(ed, o) {
var entities;
ed.getParam("cleanup_pluginmode") && (entities = {
"'": "'",
"&": "&",
""": '"',
"'": "'"
}, o.content = o.content.replace(/&(#39|apos|amp|quot);/gi, function(a) {
return entities[a];
}));
}), ed.addButton("cleanup", {
title: "advanced.cleanup_desc",
cmd: "mceCleanup"
}), this.paddEmptyTags = padding.paddEmptyTags;
});PK }�#]�#o, ,
index.htmlnu &1i� <html><body bgcolor="#FFFFFF"></body></html>PK }�#]���h h cleanup.xmlnu &1i� <?xml version="1.0" ?>
<extension version="3.4" type="plugin" group="jce" method="upgrade">
<name>WF_CLEANUP_TITLE</name>
<version>2.9.99.2</version>
<creationDate>22-04-2026</creationDate>
<author>Moxiecode / Ryan Demmer</author>
<authorEmail>info@joomlacontenteditor.net</authorEmail>
<authorUrl>https://www.joomlacontenteditor.net/</authorUrl>
<copyright>Ryan Demmer</copyright>
<license>GNU/GPL Version 2 or later - http://www.gnu.org/licenses/gpl-2.0.html</license>
<description>WF_CLEANUP_DESC</description>
<icon>cleanup</icon>
<files></files>
<languages></languages>
<help></help>
</extension>
PK }�#]��R� �
config.phpnu &1i� <?php
/**
* @package JCE
* @subpackage Editor
*
* @copyright Copyright (c) 2009-2024 Ryan Demmer. All rights reserved
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
\defined('_JEXEC') or die;
class WFCleanupPluginConfig
{
private static $invalid_elements = array('iframe', 'object', 'param', 'embed', 'audio', 'video', 'source', 'script', 'style', 'applet', 'body', 'bgsound', 'base', 'basefont', 'frame', 'frameset', 'head', 'html', 'id', 'ilayer', 'layer', 'link', 'meta', 'name', 'title', 'xml');
public static function getConfig(&$settings)
{
$wf = WFApplication::getInstance();
// Encoding
$settings['entity_encoding'] = $wf->getParam('editor.entity_encoding');
// keep
$nbsp = (bool) $wf->getParam('editor.keep_nbsp', 1);
$settings['keep_nbsp'] = $nbsp;
// use named encoding with limited entities set if raw/utf-8 and keep_nbsp === true
if ($settings['entity_encoding'] === 'raw' && $nbsp) {
$settings['entity_encoding'] = 'named';
$settings['entities'] = '160,nbsp,173,shy';
}
// set "plugin mode"
$settings['cleanup_pluginmode'] = $wf->getParam('editor.cleanup_pluginmode', 0, 0);
// get verify html (default is true)
$settings['verify_html'] = $wf->getParam('editor.verify_html', 1, 1, 'boolean', false);
// get sanitize html (default is true)
$settings['sanitize_html'] = $wf->getParam('editor.sanitize_html', 1, 1, 'boolean', false);
$settings['pad_empty_tags'] = $wf->getParam('editor.pad_empty_tags', 1, 1, 'boolean');
// set schema
$settings['schema'] = $wf->getParam('editor.schema', 'mixed', 'mixed');
if ($settings['schema'] === 'html5') {
$settings['schema'] = 'html5-strict';
}
$settings['validate_styles'] = $wf->getParam('editor.validate_styles', 1, 1, 'boolean', false);
// Get Extended elements
$settings['extended_valid_elements'] = self::processValue($wf->getParam('editor.extended_elements', ''));
// Configuration list of invalid elements as array
$settings['invalid_elements'] = self::processValue($wf->getParam('editor.invalid_elements', ''));
// Add elements to invalid list (removed by plugin)
$settings['invalid_elements'] = self::normalizeList(
array_merge($settings['invalid_elements'], self::$invalid_elements)
);
// process extended_valid_elements
if ($settings['extended_valid_elements']) {
$extended_elements = $settings['extended_valid_elements'];
$elements = array();
// add wildcard attributes if none specified
for ($i = 0; $i < count($extended_elements); ++$i) {
$value = $extended_elements[$i];
// clean up value
$value = preg_replace('#[^a-zA-Z0-9_\-\[\]\*@\|\/!=\:\?+\#]#', '', $value);
$pos = strpos($value, '[');
if ($pos === false) {
$elements[] = $value;
$value .= '[*]';
} else {
$elements[] = substr($value, 0, $pos);
}
$extended_elements[$i] = $value;
}
// restore settings to array
$settings['extended_valid_elements'] = $extended_elements;
if (!empty($elements)) {
$settings['invalid_elements'] = array_diff($settings['invalid_elements'], $elements);
}
}
// Final cleanup + reindex
$settings['invalid_elements'] = self::normalizeList($settings['invalid_elements']);
$settings['invalid_attributes'] = self::processValue($wf->getParam('editor.invalid_attributes', 'dynsrc,lowsrc'));
$settings['invalid_attribute_values'] = self::processValue($wf->getParam('editor.invalid_attribute_values'));
$allow_script = $wf->getParam('editor.allow_javascript', 0, 0, 'boolean');
// if scripts are allowed, then allow event attributes
if ($allow_script || (bool) $wf->getParam('editor.allow_event_attributes')) {
$settings['allow_event_attributes'] = true;
}
}
private static function normalizeList($values)
{
$values = array_map('trim', (array) $values);
$values = array_filter($values, 'strlen'); // removes '' and whitespace-only
$values = array_values(array_unique($values)); // reindex + unique
// optional, but helps stable comparisons:
// sort($values, SORT_STRING);
return $values;
}
/**
* Normalise a value or set of values into a flat array.
*
* Accepts a string, an array, or a mixed array containing delimited strings,
* and converts the input into a single, flattened array of trimmed values.
*
* Examples:
* - "one,two" -> ["one", "two"]
* - ["one", "two"] -> ["one", "two"]
* - ["one", "two,three"] -> ["one", "two", "three"]
*
* Empty values are removed and all values are trimmed.
*
* @param string|array $values A delimited string, an array of values,
* or an array containing delimited strings.
* @param string $seperator The value separator to split on.
*
* @return array A flat array of normalised values.
*/
public static function processValue($values, $seperator = ',')
{
if (is_array($values)) {
$values = array_filter($values, 'trim');
foreach ($values as $key => $value) {
$value = trim($value);
if (is_string($value) && strpos($value, $seperator) !== false) {
$values = array_merge($values, explode($seperator, $value));
unset($values[$key]);
}
}
} elseif (is_string($values)) {
$values = explode($seperator, $values);
} else {
$values = [];
}
$values = array_values(
array_filter(
array_map('trim', $values),
'strlen'
)
);
return $values;
}
}
PK r�#]\��?N N plugin.jsnu &1i� PK }�#]�#o, ,
� index.htmlnu &1i� PK }�#]���h h � cleanup.xmlnu &1i� PK }�#]��R� �
� config.phpnu &1i� PK ( �5