Refactor legacy block matcher and add new block matchers

This commit is contained in:
kwaroran
2024-02-26 21:02:37 +09:00
parent 15bcd41ed7
commit 47c10be8f1

View File

@@ -750,7 +750,7 @@ const smMatcher = (p1:string,matcherArg:matcherArg) => {
} }
} }
const blockMatcher = (p1:string,matcherArg:matcherArg) => { const legacyBlockMatcher = (p1:string,matcherArg:matcherArg) => {
const bn = p1.indexOf('\n') const bn = p1.indexOf('\n')
if(bn === -1){ if(bn === -1){
@@ -772,8 +772,32 @@ const blockMatcher = (p1:string,matcherArg:matcherArg) => {
} }
return null return null
}
type blockMatch = 'ignore'|'parse'|'nothing'
function blockStartMatcher(p1:string,matcherArg:matcherArg):blockMatch{
if(p1.startsWith('#if')){
const statement = p1.split(" ", 2)
const state = statement[1]
if(state === 'true' || state === '1'){
return 'parse'
}
return 'ignore'
}
return 'nothing'
}
function blockEndMatcher(p1:string,type:blockMatch,matcherArg:matcherArg):string{
if(type === 'ignore'){
return ''
}
if(type === 'parse'){
return p1
}
return ''
} }
export function risuChatParser(da:string, arg:{ export function risuChatParser(da:string, arg:{
@@ -814,9 +838,10 @@ export function risuChatParser(da:string, arg:{
let pointer = 0; let pointer = 0;
let nested:string[] = [""] let nested:string[] = [""]
let pf = performance.now() let stackType = new Uint8Array(512)
let v = new Uint8Array(512)
let pureMode = false let pureMode = false
let pureModeType:''|'pureSyntax'|'block' = ''
let blockType:blockMatch = 'nothing'
let commentMode = false let commentMode = false
let commentLatest:string[] = [""] let commentLatest:string[] = [""]
let commentV = new Uint8Array(512) let commentV = new Uint8Array(512)
@@ -829,6 +854,7 @@ export function risuChatParser(da:string, arg:{
var: arg.var ?? null, var: arg.var ?? null,
tokenizeAccurate: arg.tokenizeAccurate ?? false tokenizeAccurate: arg.tokenizeAccurate ?? false
} }
let pef = performance.now()
while(pointer < da.length){ while(pointer < da.length){
switch(da[pointer]){ switch(da[pointer]){
case '{':{ case '{':{
@@ -838,49 +864,96 @@ export function risuChatParser(da:string, arg:{
} }
pointer++ pointer++
nested.unshift('') nested.unshift('')
v[nested.length] = 1 stackType[nested.length] = 1
break break
} }
case '<':{ case '<':{
nested.unshift('') nested.unshift('')
v[nested.length] = 2 stackType[nested.length] = 2
break break
} }
case '#':{ case '#':{
if(da[pointer + 1] !== '}' || nested.length === 1 || v[nested.length] !== 1){ //legacy if statement, deprecated
if(da[pointer + 1] !== '}' || nested.length === 1 || stackType[nested.length] !== 1){
nested[0] += da[pointer] nested[0] += da[pointer]
break break
} }
pointer++ pointer++
const dat = nested.shift() const dat = nested.shift()
const mc = blockMatcher(dat, matcherObj) const mc = legacyBlockMatcher(dat, matcherObj)
nested[0] += mc ?? `{#${dat}#}` nested[0] += mc ?? `{#${dat}#}`
break break
} }
case '}':{ case '}':{
if(da[pointer + 1] !== '}' || nested.length === 1 || v[nested.length] !== 1){ if(da[pointer + 1] !== '}' || nested.length === 1 || stackType[nested.length] !== 1){
nested[0] += da[pointer] nested[0] += da[pointer]
break break
} }
pointer++ pointer++
const dat = nested.shift() const dat = nested.shift()
if(dat.startsWith('#')){
if(pureMode){
nested[0] += `{{${dat}}}`
}
const matchResult = blockStartMatcher(dat, matcherObj)
if(matchResult === 'nothing'){
break
}
else{
if(matchResult !== 'parse'){
pureMode = true
pureModeType = 'block'
}
blockType = matchResult
nested.unshift('')
stackType[nested.length] = 5
break
}
}
if(dat.startsWith('/')){
if(stackType[nested.length] === 5){
const dat2 = nested.shift()
if(pureMode && pureModeType === 'block'){
pureMode = false
pureModeType = ''
}
const matchResult = blockEndMatcher(dat2.trim(), blockType, matcherObj)
if(matchResult === ''){
break
}
nested[0] += matchResult
blockType = 'nothing'
break
}
}
const mc = (pureMode) ? null :matcher(dat, matcherObj) const mc = (pureMode) ? null :matcher(dat, matcherObj)
nested[0] += mc ?? `{{${dat}}}` nested[0] += mc ?? `{{${dat}}}`
break break
} }
case '>':{ case '>':{
if(nested.length === 1 || v[nested.length] !== 2){ if(nested.length === 1 || stackType[nested.length] !== 2){
break break
} }
const dat = nested.shift() const dat = nested.shift()
if(pureMode && pureModeType !== 'pureSyntax' && pureModeType !== ''){
nested[0] += `<${dat}>`
break
}
switch(dat){ switch(dat){
case 'Pure':{ case 'Pure':{
pureMode = true pureMode = true
pureModeType = 'pureSyntax'
break break
} }
case '/Pure':{ case '/Pure':{
pureMode = false if(pureModeType === 'pureSyntax'){
break pureMode = false
pureModeType = ''
}
else{
nested[0] += `<${dat}>`
break
}
} }
case 'Comment':{ case 'Comment':{
if(!commentMode){ if(!commentMode){
@@ -890,14 +963,14 @@ export function risuChatParser(da:string, arg:{
if(commentLatest[0].endsWith('\n')){ if(commentLatest[0].endsWith('\n')){
commentLatest[0] = commentLatest[0].substring(0, commentLatest[0].length - 1) commentLatest[0] = commentLatest[0].substring(0, commentLatest[0].length - 1)
} }
commentV = new Uint8Array(v) commentV = new Uint8Array(stackType)
} }
break break
} }
case '/Comment':{ case '/Comment':{
if(commentMode){ if(commentMode){
nested = commentLatest nested = commentLatest
v = commentV stackType = commentV
commentMode = false commentMode = false
} }
break break
@@ -914,7 +987,7 @@ export function risuChatParser(da:string, arg:{
if(commentLatest[0].endsWith('\n')){ if(commentLatest[0].endsWith('\n')){
commentLatest[0] = commentLatest[0].substring(0, commentLatest[0].length - 1) commentLatest[0] = commentLatest[0].substring(0, commentLatest[0].length - 1)
} }
commentV = new Uint8Array(v) commentV = new Uint8Array(stackType)
} }
break break
} }
@@ -925,7 +998,7 @@ export function risuChatParser(da:string, arg:{
} }
if(commentMode){ if(commentMode){
nested = commentLatest nested = commentLatest
v = commentV stackType = commentV
commentMode = false commentMode = false
} }
break break
@@ -947,7 +1020,7 @@ export function risuChatParser(da:string, arg:{
} }
if(commentMode){ if(commentMode){
nested = commentLatest nested = commentLatest
v = commentV stackType = commentV
if(thinkingMode){ if(thinkingMode){
nested[0] += `<div>Thinking...</div>` nested[0] += `<div>Thinking...</div>`
} }
@@ -958,7 +1031,7 @@ export function risuChatParser(da:string, arg:{
} }
let result = '' let result = ''
while(nested.length > 1){ while(nested.length > 1){
let dat = (v[nested.length] === 1) ? '{{' : "<" let dat = (stackType[nested.length] === 1) ? '{{' : "<"
dat += nested.shift() dat += nested.shift()
result = dat + result result = dat + result
} }