[feat] experimental automark

This commit is contained in:
kwaroran
2023-11-24 04:13:36 +09:00
parent c640bd9f67
commit 4aa6adb637
5 changed files with 169 additions and 6 deletions

View File

@@ -26,4 +26,134 @@ export function autoMarkPlugin(data:string){
return data
}
export function autoMarkNew(dat:string){
const excludeTexts = ["#","1.","2.","3.","4.","5.","6.","7.","8.","9.","0."]
const mark = (data:string) => {
for(const text of excludeTexts){
if(data.startsWith(text)){
return document.createTextNode(data)
}
}
let index = 0
let stacks:Node[] = [document.createElement('p')]
let stackText = [""]
let stackType:number[] = [0]
function isAlpha(str:string) {
//check if string is alphabet, including extended latin by charcode. string.length === 1
const code = str.charCodeAt(0)
return (code > 64 && code < 91) || (code > 96 && code < 123) || (code > 127 && code < 256)
}
let stackIndex = 0
while(index < data.length){
switch(data[index]){
case '"':
case '“':
case '”':{
if(stackType[stackIndex] === 1){
const stack = stacks.pop()
stackText[stackIndex] += data[index]
stack.appendChild(document.createTextNode(stackText.pop()))
stackType.pop()
stackIndex--
stacks[stackIndex].appendChild(stack)
}
else{
stacks[stackIndex].appendChild(document.createTextNode(stackText[stackIndex]))
stackText[stackIndex] = ""
stacks.push(document.createElement('x-placeholder'))
stackText.push(data[index])
stackType.push(1)
stackIndex++
}
break
}
case "'":
case "":
case "":{
if(stackType[stackIndex] === 2){
if(data[index+1] === undefined || !isAlpha(data[index+1])){
const stack = stacks.pop()
stackText[stackIndex] += data[index]
stack.appendChild(document.createTextNode(stackText.pop()))
stackType.pop()
stackIndex--
stacks[stackIndex].appendChild(stack)
}
else{
stackText[stackIndex] += data[index]
}
}
else{
if(data[index-1] === ' ' || data[index-1] === '\n' || data[index-1] === undefined){
stacks[stackIndex].appendChild(document.createTextNode(stackText[stackIndex]))
stackText[stackIndex] = ""
stacks.push(document.createElement('x-em'))
stackText.push(data[index])
stackType.push(2)
stackIndex++
}
else{
stackText[stackIndex] += data[index]
}
}
break
}
case '\n':{
stacks[stackIndex].appendChild(document.createTextNode(stackText[stackIndex]))
stackText[stackIndex] = ""
stacks[stackIndex].appendChild(document.createElement('br'))
}
default:{
stackText[stackIndex] += data[index]
}
}
index++
}
for(let i=stackIndex;i>0;i--){
stacks[i-1].appendChild(document.createTextNode(stackText[i]))
stacks[i-1].appendChild(stacks[i])
}
stacks[0].appendChild(document.createTextNode(stackText[0]))
const childs = stacks[0].childNodes
for(let i=0;i<childs.length;i++){
if(childs[i].nodeType === 3){
const marked = document.createElement('em')
marked.appendChild(document.createTextNode(childs[i].textContent))
stacks[0].replaceChild(marked, childs[i])
}
}
return stacks[0]
}
const domparser = new DOMParser()
const doc = domparser.parseFromString(`<body>${dat}</body>`, 'text/html')
const body = doc.body
console.log(body.innerHTML)
let newChilds:Node[] = []
for(let i=0;i<body.childNodes.length;i++){
if(body.childNodes[i].nodeType === 3){
const lines = body.childNodes[i].textContent.split('\n')
for(let j=0;j<lines.length;j++){
newChilds.push(mark(lines[j]))
}
}
else{
newChilds.push(body.childNodes[i])
}
}
const newBody = document.createElement('body')
for(let i=0;i<newChilds.length;i++){
if(newChilds[i] === null){
continue
}
newBody.appendChild(newChilds[i])
}
return newBody.innerHTML
}