对象
2023年08月10日
一、key = "value" /^[^\r\t\n\f\s/>][^\r\t\n\f\s/>=]*/
1.1 单个
function advanceBy(context, numberOfString) {
const { source } = context;
context.source = source.slice(numberOfString);
}
function advanceSpaces(context) {
const spaceReg = /^[\r\t\n\f\s]+/;
const match = spaceReg.exec(context.source);
if (match) {
advanceBy(context, match[0].length);
}
}
function parseTextData(context, length) {
const rawText = context.source.slice(0, length);
advanceBy(context, length);
return rawText;
}
function parseAttribute(context) {
const attrReg = /^[^\r\t\n\f\s/>][^\r\t\n\f\s/>=]*/;
const match = attrReg.exec(context.source);
const name = match[0];
advanceBy(context, name.length);
return name;
}
function parseAttributeValue(context) {
let value = '';
const quote = context.source[0];
const isQuote = quote === '"' || quote === `'`;
if (isQuote) {
advanceBy(context, 1);
const endIndex = context.source.indexOf(quote);
if (endIndex === -1) {
value = parseTextData(context, context.source.length);
} else {
value = parseTextData(context, endIndex);
}
}
return value;
}
const context = {
source: 'key = "value"'
};
const key = parseAttribute(context);
console.log('key', key);
advanceSpaces(context);
advanceBy(context, 1);
advanceSpaces(context);
const value = parseAttributeValue(context);
console.log('value', value);
1.2 多个
function advanceBy(context, numberOfString) {
const { source } = context;
context.source = source.slice(numberOfString);
}
function advanceSpaces(context) {
const spaceReg = /^[\r\t\n\f\s]+/;
const match = spaceReg.exec(context.source);
if (match) {
advanceBy(context, match[0].length);
}
}
function parseTextData(context, length) {
const rawText = context.source.slice(0, length);
advanceBy(context, length);
return rawText;
}
function parseAttributeValue(context) {
let value = '';
const quote = context.source[0];
const isQuote = quote === '"' || quote === `'`;
if (isQuote) {
advanceBy(context, 1);
const endIndex = context.source.indexOf(quote);
if (endIndex === -1) {
value = parseTextData(context, context.source.length);
} else {
value = parseTextData(context, endIndex);
advanceBy(context,1);
}
}
return value;
}
function parseAttribute(context) {
const attrReg = /^[^\r\t\n\f\s/>][^\r\t\n\f\s/>=]*/;
const match = attrReg.exec(context.source);
const name = match[0];
advanceBy(context, name.length);
let value;
advanceSpaces(context);
advanceBy(context, 1);
advanceSpaces(context);
value = parseAttributeValue(context);
return {
name,
value
};
}
function parseAttributes(context) {
const props = [];
while (context.source.length > 0) {
const attr = parseAttribute(context);
props.push(attr);
advanceSpaces(context);
}
return props;
}
const context = {
source: 'key1 = "value1" key2="value2" key3="value3"'
};
const props = parseAttributes(context);
console.log("props",props);