private RE regularExpressionLT;
private RE regularExpressionGT;
private RE regularExpressionWhitespace;
-
+ private RE regularExpressionLeadingSlashes;
+
public MirBasicProducerAssistantLocalizer() throws MirLocalizerFailure {
try {
regularExpressionLT = new RE("<");
regularExpressionGT = new RE(">");
- regularExpressionWhitespace = new RE("\\s+");
+ regularExpressionWhitespace = new RE("\\s+|
|
");
+ regularExpressionLeadingSlashes = new RE("^//+");
}
catch (Throwable t) {
throw new MirLocalizerFailure(t);
}
- private String[] badAttributeValuePrefixes = {
- "javascript", "vbscript", "about", "wysiwyg", "data", "view-source",
- "ms-its", "mhtml", "shell", "lynxexec", "lynxcgi", "hcp", "ms-help",
- "help", "disk", "vnd.ms.radio", "opera", "res", "resource", "chrome",
- "mocha", "livescript"};
-
-
- private String[] badAttributes = {
- "onabort", "onblur", "onchange", "onclick", "ondblclick", "onerror",
- "onfocus", "onkeydown", "onKeypress", "onkeyup", "onload", "onmousedown",
- "onmousemove", "onmouseout", "onmouseover", "onmouseup", "onreset",
- "onselect", "onsubmit", "onunload", "onload", "onclick", "onfocus",
- "onblur", "FSCommand", "onAbort", "onActivate", "onAfterPrint",
- "onAfterUpdate", "onBeforeActivate", "onBeforeCopy", "onBeforeCut",
- "onBeforeDeactivate", "onBeforeEditFocus", "onBeforePaste",
- "onBeforePrint", "onBeforeUnload", "onBegin", "onBlur", "onBounce",
- "onCellChange", "onChange", "onClick", "onContextMenu", "onControlSelect",
- "onCopy", "onCut", "onDataAvailible", "onDataSetChanged", "onDataSetComplete",
- "onDblClick", "onDeactivate", "onDrag", "onDragEnd", "onDragLeave", "onDragEnter",
- "onDragOver", "onDragDrop", "onDrop", "onEnd", "onError", "onErrorUpdate", "onExit",
- "onFilterChange", "onFinish", "onFocus", "onFocusIn", "onFocusOut", "onHelp",
- "onKeyDown", "onKeyPress", "onKeyUp", "onLayoutComplete", "onLoad", "onLoseCapture",
- "onMediaComplete", "onMediaError", "onMouseDown", "onMouseEnter", "onMouseLeave",
- "onMouseMove", "onMouseOut", "onMouseOver", "onMouseUp", "onMouseWheel", "onMove",
- "onMoveEnd", "onMoveStart", "onOutOfSync", "onPaste", "onPause", "onProgress",
- "onPropertyChange", "onReadyStateChange", "onRepeat", "onReset", "onResize",
- "onResizeEnd", "onResizeStart", "onResume", "onReverse", "onRowEnter", "onRowExit",
- "onRowDelete", "onRowInserted", "onScroll", "onSeek", "onSelect", "onSelectionChange",
- "onSelectStart", "onStart", "onStop", "onSynchRestored", "onSubmit", "onTimeError",
- "onTrackChange", "onUnload", "onURLFlip", "seekSegmentTime", "style", "height", "width"};
private boolean isBadAttr(String attrName) {
- for (int i = 0; i < badAttributes.length; i++) {
- if (badAttributes[i].toLowerCase().equals(attrName.toLowerCase())) {
+ List badAttributes = StringRoutines.splitString(MirGlobal.config().getString("Localizer.HTML.BadAttributes"), ";");
+ Iterator i = badAttributes.iterator();
+ while (i.hasNext()) {
+ if (((String) i.next()).toLowerCase().equals(attrName.toLowerCase())) {
return true;
}
}
}
private boolean checkAttrValue(String attrValue) {
- for (int i = 0; i < badAttributeValuePrefixes.length; i++) {
- if ((stripWhitespace(attrValue.toLowerCase())).startsWith(badAttributeValuePrefixes[i].toLowerCase() + ":")) {
+ List badPrefixes = StringRoutines.splitString(MirGlobal.config().getString("Localizer.HTML.BadAttributeValuePrefixes"), ";");
+ Iterator i = badPrefixes.iterator();
+ while (i.hasNext()) {
+ if ((stripWhitespace(attrValue.toLowerCase())).startsWith(((String) i.next()).toLowerCase() + ":")) {
return false;
}
}
private boolean checkNode(String nodeName) {
- List languages = StringRoutines.splitString(MirGlobal.config().getString("Localizer.HTML.Whitelist"), ";");
+ List acceptableNodes = StringRoutines.splitString(MirGlobal.config().getString("Localizer.HTML.Whitelist"), ";");
- Iterator i = languages.iterator();
+ Iterator i = acceptableNodes.iterator();
while (i.hasNext()) {
if (nodeName.equals(i.next())) {
return true;
for (int i = 0; i < attrs.getLength(); i++) {
String attrName = attrs.item(i).getNodeName();
String attrValue = attrs.item(i).getNodeValue();
+ if (attrValue.startsWith("//")){
+ attrValue=regularExpressionLeadingSlashes.substitute(attrValue, "/");
+ }
+
if (checkAttr(attrName) && checkAttrValue(attrValue)) {
out.write(' ');
out.write(attrs.item(i).getNodeName());