mirror of
https://github.com/barsdeveloper/ueblueprint.git
synced 2026-02-03 23:55:04 +08:00
* Fix node reference when changing elements * Fix ScriptVariables parsing * Fix invariant text and niagara types * Niagara convert nodes * Move node tests to own files * More Niagara tests * Niagara float and smaller fixes * More Decoding * More decoding * WIP * Float is real * WIP * More types and colors * Test case and small polish * WIP * WIP * Fix niagara script variables merging * Fix Niagara variables * Fixing mirrored ExportPath * Fix Export paths name adjustments * Simplify arc calculation * Simplify a bit arc calculation * source / destionation => origin / target * Minor refactoring * Fix switched link position * Rename some properties for uniformity * Fix input escape * Simplify test * About window * Dialog backdrop style * About dialog touches * Remove dependency and minot improvement * Light mode * Fix link location and css small improvement * Link direction and minor fixes * Some minor fixes and refactoring * Refactoring WIP * Shorting repetitive bits * More tests * Simplify linking tests
77 lines
2.8 KiB
JavaScript
Executable File
77 lines
2.8 KiB
JavaScript
Executable File
import P from "parsernostrum"
|
|
import InvariantTextEntity from "./InvariantTextEntity.js"
|
|
import LocalizedTextEntity from "./LocalizedTextEntity.js"
|
|
import StringEntity from "./StringEntity.js"
|
|
import IEntity from "./IEntity.js"
|
|
|
|
export default class FormatTextEntity extends IEntity {
|
|
|
|
static attributeSeparator = ", "
|
|
static lookbehind = ["LOCGEN_FORMAT_NAMED", "LOCGEN_FORMAT_ORDERED"]
|
|
static grammar = this.createGrammar()
|
|
|
|
/** @param {(StringEntity | LocalizedTextEntity | InvariantTextEntity | FormatTextEntity)[]} values */
|
|
constructor(values) {
|
|
super()
|
|
this.values = values
|
|
}
|
|
|
|
/** @returns {P<FormatTextEntity>} */
|
|
static createGrammar() {
|
|
return P.lazy(() => P.seq(
|
|
// Resulting regex: /(LOCGEN_FORMAT_NAMED|LOCGEN_FORMAT_ORDERED)\s*/
|
|
P.reg(new RegExp(String.raw`(${this.lookbehind.join("|")})\s*\(\s*`), 1),
|
|
P.alt(
|
|
...[StringEntity, LocalizedTextEntity, InvariantTextEntity, FormatTextEntity].map(type => type.grammar)
|
|
).sepBy(P.reg(/\s*\,\s*/)),
|
|
P.reg(/\s*\)/)
|
|
)
|
|
.map(([lookbehind, values]) => {
|
|
const result = new this(values)
|
|
result.lookbehind = lookbehind
|
|
return result
|
|
}))
|
|
.label("FormatTextEntity")
|
|
}
|
|
|
|
doSerialize(
|
|
insideString = false,
|
|
indentation = "",
|
|
Self = /** @type {typeof FormatTextEntity} */(this.constructor),
|
|
printKey = Self.printKey,
|
|
keySeparator = Self.keySeparator,
|
|
attributeSeparator = Self.attributeSeparator,
|
|
wrap = Self.wrap,
|
|
) {
|
|
const separator = Self.attributeSeparator
|
|
return this.lookbehind + "("
|
|
+ this.values.map(v => v.serialize(insideString)).join(separator)
|
|
+ (Self.trailing ? separator : "")
|
|
+ ")"
|
|
}
|
|
|
|
toString() {
|
|
const pattern = this.values?.[0]?.toString() // The pattern is always the first element of the array
|
|
if (!pattern) {
|
|
return ""
|
|
}
|
|
const values = this.values.slice(1).map(v => v?.valueOf())
|
|
let result = this.lookbehind == "LOCGEN_FORMAT_NAMED"
|
|
? pattern.replaceAll(/\{([a-zA-Z]\w*)\}/g, (substring, arg) => {
|
|
const argLocation = values.indexOf(arg) + 1
|
|
return argLocation > 0 && argLocation < values.length
|
|
? values[argLocation]
|
|
: substring
|
|
})
|
|
: this.lookbehind == "LOCGEN_FORMAT_ORDERED"
|
|
? pattern.replaceAll(/\{(\d+)\}/g, (substring, arg) => {
|
|
const argValue = Number(arg)
|
|
return argValue < values.length
|
|
? values[argValue]
|
|
: substring
|
|
})
|
|
: ""
|
|
return result
|
|
}
|
|
}
|