mirror of
https://github.com/Alfresco/alfresco-community-repo.git
synced 2025-08-07 17:49:17 +00:00
Merged V2.2 to HEAD
10982: Merged V2.1 to V2.2 10273: Fix for ETWOONE-317: Error from regenerate renditions wizard when templates are updated 10985: Merged V2.1 to V2.2 10717: Fix for ETWOONE-14: System Error message appears while clicking 'Manage Task' icon in ... 10742: Fix for ETWOONE-119: A user created with space characters at the begin and at the end can't login 10758: Fix for ETWOONE-183: URL addressability of forum spaces and topics 10760: Fix for ETWOONE-339: URL Addressability to discussions causes display issue 10761: Fix for ETWOONE-196: Attempt to post to the same forum by two or more users simultaneously leads to error appearance and impossibility to post for some of them 10772: Fix for ETWOONE-225: Validation.js does not properly handle trailing whitespace 10986: Added Hibernate src to Eclipse project 11004: Remove annoying exceptions on shutdown 11005: Minor javadoc fix 11012: Fixed ETWOTWO-423: Optionally inject the Open Office document converter instance to the transformer git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@11202 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
@@ -304,6 +304,7 @@ edit_doc_online=Edit online
|
||||
upload_new_version=Upload new version
|
||||
checkin_this_file=Check in this file
|
||||
cannot_delete_node_has_working_copy=Cannot delete file \"{0}\" as it has an associated working copy.
|
||||
unknown=Unknown
|
||||
|
||||
# Properties
|
||||
username=User Name
|
||||
|
@@ -35,6 +35,7 @@ import java.util.Date;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.UUID;
|
||||
|
||||
import javax.faces.component.UIComponent;
|
||||
import javax.faces.context.FacesContext;
|
||||
@@ -280,6 +281,9 @@ public class ForumsBean implements IContextListener
|
||||
this.viewsConfig.getDefaultSortColumn(PAGE_NAME_FORUMS));
|
||||
this.forumsRichList.setInitialSortDescending(
|
||||
this.viewsConfig.hasDescendingSort(PAGE_NAME_FORUMS));
|
||||
|
||||
// ETWOONE-183 & ETWOONE-339. For URL addressability of forums spaces
|
||||
this.forumsRichList.setRefreshOnBind(true);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -337,6 +341,9 @@ public class ForumsBean implements IContextListener
|
||||
this.viewsConfig.getDefaultSortColumn(PAGE_NAME_TOPIC));
|
||||
this.topicRichList.setInitialSortDescending(
|
||||
this.viewsConfig.hasDescendingSort(PAGE_NAME_TOPIC));
|
||||
|
||||
// ETWOONE-183. For URL addressability of topics:
|
||||
this.topicRichList.setRefreshOnBind(true);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -394,6 +401,9 @@ public class ForumsBean implements IContextListener
|
||||
this.viewsConfig.getDefaultSortColumn(PAGE_NAME_FORUM));
|
||||
this.forumRichList.setInitialSortDescending(
|
||||
this.viewsConfig.hasDescendingSort(PAGE_NAME_FORUM));
|
||||
|
||||
// ETWOONE-183 & ETWOONE-339. For URL addressability of forum spaces
|
||||
this.forumRichList.setRefreshOnBind(true);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -928,6 +938,10 @@ public class ForumsBean implements IContextListener
|
||||
SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy-HH-mm-ss");
|
||||
name.append(dateFormat.format(new Date()));
|
||||
|
||||
// add Universal Unique Identifier
|
||||
// fix bugs ETWOONE-196 and ETWOONE-203
|
||||
name.append("-" + UUID.randomUUID());
|
||||
|
||||
// add the HTML file extension
|
||||
name.append(".html");
|
||||
|
||||
|
@@ -39,9 +39,13 @@ import org.alfresco.service.cmr.model.FileInfo;
|
||||
import org.alfresco.service.cmr.repository.ChildAssociationRef;
|
||||
import org.alfresco.service.cmr.repository.ContentWriter;
|
||||
import org.alfresco.service.cmr.repository.NodeRef;
|
||||
import org.alfresco.service.cmr.repository.StoreRef;
|
||||
import org.alfresco.service.cmr.search.ResultSet;
|
||||
import org.alfresco.service.cmr.search.SearchService;
|
||||
import org.alfresco.service.cmr.workflow.WorkflowDefinition;
|
||||
import org.alfresco.service.namespace.QName;
|
||||
import org.alfresco.service.namespace.RegexQNamePattern;
|
||||
import org.alfresco.web.bean.repository.Repository;
|
||||
import org.alfresco.web.forms.Form;
|
||||
import org.alfresco.web.forms.RenderingEngineTemplate;
|
||||
import org.alfresco.web.forms.xforms.SchemaUtil;
|
||||
@@ -53,6 +57,11 @@ import org.apache.commons.logging.LogFactory;
|
||||
* Backing bean for the Edit Form wizard.
|
||||
*
|
||||
* @author Ariel Backenroth
|
||||
* @author Arseny Kovalchuk (Bug Fixer)
|
||||
*
|
||||
* Methods removeRenderingEngineTemplateFromWebProjects, addRenderingEngineTemplateToWebProjects, searchRenderingEngineTemplateInWebProject
|
||||
* are added to fix an issue reported in https://issues.alfresco.com/jira/browse/ETWOONE-317
|
||||
*
|
||||
*/
|
||||
public class EditFormWizard
|
||||
extends CreateFormWizard
|
||||
@@ -91,8 +100,10 @@ public class EditFormWizard
|
||||
this.getNodeService().getProperty(formNodeRef, WCMAppModel.PROP_XML_SCHEMA);
|
||||
if (schemaNodeRef == null)
|
||||
{
|
||||
LOGGER.debug(WCMAppModel.PROP_XML_SCHEMA + " not set on " + formNodeRef +
|
||||
", checking " + WCMAppModel.PROP_XML_SCHEMA_OLD);
|
||||
if (LOGGER.isDebugEnabled())
|
||||
LOGGER.debug(WCMAppModel.PROP_XML_SCHEMA + " not set on " + formNodeRef +
|
||||
", checking " + WCMAppModel.PROP_XML_SCHEMA_OLD);
|
||||
|
||||
schemaNodeRef = (NodeRef)
|
||||
getNodeService().getProperty(formNodeRef, WCMAppModel.PROP_XML_SCHEMA_OLD);
|
||||
if (schemaNodeRef != null)
|
||||
@@ -175,8 +186,10 @@ public class EditFormWizard
|
||||
|
||||
if (wd != null && workflowRefs.size() == 0)
|
||||
{
|
||||
LOGGER.debug("adding workflow definition " + wd.getName() +
|
||||
" to form " + this.getFormName());
|
||||
if (LOGGER.isDebugEnabled())
|
||||
LOGGER.debug("adding workflow definition " + wd.getName() +
|
||||
" to form " + this.getFormName());
|
||||
|
||||
final Map<QName, Serializable> props = new HashMap<QName, Serializable>(1, 1.0f);
|
||||
props.put(WCMAppModel.PROP_WORKFLOW_NAME, wd.getName());
|
||||
this.getNodeService().createNode(formNodeRef,
|
||||
@@ -187,15 +200,19 @@ public class EditFormWizard
|
||||
}
|
||||
else if (wd != null && workflowRefs.size() == 1)
|
||||
{
|
||||
LOGGER.debug("setting workflow definition " + wd.getName() +
|
||||
" to form " + this.getFormName());
|
||||
if (LOGGER.isDebugEnabled())
|
||||
LOGGER.debug("setting workflow definition " + wd.getName() +
|
||||
" to form " + this.getFormName());
|
||||
|
||||
this.getNodeService().setProperty(workflowRefs.get(0).getChildRef(),
|
||||
WCMAppModel.PROP_WORKFLOW_NAME,
|
||||
wd.getName());
|
||||
}
|
||||
else if (wd == null && workflowRefs.size() == 1)
|
||||
{
|
||||
LOGGER.debug("removing workflow definitions from form " + this.getFormName());
|
||||
if (LOGGER.isDebugEnabled())
|
||||
LOGGER.debug("removing workflow definitions from form " + this.getFormName());
|
||||
|
||||
this.getNodeService().removeChild(formNodeRef, workflowRefs.get(0).getChildRef());
|
||||
}
|
||||
|
||||
@@ -222,24 +239,148 @@ public class EditFormWizard
|
||||
{
|
||||
for (final RenderingEngineTemplateData retd : this.removedRenderingEngineTemplates)
|
||||
{
|
||||
LOGGER.debug("removing rendering engine template " + retd);
|
||||
if (LOGGER.isDebugEnabled())
|
||||
LOGGER.debug("removing rendering engine template " + retd);
|
||||
|
||||
assert retd != null;
|
||||
assert retd.getNodeRef() != null;
|
||||
this.getNodeService().removeChild(formNodeRef, retd.getNodeRef());
|
||||
this.removeRenderingEngineTemplateFromWebProjects(formNodeRef, retd);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
for (final RenderingEngineTemplateData retd : this.renderingEngineTemplates)
|
||||
{
|
||||
if (retd.getFile() != null)
|
||||
{
|
||||
this.saveRenderingEngineTemplate(retd, formNodeRef);
|
||||
this.addRenderingEngineTemplateToWebProjects(formNodeRef, retd);
|
||||
}
|
||||
}
|
||||
return outcome;
|
||||
}
|
||||
|
||||
/**
|
||||
* Removes an associated Rendering Engine Template from all web forms in all web projects.
|
||||
*
|
||||
* @param formNodeRef Form nodeRef
|
||||
* @param retd Rendering engine template to remove from web projects
|
||||
*/
|
||||
private void removeRenderingEngineTemplateFromWebProjects(NodeRef formNodeRef, RenderingEngineTemplateData retd)
|
||||
{
|
||||
List<WebProject> webProjects = getFormsService().getAssociatedWebProjects(getFormsService().getForm(formNodeRef));
|
||||
for (WebProject wp: webProjects)
|
||||
{
|
||||
ResultSet results = searchRenderingEngineTemplateInWebProject(wp, retd.getName());
|
||||
for (int i=0; i<results.length(); i++)
|
||||
{
|
||||
NodeRef webformTemplateNodeRef = results.getNodeRef(i);
|
||||
NodeRef webformNodeRef = getNodeService().getPrimaryParent(webformTemplateNodeRef).getParentRef();
|
||||
getNodeService().removeChild(webformNodeRef, webformTemplateNodeRef);
|
||||
if (LOGGER.isDebugEnabled())
|
||||
LOGGER.debug(webformNodeRef);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds or updates an associated Rendering Engine Template from all web forms in all web projects.
|
||||
*
|
||||
* @param formNodeRef
|
||||
* @param retd Rendering engine template to remove from web projects
|
||||
*/
|
||||
|
||||
private void addRenderingEngineTemplateToWebProjects(NodeRef formNodeRef, RenderingEngineTemplateData retd)
|
||||
{
|
||||
Form form = getFormsService().getForm(formNodeRef);
|
||||
List<WebProject> webProjects = getFormsService().getAssociatedWebProjects(form);
|
||||
Map<QName, Serializable> props = new HashMap<QName, Serializable>(4, 1.0f);
|
||||
for (WebProject wp: webProjects)
|
||||
{
|
||||
ResultSet results = searchRenderingEngineTemplateInWebProject(wp, retd.getName());
|
||||
int resultsCount = results.length();
|
||||
if (resultsCount>0)
|
||||
{
|
||||
//update
|
||||
for (int i=0; i<resultsCount; i++)
|
||||
{
|
||||
NodeRef webformTemplateNodeRef = results.getNodeRef(i);
|
||||
if (retd.getOutputPathPatternForRendition() != null)
|
||||
{
|
||||
props.clear();
|
||||
props.put(WCMAppModel.PROP_OUTPUT_PATH_PATTERN, retd.getOutputPathPatternForRendition());
|
||||
getNodeService().addAspect(webformTemplateNodeRef, WCMAppModel.ASPECT_OUTPUT_PATH_PATTERN, props);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
//just add
|
||||
String query = "+TYPE:\"" + WCMAppModel.TYPE_WEBFORM + "\"" +
|
||||
" +@" + Repository.escapeQName(WCMAppModel.PROP_FORMNAME) + ":\"" + form.getName() + "\"";
|
||||
|
||||
if (LOGGER.isDebugEnabled())
|
||||
LOGGER.debug("Search web forms query: " + query);
|
||||
|
||||
ResultSet webforms = getSearchService().query(wp.getNodeRef().getStoreRef(), SearchService.LANGUAGE_LUCENE, query);
|
||||
|
||||
props.clear();
|
||||
props.put(WCMAppModel.PROP_BASE_RENDERING_ENGINE_TEMPLATE_NAME,
|
||||
retd.getName());
|
||||
for (int i=0; i<webforms.length(); i++)
|
||||
{
|
||||
if (LOGGER.isDebugEnabled())
|
||||
LOGGER.debug("WebForm NodeRef: " + webforms.getNodeRef(i));
|
||||
|
||||
NodeRef templateRef = getNodeService().createNode(webforms.getNodeRef(i),
|
||||
WCMAppModel.ASSOC_WEBFORMTEMPLATE,
|
||||
WCMAppModel.ASSOC_WEBFORMTEMPLATE,
|
||||
WCMAppModel.TYPE_WEBFORMTEMPLATE,
|
||||
props).getChildRef();
|
||||
|
||||
if (retd.getOutputPathPatternForRendition() != null)
|
||||
{
|
||||
props.clear();
|
||||
props.put(WCMAppModel.PROP_OUTPUT_PATH_PATTERN, retd.getOutputPathPatternForRendition());
|
||||
getNodeService().addAspect(templateRef, WCMAppModel.ASPECT_OUTPUT_PATH_PATTERN, props);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Searches an specific Web Form Template with appropriate name in the Web Project.
|
||||
*
|
||||
* @param wp The WebProject to search
|
||||
* @param name The name of Rendering Engine Template to search
|
||||
* @return Search result
|
||||
*/
|
||||
private ResultSet searchRenderingEngineTemplateInWebProject(WebProject wp, String name)
|
||||
{
|
||||
ResultSet result = null;
|
||||
StringBuilder query = new StringBuilder(256);
|
||||
query.append("+TYPE:\"").append(WCMAppModel.TYPE_WEBFORMTEMPLATE).append("\" ");
|
||||
query.append("+@").append(Repository.escapeQName(WCMAppModel.PROP_BASE_RENDERING_ENGINE_TEMPLATE_NAME)).append(":\"").append(name).append("\" ");
|
||||
|
||||
// Search not found anything in this StoreRef!
|
||||
// It looks like a wrong search in RegenerateRenditionsWizard.
|
||||
//
|
||||
//StoreRef storeRef = AVMNodeConverter.ToStoreRef(wp.getStagingStore());
|
||||
|
||||
StoreRef storeRef = wp.getNodeRef().getStoreRef();
|
||||
result = getSearchService().query(storeRef, SearchService.LANGUAGE_LUCENE, query.toString());
|
||||
if (LOGGER.isDebugEnabled())
|
||||
{
|
||||
LOGGER.debug(">>>Web Project: " + wp);
|
||||
LOGGER.debug(">>>StoreRef: " + storeRef);
|
||||
LOGGER.debug(">>>Search query: " + query.toString());
|
||||
LOGGER.debug(">>>Search results: " + result.length());
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Action handler called when the Remove button is pressed to remove a
|
||||
* rendering engine
|
||||
*/
|
||||
|
@@ -161,7 +161,10 @@ public class WebProject implements Serializable
|
||||
nodeService.getProperty(car.getChildRef(), WCMAppModel.PROP_OUTPUT_PATH_PATTERN);
|
||||
final RenderingEngineTemplateImpl ret = (RenderingEngineTemplateImpl)
|
||||
allRets.get(renderingEngineTemplateName);
|
||||
result.put(ret.getName(),
|
||||
if (ret != null)
|
||||
{
|
||||
|
||||
result.put(ret.getName(),
|
||||
new RenderingEngineTemplateImpl(ret.getNodeRef(),
|
||||
ret.getRenditionPropertiesNodeRef(),
|
||||
this.getFormsService())
|
||||
@@ -174,6 +177,7 @@ public class WebProject implements Serializable
|
||||
return outputPathPattern;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
return result;
|
||||
|
@@ -814,6 +814,11 @@ public class NewUserWizard extends AbstractWizardBean
|
||||
*/
|
||||
public void setUserName(String userName)
|
||||
{
|
||||
if (userName != null)
|
||||
{
|
||||
userName = userName.trim();
|
||||
}
|
||||
|
||||
this.userName = userName;
|
||||
}
|
||||
|
||||
|
@@ -196,8 +196,24 @@ import org.xml.sax.SAXException;
|
||||
// regenerate existing renditions
|
||||
boolean renditionLockedBefore = false;
|
||||
String path = null;
|
||||
|
||||
for (final Rendition r : this.getRenditions())
|
||||
{
|
||||
// Try to skip renditions without rendering engine template.
|
||||
if (r instanceof RenditionImpl)
|
||||
{
|
||||
RenditionImpl rImpl = (RenditionImpl)r;
|
||||
RenderingEngineTemplate ret = rImpl.getRenderingEngineTemplate();
|
||||
if ((ret != null) && (ret instanceof RenderingEngineTemplateImpl))
|
||||
{
|
||||
RenderingEngineTemplateImpl retImpl = (RenderingEngineTemplateImpl) ret;
|
||||
if (!retImpl.isExists())
|
||||
{
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
final RenderingEngineTemplate ret = r.getRenderingEngineTemplate();
|
||||
if (ret == null || !allRets.contains(ret))
|
||||
{
|
||||
@@ -237,7 +253,7 @@ import org.xml.sax.SAXException;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// render all renditions for newly added templates
|
||||
for (final RenderingEngineTemplate ret : allRets)
|
||||
{
|
||||
|
@@ -599,6 +599,12 @@ public class RenderingEngineTemplateImpl
|
||||
{
|
||||
return this.getClass().getName() + "{name : " + this.getName() + "}";
|
||||
}
|
||||
|
||||
public boolean isExists()
|
||||
{
|
||||
final NodeService nodeService = this.getServiceRegistry().getNodeService();
|
||||
return nodeService.exists(this.nodeRef);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
@@ -32,6 +32,7 @@ import javax.faces.context.FacesContext;
|
||||
import javax.faces.context.ResponseWriter;
|
||||
import javax.faces.el.ValueBinding;
|
||||
|
||||
import org.alfresco.service.cmr.repository.NodeService;
|
||||
import org.alfresco.service.cmr.workflow.WorkflowInstance;
|
||||
import org.alfresco.web.app.Application;
|
||||
import org.alfresco.web.bean.repository.Repository;
|
||||
@@ -120,10 +121,20 @@ public class UIWorkflowSummary extends SelfRenderingComponent
|
||||
out.write("</td></tr><tr><td>");
|
||||
out.write(bundle.getString("initiated_by"));
|
||||
out.write(":</td><td>");
|
||||
NodeService nodeService = getNodeService(context);
|
||||
if (wi.initiator != null)
|
||||
{
|
||||
out.write(Utils.encode(User.getFullName(Repository.getServiceRegistry(
|
||||
context).getNodeService(), wi.initiator)));
|
||||
if (nodeService.exists(wi.initiator))
|
||||
{
|
||||
out.write(Utils.encode(User.getFullName(Repository.getServiceRegistry(
|
||||
context).getNodeService(), wi.initiator)));
|
||||
}
|
||||
else
|
||||
{
|
||||
out.write("<");
|
||||
out.write(bundle.getString("unknown"));
|
||||
out.write(">");
|
||||
}
|
||||
}
|
||||
out.write("</td></tr><tr><td>");
|
||||
out.write(bundle.getString("started_on"));
|
||||
@@ -189,4 +200,9 @@ public class UIWorkflowSummary extends SelfRenderingComponent
|
||||
{
|
||||
this.value = value;
|
||||
}
|
||||
|
||||
private NodeService getNodeService(FacesContext fc)
|
||||
{
|
||||
return Repository.getServiceRegistry(fc).getNodeService();
|
||||
}
|
||||
}
|
||||
|
@@ -98,7 +98,7 @@ function validateRegex(control, expression, requiresMatch, matchMessage, noMatch
|
||||
{
|
||||
var result = true;
|
||||
|
||||
var pattern = new RegExp(unescape(expression));
|
||||
var pattern = new RegExp(decode(expression));
|
||||
var matches = pattern.test(control.value);
|
||||
|
||||
if (matches != requiresMatch)
|
||||
@@ -135,4 +135,104 @@ function validateName(control, message, showMessage)
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Decodes the given string
|
||||
*
|
||||
* @param str The string to decode
|
||||
* @return The decoded string
|
||||
*/
|
||||
function decode(str)
|
||||
{
|
||||
var s0, i, j, s, ss, u, n, f;
|
||||
|
||||
s0 = ""; // decoded str
|
||||
|
||||
for (i = 0; i < str.length; i++)
|
||||
{
|
||||
// scan the source str
|
||||
s = str.charAt(i);
|
||||
|
||||
if (s == "+")
|
||||
{
|
||||
// "+" should be changed to SP
|
||||
s0 += " ";
|
||||
}
|
||||
else
|
||||
{
|
||||
if (s != "%")
|
||||
{
|
||||
// add an unescaped char
|
||||
s0 += s;
|
||||
}
|
||||
else
|
||||
{
|
||||
// escape sequence decoding
|
||||
u = 0; // unicode of the character
|
||||
|
||||
f = 1; // escape flag, zero means end of this sequence
|
||||
|
||||
while (true)
|
||||
{
|
||||
ss = ""; // local str to parse as int
|
||||
for (j = 0; j < 2; j++ )
|
||||
{
|
||||
// get two maximum hex characters for parse
|
||||
sss = str.charAt(++i);
|
||||
|
||||
if (((sss >= "0") && (sss <= "9")) || ((sss >= "a") && (sss <= "f")) || ((sss >= "A") && (sss <= "F")))
|
||||
{
|
||||
ss += sss; // if hex, add the hex character
|
||||
}
|
||||
else
|
||||
{
|
||||
// not a hex char., exit the loop
|
||||
--i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// parse the hex str as byte
|
||||
n = parseInt(ss, 16);
|
||||
|
||||
// single byte format
|
||||
if (n <= 0x7f) { u = n; f = 1; }
|
||||
|
||||
// double byte format
|
||||
if ((n >= 0xc0) && (n <= 0xdf)) { u = n & 0x1f; f = 2; }
|
||||
|
||||
// triple byte format
|
||||
if ((n >= 0xe0) && (n <= 0xef)) { u = n & 0x0f; f = 3; }
|
||||
|
||||
// quaternary byte format (extended)
|
||||
if ((n >= 0xf0) && (n <= 0xf7)) { u = n & 0x07; f = 4; }
|
||||
|
||||
// not a first, shift and add 6 lower bits
|
||||
if ((n >= 0x80) && (n <= 0xbf)) { u = (u << 6) + (n & 0x3f); --f; }
|
||||
|
||||
// end of the utf byte sequence
|
||||
if (f <= 1) { break; }
|
||||
|
||||
if (str.charAt(i + 1) == "%")
|
||||
{
|
||||
// test for the next shift byte
|
||||
i++ ;
|
||||
}
|
||||
else
|
||||
{
|
||||
// abnormal, format error
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// add the escaped character
|
||||
s0 += String.fromCharCode(u);
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return s0;
|
||||
|
||||
}
|
Reference in New Issue
Block a user