source: frontend/node_modules/w3c-xmlserializer/lib/attributes.js

Last change on this file was 9af201e, checked in by MBK <marija.karapandzova@…>, 12 days ago

Fix frontend appearance

  • Property mode set to 100644
File size: 3.6 KB
RevLine 
[9af201e]1"use strict";
2
3const xnv = require("xml-name-validator");
4
5const { NAMESPACES } = require("./constants");
6
7function generatePrefix(map, newNamespace, prefixIndex) {
8 const generatedPrefix = "ns" + prefixIndex;
9 map[newNamespace] = [generatedPrefix];
10 return generatedPrefix;
11}
12
13function preferredPrefixString(map, ns, preferredPrefix) {
14 const candidateList = map[ns];
15 if (!candidateList) {
16 return null;
17 }
18 if (candidateList.includes(preferredPrefix)) {
19 return preferredPrefix;
20 }
21 return candidateList[candidateList.length - 1];
22}
23
24function serializeAttributeValue(value/* , requireWellFormed*/) {
25 if (value === null) {
26 return "";
27 }
28 // TODO: Check well-formedness
29 return value
30 .replace(/&/g, "&amp;")
31 .replace(/"/g, "&quot;")
32 .replace(/</g, "&lt;")
33 .replace(/>/g, "&gt;")
34 .replace(/\t/g, "&#x9;")
35 .replace(/\n/g, "&#xA;")
36 .replace(/\r/g, "&#xD;");
37}
38
39function serializeAttributes(
40 element,
41 map,
42 localPrefixes,
43 ignoreNamespaceDefAttr,
44 requireWellFormed,
45 refs
46) {
47 let result = "";
48 const namespaceLocalnames = Object.create(null);
49 for (const attr of element.attributes) {
50 if (
51 requireWellFormed &&
52 namespaceLocalnames[attr.namespaceURI] &&
53 namespaceLocalnames[attr.namespaceURI].has(attr.localName)
54 ) {
55 throw new Error("Found duplicated attribute");
56 }
57 if (!namespaceLocalnames[attr.namespaceURI]) {
58 namespaceLocalnames[attr.namespaceURI] = new Set();
59 }
60 namespaceLocalnames[attr.namespaceURI].add(attr.localName);
61 const attributeNamespace = attr.namespaceURI;
62 let candidatePrefix = null;
63 if (attributeNamespace !== null) {
64 candidatePrefix = preferredPrefixString(
65 map,
66 attributeNamespace,
67 attr.prefix
68 );
69 if (attributeNamespace === NAMESPACES.XMLNS) {
70 if (
71 attr.value === NAMESPACES.XML ||
72 (attr.prefix === null && ignoreNamespaceDefAttr) ||
73 (attr.prefix !== null &&
74 localPrefixes[attr.localName] !== attr.value &&
75 map[attr.value].includes(attr.localName))
76 ) {
77 continue;
78 }
79 if (requireWellFormed && attr.value === NAMESPACES.XMLNS) {
80 throw new Error(
81 "The XMLNS namespace is reserved and cannot be applied as an element's namespace via XML parsing"
82 );
83 }
84 if (requireWellFormed && attr.value === "") {
85 throw new Error(
86 "Namespace prefix declarations cannot be used to undeclare a namespace"
87 );
88 }
89 if (attr.prefix === "xmlns") {
90 candidatePrefix = "xmlns";
91 }
92 } else if (candidatePrefix === null) {
93 candidatePrefix = generatePrefix(
94 map,
95 attributeNamespace,
96 refs.prefixIndex++
97 );
98 result += ` xmlns:${candidatePrefix}="${serializeAttributeValue(
99 attributeNamespace,
100 requireWellFormed
101 )}"`;
102 }
103 }
104
105 result += " ";
106 if (candidatePrefix !== null) {
107 result += candidatePrefix + ":";
108 }
109 if (
110 requireWellFormed &&
111 (attr.localName.includes(":") ||
112 !xnv.name(attr.localName) ||
113 (attr.localName === "xmlns" && attributeNamespace === null))
114 ) {
115 throw new Error("Invalid attribute localName value");
116 }
117 result += `${attr.localName}="${serializeAttributeValue(
118 attr.value,
119 requireWellFormed
120 )}"`;
121 }
122 return result;
123}
124
125module.exports.preferredPrefixString = preferredPrefixString;
126module.exports.generatePrefix = generatePrefix;
127module.exports.serializeAttributeValue = serializeAttributeValue;
128module.exports.serializeAttributes = serializeAttributes;
Note: See TracBrowser for help on using the repository browser.